Commit realizado el 12:13:52 08-04-2024

This commit is contained in:
Pagina Web Monito
2024-04-08 12:13:55 -04:00
commit 0c33094de9
7815 changed files with 1365694 additions and 0 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,102 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="Rank-Math" horiz-adv-x="1024">
<font-face units-per-em="1024" ascent="1024" descent="0" />
<missing-glyph horiz-adv-x="1024" />
<glyph unicode="&#x20;" d="" />
<glyph unicode="&#xe900;" glyph-name="rank-math" d="M1024 503.533l-168.827-7.602 29.767-46.545-281.489-179.932-279.273 117.317-324.178-135.137 22.474-53.948 301.658 125.695 284.969-119.689 307.4 196.4 29.767-46.545zM119.91 330.783l204.312 85.133 9.952-4.189v120.974h-214.264zM587.359 826.314v-520.977l16.091-6.649 198.217 126.448v401.177zM353.657 403.438l214.264-90.032v366.136h-214.264z" />
<glyph unicode="&#xe901;" glyph-name="google" d="M984 556.8h-459.2v-136h329.6c-17.6-188.8-171.2-270.4-320-270.4-188.8 0-356.8 147.2-356.8 360 0 204.8 160 360 356.8 360 150.4 0 241.6-97.6 241.6-97.6l92.8 97.6s-124.8 136-340.8 136c-284.8 1.6-502.4-236.8-502.4-494.4 0-249.6 204.8-496 507.2-496 267.2 0 459.2 180.8 459.2 451.2 1.6 56-8 89.6-8 89.6z" />
<glyph unicode="&#xe902;" glyph-name="copy" d="M803.2 75.2h-129.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h129.6c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-28.8 28.8zM572.8 75.2h-124.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h124.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM812.8 755.2h-11.2v155.2c0 51.2-41.6 94.4-94.4 94.4h-593.6c-51.2 0-94.4-41.6-94.4-94.4v-593.6c0-51.2 41.6-94.4 94.4-94.4h152v-6.4c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v444.8c0 20.8 17.6 38.4 38.4 38.4h452.8c16 0 28.8 12.8 28.8 28.8s-14.4 27.2-30.4 27.2zM265.6 660.8v-382.4h-152c-20.8 0-38.4 17.6-38.4 38.4v593.6c0 20.8 17.6 38.4 38.4 38.4h593.6c20.8 0 38.4-17.6 38.4-38.4v-155.2h-385.6c-51.2 0-94.4-41.6-94.4-94.4zM913.6 702.4c19.2 0 35.2-16 35.2-35.2 0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8c0 49.6-40 91.2-91.2 91.2-16 0-28.8-12.8-28.8-28.8s11.2-27.2 27.2-27.2zM976 595.2c-16 0-28.8-12.8-28.8-28.8v-124.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v124.8c0 16-12.8 28.8-28.8 28.8zM976 368c-16 0-28.8-12.8-28.8-28.8v-124.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v124.8c0 16-12.8 28.8-28.8 28.8zM976 139.2c-16 0-28.8-12.8-28.8-28.8 0-19.2-16-35.2-35.2-35.2-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8c49.6 0 91.2 40 91.2 91.2 1.6 17.6-11.2 30.4-27.2 30.4zM356.8 75.2c-19.2 0-35.2 16-35.2 35.2 0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8c0-49.6 40-91.2 91.2-91.2 16 0 28.8 12.8 28.8 28.8s-11.2 27.2-27.2 27.2z" />
<glyph unicode="&#xe903;" glyph-name="send" d="M953.598 548.786c-6.4 11.2-16 19.2-27.2 25.6l-737.6 412.8c-12.8 6.4-27.2 9.6-41.6 8s-27.2-6.4-38.4-16c-11.2-9.6-19.2-22.4-22.4-35.2-4.8-14.4-3.2-28.8 1.6-43.2l137.6-388.8-137.6-388.8c-4.8-14.4-4.8-28.8-1.6-41.6 3.2-14.4 11.2-25.6 22.4-35.2s24-14.4 38.4-16c1.6 0 4.8 0 6.4 0 11.2 0 24 3.2 35.2 9.6l737.6 412.8c11.2 6.4 20.8 14.4 27.2 25.6s9.6 24 9.6 35.2c0 11.2-3.2 24-9.6 35.2zM156.798 923.186l668.8-374.4h-536l-132.8 374.4zM156.798 100.786l134.4 374.4h536l-670.4-374.4z" />
<glyph unicode="&#xe904;" glyph-name="enter-key" d="M984.615 945.231h-630.154c-21.701 0-39.385-17.684-39.385-39.385 0 0 0-275.692 0-354.462s-78.769-78.769-78.769-78.769h-196.923c-21.701 0-39.385-17.684-39.385-39.385v-315.077c0-21.701 17.684-39.385 39.385-39.385h945.231c21.701 0 39.385 17.684 39.385 39.385v787.692c0 21.701-17.684 39.385-39.385 39.385zM866.462 472.615c0-56.556-52.618-157.538-157.538-157.538h-141.233l70.617-70.617c15.399-15.399 15.399-40.29 0-55.69-7.68-7.68-17.762-11.54-27.845-11.54s-20.165 3.86-27.845 11.54l-137.846 137.846c-15.399 15.399-15.399 40.29 0 55.69l137.846 137.846c15.399 15.399 40.29 15.399 55.69 0s15.399-40.29 0-55.69l-70.617-70.617h141.233c55.060 0 78.769 59.786 78.769 78.769v78.769c0 21.78 17.605 39.385 39.385 39.385s39.385-17.605 39.385-39.385v-78.769z" />
<glyph unicode="&#xe905;" glyph-name="content-ai" horiz-adv-x="971" d="M946.149 337.134c-6.216 3.299-13.59 5.236-21.416 5.236-17.86 0-33.365-10.087-41.127-24.875l-0.122-0.255c-71.62-134.316-210.801-224.182-370.972-224.182-231.424 0-419.030 187.606-419.030 419.030s187.606 419.030 419.030 419.030c34.885 0 68.774-4.263 101.175-12.296l-2.88 0.604c9.56 34.736 33.501 62.584 64.849 77.212l0.734 0.307c-48.958 17.132-105.399 27.028-164.152 27.028-282.77 0-512-229.23-512-512s229.23-512 512-512c195.805 0 365.937 109.914 452.065 271.407l1.342 2.757c3.437 6.322 5.458 13.845 5.458 21.839 0 17.791-10.009 33.244-24.703 41.036l-0.252 0.122zM805.699 888.59c0-43.948-35.627-79.575-79.575-79.575s-79.575 35.627-79.575 79.575c0 43.948 35.627 79.575 79.575 79.575s79.575-35.627 79.575-79.575zM775.46 780.036c-14.472-6.825-31.436-10.809-49.33-10.809-0.002 0-0.005 0-0.007 0v0c-60.177 0.048-109.93 44.62-118.096 102.551l-0.073 0.632c-26.937 6.982-57.862 10.99-89.723 10.99-205.311 0-371.749-166.438-371.749-371.749s166.438-371.749 371.749-371.749c205.311 0 371.749 166.438 371.749 371.749 0 105.43-43.889 200.608-114.392 268.263l-0.128 0.122zM603.445 363.261c0-27.468-22.267-49.734-49.734-49.734s-49.734 22.267-49.734 49.734v4.244c-28.052-27.488-66.357-44.604-108.658-45.092l-0.094-0.001c-94.23 0-170.556 86.803-170.556 193.965s76.326 193.898 170.556 193.898c42.706-0.355 81.322-17.575 109.572-45.315l-0.024 0.023c3.108 24.641 23.934 43.508 49.167 43.508 26.754 0 48.554-21.209 49.503-47.731l0.002-0.087zM772.609 363.261c0-27.468-22.267-49.734-49.734-49.734s-49.734 22.267-49.734 49.734v297.412c0 27.468 22.267 49.734 49.734 49.734s49.734-22.267 49.734-49.734v0zM415.648 622.808c-53.979 0-97.679-47.679-97.679-106.1s43.7-106.498 97.679-106.498 97.679 47.679 97.679 106.498-43.7 106.1-97.679 106.1z" />
<glyph unicode="&#xea20;" glyph-name="bot" d="M675.2 964.8c-46.4 25.6-100.8 40-158.4 40h-1.6c-83.2-1.6-161.6-27.2-220.8-76.8-78.4-64-123.2-160-123.2-260.8v-264c0-27.2 22.4-49.6 49.6-49.6h38.4c19.2-75.2 80-136 156.8-156.8l24-6.4v-121.6c0-27.2 22.4-49.6 49.6-49.6h316.8c27.2 0 49.6 22.4 49.6 49.6v598.4c-3.2 124.8-68.8 235.2-180.8 297.6zM796.8 75.2h-304v158.4l-64 17.6c-62.4 17.6-108.8 68.8-120 132.8l-3.2 25.6h-78.4v257.6c0 84.8 36.8 163.2 102.4 217.6 49.6 41.6 115.2 64 187.2 64 48 0 94.4-11.2 131.2-32 92.8-52.8 148.8-145.6 148.8-248v-593.6zM675.2 667.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-28.8c0 24-19.2 43.2-43.2 43.2v36.8c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-36.8h-65.6v36.8c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-36.8c-24 0-43.2-19.2-43.2-43.2h-28.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h28.8v-67.2h-28.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h28.8c0-24 19.2-43.2 43.2-43.2v-28.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v28.8h67.2v-28.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v28.8c24 0 43.2 19.2 43.2 43.2h28.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-28.8v67.2h27.2zM435.2 555.2v155.2h155.2v-155.2h-155.2z" />
<glyph unicode="&#xea2e;" glyph-name="mobile" d="M512 251.2c-32 0-56-25.6-56-56 0-32 25.6-56 56-56s56 25.6 56 56-24 56-56 56zM560 875.2h-96c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h96c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM720 1003.2h-416c-51.2 0-92.8-41.6-92.8-92.8v-800c0-51.2 41.6-92.8 92.8-92.8h416c51.2 0 92.8 41.6 92.8 92.8v801.6c0 51.2-41.6 91.2-92.8 91.2zM756.8 112c0-19.2-16-36.8-36.8-36.8h-416c-19.2 0-36.8 16-36.8 36.8v800c0 19.2 16 36.8 36.8 36.8h416c19.2 0 36.8-16 36.8-36.8v-800z" />
<glyph unicode="&#xea35;" glyph-name="seo-description" d="M91.2 225.6v572.8c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-572.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8zM288 564.8h409.6c54.4 0 97.6 43.2 97.6 97.6v30.4c0 54.4-43.2 97.6-97.6 97.6h-409.6c-54.4 0-97.6-43.2-97.6-97.6v-30.4c0-52.8 43.2-97.6 97.6-97.6zM246.4 694.4c0 22.4 19.2 41.6 41.6 41.6h409.6c22.4 0 41.6-19.2 41.6-41.6v-30.4c0-22.4-19.2-41.6-41.6-41.6h-409.6c-22.4 0-41.6 19.2-41.6 41.6v30.4zM190.4 329.6c0-54.4 43.2-97.6 97.6-97.6h286.4c54.4 0 97.6 43.2 97.6 97.6v30.4c0 54.4-43.2 97.6-97.6 97.6h-286.4c-54.4 0-97.6-43.2-97.6-97.6v-30.4zM246.4 361.6c0 22.4 19.2 41.6 41.6 41.6h286.4c22.4 0 41.6-19.2 41.6-41.6v-30.4c0-22.4-19.2-41.6-41.6-41.6h-286.4c-22.4 0-41.6 19.2-41.6 41.6v30.4zM891.2 1003.2h-812.8c-14.4 0-27.2-11.2-27.2-27.2s12.8-28.8 27.2-28.8h812.8c22.4 0 41.6-19.2 41.6-41.6v-788.8c0-22.4-19.2-41.6-41.6-41.6h-812.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h812.8c54.4 0 97.6 43.2 97.6 97.6v790.4c0 54.4-44.8 97.6-97.6 97.6z" />
<glyph unicode="&#xea3a;" glyph-name="role-manager" d="M454.4 587.2c118.4 0 214.4 92.8 214.4 208s-96 208-214.4 208-214.4-92.8-214.4-208 96-208 214.4-208zM454.4 947.2c88 0 158.4-68.8 158.4-152s-72-152-158.4-152c-88 0-158.4 68.8-158.4 152s70.4 152 158.4 152zM454.4 504c-208 0-377.6-168-377.6-376v-48c0-32 27.2-59.2 59.2-59.2h304c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-304c-1.6 0-3.2 1.6-3.2 3.2v48c0 174.4 144 318.4 321.6 318.4 16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2zM737.6 438.4c-115.2 0-209.6-94.4-209.6-209.6s94.4-209.6 209.6-209.6c115.2 0 209.6 94.4 209.6 209.6s-94.4 209.6-209.6 209.6zM737.6 382.4c35.2 0 68.8-12.8 94.4-33.6l-220.8-204.8c-16 24-25.6 52.8-25.6 84.8 0 84.8 67.2 153.6 152 153.6zM737.6 75.2c-32 0-62.4 9.6-88 27.2l219.2 203.2c12.8-22.4 20.8-49.6 20.8-76.8 1.6-84.8-67.2-153.6-152-153.6z" />
<glyph unicode="&#xea43;" glyph-name="calendar" d="M912 857.6h-97.6v46.4c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-46.4h-491.2v46.4c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-46.4h-96c-51.2 0-92.8-41.6-92.8-92.8v-580.8c0-51.2 41.6-92.8 92.8-92.8h800c51.2 0 92.8 41.6 92.8 92.8v580.8c0 51.2-41.6 92.8-92.8 92.8zM76.8 568h160v-182.4h-160v182.4zM291.2 568h192v-182.4h-192v182.4zM484.8 329.6v-180.8h-192v180.8h192zM540.8 329.6h192v-180.8h-192v180.8zM540.8 385.6v182.4h192v-182.4h-192zM788.8 568h160v-182.4h-160v182.4zM112 801.6h97.6v-44.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v44.8h492.8v-44.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v44.8h94.4c19.2 0 36.8-16 36.8-36.8v-140.8h-872v140.8c0 20.8 16 36.8 35.2 36.8zM76.8 184v145.6h160v-180.8h-124.8c-19.2 0-35.2 16-35.2 35.2zM912 148.8h-123.2v180.8h160v-145.6c0-19.2-17.6-35.2-36.8-35.2z" />
<glyph unicode="&#xea4f;" glyph-name="sitemap" d="M313.6 868.8c-16 0-28.8-12.8-28.8-28.8v-1.6c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v1.6c-1.6 16-14.4 28.8-28.8 28.8zM739.2 867.2h-81.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h81.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM928 275.2h-17.6v139.2c0 54.4-44.8 99.2-99.2 99.2h-272c0 3.2 1.6 4.8 1.6 8v158.4h275.2c41.6 0 76.8 33.6 76.8 76.8v160c0 41.6-33.6 76.8-76.8 76.8h-606.4c-41.6 0-76.8-33.6-76.8-76.8v-160c0-41.6 33.6-76.8 76.8-76.8h275.2v-158.4c0-3.2 0-4.8 1.6-8h-272c-54.4 0-99.2-44.8-99.2-99.2v-139.2h-19.2c-41.6 0-76.8-33.6-76.8-76.8v-91.2c0-41.6 33.6-76.8 76.8-76.8h91.2c41.6 0 76.8 33.6 76.8 76.8v91.2c0 41.6-33.6 76.8-76.8 76.8h-17.6v139.2c0 24 19.2 43.2 43.2 43.2h270.4v-184h-17.6c-41.6 0-76.8-33.6-76.8-76.8v-91.2c0-41.6 33.6-76.8 76.8-76.8h91.2c41.6 0 76.8 33.6 76.8 76.8v91.2c0 41.6-33.6 76.8-76.8 76.8h-17.6v185.6h270.4c24 0 43.2-19.2 43.2-43.2v-139.2h-17.6c-41.6 0-76.8-33.6-76.8-76.8v-91.2c0-41.6 33.6-76.8 76.8-76.8h92.8c41.6 0 76.8 33.6 76.8 76.8v91.2c0 40-35.2 75.2-76.8 75.2zM188.8 756.8v160c0 11.2 9.6 20.8 20.8 20.8h606.4c11.2 0 20.8-9.6 20.8-20.8v-160c0-11.2-9.6-20.8-20.8-20.8h-606.4c-11.2 1.6-20.8 9.6-20.8 20.8zM208 198.4v-91.2c0-11.2-9.6-20.8-20.8-20.8h-91.2c-11.2 0-20.8 9.6-20.8 20.8v91.2c0 11.2 9.6 20.8 20.8 20.8h91.2c11.2 0 20.8-9.6 20.8-20.8zM577.6 198.4v-91.2c0-11.2-9.6-20.8-20.8-20.8h-91.2c-11.2 0-20.8 9.6-20.8 20.8v91.2c0 11.2 9.6 20.8 20.8 20.8h91.2c12.8 0 20.8-9.6 20.8-20.8zM948.8 107.2c0-11.2-9.6-20.8-20.8-20.8h-91.2c-11.2 0-20.8 9.6-20.8 20.8v91.2c0 11.2 9.6 20.8 20.8 20.8h91.2c11.2 0 20.8-9.6 20.8-20.8v-91.2z" />
<glyph unicode="&#xea5a;" glyph-name="import" d="M468.8 372.8c9.6-9.6 24-16 36.8-16 14.4 0 27.2 4.8 36.8 16l118.4 118.4c11.2 11.2 11.2 28.8 0 40s-28.8 11.2-40 0l-88-88v406.4c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-406.4l-88 88c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l121.6-118.4zM934.4 540.8h-147.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h147.2c8 0 14.4-6.4 14.4-14.4v-187.2c0-44.8-36.8-80-80-80h-712c-44.8 0-80 36.8-80 80v188.8c0 8 6.4 14.4 14.4 14.4h147.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-148.8c-38.4 0-70.4-32-70.4-70.4v-187.2c0-75.2 60.8-136 136-136h710.4c75.2 0 136 60.8 136 136v185.6c3.2 38.4-28.8 70.4-67.2 70.4z" />
<glyph unicode="&#xea5d;" glyph-name="export" d="M371.2 694.4c6.4 0 14.4 3.2 19.2 8l92.8 92.8v-411.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v403.2l83.2-84.8c11.2-11.2 28.8-11.2 40 0s11.2 28.8 0 40l-118.4 118.4c-9.6 9.6-24 16-36.8 16-14.4 0-27.2-4.8-36.8-16l-120-118.4c-11.2-11.2-11.2-28.8 0-40 6.4-4.8 12.8-8 19.2-8zM934.4 540.8h-147.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h147.2c8 0 14.4-6.4 14.4-14.4v-187.2c0-44.8-36.8-80-80-80h-712c-44.8 0-80 36.8-80 80v188.8c0 8 6.4 14.4 14.4 14.4h147.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-148.8c-38.4 0-70.4-32-70.4-70.4v-187.2c0-75.2 60.8-136 136-136h710.4c75.2 0 136 60.8 136 136v185.6c3.2 38.4-28.8 70.4-67.2 70.4z" />
<glyph unicode="&#xea60;" glyph-name="settings" d="M513.6 708.8c-108.8 0-196.8-88-196.8-196.8s88-196.8 196.8-196.8c108.8 0 196.8 88 196.8 196.8-1.6 107.2-89.6 196.8-196.8 196.8zM513.6 371.2c-76.8 0-140.8 62.4-140.8 140.8s62.4 140.8 140.8 140.8 140.8-62.4 140.8-140.8c-1.6-78.4-64-140.8-140.8-140.8zM984 401.6l-99.2 54.4c3.2 20.8 4.8 40 4.8 59.2 0 22.4-1.6 41.6-4.8 60.8l100.8 56c17.6 9.6 24 30.4 16 49.6l-96 161.6c-9.6 16-30.4 22.4-49.6 16l-104-57.6c-6.4 4.8-12.8 11.2-19.2 16-17.6 16-35.2 30.4-59.2 41.6-4.8 1.6-8 8-8 12.8v62.4c0 38.4-32 70.4-70.4 70.4h-166.4c-38.4 0-70.4-32-70.4-70.4v-64c0-4.8-3.2-9.6-8-12.8-24-11.2-41.6-25.6-60.8-43.2-4.8-4.8-11.2-9.6-17.6-14.4l-92.8 52.8c-30.4 16-51.2 4.8-60.8-11.2l-91.2-156.8c-4.8-9.6-6.4-20.8-3.2-30.4s9.6-19.2 19.2-24l99.2-56c-3.2-17.6-4.8-36.8-4.8-59.2 0-20.8 1.6-40 3.2-59.2l-102.4-56c-17.6-9.6-24-30.4-16-49.6l94.4-161.6c9.6-16 30.4-22.4 49.6-16l104 57.6c6.4-4.8 12.8-9.6 17.6-14.4 19.2-16 35.2-30.4 60.8-41.6 4.8-1.6 8-8 8-12.8v-70.4c0-38.4 32-70.4 70.4-70.4h168c38.4 0 70.4 32 70.4 70.4v73.6c0 4.8 3.2 9.6 8 12.8 24 11.2 40 25.6 59.2 41.6 6.4 4.8 11.2 9.6 17.6 16l92.8-52.8c30.4-16 51.2-4.8 59.2 9.6l92.8 156.8c4.8 9.6 6.4 19.2 4.8 30.4 0 9.6-8 17.6-16 22.4zM865.6 233.6l-88 49.6c-19.2 11.2-43.2 8-59.2-4.8-8-6.4-14.4-12.8-20.8-17.6-17.6-14.4-28.8-25.6-46.4-33.6-24-11.2-40-36.8-40-62.4v-73.6c0-8-6.4-14.4-14.4-14.4h-168c-8 0-14.4 6.4-14.4 14.4v70.4c0 27.2-16 51.2-40 62.4-17.6 8-32 19.2-48 33.6-6.4 4.8-12.8 11.2-20.8 17.6-9.6 8-22.4 12.8-33.6 12.8-9.6 0-17.6-1.6-25.6-6.4l-88-49.6-75.2 128 84.8 48c20.8 11.2 30.4 33.6 28.8 56-1.6 16-3.2 33.6-3.2 51.2 0 19.2 1.6 35.2 3.2 49.6 4.8 24-6.4 48-27.2 59.2l-84.8 46.4 75.2 128 88-49.6c19.2-11.2 43.2-8 59.2 4.8 6.4 6.4 12.8 11.2 19.2 16 17.6 14.4 30.4 25.6 48 35.2 24 11.2 40 36.8 40 62.4v64c0 8 6.4 14.4 14.4 14.4h168c8 0 14.4-6.4 14.4-14.4v-62.4c0-27.2 16-51.2 40-62.4 17.6-8 30.4-19.2 46.4-33.6 6.4-6.4 14.4-11.2 22.4-17.6 16-12.8 40-16 59.2-4.8l88 49.6 75.2-128-84.8-46.4c-20.8-11.2-32-35.2-27.2-59.2 3.2-14.4 3.2-32 3.2-49.6 0-16-1.6-33.6-4.8-51.2-4.8-24 8-48 28.8-59.2l83.2-44.8-75.2-128z" />
<glyph unicode="&#xea67;" glyph-name="desktop" d="M912 969.6h-800c-51.2 0-91.2-41.6-91.2-91.2v-505.6c0-51.2 41.6-92.8 92.8-92.8h273.6l-46.4-171.2h-81.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h505.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-81.6l-46.4 171.2h275.2c51.2 0 92.8 41.6 92.8 92.8v505.6c0 49.6-41.6 91.2-92.8 91.2zM625.6 110.4h-227.2l46.4 171.2h136l44.8-171.2zM948.8 372.8c0-19.2-16-36.8-36.8-36.8h-800c-19.2 0-36.8 16-36.8 36.8v505.6c0 19.2 16 36.8 36.8 36.8h800c19.2 0 36.8-16 36.8-36.8v-505.6z" />
<glyph unicode="&#xea6f;" glyph-name="htaccess" d="M300.8 566.4h307.2c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-307.2c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2zM300.8 396.8h307.2c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-307.2c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2zM723.2 283.2h-422.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h424c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-30.4 28.8zM929.6 817.6h-403.2l-46.4 134.4c-9.6 30.4-38.4 49.6-70.4 49.6h-315.2c-41.6 0-73.6-32-73.6-73.6v-832c0-40 33.6-73.6 73.6-73.6h836.8c40 0 73.6 33.6 73.6 73.6v648c0 40-33.6 73.6-75.2 73.6zM948.8 96c0-9.6-8-17.6-17.6-17.6h-836.8c-9.6 0-17.6 8-17.6 17.6v832c0 9.6 8 17.6 17.6 17.6h316.8c8 0 14.4-4.8 16-11.2l52.8-153.6c3.2-11.2 14.4-19.2 27.2-19.2h424c9.6 0 17.6-8 17.6-17.6v-648z" />
<glyph unicode="&#xea70;" glyph-name="robots" d="M659.2 561.6l-134.4 68.8c-8 4.8-17.6 4.8-25.6 0l-134.4-68.8c-9.6-4.8-14.4-14.4-14.4-25.6v-76.8c0-91.2 44.8-177.6 118.4-228.8l28.8-19.2c4.8-3.2 9.6-4.8 16-4.8s11.2 1.6 16 4.8l28.8 19.2c73.6 51.2 118.4 136 118.4 228.8v76.8c-1.6 11.2-8 20.8-17.6 25.6zM619.2 460.8c0-73.6-35.2-142.4-94.4-182.4l-12.8-9.6-12.8 8c-59.2 40-94.4 108.8-94.4 182.4v59.2l107.2 54.4 107.2-54.4v-57.6zM929.6 817.6h-403.2l-46.4 134.4c-9.6 30.4-38.4 49.6-70.4 49.6h-315.2c-41.6 0-73.6-32-73.6-73.6v-832c0-40 33.6-73.6 73.6-73.6h836.8c40 0 73.6 33.6 73.6 73.6v648c0 40-33.6 73.6-75.2 73.6zM948.8 96c0-9.6-8-17.6-17.6-17.6h-836.8c-9.6 0-17.6 8-17.6 17.6v832c0 9.6 8 17.6 17.6 17.6h316.8c8 0 14.4-4.8 16-11.2l52.8-153.6c3.2-11.2 14.4-19.2 27.2-19.2h424c9.6 0 17.6-8 17.6-17.6v-648z" />
<glyph unicode="&#xea76;" glyph-name="category" d="M968 691.2v92.8c0 36.8-30.4 67.2-67.2 67.2h-408l-9.6 25.6c-6.4 14.4-20.8 24-35.2 24h-316.8c-46.4-1.6-83.2-40-83.2-84.8v-608c0-46.4 36.8-83.2 83.2-83.2h761.6c46.4 0 83.2 36.8 83.2 83.2v459.2c0 8-3.2 16-8 24zM900.8 793.6c6.4 0 11.2-4.8 11.2-11.2v-76.8h-361.6l-35.2 88h385.6zM920 208c0-14.4-12.8-27.2-27.2-27.2h-761.6c-14.4 0-27.2 12.8-27.2 27.2v608c0 14.4 12.8 27.2 27.2 27.2h304l64-158.4c8-20.8 28.8-35.2 51.2-35.2h369.6v-441.6z" />
<glyph unicode="&#xea83;" glyph-name="link" d="M469.503 779.315l-132.214 130.64c-70.829 70.829-185.729 70.829-256.558 0-34.627-34.627-53.515-80.273-53.515-127.492s18.888-94.438 53.515-127.492l130.64-132.214c34.627-34.627 81.847-53.515 127.492-53.515s92.864 17.314 127.492 53.515c34.627 33.053 53.515 78.699 53.515 127.492 1.574 48.793-17.314 94.438-50.367 129.066zM250.72 562.107l-130.64 132.214c-23.61 23.61-37.775 55.089-37.775 89.716s12.592 64.533 37.775 89.716c25.184 25.184 56.663 36.201 89.716 36.201 31.479 0 64.533-12.592 89.716-36.201l130.64-130.64c23.61-23.61 36.201-55.089 36.201-89.716 0-26.758-7.87-50.367-22.036-70.829l-48.793 48.793c-11.018 11.018-28.332 11.018-39.349 0s-11.018-28.332 0-39.349l47.219-45.645c-48.793-31.479-111.752-25.184-152.675 15.74zM943.269 305.549l-132.214 130.64c-70.829 70.829-185.729 70.829-256.558 0-34.627-34.627-53.515-80.273-53.515-127.492 0-48.793 18.888-94.438 53.515-127.492l130.64-132.214c34.627-34.627 81.847-53.515 127.492-53.515s92.864 17.314 127.492 53.515c34.627 33.053 53.515 78.699 53.515 125.918 3.148 50.367-15.74 96.012-50.367 130.64zM903.919 88.341c-48.793-48.793-129.066-48.793-177.859 0l-130.64 132.214c-23.61 23.61-37.775 55.089-37.775 89.716 0 22.036 6.296 44.071 17.314 62.959l45.645-45.645c4.722-4.722 12.592-7.87 18.888-7.87s14.166 3.148 18.888 7.87c11.018 11.018 11.018 28.332 0 39.349l-47.219 47.219c22.036 14.166 47.219 22.036 72.403 22.036 31.479 0 64.533-12.592 89.716-36.201l130.64-130.64c23.61-23.61 36.201-56.663 36.201-89.716 0-36.201-12.592-67.681-36.201-91.29zM636.344 743.114c15.74 0 28.332 12.592 28.332 28.332v124.344c0 15.74-12.592 28.332-28.332 28.332s-28.332-12.592-28.332-28.332v-124.344c1.574-15.74 14.166-28.332 28.332-28.332zM774.854 604.604c0-15.74 12.592-28.332 28.332-28.332h124.344c15.74 0 28.332 12.592 28.332 28.332s-12.592 28.332-28.332 28.332h-124.344c-15.74 0-28.332-12.592-28.332-28.332zM697.729 664.415c7.87 0 14.166 3.148 18.888 7.87l105.456 107.030c11.018 11.018 11.018 28.332 0 39.349s-28.332 11.018-39.349 0l-105.456-107.030c-11.018-11.018-11.018-28.332 0-39.349 6.296-4.722 12.592-7.87 20.462-7.87zM387.656 215.833c-15.74 0-28.332-12.592-28.332-28.332v-124.344c0-15.74 12.592-28.332 28.332-28.332s28.332 12.592 28.332 28.332v124.344c-1.574 17.314-12.592 28.332-28.332 28.332zM208.223 355.916c0 15.74-12.592 28.332-28.332 28.332h-83.421c-15.74 0-28.332-12.592-28.332-28.332s12.592-28.332 28.332-28.332h83.421c15.74 0 28.332 12.592 28.332 28.332zM271.182 305.549l-105.456-105.456c-11.018-11.018-11.018-28.332 0-39.349 4.722-4.722 12.592-7.87 18.888-7.87s14.166 3.148 18.888 7.87l105.456 105.456c11.018 11.018 11.018 28.332 0 39.349-9.444 11.018-26.758 11.018-37.775 0z" />
<glyph unicode="&#xea87;" glyph-name="local-seo" d="M512 1003.2c-222.4 0-404.8-176-404.8-390.4 0-171.2 244.8-454.4 350.4-569.6 14.4-16 33.6-24 54.4-24s40 8 54.4 24c105.6 113.6 350.4 398.4 350.4 569.6 0 216-182.4 390.4-404.8 390.4zM524.8 81.6c-8-8-19.2-8-25.6 0-78.4 84.8-336 376-336 531.2 0 185.6 156.8 334.4 348.8 334.4s348.8-150.4 348.8-334.4c0-155.2-257.6-444.8-336-531.2zM512 772.8c-94.4 0-172.8-76.8-172.8-172.8 0-94.4 76.8-172.8 172.8-172.8s172.8 76.8 172.8 172.8c0 96-78.4 172.8-172.8 172.8zM512 484.8c-64 0-116.8 52.8-116.8 116.8s52.8 116.8 116.8 116.8 116.8-52.8 116.8-116.8-52.8-116.8-116.8-116.8z" />
<glyph unicode="&#xea8f;" glyph-name="misc" d="M512 1003.2c-272 0-491.2-219.2-491.2-491.2s219.2-492.8 491.2-492.8 492.8 220.8 492.8 492.8-220.8 491.2-492.8 491.2zM512 75.2c-240 0-435.2 196.8-435.2 436.8s195.2 435.2 435.2 435.2 436.8-195.2 436.8-435.2-196.8-436.8-436.8-436.8zM678.4 732.8h-332.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h332.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM678.4 539.2h-332.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h332.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM678.4 347.2h-332.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h332.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xea9a;" glyph-name="software" d="M963.2 790.4c0 1.6-1.6 1.6-1.6 3.2-11.2 16-27.2 28.8-44.8 36.8l-356.8 163.2c-30.4 14.4-64 14.4-94.4 0l-358.4-163.2c-17.6-8-33.6-20.8-44.8-36.8-1.6-1.6-3.2-3.2-3.2-4.8 0 0 0-1.6-1.6-1.6-11.2-17.6-17.6-38.4-17.6-60.8v-414.4c0-43.2 24-81.6 62.4-100.8l358.4-179.2c16-8 33.6-12.8 51.2-12.8s35.2 4.8 51.2 12.8l356.8 179.2c38.4 19.2 62.4 57.6 62.4 100.8v414.4c0 24-6.4 44.8-19.2 64zM488 942.4c8 3.2 16 4.8 24 4.8s16-1.6 24-4.8l353.6-161.6-155.2-75.2-364.8 182.4 118.4 54.4zM512 596.8l-377.6 184 169.6 78.4 368-184-160-78.4zM129.6 262.4c-19.2 9.6-32 30.4-32 51.2v412.8c0 3.2 0 6.4 1.6 9.6l385.6-188.8v-465.6l-355.2 180.8zM926.4 313.6c0-22.4-12.8-41.6-32-51.2l-355.2-179.2v464l164.8 80v-150.4c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v177.6l164.8 81.6c0-3.2 1.6-6.4 1.6-9.6v-412.8z" />
<glyph unicode="&#xeaa0;" glyph-name="image" d="M138.232 998.076c-21.252-7.628-33.916-17.552-48.232-37.796l-12-16.968-1.188-422.656c-0.844-300.132 0.096-427.076 3.236-437.904 5.688-19.612 29.512-45.98 49.952-55.288 15.1-6.88 36.576-7.292 382.216-7.376l366.212-0.088 20.868 10.4c24.072 11.992 42.312 35.372 48.484 62.14 5.792 25.132 5.656 808.376-0.148 835.436-5.46 25.452-24.484 50.924-47.82 64.024l-17.812 10-364 0.868c-305.348 0.728-366.54-0.044-379.768-4.792M882.912 934.912l11.088-11.088 1.124-225.104 1.128-225.108-33.26-22.588c-18.288-12.428-54.796-40.972-81.124-63.436-56.872-48.524-88.132-69.576-115.296-77.644-43.172-12.82-76.42-4.54-116.196 28.936-143.732 120.968-215.088 126.672-367.916 29.412-21.304-13.556-41.368-25.66-44.596-26.896-5.12-1.968-5.864 34.776-5.864 289.288 0 316.544-0.836 304.312 21.428 313.384 4.716 1.92 168.28 3.14 363.484 2.712l354.908-0.78 11.092-11.088M606 788.528c-37.272-9.792-72.26-38.044-88.776-71.672-9.64-19.632-11.22-27.652-11.184-56.856 0.044-40.428 8.096-61.476 34.444-90.060 25.212-27.352 50.484-38.932 89.516-41.012 43.38-2.308 70.548 7.796 99.912 37.16 35.904 35.9 47.612 87.504 31.308 137.984-8.732 27.036-38.668 60.136-66.876 73.936-22.788 11.148-66.26 16.324-88.344 10.52M674.536 724.324c6.896-4.204 17.696-14.408 24-22.672 10.148-13.304 11.464-18.312 11.464-43.632 0-35.656-10.304-53.288-39.784-68.088-30.040-15.080-59.088-11.46-84.064 10.472-38.356 33.676-31.46 99.932 12.84 123.32 20.364 10.748 58.404 11.052 75.544 0.6M892 251.692v-152.308l-23.384-23.384h-712.004l-24.612 20.712v174.388l65 40.004c76.752 47.236 89.62 53.944 120.832 63.020 49.4 14.36 94.94-0.4 163.516-53.008 66.116-50.72 76.436-57.412 98.548-63.92 32.68-9.62 77.284-7.696 110.372 4.76 33.328 12.544 62.688 32.272 121.732 81.788 54.72 45.888 72.96 60.152 77 60.212 1.648 0.024 3-68.496 3-152.264" />
<glyph unicode="&#xeaa9;" glyph-name="analyzer" d="M48 753.6c16 0 28.8 12.8 28.8 28.8v139.2c0 9.6 8 16 16 16h137.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-137.6c-40 0-72-32-72-72v-139.2c0-17.6 11.2-30.4 27.2-30.4zM931.2 993.6h-137.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h137.6c9.6 0 16-8 16-16v-139.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v140.8c0 40-33.6 72-73.6 72zM976 270.4c-16 0-28.8-12.8-28.8-28.8v-139.2c0-9.6-8-16-16-16h-137.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h137.6c40 0 72 32 72 72v139.2c1.6 17.6-11.2 30.4-27.2 30.4zM230.4 86.4h-137.6c-9.6 0-16 8-16 16v139.2c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-139.2c0-40 32-72 72-72h137.6c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-27.2 27.2zM830.4 512c0 12.8-4.8 25.6-14.4 35.2-44.8 43.2-161.6 145.6-304 145.6s-259.2-102.4-304-145.6c-9.6-9.6-14.4-22.4-14.4-35.2s4.8-25.6 14.4-35.2c44.8-43.2 161.6-145.6 304-145.6s259.2 102.4 304 145.6c9.6 9.6 14.4 22.4 14.4 35.2zM512 387.2c-116.8 0-217.6 84.8-259.2 124.8 41.6 41.6 142.4 124.8 259.2 124.8s217.6-84.8 259.2-124.8c-41.6-41.6-142.4-124.8-259.2-124.8zM454.4 512c0-32 25.6-57.6 57.6-57.6s57.6 25.6 57.6 57.6-25.6 57.6-57.6 57.6-57.6-25.6-57.6-57.6z" />
<glyph unicode="&#xeaab;" glyph-name="search" d="M993.6 112l-281.6 227.2c116.8 152 105.6 369.6-33.6 508.8-73.6 73.6-169.6 113.6-273.6 113.6s-198.4-40-272-113.6c-150.4-150.4-150.4-396.8 0-547.2 73.6-73.6 169.6-113.6 273.6-113.6 100.8 0 196.8 38.4 268.8 108.8l283.2-230.4c4.8-4.8 11.2-6.4 17.6-6.4 8 0 16 3.2 22.4 9.6 9.6 16 8 33.6-4.8 43.2zM406.4 244.8c-88 0-171.2 35.2-233.6 97.6-129.6 129.6-129.6 339.2 0 467.2 62.4 62.4 145.6 97.6 233.6 97.6s171.2-33.6 233.6-97.6c129.6-129.6 129.6-339.2 0-467.2-62.4-64-145.6-97.6-233.6-97.6z" />
<glyph unicode="&#xeab3;" glyph-name="star-filled" d="M955.2 641.6l-289.6 44.8-131.2 275.2c-9.6 19.2-35.2 19.2-44.8 0l-131.2-276.8-288-43.2c-20.8-3.2-28.8-30.4-12.8-44.8l209.6-216-49.6-302.4c-3.2-20.8 17.6-38.4 36.8-25.6l260.8 142.4 259.2-142.4c17.6-9.6 40 6.4 35.2 25.6l-49.6 302.4 209.6 216c12.8 14.4 6.4 41.6-14.4 44.8z" />
<glyph unicode="&#xeab5;" glyph-name="star" d="M248 20.8c-12.8 0-25.6 3.2-36.8 11.2-20.8 14.4-32 40-27.2 65.6l43.2 272-187.2 193.6c-17.6 17.6-24 44.8-16 68.8s27.2 40 51.2 44.8l260.8 41.6 116.8 248c11.2 22.4 33.6 36.8 57.6 36.8 25.6 0 46.4-14.4 57.6-36.8l120-246.4 260.8-41.6c24-3.2 43.2-20.8 51.2-44.8s1.6-51.2-16-68.8l-188.8-193.6 44.8-273.6c4.8-25.6-6.4-51.2-27.2-65.6-19.2-14.4-44.8-16-67.2-4.8l-233.6 128-233.6-128c-9.6-4.8-19.2-6.4-30.4-6.4zM80 601.6l193.6-198.4c9.6-9.6 14.4-24 11.2-38.4l-44.8-276.8c-1.6-6.4 3.2-9.6 4.8-11.2 3.2-3.2 6.4-1.6 8 0l240 131.2c12.8 6.4 27.2 6.4 40 0l240-129.6c1.6 0 3.2-1.6 8 0 1.6 1.6 4.8 4.8 4.8 11.2l-44.8 278.4c-1.6 14.4 1.6 27.2 11.2 38.4l192 198.4c4.8 4.8 3.2 9.6 3.2 12.8 0 1.6-3.2 6.4-6.4 6.4l-268.8 41.6c-14.4 1.6-25.6 11.2-32 24l-120 252.8c-1.6 4.8-4.8 4.8-8 4.8-1.6 0-4.8-1.6-8-4.8l-120-254.4c-6.4-12.8-17.6-22.4-32-24l-267.2-43.2c-4.8 0-6.4-4.8-6.4-6.4-1.6-1.6-3.2-8 1.6-12.8z" />
<glyph unicode="&#xeaba;" glyph-name="trash" d="M811.2 886.4h-155.2v57.6c0 33.6-27.2 60.8-60.8 60.8h-166.4c-33.6-1.6-60.8-27.2-60.8-60.8v-57.6h-155.2c-33.6 0-60.8-27.2-60.8-60.8v-116.8c0-16 12.8-28.8 28.8-28.8h24v-542.4c0-65.6 54.4-120 120-120h376c65.6 0 120 54.4 120 120v545.6h24c16 0 28.8 12.8 28.8 28.8v116.8c-3.2 32-28.8 57.6-62.4 57.6zM424 944c0 1.6 1.6 4.8 4.8 4.8h166.4c1.6 0 4.8-1.6 4.8-4.8v-57.6h-176v57.6zM209.6 827.2c0 1.6 1.6 4.8 4.8 4.8h598.4c1.6 0 4.8-1.6 4.8-4.8v-88h-608v88zM763.2 139.2c0-35.2-28.8-64-64-64h-374.4c-35.2 0-64 28.8-64 64v544h504v-544zM512 251.2c16 0 28.8 12.8 28.8 28.8v209.6c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-211.2c1.6-16 12.8-27.2 28.8-27.2zM646.4 251.2c16 0 28.8 12.8 28.8 28.8v209.6c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-211.2c1.6-16 14.4-27.2 28.8-27.2zM377.6 251.2c16 0 28.8 12.8 28.8 28.8v209.6c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-211.2c0-16 12.8-27.2 28.8-27.2z" />
<glyph unicode="&#xeac4;" glyph-name="users" d="M328 566.4c97.6 0 177.6 76.8 177.6 172.8s-80 172.8-177.6 172.8-177.6-76.8-177.6-172.8 80-172.8 177.6-172.8zM328 856c67.2 0 121.6-52.8 121.6-116.8s-54.4-116.8-121.6-116.8-121.6 52.8-121.6 116.8 54.4 116.8 121.6 116.8zM744 488c83.2 0 152 65.6 152 147.2s-68.8 147.2-152 147.2-152-65.6-152-147.2c0-80 68.8-147.2 152-147.2zM744 728c52.8 0 96-41.6 96-91.2 0-51.2-43.2-91.2-96-91.2s-96 41.6-96 91.2 43.2 91.2 96 91.2zM752 452.8h-14.4c-49.6 0-97.6-14.4-139.2-41.6-40 60.8-110.4 100.8-188.8 100.8h-163.2c-124.8 0-225.6-102.4-225.6-227.2v-126.4c0-25.6 20.8-46.4 46.4-46.4h891.2c27.2 0 48 22.4 48 48v40c-1.6 139.2-115.2 252.8-254.4 252.8zM532.8 168h-456v116.8c0 94.4 76.8 171.2 171.2 171.2h161.6c94.4 0 171.2-76.8 171.2-171.2v-116.8h-48zM948.8 168h-312v116.8c0 25.6-4.8 51.2-12.8 75.2 33.6 24 72 36.8 113.6 36.8h14.4c108.8 0 196.8-88 196.8-196.8v-32z" />
<glyph unicode="&#xeb6a;" glyph-name="images" d="M369.6 360c49.6 0 91.2 40 91.2 89.6s-40 89.6-91.2 89.6-91.2-40-91.2-89.6c1.6-49.6 41.6-89.6 91.2-89.6zM369.6 484.8c19.2 0 35.2-16 35.2-33.6 0-19.2-16-33.6-35.2-33.6-17.6-1.6-33.6 14.4-33.6 32 0 19.2 16 35.2 33.6 35.2zM787.2 689.6c49.6 0 91.2 40 91.2 89.6s-40 89.6-91.2 89.6-91.2-40-91.2-89.6c0-49.6 41.6-89.6 91.2-89.6zM787.2 812.8c19.2 0 35.2-16 35.2-33.6s-16-33.6-35.2-33.6-35.2 16-35.2 33.6 16 33.6 35.2 33.6zM888 1000h-328c-64 0-115.2-51.2-115.2-115.2v-212.8h-324.8c-51.2 0-92.8-41.6-92.8-92.8v-464c0-51.2 41.6-92.8 92.8-92.8h376c51.2 0 92.8 41.6 92.8 92.8v236.8h300.8c64 0 115.2 51.2 115.2 115.2v416c0 65.6-52.8 116.8-116.8 116.8zM560 944h329.6c33.6 0 59.2-27.2 59.2-59.2v-241.6c-12.8-8-32-20.8-35.2-24-14.4-9.6-28.8-22.4-43.2-33.6-41.6-36.8-70.4-57.6-108.8-43.2-6.4 3.2-14.4 9.6-22.4 16l-6.4 4.8c-24 19.2-51.2 41.6-84.8 51.2-20.8 6.4-43.2 6.4-65.6 1.6-12.8 32-44.8 56-81.6 57.6v211.2c-1.6 33.6 25.6 59.2 59.2 59.2zM120 616h376c19.2 0 36.8-16 36.8-36.8v-264c-8-4.8-19.2-12.8-35.2-24-14.4-9.6-28.8-22.4-43.2-33.6-41.6-36.8-70.4-57.6-108.8-43.2-8 3.2-16 9.6-25.6 17.6l-3.2 3.2c-24 19.2-51.2 41.6-84.8 51.2-56 17.6-105.6-11.2-147.2-36.8v329.6c-1.6 20.8 14.4 36.8 35.2 36.8zM496 80h-376c-19.2 0-36.8 16-36.8 36.8v65.6c8 4.8 14.4 9.6 22.4 12.8 38.4 24 73.6 46.4 108.8 35.2 24-6.4 44.8-24 65.6-41.6l3.2-3.2c11.2-9.6 24-20.8 41.6-27.2 14.4-4.8 28.8-8 43.2-8 49.6 0 89.6 33.6 121.6 62.4 12.8 11.2 25.6 22.4 36.8 30.4 1.6 1.6 3.2 1.6 4.8 3.2v-131.2c0-19.2-16-35.2-35.2-35.2zM888 408h-300.8v150.4c16 4.8 28.8 4.8 43.2 1.6 24-6.4 44.8-24 65.6-41.6l4.8-3.2c11.2-9.6 24-20.8 40-25.6s28.8-8 43.2-8c49.6 0 89.6 33.6 121.6 62.4 12.8 11.2 25.6 22.4 38.4 30.4 1.6 1.6 3.2 1.6 4.8 3.2v-108.8c0-33.6-27.2-60.8-60.8-60.8z" />
<glyph unicode="&#xeb70;" glyph-name="redirection" d="M971.2 588.8l-384 384c-20.8 20.8-48 32-76.8 32s-56-11.2-76.8-32l-384-384c-20.8-20.8-32-48-32-76.8s11.2-56 32-76.8l384-384c20.8-20.8 48-32 76.8-32s56 11.2 76.8 32l384 384c43.2 43.2 43.2 110.4 0 153.6zM932.8 475.2l-384-384c-20.8-20.8-52.8-20.8-73.6 0l-384 384c-9.6 9.6-16 22.4-16 36.8s4.8 27.2 16 36.8l384 384c9.6 9.6 22.4 16 36.8 16s27.2-4.8 36.8-16l384-384c19.2-20.8 19.2-52.8 0-73.6zM540.8 667.2c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l88-88h-220.8c-16 0-28.8-12.8-28.8-28.8v-136c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v107.2h193.6l-88-88c-11.2-11.2-11.2-28.8 0-40 4.8-4.8 12.8-8 19.2-8s14.4 3.2 19.2 8l136 136c11.2 11.2 11.2 28.8 0 40l-136 137.6z" />
<glyph unicode="&#xeb73;" glyph-name="video" d="M880 1003.2h-736c-68.8 0-123.2-54.4-123.2-123.2v-736c0-68.8 56-124.8 124.8-124.8h736c68.8 0 124.8 56 124.8 124.8v736c-1.6 68.8-57.6 123.2-126.4 123.2zM248 539.2h-171.2v180.8h172.8v-180.8zM76.8 483.2h172.8v-179.2h-172.8v179.2zM304 947.2h416v-872h-416v872zM948.8 539.2h-172.8v180.8h172.8v-180.8zM776 483.2h172.8v-179.2h-172.8v179.2zM948.8 880v-104h-172.8v171.2h104c36.8 0 68.8-30.4 68.8-67.2zM144 947.2h104v-172.8h-171.2v105.6c0 36.8 30.4 67.2 67.2 67.2zM76.8 144v104h172.8v-172.8h-105.6c-36.8 0-67.2 32-67.2 68.8zM880 75.2h-104v172.8h172.8v-104c0-36.8-32-68.8-68.8-68.8zM636.8 555.2l-152 92.8c-16 9.6-35.2 9.6-51.2 1.6-16-9.6-25.6-25.6-25.6-44.8v-184c0-17.6 9.6-35.2 25.6-44.8 8-4.8 16-6.4 25.6-6.4s17.6 3.2 25.6 8l152 92.8c16 9.6 24 25.6 24 43.2s-8 32-24 41.6zM464 430.4v163.2l136-81.6-136-81.6z" />
<glyph unicode="&#xeb97;" glyph-name="schema" d="M419.2 582.4l-11.2-64c-1.6-11.2 3.2-20.8 11.2-27.2s20.8-6.4 28.8-1.6l57.6 30.4 57.6-30.4c4.8-1.6 8-3.2 12.8-3.2 6.4 0 11.2 1.6 16 4.8 8 6.4 12.8 17.6 11.2 27.2l-11.2 64 46.4 44.8c8 8 9.6 19.2 6.4 28.8s-12.8 17.6-22.4 19.2l-64 9.6-28.8 59.2c-4.8 9.6-14.4 16-25.6 16s-20.8-6.4-25.6-16l-28.8-59.2-64-9.6c-11.2-1.6-19.2-9.6-22.4-19.2s0-20.8 6.4-28.8l49.6-44.8zM475.2 632c9.6 1.6 17.6 6.4 20.8 16l9.6 20.8 9.6-20.8c4.8-8 11.2-14.4 20.8-16l22.4-3.2-16-16c-6.4-6.4-9.6-16-8-24l3.2-22.4-20.8 11.2c-8 4.8-17.6 4.8-25.6 0l-20.8-11.2 3.2 22.4c1.6 9.6-1.6 17.6-8 24l-16 16 25.6 3.2zM928 886.4h-832c-41.6 0-76.8-33.6-76.8-76.8v-596.8c0-41.6 33.6-76.8 76.8-76.8h832c41.6 0 76.8 33.6 76.8 76.8v596.8c0 43.2-35.2 76.8-76.8 76.8zM774.4 193.6h-534.4c3.2 11.2 3.2 20.8 3.2 32 0 76.8-62.4 139.2-139.2 139.2-9.6 0-19.2-1.6-28.8-3.2v318.4c9.6-1.6 19.2-3.2 28.8-3.2 76.8 0 139.2 62.4 139.2 139.2v14.4h528v-14.4c0-76.8 62.4-139.2 139.2-139.2 12.8 0 25.6 1.6 38.4 6.4v-323.2c-12.8 3.2-25.6 6.4-38.4 6.4-76.8 0-139.2-62.4-139.2-139.2 0-12.8 0-22.4 3.2-33.6zM948.8 809.6v-67.2c-11.2-6.4-25.6-9.6-38.4-9.6-44.8 0-83.2 36.8-83.2 83.2 0 4.8 0 9.6 1.6 14.4h99.2c11.2 0 20.8-9.6 20.8-20.8zM96 830.4h89.6c0-4.8 1.6-9.6 1.6-14.4 0-46.4-36.8-83.2-83.2-83.2-9.6 0-19.2 1.6-28.8 4.8v72c1.6 11.2 9.6 20.8 20.8 20.8zM76.8 214.4v89.6c9.6 3.2 19.2 4.8 28.8 4.8 44.8 0 83.2-36.8 83.2-83.2 0-11.2-1.6-20.8-6.4-30.4v-1.6h-86.4c-11.2 0-19.2 9.6-19.2 20.8zM928 193.6h-94.4v1.6c-4.8 9.6-6.4 20.8-6.4 30.4 0 46.4 36.8 83.2 83.2 83.2 14.4 0 27.2-3.2 38.4-9.6v-84.8c0-11.2-9.6-20.8-20.8-20.8zM728 417.6h-443.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h443.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM622.4 313.6h-230.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h228.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-27.2 28.8z" />
<glyph unicode="&#xeb99;" glyph-name="adsense" d="M912 942.4h-800c-51.2 0-92.8-41.6-92.8-92.8v-360c0-51.2 41.6-92.8 92.8-92.8h57.6v-288c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v288h259.2v-288c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v288h259.2v-288c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v288h51.2c51.2 0 92.8 41.6 92.8 92.8v360c0 51.2-41.6 92.8-92.8 92.8zM948.8 489.6c0-19.2-16-36.8-36.8-36.8h-800c-19.2 0-36.8 16-36.8 36.8v360c0 19.2 16 36.8 36.8 36.8h800c19.2 0 36.8-16 36.8-36.8v-360zM398.4 806.4c-4.8 9.6-14.4 16-25.6 16s-20.8-6.4-25.6-16l-112-228.8c-6.4-14.4-1.6-30.4 12.8-36.8 3.2-1.6 8-3.2 12.8-3.2 9.6 0 20.8 6.4 25.6 16l86.4 176 86.4-176c6.4-14.4 24-19.2 36.8-12.8 14.4 6.4 19.2 24 12.8 36.8l-110.4 228.8zM667.2 825.6h-54.4c-16 0-28.8-12.8-28.8-28.8v-233.6c0-16 12.8-28.8 28.8-28.8h54.4c68.8 0 124.8 56 124.8 124.8v41.6c-1.6 68.8-57.6 124.8-124.8 124.8zM734.4 659.2c0-38.4-30.4-68.8-68.8-68.8h-25.6v179.2h27.2c38.4 0 68.8-30.4 68.8-68.8v-41.6z" />
<glyph unicode="&#xeb9d;" glyph-name="tick" d="M996.8 820.8c-11.2 11.2-28.8 11.2-40 0l-584-566.4c-4.8-4.8-11.2-4.8-16 0l-289.6 281.6c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l289.6-281.6c12.8-12.8 30.4-19.2 46.4-19.2 17.6 0 33.6 6.4 46.4 19.2l584 566.4c12.8 11.2 12.8 28.8 3.2 40z" />
<glyph unicode="&#xeb9f;" glyph-name="circle-plus" d="M681.6 540.8s-1.6 0 0 0h-140.8v140.8c0 16-12.8 27.2-28.8 27.2s-27.2-12.8-27.2-28.8v-140.8h-140.8c-16 0-27.2-12.8-27.2-28.8s12.8-27.2 28.8-27.2h140.8v-140.8c0-16 12.8-27.2 28.8-27.2s27.2 12.8 27.2 28.8v140.8h140.8c16 0 27.2 12.8 27.2 28.8-1.6 14.4-14.4 27.2-28.8 27.2zM512 1003.2c-272 0-491.2-219.2-491.2-491.2s219.2-492.8 491.2-492.8 492.8 220.8 492.8 492.8-220.8 491.2-492.8 491.2zM512 75.2c-240 0-435.2 196.8-435.2 436.8s195.2 435.2 435.2 435.2 436.8-195.2 436.8-435.2-196.8-436.8-436.8-436.8z" />
<glyph unicode="&#xeba4;" glyph-name="eye" d="M512 624c-62.4 0-112-51.2-112-112s51.2-112 112-112 112 51.2 112 112-49.6 112-112 112zM512 456c-30.4 0-56 25.6-56 56s25.6 56 56 56 56-25.6 56-56-25.6-56-56-56zM998.4 531.2c-105.6 166.4-288 265.6-486.4 265.6s-380.8-99.2-486.4-265.6c-6.4-11.2-6.4-25.6 0-36.8 105.6-166.4 288-265.6 486.4-265.6s380.8 99.2 486.4 265.6c8 11.2 8 25.6 0 36.8zM512 284.8c-174.4 0-336 84.8-432 228.8 96 142.4 257.6 227.2 432 227.2s336-84.8 432-227.2c-96-144-257.6-228.8-432-228.8z" />
<glyph unicode="&#xebac;" glyph-name="heart-filled" d="M512 102.4c-12.8 0-25.6 4.8-35.2 12.8-36.8 32-73.6 62.4-105.6 89.6-92.8 78.4-174.4 147.2-230.4 214.4-64 76.8-92.8 147.2-92.8 225.6 0 75.2 25.6 145.6 73.6 196.8s113.6 80 185.6 80c52.8 0 102.4-17.6 145.6-49.6 17.6-12.8 32-28.8 46.4-46.4 6.4-8 17.6-8 24 0 14.4 17.6 30.4 32 46.4 46.4 43.2 33.6 92.8 49.6 145.6 49.6 72 0 137.6-28.8 185.6-80s73.6-121.6 73.6-196.8c0-78.4-28.8-148.8-92.8-224-56-67.2-137.6-136-230.4-214.4-32-27.2-68.8-57.6-105.6-89.6-8-9.6-20.8-14.4-33.6-14.4z" />
<glyph unicode="&#xebb4;" glyph-name="info" d="M436.8 913.6c0-34.463 27.937-62.4 62.4-62.4s62.4 27.937 62.4 62.4v0c0 34.463-27.937 62.4-62.4 62.4s-62.4-27.937-62.4-62.4v0M619.2 75.2h-80v620.8c0 35.2-28.8 64-64 64h-72c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h72c4.8 0 8-3.2 8-8v-619.2h-80c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h216c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xebbc;" glyph-name="howto" d="M220.8 891.2h-140.8c-33.6 0-60.8-27.2-60.8-60.8v-140.8c0-33.6 27.2-60.8 60.8-60.8h140.8c33.6 0 60.8 27.2 60.8 60.8v140.8c-1.6 33.6-28.8 60.8-60.8 60.8zM224 691.2c0-1.6-1.6-4.8-4.8-4.8h-139.2c-1.6 0-4.8 1.6-4.8 4.8v140.8c0 1.6 1.6 4.8 4.8 4.8h140.8c1.6 0 4.8-1.6 4.8-4.8v-140.8zM220.8 393.6h-140.8c-33.6 0-60.8-27.2-60.8-60.8v-140.8c0-33.6 27.2-60.8 60.8-60.8h140.8c33.6 0 60.8 27.2 60.8 60.8v140.8c-1.6 33.6-28.8 60.8-60.8 60.8zM224 193.6c0-1.6-1.6-4.8-4.8-4.8h-139.2c-1.6 0-4.8 1.6-4.8 4.8v140.8c0 1.6 1.6 4.8 4.8 4.8h140.8c1.6 0 4.8-1.6 4.8-4.8v-140.8zM457.6 803.2h518.4c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-518.4c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2zM976 718.4h-518.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h518.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM976 361.6h-518.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h518.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM976 220.8h-518.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h518.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xebbd;" glyph-name="faq" d="M187.2 974.4h-107.2c-33.6 0-60.8-27.2-60.8-60.8v-107.2c0-33.6 27.2-60.8 60.8-60.8h107.2c33.6 0 60.8 27.2 60.8 60.8v108.8c-1.6 33.6-28.8 59.2-60.8 59.2zM190.4 808c0-1.6-1.6-4.8-4.8-4.8h-105.6c-1.6 0-4.8 1.6-4.8 4.8v107.2c0 1.6 1.6 4.8 4.8 4.8h107.2c1.6 0 4.8-1.6 4.8-4.8v-107.2zM408 833.6h568c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-568c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2zM187.2 635.2h-107.2c-33.6 0-60.8-27.2-60.8-60.8v-107.2c0-33.6 27.2-60.8 60.8-60.8h107.2c33.6 0 60.8 27.2 60.8 60.8v107.2c-1.6 33.6-28.8 60.8-60.8 60.8zM190.4 467.2c0-1.6-1.6-4.8-4.8-4.8h-105.6c-1.6 0-4.8 1.6-4.8 4.8v107.2c0 1.6 1.6 4.8 4.8 4.8h107.2c1.6 0 4.8-1.6 4.8-4.8v-107.2zM976 548.8h-568c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h568c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM187.2 276.8h-107.2c-33.6 0-60.8-27.2-60.8-60.8v-107.2c0-33.6 27.2-60.8 60.8-60.8h107.2c33.6 0 60.8 27.2 60.8 60.8v107.2c-1.6 33.6-28.8 60.8-60.8 60.8zM190.4 108.8c0-1.6-1.6-4.8-4.8-4.8h-105.6c-1.6 0-4.8 1.6-4.8 4.8v107.2c0 1.6 1.6 4.8 4.8 4.8h107.2c1.6 0 4.8-1.6 4.8-4.8v-107.2zM976 190.4h-568c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h568c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xebc8;" glyph-name="music" d="M979.2 897.6c-16 14.4-38.4 22.4-60.8 20.8l-571.2-43.2c-41.6-3.2-73.6-38.4-73.6-80v-491.2c-27.2 16-60.8 25.6-99.2 25.6-86.4 0-155.2-49.6-155.2-112s67.2-112 155.2-112 155.2 49.6 155.2 112v374.4l619.2 48v-291.2c-27.2 16-60.8 25.6-99.2 25.6-86.4 0-155.2-49.6-155.2-112s67.2-112 155.2-112 155.2 49.6 155.2 112v579.2c0 19.2-9.6 41.6-25.6 56zM174.4 161.6c-57.6 0-99.2 30.4-99.2 56s40 56 99.2 56 99.2-30.4 99.2-56-41.6-56-99.2-56zM849.6 203.2c-57.6 0-99.2 30.4-99.2 56s40 56 99.2 56 99.2-30.4 99.2-56-41.6-56-99.2-56zM329.6 795.2c0 12.8 9.6 22.4 22.4 24l572.8 43.2c6.4 0 11.2-1.6 16-6.4s8-11.2 8-17.6v-144l-619.2-48v148.8z" />
<glyph unicode="&#xebce;" glyph-name="plus" d="M976 539.2h-435.2v436.8c0 16-12.8 28.8-28.8 28.8s-27.2-12.8-27.2-28.8v-436.8h-436.8c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2h436.8v-435.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v435.2h433.6c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2z" />
<glyph unicode="&#xebd2;" glyph-name="help" d="M512 1003.2c-272 0-491.2-219.2-491.2-491.2s219.2-492.8 491.2-492.8 492.8 220.8 492.8 492.8-220.8 491.2-492.8 491.2zM512 75.2c-240 0-435.2 196.8-435.2 436.8s195.2 435.2 435.2 435.2 436.8-195.2 436.8-435.2-196.8-436.8-436.8-436.8zM539.2 833.6c-46.4 8-92.8-4.8-126.4-33.6-35.2-28.8-56-72-56-118.4 0-17.6 3.2-35.2 9.6-51.2 4.8-14.4 20.8-22.4 35.2-17.6s22.4 20.8 17.6 35.2c-3.2 11.2-6.4 20.8-6.4 33.6 0 28.8 12.8 56 35.2 75.2s51.2 27.2 81.6 20.8c40-6.4 72-40 78.4-78.4 8-46.4-16-91.2-59.2-108.8-40-16-65.6-56-65.6-102.4v-102.4c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v102.4c0 22.4 12.8 43.2 30.4 49.6 67.2 27.2 105.6 97.6 92.8 171.2-11.2 62.4-62.4 113.6-124.8 124.8zM513.6 275.2h-4.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h4.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xebe1;" glyph-name="instant-indexing" d="M403.2 19.2c-6.4 0-11.2 1.6-17.6 3.2-20.8 8-32 27.2-28.8 49.6l41.6 348.8-137.6-27.2c-19.2-3.2-38.4 4.8-48 20.8-11.2 16-9.6 36.8 1.6 52.8l369.6 516.8c12.8 17.6 35.2 24 56 16s32-28.8 28.8-49.6l-49.6-361.6 142.4 35.2c19.2 4.8 38.4-3.2 49.6-19.2s11.2-38.4-1.6-54.4l-371.2-512c-8-11.2-20.8-19.2-35.2-19.2zM408 480c11.2 0 24-4.8 32-12.8 11.2-9.6 16-25.6 14.4-40l-38.4-328 336 464-131.2-33.6c-14.4-3.2-30.4 0-43.2 11.2-11.2 11.2-17.6 25.6-14.4 41.6l46.4 339.2-339.2-467.2 128 25.6h9.6z" />
<glyph unicode="&#xebe8;" glyph-name="404" d="M977.6 352l-355.2 483.2c-25.6 35.2-67.2 56-110.4 56-44.8 0-84.8-20.8-110.4-56l-355.2-483.2c-30.4-41.6-35.2-97.6-11.2-144s70.4-75.2 123.2-75.2h708.8c52.8 0 99.2 28.8 123.2 75.2s17.6 102.4-12.8 144zM939.2 233.6c-14.4-27.2-41.6-44.8-72-44.8h-708.8c-32 0-59.2 16-72 44.8-14.4 27.2-11.2 59.2 6.4 84.8l353.6 483.2c16 20.8 40 33.6 65.6 33.6s49.6-12.8 65.6-33.6l353.6-483.2c19.2-25.6 22.4-56 8-84.8zM512 416c16 0 28.8 12.8 28.8 28.8v179.2c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-180.8c0-14.4 12.8-27.2 28.8-27.2zM512 363.2c-25.6 0-46.4-20.8-46.4-46.4s20.8-46.4 46.4-46.4c25.6 0 46.4 20.8 46.4 46.4s-20.8 46.4-46.4 46.4z" />
<glyph unicode="&#xebea;" glyph-name="cross" d="M552 512l443.2 444.8c11.2 11.2 11.2 28.8 0 40s-28.8 11.2-40 0l-443.2-444.8-444.8 443.2c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l444.8-443.2-443.2-444.8c-11.2-11.2-11.2-28.8 0-40 4.8-4.8 12.8-8 19.2-8s14.4 3.2 19.2 8l444.8 444.8 443.2-444.8c4.8-4.8 12.8-8 19.2-8s14.4 3.2 19.2 8c11.2 11.2 11.2 28.8 0 40l-441.6 444.8z" />
<glyph unicode="&#xebf7;" glyph-name="fact-check" d="M913.6 913.6h-803.2c-49.6 0-91.2-40-91.2-91.2v-462.4c0-49.6 40-91.2 91.2-91.2h243.2l134.4-148.8c4.8-6.4 12.8-9.6 20.8-9.6s16 3.2 20.8 9.6l137.6 150.4h244.8c49.6 0 91.2 40 91.2 91.2v460.8c1.6 49.6-40 91.2-89.6 91.2zM948.8 360c0-19.2-16-35.2-35.2-35.2h-257.6c-8 0-16-3.2-20.8-9.6l-126.4-136-123.2 136c-4.8 6.4-12.8 9.6-20.8 9.6h-256c-19.2 0-35.2 16-35.2 35.2v462.4c0 19.2 16 35.2 35.2 35.2h803.2c19.2 0 35.2-16 35.2-35.2v-462.4zM627.2 689.6l-169.6-171.2-60.8 60.8c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l80-80c4.8-4.8 12.8-8 19.2-8s14.4 3.2 19.2 8l190.4 190.4c11.2 11.2 11.2 28.8 0 40-9.6 11.2-27.2 11.2-38.4 0z" />
<glyph unicode="&#xec3b;" glyph-name="recipe" d="M809.6 784c-27.2 0-54.4-6.4-80-17.6-8 118.4-104 211.2-219.2 211.2s-211.2-92.8-219.2-209.6c-24 9.6-49.6 16-75.2 16-108.8 0-195.2-89.6-195.2-201.6 0-100.8 72-185.6 166.4-198.4v-243.2c0-28.8 12.8-54.4 33.6-72s49.6-25.6 76.8-20.8l57.6 9.6c104 17.6 208 17.6 312 0l57.6-9.6c4.8-1.6 9.6-1.6 16-1.6 22.4 0 44.8 8 62.4 22.4 20.8 17.6 33.6 44.8 33.6 72v243.2c94.4 14.4 166.4 97.6 166.4 198.4 1.6 112-86.4 201.6-193.6 201.6zM766.4 112c-9.6-8-20.8-11.2-32-9.6l-57.6 9.6c-54.4 9.6-110.4 12.8-164.8 12.8s-110.4-4.8-164.8-12.8l-57.6-9.6c-11.2-1.6-22.4 1.6-32 9.6s-14.4 19.2-14.4 30.4v84.8l113.6 19.2c104 17.6 208 17.6 312 0l113.6-19.2v-84.8c-1.6-12.8-6.4-24-16-30.4zM809.6 438.4c-16 0-28.8-12.8-28.8-28.8v-126.4l-104 17.6c-1.6 0-4.8 0-6.4 1.6v129.6c0 16-12.8 28.8-28.8 28.8s-27.2-12.8-27.2-28.8v-123.2c-67.2 6.4-136 6.4-203.2 0v123.2c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8v-131.2c-1.6 0-4.8 0-6.4-1.6l-104-17.6v126.4c0 16-12.8 28.8-28.8 28.8-76.8 0-139.2 65.6-139.2 145.6s62.4 145.6 139.2 145.6c32 0 62.4-11.2 86.4-32 9.6-8 22.4-8 32-3.2 9.6 6.4 16 17.6 12.8 28.8-1.6 8-1.6 17.6-1.6 28.8 0 94.4 73.6 171.2 164.8 171.2s164.8-76.8 164.8-171.2c0-11.2-1.6-22.4-3.2-32-1.6-11.2 3.2-24 14.4-30.4s24-4.8 32 3.2c25.6 24 57.6 36.8 91.2 36.8 76.8 0 139.2-65.6 139.2-145.6 1.6-80-62.4-144-137.6-144z" />
<glyph unicode="&#xec56;" glyph-name="restaurant" d="M958.4 734.4l-131.2 232c-12.8 22.4-36.8 36.8-62.4 36.8h-505.6c-25.6 0-49.6-14.4-62.4-36.8l-131.2-232c0-1.6-1.6-1.6-1.6-3.2-1.6-3.2-1.6-6.4-1.6-9.6v-628.8c0-40 32-72 72-72h753.6c40 0 72 32 72 72v627.2c1.6 4.8 0 9.6-1.6 14.4zM272 694.4c-3.2-40-36.8-70.4-76.8-70.4s-73.6 30.4-76.8 70.4h153.6zM483.2 694.4c-3.2-40-36.8-70.4-76.8-70.4s-73.6 30.4-76.8 70.4h153.6zM694.4 694.4c-3.2-40-36.8-70.4-76.8-70.4s-73.6 30.4-76.8 70.4h153.6zM904 694.4c-3.2-40-36.8-70.4-76.8-70.4s-73.6 30.4-76.8 70.4h153.6zM246.4 939.2c3.2 4.8 8 8 14.4 8h504c6.4 0 11.2-3.2 14.4-8l107.2-190.4h-745.6l105.6 190.4zM288 75.2v265.6c0 9.6 8 16 16 16h80c9.6 0 16-8 16-16v-264h-112zM889.6 75.2h-433.6v265.6c0 40-32 72-72 72h-80c-40 0-72-32-72-72v-264h-96c-9.6 0-16 8-16 16v499.2c22.4-16 48-25.6 76.8-25.6 43.2 0 81.6 20.8 105.6 51.2 24-32 62.4-51.2 105.6-51.2s81.6 20.8 105.6 51.2c24-32 62.4-51.2 105.6-51.2s81.6 20.8 105.6 51.2c24-32 62.4-51.2 105.6-51.2 28.8 0 56 9.6 76.8 25.6v-500.8c-1.6-8-9.6-16-17.6-16zM742.4 412.8h-81.6c-27.2 0-49.6-22.4-49.6-49.6v-81.6c0-27.2 22.4-49.6 49.6-49.6h81.6c27.2 0 49.6 22.4 49.6 49.6v81.6c0 27.2-22.4 49.6-49.6 49.6zM736 286.4h-70.4v70.4h70.4v-70.4z" />
<glyph unicode="&#xec64;" glyph-name="post-format" d="M857.6 844.8l-156.8 134.4c-19.2 16-43.2 25.6-67.2 25.6h-400c-57.6 0-104-46.4-104-104v-777.6c0-57.6 46.4-104 104-104h206.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-206.4c-25.6 0-48 20.8-48 48v776c0 25.6 20.8 48 48 48h400c11.2 0 22.4-4.8 30.4-11.2l156.8-134.4c11.2-9.6 16-22.4 16-36.8v-675.2c0-8-6.4-16-16-16-16 0-27.2-12.8-27.2-28.8s12.8-28.8 28.8-28.8c40 0 72 32 72 72v676.8c0 30.4-14.4 59.2-36.8 78.4zM308.8 779.2h220.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-220.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM308.8 636.8h377.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-377.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM308.8 499.2h377.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-377.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM627.2 425.6c-68.8 0-126.4-56-126.4-126.4 0-36.8 16-72 43.2-94.4v-156.8c0-9.6 4.8-19.2 14.4-24 4.8-3.2 9.6-3.2 14.4-3.2s9.6 1.6 14.4 3.2l41.6 24 41.6-24c8-4.8 19.2-4.8 27.2 0s14.4 14.4 14.4 24v156.8c25.6 22.4 43.2 56 43.2 94.4-1.6 70.4-57.6 126.4-128 126.4zM627.2 369.6c38.4 0 70.4-32 70.4-70.4s-32-70.4-70.4-70.4-70.4 32-70.4 70.4 32 70.4 70.4 70.4zM654.4 96l-12.8 8c-8 4.8-19.2 4.8-27.2 0l-14.4-8v80c8-1.6 17.6-3.2 27.2-3.2s17.6 1.6 27.2 3.2v-80z" />
<glyph unicode="&#xec66;" glyph-name="service" d="M892.8 937.6h-761.6c-60.8 0-110.4-49.6-110.4-110.4v-326.4c0-60.8 49.6-110.4 110.4-110.4h1.6c16-44.8 60.8-78.4 112-78.4s96 32 112 78.4h310.4c16-44.8 60.8-78.4 112-78.4s96 32 112 78.4h1.6c60.8 0 110.4 49.6 110.4 110.4v326.4c1.6 60.8-48 110.4-110.4 110.4zM244.8 369.6c-33.6 0-62.4 25.6-62.4 57.6s27.2 57.6 62.4 57.6 62.4-25.6 62.4-57.6-28.8-57.6-62.4-57.6zM779.2 369.6c-33.6 0-62.4 25.6-62.4 57.6s27.2 57.6 62.4 57.6 62.4-25.6 62.4-57.6-27.2-57.6-62.4-57.6zM948.8 500.8c0-28.8-22.4-52.8-52.8-54.4-9.6 52.8-57.6 94.4-116.8 94.4-57.6 0-107.2-40-116.8-94.4h-300.8c-9.6 52.8-57.6 94.4-116.8 94.4-57.6 0-107.2-40-116.8-94.4-28.8 1.6-52.8 24-52.8 54.4v326.4c0 30.4 24 54.4 54.4 54.4h763.2c30.4 0 54.4-24 54.4-54.4v-326.4zM244.8 249.6c-89.6 0-174.4-44.8-220.8-118.4-8-12.8-4.8-30.4 8-38.4s30.4-4.8 38.4 8c36.8 57.6 102.4 92.8 172.8 92.8 72 0 136-35.2 172.8-92.8 4.8-8 14.4-12.8 24-12.8 4.8 0 9.6 1.6 14.4 4.8 12.8 8 17.6 25.6 8 38.4-44.8 73.6-126.4 118.4-217.6 118.4zM779.2 249.6c-89.6 0-174.4-44.8-220.8-118.4-8-12.8-4.8-30.4 8-38.4s30.4-4.8 38.4 8c36.8 57.6 102.4 92.8 172.8 92.8s136-35.2 172.8-92.8c4.8-8 14.4-12.8 24-12.8 4.8 0 9.6 1.6 14.4 4.8 12.8 8 17.6 25.6 8 38.4-44.8 73.6-126.4 118.4-217.6 118.4z" />
<glyph unicode="&#xec67;" glyph-name="code" d="M297.6 768c9.6 11.2 9.6 28.8-1.6 40-11.2 9.6-28.8 9.6-40-1.6l-217.6-244.8c-24-27.2-24-70.4 0-97.6l217.6-246.4c4.8-6.4 12.8-9.6 20.8-9.6 6.4 0 12.8 1.6 19.2 6.4 11.2 9.6 12.8 28.8 1.6 40l-217.6 246.4c-4.8 6.4-4.8 17.6 0 24l217.6 243.2zM985.6 561.6l-217.6 244.8c-9.6 11.2-27.2 12.8-40 1.6-11.2-9.6-12.8-27.2-1.6-40l217.6-244.8c4.8-6.4 4.8-17.6 0-24l-217.6-243.2c-9.6-11.2-9.6-28.8 1.6-40 4.8-4.8 12.8-6.4 19.2-6.4 8 0 16 3.2 20.8 9.6l217.6 244.8c24 27.2 24 68.8 0 97.6zM608 800c-14.4 4.8-30.4-3.2-35.2-17.6l-176-523.2c-3.2-14.4 3.2-30.4 19.2-35.2 3.2-1.6 6.4-1.6 9.6-1.6 11.2 0 22.4 8 27.2 19.2l176 523.2c1.6 14.4-4.8 30.4-20.8 35.2z" />
<glyph unicode="&#xec70;" glyph-name="course" d="M985.6 792l-464 168c-6.4 1.6-12.8 1.6-19.2 0l-464-168c-11.2-4.8-19.2-14.4-19.2-25.6s8-22.4 19.2-25.6l128-46.4v-296c0-12.8 8-22.4 19.2-27.2 137.6-46.4 241.6-65.6 337.6-65.6 48 0 94.4 4.8 140.8 14.4v-48c-44.8-12.8-78.4-52.8-78.4-102.4 0-57.6 48-105.6 105.6-105.6s105.6 48 105.6 105.6c0 48-33.6 89.6-78.4 102.4v62.4c38.4 9.6 76.8 24 120 38.4 11.2 4.8 19.2 14.4 19.2 25.6v294.4l128 46.4c11.2 4.8 19.2 14.4 19.2 25.6s-8 22.4-19.2 27.2zM742.4 169.6c0-27.2-22.4-49.6-49.6-49.6s-49.6 22.4-49.6 49.6 22.4 49.6 49.6 49.6c27.2 0 49.6-22.4 49.6-49.6zM222.4 417.6v254.4l280-100.8c3.2-1.6 6.4-1.6 9.6-1.6s6.4 0 9.6 1.6l142.4 51.2v-246.4c-129.6-27.2-252.8-19.2-441.6 41.6zM801.6 417.6c-28.8-9.6-56-19.2-81.6-25.6v251.2l81.6 30.4v-256zM696 694.4l-120 44.8c-14.4 4.8-30.4-1.6-36.8-16-4.8-14.4 1.6-30.4 16-36.8l57.6-22.4-100.8-36.8-380.8 137.6 380.8 137.6 380.8-137.6-196.8-70.4z" />
<glyph unicode="&#xec73;" glyph-name="book" d="M929.6 876.8h-364.8c-20.8 0-38.4-8-52.8-19.2-14.4 12.8-32 19.2-52.8 19.2h-364.8c-40 0-73.6-33.6-73.6-73.6v-540.8c0-40 33.6-73.6 73.6-73.6h390.4v-14.4c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v14.4h390.4c40 0 73.6 33.6 73.6 73.6v540.8c-1.6 41.6-35.2 73.6-76.8 73.6zM94.4 244.8c-9.6 0-17.6 8-17.6 17.6v540.8c0 9.6 8 17.6 17.6 17.6h366.4c12.8 0 24-11.2 24-24v-552h-390.4zM948.8 262.4c0-9.6-8-17.6-17.6-17.6h-390.4v552c0 12.8 11.2 24 24 24h364.8c9.6 0 17.6-8 17.6-17.6v-540.8zM217.6 659.2h123.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-123.2c-16 0-28.8-12.8-28.8-28.8s14.4-28.8 28.8-28.8zM678.4 659.2h123.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM803.2 579.2h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h123.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM344 579.2h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h123.2c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-28.8 28.8zM344 432h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h123.2c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-28.8 28.8zM803.2 432h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h123.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xec76;" glyph-name="social" d="M1003.2 822.4c-3.2 28.8-16 56-40 75.2-22.4 19.2-51.2 27.2-81.6 25.6-28.8-3.2-56-16-75.2-40s-25.6-51.2-22.4-80c0-8 1.6-16 4.8-22.4l-158.4-92.8c-30.4 48-83.2 81.6-144 81.6-48 0-91.2-20.8-123.2-52.8l-136 123.2c9.6 16 14.4 35.2 14.4 54.4 0 60.8-49.6 110.4-110.4 110.4s-110.4-51.2-110.4-112 49.6-110.4 110.4-110.4c20.8 0 40 6.4 56 16l142.4-129.6c-9.6-20.8-16-44.8-16-70.4 0-92.8 76.8-169.6 169.6-169.6h14.4l36.8-136c-44.8-25.6-75.2-72-75.2-128 0-80 65.6-145.6 145.6-145.6s145.6 65.6 145.6 145.6-65.6 145.6-145.6 145.6c-6.4 0-11.2 0-17.6-1.6l-36.8 132.8c59.2 25.6 100.8 86.4 100.8 155.2 0 12.8-1.6 24-3.2 35.2l168 97.6 4.8-4.8c20.8-16 44.8-25.6 70.4-25.6h11.2c28.8 3.2 56 16 75.2 40s28.8 54.4 25.6 83.2zM131.2 838.4c-30.4 0-54.4 24-54.4 54.4s24 54.4 54.4 54.4 54.4-24 54.4-54.4-25.6-54.4-54.4-54.4zM696 166.4c0-49.6-40-89.6-89.6-89.6s-89.6 40-89.6 89.6 40 89.6 89.6 89.6 89.6-40 89.6-89.6zM484.8 484.8c-62.4 0-113.6 51.2-113.6 113.6s51.2 113.6 113.6 113.6 113.6-51.2 113.6-113.6-51.2-113.6-113.6-113.6zM936 777.6c-9.6-11.2-22.4-17.6-36.8-19.2s-28.8 3.2-40 12.8c-11.2 9.6-17.6 22.4-19.2 36.8s3.2 28.8 12.8 40c9.6 11.2 22.4 17.6 36.8 19.2h4.8c12.8 0 25.6-4.8 35.2-12.8 11.2-9.6 17.6-22.4 19.2-36.8 0-14.4-4.8-28.8-12.8-40z" />
<glyph unicode="&#xec78;" glyph-name="edit" d="M1003.2 844.8c0 11.2-4.8 20.8-12.8 28.8l-59.2 59.2c-17.6 17.6-35.2 35.2-52.8 54.4-6.4 8-16 14.4-25.6 16-11.2 1.6-24-1.6-33.6-9.6l-115.2-115.2h-564.8c-65.6 0-118.4-52.8-118.4-118.4v-622.4c0-65.6 52.8-118.4 118.4-118.4h622.4c65.6 0 118.4 52.8 118.4 118.4v568l110.4 110.4c8 8 12.8 19.2 12.8 28.8zM532.8 438.4c-1.6-1.6-4.8-3.2-6.4-4.8l-137.6-46.4 44.8 137.6c1.6 3.2 1.6 4.8 4.8 6.4l304 304 96-94.4-305.6-302.4zM824 137.6c0-33.6-27.2-62.4-62.4-62.4h-622.4c-33.6 0-62.4 27.2-62.4 62.4v624c0 33.6 27.2 62.4 62.4 62.4h510.4l-251.2-251.2c-8-8-14.4-17.6-17.6-28.8l-60.8-185.6c-3.2-9.6-1.6-19.2 3.2-27.2 4.8-6.4 11.2-12.8 25.6-12.8h4.8l190.4 62.4c11.2 3.2 20.8 9.6 28.8 17.6l252.8 251.2v-512zM876.8 782.4l-96 94.4 64 64 46.4-46.4c16-16 32-32 48-49.6l-62.4-62.4z" />
<glyph unicode="&#xec7f;" glyph-name="comments-reply" d="M910.4 904h-796.8c-51.2 0-94.4-41.6-94.4-94.4v-569.6c0-35.2 19.2-67.2 49.6-83.2 14.4-8 28.8-11.2 44.8-11.2 17.6 0 36.8 4.8 52.8 16l142.4 96h57.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-65.6c-4.8 0-11.2-1.6-16-4.8l-148.8-99.2c-11.2-8-25.6-8-38.4-1.6s-20.8 19.2-20.8 33.6v568c0 20.8 16 36.8 36.8 36.8h796.8c20.8 0 38.4-17.6 38.4-38.4v-524.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v526.4c-1.6 51.2-44.8 92.8-96 92.8zM854.4 312c-40 38.4-89.6 65.6-147.2 75.2v44.8c0 17.6-9.6 33.6-25.6 41.6s-35.2 6.4-49.6-6.4l-166.4-131.2c-11.2-9.6-17.6-22.4-17.6-36.8s6.4-27.2 17.6-36.8l166.4-134.4c8-6.4 19.2-9.6 28.8-9.6 6.4 0 14.4 1.6 20.8 4.8 16 8 25.6 24 25.6 41.6v32c38.4-8 84.8-27.2 131.2-56 14.4-9.6 33.6-9.6 48 0 14.4 8 24 25.6 22.4 41.6 0 12.8-1.6 22.4-3.2 28.8-8 41.6-22.4 72-51.2 100.8zM707.2 254.4c-14.4 1.6-28.8-1.6-40-11.2s-17.6-22.4-17.6-36.8v-20.8l-142.4 113.6 142.4 113.6v-30.4c0-24 17.6-43.2 41.6-48 48-8 89.6-28.8 121.6-60.8 20.8-22.4 30.4-41.6 36.8-72v-3.2c-36.8 22.4-89.6 46.4-142.4 56zM164.8 630.4c0-51.2 41.6-94.4 94.4-94.4 51.2 0 94.4 41.6 94.4 94.4 0 51.2-41.6 94.4-94.4 94.4s-94.4-43.2-94.4-94.4zM296 630.4c0-20.8-17.6-38.4-38.4-38.4s-38.4 17.6-38.4 38.4 17.6 38.4 38.4 38.4 38.4-17.6 38.4-38.4zM606.4 630.4c0 51.2-41.6 94.4-94.4 94.4s-94.4-41.6-94.4-94.4c0-51.2 41.6-94.4 94.4-94.4s94.4 43.2 94.4 94.4zM473.6 630.4c0 20.8 17.6 38.4 38.4 38.4s38.4-17.6 38.4-38.4-17.6-38.4-38.4-38.4c-20.8 0-38.4 17.6-38.4 38.4zM764.8 536c51.2 0 94.4 41.6 94.4 94.4 0 51.2-41.6 94.4-94.4 94.4s-92.8-43.2-92.8-94.4 41.6-94.4 92.8-94.4zM764.8 668.8c20.8 0 38.4-17.6 38.4-38.4s-17.6-38.4-38.4-38.4-38.4 17.6-38.4 38.4 17.6 38.4 38.4 38.4z" />
<glyph unicode="&#xec86;" glyph-name="page" d="M862.4 862.4h-46.4v22.4c0 65.6-52.8 118.4-118.4 118.4h-456c-65.6 0-118.4-52.8-118.4-118.4v-542.4c0-19.2 8-36.8 20.8-51.2l243.2-249.6c14.4-14.4 33.6-22.4 52.8-22.4h302.4c40 0 73.6 33.6 73.6 73.6v17.6l80 163.2c1.6 3.2 3.2 8 3.2 12.8l1.6 537.6c0 19.2-17.6 36.8-38.4 38.4zM844.8 728h-112v80c36.8 0 73.6 0 112-1.6v-78.4zM384 124.8l-166.4 171.2h166.4v-171.2zM742.4 75.2h-302.4v238.4c0 20.8-17.6 38.4-38.4 38.4h-222.4v532.8c0 35.2 28.8 62.4 62.4 62.4h454.4c35.2 0 62.4-28.8 62.4-62.4v-22.4h-43.2c-22.4 0-41.6-17.6-41.6-38.4l-1.6-537.6c0-4.8 1.6-8 3.2-12.8l81.6-163.2v-17.6c3.2-9.6-4.8-17.6-14.4-17.6zM787.2 180.8l-56 112v379.2h112v-379.2l-56-112z" />
<glyph unicode="&#xecc9;" glyph-name="direction" d="M940.8 747.2l-80 102.4c-14.4 17.6-35.2 28.8-57.6 28.8h-384v97.6c0 16-12.8 28.8-28.8 28.8s-27.2-12.8-27.2-28.8v-99.2h-224c-40 0-72-32-72-72v-206.4c0-40 32-72 72-72h222.4v-478.4c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v478.4h385.6c22.4 0 43.2 9.6 57.6 28.8l80 102.4c19.2 25.6 19.2 62.4-1.6 89.6zM897.6 691.2l-80-102.4c-3.2-4.8-8-6.4-12.8-6.4h-665.6c-9.6 0-16 8-16 16v206.4c0 9.6 8 16 16 16h664c4.8 0 9.6-1.6 12.8-6.4l80-102.4c6.4-6.4 6.4-14.4 1.6-20.8z" />
<glyph unicode="&#xece7;" glyph-name="stories" d="M961.6 406.4l-64 40c-12.8 8-30.4 4.8-38.4-8s-4.8-30.4 8-38.4l56-35.2-411.2-260.8-411.2 259.2 56 35.2c12.8 8 17.6 25.6 8 38.4-8 12.8-25.6 17.6-38.4 8l-64-40c-14.4-9.6-24-25.6-24-41.6 0-17.6 8-33.6 24-41.6l422.4-265.6c8-4.8 17.6-8 27.2-8s19.2 3.2 27.2 8l422.4 265.6c14.4 9.6 24 25.6 24 41.6-1.6 17.6-9.6 33.6-24 43.2zM422.4 387.2l75.2-46.4c4.8-3.2 9.6-4.8 14.4-4.8s9.6 1.6 14.4 4.8l75.2 46.4c12.8 8 17.6 25.6 8 38.4-8 12.8-25.6 17.6-38.4 8l-59.2-36.8-59.2 36.8c-12.8 8-30.4 4.8-38.4-8-9.6-12.8-4.8-30.4 8-38.4zM350.4 499.2l-112 70.4c-12.8 8-30.4 4.8-38.4-8s-4.8-30.4 8-38.4l112-70.4c6.4-4.8 11.2-4.8 16-4.8 9.6 0 17.6 4.8 24 12.8 8 12.8 3.2 30.4-9.6 38.4zM123.2 580.8c9.6 0 17.6 4.8 24 12.8 8 12.8 4.8 30.4-8 38.4l-38.4 24 36.8 22.4c12.8 8 17.6 25.6 8 38.4-8 12.8-25.6 17.6-38.4 8l-75.2-46.4c-8-4.8-12.8-14.4-12.8-24s4.8-19.2 12.8-24l75.2-46.4c4.8-1.6 9.6-3.2 16-3.2zM224 739.2c4.8 0 9.6 1.6 14.4 4.8l112 70.4c12.8 8 17.6 25.6 8 38.4s-25.6 17.6-38.4 8l-112-70.4c-12.8-8-17.6-25.6-8-38.4 6.4-8 14.4-12.8 24-12.8zM452.8 878.4l59.2 36.8 59.2-36.8c4.8-3.2 9.6-4.8 14.4-4.8 9.6 0 19.2 4.8 24 12.8 8 12.8 4.8 30.4-8 38.4l-75.2 46.4c-9.6 6.4-20.8 6.4-30.4 0l-75.2-46.4c-12.8-8-17.6-25.6-8-38.4s27.2-17.6 40-8zM673.6 814.4l112-70.4c4.8-3.2 9.6-4.8 14.4-4.8 9.6 0 19.2 4.8 24 12.8 8 12.8 4.8 30.4-8 38.4l-112 70.4c-12.8 8-30.4 4.8-38.4-8-9.6-12.8-4.8-30.4 8-38.4zM990.4 680l-75.2 46.4c-12.8 8-30.4 4.8-38.4-8s-4.8-30.4 8-38.4l36.8-22.4-36.8-22.4c-12.8-8-17.6-25.6-8-38.4 4.8-8 14.4-12.8 24-12.8 4.8 0 9.6 1.6 14.4 4.8l75.2 46.4c8 4.8 12.8 14.4 12.8 24s-4.8 16-12.8 20.8zM688 448c4.8 0 9.6 1.6 14.4 4.8l112 70.4c12.8 8 17.6 25.6 8 38.4-8 12.8-25.6 17.6-38.4 8l-112-70.4c-12.8-8-17.6-25.6-8-38.4 6.4-9.6 14.4-12.8 24-12.8z" />
<glyph unicode="&#xeceb;" glyph-name="acf" d="M912 1003.2h-800c-51.2 0-91.2-40-91.2-91.2v-435.2c0-51.2 40-92.8 91.2-92.8h800c51.2 0 92.8 41.6 92.8 92.8v435.2c0 51.2-41.6 91.2-92.8 91.2zM948.8 476.8c0-19.2-16-36.8-36.8-36.8h-800c-19.2 0-36.8 16-36.8 36.8v435.2c0 19.2 16 36.8 36.8 36.8h800c19.2 0 36.8-16 36.8-36.8v-435.2zM886.4 249.6h-748.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h748.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM886.4 75.2h-748.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h748.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xecf8;" glyph-name="dataset" d="M934.4 392h-140.8c-6.4 0-11.2 3.2-12.8 8l-17.6 43.2v380.8c0 99.2-187.2 150.4-371.2 150.4-182.4 0-368-51.2-371.2-148.8v-435.2c0-97.6 192-152 371.2-152 32 0 64 1.6 94.4 4.8 1.6 0 3.2 0 3.2 1.6v-126.4c0-38.4 32-70.4 70.4-70.4h374.4c38.4 0 70.4 32 70.4 70.4v204.8c0 38.4-32 68.8-70.4 68.8zM494.4 441.6c-33.6-3.2-67.2-6.4-102.4-6.4-193.6 0-315.2 56-315.2 94.4v54.4c68.8-44.8 193.6-67.2 315.2-67.2 123.2 0 246.4 22.4 315.2 67.2v-97.6h-148.8c-30.4 1.6-56-17.6-64-44.8zM707.2 668.8c-1.6-38.4-123.2-94.4-315.2-94.4-193.6 0-315.2 56-315.2 94.4v72c68.8-44.8 192-68.8 315.2-68.8s246.4 22.4 315.2 67.2v-70.4zM392 918.4c192 0 315.2-56 315.2-94.4-1.6-38.4-123.2-94.4-315.2-94.4-193.6 0-315.2 56-315.2 94.4s121.6 94.4 315.2 94.4zM480 300.8c-28.8-3.2-57.6-4.8-88-4.8-190.4 0-315.2 57.6-315.2 96v54.4c68.8-44.8 193.6-67.2 315.2-67.2 33.6 0 65.6 1.6 97.6 4.8v-84.8c-3.2 1.6-6.4 1.6-9.6 1.6zM948.8 120c0-8-6.4-14.4-14.4-14.4h-376c-8 0-14.4 6.4-14.4 14.4v299.2c0 8 6.4 14.4 14.4 14.4h140.8c6.4 0 11.2-3.2 12.8-8l17.6-43.2c11.2-27.2 36.8-43.2 64-43.2h140.8c8 0 14.4-6.4 14.4-14.4v-204.8z" />
<glyph unicode="&#xed0d;" glyph-name="home" d="M891.2 587.2c-16 0-28.8-12.8-28.8-28.8v-436.8c0-22.4-17.6-40-40-40h-158.4v286.4c0 51.2-41.6 92.8-92.8 92.8h-121.6c-51.2 0-92.8-41.6-92.8-92.8v-284.8h-158.4c-22.4 0-40 17.6-40 40v436.8c0 16-12.8 28.8-28.8 28.8s-24-14.4-24-28.8v-436.8c0-52.8 43.2-96 96-96h624c52.8 0 96 43.2 96 96v436.8c-3.2 14.4-16 27.2-30.4 27.2zM416 83.2v284.8c0 19.2 16 36.8 36.8 36.8h121.6c19.2 0 36.8-16 36.8-36.8v-284.8h-195.2zM990.4 707.2l-427.2 275.2c-32 20.8-72 20.8-104 0l-425.6-275.2c-12.8-8-16-25.6-8-38.4s25.6-16 38.4-8l427.2 273.6c12.8 8 30.4 8 43.2 0l427.2-275.2c4.8-3.2 9.6-4.8 14.4-4.8 9.6 0 17.6 4.8 24 12.8 8 14.4 4.8 30.4-9.6 40z" />
<glyph unicode="&#xed1f;" glyph-name="toolbox" d="M880 793.6h-171.2v56c0 62.4-51.2 112-112 112h-169.6c-62.4 0-112-51.2-112-112v-56h-171.2c-68.8 0-124.8-56-124.8-124.8v-156.8c0-16 12.8-28.8 28.8-28.8h14.4v-304c0-65.6 52.8-118.4 118.4-118.4h662.4c65.6 0 118.4 52.8 118.4 118.4v304h14.4c16 0 28.8 12.8 28.8 28.8v156.8c0 68.8-56 124.8-124.8 124.8zM371.2 849.6c0 30.4 25.6 56 56 56h168c30.4 0 56-25.6 56-56v-56h-280v56zM76.8 668.8c0 36.8 30.4 68.8 68.8 68.8h736c36.8 0 68.8-30.4 68.8-68.8v-129.6h-873.6v129.6zM905.6 180.8c0-35.2-28.8-62.4-62.4-62.4h-662.4c-35.2 0-62.4 28.8-62.4 62.4v304h196.8v-99.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v99.2h281.6v-99.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v99.2h196.8v-304z" />
<glyph unicode="&#xed35;" glyph-name="comments" d="M292.8 657.6c-54.4 0-99.2-44.8-99.2-99.2s44.8-99.2 99.2-99.2 99.2 44.8 99.2 99.2c0 54.4-44.8 99.2-99.2 99.2zM292.8 515.2c-24 0-43.2 19.2-43.2 43.2s19.2 43.2 43.2 43.2 43.2-19.2 43.2-43.2c0-24-20.8-43.2-43.2-43.2zM512 657.6c-54.4 0-99.2-44.8-99.2-99.2s44.8-99.2 99.2-99.2 99.2 44.8 99.2 99.2c0 54.4-44.8 99.2-99.2 99.2zM512 515.2c-24 0-43.2 19.2-43.2 43.2s19.2 43.2 43.2 43.2 43.2-19.2 43.2-43.2c0-24-19.2-43.2-43.2-43.2zM732.8 657.6c-54.4 0-99.2-44.8-99.2-99.2s44.8-99.2 99.2-99.2 99.2 44.8 99.2 99.2c0 54.4-44.8 99.2-99.2 99.2zM732.8 515.2c-24 0-43.2 19.2-43.2 43.2s19.2 43.2 43.2 43.2 43.2-19.2 43.2-43.2c0-24-20.8-43.2-43.2-43.2zM908.8 864h-793.6c-52.8 0-96-43.2-96-96v-512c0-35.2 17.6-65.6 48-83.2 14.4-8 32-12.8 48-12.8s32 4.8 48 12.8l140.8 81.6c6.4 3.2 12.8 4.8 19.2 4.8h584c52.8 0 96 43.2 96 96v412.8c1.6 52.8-41.6 96-94.4 96zM948.8 355.2c0-22.4-17.6-40-40-40h-584c-16 0-33.6-4.8-48-12.8l-140.8-81.6c-12.8-6.4-27.2-6.4-40 0s-19.2 19.2-19.2 33.6v513.6c0 22.4 17.6 40 40 40h793.6c22.4 0 40-17.6 40-40v-412.8z" />
<glyph unicode="&#xed3a;" glyph-name="job" d="M947.2 977.6c-30.4 24-68.8 32-107.2 22.4l-564.8-139.2h-113.6c-72 0-131.2-59.2-131.2-131.2v-243.2c0-60.8 40-110.4 96-126.4l70.4-284.8c8-33.6 36.8-56 72-56h30.4c22.4 0 43.2 9.6 57.6 27.2s19.2 40 14.4 62.4l-54.4 235.2 524.8-128c9.6-3.2 20.8-3.2 30.4-3.2 27.2 0 54.4 9.6 76.8 27.2 30.4 24 46.4 57.6 46.4 96v545.6c-1.6 38.4-19.2 72-48 96zM305.6 811.2l216 52.8v-512l-216 52.8v406.4zM86.4 486.4v243.2c0 41.6 33.6 75.2 75.2 75.2h88v-393.6h-88c-41.6 0-75.2 33.6-75.2 75.2zM312 83.2c-1.6-3.2-6.4-6.4-14.4-6.4h-30.4c-8 0-14.4 4.8-17.6 12.8l-65.6 265.6h72l60.8-257.6c0-8-1.6-12.8-4.8-14.4zM937.6 334.4c0-19.2-9.6-38.4-25.6-51.2s-38.4-17.6-59.2-12.8l-275.2 67.2v540.8l275.2 67.2c20.8 4.8 41.6 0 59.2-12.8 16-12.8 25.6-30.4 25.6-51.2v-547.2z" />
<glyph unicode="&#xed4d;" glyph-name="post" d="M825.6 1003.2h-627.2c-51.2 0-91.2-40-91.2-91.2v-800c0-51.2 41.6-92.8 92.8-92.8h627.2c51.2 0 92.8 41.6 92.8 92.8v800c-3.2 51.2-43.2 91.2-94.4 91.2zM860.8 112c0-19.2-16-36.8-36.8-36.8h-625.6c-19.2 0-36.8 16-36.8 36.8v800c0 19.2 16 36.8 36.8 36.8h627.2c19.2 0 36.8-16 36.8-36.8v-800zM736 878.4h-182.4c-24 0-44.8-19.2-44.8-44.8v-220.8c0-24 19.2-44.8 44.8-44.8h182.4c24 0 44.8 19.2 44.8 44.8v222.4c-1.6 24-20.8 43.2-44.8 43.2zM723.2 625.6h-156.8v196.8h156.8v-196.8zM275.2 795.2h121.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-121.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM275.2 584h121.6c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-121.6c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2zM752 430.4h-476.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h476.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM752 219.2h-476.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h476.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xed64;" glyph-name="support" d="M489.6 723.2h-268.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h268.8c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-28.8 28.8zM220.8 540.8h123.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-123.2c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM427.2 470.4h-208c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h208c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8zM774.4 747.2c-36.8 4.8-70.4-12.8-88-44.8-8-14.4-1.6-30.4 11.2-38.4 14.4-8 30.4-1.6 38.4 11.2 6.4 11.2 19.2 17.6 32 16 14.4-1.6 25.6-12.8 27.2-25.6s-4.8-24-16-28.8c-24-11.2-41.6-40-41.6-67.2v-20.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v20.8c0 4.8 6.4 14.4 11.2 16 32 16 51.2 49.6 46.4 86.4-6.4 40-38.4 70.4-78.4 75.2zM764.8 465.6c-24 0-41.6-19.2-41.6-41.6 0-24 19.2-41.6 41.6-41.6 24 0 41.6 19.2 41.6 41.6 1.6 22.4-17.6 41.6-41.6 41.6zM884.8 873.6h-745.6c-65.6 0-118.4-52.8-118.4-118.4v-532.8c0-25.6 12.8-48 35.2-60.8 11.2-6.4 22.4-9.6 35.2-9.6s24 3.2 35.2 9.6l185.6 107.2c1.6 1.6 4.8 1.6 6.4 1.6h568c65.6 0 118.4 52.8 118.4 118.4v364.8c0 65.6-54.4 120-120 120zM948.8 387.2c0-35.2-28.8-62.4-62.4-62.4h-569.6c-12.8 0-24-3.2-35.2-9.6l-184-107.2c-6.4-3.2-12.8-1.6-14.4 0s-6.4 4.8-6.4 12.8v532.8c0 35.2 28.8 62.4 62.4 62.4h745.6c35.2 0 62.4-28.8 62.4-62.4v-366.4z" />
<glyph unicode="&#xed71;" glyph-name="search-console" d="M928 1003.2h-832c-41.6 0-75.2-33.6-75.2-75.2v-832c0-41.6 33.6-76.8 76.8-76.8h832c41.6 0 76.8 33.6 76.8 76.8v832c-1.6 41.6-36.8 75.2-78.4 75.2zM948.8 96c0-11.2-9.6-20.8-20.8-20.8h-832c-11.2 0-20.8 9.6-20.8 20.8v305.6l142.4 120c14.4-9.6 32-14.4 49.6-14.4 28.8 0 54.4 12.8 70.4 33.6l78.4-44.8c-1.6-8-3.2-14.4-3.2-22.4 0-49.6 40-91.2 91.2-91.2s91.2 40 91.2 91.2v8l120 110.4c16-12.8 35.2-20.8 57.6-20.8 49.6 0 91.2 40 91.2 91.2s-41.6 89.6-92.8 89.6c-49.6 0-91.2-40-91.2-91.2 0-8 1.6-16 3.2-22.4l-113.6-104c-16 17.6-40 28.8-67.2 28.8-22.4 0-41.6-8-57.6-20.8l-86.4 52.8v3.2c0 49.6-40 91.2-91.2 91.2s-91.2-40-91.2-91.2c0-11.2 1.6-22.4 6.4-32l-107.2-91.2v452.8c0 11.2 9.6 20.8 20.8 20.8h832c11.2 0 20.8-9.6 20.8-20.8v-832zM268.8 563.2c-19.2 0-35.2 16-35.2 35.2s16 35.2 35.2 35.2 35.2-16 35.2-35.2-16-35.2-35.2-35.2zM539.2 472c0-19.2-16-35.2-35.2-35.2s-35.2 16-35.2 35.2 16 35.2 35.2 35.2 35.2-16 35.2-35.2zM736 660.8c0 19.2 16 35.2 35.2 35.2s35.2-16 35.2-35.2-16-35.2-35.2-35.2-35.2 16-35.2 35.2z" />
<glyph unicode="&#xed73;" glyph-name="cart" d="M936 836.8c-17.6 22.4-43.2 33.6-72 33.6h-580.8l-4.8 72c-1.6 25.6-22.4 44.8-48 44.8h-134.4c-16 0-28.8-11.2-28.8-27.2s12.8-28.8 28.8-28.8h128l35.2-585.6c1.6-35.2 32-64 67.2-64h540.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-540.8c-6.4 0-11.2 4.8-11.2 11.2l-6.4 110.4h507.2c43.2 0 81.6 30.4 89.6 72l49.6 227.2c4.8 27.2-1.6 54.4-19.2 76.8zM899.2 771.2l-49.6-227.2c-3.2-16-19.2-28.8-35.2-28.8h-510.4l-17.6 299.2h577.6c11.2 0 20.8-4.8 28.8-12.8 6.4-8 9.6-19.2 6.4-30.4zM379.2 198.4c-52.8 0-94.4-43.2-94.4-96s43.2-96 94.4-96 94.4 43.2 94.4 96-43.2 96-94.4 96zM379.2 64c-20.8 0-38.4 17.6-38.4 40s17.6 40 38.4 40c20.8 0 38.4-17.6 38.4-40s-17.6-40-38.4-40zM769.6 198.4c-52.8 0-94.4-43.2-94.4-96s43.2-96 94.4-96 94.4 43.2 94.4 96c1.6 52.8-41.6 96-94.4 96zM769.6 64c-20.8 0-38.4 17.6-38.4 40s17.6 40 38.4 40c20.8 0 38.4-17.6 38.4-40 1.6-22.4-16-40-38.4-40z" />
<glyph unicode="&#xed83;" glyph-name="attachment" d="M526.4 19.2h-8c-75.2 0-155.2 30.4-204.8 76.8-52.8 49.6-81.6 116.8-81.6 185.6v515.2c0 68.8 33.6 131.2 92.8 169.6 57.6 40 128 49.6 195.2 25.6l4.8-1.6c8-3.2 17.6-4.8 27.2-11.2 73.6-38.4 116.8-107.2 116.8-184v-438.4c0-43.2-14.4-83.2-41.6-113.6-4.8-6.4-8-9.6-11.2-11.2-28.8-27.2-64-41.6-102.4-41.6-43.2 0-86.4 19.2-113.6 52.8-27.2 32-41.6 72-41.6 115.2v368c0 16 12.8 28.8 28.8 28.8s28.8-12.8 28.8-28.8v-368c0-28.8 9.6-57.6 28.8-78.4 17.6-20.8 43.2-33.6 70.4-33.6 24 0 44.8 9.6 62.4 25.6 1.6 1.6 3.2 3.2 6.4 8 17.6 20.8 28.8 48 28.8 78.4v436.8c0 57.6-32 105.6-88 134.4l-1.6 1.6c-3.2 1.6-8 3.2-14.4 6.4l-4.8 1.6c-51.2 17.6-104 9.6-147.2-19.2s-67.2-72-67.2-123.2v-513.6c0-52.8 24-105.6 64-145.6 40-38.4 105.6-62.4 166.4-62.4 57.6-1.6 115.2 20.8 156.8 60.8s64 91.2 62.4 147.2v400c0 16 12.8 28.8 28.8 28.8s28.8-12.8 28.8-28.8v-398.4c1.6-68.8-27.2-136-80-187.2-54.4-49.6-121.6-78.4-190.4-78.4z" />
<glyph unicode="&#xed8e;" glyph-name="mail" d="M912 849.6h-800c-51.2 0-92.8-41.6-92.8-92.8v-491.2c0-51.2 41.6-92.8 92.8-92.8h800c51.2 0 92.8 41.6 92.8 92.8v491.2c0 51.2-41.6 92.8-92.8 92.8zM912 793.6c8 0 14.4-1.6 20.8-6.4l-398.4-241.6c-14.4-8-30.4-8-44.8 0l-398.4 241.6c6.4 3.2 12.8 6.4 20.8 6.4h800zM912 230.4h-800c-19.2 0-36.8 16-36.8 36.8v464l384-233.6c16-9.6 33.6-14.4 51.2-14.4s35.2 4.8 51.2 14.4l384 233.6v-464c3.2-20.8-14.4-36.8-33.6-36.8z" />
<glyph unicode="&#xed91;" glyph-name="tag" d="M928 830.4c-16 16-40 24-62.4 20.8l-172.8-24c-64 94.4-177.6 200-364.8 171.2-16-1.6-25.6-16-24-32s16-25.6 32-24c145.6 22.4 238.4-49.6 296-124.8l-113.6-16c-16-1.6-28.8-9.6-40-19.2l-380.8-356.8c-14.4-14.4-22.4-33.6-22.4-52.8 0-20.8 8-40 22.4-52.8l294.4-278.4c14.4-12.8 32-20.8 51.2-20.8s36.8 6.4 51.2 20.8l382.4 361.6c11.2 11.2 19.2 25.6 22.4 41.6l49.6 323.2c3.2 24-4.8 46.4-20.8 62.4zM892.8 776l-51.2-324.8c0-3.2-3.2-8-4.8-9.6l-382.4-361.6c-6.4-6.4-17.6-6.4-24 0l-294.4 280c-3.2 3.2-4.8 8-4.8 12.8s1.6 9.6 4.8 12.8l379.2 358.4c3.2 3.2 6.4 4.8 9.6 4.8l140.8 19.2c25.6-44.8 36.8-80 38.4-84.8 3.2-12.8 14.4-19.2 27.2-19.2 3.2 0 4.8 0 8 1.6 14.4 4.8 22.4 20.8 19.2 35.2 0 1.6-11.2 33.6-33.6 76.8l148.8 20.8h3.2c6.4 0 9.6-3.2 12.8-4.8 1.6-4.8 4.8-9.6 3.2-17.6z" />
<glyph unicode="&#xed95;" glyph-name="target" d="M371.2 99.2c-176 60.8-294.4 225.6-294.4 412.8 0 240 195.2 435.2 435.2 435.2 179.2 0 342.4-112 406.4-278.4 4.8-14.4 22.4-20.8 36.8-16s20.8 22.4 16 36.8c-73.6 187.2-257.6 313.6-459.2 313.6-272 0-491.2-219.2-491.2-491.2 0-211.2 134.4-398.4 332.8-465.6 3.2-1.6 6.4-1.6 9.6-1.6 11.2 0 22.4 8 27.2 19.2 3.2 14.4-4.8 30.4-19.2 35.2zM512 636.8c27.2 0 52.8-9.6 75.2-25.6 12.8-9.6 30.4-8 40 4.8s8 30.4-4.8 40c-32 24-68.8 36.8-108.8 36.8-97.6 0-177.6-80-177.6-177.6 0-40 12.8-78.4 38.4-108.8 4.8-6.4 14.4-11.2 22.4-11.2 6.4 0 12.8 1.6 17.6 6.4 12.8 9.6 14.4 27.2 4.8 40-17.6 20.8-25.6 48-25.6 75.2-3.2 65.6 51.2 120 118.4 120zM732.8 563.2c-150.4 0-272-121.6-272-272s121.6-272 272-272 272 121.6 272 272-123.2 272-272 272zM732.8 75.2c-118.4 0-216 97.6-216 216s97.6 216 216 216 216-97.6 216-216-97.6-216-216-216zM396.8 260.8c-99.2 44.8-163.2 145.6-163.2 254.4 0 153.6 124.8 278.4 278.4 278.4 108.8 0 209.6-64 254.4-164.8 6.4-14.4 22.4-20.8 36.8-14.4s20.8 22.4 14.4 36.8c-54.4 121.6-174.4 198.4-305.6 198.4-184 0-334.4-150.4-334.4-334.4 0-131.2 76.8-251.2 196.8-304 3.2-1.6 8-3.2 11.2-3.2 11.2 0 20.8 6.4 25.6 16 6.4 14.4 0 30.4-14.4 36.8zM817.6 361.6l-110.4-110.4-44.8 44.8c-11.2 11.2-28.8 11.2-40 0s-11.2-28.8 0-40l64-64c4.8-4.8 12.8-8 19.2-8s14.4 3.2 19.2 8l129.6 129.6c11.2 11.2 11.2 28.8 0 40s-25.6 11.2-36.8 0z" />
<glyph unicode="&#xeda5;" glyph-name="facebook" d="M579.2 3.2h-124.8c-32 0-57.6 27.2-57.6 60.8v380.8h-102.4c-32 0-57.6 27.2-57.6 60.8v110.4c0 33.6 25.6 60.8 57.6 60.8h99.2v100.8c0 145.6 86.4 243.2 214.4 243.2h96c32 0 57.6-27.2 57.6-60.8v-129.6c0-33.6-25.6-60.8-57.6-60.8h-68.8v-91.2h91.2c19.2-1.6 35.2-9.6 46.4-22.4 11.2-14.4 16-33.6 12.8-51.2l-19.2-108.8c-3.2-28.8-27.2-49.6-57.6-49.6h-73.6v-382.4c0-32-25.6-60.8-56-60.8zM424 500.8c16 0 28.8-12.8 28.8-28.8v-408c0-3.2 1.6-4.8 1.6-4.8h124.8s1.6 1.6 1.6 4.8v411.2c0 16 12.8 28.8 28.8 28.8h100.8s1.6 0 1.6 1.6v1.6l19.2 107.2c0 3.2 0 4.8-1.6 6.4 0 0-1.6 1.6-3.2 1.6h-118.4c-16 0-28.8 12.8-28.8 28.8v113.6c0 28.8 4.8 60.8 59.2 60.8h65.6s1.6 1.6 1.6 4.8v128c0 3.2-1.6 4.8-1.6 4.8h-94.4c-96 0-158.4-73.6-158.4-187.2v-129.6c0-16-12.8-28.8-28.8-28.8h-128s-1.6-1.6-1.6-4.8v-110.4c0-3.2 1.6-4.8 1.6-4.8l129.6 3.2z" />
<glyph unicode="&#xedc1;" glyph-name="movie" d="M358.4 766.4c-60.8 0-110.4-49.6-110.4-110.4s49.6-110.4 110.4-110.4 110.4 49.6 110.4 110.4-48 110.4-110.4 110.4zM358.4 600c-30.4 0-54.4 24-54.4 54.4s24 54.4 54.4 54.4 54.4-24 54.4-54.4c1.6-30.4-24-54.4-54.4-54.4zM665.6 544c60.8 0 110.4 49.6 110.4 110.4s-49.6 110.4-110.4 110.4-110.4-49.6-110.4-110.4 48-110.4 110.4-110.4zM665.6 710.4c30.4 0 54.4-24 54.4-54.4s-24-54.4-54.4-54.4-54.4 24-54.4 54.4c-1.6 28.8 24 54.4 54.4 54.4zM358.4 480c-60.8 0-110.4-49.6-110.4-110.4s49.6-110.4 110.4-110.4 110.4 49.6 110.4 110.4-48 110.4-110.4 110.4zM358.4 313.6c-30.4 0-54.4 24-54.4 54.4s24 54.4 54.4 54.4 54.4-24 54.4-54.4-24-54.4-54.4-54.4zM665.6 257.6c60.8 0 110.4 49.6 110.4 110.4s-49.6 112-110.4 112-110.4-49.6-110.4-110.4 48-112 110.4-112zM665.6 424c30.4 0 54.4-24 54.4-54.4s-24-54.4-54.4-54.4-54.4 24-54.4 54.4 24 54.4 54.4 54.4zM976 75.2h-236.8c156.8 83.2 265.6 248 265.6 436.8 0 272-220.8 491.2-492.8 491.2s-491.2-219.2-491.2-491.2 219.2-492.8 491.2-492.8h464c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2zM76.8 512c0 240 195.2 435.2 435.2 435.2s436.8-195.2 436.8-435.2-196.8-436.8-436.8-436.8-435.2 196.8-435.2 436.8z" />
<glyph unicode="&#xeefa;" glyph-name="instagram" d="M512 747.2c-129.6 0-235.2-105.6-235.2-235.2s105.6-235.2 235.2-235.2 235.2 105.6 235.2 235.2-105.6 235.2-235.2 235.2zM512 332.8c-99.2 0-179.2 80-179.2 179.2s80 179.2 179.2 179.2c99.2 0 179.2-80 179.2-179.2s-80-179.2-179.2-179.2zM769.6 862.4c-33.6 0-60.8-27.2-60.8-60.8s27.2-60.8 60.8-60.8c33.6 0 60.8 27.2 60.8 60.8s-27.2 60.8-60.8 60.8zM768 1019.2h-512c-139.2 0-251.2-112-251.2-251.2v-512c0-139.2 113.6-251.2 252.8-251.2h512c139.2 0 251.2 113.6 251.2 252.8v510.4c0 139.2-113.6 251.2-252.8 251.2zM964.8 256c0-108.8-88-196.8-195.2-196.8h-513.6c-107.2 0-195.2 88-195.2 196.8v512c0 107.2 88 195.2 195.2 195.2h512c108.8 0 196.8-88 196.8-196.8v-510.4z" />
<glyph unicode="&#xef60;" glyph-name="light-bulb" d="M808 784s0 1.6-1.6 1.6c-8 22.4-27.2 70.4-70.4 116.8-46.4 49.6-102.4 81.6-164.8 94.4-40 8-78.4 8-118.4 0-62.4-11.2-118.4-43.2-164.8-92.8-43.2-46.4-60.8-94.4-70.4-118.4-11.2-28.8-28.8-76.8-24-142.4 3.2-48 19.2-96 48-142.4 11.2-17.6 25.6-41.6 46.4-70.4 6.4-9.6 11.2-16 16-22.4l1.6-1.6c12.8-17.6 20.8-28.8 28.8-44.8 8-17.6 14.4-35.2 19.2-52.8 3.2-12.8 14.4-20.8 27.2-20.8h265.6c12.8 0 24 8 27.2 20.8 4.8 19.2 11.2 36.8 19.2 51.2 8 16 16 27.2 27.2 43.2l25.6 35.2c16 22.4 28.8 41.6 40 60.8s41.6 72 46.4 142.4c3.2 65.6-14.4 113.6-24 142.4zM755.2 764.8c9.6-25.6 24-64 19.2-116.8-4.8-57.6-30.4-102.4-40-118.4s-22.4-35.2-36.8-56l-24-35.2c-12.8-17.6-22.4-32-32-51.2-6.4-12.8-12.8-27.2-17.6-41.6h-224c-4.8 14.4-9.6 27.2-16 41.6-9.6 20.8-19.2 35.2-33.6 52.8l-1.6 1.6c-4.8 6.4-9.6 12.8-16 22.4-19.2 27.2-33.6 49.6-44.8 67.2-8 14.4-35.2 59.2-40 118.4-4.8 52.8 9.6 91.2 20.8 118.4 8 20.8 22.4 60.8 59.2 99.2 40 40 84.8 65.6 136 76.8 32 6.4 64 6.4 96 0 51.2-11.2 96-36.8 136-78.4 36.8-38.4 51.2-78.4 59.2-99.2v-1.6zM614.4 214.4h-204.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h203.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-27.2 28.8zM579.2 75.2h-134.4c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h134.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8z" />
<glyph unicode="&#xefde;" glyph-name="mail-reply" d="M990.4 408l-76.8 76.8c-8 8-19.2 12.8-32 12.8s-24-4.8-32-12.8l-163.2-164.8c-6.4-6.4-9.6-14.4-12.8-22.4l-20.8-97.6c-3.2-14.4 1.6-30.4 12.8-41.6 8-8 20.8-12.8 32-12.8 3.2 0 6.4 0 9.6 1.6l97.6 20.8c8 1.6 16 6.4 22.4 12.8l163.2 163.2c8 8 12.8 19.2 12.8 32 1.6 11.2-3.2 24-12.8 32zM788.8 222.4l-78.4-17.6 17.6 78.4 153.6 153.6 60.8-60.8-153.6-153.6zM539.2 264h-427.2c-19.2 0-35.2 16-35.2 35.2v484.8l371.2-225.6c16-9.6 32-14.4 49.6-14.4s35.2 4.8 49.6 14.4l374.4 225.6v-220.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v224c0 49.6-41.6 91.2-91.2 91.2h-776c-49.6 0-91.2-41.6-91.2-91.2v-488c0-49.6 40-91.2 91.2-91.2h428.8c16 0 28.8 12.8 28.8 28.8s-14.4 27.2-30.4 27.2zM520 606.4c-12.8-8-28.8-8-41.6 0l-358.4 216h756.8l-356.8-216z" />
<glyph unicode="&#xefee;" glyph-name="podcast" d="M512 323.2c51.2 0 99.2 19.2 134.4 56 35.2 35.2 54.4 81.6 52.8 131.2v305.6c0 104-84.8 187.2-187.2 187.2-104 0-187.2-84.8-187.2-187.2v-304c-1.6-104 83.2-188.8 187.2-188.8zM379.2 816c0 72 59.2 131.2 131.2 131.2s131.2-59.2 131.2-131.2v-305.6c0-35.2-12.8-67.2-36.8-92.8-25.6-25.6-59.2-40-94.4-40-72 0-131.2 59.2-131.2 131.2v307.2zM843.2 520c0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8c0-152-123.2-275.2-276.8-275.2-152 0-275.2 123.2-275.2 275.2 0 16-12.8 28.8-28.8 28.8s-28.8-12.8-28.8-28.8c0-172.8 132.8-315.2 302.4-329.6v-113.6h-112c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h280c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-112v113.6c174.4 12.8 308.8 155.2 308.8 329.6z" />
<glyph unicode="&#xf0a8;" glyph-name="pencil" d="M990.4 819.2c-54.4 56-108.8 113.6-166.4 168-9.6 9.6-20.8 16-33.6 16s-24-4.8-33.6-12.8l-624-620.8c-8-8-14.4-19.2-19.2-30.4l-91.2-278.4c-3.2-9.6-1.6-20.8 3.2-28.8 3.2-4.8 11.2-12.8 27.2-12.8h4.8l281.6 94.4c11.2 3.2 20.8 9.6 30.4 19.2l620.8 620.8c9.6 9.6 14.4 20.8 14.4 33.6-1.6 11.2-6.4 24-14.4 32zM329.6 172.8c-1.6-1.6-4.8-4.8-8-4.8l-232-78.4 76.8 230.4c1.6 3.2 3.2 6.4 4.8 8l462.4 460.8 156.8-156.8-460.8-459.2zM830.4 673.6l-156.8 156.8 115.2 113.6c52.8-51.2 105.6-105.6 155.2-156.8l-113.6-113.6z" />
<glyph unicode="&#xf335;" glyph-name="text-align-left" d="M48 904h928c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2h-928c-16 0-27.2-12.8-27.2-27.2s11.2-28.8 27.2-28.8zM976 680h-928c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2h928c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2zM976 400h-928c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2h928c16 0 28.8 12.8 28.8 28.8s-12.8 27.2-28.8 27.2zM686.4 120h-638.4c-16 0-28.8-12.8-28.8-28.8s12.8-27.2 28.8-27.2h638.4c16 0 28.8 12.8 28.8 28.8s-14.4 27.2-28.8 27.2z" />
<glyph unicode="&#xf338;" glyph-name="text" d="M844.8 1003.2h-665.6c-54.4 0-97.6-43.2-97.6-96v-91.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v91.2c0 22.4 17.6 41.6 41.6 41.6h216v-872h-104c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h443.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-104v870.4h216c22.4 0 41.6-17.6 41.6-41.6v-91.2c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v92.8c-4.8 52.8-48 96-102.4 96zM572.8 75.2h-121.6v872h121.6v-872z" />
<glyph unicode="&#xf33b;" glyph-name="heading" d="M806.4 1003.2h-588.8c-51.2 0-94.4-41.6-94.4-94.4v-92.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v94.4c0 20.8 17.6 38.4 38.4 38.4h180.8v-622.4h-92.8c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h408c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-91.2v620.8h184c20.8 0 38.4-17.6 38.4-38.4v-92.8c0-16 12.8-28.8 28.8-28.8s28.8 12.8 28.8 28.8v94.4c-3.2 51.2-44.8 92.8-97.6 92.8zM568 324.8h-112v622.4h112v-622.4zM856 75.2h-688c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h689.6c16 0 28.8 12.8 28.8 28.8s-14.4 28.8-30.4 28.8z" />
<glyph unicode="&#xf345;" glyph-name="thumbs-up" d="M153.6 632h-51.2c-46.4 0-83.2-36.8-83.2-83.2v-368c0-46.4 36.8-83.2 83.2-83.2h49.6c46.4 0 83.2 36.8 83.2 83.2v368c1.6 46.4-35.2 83.2-81.6 83.2zM180.8 180.8c0-14.4-12.8-27.2-27.2-27.2h-51.2c-14.4 0-27.2 12.8-27.2 27.2v368c0 14.4 12.8 27.2 27.2 27.2h49.6c14.4 0 27.2-12.8 27.2-27.2v-368zM1001.6 568c-1.6 6.4-1.6 12.8-3.2 17.6-9.6 33.6-30.4 59.2-57.6 73.6-27.2 12.8-54.4 12.8-78.4 12.8h-187.2l27.2 124.8c4.8 19.2 9.6 43.2 3.2 68.8-12.8 43.2-59.2 70.4-102.4 59.2-27.2-6.4-48-27.2-62.4-41.6-8-8-20.8-20.8-38.4-36.8-155.2-152-185.6-184-190.4-200-8-20.8-8-41.6-8-62.4v-350.4c0-27.2 0-73.6 30.4-104s75.2-32 104-32h320c19.2 0 44.8 0 67.2 12.8 32 17.6 46.4 51.2 56 73.6 75.2 174.4 115.2 281.6 121.6 318.4 1.6 24 1.6 46.4-1.6 65.6zM945.6 510.4c-3.2-17.6-22.4-83.2-116.8-305.6-8-20.8-17.6-38.4-30.4-46.4-9.6-4.8-25.6-4.8-40-4.8h-316.8c-27.2 0-52.8 1.6-67.2 14.4-12.8 12.8-14.4 40-14.4 65.6v350.4c0 16 0 28.8 4.8 40 14.4 22.4 129.6 132.8 179.2 180.8 16 16 30.4 28.8 38.4 36.8 11.2 11.2 24 24 36.8 27.2s30.4-6.4 35.2-20.8c3.2-11.2 0-27.2-3.2-41.6l-35.2-160c-1.6-8 0-17.6 4.8-24s12.8-11.2 22.4-9.6l220.8 3.2c19.2 0 38.4 0 51.2-6.4s24-20.8 28.8-38.4c1.6-3.2 1.6-8 3.2-11.2 1.6-14.4 1.6-30.4-1.6-49.6z" />
<glyph unicode="&#xf3c1;" glyph-name="twitter" d="M329.6 97.6c-113.6 0-222.4 32-313.6 94.4-11.2 8-16 20.8-11.2 33.6s17.6 19.2 30.4 17.6c14.4-1.6 28.8-3.2 43.2-3.2 59.2 0 116.8 14.4 168 40-62.4 22.4-112 73.6-134.4 140.8-3.2 9.6 0 20.8 6.4 27.2 1.6 1.6 3.2 3.2 4.8 3.2-49.6 41.6-80 102.4-80 171.2v1.6c0 9.6 4.8 19.2 14.4 24 4.8 3.2 11.2 4.8 16 3.2-19.2 33.6-28.8 70.4-28.8 110.4s9.6 78.4 30.4 112c4.8 8 12.8 12.8 22.4 14.4 9.6 0 17.6-3.2 24-9.6 86.4-107.2 211.2-174.4 347.2-188.8v12.8c0 123.2 99.2 222.4 222.4 222.4 56 0 108.8-20.8 150.4-59.2 22.4 6.4 44.8 20.8 67.2 35.2 9.6 6.4 20.8 12.8 30.4 19.2 9.6 4.8 20.8 4.8 28.8 0 9.6-6.4 14.4-16 12.8-27.2-1.6-8-4.8-40-16-72h24c11.2 1.6 22.4-3.2 28.8-12.8s6.4-22.4 0-30.4c-22.4-35.2-56-57.6-89.6-80l-14.4-9.6v-11.2c-1.6-283.2-219.2-579.2-584-579.2zM142.4 188.8c59.2-22.4 121.6-35.2 187.2-35.2 329.6 0 526.4 267.2 526.4 526.4v20.8c-1.6 9.6 3.2 19.2 11.2 25.6 9.6 6.4 19.2 12.8 27.2 19.2l33.6 24c-4.8 0-8 1.6-12.8 1.6-9.6 1.6-17.6 8-20.8 17.6s-3.2 19.2 3.2 27.2c3.2 4.8 8 12.8 11.2 20.8-22.4-12.8-46.4-25.6-73.6-30.4-9.6-1.6-19.2 1.6-25.6 8-32 33.6-75.2 52.8-121.6 52.8-91.2 0-166.4-75.2-166.4-166.4 0-11.2 1.6-24 4.8-38.4 1.6-8 0-17.6-6.4-24-4.8-6.4-14.4-9.6-22.4-9.6-148.8 9.6-289.6 73.6-392 180.8-4.8-14.4-6.4-30.4-6.4-46.4 0-56 27.2-107.2 73.6-137.6 11.2-6.4 14.4-19.2 11.2-32-3.2-11.2-16-19.2-27.2-19.2-17.6 0-36.8 3.2-54.4 8 16-60.8 64-108.8 128-121.6 12.8-3.2 22.4-14.4 22.4-27.2s-8-24-20.8-27.2c-17.6-4.8-33.6-6.4-48-8 30.4-44.8 80-73.6 136-75.2 11.2 0 22.4-8 25.6-19.2s0-24-9.6-30.4c-56-46.4-123.2-73.6-193.6-84.8z" />
<glyph unicode="&#xf3d0;" glyph-name="seo-title" d="M225.6 932.8h572.8c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-572.8c-16 0-28.8-12.8-28.8-28.8s14.4-28.8 28.8-28.8zM716.8 817.6h-409.6c-54.4 0-97.6-43.2-97.6-97.6v-30.4c0-54.4 43.2-97.6 97.6-97.6h409.6c54.4 0 97.6 43.2 97.6 97.6v30.4c0 54.4-43.2 97.6-97.6 97.6zM758.4 689.6c0-22.4-19.2-41.6-41.6-41.6h-409.6c-22.4 0-41.6 19.2-41.6 41.6v30.4c0 22.4 19.2 41.6 41.6 41.6h409.6c22.4 0 41.6-19.2 41.6-41.6v-30.4zM976 972.8c-16 0-28.8-12.8-28.8-28.8v-812.8c0-22.4-19.2-41.6-41.6-41.6h-787.2c-22.4 0-41.6 19.2-41.6 41.6v814.4c0 14.4-12.8 27.2-28.8 27.2s-27.2-12.8-27.2-27.2v-812.8c0-54.4 43.2-97.6 97.6-97.6h788.8c54.4 0 97.6 43.2 97.6 97.6v812.8c0 14.4-12.8 27.2-28.8 27.2z" />
<glyph unicode="&#xf3d8;" glyph-name="user" d="M512 587.2c118.4 0 214.4 92.8 214.4 208s-96 208-214.4 208-214.4-92.8-214.4-208 96-208 214.4-208zM512 947.2c88 0 158.4-68.8 158.4-152s-72-152-158.4-152c-88 0-158.4 68.8-158.4 152s70.4 152 158.4 152zM612.8 504h-201.6c-152 0-276.8-123.2-276.8-276.8v-158.4c0-27.2 22.4-49.6 49.6-49.6h654.4c27.2 0 49.6 22.4 49.6 49.6v158.4c1.6 153.6-123.2 276.8-275.2 276.8zM833.6 75.2h-643.2v152c0 121.6 99.2 220.8 220.8 220.8h201.6c121.6 0 220.8-99.2 220.8-220.8v-152z" />
<glyph unicode="&#xf43b;" glyph-name="seo" d="M251.2 544h49.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-49.6c-43.2 0-78.4-35.2-78.4-78.4v-49.6c0-43.2 35.2-78.4 78.4-78.4 11.2 0 22.4-9.6 22.4-22.4v-49.6c0-11.2-9.6-22.4-22.4-22.4h-49.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8h49.6c43.2 0 78.4 35.2 78.4 78.4v49.6c0 43.2-35.2 78.4-78.4 78.4-11.2 0-22.4 9.6-22.4 22.4v49.6c0 12.8 11.2 22.4 22.4 22.4zM492.8 544h70.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-70.4c-43.2 0-78.4-35.2-78.4-78.4v-198.4c0-43.2 35.2-78.4 78.4-78.4h70.4c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-70.4c-11.2 0-22.4 9.6-22.4 22.4v72h51.2c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-51.2v72c0 6.4 9.6 16 22.4 16zM772.8 600h-38.4c-43.2 0-78.4-35.2-78.4-78.4v-196.8c0-43.2 35.2-78.4 78.4-78.4h38.4c43.2 0 78.4 35.2 78.4 78.4v196.8c0 43.2-35.2 78.4-78.4 78.4zM795.2 324.8c0-12.8-9.6-22.4-22.4-22.4h-38.4c-12.8 0-22.4 9.6-22.4 22.4v196.8c0 12.8 9.6 22.4 22.4 22.4h38.4c12.8 0 22.4-9.6 22.4-22.4v-196.8zM928 939.2h-832c-41.6 0-76.8-33.6-76.8-76.8v-700.8c0-41.6 33.6-76.8 76.8-76.8h832c41.6 0 76.8 33.6 76.8 76.8v700.8c0 41.6-35.2 76.8-76.8 76.8zM96 883.2h832c11.2 0 20.8-9.6 20.8-20.8v-132.8h-872v132.8c0 11.2 8 20.8 19.2 20.8zM928 140.8h-832c-11.2 0-20.8 9.6-20.8 20.8v512h872v-512c1.6-11.2-8-20.8-19.2-20.8zM587.2 779.2h1.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-1.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM697.6 779.2h1.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-1.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8zM808 779.2h1.6c16 0 28.8 12.8 28.8 28.8s-12.8 28.8-28.8 28.8h-1.6c-16 0-28.8-12.8-28.8-28.8s12.8-28.8 28.8-28.8z" />
<glyph unicode="&#xf485;" glyph-name="youtube" d="M987.2 750.4c-11.2 43.2-44.8 76.8-88 88-76.8 20.8-387.2 20.8-387.2 20.8s-310.4 0-387.2-20.8c-43.2-11.2-76.8-44.8-88-88-20.8-78.4-20.8-238.4-20.8-238.4s0-161.6 20.8-238.4c11.2-43.2 44.8-76.8 88-88 76.8-20.8 387.2-20.8 387.2-20.8s310.4 0 387.2 20.8c43.2 11.2 76.8 44.8 88 88 20.8 76.8 20.8 238.4 20.8 238.4s0 160-20.8 238.4zM412.8 363.2v297.6l257.6-148.8-257.6-148.8z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

@@ -0,0 +1 @@
<svg width="38" height="38" viewBox="0 0 38 38" xmlns="http://www.w3.org/2000/svg" stroke="#6c7781"><g fill="none" fill-rule="evenodd"><g transform="translate(1 1)" stroke-width="2"><circle stroke-opacity=".5" cx="18" cy="18" r="18"/><path d="M36 18c0-9.94-8.06-18-18-18"><animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="1s" repeatCount="indefinite"/></path></g></g></svg>

After

Width:  |  Height:  |  Size: 417 B

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<svg viewBox="0 0 630 101.88" xmlns="http://www.w3.org/2000/svg"><g fill="#636eb9"><path d="m235.33 89.2-12.02-17.2a19.23 19.23 0 0 1 -2.27.09h-13.28v17.11h-10.93v-58.84h24.17c15.46 0 25.05 7.9 25.05 20.93 0 8.91-4.54 15.47-12.53 18.58l13.58 19.33zm-14.8-49.59h-12.77v23.45h12.77c9.59 0 14.54-4.37 14.54-11.77s-4.95-11.68-14.54-11.68z"/><path d="m294.41 62.89v26.31h-9.92v-5.46c-2.52 3.87-7.4 6.05-14.12 6.05-10.25 0-16.73-5.63-16.73-13.45 0-7.48 5.05-13.36 18.66-13.36h11.6v-.68c0-6.13-3.7-9.75-11.18-9.75-5 0-10.25 1.68-13.61 4.46l-4.11-7.65c4.79-3.7 11.77-5.55 19-5.55 12.93 0 20.41 6.19 20.41 19.08zm-10.51 12.28v-5.17h-10.84c-7.14 0-9.08 2.69-9.08 6 0 3.78 3.2 6.22 8.58 6.22 5.12-.08 9.58-2.43 11.34-7.05z"/><path d="m352.07 63.48v25.72h-10.51v-24.37c0-8-3.95-11.86-10.68-11.86-7.48 0-12.52 4.54-12.52 13.54v22.69h-10.51v-44.88h10v5.8c3.45-4.12 8.92-6.31 15.47-6.31 10.76 0 18.75 6.19 18.75 19.67z"/><path d="m383.75 70-7.82 7.4v11.8h-10.51v-62.37h10.51v37.66l21.77-20.17h12.61l-18.75 18.83 20.51 26.05h-12.77z"/></g><g fill="#090e11"><path d="m473.93 89.2-.08-39-19.34 32.28h-4.87l-19.33-31.78v38.5h-10.43v-58.84h9l23.36 39 22.95-39h9l.08 58.84z"/><path d="m536.71 62.89v26.31h-9.92v-5.46c-2.52 3.87-7.4 6.05-14.12 6.05-10.25 0-16.73-5.63-16.73-13.45 0-7.48 5.06-13.34 18.66-13.34h11.6v-.7c0-6.13-3.7-9.75-11.18-9.75-5 0-10.25 1.68-13.61 4.46l-4.12-7.65c4.79-3.7 11.77-5.55 19-5.55 12.94 0 20.42 6.19 20.42 19.08zm-10.51 12.28v-5.17h-10.84c-7.15 0-9.08 2.69-9.08 6 0 3.78 3.2 6.22 8.58 6.22 5.14-.08 9.58-2.43 11.34-7.05z"/><path d="m577.13 86.76c-2.52 2-6.3 3-10.08 3-9.84 0-15.47-5.21-15.47-15.13v-21.57h-7.4v-8.41h7.4v-10.25h10.51v10.25h12v8.41h-12v21.35c0 4.37 2.18 6.72 6.22 6.72a9.38 9.38 0 0 0 5.88-1.85z"/><path d="m630 63.48v25.72h-10.51v-24.37c0-8-4-11.86-10.67-11.86-7.48 0-12.53 4.54-12.53 13.54v22.69h-10.5v-62.37h10.5v22.7c3.45-3.7 8.75-5.72 15-5.72 10.71 0 18.71 6.19 18.71 19.67z"/><path d="m165.97 52.31-27.36 1.23 4.82 7.55-45.63 29.16-45.25-19.01-52.55 21.89 3.64 8.75 48.89-20.37 46.18 19.4 49.82-31.84 4.83 7.55z"/></g><path d="m19.43 80.31 33.11-13.8 1.62.68v-19.61h-34.73zm75.76-80.31v84.43l2.61 1.1 32.12-20.53v-65zm-37.88 68.52 34.69 14.58v-59.31h-34.69z" fill="#636eb9"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="20" class="rank-math-icon"><g fill="#fff"><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"/><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"/></g></svg>

After

Width:  |  Height:  |  Size: 449 B

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<svg opacity=".7" style="margin-bottom:-7px;width:24px" viewBox="0 0 50 50" xmlns="http://www.w3.org/2000/svg"><path d="m17 2a1.0001 1.0001 0 0 0-0.11133 0.0058594c-2.6982 0.060284-4.8887 2.2822-4.8887 4.9941 0 2.6994 1.9427 5 4.375 5 0.60058 0 1.1422-0.094264 1.625-0.26562v26.266h-1a1.0001 1.0001 0 1 0 0 2c0.55454 0 1 0.44546 1 1s-0.44546 1-1 1h-1a1.0001 1.0001 0 0 0-1 1v4a1.0001 1.0001 0 0 0 1 1h18a1.0001 1.0001 0 0 0 1-1v-4a1.0001 1.0001 0 0 0-1-1h-1c-0.55454 0-1-0.44546-1-1s0.44546-1 1-1a1.0001 1.0001 0 0 0 0.099609-0.003906 1.0001 1.0001 0 0 0-0.099609-1.9961h-1v-26.266c0.48282 0.17136 1.0244 0.26562 1.625 0.26562 2.4323 0 4.375-2.3006 4.375-5 0-2.7153-2.1957-4.939-4.8984-4.9941a1.0001 1.0001 0 0 0-0.10156-0.0058594h-16zm0 2c2.7341 0 4.9319 2.1644 4.9941 4.8828a1.0001 1.0001 0 0 0 0.29492 0.83398 1.0001 1.0001 0 0 0 0.00586 0.0058593 1.0001 1.0001 0 0 0 0.013672 0.013672 1.0001 1.0001 0 0 0 0.84961 0.26367h3.6738a1.0001 1.0001 0 0 0 0.88867-0.29297 1.0001 1.0001 0 0 0 0.001953-0.0019531 1.0001 1.0001 0 0 0 0.00586-0.0058593 1.0001 1.0001 0 0 0 0.007812-0.0078126 1.0001 1.0001 0 0 0 0.26953-0.81641c0.066301-2.7147 2.2627-4.875 4.9941-4.875 1.6685 0 3 1.3315 3 3 0 1.7186-1.3073 3-2.375 3-0.74136 0-1.1462-0.18-1.3477-0.34961-0.20142-0.16961-0.27734-0.34314-0.27734-0.65039 0-0.51089 0.11963-0.67733 0.24805-0.79102 0.12842-0.11369 0.36929-0.20898 0.75195-0.20898a1.0001 1.0001 0 1 0 0-2c-0.72233 0-1.4828 0.18583-2.0781 0.71289s-0.92188 1.361-0.92188 2.2871v29h-10v-29c0-0.92646-0.32831-1.762-0.92383-2.2891s-1.3541-0.71094-2.0762-0.71094a1.0001 1.0001 0 1 0 0 2c0.38297 0 0.62372 0.095499 0.75195 0.20898 0.12824 0.11349 0.24805 0.27948 0.24805 0.79102 0 0.30725-0.07592 0.48078-0.27734 0.65039-0.20142 0.16961-0.6063 0.34961-1.3477 0.34961-1.0677 0-2.375-1.2814-2.375-3 0-1.6685 1.3315-3 3-3zm4.8848 0h6.2305c-1.0756 1.0512-1.8102 2.4444-2.0352 4h-2.1602c-0.22495-1.5556-0.95952-2.9488-2.0352-4zm1.0996 7.9863a1.0001 1.0001 0 0 0-0.98438 1.0137v22a1.0001 1.0001 0 1 0 2 0v-22a1.0001 1.0001 0 0 0-1.0156-1.0137zm4 0a1.0001 1.0001 0 0 0-0.98438 1.0137v22a1.0001 1.0001 0 1 0 2 0v-22a1.0001 1.0001 0 0 0-1.0156-1.0137zm-7.1719 28.014h10.375c-0.11353 0.31492-0.1875 0.64805-0.1875 1a1.0001 1.0001 0 0 0 0.29492 0.70898c0.027814 0.099682 0.066038 0.19467 0.10156 0.29102h-10.793c0.035524-0.096344 0.073748-0.19133 0.10156-0.29102a1.0001 1.0001 0 0 0 0.29492-0.70898c0-0.35195-0.07397-0.68508-0.1875-1zm-2.8125 4h16v2h-16v-2z" style="block-progression:tb;isolation:auto;mix-blend-mode:normal;text-decoration-color:#000;text-decoration-line:none;text-decoration-style:solid;text-indent:0;text-transform:none"></path></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
!function(){"use strict";var t={n:function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,{a:n}),n},d:function(e,n){for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}},e=jQuery,n=t.n(e),r=lodash;function i(t){return i="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},i(t)}function o(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,u(r.key),r)}}function u(t){var e=function(t,e){if("object"!==i(t)||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!==i(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"===i(e)?e:String(e)}var a=function(){function t(){var e,r,i;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),e=this,i=function(t){return n()(this.fields).each((function(e,r){t+=n()(r).val()})),t},(r=u(r="getContent"))in e?Object.defineProperty(e,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[r]=i,this.init(),this.hooks(),this.events()}var e,i,a;return e=t,(i=[{key:"init",value:function(){this.fields=this.getFields(),this.getContent=this.getContent.bind(this)}},{key:"hooks",value:function(){wp.hooks.addFilter("rank_math_content","rank-math",this.getContent,11)}},{key:"events",value:function(){n()(this.fields).each((function(t,e){n()(e).on("keyup change",(0,r.debounce)((function(){rankMathEditor.refresh("content")}),500))}))}},{key:"getFields",value:function(){var t=[];return n()("#the-list > tr:visible").each((function(e,r){var i=n()("#"+r.id+"-key").val();-1!==n().inArray(i,rankMath.analyzeFields)&&t.push("#"+r.id+"-value")})),t}}])&&o(e.prototype,i),a&&o(e,a),Object.defineProperty(e,"prototype",{writable:!1}),t}();n()((function(){setTimeout((function(){new a}),500)}))}();
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
!function(){"use strict";var t={n:function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,{a:n}),n},d:function(e,n){for(var r in n)t.o(n,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:n[r]})},o:function(t,e){return Object.prototype.hasOwnProperty.call(t,e)}},e=jQuery,n=t.n(e),r=lodash,i=wp.hooks;function o(t){return o="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},o(t)}function a(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,u(r.key),r)}}function u(t){var e=function(t,e){if("object"!==o(t)||null===t)return t;var n=t[Symbol.toPrimitive];if(void 0!==n){var r=n.call(t,e||"default");if("object"!==o(r))return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(t)}(t,"string");return"symbol"===o(e)?e:String(e)}new(function(){function t(){var e,n,r;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),e=this,r=[],(n=u(n="fields"))in e?Object.defineProperty(e,n,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[n]=r,(0,i.addAction)("rank_math_loaded","rank-math",this.init.bind(this))}var e,o,l;return e=t,(o=[{key:"init",value:function(){this.getFields(),this.events()}},{key:"getFields",value:function(){var t=this;n()("#the-list > tr:visible").each((function(e,r){var i=n()("#"+r.id+"-key").val();-1!==n().inArray(i,rankMath.analyzeFields)&&t.fields.push("#"+r.id+"-value")}))}},{key:"events",value:function(){(0,i.addFilter)("rank_math_content","rank-math",this.getContent.bind(this)),n()(this.fields).each((function(t,e){n()(e).on("keyup change",(0,r.debounce)((function(){rankMathEditor.refresh("content")}),500))}))}},{key:"getContent",value:function(t){return n()(this.fields).each((function(e,r){t+=n()(r).val()})),t}}])&&a(e.prototype,o),l&&a(e,l),Object.defineProperty(e,"prototype",{writable:!1}),t}())}();
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: rank-math-contact-info.css
*/:root{--rankmath-wp-adminbar-height: 0}.rank-math-contact-section{clear:left;margin:1rem 0}.rank-math-contact-section label{font-weight:bold}.rank-math-contact-hours-details .rank-math-opening-hours{margin-bottom:6px}.rank-math-contact-hours-details .rank-math-opening-hours:last-child{margin-bottom:0}.rank-math-contact-hours .rank-math-opening-days,.rank-math-contact-hours .rank-math-opening-time{display:block}.rank-math-phone-number{margin:6px 0}.rank-math-contact-map iframe{width:100%;height:300px;border:0}.clear{clear:both}
@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: rank-math-seo-score.css
*/:root{--rankmath-wp-adminbar-height: 0}.rank-math-seo-score{font-family:sans-serif;position:relative;display:inline-block;height:96px;width:96px;margin:20px 20px 30px;text-align:center;color:#fff;border:none;border-radius:50%;background:#eee;-webkit-box-shadow:1px 1px 1px #bbb;box-shadow:1px 1px 1px #bbb}.rank-math-seo-score.before-content{margin:0 0 30px 20px;float:right}.rank-math-seo-score.after-content{margin:20px 0 30px 20px}.rank-math-seo-score.as-shortcode{display:inline-block}.rank-math-seo-score .label{font-size:12px;position:absolute;top:100px;left:0;display:block;width:100%;color:#979ea5}.rank-math-seo-score .score{font-size:42px;font-weight:bold;line-height:42px;display:block}.rank-math-seo-score .outof{font-size:12px;font-weight:normal;line-height:12px;display:block;color:rgba(255,255,255,0.7)}.rank-math-seo-score .backlink{font-size:12px;position:absolute;top:-94px;left:-12px;display:block;visibility:hidden;width:120px;padding:8px 10px;-webkit-transition:.25s all ease;transition:.25s all ease;-webkit-transition-delay:.25s;transition-delay:.25s;opacity:0;color:#a8a8a8;border:none;border-radius:8px;background:#fff;-webkit-box-shadow:0 4px 12px rgba(60,60,90,0.15);box-shadow:0 4px 12px rgba(60,60,90,0.15)}.rank-math-seo-score .backlink:after{position:absolute;bottom:-8px;left:calc(50% - 7px);width:0;height:0;content:'';border-width:8px 7.5px 0 7.5px;border-style:solid;border-color:#fff transparent transparent transparent}.rank-math-seo-score:hover .backlink{top:-74px;visibility:visible;opacity:1}.rank-math-seo-score .poweredby{font-size:13px;color:#a8a8a8}.rank-math-seo-score .poweredby a{display:block;font-weight:normal;text-decoration:none;color:#6372b6;border:none}.rank-math-seo-score.unknown-seo{background:#eee;background:linear-gradient(135deg, #b9b9b9 0%, #989898 100%);-webkit-box-shadow:1px 1px 1px #bbb;box-shadow:1px 1px 1px #bbb}.rank-math-seo-score.bad-seo{background:#f8b0a2;background:linear-gradient(135deg, #f8b0a2 0%, #f1938c 100%);-webkit-box-shadow:1px 1px 1px #e48982;box-shadow:1px 1px 1px #e48982;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#f8b0a2', endColorstr='#f1938c',GradientType=1 )}.rank-math-seo-score.good-seo{background:#fdd07a;background:linear-gradient(135deg, #fdd07a 0%, #fcbe6c 100%);-webkit-box-shadow:1px 1px 1px #efb463;box-shadow:1px 1px 1px #efb463;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#fdd07a', endColorstr='#fcbe6c',GradientType=1 )}.rank-math-seo-score.great-seo{background:#99d484;background:linear-gradient(135deg, #99d484 0%, #83c97f 100%);-webkit-box-shadow:1px 1px 1px #5ba857;box-shadow:1px 1px 1px #5ba857;filter:progid:DXImageTransform.Microsoft.gradient( startColorstr='#99d484', endColorstr='#83c97f',GradientType=1 )}.rank-math-seo-score.template-circle .score{margin-top:22px !important}.rank-math-seo-score.template-square{height:80px;width:110px;border-radius:12px}.rank-math-seo-score.template-square .score{margin:10px 12px;text-align:left}.rank-math-seo-score.template-square .outof{display:inline-block;margin-left:-8px}.rank-math-seo-score.template-square .label{font-size:13px;top:52px;left:14px;text-align:left;color:rgba(255,255,255,0.8)}.rank-math-seo-score.template-square .backlink{left:-5px}.rank-math-seo-score.template-square.before-content{margin-bottom:20px}.rank-math-seo-score.template-square.after-content{margin-bottom:0}.theme-twentytwenty .rank-math-seo-score{width:96px !important}.theme-twentytwenty .rank-math-seo-score.template-square{width:110px !important}.theme-twentytwenty .rank-math-seo-score.before-content{margin:0 auto 30px auto;display:inherit;float:none}.theme-twentytwenty .rank-math-seo-score.template-circle .score,.theme-twentytwenty .rank-math-seo-score.template-square .score{-webkit-transform:translateY(22px);transform:translateY(22px)}
@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: rank-math-review-snippet.css
*/:root{--rankmath-wp-adminbar-height: 0}#rank-math-rich-snippet-wrapper{overflow:hidden}#rank-math-rich-snippet-wrapper h5.rank-math-title{display:block;font-size:18px;line-height:1.4}#rank-math-rich-snippet-wrapper .rank-math-review-image{float:right;max-width:40%;margin-left:15px}#rank-math-rich-snippet-wrapper .rank-math-review-data{margin-bottom:15px}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper{width:100%;padding:0 0 20px 0;float:left;clear:both;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-total{border:0;display:block;margin:0;width:auto;float:left;text-align:left;padding:0;font-size:24px;line-height:1;font-weight:700;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star{float:left;margin-left:15px;margin-top:5px;position:relative;z-index:99;line-height:1}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star .rank-math-review-result-wrapper{display:inline-block;white-space:nowrap;position:relative;color:#e7e7e7}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star .rank-math-review-result-wrapper .rank-math-review-result{position:absolute;top:0;left:0;overflow:hidden;white-space:nowrap;color:#ffbe01}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star .rank-math-review-result-wrapper i{font-size:18px;-webkit-text-stroke-width:1px;font-style:normal;padding:0 2px;line-height:inherit}#rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star .rank-math-review-result-wrapper i:before{content:"\2605"}body.rtl #rank-math-rich-snippet-wrapper .rank-math-review-image{float:left;margin-left:0;margin-right:15px}body.rtl #rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-total{float:right}body.rtl #rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star{float:right;margin-left:0;margin-right:15px}body.rtl #rank-math-rich-snippet-wrapper .rank-math-total-wrapper .rank-math-review-star .rank-math-review-result{left:auto;right:0}@media screen and (max-width: 480px){#rank-math-rich-snippet-wrapper .rank-math-review-image{display:block;max-width:100%;width:100%;text-align:center;margin-right:0}#rank-math-rich-snippet-wrapper .rank-math-review-data{clear:both}}.clear{clear:both}
@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: rank-math.css
*/:root{--rankmath-wp-adminbar-height: 0}#wp-admin-bar-rank-math .rank-math-icon{display:inline-block;top:6px;position:relative;padding-right:10px;line-height:1}#wp-admin-bar-rank-math .rank-math-icon svg{fill-rule:evenodd;fill:#dedede;height:21px;vertical-align:inherit}#wp-admin-bar-rank-math:hover .rank-math-icon svg{fill-rule:evenodd;fill:#00b9eb}#wp-admin-bar-rank-math span.rm-mark-page-icon{font-family:dashicons;font-size:19px;line-height:28px;margin:0 3px 0 -4px}
@@ -0,0 +1,5 @@
/*!
* Plugin: Rank Math
* URL: https://rankmath.com/wordpress/plugin/seo-suite/
* Name: rank-math.css
*/:root{--rankmath-wp-adminbar-height:0}#wp-admin-bar-rank-math .rank-math-icon{display:inline-block;top:6px;position:relative;padding-right:10px;line-height:1}#wp-admin-bar-rank-math .rank-math-icon svg{fill-rule:evenodd;fill:#dedede;height:21px;vertical-align:inherit}#wp-admin-bar-rank-math:hover .rank-math-icon svg{fill-rule:evenodd;fill:#00b9eb}#wp-admin-bar-rank-math span.rm-mark-page-icon{font-family:dashicons;font-size:19px;line-height:28px;margin:0 3px 0 -4px}
@@ -0,0 +1 @@
!function(){"use strict";var n,t={n:function(n){var a=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(a,{a:a}),a},d:function(n,a){for(var e in a)t.o(a,e)&&!t.o(n,e)&&Object.defineProperty(n,e,{enumerable:!0,get:a[e]})},o:function(n,t){return Object.prototype.hasOwnProperty.call(n,t)}},a=jQuery;(n=t.n(a)())((function(){window.rankMathFront={init:function(){this.adminMenu()},adminMenu:function(){var t=n("#wp-admin-bar-rank-math-mark-me"),a=this;t.on("click",".mark-page-as a",(function(t){t.preventDefault(),a.ajax("mark_page_as",{objectID:rankMath.objectID,objectType:rankMath.objectType,what:n(this).attr("href").replace("#","")}),n(this).find(".dashicons").length?n(this).find(".dashicons").remove():n(this).prepend('<span class="dashicons dashicons-yes" style="font-family:dashicons;font-size:19px;line-height:28px;margin:0 3px 0 -4px;"></span>')}))},ajax:function(t,a,e){return n.ajax({url:rankMath.ajaxurl,type:e||"POST",dataType:"json",data:n.extend(!0,{action:"rank_math_"+t,security:rankMath.security},a)})}},window.rankMathFront.init()}))}();
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,460 @@
.date-picker {
width: 170px;
height: 25px;
padding: 0;
border: 0;
line-height: 25px;
padding-left: 10px;
font-size: 12px;
font-family: Arial, sans-serif;
font-weight: bold;
cursor: pointer;
color: #303030;
position: relative;
z-index: 2;
}
.date-picker-wrapper {
position: absolute;
z-index: 1;
border: 1px solid #bfbfbf;
background-color: #efefef;
padding: 5px 12px;
font-size: 12px;
line-height: 20px;
color: #aaa;
font-family: Arial, sans-serif;
-webkit-box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.5);
-webkit-box-sizing: initial;
box-sizing: initial;
}
.dp-clearfix {
clear: both;
height: 0;
font-size: 0;
}
.date-picker-wrapper.inline-wrapper {
position: relative;
-webkit-box-shadow: none;
box-shadow: none;
display: inline-block;
}
.date-picker-wrapper.single-date {
width: auto;
}
.date-picker-wrapper.no-shortcuts {
padding-bottom: 12px;
}
.date-picker-wrapper.no-topbar {
padding-top: 12px;
}
.date-picker-wrapper .footer {
font-size: 11px;
padding-top: 3px;
}
.date-picker-wrapper b {
color: #666;
font-weight: 700;
}
.date-picker-wrapper a {
color: #6bb4d6;
text-decoration: underline;
}
.date-picker-wrapper .month-name {
text-transform: uppercase;
}
.date-picker-wrapper .select-wrapper {
position: relative;
overflow: hidden;
display: inline-block;
vertical-align: middle;
}
.date-picker-wrapper .select-wrapper:hover {
text-decoration: underline;
}
.date-picker-wrapper .month-element {
display: inline-block;
vertical-align: middle;
}
.date-picker-wrapper .select-wrapper select {
position: absolute;
margin: 0;
padding: 0;
left: 0;
top: -1px;
font-size: inherit;
font-style: inherit;
font-weight: inherit;
text-transform: inherit;
color: inherit;
cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: 0;
outline: 0;
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=1)";
filter: alpha(opacity=1);
opacity: 0.01;
}
.date-picker-wrapper .month-wrapper {
border: 1px solid #bfbfbf;
border-radius: 3px;
background-color: #fff;
padding: 5px;
cursor: default;
position: relative;
_overflow: hidden;
}
.date-picker-wrapper .month-wrapper table {
width: 190px;
float: left;
}
.date-picker-wrapper .month-wrapper table.month2 {
width: 190px;
float: left;
}
.date-picker-wrapper .month-wrapper table th, .date-picker-wrapper .month-wrapper table td {
vertical-align: middle;
text-align: center;
line-height: 14px;
margin: 0px;
padding: 0px;
}
.date-picker-wrapper .month-wrapper table .day {
padding: 5px 0;
line-height: 1;
font-size: 12px;
margin-bottom: 1px;
color: #ccc;
cursor: default;
}
.date-picker-wrapper .month-wrapper table div.day.lastMonth, .date-picker-wrapper .month-wrapper table div.day.nextMonth {
color: #999;
cursor: default;
}
.date-picker-wrapper .month-wrapper table .day.checked {
background-color: #9cdbf7;
}
.date-picker-wrapper .month-wrapper table .week-name {
height: 20px;
line-height: 20px;
font-weight: 100;
text-transform: uppercase;
}
.date-picker-wrapper .month-wrapper table .day.has-tooltip {
cursor: help !important;
}
.date-picker-wrapper .month-wrapper table .day.has-tooltip .tooltip {
white-space: nowrap;
}
.date-picker-wrapper .time label {
white-space: nowrap;
}
.date-picker-wrapper .month-wrapper table .day.toMonth.valid {
color: #333;
cursor: pointer;
}
.date-picker-wrapper .month-wrapper table .day.toMonth.hovering {
background-color: #cdecfa;
}
.date-picker-wrapper .month-wrapper table .day.nextMonth, .date-picker-wrapper .month-wrapper table .day.lastMonth {
display: none;
}
.date-picker-wrapper .month-wrapper table .day.real-today {
background-color: #ffe684;
}
.date-picker-wrapper .month-wrapper table .day.real-today.checked, .date-picker-wrapper .month-wrapper table .day.real-today.hovering {
background-color: #70ccd5;
}
.date-picker-wrapper table .caption {
height: 40px;
}
.date-picker-wrapper table .caption > th:first-of-type, .date-picker-wrapper table .caption > th:last-of-type {
width: 27px;
}
.date-picker-wrapper table .caption .next, .date-picker-wrapper table .caption .prev {
padding: 0 5px;
cursor: pointer;
}
.date-picker-wrapper table .caption .next:hover, .date-picker-wrapper table .caption .prev:hover {
background-color: #ccc;
color: white;
}
.date-picker-wrapper .gap {
position: relative;
z-index: 1;
width: 15px;
height: 100%;
background-color: red;
font-size: 0;
line-height: 0;
float: left;
top: -5px;
margin: 0 10px -10px;
visibility: hidden;
height: 0;
}
.date-picker-wrapper .gap .gap-lines {
height: 100%;
overflow: hidden;
}
.date-picker-wrapper .gap .gap-line {
height: 15px;
width: 15px;
position: relative;
}
.date-picker-wrapper .gap .gap-line .gap-1 {
z-index: 1;
height: 0;
border-left: 8px solid white;
border-top: 8px solid #eee;
border-bottom: 8px solid #eee;
}
.date-picker-wrapper .gap .gap-line .gap-2 {
position: absolute;
right: 0;
top: 0px;
z-index: 2;
height: 0;
border-left: 8px solid transparent;
border-top: 8px solid white;
}
.date-picker-wrapper .gap .gap-line .gap-3 {
position: absolute;
right: 0;
top: 8px;
z-index: 2;
height: 0;
border-left: 8px solid transparent;
border-bottom: 8px solid white;
}
.date-picker-wrapper .gap .gap-top-mask {
width: 6px;
height: 1px;
position: absolute;
top: -1px;
left: 1px;
background-color: #eee;
z-index: 3;
}
.date-picker-wrapper .gap .gap-bottom-mask {
width: 6px;
height: 1px;
position: absolute;
bottom: -1px;
left: 7px;
background-color: #eee;
z-index: 3;
}
.date-picker-wrapper .selected-days {
display: none;
}
.date-picker-wrapper .drp_top-bar {
line-height: 1.4;
position: relative;
padding: 10px 40px 10px 0;
}
.date-picker-wrapper .drp_top-bar .error-top, .date-picker-wrapper .drp_top-bar .normal-top {
display: none;
}
.date-picker-wrapper .drp_top-bar .default-top {
display: block;
}
.date-picker-wrapper .drp_top-bar.error .default-top {
display: none;
}
.date-picker-wrapper .drp_top-bar.error .error-top {
display: block;
color: red;
}
.date-picker-wrapper .drp_top-bar.normal .default-top {
display: none;
}
.date-picker-wrapper .drp_top-bar.normal .normal-top {
display: block;
}
.date-picker-wrapper .drp_top-bar.normal .normal-top .selection-top {
color: #333;
}
.date-picker-wrapper .drp_top-bar .apply-btn {
position: absolute;
right: 0px;
top: 6px;
padding: 3px 5px;
margin: 0;
font-size: 12px;
border-radius: 4px;
cursor: pointer;
color: #d9eef7;
border: solid 1px #0076a3;
background: #0095cd;
background: -moz-linear-gradient(top, #00adee, #0078a5);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00adee', endColorstr='#0078a5');
color: white;
line-height: initial;
}
.date-picker-wrapper .drp_top-bar .apply-btn.disabled {
cursor: pointer;
color: #606060;
border: solid 1px #b7b7b7;
background: #fff;
background: -moz-linear-gradient(top, #fff, #ededed);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#ededed');
}
.date-picker-wrapper .time {
position: relative;
}
.date-picker-wrapper.single-month .time {
display: block;
}
.date-picker-wrapper .time input[type=range] {
vertical-align: middle;
width: 129px;
padding: 0;
margin: 0;
height: 20px;
}
.date-picker-wrapper .time1 {
width: 180px;
padding: 0 5px;
text-align: center;
}
/*time styling*/
.time2 {
width: 180px;
padding: 0 5px;
text-align: center;
}
.date-picker-wrapper .time1 {
float: left;
}
.date-picker-wrapper .time2 {
float: right;
}
.date-picker-wrapper .hour {
text-align: right;
}
.minute {
text-align: right;
}
.date-picker-wrapper .hide {
display: none;
}
.date-picker-wrapper .first-date-selected, .date-picker-wrapper .last-date-selected {
background-color: #49e !important;
color: white !important;
}
.date-picker-wrapper .date-range-length-tip {
position: absolute;
margin-top: -4px;
margin-left: -8px;
-webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
display: none;
background-color: yellow;
padding: 0 6px;
border-radius: 2px;
font-size: 12px;
line-height: 16px;
-webkit-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-moz-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-ms-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
-o-filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
filter: drop-shadow(0 0 3px rgba(0, 0, 0, 0.3));
}
.date-picker-wrapper .date-range-length-tip:after {
content: '';
position: absolute;
border-left: 4px solid transparent;
border-right: 4px solid transparent;
border-top: 4px solid yellow;
left: 50%;
margin-left: -4px;
bottom: -4px;
}
.date-picker-wrapper.two-months.no-gap .month1 .next, .date-picker-wrapper.two-months.no-gap .month2 .prev {
display: none;
}
.date-picker-wrapper .week-number {
padding: 5px 0;
line-height: 1;
font-size: 12px;
margin-bottom: 1px;
color: #999;
cursor: pointer;
}
.date-picker-wrapper .week-number.week-number-selected {
color: #49e;
font-weight: bold;
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
<?php
/**
* Credit (https://www.russianlessons.net/lessons/lesson1_alphabet.php)
*/
return['A'=> '[\u0410\u0430]', 'B'=> '[\u0411\u0431]', 'V'=> '[\u0412\u0432]', 'G'=> '[\u0413\u0433]', 'D'=> '[\u0414\u0434]', 'YE'=> '[\u0415\u0435]', 'YO'=> '[\u0401\u0451]', 'ZH'=> '[\u0416\u0436]', 'Z'=> '[\u0417\u0437]', 'EE'=> '[\u0418\u0438]', 'YI'=> '[\u0419\u0439]', 'K'=> '[\u041A\u043A]', 'L'=> '[\u041B\u043B]', 'M'=> '[\u041C\u043c]', 'P'=> '[\u041F\u043F]', 'T'=> '[\u0422\u0442]', 'U'=> '[\u0423\u0443]', 'F'=> '[\u0424\u0444]', 'H'=> '[\u0425\u0445]', 'TS'=> '[\u0426\u0446]', 'CH'=> '[\u0427\u0447]', 'SH'=> '[\u0428\u0448\u0429\u0449]', 'I'=> '[\u042B\u044B]', 'E'=> '[\u042D\u044D]', 'YU'=> '[\u042E\u044E]', 'YA'=> '[\u042F\u044F]', 'N'=> '[\u041D\u043D]'];
@@ -0,0 +1 @@
this.wp=this.wp||{},this.wp.hooks=function(n){var r={};function e(t){if(r[t])return r[t].exports;var o=r[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}return e.m=n,e.c=r,e.d=function(n,r,t){e.o(n,r)||Object.defineProperty(n,r,{enumerable:!0,get:t})},e.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},e.t=function(n,r){if(1&r&&(n=e(n)),8&r)return n;if(4&r&&"object"==typeof n&&n&&n.__esModule)return n;var t=Object.create(null);if(e.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:n}),2&r&&"string"!=typeof n)for(var o in n)e.d(t,o,function(r){return n[r]}.bind(null,o));return t},e.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(r,"a",r),r},e.o=function(n,r){return Object.prototype.hasOwnProperty.call(n,r)},e.p="",e(e.s=366)}({366:function(n,r,e){"use strict";e.r(r);var t=function(n){return"string"!=typeof n||""===n?(console.error("The namespace must be a non-empty string."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.\-\/]*$/.test(n)||(console.error("The namespace can only contain numbers, letters, dashes, periods, underscores and slashes."),!1)};var o=function(n){return"string"!=typeof n||""===n?(console.error("The hook name must be a non-empty string."),!1):/^__/.test(n)?(console.error("The hook name cannot begin with `__`."),!1):!!/^[a-zA-Z][a-zA-Z0-9_.-]*$/.test(n)||(console.error("The hook name can only contain numbers, letters, dashes, periods and underscores."),!1)};var i=function(n){return function(r,e,i){var u=arguments.length>3&&void 0!==arguments[3]?arguments[3]:10;if(o(r)&&t(e))if("function"==typeof i)if("number"==typeof u){var c={callback:i,priority:u,namespace:e};if(n[r]){var l,a=n[r].handlers;for(l=a.length;l>0&&!(u>=a[l-1].priority);l--);l===a.length?a[l]=c:a.splice(l,0,c),(n.__current||[]).forEach(function(n){n.name===r&&n.currentIndex>=l&&n.currentIndex++})}else n[r]={handlers:[c],runs:0};"hookAdded"!==r&&F("hookAdded",r,e,i,u)}else console.error("If specified, the hook priority must be a number.");else console.error("The hook callback must be a function.")}};var u=function(n,r){return function(e,i){if(o(e)&&(r||t(i))){if(!n[e])return 0;var u=0;if(r)u=n[e].handlers.length,n[e]={runs:n[e].runs,handlers:[]};else for(var c=n[e].handlers,l=function(r){c[r].namespace===i&&(c.splice(r,1),u++,(n.__current||[]).forEach(function(n){n.name===e&&n.currentIndex>=r&&n.currentIndex--}))},a=c.length-1;a>=0;a--)l(a);return"hookRemoved"!==e&&F("hookRemoved",e,i),u}}};var c=function(n){return function(r){return r in n}};var l=function(n,r){return function(e){n[e]||(n[e]={handlers:[],runs:0}),n[e].runs++;for(var t=n[e].handlers,o=arguments.length,i=new Array(o>1?o-1:0),u=1;u<o;u++)i[u-1]=arguments[u];if(!t||!t.length)return r?i[0]:void 0;var c={name:e,currentIndex:0};for(n.__current.push(c);c.currentIndex<t.length;){var l=t[c.currentIndex].callback.apply(null,i);r&&(i[0]=l),c.currentIndex++}return n.__current.pop(),r?i[0]:void 0}};var a=function(n){return function(){return n.__current&&n.__current.length?n.__current[n.__current.length-1].name:null}};var d=function(n){return function(r){return void 0===r?void 0!==n.__current[0]:!!n.__current[0]&&r===n.__current[0].name}};var s=function(n){return function(r){if(o(r))return n[r]&&n[r].runs?n[r].runs:0}};var f=function(){var n=Object.create(null),r=Object.create(null);return n.__current=[],r.__current=[],{addAction:i(n),addFilter:i(r),removeAction:u(n),removeFilter:u(r),hasAction:c(n),hasFilter:c(r),removeAllActions:u(n,!0),removeAllFilters:u(r,!0),doAction:l(n),applyFilters:l(r,!0),currentAction:a(n),currentFilter:a(r),doingAction:d(n),doingFilter:d(r),didAction:s(n),didFilter:s(r),actions:n,filters:r}};e.d(r,"addAction",function(){return p}),e.d(r,"addFilter",function(){return v}),e.d(r,"removeAction",function(){return m}),e.d(r,"removeFilter",function(){return _}),e.d(r,"hasAction",function(){return A}),e.d(r,"hasFilter",function(){return y}),e.d(r,"removeAllActions",function(){return b}),e.d(r,"removeAllFilters",function(){return g}),e.d(r,"doAction",function(){return F}),e.d(r,"applyFilters",function(){return k}),e.d(r,"currentAction",function(){return x}),e.d(r,"currentFilter",function(){return j}),e.d(r,"doingAction",function(){return I}),e.d(r,"doingFilter",function(){return O}),e.d(r,"didAction",function(){return T}),e.d(r,"didFilter",function(){return w}),e.d(r,"actions",function(){return P}),e.d(r,"filters",function(){return S}),e.d(r,"createHooks",function(){return f});var h=f(),p=h.addAction,v=h.addFilter,m=h.removeAction,_=h.removeFilter,A=h.hasAction,y=h.hasFilter,b=h.removeAllActions,g=h.removeAllFilters,F=h.doAction,k=h.applyFilters,x=h.currentAction,j=h.currentFilter,I=h.doingAction,O=h.doingFilter,T=h.didAction,w=h.didFilter,P=h.actions,S=h.filters}});
File diff suppressed because one or more lines are too long
@@ -0,0 +1,137 @@
/**
* @license
* Lodash lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
*/
;(function(){function n(n,t,r){switch(r.length){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function t(n,t,r,e){for(var u=-1,i=null==n?0:n.length;++u<i;){var o=n[u];t(e,o,r(o),n)}return e}function r(n,t){for(var r=-1,e=null==n?0:n.length;++r<e&&false!==t(n[r],r,n););return n}function e(n,t){for(var r=null==n?0:n.length;r--&&false!==t(n[r],r,n););return n}function u(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(!t(n[r],r,n))return false;
return true}function i(n,t){for(var r=-1,e=null==n?0:n.length,u=0,i=[];++r<e;){var o=n[r];t(o,r,n)&&(i[u++]=o)}return i}function o(n,t){return!(null==n||!n.length)&&-1<v(n,t,0)}function f(n,t,r){for(var e=-1,u=null==n?0:n.length;++e<u;)if(r(t,n[e]))return true;return false}function c(n,t){for(var r=-1,e=null==n?0:n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function a(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function l(n,t,r,e){var u=-1,i=null==n?0:n.length;for(e&&i&&(r=n[++u]);++u<i;)r=t(r,n[u],u,n);
return r}function s(n,t,r,e){var u=null==n?0:n.length;for(e&&u&&(r=n[--u]);u--;)r=t(r,n[u],u,n);return r}function h(n,t){for(var r=-1,e=null==n?0:n.length;++r<e;)if(t(n[r],r,n))return true;return false}function p(n,t,r){var e;return r(n,function(n,r,u){if(t(n,r,u))return e=r,false}),e}function _(n,t,r,e){var u=n.length;for(r+=e?1:-1;e?r--:++r<u;)if(t(n[r],r,n))return r;return-1}function v(n,t,r){if(t===t)n:{--r;for(var e=n.length;++r<e;)if(n[r]===t){n=r;break n}n=-1}else n=_(n,d,r);return n}function g(n,t,r,e){
--r;for(var u=n.length;++r<u;)if(e(n[r],t))return r;return-1}function d(n){return n!==n}function y(n,t){var r=null==n?0:n.length;return r?m(n,t)/r:F}function b(n){return function(t){return null==t?T:t[n]}}function x(n){return function(t){return null==n?T:n[t]}}function j(n,t,r,e,u){return u(n,function(n,u,i){r=e?(e=false,n):t(r,n,u,i)}),r}function w(n,t){var r=n.length;for(n.sort(t);r--;)n[r]=n[r].c;return n}function m(n,t){for(var r,e=-1,u=n.length;++e<u;){var i=t(n[e]);i!==T&&(r=r===T?i:r+i)}return r;
}function A(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function E(n,t){return c(t,function(t){return[t,n[t]]})}function k(n){return function(t){return n(t)}}function S(n,t){return c(t,function(t){return n[t]})}function O(n,t){return n.has(t)}function I(n,t){for(var r=-1,e=n.length;++r<e&&-1<v(t,n[r],0););return r}function R(n,t){for(var r=n.length;r--&&-1<v(t,n[r],0););return r}function z(n){return"\\"+Un[n]}function W(n){var t=-1,r=Array(n.size);return n.forEach(function(n,e){r[++t]=[e,n];
}),r}function B(n,t){return function(r){return n(t(r))}}function L(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){var o=n[r];o!==t&&"__lodash_placeholder__"!==o||(n[r]="__lodash_placeholder__",i[u++]=r)}return i}function U(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=n}),r}function C(n){var t=-1,r=Array(n.size);return n.forEach(function(n){r[++t]=[n,n]}),r}function D(n){if(Rn.test(n)){for(var t=On.lastIndex=0;On.test(n);)++t;n=t}else n=Qn(n);return n}function M(n){return Rn.test(n)?n.match(On)||[]:n.split("");
}var T,$=1/0,F=NaN,N=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]],P=/\b__p\+='';/g,Z=/\b(__p\+=)''\+/g,q=/(__e\(.*?\)|\b__t\))\+'';/g,V=/&(?:amp|lt|gt|quot|#39);/g,K=/[&<>"']/g,G=RegExp(V.source),H=RegExp(K.source),J=/<%-([\s\S]+?)%>/g,Y=/<%([\s\S]+?)%>/g,Q=/<%=([\s\S]+?)%>/g,X=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,nn=/^\w*$/,tn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,rn=/[\\^$.*+?()[\]{}|]/g,en=RegExp(rn.source),un=/^\s+|\s+$/g,on=/^\s+/,fn=/\s+$/,cn=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,an=/\{\n\/\* \[wrapped with (.+)\] \*/,ln=/,? & /,sn=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,hn=/\\(\\)?/g,pn=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,_n=/\w*$/,vn=/^[-+]0x[0-9a-f]+$/i,gn=/^0b[01]+$/i,dn=/^\[object .+?Constructor\]$/,yn=/^0o[0-7]+$/i,bn=/^(?:0|[1-9]\d*)$/,xn=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,jn=/($^)/,wn=/['\n\r\u2028\u2029\\]/g,mn="[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?(?:\\u200d(?:[^\\ud800-\\udfff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])[\\ufe0e\\ufe0f]?(?:[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|\\ud83c[\\udffb-\\udfff])?)*",An="(?:[\\u2700-\\u27bf]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff])"+mn,En="(?:[^\\ud800-\\udfff][\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]?|[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]|(?:\\ud83c[\\udde6-\\uddff]){2}|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff])",kn=RegExp("['\u2019]","g"),Sn=RegExp("[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]","g"),On=RegExp("\\ud83c[\\udffb-\\udfff](?=\\ud83c[\\udffb-\\udfff])|"+En+mn,"g"),In=RegExp(["[A-Z\\xc0-\\xd6\\xd8-\\xde]?[a-z\\xdf-\\xf6\\xf8-\\xff]+(?:['\u2019](?:d|ll|m|re|s|t|ve))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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]|[A-Z\\xc0-\\xd6\\xd8-\\xde]|$)|(?:[A-Z\\xc0-\\xd6\\xd8-\\xde]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?(?=[\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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]|[A-Z\\xc0-\\xd6\\xd8-\\xde](?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])|$)|[A-Z\\xc0-\\xd6\\xd8-\\xde]?(?:[a-z\\xdf-\\xf6\\xf8-\\xff]|[^\\ud800-\\udfff\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\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\\d+\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde])+(?:['\u2019](?:d|ll|m|re|s|t|ve))?|[A-Z\\xc0-\\xd6\\xd8-\\xde]+(?:['\u2019](?:D|LL|M|RE|S|T|VE))?|\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])|\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])|\\d+",An].join("|"),"g"),Rn=RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]"),zn=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,Wn="Array Buffer DataView Date Error Float32Array Float64Array Function Int8Array Int16Array Int32Array Map Math Object Promise RegExp Set String Symbol TypeError Uint8Array Uint8ClampedArray Uint16Array Uint32Array WeakMap _ clearTimeout isFinite parseInt setTimeout".split(" "),Bn={};
Bn["[object Float32Array]"]=Bn["[object Float64Array]"]=Bn["[object Int8Array]"]=Bn["[object Int16Array]"]=Bn["[object Int32Array]"]=Bn["[object Uint8Array]"]=Bn["[object Uint8ClampedArray]"]=Bn["[object Uint16Array]"]=Bn["[object Uint32Array]"]=true,Bn["[object Arguments]"]=Bn["[object Array]"]=Bn["[object ArrayBuffer]"]=Bn["[object Boolean]"]=Bn["[object DataView]"]=Bn["[object Date]"]=Bn["[object Error]"]=Bn["[object Function]"]=Bn["[object Map]"]=Bn["[object Number]"]=Bn["[object Object]"]=Bn["[object RegExp]"]=Bn["[object Set]"]=Bn["[object String]"]=Bn["[object WeakMap]"]=false;
var Ln={};Ln["[object Arguments]"]=Ln["[object Array]"]=Ln["[object ArrayBuffer]"]=Ln["[object DataView]"]=Ln["[object Boolean]"]=Ln["[object Date]"]=Ln["[object Float32Array]"]=Ln["[object Float64Array]"]=Ln["[object Int8Array]"]=Ln["[object Int16Array]"]=Ln["[object Int32Array]"]=Ln["[object Map]"]=Ln["[object Number]"]=Ln["[object Object]"]=Ln["[object RegExp]"]=Ln["[object Set]"]=Ln["[object String]"]=Ln["[object Symbol]"]=Ln["[object Uint8Array]"]=Ln["[object Uint8ClampedArray]"]=Ln["[object Uint16Array]"]=Ln["[object Uint32Array]"]=true,
Ln["[object Error]"]=Ln["[object Function]"]=Ln["[object WeakMap]"]=false;var Un={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Cn=parseFloat,Dn=parseInt,Mn=typeof global=="object"&&global&&global.Object===Object&&global,Tn=typeof self=="object"&&self&&self.Object===Object&&self,$n=Mn||Tn||Function("return this")(),Fn=typeof exports=="object"&&exports&&!exports.nodeType&&exports,Nn=Fn&&typeof module=="object"&&module&&!module.nodeType&&module,Pn=Nn&&Nn.exports===Fn,Zn=Pn&&Mn.process,qn=function(){
try{var n=Nn&&Nn.f&&Nn.f("util").types;return n?n:Zn&&Zn.binding&&Zn.binding("util")}catch(n){}}(),Vn=qn&&qn.isArrayBuffer,Kn=qn&&qn.isDate,Gn=qn&&qn.isMap,Hn=qn&&qn.isRegExp,Jn=qn&&qn.isSet,Yn=qn&&qn.isTypedArray,Qn=b("length"),Xn=x({"\xc0":"A","\xc1":"A","\xc2":"A","\xc3":"A","\xc4":"A","\xc5":"A","\xe0":"a","\xe1":"a","\xe2":"a","\xe3":"a","\xe4":"a","\xe5":"a","\xc7":"C","\xe7":"c","\xd0":"D","\xf0":"d","\xc8":"E","\xc9":"E","\xca":"E","\xcb":"E","\xe8":"e","\xe9":"e","\xea":"e","\xeb":"e","\xcc":"I",
"\xcd":"I","\xce":"I","\xcf":"I","\xec":"i","\xed":"i","\xee":"i","\xef":"i","\xd1":"N","\xf1":"n","\xd2":"O","\xd3":"O","\xd4":"O","\xd5":"O","\xd6":"O","\xd8":"O","\xf2":"o","\xf3":"o","\xf4":"o","\xf5":"o","\xf6":"o","\xf8":"o","\xd9":"U","\xda":"U","\xdb":"U","\xdc":"U","\xf9":"u","\xfa":"u","\xfb":"u","\xfc":"u","\xdd":"Y","\xfd":"y","\xff":"y","\xc6":"Ae","\xe6":"ae","\xde":"Th","\xfe":"th","\xdf":"ss","\u0100":"A","\u0102":"A","\u0104":"A","\u0101":"a","\u0103":"a","\u0105":"a","\u0106":"C",
"\u0108":"C","\u010a":"C","\u010c":"C","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\u010e":"D","\u0110":"D","\u010f":"d","\u0111":"d","\u0112":"E","\u0114":"E","\u0116":"E","\u0118":"E","\u011a":"E","\u0113":"e","\u0115":"e","\u0117":"e","\u0119":"e","\u011b":"e","\u011c":"G","\u011e":"G","\u0120":"G","\u0122":"G","\u011d":"g","\u011f":"g","\u0121":"g","\u0123":"g","\u0124":"H","\u0126":"H","\u0125":"h","\u0127":"h","\u0128":"I","\u012a":"I","\u012c":"I","\u012e":"I","\u0130":"I","\u0129":"i",
"\u012b":"i","\u012d":"i","\u012f":"i","\u0131":"i","\u0134":"J","\u0135":"j","\u0136":"K","\u0137":"k","\u0138":"k","\u0139":"L","\u013b":"L","\u013d":"L","\u013f":"L","\u0141":"L","\u013a":"l","\u013c":"l","\u013e":"l","\u0140":"l","\u0142":"l","\u0143":"N","\u0145":"N","\u0147":"N","\u014a":"N","\u0144":"n","\u0146":"n","\u0148":"n","\u014b":"n","\u014c":"O","\u014e":"O","\u0150":"O","\u014d":"o","\u014f":"o","\u0151":"o","\u0154":"R","\u0156":"R","\u0158":"R","\u0155":"r","\u0157":"r","\u0159":"r",
"\u015a":"S","\u015c":"S","\u015e":"S","\u0160":"S","\u015b":"s","\u015d":"s","\u015f":"s","\u0161":"s","\u0162":"T","\u0164":"T","\u0166":"T","\u0163":"t","\u0165":"t","\u0167":"t","\u0168":"U","\u016a":"U","\u016c":"U","\u016e":"U","\u0170":"U","\u0172":"U","\u0169":"u","\u016b":"u","\u016d":"u","\u016f":"u","\u0171":"u","\u0173":"u","\u0174":"W","\u0175":"w","\u0176":"Y","\u0177":"y","\u0178":"Y","\u0179":"Z","\u017b":"Z","\u017d":"Z","\u017a":"z","\u017c":"z","\u017e":"z","\u0132":"IJ","\u0133":"ij",
"\u0152":"Oe","\u0153":"oe","\u0149":"'n","\u017f":"s"}),nt=x({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}),tt=x({"&amp;":"&","&lt;":"<","&gt;":">","&quot;":'"',"&#39;":"'"}),rt=function x(mn){function An(n){if(yu(n)&&!ff(n)&&!(n instanceof Un)){if(n instanceof On)return n;if(oi.call(n,"__wrapped__"))return Fe(n)}return new On(n)}function En(){}function On(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=T}function Un(n){this.__wrapped__=n,
this.__actions__=[],this.__dir__=1,this.__filtered__=false,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}function Mn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Tn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Fn(n){var t=-1,r=null==n?0:n.length;for(this.clear();++t<r;){var e=n[t];this.set(e[0],e[1])}}function Nn(n){var t=-1,r=null==n?0:n.length;for(this.__data__=new Fn;++t<r;)this.add(n[t]);
}function Zn(n){this.size=(this.__data__=new Tn(n)).size}function qn(n,t){var r,e=ff(n),u=!e&&of(n),i=!e&&!u&&af(n),o=!e&&!u&&!i&&_f(n),u=(e=e||u||i||o)?A(n.length,ni):[],f=u.length;for(r in n)!t&&!oi.call(n,r)||e&&("length"==r||i&&("offset"==r||"parent"==r)||o&&("buffer"==r||"byteLength"==r||"byteOffset"==r)||Se(r,f))||u.push(r);return u}function Qn(n){var t=n.length;return t?n[ir(0,t-1)]:T}function et(n,t){return De(Ur(n),pt(t,0,n.length))}function ut(n){return De(Ur(n))}function it(n,t,r){(r===T||lu(n[t],r))&&(r!==T||t in n)||st(n,t,r);
}function ot(n,t,r){var e=n[t];oi.call(n,t)&&lu(e,r)&&(r!==T||t in n)||st(n,t,r)}function ft(n,t){for(var r=n.length;r--;)if(lu(n[r][0],t))return r;return-1}function ct(n,t,r,e){return uo(n,function(n,u,i){t(e,n,r(n),i)}),e}function at(n,t){return n&&Cr(t,Wu(t),n)}function lt(n,t){return n&&Cr(t,Bu(t),n)}function st(n,t,r){"__proto__"==t&&Ai?Ai(n,t,{configurable:true,enumerable:true,value:r,writable:true}):n[t]=r}function ht(n,t){for(var r=-1,e=t.length,u=Ku(e),i=null==n;++r<e;)u[r]=i?T:Ru(n,t[r]);return u;
}function pt(n,t,r){return n===n&&(r!==T&&(n=n<=r?n:r),t!==T&&(n=n>=t?n:t)),n}function _t(n,t,e,u,i,o){var f,c=1&t,a=2&t,l=4&t;if(e&&(f=i?e(n,u,i,o):e(n)),f!==T)return f;if(!du(n))return n;if(u=ff(n)){if(f=me(n),!c)return Ur(n,f)}else{var s=vo(n),h="[object Function]"==s||"[object GeneratorFunction]"==s;if(af(n))return Ir(n,c);if("[object Object]"==s||"[object Arguments]"==s||h&&!i){if(f=a||h?{}:Ae(n),!c)return a?Mr(n,lt(f,n)):Dr(n,at(f,n))}else{if(!Ln[s])return i?n:{};f=Ee(n,s,c)}}if(o||(o=new Zn),
i=o.get(n))return i;o.set(n,f),pf(n)?n.forEach(function(r){f.add(_t(r,t,e,r,n,o))}):sf(n)&&n.forEach(function(r,u){f.set(u,_t(r,t,e,u,n,o))});var a=l?a?ve:_e:a?Bu:Wu,p=u?T:a(n);return r(p||n,function(r,u){p&&(u=r,r=n[u]),ot(f,u,_t(r,t,e,u,n,o))}),f}function vt(n){var t=Wu(n);return function(r){return gt(r,n,t)}}function gt(n,t,r){var e=r.length;if(null==n)return!e;for(n=Qu(n);e--;){var u=r[e],i=t[u],o=n[u];if(o===T&&!(u in n)||!i(o))return false}return true}function dt(n,t,r){if(typeof n!="function")throw new ti("Expected a function");
return bo(function(){n.apply(T,r)},t)}function yt(n,t,r,e){var u=-1,i=o,a=true,l=n.length,s=[],h=t.length;if(!l)return s;r&&(t=c(t,k(r))),e?(i=f,a=false):200<=t.length&&(i=O,a=false,t=new Nn(t));n:for(;++u<l;){var p=n[u],_=null==r?p:r(p),p=e||0!==p?p:0;if(a&&_===_){for(var v=h;v--;)if(t[v]===_)continue n;s.push(p)}else i(t,_,e)||s.push(p)}return s}function bt(n,t){var r=true;return uo(n,function(n,e,u){return r=!!t(n,e,u)}),r}function xt(n,t,r){for(var e=-1,u=n.length;++e<u;){var i=n[e],o=t(i);if(null!=o&&(f===T?o===o&&!wu(o):r(o,f)))var f=o,c=i;
}return c}function jt(n,t){var r=[];return uo(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function wt(n,t,r,e,u){var i=-1,o=n.length;for(r||(r=ke),u||(u=[]);++i<o;){var f=n[i];0<t&&r(f)?1<t?wt(f,t-1,r,e,u):a(u,f):e||(u[u.length]=f)}return u}function mt(n,t){return n&&oo(n,t,Wu)}function At(n,t){return n&&fo(n,t,Wu)}function Et(n,t){return i(t,function(t){return _u(n[t])})}function kt(n,t){t=Sr(t,n);for(var r=0,e=t.length;null!=n&&r<e;)n=n[Me(t[r++])];return r&&r==e?n:T}function St(n,t,r){return t=t(n),
ff(n)?t:a(t,r(n))}function Ot(n){if(null==n)n=n===T?"[object Undefined]":"[object Null]";else if(mi&&mi in Qu(n)){var t=oi.call(n,mi),r=n[mi];try{n[mi]=T;var e=true}catch(n){}var u=ai.call(n);e&&(t?n[mi]=r:delete n[mi]),n=u}else n=ai.call(n);return n}function It(n,t){return n>t}function Rt(n,t){return null!=n&&oi.call(n,t)}function zt(n,t){return null!=n&&t in Qu(n)}function Wt(n,t,r){for(var e=r?f:o,u=n[0].length,i=n.length,a=i,l=Ku(i),s=1/0,h=[];a--;){var p=n[a];a&&t&&(p=c(p,k(t))),s=Ci(p.length,s),
l[a]=!r&&(t||120<=u&&120<=p.length)?new Nn(a&&p):T}var p=n[0],_=-1,v=l[0];n:for(;++_<u&&h.length<s;){var g=p[_],d=t?t(g):g,g=r||0!==g?g:0;if(v?!O(v,d):!e(h,d,r)){for(a=i;--a;){var y=l[a];if(y?!O(y,d):!e(n[a],d,r))continue n}v&&v.push(d),h.push(g)}}return h}function Bt(n,t,r){var e={};return mt(n,function(n,u,i){t(e,r(n),u,i)}),e}function Lt(t,r,e){return r=Sr(r,t),t=2>r.length?t:kt(t,hr(r,0,-1)),r=null==t?t:t[Me(Ve(r))],null==r?T:n(r,t,e)}function Ut(n){return yu(n)&&"[object Arguments]"==Ot(n)}function Ct(n){
return yu(n)&&"[object ArrayBuffer]"==Ot(n)}function Dt(n){return yu(n)&&"[object Date]"==Ot(n)}function Mt(n,t,r,e,u){if(n===t)t=true;else if(null==n||null==t||!yu(n)&&!yu(t))t=n!==n&&t!==t;else n:{var i=ff(n),o=ff(t),f=i?"[object Array]":vo(n),c=o?"[object Array]":vo(t),f="[object Arguments]"==f?"[object Object]":f,c="[object Arguments]"==c?"[object Object]":c,a="[object Object]"==f,o="[object Object]"==c;if((c=f==c)&&af(n)){if(!af(t)){t=false;break n}i=true,a=false}if(c&&!a)u||(u=new Zn),t=i||_f(n)?se(n,t,r,e,Mt,u):he(n,t,f,r,e,Mt,u);else{
if(!(1&r)&&(i=a&&oi.call(n,"__wrapped__"),f=o&&oi.call(t,"__wrapped__"),i||f)){n=i?n.value():n,t=f?t.value():t,u||(u=new Zn),t=Mt(n,t,r,e,u);break n}if(c)t:if(u||(u=new Zn),i=1&r,f=_e(n),o=f.length,c=_e(t).length,o==c||i){for(a=o;a--;){var l=f[a];if(!(i?l in t:oi.call(t,l))){t=false;break t}}if((c=u.get(n))&&u.get(t))t=c==t;else{c=true,u.set(n,t),u.set(t,n);for(var s=i;++a<o;){var l=f[a],h=n[l],p=t[l];if(e)var _=i?e(p,h,l,t,n,u):e(h,p,l,n,t,u);if(_===T?h!==p&&!Mt(h,p,r,e,u):!_){c=false;break}s||(s="constructor"==l);
}c&&!s&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),u.delete(n),u.delete(t),t=c}}else t=false;else t=false}}return t}function Tt(n){return yu(n)&&"[object Map]"==vo(n)}function $t(n,t,r,e){var u=r.length,i=u,o=!e;if(null==n)return!i;for(n=Qu(n);u--;){var f=r[u];if(o&&f[2]?f[1]!==n[f[0]]:!(f[0]in n))return false}for(;++u<i;){var f=r[u],c=f[0],a=n[c],l=f[1];if(o&&f[2]){if(a===T&&!(c in n))return false;
}else{if(f=new Zn,e)var s=e(a,l,c,n,t,f);if(s===T?!Mt(l,a,3,e,f):!s)return false}}return true}function Ft(n){return!(!du(n)||ci&&ci in n)&&(_u(n)?hi:dn).test(Te(n))}function Nt(n){return yu(n)&&"[object RegExp]"==Ot(n)}function Pt(n){return yu(n)&&"[object Set]"==vo(n)}function Zt(n){return yu(n)&&gu(n.length)&&!!Bn[Ot(n)]}function qt(n){return typeof n=="function"?n:null==n?$u:typeof n=="object"?ff(n)?Jt(n[0],n[1]):Ht(n):Zu(n)}function Vt(n){if(!ze(n))return Li(n);var t,r=[];for(t in Qu(n))oi.call(n,t)&&"constructor"!=t&&r.push(t);
return r}function Kt(n,t){return n<t}function Gt(n,t){var r=-1,e=su(n)?Ku(n.length):[];return uo(n,function(n,u,i){e[++r]=t(n,u,i)}),e}function Ht(n){var t=xe(n);return 1==t.length&&t[0][2]?We(t[0][0],t[0][1]):function(r){return r===n||$t(r,n,t)}}function Jt(n,t){return Ie(n)&&t===t&&!du(t)?We(Me(n),t):function(r){var e=Ru(r,n);return e===T&&e===t?zu(r,n):Mt(t,e,3)}}function Yt(n,t,r,e,u){n!==t&&oo(t,function(i,o){if(u||(u=new Zn),du(i)){var f=u,c=Le(n,o),a=Le(t,o),l=f.get(a);if(l)it(n,o,l);else{
var l=e?e(c,a,o+"",n,t,f):T,s=l===T;if(s){var h=ff(a),p=!h&&af(a),_=!h&&!p&&_f(a),l=a;h||p||_?ff(c)?l=c:hu(c)?l=Ur(c):p?(s=false,l=Ir(a,true)):_?(s=false,l=zr(a,true)):l=[]:xu(a)||of(a)?(l=c,of(c)?l=Ou(c):du(c)&&!_u(c)||(l=Ae(a))):s=false}s&&(f.set(a,l),Yt(l,a,r,e,f),f.delete(a)),it(n,o,l)}}else f=e?e(Le(n,o),i,o+"",n,t,u):T,f===T&&(f=i),it(n,o,f)},Bu)}function Qt(n,t){var r=n.length;if(r)return t+=0>t?r:0,Se(t,r)?n[t]:T}function Xt(n,t,r){var e=-1;return t=c(t.length?t:[$u],k(ye())),n=Gt(n,function(n){return{
a:c(t,function(t){return t(n)}),b:++e,c:n}}),w(n,function(n,t){var e;n:{e=-1;for(var u=n.a,i=t.a,o=u.length,f=r.length;++e<o;){var c=Wr(u[e],i[e]);if(c){e=e>=f?c:c*("desc"==r[e]?-1:1);break n}}e=n.b-t.b}return e})}function nr(n,t){return tr(n,t,function(t,r){return zu(n,r)})}function tr(n,t,r){for(var e=-1,u=t.length,i={};++e<u;){var o=t[e],f=kt(n,o);r(f,o)&&lr(i,Sr(o,n),f)}return i}function rr(n){return function(t){return kt(t,n)}}function er(n,t,r,e){var u=e?g:v,i=-1,o=t.length,f=n;for(n===t&&(t=Ur(t)),
r&&(f=c(n,k(r)));++i<o;)for(var a=0,l=t[i],l=r?r(l):l;-1<(a=u(f,l,a,e));)f!==n&&xi.call(f,a,1),xi.call(n,a,1);return n}function ur(n,t){for(var r=n?t.length:0,e=r-1;r--;){var u=t[r];if(r==e||u!==i){var i=u;Se(u)?xi.call(n,u,1):xr(n,u)}}}function ir(n,t){return n+Ii(Ti()*(t-n+1))}function or(n,t){var r="";if(!n||1>t||9007199254740991<t)return r;do t%2&&(r+=n),(t=Ii(t/2))&&(n+=n);while(t);return r}function fr(n,t){return xo(Be(n,t,$u),n+"")}function cr(n){return Qn(Uu(n))}function ar(n,t){var r=Uu(n);
return De(r,pt(t,0,r.length))}function lr(n,t,r,e){if(!du(n))return n;t=Sr(t,n);for(var u=-1,i=t.length,o=i-1,f=n;null!=f&&++u<i;){var c=Me(t[u]),a=r;if(u!=o){var l=f[c],a=e?e(l,c,f):T;a===T&&(a=du(l)?l:Se(t[u+1])?[]:{})}ot(f,c,a),f=f[c]}return n}function sr(n){return De(Uu(n))}function hr(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Ku(u);++e<u;)r[e]=n[e+t];return r}function pr(n,t){var r;return uo(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}
function _r(n,t,r){var e=0,u=null==n?e:n.length;if(typeof t=="number"&&t===t&&2147483647>=u){for(;e<u;){var i=e+u>>>1,o=n[i];null!==o&&!wu(o)&&(r?o<=t:o<t)?e=i+1:u=i}return u}return vr(n,t,$u,r)}function vr(n,t,r,e){t=r(t);for(var u=0,i=null==n?0:n.length,o=t!==t,f=null===t,c=wu(t),a=t===T;u<i;){var l=Ii((u+i)/2),s=r(n[l]),h=s!==T,p=null===s,_=s===s,v=wu(s);(o?e||_:a?_&&(e||h):f?_&&h&&(e||!p):c?_&&h&&!p&&(e||!v):p||v?0:e?s<=t:s<t)?u=l+1:i=l}return Ci(i,4294967294)}function gr(n,t){for(var r=-1,e=n.length,u=0,i=[];++r<e;){
var o=n[r],f=t?t(o):o;if(!r||!lu(f,c)){var c=f;i[u++]=0===o?0:o}}return i}function dr(n){return typeof n=="number"?n:wu(n)?F:+n}function yr(n){if(typeof n=="string")return n;if(ff(n))return c(n,yr)+"";if(wu(n))return ro?ro.call(n):"";var t=n+"";return"0"==t&&1/n==-$?"-0":t}function br(n,t,r){var e=-1,u=o,i=n.length,c=true,a=[],l=a;if(r)c=false,u=f;else if(200<=i){if(u=t?null:so(n))return U(u);c=false,u=O,l=new Nn}else l=t?[]:a;n:for(;++e<i;){var s=n[e],h=t?t(s):s,s=r||0!==s?s:0;if(c&&h===h){for(var p=l.length;p--;)if(l[p]===h)continue n;
t&&l.push(h),a.push(s)}else u(l,h,r)||(l!==a&&l.push(h),a.push(s))}return a}function xr(n,t){return t=Sr(t,n),n=2>t.length?n:kt(n,hr(t,0,-1)),null==n||delete n[Me(Ve(t))]}function jr(n,t,r,e){for(var u=n.length,i=e?u:-1;(e?i--:++i<u)&&t(n[i],i,n););return r?hr(n,e?0:i,e?i+1:u):hr(n,e?i+1:0,e?u:i)}function wr(n,t){var r=n;return r instanceof Un&&(r=r.value()),l(t,function(n,t){return t.func.apply(t.thisArg,a([n],t.args))},r)}function mr(n,t,r){var e=n.length;if(2>e)return e?br(n[0]):[];for(var u=-1,i=Ku(e);++u<e;)for(var o=n[u],f=-1;++f<e;)f!=u&&(i[u]=yt(i[u]||o,n[f],t,r));
return br(wt(i,1),t,r)}function Ar(n,t,r){for(var e=-1,u=n.length,i=t.length,o={};++e<u;)r(o,n[e],e<i?t[e]:T);return o}function Er(n){return hu(n)?n:[]}function kr(n){return typeof n=="function"?n:$u}function Sr(n,t){return ff(n)?n:Ie(n,t)?[n]:jo(Iu(n))}function Or(n,t,r){var e=n.length;return r=r===T?e:r,!t&&r>=e?n:hr(n,t,r)}function Ir(n,t){if(t)return n.slice();var r=n.length,r=gi?gi(r):new n.constructor(r);return n.copy(r),r}function Rr(n){var t=new n.constructor(n.byteLength);return new vi(t).set(new vi(n)),
t}function zr(n,t){return new n.constructor(t?Rr(n.buffer):n.buffer,n.byteOffset,n.length)}function Wr(n,t){if(n!==t){var r=n!==T,e=null===n,u=n===n,i=wu(n),o=t!==T,f=null===t,c=t===t,a=wu(t);if(!f&&!a&&!i&&n>t||i&&o&&c&&!f&&!a||e&&o&&c||!r&&c||!u)return 1;if(!e&&!i&&!a&&n<t||a&&r&&u&&!e&&!i||f&&r&&u||!o&&u||!c)return-1}return 0}function Br(n,t,r,e){var u=-1,i=n.length,o=r.length,f=-1,c=t.length,a=Ui(i-o,0),l=Ku(c+a);for(e=!e;++f<c;)l[f]=t[f];for(;++u<o;)(e||u<i)&&(l[r[u]]=n[u]);for(;a--;)l[f++]=n[u++];
return l}function Lr(n,t,r,e){var u=-1,i=n.length,o=-1,f=r.length,c=-1,a=t.length,l=Ui(i-f,0),s=Ku(l+a);for(e=!e;++u<l;)s[u]=n[u];for(l=u;++c<a;)s[l+c]=t[c];for(;++o<f;)(e||u<i)&&(s[l+r[o]]=n[u++]);return s}function Ur(n,t){var r=-1,e=n.length;for(t||(t=Ku(e));++r<e;)t[r]=n[r];return t}function Cr(n,t,r,e){var u=!r;r||(r={});for(var i=-1,o=t.length;++i<o;){var f=t[i],c=e?e(r[f],n[f],f,r,n):T;c===T&&(c=n[f]),u?st(r,f,c):ot(r,f,c)}return r}function Dr(n,t){return Cr(n,po(n),t)}function Mr(n,t){return Cr(n,_o(n),t);
}function Tr(n,r){return function(e,u){var i=ff(e)?t:ct,o=r?r():{};return i(e,n,ye(u,2),o)}}function $r(n){return fr(function(t,r){var e=-1,u=r.length,i=1<u?r[u-1]:T,o=2<u?r[2]:T,i=3<n.length&&typeof i=="function"?(u--,i):T;for(o&&Oe(r[0],r[1],o)&&(i=3>u?T:i,u=1),t=Qu(t);++e<u;)(o=r[e])&&n(t,o,e,i);return t})}function Fr(n,t){return function(r,e){if(null==r)return r;if(!su(r))return n(r,e);for(var u=r.length,i=t?u:-1,o=Qu(r);(t?i--:++i<u)&&false!==e(o[i],i,o););return r}}function Nr(n){return function(t,r,e){
var u=-1,i=Qu(t);e=e(t);for(var o=e.length;o--;){var f=e[n?o:++u];if(false===r(i[f],f,i))break}return t}}function Pr(n,t,r){function e(){return(this&&this!==$n&&this instanceof e?i:n).apply(u?r:this,arguments)}var u=1&t,i=Vr(n);return e}function Zr(n){return function(t){t=Iu(t);var r=Rn.test(t)?M(t):T,e=r?r[0]:t.charAt(0);return t=r?Or(r,1).join(""):t.slice(1),e[n]()+t}}function qr(n){return function(t){return l(Mu(Du(t).replace(kn,"")),n,"")}}function Vr(n){return function(){var t=arguments;switch(t.length){
case 0:return new n;case 1:return new n(t[0]);case 2:return new n(t[0],t[1]);case 3:return new n(t[0],t[1],t[2]);case 4:return new n(t[0],t[1],t[2],t[3]);case 5:return new n(t[0],t[1],t[2],t[3],t[4]);case 6:return new n(t[0],t[1],t[2],t[3],t[4],t[5]);case 7:return new n(t[0],t[1],t[2],t[3],t[4],t[5],t[6])}var r=eo(n.prototype),t=n.apply(r,t);return du(t)?t:r}}function Kr(t,r,e){function u(){for(var o=arguments.length,f=Ku(o),c=o,a=de(u);c--;)f[c]=arguments[c];return c=3>o&&f[0]!==a&&f[o-1]!==a?[]:L(f,a),
o-=c.length,o<e?ue(t,r,Jr,u.placeholder,T,f,c,T,T,e-o):n(this&&this!==$n&&this instanceof u?i:t,this,f)}var i=Vr(t);return u}function Gr(n){return function(t,r,e){var u=Qu(t);if(!su(t)){var i=ye(r,3);t=Wu(t),r=function(n){return i(u[n],n,u)}}return r=n(t,r,e),-1<r?u[i?t[r]:r]:T}}function Hr(n){return pe(function(t){var r=t.length,e=r,u=On.prototype.thru;for(n&&t.reverse();e--;){var i=t[e];if(typeof i!="function")throw new ti("Expected a function");if(u&&!o&&"wrapper"==ge(i))var o=new On([],true)}for(e=o?e:r;++e<r;)var i=t[e],u=ge(i),f="wrapper"==u?ho(i):T,o=f&&Re(f[0])&&424==f[1]&&!f[4].length&&1==f[9]?o[ge(f[0])].apply(o,f[3]):1==i.length&&Re(i)?o[u]():o.thru(i);
return function(){var n=arguments,e=n[0];if(o&&1==n.length&&ff(e))return o.plant(e).value();for(var u=0,n=r?t[u].apply(this,n):e;++u<r;)n=t[u].call(this,n);return n}})}function Jr(n,t,r,e,u,i,o,f,c,a){function l(){for(var d=arguments.length,y=Ku(d),b=d;b--;)y[b]=arguments[b];if(_){var x,j=de(l),b=y.length;for(x=0;b--;)y[b]===j&&++x}if(e&&(y=Br(y,e,u,_)),i&&(y=Lr(y,i,o,_)),d-=x,_&&d<a)return j=L(y,j),ue(n,t,Jr,l.placeholder,r,y,j,f,c,a-d);if(j=h?r:this,b=p?j[n]:n,d=y.length,f){x=y.length;for(var w=Ci(f.length,x),m=Ur(y);w--;){
var A=f[w];y[w]=Se(A,x)?m[A]:T}}else v&&1<d&&y.reverse();return s&&c<d&&(y.length=c),this&&this!==$n&&this instanceof l&&(b=g||Vr(b)),b.apply(j,y)}var s=128&t,h=1&t,p=2&t,_=24&t,v=512&t,g=p?T:Vr(n);return l}function Yr(n,t){return function(r,e){return Bt(r,n,t(e))}}function Qr(n,t){return function(r,e){var u;if(r===T&&e===T)return t;if(r!==T&&(u=r),e!==T){if(u===T)return e;typeof r=="string"||typeof e=="string"?(r=yr(r),e=yr(e)):(r=dr(r),e=dr(e)),u=n(r,e)}return u}}function Xr(t){return pe(function(r){
return r=c(r,k(ye())),fr(function(e){var u=this;return t(r,function(t){return n(t,u,e)})})})}function ne(n,t){t=t===T?" ":yr(t);var r=t.length;return 2>r?r?or(t,n):t:(r=or(t,Oi(n/D(t))),Rn.test(t)?Or(M(r),0,n).join(""):r.slice(0,n))}function te(t,r,e,u){function i(){for(var r=-1,c=arguments.length,a=-1,l=u.length,s=Ku(l+c),h=this&&this!==$n&&this instanceof i?f:t;++a<l;)s[a]=u[a];for(;c--;)s[a++]=arguments[++r];return n(h,o?e:this,s)}var o=1&r,f=Vr(t);return i}function re(n){return function(t,r,e){
e&&typeof e!="number"&&Oe(t,r,e)&&(r=e=T),t=Au(t),r===T?(r=t,t=0):r=Au(r),e=e===T?t<r?1:-1:Au(e);var u=-1;r=Ui(Oi((r-t)/(e||1)),0);for(var i=Ku(r);r--;)i[n?r:++u]=t,t+=e;return i}}function ee(n){return function(t,r){return typeof t=="string"&&typeof r=="string"||(t=Su(t),r=Su(r)),n(t,r)}}function ue(n,t,r,e,u,i,o,f,c,a){var l=8&t,s=l?o:T;o=l?T:o;var h=l?i:T;return i=l?T:i,t=(t|(l?32:64))&~(l?64:32),4&t||(t&=-4),u=[n,t,u,h,s,i,o,f,c,a],r=r.apply(T,u),Re(n)&&yo(r,u),r.placeholder=e,Ue(r,n,t)}function ie(n){
var t=Yu[n];return function(n,r){if(n=Su(n),(r=null==r?0:Ci(Eu(r),292))&&Wi(n)){var e=(Iu(n)+"e").split("e"),e=t(e[0]+"e"+(+e[1]+r)),e=(Iu(e)+"e").split("e");return+(e[0]+"e"+(+e[1]-r))}return t(n)}}function oe(n){return function(t){var r=vo(t);return"[object Map]"==r?W(t):"[object Set]"==r?C(t):E(t,n(t))}}function fe(n,t,r,e,u,i,o,f){var c=2&t;if(!c&&typeof n!="function")throw new ti("Expected a function");var a=e?e.length:0;if(a||(t&=-97,e=u=T),o=o===T?o:Ui(Eu(o),0),f=f===T?f:Eu(f),a-=u?u.length:0,
64&t){var l=e,s=u;e=u=T}var h=c?T:ho(n);return i=[n,t,r,e,u,l,s,i,o,f],h&&(r=i[1],n=h[1],t=r|n,e=128==n&&8==r||128==n&&256==r&&i[7].length<=h[8]||384==n&&h[7].length<=h[8]&&8==r,131>t||e)&&(1&n&&(i[2]=h[2],t|=1&r?0:4),(r=h[3])&&(e=i[3],i[3]=e?Br(e,r,h[4]):r,i[4]=e?L(i[3],"__lodash_placeholder__"):h[4]),(r=h[5])&&(e=i[5],i[5]=e?Lr(e,r,h[6]):r,i[6]=e?L(i[5],"__lodash_placeholder__"):h[6]),(r=h[7])&&(i[7]=r),128&n&&(i[8]=null==i[8]?h[8]:Ci(i[8],h[8])),null==i[9]&&(i[9]=h[9]),i[0]=h[0],i[1]=t),n=i[0],
t=i[1],r=i[2],e=i[3],u=i[4],f=i[9]=i[9]===T?c?0:n.length:Ui(i[9]-a,0),!f&&24&t&&(t&=-25),Ue((h?co:yo)(t&&1!=t?8==t||16==t?Kr(n,t,f):32!=t&&33!=t||u.length?Jr.apply(T,i):te(n,t,r,e):Pr(n,t,r),i),n,t)}function ce(n,t,r,e){return n===T||lu(n,ei[r])&&!oi.call(e,r)?t:n}function ae(n,t,r,e,u,i){return du(n)&&du(t)&&(i.set(t,n),Yt(n,t,T,ae,i),i.delete(t)),n}function le(n){return xu(n)?T:n}function se(n,t,r,e,u,i){var o=1&r,f=n.length,c=t.length;if(f!=c&&!(o&&c>f))return false;if((c=i.get(n))&&i.get(t))return c==t;
var c=-1,a=true,l=2&r?new Nn:T;for(i.set(n,t),i.set(t,n);++c<f;){var s=n[c],p=t[c];if(e)var _=o?e(p,s,c,t,n,i):e(s,p,c,n,t,i);if(_!==T){if(_)continue;a=false;break}if(l){if(!h(t,function(n,t){if(!O(l,t)&&(s===n||u(s,n,r,e,i)))return l.push(t)})){a=false;break}}else if(s!==p&&!u(s,p,r,e,i)){a=false;break}}return i.delete(n),i.delete(t),a}function he(n,t,r,e,u,i,o){switch(r){case"[object DataView]":if(n.byteLength!=t.byteLength||n.byteOffset!=t.byteOffset)break;n=n.buffer,t=t.buffer;case"[object ArrayBuffer]":
if(n.byteLength!=t.byteLength||!i(new vi(n),new vi(t)))break;return true;case"[object Boolean]":case"[object Date]":case"[object Number]":return lu(+n,+t);case"[object Error]":return n.name==t.name&&n.message==t.message;case"[object RegExp]":case"[object String]":return n==t+"";case"[object Map]":var f=W;case"[object Set]":if(f||(f=U),n.size!=t.size&&!(1&e))break;return(r=o.get(n))?r==t:(e|=2,o.set(n,t),t=se(f(n),f(t),e,u,i,o),o.delete(n),t);case"[object Symbol]":if(to)return to.call(n)==to.call(t)}
return false}function pe(n){return xo(Be(n,T,Ze),n+"")}function _e(n){return St(n,Wu,po)}function ve(n){return St(n,Bu,_o)}function ge(n){for(var t=n.name+"",r=Gi[t],e=oi.call(Gi,t)?r.length:0;e--;){var u=r[e],i=u.func;if(null==i||i==n)return u.name}return t}function de(n){return(oi.call(An,"placeholder")?An:n).placeholder}function ye(){var n=An.iteratee||Fu,n=n===Fu?qt:n;return arguments.length?n(arguments[0],arguments[1]):n}function be(n,t){var r=n.__data__,e=typeof t;return("string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t)?r[typeof t=="string"?"string":"hash"]:r.map;
}function xe(n){for(var t=Wu(n),r=t.length;r--;){var e=t[r],u=n[e];t[r]=[e,u,u===u&&!du(u)]}return t}function je(n,t){var r=null==n?T:n[t];return Ft(r)?r:T}function we(n,t,r){t=Sr(t,n);for(var e=-1,u=t.length,i=false;++e<u;){var o=Me(t[e]);if(!(i=null!=n&&r(n,o)))break;n=n[o]}return i||++e!=u?i:(u=null==n?0:n.length,!!u&&gu(u)&&Se(o,u)&&(ff(n)||of(n)))}function me(n){var t=n.length,r=new n.constructor(t);return t&&"string"==typeof n[0]&&oi.call(n,"index")&&(r.index=n.index,r.input=n.input),r}function Ae(n){
return typeof n.constructor!="function"||ze(n)?{}:eo(di(n))}function Ee(n,t,r){var e=n.constructor;switch(t){case"[object ArrayBuffer]":return Rr(n);case"[object Boolean]":case"[object Date]":return new e(+n);case"[object DataView]":return t=r?Rr(n.buffer):n.buffer,new n.constructor(t,n.byteOffset,n.byteLength);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":
case"[object Uint16Array]":case"[object Uint32Array]":return zr(n,r);case"[object Map]":return new e;case"[object Number]":case"[object String]":return new e(n);case"[object RegExp]":return t=new n.constructor(n.source,_n.exec(n)),t.lastIndex=n.lastIndex,t;case"[object Set]":return new e;case"[object Symbol]":return to?Qu(to.call(n)):{}}}function ke(n){return ff(n)||of(n)||!!(ji&&n&&n[ji])}function Se(n,t){var r=typeof n;return t=null==t?9007199254740991:t,!!t&&("number"==r||"symbol"!=r&&bn.test(n))&&-1<n&&0==n%1&&n<t;
}function Oe(n,t,r){if(!du(r))return false;var e=typeof t;return!!("number"==e?su(r)&&Se(t,r.length):"string"==e&&t in r)&&lu(r[t],n)}function Ie(n,t){if(ff(n))return false;var r=typeof n;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=n&&!wu(n))||(nn.test(n)||!X.test(n)||null!=t&&n in Qu(t))}function Re(n){var t=ge(n),r=An[t];return typeof r=="function"&&t in Un.prototype&&(n===r||(t=ho(r),!!t&&n===t[0]))}function ze(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||ei)}function We(n,t){
return function(r){return null!=r&&(r[n]===t&&(t!==T||n in Qu(r)))}}function Be(t,r,e){return r=Ui(r===T?t.length-1:r,0),function(){for(var u=arguments,i=-1,o=Ui(u.length-r,0),f=Ku(o);++i<o;)f[i]=u[r+i];for(i=-1,o=Ku(r+1);++i<r;)o[i]=u[i];return o[r]=e(f),n(t,this,o)}}function Le(n,t){if(("constructor"!==t||"function"!=typeof n[t])&&"__proto__"!=t)return n[t]}function Ue(n,t,r){var e=t+"";t=xo;var u,i=$e;return u=(u=e.match(an))?u[1].split(ln):[],r=i(u,r),(i=r.length)&&(u=i-1,r[u]=(1<i?"& ":"")+r[u],
r=r.join(2<i?", ":" "),e=e.replace(cn,"{\n/* [wrapped with "+r+"] */\n")),t(n,e)}function Ce(n){var t=0,r=0;return function(){var e=Di(),u=16-(e-r);if(r=e,0<u){if(800<=++t)return arguments[0]}else t=0;return n.apply(T,arguments)}}function De(n,t){var r=-1,e=n.length,u=e-1;for(t=t===T?e:t;++r<t;){var e=ir(r,u),i=n[e];n[e]=n[r],n[r]=i}return n.length=t,n}function Me(n){if(typeof n=="string"||wu(n))return n;var t=n+"";return"0"==t&&1/n==-$?"-0":t}function Te(n){if(null!=n){try{return ii.call(n)}catch(n){}
return n+""}return""}function $e(n,t){return r(N,function(r){var e="_."+r[0];t&r[1]&&!o(n,e)&&n.push(e)}),n.sort()}function Fe(n){if(n instanceof Un)return n.clone();var t=new On(n.__wrapped__,n.__chain__);return t.__actions__=Ur(n.__actions__),t.__index__=n.__index__,t.__values__=n.__values__,t}function Ne(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ui(e+r,0)),_(n,ye(t,3),r)):-1}function Pe(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e-1;return r!==T&&(u=Eu(r),u=0>r?Ui(e+u,0):Ci(u,e-1)),
_(n,ye(t,3),u,true)}function Ze(n){return(null==n?0:n.length)?wt(n,1):[]}function qe(n){return n&&n.length?n[0]:T}function Ve(n){var t=null==n?0:n.length;return t?n[t-1]:T}function Ke(n,t){return n&&n.length&&t&&t.length?er(n,t):n}function Ge(n){return null==n?n:$i.call(n)}function He(n){if(!n||!n.length)return[];var t=0;return n=i(n,function(n){if(hu(n))return t=Ui(n.length,t),true}),A(t,function(t){return c(n,b(t))})}function Je(t,r){if(!t||!t.length)return[];var e=He(t);return null==r?e:c(e,function(t){
return n(r,T,t)})}function Ye(n){return n=An(n),n.__chain__=true,n}function Qe(n,t){return t(n)}function Xe(){return this}function nu(n,t){return(ff(n)?r:uo)(n,ye(t,3))}function tu(n,t){return(ff(n)?e:io)(n,ye(t,3))}function ru(n,t){return(ff(n)?c:Gt)(n,ye(t,3))}function eu(n,t,r){return t=r?T:t,t=n&&null==t?n.length:t,fe(n,128,T,T,T,T,t)}function uu(n,t){var r;if(typeof t!="function")throw new ti("Expected a function");return n=Eu(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=T),
r}}function iu(n,t,r){return t=r?T:t,n=fe(n,8,T,T,T,T,T,t),n.placeholder=iu.placeholder,n}function ou(n,t,r){return t=r?T:t,n=fe(n,16,T,T,T,T,T,t),n.placeholder=ou.placeholder,n}function fu(n,t,r){function e(t){var r=c,e=a;return c=a=T,_=t,s=n.apply(e,r)}function u(n){var r=n-p;return n-=_,p===T||r>=t||0>r||g&&n>=l}function i(){var n=Go();if(u(n))return o(n);var r,e=bo;r=n-_,n=t-(n-p),r=g?Ci(n,l-r):n,h=e(i,r)}function o(n){return h=T,d&&c?e(n):(c=a=T,s)}function f(){var n=Go(),r=u(n);if(c=arguments,
a=this,p=n,r){if(h===T)return _=n=p,h=bo(i,t),v?e(n):s;if(g)return lo(h),h=bo(i,t),e(p)}return h===T&&(h=bo(i,t)),s}var c,a,l,s,h,p,_=0,v=false,g=false,d=true;if(typeof n!="function")throw new ti("Expected a function");return t=Su(t)||0,du(r)&&(v=!!r.leading,l=(g="maxWait"in r)?Ui(Su(r.maxWait)||0,t):l,d="trailing"in r?!!r.trailing:d),f.cancel=function(){h!==T&&lo(h),_=0,c=p=a=h=T},f.flush=function(){return h===T?s:o(Go())},f}function cu(n,t){function r(){var e=arguments,u=t?t.apply(this,e):e[0],i=r.cache;
return i.has(u)?i.get(u):(e=n.apply(this,e),r.cache=i.set(u,e)||i,e)}if(typeof n!="function"||null!=t&&typeof t!="function")throw new ti("Expected a function");return r.cache=new(cu.Cache||Fn),r}function au(n){if(typeof n!="function")throw new ti("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!n.call(this);case 1:return!n.call(this,t[0]);case 2:return!n.call(this,t[0],t[1]);case 3:return!n.call(this,t[0],t[1],t[2])}return!n.apply(this,t)}}function lu(n,t){return n===t||n!==n&&t!==t;
}function su(n){return null!=n&&gu(n.length)&&!_u(n)}function hu(n){return yu(n)&&su(n)}function pu(n){if(!yu(n))return false;var t=Ot(n);return"[object Error]"==t||"[object DOMException]"==t||typeof n.message=="string"&&typeof n.name=="string"&&!xu(n)}function _u(n){return!!du(n)&&(n=Ot(n),"[object Function]"==n||"[object GeneratorFunction]"==n||"[object AsyncFunction]"==n||"[object Proxy]"==n)}function vu(n){return typeof n=="number"&&n==Eu(n)}function gu(n){return typeof n=="number"&&-1<n&&0==n%1&&9007199254740991>=n;
}function du(n){var t=typeof n;return null!=n&&("object"==t||"function"==t)}function yu(n){return null!=n&&typeof n=="object"}function bu(n){return typeof n=="number"||yu(n)&&"[object Number]"==Ot(n)}function xu(n){return!(!yu(n)||"[object Object]"!=Ot(n))&&(n=di(n),null===n||(n=oi.call(n,"constructor")&&n.constructor,typeof n=="function"&&n instanceof n&&ii.call(n)==li))}function ju(n){return typeof n=="string"||!ff(n)&&yu(n)&&"[object String]"==Ot(n)}function wu(n){return typeof n=="symbol"||yu(n)&&"[object Symbol]"==Ot(n);
}function mu(n){if(!n)return[];if(su(n))return ju(n)?M(n):Ur(n);if(wi&&n[wi]){n=n[wi]();for(var t,r=[];!(t=n.next()).done;)r.push(t.value);return r}return t=vo(n),("[object Map]"==t?W:"[object Set]"==t?U:Uu)(n)}function Au(n){return n?(n=Su(n),n===$||n===-$?1.7976931348623157e308*(0>n?-1:1):n===n?n:0):0===n?n:0}function Eu(n){n=Au(n);var t=n%1;return n===n?t?n-t:n:0}function ku(n){return n?pt(Eu(n),0,4294967295):0}function Su(n){if(typeof n=="number")return n;if(wu(n))return F;if(du(n)&&(n=typeof n.valueOf=="function"?n.valueOf():n,
n=du(n)?n+"":n),typeof n!="string")return 0===n?n:+n;n=n.replace(un,"");var t=gn.test(n);return t||yn.test(n)?Dn(n.slice(2),t?2:8):vn.test(n)?F:+n}function Ou(n){return Cr(n,Bu(n))}function Iu(n){return null==n?"":yr(n)}function Ru(n,t,r){return n=null==n?T:kt(n,t),n===T?r:n}function zu(n,t){return null!=n&&we(n,t,zt)}function Wu(n){return su(n)?qn(n):Vt(n)}function Bu(n){if(su(n))n=qn(n,true);else if(du(n)){var t,r=ze(n),e=[];for(t in n)("constructor"!=t||!r&&oi.call(n,t))&&e.push(t);n=e}else{if(t=[],
null!=n)for(r in Qu(n))t.push(r);n=t}return n}function Lu(n,t){if(null==n)return{};var r=c(ve(n),function(n){return[n]});return t=ye(t),tr(n,r,function(n,r){return t(n,r[0])})}function Uu(n){return null==n?[]:S(n,Wu(n))}function Cu(n){return $f(Iu(n).toLowerCase())}function Du(n){return(n=Iu(n))&&n.replace(xn,Xn).replace(Sn,"")}function Mu(n,t,r){return n=Iu(n),t=r?T:t,t===T?zn.test(n)?n.match(In)||[]:n.match(sn)||[]:n.match(t)||[]}function Tu(n){return function(){return n}}function $u(n){return n;
}function Fu(n){return qt(typeof n=="function"?n:_t(n,1))}function Nu(n,t,e){var u=Wu(t),i=Et(t,u);null!=e||du(t)&&(i.length||!u.length)||(e=t,t=n,n=this,i=Et(t,Wu(t)));var o=!(du(e)&&"chain"in e&&!e.chain),f=_u(n);return r(i,function(r){var e=t[r];n[r]=e,f&&(n.prototype[r]=function(){var t=this.__chain__;if(o||t){var r=n(this.__wrapped__);return(r.__actions__=Ur(this.__actions__)).push({func:e,args:arguments,thisArg:n}),r.__chain__=t,r}return e.apply(n,a([this.value()],arguments))})}),n}function Pu(){}
function Zu(n){return Ie(n)?b(Me(n)):rr(n)}function qu(){return[]}function Vu(){return false}mn=null==mn?$n:rt.defaults($n.Object(),mn,rt.pick($n,Wn));var Ku=mn.Array,Gu=mn.Date,Hu=mn.Error,Ju=mn.Function,Yu=mn.Math,Qu=mn.Object,Xu=mn.RegExp,ni=mn.String,ti=mn.TypeError,ri=Ku.prototype,ei=Qu.prototype,ui=mn["__core-js_shared__"],ii=Ju.prototype.toString,oi=ei.hasOwnProperty,fi=0,ci=function(){var n=/[^.]+$/.exec(ui&&ui.keys&&ui.keys.IE_PROTO||"");return n?"Symbol(src)_1."+n:""}(),ai=ei.toString,li=ii.call(Qu),si=$n._,hi=Xu("^"+ii.call(oi).replace(rn,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),pi=Pn?mn.Buffer:T,_i=mn.Symbol,vi=mn.Uint8Array,gi=pi?pi.g:T,di=B(Qu.getPrototypeOf,Qu),yi=Qu.create,bi=ei.propertyIsEnumerable,xi=ri.splice,ji=_i?_i.isConcatSpreadable:T,wi=_i?_i.iterator:T,mi=_i?_i.toStringTag:T,Ai=function(){
try{var n=je(Qu,"defineProperty");return n({},"",{}),n}catch(n){}}(),Ei=mn.clearTimeout!==$n.clearTimeout&&mn.clearTimeout,ki=Gu&&Gu.now!==$n.Date.now&&Gu.now,Si=mn.setTimeout!==$n.setTimeout&&mn.setTimeout,Oi=Yu.ceil,Ii=Yu.floor,Ri=Qu.getOwnPropertySymbols,zi=pi?pi.isBuffer:T,Wi=mn.isFinite,Bi=ri.join,Li=B(Qu.keys,Qu),Ui=Yu.max,Ci=Yu.min,Di=Gu.now,Mi=mn.parseInt,Ti=Yu.random,$i=ri.reverse,Fi=je(mn,"DataView"),Ni=je(mn,"Map"),Pi=je(mn,"Promise"),Zi=je(mn,"Set"),qi=je(mn,"WeakMap"),Vi=je(Qu,"create"),Ki=qi&&new qi,Gi={},Hi=Te(Fi),Ji=Te(Ni),Yi=Te(Pi),Qi=Te(Zi),Xi=Te(qi),no=_i?_i.prototype:T,to=no?no.valueOf:T,ro=no?no.toString:T,eo=function(){
function n(){}return function(t){return du(t)?yi?yi(t):(n.prototype=t,t=new n,n.prototype=T,t):{}}}();An.templateSettings={escape:J,evaluate:Y,interpolate:Q,variable:"",imports:{_:An}},An.prototype=En.prototype,An.prototype.constructor=An,On.prototype=eo(En.prototype),On.prototype.constructor=On,Un.prototype=eo(En.prototype),Un.prototype.constructor=Un,Mn.prototype.clear=function(){this.__data__=Vi?Vi(null):{},this.size=0},Mn.prototype.delete=function(n){return n=this.has(n)&&delete this.__data__[n],
this.size-=n?1:0,n},Mn.prototype.get=function(n){var t=this.__data__;return Vi?(n=t[n],"__lodash_hash_undefined__"===n?T:n):oi.call(t,n)?t[n]:T},Mn.prototype.has=function(n){var t=this.__data__;return Vi?t[n]!==T:oi.call(t,n)},Mn.prototype.set=function(n,t){var r=this.__data__;return this.size+=this.has(n)?0:1,r[n]=Vi&&t===T?"__lodash_hash_undefined__":t,this},Tn.prototype.clear=function(){this.__data__=[],this.size=0},Tn.prototype.delete=function(n){var t=this.__data__;return n=ft(t,n),!(0>n)&&(n==t.length-1?t.pop():xi.call(t,n,1),
--this.size,true)},Tn.prototype.get=function(n){var t=this.__data__;return n=ft(t,n),0>n?T:t[n][1]},Tn.prototype.has=function(n){return-1<ft(this.__data__,n)},Tn.prototype.set=function(n,t){var r=this.__data__,e=ft(r,n);return 0>e?(++this.size,r.push([n,t])):r[e][1]=t,this},Fn.prototype.clear=function(){this.size=0,this.__data__={hash:new Mn,map:new(Ni||Tn),string:new Mn}},Fn.prototype.delete=function(n){return n=be(this,n).delete(n),this.size-=n?1:0,n},Fn.prototype.get=function(n){return be(this,n).get(n);
},Fn.prototype.has=function(n){return be(this,n).has(n)},Fn.prototype.set=function(n,t){var r=be(this,n),e=r.size;return r.set(n,t),this.size+=r.size==e?0:1,this},Nn.prototype.add=Nn.prototype.push=function(n){return this.__data__.set(n,"__lodash_hash_undefined__"),this},Nn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.clear=function(){this.__data__=new Tn,this.size=0},Zn.prototype.delete=function(n){var t=this.__data__;return n=t.delete(n),this.size=t.size,n},Zn.prototype.get=function(n){
return this.__data__.get(n)},Zn.prototype.has=function(n){return this.__data__.has(n)},Zn.prototype.set=function(n,t){var r=this.__data__;if(r instanceof Tn){var e=r.__data__;if(!Ni||199>e.length)return e.push([n,t]),this.size=++r.size,this;r=this.__data__=new Fn(e)}return r.set(n,t),this.size=r.size,this};var uo=Fr(mt),io=Fr(At,true),oo=Nr(),fo=Nr(true),co=Ki?function(n,t){return Ki.set(n,t),n}:$u,ao=Ai?function(n,t){return Ai(n,"toString",{configurable:true,enumerable:false,value:Tu(t),writable:true})}:$u,lo=Ei||function(n){
return $n.clearTimeout(n)},so=Zi&&1/U(new Zi([,-0]))[1]==$?function(n){return new Zi(n)}:Pu,ho=Ki?function(n){return Ki.get(n)}:Pu,po=Ri?function(n){return null==n?[]:(n=Qu(n),i(Ri(n),function(t){return bi.call(n,t)}))}:qu,_o=Ri?function(n){for(var t=[];n;)a(t,po(n)),n=di(n);return t}:qu,vo=Ot;(Fi&&"[object DataView]"!=vo(new Fi(new ArrayBuffer(1)))||Ni&&"[object Map]"!=vo(new Ni)||Pi&&"[object Promise]"!=vo(Pi.resolve())||Zi&&"[object Set]"!=vo(new Zi)||qi&&"[object WeakMap]"!=vo(new qi))&&(vo=function(n){
var t=Ot(n);if(n=(n="[object Object]"==t?n.constructor:T)?Te(n):"")switch(n){case Hi:return"[object DataView]";case Ji:return"[object Map]";case Yi:return"[object Promise]";case Qi:return"[object Set]";case Xi:return"[object WeakMap]"}return t});var go=ui?_u:Vu,yo=Ce(co),bo=Si||function(n,t){return $n.setTimeout(n,t)},xo=Ce(ao),jo=function(n){n=cu(n,function(n){return 500===t.size&&t.clear(),n});var t=n.cache;return n}(function(n){var t=[];return 46===n.charCodeAt(0)&&t.push(""),n.replace(tn,function(n,r,e,u){
t.push(e?u.replace(hn,"$1"):r||n)}),t}),wo=fr(function(n,t){return hu(n)?yt(n,wt(t,1,hu,true)):[]}),mo=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),ye(r,2)):[]}),Ao=fr(function(n,t){var r=Ve(t);return hu(r)&&(r=T),hu(n)?yt(n,wt(t,1,hu,true),T,r):[]}),Eo=fr(function(n){var t=c(n,Er);return t.length&&t[0]===n[0]?Wt(t):[]}),ko=fr(function(n){var t=Ve(n),r=c(n,Er);return t===Ve(r)?t=T:r.pop(),r.length&&r[0]===n[0]?Wt(r,ye(t,2)):[]}),So=fr(function(n){var t=Ve(n),r=c(n,Er);return(t=typeof t=="function"?t:T)&&r.pop(),
r.length&&r[0]===n[0]?Wt(r,T,t):[]}),Oo=fr(Ke),Io=pe(function(n,t){var r=null==n?0:n.length,e=ht(n,t);return ur(n,c(t,function(n){return Se(n,r)?+n:n}).sort(Wr)),e}),Ro=fr(function(n){return br(wt(n,1,hu,true))}),zo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),br(wt(n,1,hu,true),ye(t,2))}),Wo=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return br(wt(n,1,hu,true),T,t)}),Bo=fr(function(n,t){return hu(n)?yt(n,t):[]}),Lo=fr(function(n){return mr(i(n,hu))}),Uo=fr(function(n){var t=Ve(n);return hu(t)&&(t=T),
mr(i(n,hu),ye(t,2))}),Co=fr(function(n){var t=Ve(n),t=typeof t=="function"?t:T;return mr(i(n,hu),T,t)}),Do=fr(He),Mo=fr(function(n){var t=n.length,t=1<t?n[t-1]:T,t=typeof t=="function"?(n.pop(),t):T;return Je(n,t)}),To=pe(function(n){function t(t){return ht(t,n)}var r=n.length,e=r?n[0]:0,u=this.__wrapped__;return!(1<r||this.__actions__.length)&&u instanceof Un&&Se(e)?(u=u.slice(e,+e+(r?1:0)),u.__actions__.push({func:Qe,args:[t],thisArg:T}),new On(u,this.__chain__).thru(function(n){return r&&!n.length&&n.push(T),
n})):this.thru(t)}),$o=Tr(function(n,t,r){oi.call(n,r)?++n[r]:st(n,r,1)}),Fo=Gr(Ne),No=Gr(Pe),Po=Tr(function(n,t,r){oi.call(n,r)?n[r].push(t):st(n,r,[t])}),Zo=fr(function(t,r,e){var u=-1,i=typeof r=="function",o=su(t)?Ku(t.length):[];return uo(t,function(t){o[++u]=i?n(r,t,e):Lt(t,r,e)}),o}),qo=Tr(function(n,t,r){st(n,r,t)}),Vo=Tr(function(n,t,r){n[r?0:1].push(t)},function(){return[[],[]]}),Ko=fr(function(n,t){if(null==n)return[];var r=t.length;return 1<r&&Oe(n,t[0],t[1])?t=[]:2<r&&Oe(t[0],t[1],t[2])&&(t=[t[0]]),
Xt(n,wt(t,1),[])}),Go=ki||function(){return $n.Date.now()},Ho=fr(function(n,t,r){var e=1;if(r.length)var u=L(r,de(Ho)),e=32|e;return fe(n,e,t,r,u)}),Jo=fr(function(n,t,r){var e=3;if(r.length)var u=L(r,de(Jo)),e=32|e;return fe(t,e,n,r,u)}),Yo=fr(function(n,t){return dt(n,1,t)}),Qo=fr(function(n,t,r){return dt(n,Su(t)||0,r)});cu.Cache=Fn;var Xo=fr(function(t,r){r=1==r.length&&ff(r[0])?c(r[0],k(ye())):c(wt(r,1),k(ye()));var e=r.length;return fr(function(u){for(var i=-1,o=Ci(u.length,e);++i<o;)u[i]=r[i].call(this,u[i]);
return n(t,this,u)})}),nf=fr(function(n,t){return fe(n,32,T,t,L(t,de(nf)))}),tf=fr(function(n,t){return fe(n,64,T,t,L(t,de(tf)))}),rf=pe(function(n,t){return fe(n,256,T,T,T,t)}),ef=ee(It),uf=ee(function(n,t){return n>=t}),of=Ut(function(){return arguments}())?Ut:function(n){return yu(n)&&oi.call(n,"callee")&&!bi.call(n,"callee")},ff=Ku.isArray,cf=Vn?k(Vn):Ct,af=zi||Vu,lf=Kn?k(Kn):Dt,sf=Gn?k(Gn):Tt,hf=Hn?k(Hn):Nt,pf=Jn?k(Jn):Pt,_f=Yn?k(Yn):Zt,vf=ee(Kt),gf=ee(function(n,t){return n<=t}),df=$r(function(n,t){
if(ze(t)||su(t))Cr(t,Wu(t),n);else for(var r in t)oi.call(t,r)&&ot(n,r,t[r])}),yf=$r(function(n,t){Cr(t,Bu(t),n)}),bf=$r(function(n,t,r,e){Cr(t,Bu(t),n,e)}),xf=$r(function(n,t,r,e){Cr(t,Wu(t),n,e)}),jf=pe(ht),wf=fr(function(n,t){n=Qu(n);var r=-1,e=t.length,u=2<e?t[2]:T;for(u&&Oe(t[0],t[1],u)&&(e=1);++r<e;)for(var u=t[r],i=Bu(u),o=-1,f=i.length;++o<f;){var c=i[o],a=n[c];(a===T||lu(a,ei[c])&&!oi.call(n,c))&&(n[c]=u[c])}return n}),mf=fr(function(t){return t.push(T,ae),n(Of,T,t)}),Af=Yr(function(n,t,r){
null!=t&&typeof t.toString!="function"&&(t=ai.call(t)),n[t]=r},Tu($u)),Ef=Yr(function(n,t,r){null!=t&&typeof t.toString!="function"&&(t=ai.call(t)),oi.call(n,t)?n[t].push(r):n[t]=[r]},ye),kf=fr(Lt),Sf=$r(function(n,t,r){Yt(n,t,r)}),Of=$r(function(n,t,r,e){Yt(n,t,r,e)}),If=pe(function(n,t){var r={};if(null==n)return r;var e=false;t=c(t,function(t){return t=Sr(t,n),e||(e=1<t.length),t}),Cr(n,ve(n),r),e&&(r=_t(r,7,le));for(var u=t.length;u--;)xr(r,t[u]);return r}),Rf=pe(function(n,t){return null==n?{}:nr(n,t);
}),zf=oe(Wu),Wf=oe(Bu),Bf=qr(function(n,t,r){return t=t.toLowerCase(),n+(r?Cu(t):t)}),Lf=qr(function(n,t,r){return n+(r?"-":"")+t.toLowerCase()}),Uf=qr(function(n,t,r){return n+(r?" ":"")+t.toLowerCase()}),Cf=Zr("toLowerCase"),Df=qr(function(n,t,r){return n+(r?"_":"")+t.toLowerCase()}),Mf=qr(function(n,t,r){return n+(r?" ":"")+$f(t)}),Tf=qr(function(n,t,r){return n+(r?" ":"")+t.toUpperCase()}),$f=Zr("toUpperCase"),Ff=fr(function(t,r){try{return n(t,T,r)}catch(n){return pu(n)?n:new Hu(n)}}),Nf=pe(function(n,t){
return r(t,function(t){t=Me(t),st(n,t,Ho(n[t],n))}),n}),Pf=Hr(),Zf=Hr(true),qf=fr(function(n,t){return function(r){return Lt(r,n,t)}}),Vf=fr(function(n,t){return function(r){return Lt(n,r,t)}}),Kf=Xr(c),Gf=Xr(u),Hf=Xr(h),Jf=re(),Yf=re(true),Qf=Qr(function(n,t){return n+t},0),Xf=ie("ceil"),nc=Qr(function(n,t){return n/t},1),tc=ie("floor"),rc=Qr(function(n,t){return n*t},1),ec=ie("round"),uc=Qr(function(n,t){return n-t},0);return An.after=function(n,t){if(typeof t!="function")throw new ti("Expected a function");
return n=Eu(n),function(){if(1>--n)return t.apply(this,arguments)}},An.ary=eu,An.assign=df,An.assignIn=yf,An.assignInWith=bf,An.assignWith=xf,An.at=jf,An.before=uu,An.bind=Ho,An.bindAll=Nf,An.bindKey=Jo,An.castArray=function(){if(!arguments.length)return[];var n=arguments[0];return ff(n)?n:[n]},An.chain=Ye,An.chunk=function(n,t,r){if(t=(r?Oe(n,t,r):t===T)?1:Ui(Eu(t),0),r=null==n?0:n.length,!r||1>t)return[];for(var e=0,u=0,i=Ku(Oi(r/t));e<r;)i[u++]=hr(n,e,e+=t);return i},An.compact=function(n){for(var t=-1,r=null==n?0:n.length,e=0,u=[];++t<r;){
var i=n[t];i&&(u[e++]=i)}return u},An.concat=function(){var n=arguments.length;if(!n)return[];for(var t=Ku(n-1),r=arguments[0];n--;)t[n-1]=arguments[n];return a(ff(r)?Ur(r):[r],wt(t,1))},An.cond=function(t){var r=null==t?0:t.length,e=ye();return t=r?c(t,function(n){if("function"!=typeof n[1])throw new ti("Expected a function");return[e(n[0]),n[1]]}):[],fr(function(e){for(var u=-1;++u<r;){var i=t[u];if(n(i[0],this,e))return n(i[1],this,e)}})},An.conforms=function(n){return vt(_t(n,1))},An.constant=Tu,
An.countBy=$o,An.create=function(n,t){var r=eo(n);return null==t?r:at(r,t)},An.curry=iu,An.curryRight=ou,An.debounce=fu,An.defaults=wf,An.defaultsDeep=mf,An.defer=Yo,An.delay=Qo,An.difference=wo,An.differenceBy=mo,An.differenceWith=Ao,An.drop=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),hr(n,0>t?0:t,e)):[]},An.dropRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),t=e-t,hr(n,0,0>t?0:t)):[]},An.dropRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true,true):[];
},An.dropWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),true):[]},An.fill=function(n,t,r,e){var u=null==n?0:n.length;if(!u)return[];for(r&&typeof r!="number"&&Oe(n,t,r)&&(r=0,e=u),u=n.length,r=Eu(r),0>r&&(r=-r>u?0:u+r),e=e===T||e>u?u:Eu(e),0>e&&(e+=u),e=r>e?0:ku(e);r<e;)n[r++]=t;return n},An.filter=function(n,t){return(ff(n)?i:jt)(n,ye(t,3))},An.flatMap=function(n,t){return wt(ru(n,t),1)},An.flatMapDeep=function(n,t){return wt(ru(n,t),$)},An.flatMapDepth=function(n,t,r){return r=r===T?1:Eu(r),
wt(ru(n,t),r)},An.flatten=Ze,An.flattenDeep=function(n){return(null==n?0:n.length)?wt(n,$):[]},An.flattenDepth=function(n,t){return null!=n&&n.length?(t=t===T?1:Eu(t),wt(n,t)):[]},An.flip=function(n){return fe(n,512)},An.flow=Pf,An.flowRight=Zf,An.fromPairs=function(n){for(var t=-1,r=null==n?0:n.length,e={};++t<r;){var u=n[t];e[u[0]]=u[1]}return e},An.functions=function(n){return null==n?[]:Et(n,Wu(n))},An.functionsIn=function(n){return null==n?[]:Et(n,Bu(n))},An.groupBy=Po,An.initial=function(n){
return(null==n?0:n.length)?hr(n,0,-1):[]},An.intersection=Eo,An.intersectionBy=ko,An.intersectionWith=So,An.invert=Af,An.invertBy=Ef,An.invokeMap=Zo,An.iteratee=Fu,An.keyBy=qo,An.keys=Wu,An.keysIn=Bu,An.map=ru,An.mapKeys=function(n,t){var r={};return t=ye(t,3),mt(n,function(n,e,u){st(r,t(n,e,u),n)}),r},An.mapValues=function(n,t){var r={};return t=ye(t,3),mt(n,function(n,e,u){st(r,e,t(n,e,u))}),r},An.matches=function(n){return Ht(_t(n,1))},An.matchesProperty=function(n,t){return Jt(n,_t(t,1))},An.memoize=cu,
An.merge=Sf,An.mergeWith=Of,An.method=qf,An.methodOf=Vf,An.mixin=Nu,An.negate=au,An.nthArg=function(n){return n=Eu(n),fr(function(t){return Qt(t,n)})},An.omit=If,An.omitBy=function(n,t){return Lu(n,au(ye(t)))},An.once=function(n){return uu(2,n)},An.orderBy=function(n,t,r,e){return null==n?[]:(ff(t)||(t=null==t?[]:[t]),r=e?T:r,ff(r)||(r=null==r?[]:[r]),Xt(n,t,r))},An.over=Kf,An.overArgs=Xo,An.overEvery=Gf,An.overSome=Hf,An.partial=nf,An.partialRight=tf,An.partition=Vo,An.pick=Rf,An.pickBy=Lu,An.property=Zu,
An.propertyOf=function(n){return function(t){return null==n?T:kt(n,t)}},An.pull=Oo,An.pullAll=Ke,An.pullAllBy=function(n,t,r){return n&&n.length&&t&&t.length?er(n,t,ye(r,2)):n},An.pullAllWith=function(n,t,r){return n&&n.length&&t&&t.length?er(n,t,T,r):n},An.pullAt=Io,An.range=Jf,An.rangeRight=Yf,An.rearg=rf,An.reject=function(n,t){return(ff(n)?i:jt)(n,au(ye(t,3)))},An.remove=function(n,t){var r=[];if(!n||!n.length)return r;var e=-1,u=[],i=n.length;for(t=ye(t,3);++e<i;){var o=n[e];t(o,e,n)&&(r.push(o),
u.push(e))}return ur(n,u),r},An.rest=function(n,t){if(typeof n!="function")throw new ti("Expected a function");return t=t===T?t:Eu(t),fr(n,t)},An.reverse=Ge,An.sampleSize=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:Eu(t),(ff(n)?et:ar)(n,t)},An.set=function(n,t,r){return null==n?n:lr(n,t,r)},An.setWith=function(n,t,r,e){return e=typeof e=="function"?e:T,null==n?n:lr(n,t,r,e)},An.shuffle=function(n){return(ff(n)?ut:sr)(n)},An.slice=function(n,t,r){var e=null==n?0:n.length;return e?(r&&typeof r!="number"&&Oe(n,t,r)?(t=0,
r=e):(t=null==t?0:Eu(t),r=r===T?e:Eu(r)),hr(n,t,r)):[]},An.sortBy=Ko,An.sortedUniq=function(n){return n&&n.length?gr(n):[]},An.sortedUniqBy=function(n,t){return n&&n.length?gr(n,ye(t,2)):[]},An.split=function(n,t,r){return r&&typeof r!="number"&&Oe(n,t,r)&&(t=r=T),r=r===T?4294967295:r>>>0,r?(n=Iu(n))&&(typeof t=="string"||null!=t&&!hf(t))&&(t=yr(t),!t&&Rn.test(n))?Or(M(n),0,r):n.split(t,r):[]},An.spread=function(t,r){if(typeof t!="function")throw new ti("Expected a function");return r=null==r?0:Ui(Eu(r),0),
fr(function(e){var u=e[r];return e=Or(e,0,r),u&&a(e,u),n(t,this,e)})},An.tail=function(n){var t=null==n?0:n.length;return t?hr(n,1,t):[]},An.take=function(n,t,r){return n&&n.length?(t=r||t===T?1:Eu(t),hr(n,0,0>t?0:t)):[]},An.takeRight=function(n,t,r){var e=null==n?0:n.length;return e?(t=r||t===T?1:Eu(t),t=e-t,hr(n,0>t?0:t,e)):[]},An.takeRightWhile=function(n,t){return n&&n.length?jr(n,ye(t,3),false,true):[]},An.takeWhile=function(n,t){return n&&n.length?jr(n,ye(t,3)):[]},An.tap=function(n,t){return t(n),
n},An.throttle=function(n,t,r){var e=true,u=true;if(typeof n!="function")throw new ti("Expected a function");return du(r)&&(e="leading"in r?!!r.leading:e,u="trailing"in r?!!r.trailing:u),fu(n,t,{leading:e,maxWait:t,trailing:u})},An.thru=Qe,An.toArray=mu,An.toPairs=zf,An.toPairsIn=Wf,An.toPath=function(n){return ff(n)?c(n,Me):wu(n)?[n]:Ur(jo(Iu(n)))},An.toPlainObject=Ou,An.transform=function(n,t,e){var u=ff(n),i=u||af(n)||_f(n);if(t=ye(t,4),null==e){var o=n&&n.constructor;e=i?u?new o:[]:du(n)&&_u(o)?eo(di(n)):{};
}return(i?r:mt)(n,function(n,r,u){return t(e,n,r,u)}),e},An.unary=function(n){return eu(n,1)},An.union=Ro,An.unionBy=zo,An.unionWith=Wo,An.uniq=function(n){return n&&n.length?br(n):[]},An.uniqBy=function(n,t){return n&&n.length?br(n,ye(t,2)):[]},An.uniqWith=function(n,t){return t=typeof t=="function"?t:T,n&&n.length?br(n,T,t):[]},An.unset=function(n,t){return null==n||xr(n,t)},An.unzip=He,An.unzipWith=Je,An.update=function(n,t,r){return null==n?n:lr(n,t,kr(r)(kt(n,t)),void 0)},An.updateWith=function(n,t,r,e){
return e=typeof e=="function"?e:T,null!=n&&(n=lr(n,t,kr(r)(kt(n,t)),e)),n},An.values=Uu,An.valuesIn=function(n){return null==n?[]:S(n,Bu(n))},An.without=Bo,An.words=Mu,An.wrap=function(n,t){return nf(kr(t),n)},An.xor=Lo,An.xorBy=Uo,An.xorWith=Co,An.zip=Do,An.zipObject=function(n,t){return Ar(n||[],t||[],ot)},An.zipObjectDeep=function(n,t){return Ar(n||[],t||[],lr)},An.zipWith=Mo,An.entries=zf,An.entriesIn=Wf,An.extend=yf,An.extendWith=bf,Nu(An,An),An.add=Qf,An.attempt=Ff,An.camelCase=Bf,An.capitalize=Cu,
An.ceil=Xf,An.clamp=function(n,t,r){return r===T&&(r=t,t=T),r!==T&&(r=Su(r),r=r===r?r:0),t!==T&&(t=Su(t),t=t===t?t:0),pt(Su(n),t,r)},An.clone=function(n){return _t(n,4)},An.cloneDeep=function(n){return _t(n,5)},An.cloneDeepWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,5,t)},An.cloneWith=function(n,t){return t=typeof t=="function"?t:T,_t(n,4,t)},An.conformsTo=function(n,t){return null==t||gt(n,t,Wu(t))},An.deburr=Du,An.defaultTo=function(n,t){return null==n||n!==n?t:n},An.divide=nc,An.endsWith=function(n,t,r){
n=Iu(n),t=yr(t);var e=n.length,e=r=r===T?e:pt(Eu(r),0,e);return r-=t.length,0<=r&&n.slice(r,e)==t},An.eq=lu,An.escape=function(n){return(n=Iu(n))&&H.test(n)?n.replace(K,nt):n},An.escapeRegExp=function(n){return(n=Iu(n))&&en.test(n)?n.replace(rn,"\\$&"):n},An.every=function(n,t,r){var e=ff(n)?u:bt;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.find=Fo,An.findIndex=Ne,An.findKey=function(n,t){return p(n,ye(t,3),mt)},An.findLast=No,An.findLastIndex=Pe,An.findLastKey=function(n,t){return p(n,ye(t,3),At);
},An.floor=tc,An.forEach=nu,An.forEachRight=tu,An.forIn=function(n,t){return null==n?n:oo(n,ye(t,3),Bu)},An.forInRight=function(n,t){return null==n?n:fo(n,ye(t,3),Bu)},An.forOwn=function(n,t){return n&&mt(n,ye(t,3))},An.forOwnRight=function(n,t){return n&&At(n,ye(t,3))},An.get=Ru,An.gt=ef,An.gte=uf,An.has=function(n,t){return null!=n&&we(n,t,Rt)},An.hasIn=zu,An.head=qe,An.identity=$u,An.includes=function(n,t,r,e){return n=su(n)?n:Uu(n),r=r&&!e?Eu(r):0,e=n.length,0>r&&(r=Ui(e+r,0)),ju(n)?r<=e&&-1<n.indexOf(t,r):!!e&&-1<v(n,t,r);
},An.indexOf=function(n,t,r){var e=null==n?0:n.length;return e?(r=null==r?0:Eu(r),0>r&&(r=Ui(e+r,0)),v(n,t,r)):-1},An.inRange=function(n,t,r){return t=Au(t),r===T?(r=t,t=0):r=Au(r),n=Su(n),n>=Ci(t,r)&&n<Ui(t,r)},An.invoke=kf,An.isArguments=of,An.isArray=ff,An.isArrayBuffer=cf,An.isArrayLike=su,An.isArrayLikeObject=hu,An.isBoolean=function(n){return true===n||false===n||yu(n)&&"[object Boolean]"==Ot(n)},An.isBuffer=af,An.isDate=lf,An.isElement=function(n){return yu(n)&&1===n.nodeType&&!xu(n)},An.isEmpty=function(n){
if(null==n)return true;if(su(n)&&(ff(n)||typeof n=="string"||typeof n.splice=="function"||af(n)||_f(n)||of(n)))return!n.length;var t=vo(n);if("[object Map]"==t||"[object Set]"==t)return!n.size;if(ze(n))return!Vt(n).length;for(var r in n)if(oi.call(n,r))return false;return true},An.isEqual=function(n,t){return Mt(n,t)},An.isEqualWith=function(n,t,r){var e=(r=typeof r=="function"?r:T)?r(n,t):T;return e===T?Mt(n,t,T,r):!!e},An.isError=pu,An.isFinite=function(n){return typeof n=="number"&&Wi(n)},An.isFunction=_u,
An.isInteger=vu,An.isLength=gu,An.isMap=sf,An.isMatch=function(n,t){return n===t||$t(n,t,xe(t))},An.isMatchWith=function(n,t,r){return r=typeof r=="function"?r:T,$t(n,t,xe(t),r)},An.isNaN=function(n){return bu(n)&&n!=+n},An.isNative=function(n){if(go(n))throw new Hu("Unsupported core-js use. Try https://npms.io/search?q=ponyfill.");return Ft(n)},An.isNil=function(n){return null==n},An.isNull=function(n){return null===n},An.isNumber=bu,An.isObject=du,An.isObjectLike=yu,An.isPlainObject=xu,An.isRegExp=hf,
An.isSafeInteger=function(n){return vu(n)&&-9007199254740991<=n&&9007199254740991>=n},An.isSet=pf,An.isString=ju,An.isSymbol=wu,An.isTypedArray=_f,An.isUndefined=function(n){return n===T},An.isWeakMap=function(n){return yu(n)&&"[object WeakMap]"==vo(n)},An.isWeakSet=function(n){return yu(n)&&"[object WeakSet]"==Ot(n)},An.join=function(n,t){return null==n?"":Bi.call(n,t)},An.kebabCase=Lf,An.last=Ve,An.lastIndexOf=function(n,t,r){var e=null==n?0:n.length;if(!e)return-1;var u=e;if(r!==T&&(u=Eu(r),u=0>u?Ui(e+u,0):Ci(u,e-1)),
t===t){for(r=u+1;r--&&n[r]!==t;);n=r}else n=_(n,d,u,true);return n},An.lowerCase=Uf,An.lowerFirst=Cf,An.lt=vf,An.lte=gf,An.max=function(n){return n&&n.length?xt(n,$u,It):T},An.maxBy=function(n,t){return n&&n.length?xt(n,ye(t,2),It):T},An.mean=function(n){return y(n,$u)},An.meanBy=function(n,t){return y(n,ye(t,2))},An.min=function(n){return n&&n.length?xt(n,$u,Kt):T},An.minBy=function(n,t){return n&&n.length?xt(n,ye(t,2),Kt):T},An.stubArray=qu,An.stubFalse=Vu,An.stubObject=function(){return{}},An.stubString=function(){
return""},An.stubTrue=function(){return true},An.multiply=rc,An.nth=function(n,t){return n&&n.length?Qt(n,Eu(t)):T},An.noConflict=function(){return $n._===this&&($n._=si),this},An.noop=Pu,An.now=Go,An.pad=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return!t||e>=t?n:(t=(t-e)/2,ne(Ii(t),r)+n+ne(Oi(t),r))},An.padEnd=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return t&&e<t?n+ne(t-e,r):n},An.padStart=function(n,t,r){n=Iu(n);var e=(t=Eu(t))?D(n):0;return t&&e<t?ne(t-e,r)+n:n},An.parseInt=function(n,t,r){
return r||null==t?t=0:t&&(t=+t),Mi(Iu(n).replace(on,""),t||0)},An.random=function(n,t,r){if(r&&typeof r!="boolean"&&Oe(n,t,r)&&(t=r=T),r===T&&(typeof t=="boolean"?(r=t,t=T):typeof n=="boolean"&&(r=n,n=T)),n===T&&t===T?(n=0,t=1):(n=Au(n),t===T?(t=n,n=0):t=Au(t)),n>t){var e=n;n=t,t=e}return r||n%1||t%1?(r=Ti(),Ci(n+r*(t-n+Cn("1e-"+((r+"").length-1))),t)):ir(n,t)},An.reduce=function(n,t,r){var e=ff(n)?l:j,u=3>arguments.length;return e(n,ye(t,4),r,u,uo)},An.reduceRight=function(n,t,r){var e=ff(n)?s:j,u=3>arguments.length;
return e(n,ye(t,4),r,u,io)},An.repeat=function(n,t,r){return t=(r?Oe(n,t,r):t===T)?1:Eu(t),or(Iu(n),t)},An.replace=function(){var n=arguments,t=Iu(n[0]);return 3>n.length?t:t.replace(n[1],n[2])},An.result=function(n,t,r){t=Sr(t,n);var e=-1,u=t.length;for(u||(u=1,n=T);++e<u;){var i=null==n?T:n[Me(t[e])];i===T&&(e=u,i=r),n=_u(i)?i.call(n):i}return n},An.round=ec,An.runInContext=x,An.sample=function(n){return(ff(n)?Qn:cr)(n)},An.size=function(n){if(null==n)return 0;if(su(n))return ju(n)?D(n):n.length;
var t=vo(n);return"[object Map]"==t||"[object Set]"==t?n.size:Vt(n).length},An.snakeCase=Df,An.some=function(n,t,r){var e=ff(n)?h:pr;return r&&Oe(n,t,r)&&(t=T),e(n,ye(t,3))},An.sortedIndex=function(n,t){return _r(n,t)},An.sortedIndexBy=function(n,t,r){return vr(n,t,ye(r,2))},An.sortedIndexOf=function(n,t){var r=null==n?0:n.length;if(r){var e=_r(n,t);if(e<r&&lu(n[e],t))return e}return-1},An.sortedLastIndex=function(n,t){return _r(n,t,true)},An.sortedLastIndexBy=function(n,t,r){return vr(n,t,ye(r,2),true);
},An.sortedLastIndexOf=function(n,t){if(null==n?0:n.length){var r=_r(n,t,true)-1;if(lu(n[r],t))return r}return-1},An.startCase=Mf,An.startsWith=function(n,t,r){return n=Iu(n),r=null==r?0:pt(Eu(r),0,n.length),t=yr(t),n.slice(r,r+t.length)==t},An.subtract=uc,An.sum=function(n){return n&&n.length?m(n,$u):0},An.sumBy=function(n,t){return n&&n.length?m(n,ye(t,2)):0},An.template=function(n,t,r){var e=An.templateSettings;r&&Oe(n,t,r)&&(t=T),n=Iu(n),t=bf({},t,e,ce),r=bf({},t.imports,e.imports,ce);var u,i,o=Wu(r),f=S(r,o),c=0;
r=t.interpolate||jn;var a="__p+='";r=Xu((t.escape||jn).source+"|"+r.source+"|"+(r===Q?pn:jn).source+"|"+(t.evaluate||jn).source+"|$","g");var l=oi.call(t,"sourceURL")?"//# sourceURL="+(t.sourceURL+"").replace(/[\r\n]/g," ")+"\n":"";if(n.replace(r,function(t,r,e,o,f,l){return e||(e=o),a+=n.slice(c,l).replace(wn,z),r&&(u=true,a+="'+__e("+r+")+'"),f&&(i=true,a+="';"+f+";\n__p+='"),e&&(a+="'+((__t=("+e+"))==null?'':__t)+'"),c=l+t.length,t}),a+="';",(t=oi.call(t,"variable")&&t.variable)||(a="with(obj){"+a+"}"),
a=(i?a.replace(P,""):a).replace(Z,"$1").replace(q,"$1;"),a="function("+(t||"obj")+"){"+(t?"":"obj||(obj={});")+"var __t,__p=''"+(u?",__e=_.escape":"")+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+a+"return __p}",t=Ff(function(){return Ju(o,l+"return "+a).apply(T,f)}),t.source=a,pu(t))throw t;return t},An.times=function(n,t){if(n=Eu(n),1>n||9007199254740991<n)return[];var r=4294967295,e=Ci(n,4294967295);for(t=ye(t),n-=4294967295,e=A(e,t);++r<n;)t(r);return e},An.toFinite=Au,
An.toInteger=Eu,An.toLength=ku,An.toLower=function(n){return Iu(n).toLowerCase()},An.toNumber=Su,An.toSafeInteger=function(n){return n?pt(Eu(n),-9007199254740991,9007199254740991):0===n?n:0},An.toString=Iu,An.toUpper=function(n){return Iu(n).toUpperCase()},An.trim=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(un,""):n&&(t=yr(t))?(n=M(n),r=M(t),t=I(n,r),r=R(n,r)+1,Or(n,t,r).join("")):n},An.trimEnd=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(fn,""):n&&(t=yr(t))?(n=M(n),t=R(n,M(t))+1,
Or(n,0,t).join("")):n},An.trimStart=function(n,t,r){return(n=Iu(n))&&(r||t===T)?n.replace(on,""):n&&(t=yr(t))?(n=M(n),t=I(n,M(t)),Or(n,t).join("")):n},An.truncate=function(n,t){var r=30,e="...";if(du(t))var u="separator"in t?t.separator:u,r="length"in t?Eu(t.length):r,e="omission"in t?yr(t.omission):e;n=Iu(n);var i=n.length;if(Rn.test(n))var o=M(n),i=o.length;if(r>=i)return n;if(i=r-D(e),1>i)return e;if(r=o?Or(o,0,i).join(""):n.slice(0,i),u===T)return r+e;if(o&&(i+=r.length-i),hf(u)){if(n.slice(i).search(u)){
var f=r;for(u.global||(u=Xu(u.source,Iu(_n.exec(u))+"g")),u.lastIndex=0;o=u.exec(f);)var c=o.index;r=r.slice(0,c===T?i:c)}}else n.indexOf(yr(u),i)!=i&&(u=r.lastIndexOf(u),-1<u&&(r=r.slice(0,u)));return r+e},An.unescape=function(n){return(n=Iu(n))&&G.test(n)?n.replace(V,tt):n},An.uniqueId=function(n){var t=++fi;return Iu(n)+t},An.upperCase=Tf,An.upperFirst=$f,An.each=nu,An.eachRight=tu,An.first=qe,Nu(An,function(){var n={};return mt(An,function(t,r){oi.call(An.prototype,r)||(n[r]=t)}),n}(),{chain:false
}),An.VERSION="4.17.15",r("bind bindKey curry curryRight partial partialRight".split(" "),function(n){An[n].placeholder=An}),r(["drop","take"],function(n,t){Un.prototype[n]=function(r){r=r===T?1:Ui(Eu(r),0);var e=this.__filtered__&&!t?new Un(this):this.clone();return e.__filtered__?e.__takeCount__=Ci(r,e.__takeCount__):e.__views__.push({size:Ci(r,4294967295),type:n+(0>e.__dir__?"Right":"")}),e},Un.prototype[n+"Right"]=function(t){return this.reverse()[n](t).reverse()}}),r(["filter","map","takeWhile"],function(n,t){
var r=t+1,e=1==r||3==r;Un.prototype[n]=function(n){var t=this.clone();return t.__iteratees__.push({iteratee:ye(n,3),type:r}),t.__filtered__=t.__filtered__||e,t}}),r(["head","last"],function(n,t){var r="take"+(t?"Right":"");Un.prototype[n]=function(){return this[r](1).value()[0]}}),r(["initial","tail"],function(n,t){var r="drop"+(t?"":"Right");Un.prototype[n]=function(){return this.__filtered__?new Un(this):this[r](1)}}),Un.prototype.compact=function(){return this.filter($u)},Un.prototype.find=function(n){
return this.filter(n).head()},Un.prototype.findLast=function(n){return this.reverse().find(n)},Un.prototype.invokeMap=fr(function(n,t){return typeof n=="function"?new Un(this):this.map(function(r){return Lt(r,n,t)})}),Un.prototype.reject=function(n){return this.filter(au(ye(n)))},Un.prototype.slice=function(n,t){n=Eu(n);var r=this;return r.__filtered__&&(0<n||0>t)?new Un(r):(0>n?r=r.takeRight(-n):n&&(r=r.drop(n)),t!==T&&(t=Eu(t),r=0>t?r.dropRight(-t):r.take(t-n)),r)},Un.prototype.takeRightWhile=function(n){
return this.reverse().takeWhile(n).reverse()},Un.prototype.toArray=function(){return this.take(4294967295)},mt(Un.prototype,function(n,t){var r=/^(?:filter|find|map|reject)|While$/.test(t),e=/^(?:head|last)$/.test(t),u=An[e?"take"+("last"==t?"Right":""):t],i=e||/^find/.test(t);u&&(An.prototype[t]=function(){function t(n){return n=u.apply(An,a([n],f)),e&&h?n[0]:n}var o=this.__wrapped__,f=e?[1]:arguments,c=o instanceof Un,l=f[0],s=c||ff(o);s&&r&&typeof l=="function"&&1!=l.length&&(c=s=false);var h=this.__chain__,p=!!this.__actions__.length,l=i&&!h,c=c&&!p;
return!i&&s?(o=c?o:new Un(this),o=n.apply(o,f),o.__actions__.push({func:Qe,args:[t],thisArg:T}),new On(o,h)):l&&c?n.apply(this,f):(o=this.thru(t),l?e?o.value()[0]:o.value():o)})}),r("pop push shift sort splice unshift".split(" "),function(n){var t=ri[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|shift)$/.test(n);An.prototype[n]=function(){var n=arguments;if(e&&!this.__chain__){var u=this.value();return t.apply(ff(u)?u:[],n)}return this[r](function(r){return t.apply(ff(r)?r:[],n)});
}}),mt(Un.prototype,function(n,t){var r=An[t];if(r){var e=r.name+"";oi.call(Gi,e)||(Gi[e]=[]),Gi[e].push({name:t,func:r})}}),Gi[Jr(T,2).name]=[{name:"wrapper",func:T}],Un.prototype.clone=function(){var n=new Un(this.__wrapped__);return n.__actions__=Ur(this.__actions__),n.__dir__=this.__dir__,n.__filtered__=this.__filtered__,n.__iteratees__=Ur(this.__iteratees__),n.__takeCount__=this.__takeCount__,n.__views__=Ur(this.__views__),n},Un.prototype.reverse=function(){if(this.__filtered__){var n=new Un(this);
n.__dir__=-1,n.__filtered__=true}else n=this.clone(),n.__dir__*=-1;return n},Un.prototype.value=function(){var n,t=this.__wrapped__.value(),r=this.__dir__,e=ff(t),u=0>r,i=e?t.length:0;n=i;for(var o=this.__views__,f=0,c=-1,a=o.length;++c<a;){var l=o[c],s=l.size;switch(l.type){case"drop":f+=s;break;case"dropRight":n-=s;break;case"take":n=Ci(n,f+s);break;case"takeRight":f=Ui(f,n-s)}}if(n={start:f,end:n},o=n.start,f=n.end,n=f-o,o=u?f:o-1,f=this.__iteratees__,c=f.length,a=0,l=Ci(n,this.__takeCount__),!e||!u&&i==n&&l==n)return wr(t,this.__actions__);
e=[];n:for(;n--&&a<l;){for(o+=r,u=-1,i=t[o];++u<c;){var h=f[u],s=h.type,h=(0,h.iteratee)(i);if(2==s)i=h;else if(!h){if(1==s)continue n;break n}}e[a++]=i}return e},An.prototype.at=To,An.prototype.chain=function(){return Ye(this)},An.prototype.commit=function(){return new On(this.value(),this.__chain__)},An.prototype.next=function(){this.__values__===T&&(this.__values__=mu(this.value()));var n=this.__index__>=this.__values__.length;return{done:n,value:n?T:this.__values__[this.__index__++]}},An.prototype.plant=function(n){
for(var t,r=this;r instanceof En;){var e=Fe(r);e.__index__=0,e.__values__=T,t?u.__wrapped__=e:t=e;var u=e,r=r.__wrapped__}return u.__wrapped__=n,t},An.prototype.reverse=function(){var n=this.__wrapped__;return n instanceof Un?(this.__actions__.length&&(n=new Un(this)),n=n.reverse(),n.__actions__.push({func:Qe,args:[Ge],thisArg:T}),new On(n,this.__chain__)):this.thru(Ge)},An.prototype.toJSON=An.prototype.valueOf=An.prototype.value=function(){return wr(this.__wrapped__,this.__actions__)},An.prototype.first=An.prototype.head,
wi&&(An.prototype[wi]=Xe),An}();typeof define=="function"&&typeof define.amd=="object"&&define.amd?($n._=rt, define(function(){return rt})):Nn?((Nn.exports=rt)._=rt,Fn._=rt):$n._=rt}).call(this);
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
<?php return ['akta','belaten','beromd','betydelsefull','bevisad','blandande','effektiv','enastaende','energisk','fangslande','fantastisk','fint','framgangsrik','fullandad','fullgora','glansande','glomd','imponerande','inspirerad','kand','kraftfull','kraftig','kreativ','langtan','legendarisk','lidelsefull','livlig','maktig','minnesvard','oerhord,otrolig','oforglomlig','onskan','otrolig','palitlig','passionerad','praktfull','pris','professionell','saker','sallsynt','sensationell','skapande','speciell','stark','storslagen','stralande','tillfredstalld','trygg','underbar','ungdomlig','uppfylla','uppriktig','utmarkt','utstralande','vasentlig','viktig'];
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
/*! This file is auto-generated */
this.wp=this.wp||{},this.wp.wordcount=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=432)}({2:function(e,t){!function(){e.exports=this.lodash}()},432:function(e,t,n){"use strict";n.r(t);var r=n(2),o={HTMLRegExp:/<\/?[a-z][^>]*?>/gi,HTMLcommentRegExp:/<!--[\s\S]*?-->/g,spaceRegExp:/&nbsp;|&#160;/gi,HTMLEntityRegExp:/&\S+?;/g,connectorRegExp:/--|\u2014/g,removeRegExp:new RegExp(["[","!-@[-`{-~","€-¿×÷"," -⯿","⸀-⹿","]"].join(""),"g"),astralRegExp:/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,wordsRegExp:/\S\s+/g,characters_excluding_spacesRegExp:/\S/g,characters_including_spacesRegExp:/[^\f\n\r\t\v\u00AD\u2028\u2029]/g,l10n:{type:"words"}},i=function(e,t){if(e.HTMLRegExp)return t.replace(e.HTMLRegExp,"\n")},c=function(e,t){return e.astralRegExp?t.replace(e.astralRegExp,"a"):t},u=function(e,t){return e.HTMLEntityRegExp?t.replace(e.HTMLEntityRegExp,""):t},p=function(e,t){return e.connectorRegExp?t.replace(e.connectorRegExp," "):t},s=function(e,t){return e.removeRegExp?t.replace(e.removeRegExp,""):t},a=function(e,t){return e.HTMLcommentRegExp?t.replace(e.HTMLcommentRegExp,""):t},g=function(e,t){return e.shortcodesRegExp?t.replace(e.shortcodesRegExp,"\n"):t},d=function(e,t){if(e.spaceRegExp)return t.replace(e.spaceRegExp," ")},f=function(e,t){return e.HTMLEntityRegExp?t.replace(e.HTMLEntityRegExp,"a"):t};function l(e,t,n){if(""===e)return 0;if(e){var l=function(e,t){var n=Object(r.extend)(o,t);return n.shortcodes=n.l10n.shortcodes||{},n.shortcodes&&n.shortcodes.length&&(n.shortcodesRegExp=new RegExp("\\[\\/?(?:"+n.shortcodes.join("|")+")[^\\]]*?\\]","g")),n.type=e||n.l10n.type,"characters_excluding_spaces"!==n.type&&"characters_including_spaces"!==n.type&&(n.type="words"),n}(t,n),x=l[t+"RegExp"],E="words"===l.type?function(e,t,n){return e=Object(r.flow)(i.bind(this,n),a.bind(this,n),g.bind(this,n),d.bind(this,n),u.bind(this,n),p.bind(this,n),s.bind(this,n))(e),(e+="\n").match(t)}(e,x,l):function(e,t,n){return e=Object(r.flow)(i.bind(this,n),a.bind(this,n),g.bind(this,n),d.bind(this,n),c.bind(this,n),f.bind(this,n))(e),(e+="\n").match(t)}(e,x,l);return E?E.length:0}}n.d(t,"count",(function(){return l}))}});
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,61 @@
<?php
/**
* Divi admin integration.
*
* @since TODO
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Divi;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Divi class.
*/
class Divi_Admin {
use Hooker;
/**
* Class constructor.
*/
public function __construct() {
$this->init();
}
/**
* Intialize Divi admin.
*/
public function init() {
$screen = get_current_screen();
if ( 'toplevel_page_et_divi_options' === $screen->id ) {
$this->action( 'admin_enqueue_scripts', 'enqueue_divi_admin_scripts' );
}
}
/**
* Enqueue scripts for Divi admin options screen.
*/
public function enqueue_divi_admin_scripts() {
wp_enqueue_script(
'rank-math-divi-admin',
rank_math()->plugin_url() . 'includes/3rdparty/divi/assets/js/divi-admin.js',
[
'jquery',
'react',
'react-dom',
'wp-components',
'wp-element',
'wp-i18n',
'wp-polyfill',
],
rank_math()->version,
true
);
}
}
@@ -0,0 +1,355 @@
<?php
/**
* Divi integration.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Divi;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Helpers\Editor;
use RankMath\Helpers\Str;
use RankMath\Schema\DB as Schema_DB;
use RankMath\Schema\Admin as Schema_Admin;
use RankMath\Traits\Hooker;
use RankMath\Admin\Metabox\Screen;
use WP_Dependencies;
defined( 'ABSPATH' ) || exit;
/**
* Divi class.
*/
class Divi {
use Hooker;
/**
* Screen object.
*
* @var Screen
*/
private $screen;
/**
* Class constructor.
*/
public function __construct() {
$this->action( 'wp', 'init' );
}
/**
* Intialize.
*/
public function init() {
if ( ! $this->can_add_seo_tab() ) {
return;
}
$this->screen = new Screen();
$this->screen->load_screen( 'post' );
$this->action( 'template_redirect', 'set_window_lodash', 0 );
$this->action( 'wp_enqueue_scripts', 'register_rankmath_react' );
$this->action( 'wp_enqueue_scripts', 'add_json_data', 0 );
$this->action( 'wp_footer', 'footer_enqueue_scripts', 11 );
remove_action( 'wp_footer', [ rank_math()->json, 'output' ], 0 );
add_action( 'wp_footer', [ rank_math()->json, 'output' ], 11 );
$this->filter( 'script_loader_tag', 'add_et_tag', 10, 3 );
}
/**
* Set the global lodash variable.
*
* Lodash's `noConflict` would prevent UnderscoreJS from taking over the underscore (_)
* global variable. Because Underscore.js will later also be assigned to the underscore (_)
* global this function should run as early as possible.
*/
public function set_window_lodash() {
wp_register_script( 'rm-set-window-lodash', '', [ 'lodash' ], rank_math()->version, false );
wp_enqueue_script( 'rm-set-window-lodash' );
wp_add_inline_script(
'rm-set-window-lodash',
join(
"\r\n ",
[
'window.isLodash = function() {',
"if ( typeof window._ !== 'function' || typeof window._.forEach !== 'function' ) {",
'return false;',
'}',
'var isLodash = true;',
'window._.forEach(',
"[ 'cloneDeep', 'at', 'add', 'ary', 'attempt' ],",
'function( fn ) {',
"if ( isLodash && typeof window._[ fn ] !== 'function' ) {",
'isLodash = false;',
'}',
'}',
');',
'return isLodash;',
'}',
'if ( window.isLodash() ) { window.lodash = window._.noConflict(); }',
]
)
);
}
/**
* Register RankMath React and ReactDOM.
*
* Registers the native WP version of react with a custom handle for use in the
* RankMath module. Divi builder dequeues and deregisters native WP react scripts
* and replaces them with their own copy of React. Their copy might not be of the
* same version as the one RankMath requires.
*/
public function register_rankmath_react() {
$path = site_url( '/wp-includes/js/dist/vendor/' );
$suffix = wp_scripts_get_suffix();
wp_register_script( 'rm-react', "{$path}react{$suffix}.js", [ 'wp-polyfill', 'react' ], '16.13.1', true );
wp_register_script( 'rm-react-dom', "{$path}react-dom{$suffix}.js", [ 'rm-react', 'react-dom' ], '16.13.1', true );
}
/**
* Add JSON data.
*/
public function add_json_data() {
if ( Helper::has_cap( 'onpage_snippet' ) ) {
// Schema.
$schemas = $this->get_schema_data( get_the_ID() );
Helper::add_json( 'schemas', $schemas );
Helper::add_json( 'customSchemaImage', esc_url( rank_math()->plugin_url() . 'includes/modules/schema/assets/img/custom-schema-builder.jpg' ) );
// Trends.
$trends_upgrade_link = KB::get( 'pro', 'Divi General Tab Trends' );
Helper::add_json( 'trendsUpgradeLink', esc_url_raw( $trends_upgrade_link ) );
Helper::add_json( 'trendsPreviewImage', esc_url( rank_math()->plugin_url() . 'assets/admin/img/trends-preview.jpg' ) );
}
Helper::add_json(
'api',
[
'root' => esc_url_raw( get_rest_url() ),
'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ),
]
);
Helper::add_json(
'keywordsApi',
[
'url' => 'https://api.rankmath.com/ltkw/v1/',
]
);
Helper::add_json( 'links', KB::get_links() );
Helper::add_json(
'validationl10n',
[
'regexErrorDefault' => __( 'Please use the correct format.', 'rank-math' ),
'requiredErrorDefault' => __( 'This field is required.', 'rank-math' ),
'emailErrorDefault' => __( 'Please enter a valid email address.', 'rank-math' ),
'urlErrorDefault' => __( 'Please enter a valid URL.', 'rank-math' ),
]
);
Helper::add_json( 'capitalizeTitle', Helper::get_settings( 'titles.capitalize_titles' ) );
Helper::add_json( 'blogName', get_bloginfo( 'name' ) );
if ( is_admin_bar_showing() && Helper::has_cap( 'admin_bar' ) ) {
Helper::add_json( 'objectID', get_the_ID() );
Helper::add_json( 'objectType', 'post' );
}
}
/**
* Enqueue scripts.
*/
public function footer_enqueue_scripts() {
/**
* Allow other plugins to enqueue/dequeue admin styles or scripts before plugin assets.
*/
$this->do_action( 'admin/before_editor_scripts' );
$divi_deps = [
'jquery',
'lodash',
'rm-react',
'rm-react-dom',
'rm-set-window-lodash',
'et-dynamic-asset-helpers',
'wp-api-fetch',
'wp-block-editor',
'wp-components',
'wp-compose',
'wp-core-data',
'wp-data',
'wp-element',
'wp-hooks',
'wp-media-utils',
'rank-math-analyzer',
'rank-math-app',
];
if ( is_admin_bar_showing() && Helper::has_cap( 'admin_bar' ) ) {
wp_enqueue_style( 'rank-math', rank_math()->assets() . 'css/rank-math.css', null, rank_math()->version );
wp_enqueue_script( 'rank-math', rank_math()->assets() . 'js/rank-math.js', [ 'jquery' ], rank_math()->version, true );
}
wp_enqueue_style( 'rank-math-common', rank_math()->plugin_url() . 'assets/admin/css/common.css', null, rank_math()->version );
wp_enqueue_style( 'wp-components' );
wp_enqueue_style( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/divi/assets/css/divi.css', [], rank_math()->version );
wp_register_script( 'rank-math-analyzer', rank_math()->plugin_url() . 'assets/admin/js/analyzer.js', null, rank_math()->version, true );
wp_enqueue_script( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/divi/assets/js/divi.js', $divi_deps, rank_math()->version, true );
wp_enqueue_script( 'rank-math-divi-iframe', rank_math()->plugin_url() . 'includes/3rdparty/divi/assets/js/divi-iframe.js', [ 'jquery', 'lodash' ], rank_math()->version, true );
if ( Helper::is_module_active( 'rich-snippet' ) ) {
wp_enqueue_style( 'rank-math-schema', rank_math()->plugin_url() . 'includes/modules/schema/assets/css/schema.css', [ 'wp-components' ], rank_math()->version );
wp_enqueue_script( 'rank-math-schema', rank_math()->plugin_url() . 'includes/modules/schema/assets/js/schema-gutenberg.js', [ 'rank-math-editor' ], rank_math()->version, true );
wp_set_script_translations( 'rank-math-schema', 'rank-math', rank_math()->plugin_dir() . 'languages/' );
}
rank_math()->variables->setup();
rank_math()->variables->setup_json();
$this->screen->localize();
$this->print_react_containers();
/**
* Allow other plugins to enqueue/dequeue admin styles or scripts after plugin assets.
*/
$this->do_action( 'admin/editor_scripts' );
}
/**
* Add et attributes to script tags.
*
* @param string $tag The <script> tag for the enqueued script.
* @param string $handle The script's registered handle.
* @param string $src The script's source URL.
*
* @return string
*/
public function add_et_tag( $tag, $handle, $src ) {
$script_handles = [
'rm-react',
'rm-react-dom',
'lodash',
'moment',
'rank-math',
'rank-math-analyzer',
'rank-math-schema',
'rank-math-editor',
'rank-math-content-ai',
'rank-math-app',
// Scripts required by pro version.
'wp-plugins',
'jquery-ui-autocomplete',
'rank-math-pro-editor',
'rank-math-schema-pro',
'rank-math-pro-schema-filters',
'rank-math-pro-news',
];
$exclude_handles = [
'wp-util',
'wp-backbone',
'wp-plupload',
'wp-mediaelement',
'wp-color-picker',
'wp-color-picker-alpha',
'wp-embed',
'wp-hooks',
];
if ( in_array( $handle, $exclude_handles, true ) ) {
return $tag;
}
if ( Str::starts_with( 'wp-', $handle ) || in_array( $handle, $script_handles, true ) ) {
// These tags load in parent window only, not in Divi iframe.
return '<script type="text/javascript" src="' . $src . '" class="et_fb_ignore_iframe"></script>' . "\n"; // phpcs:ignore
}
return $tag;
}
/**
* Print React containers onto the screen.
*/
public function print_react_containers() {
echo '<div id="rank-math-rm-app-root" class="et_fb_ignore_iframe"></div>';
echo '<div id="rank-math-rm-settings-bar-root" class="et_fb_ignore_iframe"></div>';
}
/**
* Can add SEO in Divi Page Builder.
*
* @return bool
*/
private function can_add_seo_tab() {
if (
! Helper::is_divi_frontend_editor() ||
! defined( 'ET_BUILDER_PRODUCT_VERSION' ) ||
! version_compare( '4.9.2', ET_BUILDER_PRODUCT_VERSION, 'le' )
) {
return false;
}
/**
* Filter to show/hide SEO Tab in Divi Editor.
*/
if ( ! $this->do_filter( 'divi/add_seo_tab', true ) ) {
return false;
}
$post_type = get_post_type();
if ( $post_type && ! Helper::get_settings( 'titles.pt_' . $post_type . '_add_meta_box' ) ) {
return false;
}
return Editor::can_add_editor();
}
/**
* Get Schema Data.
*
* @param int $post_id Post ID.
*
* @return array $schemas Schema Data.
*/
private function get_schema_data( $post_id ) {
$schemas = Schema_DB::get_schemas( $post_id );
if ( ! empty( $schemas ) || metadata_exists( 'post', $post_id, 'rank_math_rich_snippet' ) ) {
return $schemas;
}
$post_type = get_post_type( $post_id );
$default_type = ucfirst( Helper::get_default_schema_type( $post_id ) );
if ( ! $default_type ) {
return [];
}
$schemas['new-9999'] = [
'@type' => $default_type,
'metadata' => [
'title' => Helper::sanitize_schema_title( $default_type ),
'type' => 'template',
'shortcode' => uniqid( 's-' ),
'isPrimary' => true,
],
];
return $schemas;
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,213 @@
<?php
/**
* Elementor integration.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Elementor;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Editor;
defined( 'ABSPATH' ) || exit;
/**
* Elementor class.
*/
class Elementor {
use Hooker;
/**
* Class constructor.
*/
public function __construct() {
$this->action( 'init', 'init' );
$this->filter( 'rank_math/frontend/robots', 'robots' );
$this->filter( 'rank_math/frontend/disable_integration', 'disable_frontend_integration' );
}
/**
* Intialize.
*/
public function init() {
if ( ! $this->can_add_seo_tab() ) {
return;
}
$this->action( 'elementor/editor/before_enqueue_scripts', 'enqueue' );
add_action( 'elementor/editor/footer', [ rank_math()->json, 'output' ], 0 );
$this->action( 'elementor/editor/footer', 'start_capturing', 0 );
$this->action( 'elementor/editor/footer', 'end_capturing', 999 );
$this->filter( 'rank_math/sitemap/content_before_parse_html_images', 'apply_builder_in_content', 10, 2 );
}
/**
* Disable frontend integration on Elementor Maintenance page.
*
* @since 1.0.91
*
* @param boolean $value Whether to run the frontend integration.
*/
public function disable_frontend_integration( $value ) {
$mode = get_option( 'elementor_maintenance_mode_mode' );
if ( ! in_array( $mode, [ 'maintenance', 'coming_soon' ], true ) ) {
return $value;
}
if ( ! get_option( 'elementor_maintenance_mode_template_id' ) ) {
return $value;
}
$exclude_mode = get_option( 'elementor_maintenance_mode_exclude_mode', [] );
if ( 'logged_in' === $exclude_mode && is_user_logged_in() ) {
return $value;
}
if ( 'custom' !== $exclude_mode ) {
return true;
}
$exclude_roles = get_option( 'elementor_maintenance_mode_exclude_roles', [] );
$user = wp_get_current_user();
$user_roles = $user->roles;
if ( is_multisite() && is_super_admin() ) {
$user_roles[] = 'super_admin';
}
$compare_roles = array_intersect( $user_roles, $exclude_roles );
return ! empty( $compare_roles ) ? $value : true;
}
/**
* Start capturing buffer.
*/
public function start_capturing() {
ob_start();
}
/**
* End capturing buffer and add button.
*/
public function end_capturing() {
$output = \ob_get_clean();
$search = '/(<(div|button) class="elementor-component-tab elementor-panel-navigation-tab" data-tab="global">.*<\/(div|button)>)/m';
$replace = '${1}<${2} class="elementor-component-tab elementor-panel-navigation-tab" data-tab="rank-math">SEO</${2}>';
echo \preg_replace(
$search,
$replace,
$output
);
}
/**
* Enqueue scripts.
*/
public function enqueue() {
$deps = [
'wp-core-data',
'wp-components',
'wp-block-editor',
'wp-element',
'wp-data',
'wp-api-fetch',
'wp-media-utils',
'site-health',
'rank-math-analyzer',
'backbone-marionette',
'elementor-common-modules',
'rank-math-app',
];
$mode = \Elementor\Core\Settings\Manager::get_settings_managers( 'editorPreferences' )->get_model()->get_settings( 'ui_theme' );
wp_deregister_style( 'rank-math-editor' );
wp_enqueue_style( 'wp-components' );
wp_enqueue_style( 'site-health' );
wp_enqueue_style( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/css/elementor.css', [ 'rank-math-common' ], rank_math()->version );
$media_query = '';
$dark_styles = $this->do_filter(
'elementor/dark_styles',
[
'rank-math-elementor-dark' => rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/css/elementor-dark.css',
]
);
if ( 'light' !== $mode ) {
$media_query = 'auto' === $mode ? '(prefers-color-scheme: dark)' : 'all';
foreach ( $dark_styles as $handle => $src ) {
wp_enqueue_style( $handle, $src, [], rank_math()->version, $media_query );
}
}
Helper::add_json( 'elementorDarkMode', $dark_styles );
wp_enqueue_script( 'rank-math-editor', rank_math()->plugin_url() . 'includes/3rdparty/elementor/assets/js/elementor.js', $deps, rank_math()->version, true );
rank_math()->variables->setup();
rank_math()->variables->setup_json();
}
/**
* Filters the post content before it is parsed for Sitmeap images..
* Used to apply the Elementor page editor on the post content.
*
* @since 1.0.38
*
* @param string $content The post content.
* @param int $post_id The post ID.
*
* @return string The post content.
*/
public function apply_builder_in_content( $content, $post_id ) {
if ( \Elementor\Plugin::$instance->db->is_built_with_elementor( $post_id ) ) {
return \Elementor\Plugin::$instance->frontend->get_builder_content( $post_id );
}
return $content;
}
/**
* Add SEO tab in Elementor Page Builder.
*
* @return bool
*/
private function can_add_seo_tab() {
/**
* Filter to show/hide SEO Tab in the Elementor Editor.
*/
if ( ! $this->do_filter( 'elementor/add_seo_tab', true ) ) {
return false;
}
$post_type = isset( $_GET['post'] ) ? get_post_type( $_GET['post'] ) : '';
if ( $post_type && ! Helper::get_settings( 'titles.pt_' . $post_type . '_add_meta_box' ) ) {
return false;
}
return Editor::can_add_editor();
}
/**
* Change robots for Elementor Templates pages
*
* @param array $robots Array of robots to sanitize.
*
* @return array Modified robots.
*/
public function robots( $robots ) {
if ( is_singular( 'elementor_library' ) ) {
$robots['index'] = 'noindex';
$robots['follow'] = 'nofollow';
}
return $robots;
}
}
@@ -0,0 +1,487 @@
<?php
/**
* Admin bar menu.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath;
use RankMath\Paper\Paper;
use RankMath\Traits\Ajax;
use RankMath\Traits\Meta;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Arr;
use RankMath\Helpers\Url;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Admin_Bar_Menu class.
*/
class Admin_Bar_Menu {
use Hooker, Ajax, Meta;
/**
* The unique identifier used for the menu.
*
* @var string
*/
const MENU_IDENTIFIER = 'rank-math';
/**
* Hold menu items.
*
* @var array
*/
private $items = [];
/**
* Constructor method.
*/
public function __construct() {
$this->ajax( 'mark_page_as', 'mark_page_as' );
$this->action( 'admin_bar_menu', 'add_menu', 100 );
}
/**
* AJAX function to mark page as Pillar Content/Noindex/Nofollow.
*/
public function mark_page_as() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$this->has_cap_ajax( 'onpage_general' );
$what = Param::post( 'what', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
$object_id = Param::post( 'objectID', 0, FILTER_VALIDATE_INT );
$object_type = Param::post( 'objectType', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
if ( ! $what || ! $object_id || ! $object_type ) {
return 0;
}
if ( 'pillar_content' === $what ) {
$current = $this->get_meta( $object_type, $object_id, 'rank_math_pillar_content' );
$updated = 'on' === $current ? 'off' : 'on';
$this->update_meta( $object_type, $object_id, 'rank_math_pillar_content', $updated );
die( '1' );
}
if ( 'noindex' === $what || 'nofollow' === $what ) {
$robots = (array) $this->get_meta( $object_type, $object_id, 'rank_math_robots' );
$robots = array_filter( $robots );
Arr::add_delete_value( $robots, $what );
$robots = $this->normalize_robots( $what, array_unique( $robots ) );
$this->update_meta( $object_type, $object_id, 'rank_math_robots', $robots );
if ( 'noindex' === $what ) {
$this->do_action( 'sitemap/invalidate_object_type', $object_type, $object_id );
}
die( '1' );
}
die();
}
/**
* Add SEO item to admin bar with context-specific submenu items.
*
* @param WP_Admin_Bar $wp_admin_bar Admin bar instance to add the menu to.
*/
public function add_menu( $wp_admin_bar ) {
if ( ! $this->can_add_menu() ) {
return;
}
$this->add_root_menu();
if ( Helper::has_cap( 'titles' ) ) {
$this->add_page_menu();
}
if ( $this->is_front() ) {
$this->add_seo_tools();
}
if ( $this->can_add_mark_menu() ) {
$this->add_mark_page_menu();
}
/**
* Add item to rank math admin bar node.
*
* @param Admin_Bar_Menu $this Class instance.
*/
$this->do_action( 'admin_bar/items', $this );
$this->add_order();
uasort( $this->items, [ $this, 'sort_by_priority' ] );
array_walk( $this->items, [ $wp_admin_bar, 'add_node' ] );
}
/**
* Normalize robots.
*
* @param string $what Current admin menu process.
* @param array $robots Array to normalize.
*
* @return array
*/
private function normalize_robots( $what, $robots ) {
if ( 'noindex' !== $what ) {
return $robots;
}
if ( ! in_array( 'noindex', $robots, true ) ) {
$robots[] = ! in_array( 'index', $robots, true ) ? 'index' : '';
return $robots;
}
if ( false !== ( $key = array_search( 'index', $robots ) ) ) { // @codingStandardsIgnoreLine
unset( $robots[ $key ] );
}
return $robots;
}
/**
* Keep original order when uasort() deals with equal "priority" values.
*/
private function add_order() {
$order = 0;
foreach ( $this->items as &$item ) {
$item['order'] = $order++;
}
}
/**
* Add root menu.
*/
private function add_root_menu() {
$first_menu = get_transient( 'rank_math_first_submenu_id' );
$first_menu = $first_menu && 'rank-math' !== $first_menu ? str_replace( 'rank-math-', '', $first_menu ) : '';
$this->items['main'] = [
'id' => self::MENU_IDENTIFIER,
'title' => '<span class="rank-math-icon">' . $this->get_icon() . '</span><span class="rank-math-text">' . esc_html__( 'Rank Math SEO', 'rank-math' ) . '</span>',
'href' => Helper::get_admin_url( $first_menu ),
'meta' => [ 'title' => esc_html__( 'Rank Math Dashboard', 'rank-math' ) ],
'priority' => 10,
];
if ( current_user_can( 'manage_options' ) ) {
$this->add_sub_menu(
'dashboard',
[
'title' => esc_html__( 'Dashboard', 'rank-math' ),
'href' => $this->items['main']['href'],
'meta' => [ 'title' => esc_html__( 'Dashboard', 'rank-math' ) ],
'priority' => 20,
]
);
}
}
/**
* Add page menu.
*/
private function add_page_menu() {
$hash = [
'add_home_menu' => is_front_page(),
'add_post_type_menu' => is_singular( Helper::get_accessible_post_types() ) || is_home(),
'add_date_menu' => is_date(),
'add_taxonomy_menu' => is_archive() && ! is_post_type_archive() && ! is_author(),
'add_search_menu' => is_search(),
];
foreach ( $hash as $func => $can_run ) {
if ( true === $can_run ) {
$this->$func();
break;
}
}
}
/**
* Add homepage menu
*/
private function add_home_menu() {
$this->add_sub_menu(
'home',
[
'title' => esc_html__( 'Homepage SEO', 'rank-math' ),
'href' => Helper::get_admin_url( 'options-titles#setting-panel-homepage' ),
'meta' => [ 'title' => esc_html__( 'Edit Homepage SEO Settings', 'rank-math' ) ],
'priority' => 35,
]
);
}
/**
* Add post_type menu
*/
private function add_post_type_menu() {
$post_type = get_post_type();
if ( ! $post_type ) {
return;
}
$name = get_post_type_object( $post_type )->labels->name;
if ( is_home() ) {
$post_type = 'page';
$name = esc_html__( 'Pages', 'rank-math' );
}
$this->add_sub_menu(
'posttype',
[
/* translators: Post Type Singular Name */
'title' => sprintf( esc_html__( 'SEO Settings for %s', 'rank-math' ), $name ),
'href' => Helper::get_admin_url( 'options-titles#setting-panel-post-type-' . $post_type ),
'meta' => [ 'title' => esc_html__( 'Edit default SEO settings for this post type', 'rank-math' ) ],
'priority' => 35,
]
);
}
/**
* Add taxonomy menu
*/
private function add_taxonomy_menu() {
$term = get_queried_object();
if ( empty( $term ) || ! ( $term instanceof \WP_Term ) ) {
return;
}
$labels = get_taxonomy_labels( get_taxonomy( $term->taxonomy ) );
$this->add_sub_menu(
'tax',
[
/* translators: Taxonomy Singular Name */
'title' => sprintf( esc_html__( 'SEO Settings for %s', 'rank-math' ), $labels->name ),
'href' => Helper::get_admin_url( 'options-titles#setting-panel-taxonomy-' . $term->taxonomy ),
'meta' => [ 'title' => esc_html__( 'Edit SEO settings for this archive page', 'rank-math' ) ],
'priority' => 35,
]
);
}
/**
* Add date archive menu
*/
private function add_date_menu() {
$this->add_sub_menu(
'date',
[
'title' => esc_html__( 'SEO Settings for Date Archives', 'rank-math' ),
'href' => Helper::get_admin_url( 'options-titles#setting-panel-global' ),
'meta' => [ 'title' => esc_html__( 'Edit SEO settings for this archive page', 'rank-math' ) ],
'priority' => 35,
]
);
}
/**
* Add search result menu
*/
private function add_search_menu() {
$this->add_sub_menu(
'search',
[
'title' => esc_html__( 'SEO Settings for Search Page', 'rank-math' ),
'href' => Helper::get_admin_url( 'options-titles#setting-panel-global' ),
'meta' => [ 'title' => esc_html__( 'Edit SEO settings for the search results page', 'rank-math' ) ],
'priority' => 35,
]
);
}
/**
* Add mark page menu.
*/
private function add_mark_page_menu() {
$this->add_sub_menu(
'mark-me',
[
'title' => esc_html__( 'Mark this page', 'rank-math' ),
'href' => '#',
'priority' => 100,
]
);
$is_pillar_content = '';
$dashicon_format = '<span class="dashicons dashicons-%s rm-mark-page-icon"></span>';
if ( is_singular( Helper::get_accessible_post_types() ) ) {
if ( get_post_meta( get_the_ID(), 'rank_math_pillar_content', true ) === 'on' ) {
$is_pillar_content = sprintf( $dashicon_format, 'yes' );
}
$this->add_sub_menu(
'pillar-content',
[
'title' => $is_pillar_content . esc_html__( 'As Pillar Content', 'rank-math' ),
'href' => '#pillar_content',
'meta' => [ 'class' => 'mark-page-as' ],
],
'mark-me'
);
}
if ( Paper::get() ) {
$robots = Paper::get()->get_robots();
$noindex_check = in_array( 'noindex', $robots, true ) ? sprintf( $dashicon_format, 'yes' ) : '';
$this->add_sub_menu(
'no-index',
[
'title' => $noindex_check . esc_html__( 'As NoIndex', 'rank-math' ),
'href' => '#noindex',
'meta' => [ 'class' => 'mark-page-as' ],
],
'mark-me'
);
$nofollow_check = in_array( 'nofollow', $robots, true ) ? sprintf( $dashicon_format, 'yes' ) : '';
$this->add_sub_menu(
'no-follow',
[
'title' => $nofollow_check . esc_html__( 'As NoFollow', 'rank-math' ),
'href' => '#nofollow',
'meta' => [ 'class' => 'mark-page-as' ],
],
'mark-me'
);
}
}
/**
* Third party SEO Tools, like the Google Structured Data Testing Tool.
*/
private function add_seo_tools() {
$this->add_sub_menu(
'third-party',
[
'title' => esc_html__( 'External Tools', 'rank-math' ),
'href' => '#',
'priority' => 200,
]
);
$url = rawurlencode( Url::get_current_url() );
$items = [
'google-pagespeed' => [
'title' => esc_html__( 'Google PageSpeed', 'rank-math' ),
'href' => 'https://developers.google.com/speed/pagespeed/insights/?url=' . $url,
'meta' => [ 'title' => esc_html__( 'Google PageSpeed Insights', 'rank-math' ) ],
],
'google-richresults-mobile' => [
'title' => esc_html__( 'Google Rich Results (Mobile)', 'rank-math' ),
'href' => 'https://search.google.com/test/rich-results?url=' . $url . '&user_agent=1',
'meta' => [ 'title' => esc_html__( 'Google Rich Results Test - Googlebot Smartphone', 'rank-math' ) ],
],
'google-richresults-desktop' => [
'title' => esc_html__( 'Google Rich Results (Desktop)', 'rank-math' ),
'href' => 'https://search.google.com/test/rich-results?url=' . $url . '&user_agent=2',
'meta' => [ 'title' => esc_html__( 'Google Rich Results Test - Googlebot Desktop', 'rank-math' ) ],
],
'google-cache' => [
'title' => esc_html__( 'Google Cache', 'rank-math' ),
'href' => 'https://webcache.googleusercontent.com/search?q=cache:' . $url,
'meta' => [ 'title' => esc_html__( 'See Google\'s cached version of your site', 'rank-math' ) ],
],
'fb-debugger' => [
'title' => esc_html__( 'Facebook Debugger', 'rank-math' ),
'href' => 'https://developers.facebook.com/tools/debug/sharing/?q=' . $url,
'meta' => [ 'title' => esc_html__( 'Facebook Sharing Debugger', 'rank-math' ) ],
],
];
foreach ( $items as $id => $args ) {
$args['meta']['target'] = '_blank';
$this->add_sub_menu( $id, $args, 'third-party' );
}
}
/**
* Add sub menu item
*
* @param string $id Unique ID for the node.
* @param array $args Arguments for adding a node.
* @param string $parent Node parent.
*/
public function add_sub_menu( $id, $args, $parent = '' ) {
$args['priority'] = isset( $args['priority'] ) ? $args['priority'] : 999;
$args['id'] = 'rank-math-' . $id;
$args['parent'] = '' !== $parent ? 'rank-math-' . $parent : self::MENU_IDENTIFIER;
$this->items[ $id ] = $args;
}
/**
* Can current user has capability for admin menu.
*
* @return bool
*/
private function can_add_menu() {
return Helper::has_cap( 'admin_bar' );
}
/**
* Can add mark me menu.
*
* @return bool
*/
private function can_add_mark_menu() {
return $this->is_front() && Helper::has_cap( 'onpage_general' );
}
/**
* Is frontend.
*
* @return bool
*/
private function is_front() {
return ! is_admin() && ! is_preview();
}
/**
* Sort admin bar items callback.
*
* @param array $item1 Item A to compare.
* @param array $item2 Item B to compare.
*
* @return integer
*/
private function sort_by_priority( $item1, $item2 ) {
if ( $item1['priority'] === $item2['priority'] ) {
return $item1['order'] < $item2['order'] ? -1 : 1;
}
return $item1['priority'] < $item2['priority'] ? -1 : 1;
}
/**
* Get Rank Math icon.
*
* @param integer $width Width of the icon.
*
* @return string
*/
private function get_icon( $width = 20 ) {
return '<svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="' . $width . '"><g><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"/><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"/></g></svg>';
}
}
@@ -0,0 +1,51 @@
<?php
/**
* Breadcrumbs for the Rank Math pages
*
* @since 1.0.44
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Admin Header class.
*
* @codeCoverageIgnore
*/
class Admin_Breadcrumbs {
/**
* Display Header.
*/
public function display() {
?>
<div class="rank-math-breadcrumbs-wrap">
<div class="rank-math-breadcrumbs">
<span><?php echo esc_html__( 'Dashboard', 'rank-math' ); ?></span>
<span class="divider">/</span>
<span class="active"><?php echo esc_html( $this->get_page_title() ); ?></span>
</div>
</div>
<?php
}
/**
* Get Current Admin Page Title.
*/
private function get_page_title() {
$base = __( 'Modules', 'rank-math' );
if ( is_network_admin() ) {
$base = __( 'Help', 'rank-math' );
}
$default = 'rank-math' === Param::get( 'page' ) ? $base : get_admin_page_title();
return str_replace( '_', ' ', Param::get( 'view', $default, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK ) );
}
}
@@ -0,0 +1,135 @@
<?php
/**
* The nav tabs on the Dashboard page.
*
* @since 1.0.40
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Helpers\Security;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Admin Dashboard Nav class.
*
* @codeCoverageIgnore
*/
class Admin_Dashboard_Nav {
/**
* Display dashboard tabs.
*/
public function display() {
$nav_links = $this->get_nav_links();
if ( empty( $nav_links ) ) {
return;
}
?>
<div class="rank-math-tab-nav" role="tablist" aria-orientation="horizontal">
<?php
foreach ( $nav_links as $id => $link ) {
$this->nav_link( $link );
}
?>
</div>
<?php
}
/**
* Get URL for dashboard nav links.
*
* @param array $link Link data.
* @return string Link URL.
*/
public function get_link_url( $link ) {
return is_network_admin() ?
Security::add_query_arg(
[
'page' => 'rank-math',
'view' => $link['id'],
],
network_admin_url( 'admin.php' )
) :
Helper::get_admin_url( $link['url'], $link['args'] );
}
/**
* Output dashboard nav link.
*
* @param array $link Link data.
* @return void
*/
public function nav_link( $link ) {
if ( isset( $link['cap'] ) && ! current_user_can( $link['cap'] ) ) {
return;
}
$default_tab = is_network_admin() ? 'help' : 'modules';
?>
<a
class="rank-math-tab<?php echo Param::get( 'view', $default_tab ) === sanitize_html_class( $link['id'] ) ? ' is-active' : ''; ?>"
href="<?php echo esc_url( $this->get_link_url( $link ) ); ?>"
title="<?php echo esc_attr( $link['title'] ); ?>">
<?php echo esc_html( $link['title'] ); ?>
</a>
<?php
}
/**
* Get dashbaord navigation links
*
* @return array
*/
private function get_nav_links() {
$links = [
'modules' => [
'id' => 'modules',
'url' => '',
'args' => 'view=modules',
'cap' => 'manage_options',
'title' => esc_html__( 'Modules', 'rank-math' ),
],
'help' => [
'id' => 'help',
'url' => '',
'args' => 'view=help',
'cap' => 'manage_options',
'title' => esc_html__( 'Help', 'rank-math' ),
],
'wizard' => [
'id' => 'wizard',
'url' => 'wizard',
'args' => '',
'cap' => 'manage_options',
'title' => esc_html__( 'Setup Wizard', 'rank-math' ),
],
];
if ( Helper::is_advanced_mode() ) {
$links['import-export'] = [
'id' => 'import-export',
'url' => 'status',
'args' => 'view=import_export',
'cap' => 'install_plugins',
'title' => esc_html__( 'Import &amp; Export', 'rank-math' ),
];
}
if ( Helper::is_plugin_active_for_network() ) {
unset( $links['help'] );
}
if ( is_network_admin() ) {
$links = [];
}
return apply_filters( 'rank_math/admin/dashboard_nav_links', $links );
}
}
@@ -0,0 +1,151 @@
<?php
/**
* Header for the Rank Math pages
*
* @since 1.0.44
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\KB;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Admin Header class.
*
* @codeCoverageIgnore
*/
class Admin_Header {
/**
* Hold current screen ID.
*
* @var Current screen ID.
*/
private $screen_id = '';
/**
* Display Header.
*/
public function display() {
$logo_url = '<a href="' . esc_url( Helper::get_admin_url() ) . '"><i class="rm-icon rm-icon-rank-math"></i></a>';
$this->screen_id = $this->get_current_screen();
?>
<div class="rank-math-header">
<div class="rank-math-logo">
<?php echo $logo_url; // phpcs:ignore ?>
</div>
<h1 class="rank-math-logo-text">
Rank Math SEO
<?php do_action( 'rank_math/pro_badge' ); ?>
</h1>
<?php $this->get_search_options(); ?>
<?php $this->get_mode_selector(); ?>
<?php do_action( 'rank_math/before_help_link' ); ?>
<a href="<?php echo esc_url( $this->get_help_link() ); ?>" title="<?php esc_attr_e( 'Rank Math Knowledge Base', 'rank-math' ); ?>" target="_blank" class="button rank-math-help"><i class="dashicons dashicons-editor-help"></i></a>
</div>
<?php
// Breadcrumbs.
rank_math()->admin->display_admin_breadcrumbs();
}
/**
* Get Search Options.
*/
private function get_search_options() {
if (
! in_array(
$this->screen_id,
[
'rank-math_page_rank-math-options-general',
'rank-math_page_rank-math-options-titles',
'rank-math_page_rank-math-options-sitemap',
],
true
)
) {
return;
}
?>
<div class="rank-math-search-options">
<div class="search-field">
<i class="rm-icon rm-icon-search"></i>
<input type="text" value="" placeholder="<?php esc_attr_e( 'Search Options', 'rank-math' ); ?>">
<em class="clear-search dashicons dashicons-no-alt"></em>
</div>
</div>
<?php
}
/**
* Get Mode Selector.
*/
private function get_mode_selector() {
if (
! in_array(
$this->screen_id,
[
'toplevel_page_rank-math',
'rank-math_page_rank-math-status',
],
true
)
) {
return;
}
$is_advanced_mode = Helper::is_advanced_mode();
?>
<div class="rank-math-mode-selector">
<a href="#" class="<?php echo ! $is_advanced_mode ? 'active' : ''; ?>" data-mode="easy"><?php esc_attr_e( 'Easy Mode', 'rank-math' ); ?></a>
<a href="#" class="<?php echo $is_advanced_mode ? 'active' : ''; ?>" data-mode="advanced"><?php esc_attr_e( 'Advanced Mode', 'rank-math' ); ?></a>
</div>
<?php
}
/**
* Get Current Screen ID.
*/
private function get_help_link() {
$links = [
'import-export-settings' => 'import_export' === Param::get( 'view' ),
'version-control' => 'version_control' === Param::get( 'view' ) || 'rank-math-status' === Param::get( 'page' ),
'general-settings' => 'rank-math-options-general' === Param::get( 'page' ),
'titles-meta' => 'rank-math-options-titles' === Param::get( 'page' ),
'sitemap-general' => 'rank-math-options-sitemap' === Param::get( 'page' ),
'role-manager' => 'rank-math-role-manager' === Param::get( 'page' ),
'seo-analysis' => 'rank-math-seo-analysis' === Param::get( 'page' ),
'content-ai-restore-credits' => 'rank-math-content-ai-page' === Param::get( 'page' ),
];
$link = KB::get( 'knowledgebase', 'RM Header KB Icon' );
foreach ( $links as $key => $value ) {
if ( $value ) {
$link = KB::get( $key, 'Admin Bar ' . ucwords( str_replace( '-', ' ', $key ) ) );
break;
}
}
return $link;
}
/**
* Get Current Screen ID.
*/
private function get_current_screen() {
$screen = get_current_screen();
if ( empty( $screen ) ) {
return '';
}
return $screen->id;
}
}
@@ -0,0 +1,468 @@
<?php
/**
* Admin helper Functions.
*
* This file contains functions needed on the admin screens.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Data_Encryption;
use RankMath\Helpers\Security;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Admin_Helper class.
*/
class Admin_Helper {
/**
* Get .htaccess related data.
*
* @return array
*/
public static function get_htaccess_data() {
if ( ! Helper::is_filesystem_direct() ) {
return [
'content' => '',
'writable' => false,
];
}
$wp_filesystem = Helper::get_filesystem();
if ( empty( $wp_filesystem ) ) {
return;
}
$htaccess_file = get_home_path() . '.htaccess';
return ! $wp_filesystem->exists( $htaccess_file ) ? false : [
'content' => $wp_filesystem->get_contents( $htaccess_file ),
'writable' => $wp_filesystem->is_writable( $htaccess_file ),
];
}
/**
* Get tooltip HTML.
*
* @param string $message Message to show in tooltip.
*
* @return string
*/
public static function get_tooltip( $message ) {
return '<span class="rank-math-tooltip"><em class="dashicons-before dashicons-editor-help"></em><span>' . $message . '</span></span>';
}
/**
* Get admin view file.
*
* @param string $view View filename.
*
* @return string Complete path to view
*/
public static function get_view( $view ) {
$view = sanitize_key( $view );
$view = rank_math()->admin_dir() . "views/{$view}.php";
if ( ! file_exists( $view ) ) {
Helper::redirect( Helper::get_admin_url() );
exit;
}
return $view;
}
/**
* Get taxonomies as choices.
*
* @param array $args (Optional) Arguments passed to filter list.
*
* @return array|bool
*/
public static function get_taxonomies_options( $args = [] ) {
global $wp_taxonomies;
$args = wp_parse_args( $args, [ 'public' => true ] );
$taxonomies = wp_filter_object_list( $wp_taxonomies, $args, 'and', 'label' );
return empty( $taxonomies ) ? false : [ 'off' => esc_html__( 'None', 'rank-math' ) ] + $taxonomies;
}
/**
* Registration data get/update.
*
* @param array|bool|null $data Array of data to save.
*
* @return array
*/
public static function get_registration_data( $data = null ) {
$row = 'rank_math_connect_data';
$keys = [
'username',
'email',
'api_key',
'plan',
];
// Setter.
if ( ! is_null( $data ) ) {
if ( false === $data ) {
update_option( 'rank_math_registration_skip', 1 );
return delete_option( $row );
}
foreach ( $keys as $key ) {
if ( isset( $data[ $key ] ) ) {
$data[ $key ] = Data_Encryption::encrypt( $data[ $key ] );
}
}
Helper::remove_notification( 'rank-math-site-url-mismatch' );
update_option( 'rank_math_registration_skip', 1 );
$connected = update_option( $row, $data );
do_action( 'rank_math/connect/account_connected', $data );
return $connected;
}
// Getter.
$options = Helper::is_plugin_active_for_network() ? get_blog_option( get_main_site_id(), $row, false ) : get_option( $row, false );
if ( empty( $options ) ) {
return false;
}
foreach ( $keys as $key ) {
if ( isset( $options[ $key ] ) ) {
$options[ $key ] = Data_Encryption::decrypt( $options[ $key ] );
}
}
if ( ! self::is_valid_registration( $options ) ) {
// Delete invalid registration data.
delete_option( $row );
// Ask the user to reconnect.
Helper::add_notification(
__( 'Unable to validate Rank Math SEO registration data.', 'rank-math' ) .
' <a href="' . esc_url( self::get_activate_url() ) . '">' . __( 'Please try reconnecting.', 'rank-math' ) . '</a> ' .
sprintf(
/* translators: KB Link */
__( 'If the issue persists, please try the solution described in our Knowledge Base article: %s', 'rank-math' ),
'<a href="' . KB::get( 'unable-to-encrypt', 'Registration Data' ) . '" target="_blank">' . __( '[3. Unable to Encrypt]', 'rank-math' ) . '</a>'
),
[ 'type' => 'error' ]
);
return false;
}
/**
* Filter whether we need to check for URL mismatch or not.
*/
$do_url_check = apply_filters( 'rank_math/registration/do_url_check', ! get_option( 'rank_math_siteurl_mismatch_notice_dismissed' ) );
if ( $do_url_check && isset( $options['site_url'] ) && Helper::get_home_url() !== $options['site_url'] ) {
$message = esc_html__( 'Seems like your site URL has changed since you connected to Rank Math.', 'rank-math' ) . ' <a href="' . self::get_activate_url() . '">' . esc_html__( 'Click here to reconnect.', 'rank-math' ) . '</a>';
Helper::add_notification(
$message,
[
'type' => 'warning',
'id' => 'rank-math-site-url-mismatch',
]
);
}
/**
* Ensure the site_url is returned if it is absent, as it is required for the Content AI.
*/
if ( empty( $options['site_url'] ) ) {
$options['site_url'] = Helper::get_home_url();
}
return $options;
}
/**
* Check if registration data is valid.
*
* @param array $data Registration data.
*
* @return bool
*/
public static function is_valid_registration( $data ) {
if ( empty( $data['username'] ) || empty( $data['email'] ) || empty( $data['api_key'] ) || empty( $data['plan'] ) ) {
return false;
}
if ( ! filter_var( $data['email'], FILTER_VALIDATE_EMAIL ) ) {
return false;
}
if ( strlen( $data['plan'] ) > 32 ) { // This can happen when the decryption fails for some reason.
return false;
}
return true;
}
/**
* Get user plan.
*/
public static function get_user_plan() {
$data = self::get_registration_data();
return $data['plan'];
}
/**
* Is user plan expired.
*
* @return boolean
*/
public static function is_plan_expired() {
$data = self::get_registration_data();
if ( ! isset( $data['plan'] ) ) {
return true;
}
return 'free' === $data['plan'];
}
/**
* Remove registration data and disconnect from RankMath.com.
*/
public static function deregister_user() {
$registered = self::get_registration_data();
if ( $registered && isset( $registered['username'] ) && isset( $registered['api_key'] ) ) {
Api::get()->deactivate_site( $registered['username'], $registered['api_key'] );
self::get_registration_data( false );
do_action( 'rank_math/deregister_site' );
}
}
/**
* Check if current page is media list page.
*
* @return bool
*/
public static function is_media_library() {
global $pagenow;
return 'upload.php' === $pagenow;
}
/**
* Check if current page is post list page.
*
* @return bool
*/
public static function is_post_list() {
global $pagenow;
return 'edit.php' === $pagenow;
}
/**
* Check if current page is post create/edit screen.
*
* @return bool
*/
public static function is_post_edit() {
global $pagenow;
return ! Helper::is_ux_builder() && ( 'post.php' === $pagenow || 'post-new.php' === $pagenow );
}
/**
* Check if current page is term create/edit screen.
*
* @return bool
*/
public static function is_term_edit() {
global $pagenow;
return 'term.php' === $pagenow || 'edit-tags.php' === $pagenow;
}
/**
* Check if current page is user create/edit screen.
*
* @return bool
*/
public static function is_user_edit() {
global $pagenow;
return 'profile.php' === $pagenow || 'user-edit.php' === $pagenow;
}
/**
* Check if current page is user or term create/edit screen.
*
* @return bool
*/
public static function is_term_profile_page() {
global $pagenow;
return self::is_term_edit() || self::is_user_edit();
}
/**
* Get Social Share buttons.
*
* @codeCoverageIgnore
*/
public static function get_social_share() {
if ( Helper::is_whitelabel() ) {
return;
}
$tw_link = KB::get( 'logo', 'Setup Wizard Tweet Button' );
$fb_link = rawurlencode( KB::get( 'logo', 'Facebook' ) );
/* translators: sitename */
$tw_message = rawurlencode( sprintf( esc_html__( 'I just installed @RankMathSEO #WordPress Plugin. It looks great! %s', 'rank-math' ), $tw_link ) );
/* translators: sitename */
$fb_message = rawurlencode( esc_html__( 'I just installed Rank Math SEO WordPress Plugin. It looks promising!', 'rank-math' ) );
$tweet_url = Security::add_query_arg(
[
'text' => $tw_message,
'hashtags' => 'SEO',
],
'https://twitter.com/intent/tweet'
);
$fb_share_url = Security::add_query_arg(
[
'u' => $fb_link,
'quote' => $fb_message,
'caption' => esc_html__( 'SEO by Rank Math', 'rank-math' ),
],
'https://www.facebook.com/sharer/sharer.php'
);
?>
<span class="wizard-share">
<a href="#" onclick="window.open('<?php echo $tweet_url; ?>', 'sharewindow', 'resizable,width=600,height=300'); return false;" class="share-twitter">
<span class="dashicons dashicons-twitter"></span> <?php esc_html_e( 'Tweet', 'rank-math' ); ?>
</a>
<a href="#" onclick="window.open('<?php echo $fb_share_url; ?>', 'sharewindow', 'resizable,width=600,height=300'); return false;" class="share-facebook">
<span class="dashicons dashicons-facebook-alt"></span> <?php esc_html_e( 'Share', 'rank-math' ); ?>
</a>
</span>
<?php
}
/**
* Get product activation URL.
*
* @param string $redirect_to Redirecto url.
*
* @return string Activate URL.
*/
public static function get_activate_url( $redirect_to = null ) {
if ( empty( $redirect_to ) ) {
$redirect_to = Security::add_query_arg_raw(
[
'page' => 'rank-math',
'view' => 'help',
'nonce' => wp_create_nonce( 'rank_math_register_product' ),
],
( is_multisite() && is_plugin_active_for_network( plugin_basename( RANK_MATH_FILE ) ) ) ? network_admin_url( 'admin.php' ) : admin_url( 'admin.php' )
);
} else {
$redirect_to = Security::add_query_arg_raw(
[
'nonce' => wp_create_nonce( 'rank_math_register_product' ),
],
$redirect_to
);
}
$args = [
'site' => rawurlencode( home_url() ),
'r' => rawurlencode( $redirect_to ),
];
return apply_filters(
'rank_math/license/activate_url',
Security::add_query_arg_raw( $args, RANK_MATH_SITE_URL . '/auth' ),
$args
);
}
/**
* Check if page is set as Homepage.
*
* @since 1.0.42
*
* @return boolean
*/
public static function is_home_page() {
$front_page = (int) get_option( 'page_on_front' );
if ( Helper::is_divi_frontend_editor() ) {
$p = get_post();
return ! empty( $p->ID ) && $p->ID === $front_page;
}
return $front_page && self::is_post_edit() && (int) Param::get( 'post' ) === $front_page;
}
/**
* Check if page is set as Posts Page.
*
* @since 1.0.43
*
* @return boolean
*/
public static function is_posts_page() {
$posts_page = (int) get_option( 'page_for_posts' );
return $posts_page && self::is_post_edit() && (int) Param::get( 'post' ) === $posts_page;
}
/**
* Get Trends icon <svg> element.
*
* @return string
*/
public static function get_trends_icon_svg() {
return '<svg viewBox="0 0 610 610"><path d="M18.85,446,174.32,290.48l58.08,58.08L76.93,504a14.54,14.54,0,0,1-20.55,0L18.83,466.48a14.54,14.54,0,0,1,0-20.55Z" style="fill:#4285f4"/><path d="M242.65,242.66,377.59,377.6l-47.75,47.75a14.54,14.54,0,0,1-20.55,0L174.37,290.43l47.75-47.75A14.52,14.52,0,0,1,242.65,242.66Z" style="fill:#ea4335"/><polygon points="319.53 319.53 479.26 159.8 537.34 217.88 377.61 377.62 319.53 319.53" style="fill:#fabb05"/><path d="M594.26,262.73V118.61h0a16.94,16.94,0,0,0-16.94-16.94H433.2a16.94,16.94,0,0,0-12,28.92L565.34,274.71h0a16.94,16.94,0,0,0,28.92-12Z" style="fill:#34a853"/><rect width="610" height="610" style="fill:none"/></svg>';
}
/**
* Check if siteurl & home options are both valid URLs.
*
* @return boolean
*/
public static function is_site_url_valid() {
return (bool) filter_var( get_option( 'siteurl' ), FILTER_VALIDATE_URL ) && (bool) filter_var( get_option( 'home' ), FILTER_VALIDATE_URL );
}
/**
* Maybe show notice about invalid siteurl.
*/
public static function maybe_show_invalid_siteurl_notice() {
if ( ! self::is_site_url_valid() ) {
?>
<p class="notice notice-warning notice-alt notice-connect-disabled">
<?php
printf(
// Translators: 1 is "WordPress Address (URL)", 2 is "Site Address (URL)", 3 is a link to the General Settings, with "WordPress General Settings" as anchor text.
esc_html__( 'Rank Math cannot be connected because your site URL doesn\'t appear to be a valid URL. If the domain name contains special characters, please make sure to use the encoded version in the %1$s &amp; %2$s fields on the %3$s page.', 'rank-math' ),
'<strong>' . esc_html__( 'WordPress Address (URL)', 'rank-math' ) . '</strong>',
'<strong>' . esc_html__( 'Site Address (URL)', 'rank-math' ) . '</strong>',
'<a href="' . esc_url( admin_url( 'options-general.php' ) ) . '">' . esc_html__( 'WordPress General Settings', 'rank-math' ) . '</a>'
);
?>
</p>
<?php
}
}
}
@@ -0,0 +1,123 @@
<?php
/**
* The admin bootstrap of the plugin.
*
* @since 1.0.9
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Updates;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Admin_Init class.
*
* @codeCoverageIgnore
*/
class Admin_Init {
use Hooker;
/**
* The Constructor.
*/
public function __construct() {
rank_math()->admin = new Admin();
rank_math()->admin_assets = new Assets();
$this->load_review_reminders();
$this->load_pro_notice();
$this->load_setup_wizard();
$this->load_post_columns_and_filters();
$this->run(
[
rank_math()->admin,
rank_math()->admin_assets,
new Admin_Menu(),
new Option_Center(),
new Notices(),
new CMB2_Fields(),
new Metabox\Metabox(),
new Import_Export(),
new Updates(),
new Watcher(),
]
);
/**
* Fires when admin is loaded.
*/
$this->do_action( 'admin/loaded' );
}
/**
* Load out post list and edit screen class.
*/
private function load_post_columns_and_filters() {
$this->run( [ new Bulk_Actions() ] );
if ( Admin_Helper::is_post_list() || Admin_Helper::is_media_library() || wp_doing_ajax() ) {
$this->run(
[
new Post_Columns(),
new Post_Filters(),
]
);
}
}
/**
* Load review tab in metabox & footer notice.
*/
private function load_review_reminders() {
if ( get_option( 'rank_math_already_reviewed' ) ) {
return;
}
$this->run( [ new Ask_Review() ] );
}
/**
* Load Pro reminder notice.
*/
private function load_pro_notice() {
if ( ! is_main_site() ) {
return;
}
if ( defined( 'RANK_MATH_PRO_FILE' ) || get_option( 'rank_math_already_upgraded' ) ) {
return;
}
$this->run( [ new Pro_Notice() ] );
}
/**
* Run all the runners.
*
* @param array $runners Instances of runner classes.
*/
private function run( $runners ) {
foreach ( $runners as $runner ) {
$runner->hooks();
}
}
/**
* Load setup wizard.
*/
private function load_setup_wizard() {
if ( Helper::is_wizard() ) {
new Setup_Wizard();
}
}
}
@@ -0,0 +1,269 @@
<?php
/**
* The admin pages of the plugin.
*
* @since 1.0.9
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Helpers\Param;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Traits\Ajax;
use RankMath\Admin\Page;
defined( 'ABSPATH' ) || exit;
/**
* Admin_Menu class.
*
* @codeCoverageIgnore
*/
class Admin_Menu implements Runner {
use Hooker, Ajax;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'init', 'register_pages' );
$this->action( 'admin_menu', 'fix_admin_menu', 999 );
$this->action( 'admin_head', 'icon_css' );
$this->ajax( 'remove_offer_page', 'remove_offer_page' );
}
/**
* Register admin pages for plugin.
*/
public function register_pages() {
$this->maybe_deregister();
if ( Helper::is_invalid_registration() && ! is_network_admin() ) {
return;
}
$current_user = wp_get_current_user();
$capabilities = array_keys( Helper::get_roles_capabilities() );
if ( empty( array_intersect( $current_user->roles, $capabilities ) ) && ! current_user_can( 'setup_network' ) ) {
return;
}
// Dashboard / Welcome / About.
new Page(
'rank-math',
esc_html__( 'Rank Math', 'rank-math' ),
[
'position' => 50,
'menu_title' => 'Rank Math',
'capability' => 'level_1',
'icon' => 'data:image/svg+xml;base64,' . \base64_encode( '<svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="20"><g fill="#fff"><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"/><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"/></g></svg>' ),
'render' => Admin_Helper::get_view( 'dashboard' ),
'classes' => [ 'rank-math-page' ],
'assets' => [
'styles' => [ 'rank-math-dashboard' => '' ],
'scripts' => [
'rank-math-dashboard' => '',
],
],
'is_network' => is_network_admin() && Helper::is_plugin_active_for_network(),
]
);
}
/**
* Fix menu names.
*/
public function fix_admin_menu() {
// Replace the main menu name "Rank Math" with "Rank Math SEO".
global $menu;
foreach ( $menu as $key => $item ) {
if ( 'Rank Math' === $item[0] ) {
$menu[ $key ][0] = esc_html__( 'Rank Math SEO', 'rank-math' );
break;
}
}
// Replace the first submenu name "Rank Math" with "Dashboard".
global $submenu;
if ( ! isset( $submenu['rank-math'] ) ) {
return;
}
if ( 'Rank Math' === $submenu['rank-math'][0][0] ) {
if ( current_user_can( 'manage_options' ) ) {
$plan = Helper::get_content_ai_plan();
$notification = ( empty( $plan ) || 'free' === $plan ) && get_option( 'rank_math_view_modules' ) ? ' <span class="awaiting-mod count-1"><span class="pending-count" aria-hidden="true">1</span></span>' : '';
$submenu['rank-math'][0][0] = esc_html__( 'Dashboard', 'rank-math' ) . $notification;
} else {
unset( $submenu['rank-math'][0] );
}
}
if ( empty( $submenu['rank-math'] ) ) {
return;
}
$submenu['rank-math'][] = [ esc_html__( 'Help &amp; Support', 'rank-math' ) . '<i class="dashicons dashicons-external" style="font-size:12px;vertical-align:-2px;height:10px;"></i>', 'level_1', KB::get( 'knowledgebase', 'Sidebar Help Link' ) ];
$this->add_offer_link( $submenu );
// Store ID of first_menu item so we can use it in the Admin menu item.
set_transient( 'rank_math_first_submenu_id', array_values( $submenu['rank-math'] )[0][2] );
}
/**
* Print icon CSS for admin menu bar.
*/
public function icon_css() {
?>
<script type="text/javascript">
// Open RM KB menu link in the new tab.
jQuery( document ).ready( function( $ ) {
$( "ul#adminmenu a[href$='<?php KB::the( 'knowledgebase', 'Sidebar Help Link' ); ?>']" ).attr( 'target', '_blank' );
$( "ul#adminmenu a[href$='<?php KB::the( 'offer', 'Offer Menu Item' ); ?>']" ).attr( 'target', '_blank' ).on( 'click', function() {
$( this ).remove()
$.ajax( {
url: window.ajaxurl,
type: 'POST',
data: {
action: 'rank_math_remove_offer_page',
security: rankMath.security,
},
} )
} );
} );
</script>
<style>
#wp-admin-bar-rank-math .rank-math-icon {
display: inline-block;
top: 6px;
position: relative;
padding-right: 10px;
max-width: 20px;
}
#wp-admin-bar-rank-math .rank-math-icon svg {
fill-rule: evenodd;
fill: #dedede;
}
#wp-admin-bar-rank-math:hover .rank-math-icon svg {
fill-rule: evenodd;
fill: #00b9eb;
}
#toplevel_page_rank-math:not(.wp-has-submenu) {
display: none;
}
.multisite.network-admin #toplevel_page_rank-math {
display: block;
}
#toplevel_page_rank-math a[href$='<?php KB::the( 'offer', 'Offer Menu Item' ); ?>'],
#toplevel_page_rank-math a[href$='<?php KB::the( 'offer', 'Offer Menu Item' ); ?>']:hover,
#toplevel_page_rank-math a[href$='<?php KB::the( 'offer', 'Offer Menu Item' ); ?>']:focus {
background-color: #10AC84;
color: #fff;
}
</style>
<?php
}
/**
* Check for deactivation.
*/
private function maybe_deregister() {
if ( ! Helper::has_cap( 'general' ) || 'deregister' !== Param::post( 'registration-action' ) ) {
return;
}
$nonce = Param::post( '_wpnonce' );
if ( ! $nonce || ! wp_verify_nonce( $nonce, 'rank_math_register_product' ) ) {
return;
}
Admin_Helper::deregister_user();
}
/**
* Function to add Offer link based on the date range.
*
* @param array $submenu Submenu items.
*/
private function add_offer_link( &$submenu ) {
$offer = $this->get_active_offer();
if ( ! $offer ) {
return;
}
$submenu['rank-math'][] = [ current( $offer ) . '&nbsp;', 'level_1', KB::get( 'offer', 'Offer Menu Item' ) ];
}
/**
* Ajax handler callback to store active offer so it doesn't show up again on the site.
*/
public function remove_offer_page() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$offer = $this->get_active_offer();
set_site_transient( 'rank_math_active_offer', key( $offer ) );
}
/**
* Function to get active offer
*/
private function get_active_offer() {
// Early Bail if PRO plugin is active.
if ( defined( 'RANK_MATH_PRO_FILE' ) ) {
return false;
}
$timezone = new \DateTimeZone( 'Asia/Kolkata' );
$current_date = new \DateTime( 'now', $timezone );
$dates = [
'christmas' => [
'start' => '2023-12-17',
'end' => '2023-12-26',
'text' => esc_html__( 'Christmas Sale', 'rank-math' ),
],
'new-year' => [
'start' => '2023-12-31',
'end' => '2024-01-05',
'text' => esc_html__( 'New Year Sale', 'rank-math' ),
],
'anniversary' => [
'start' => '2024-11-06',
'end' => '2024-11-13',
'text' => esc_html__( 'Anniversary Sale', 'rank-math' ),
],
'black-friday' => [
'start' => '2024-11-27',
'end' => '2024-12-01',
'text' => esc_html__( 'Black Friday Sale', 'rank-math' ),
],
'cyber-monday' => [
'start' => '2024-12-02',
'end' => '2024-12-04',
'text' => esc_html__( 'Cyber Monday Sale', 'rank-math' ),
],
];
$stored_offer = get_site_transient( 'rank_math_active_offer' );
$active_offer = '';
foreach ( $dates as $key => $date ) {
$start_date = new \DateTime( $date['start'] . ' 16:00:00', $timezone );
$end_date = new \DateTime( $date['end'] . ' 16:00:00', $timezone );
if ( $stored_offer !== $key && $current_date >= $start_date && $current_date <= $end_date ) {
$active_offer = [ $key => $date['text'] ];
break;
}
}
return $active_offer;
}
}
@@ -0,0 +1,493 @@
<?php
/**
* The admin-specific functionality of the plugin.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Runner;
use RankMath\Helper;
use RankMath\Helpers\Str;
use RankMath\Helpers\Param;
use RankMath\Admin\Admin_Helper;
use RankMath\Traits\Ajax;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Admin class.
*
* @codeCoverageIgnore
*/
class Admin implements Runner {
use Hooker, Ajax;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'init', 'flush', 999 );
$this->filter( 'user_contactmethods', 'update_user_contactmethods' );
$this->action( 'admin_footer', 'convert_additional_profile_url_to_textarea' );
$this->action( 'save_post', 'canonical_check_notice' );
$this->action( 'cmb2_save_options-page_fields', 'update_is_configured_value', 10, 2 );
$this->filter( 'action_scheduler_pastdue_actions_check_pre', 'as_exclude_pastdue_actions' );
$this->action( 'rank_math/pro_badge', 'offer_icon' );
$this->filter( 'load_script_translation_file', 'load_script_translation_file', 10, 3 );
// AJAX.
$this->ajax( 'search_pages', 'search_pages' );
$this->ajax( 'is_keyword_new', 'is_keyword_new' );
$this->ajax( 'save_checklist_layout', 'save_checklist_layout' );
$this->ajax( 'deactivate_plugins', 'deactivate_plugins' );
}
/**
* Flush the rewrite rules once if the rank_math_flush_rewrite option is set.
*/
public function flush() {
if ( get_option( 'rank_math_flush_rewrite' ) ) {
flush_rewrite_rules();
delete_option( 'rank_math_flush_rewrite' );
}
if ( 'rank-math' === Param::get( 'page' ) && get_option( 'rank_math_view_modules' ) ) {
delete_option( 'rank_math_view_modules' );
}
}
/**
* Add Facebook and Twitter as user contact methods.
*
* @param array $contactmethods Current contact methods.
* @return array New contact methods with extra items.
*
* @copyright Copyright (C) 2008-2019, Yoast BV
* The following code is a derivative work of the code from the Yoast(https://github.com/Yoast/wordpress-seo/), which is licensed under GPL v3.
*/
public function update_user_contactmethods( $contactmethods ) {
$contactmethods['twitter'] = esc_html__( 'Twitter username (without @)', 'rank-math' );
$contactmethods['facebook'] = esc_html__( 'Facebook profile URL', 'rank-math' );
$contactmethods['additional_profile_urls'] = esc_html__( 'Additional profile URLs', 'rank-math' );
return $contactmethods;
}
/**
* Display admin header.
*/
public function display_admin_header() {
$nav_tabs = new Admin_Header();
$nav_tabs->display();
}
/**
* Display admin breadcrumbs.
*/
public function display_admin_breadcrumbs() {
$nav_tabs = new Admin_Breadcrumbs();
$nav_tabs->display();
}
/**
* Display dashboard tabs.
*/
public function display_dashboard_nav() {
$nav_tabs = new Admin_Dashboard_Nav();
$nav_tabs->display();
}
/**
* Show notice when canonical URL is not a valid URL.
*
* @param int $post_id The post ID.
*/
public function canonical_check_notice( $post_id ) {
$post_type = get_post_type( $post_id );
$is_allowed = in_array( $post_type, Helper::get_allowed_post_types(), true );
if ( ! $is_allowed || Helper::is_autosave() || Helper::is_ajax() || isset( $_REQUEST['bulk_edit'] ) ) {
return $post_id;
}
if ( ! empty( $_POST['rank_math_canonical_url'] ) && false === Param::post( 'rank_math_canonical_url', false, FILTER_VALIDATE_URL ) ) {
$message = esc_html__( 'The canonical URL you entered does not seem to be a valid URL. Please double check it in the SEO meta box &raquo; Advanced tab.', 'rank-math' );
Helper::add_notification( $message, [ 'type' => 'error' ] );
}
}
/**
* Save checklist layout.
*/
public function save_checklist_layout() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$this->has_cap_ajax( 'onpage_general' );
if ( empty( $_POST['layout'] ) || ! is_array( $_POST['layout'] ) ) {
return;
}
$layout = Param::post( 'layout', [], FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
$allowed = [
'basic' => 1,
'advanced' => 1,
'title-readability' => 1,
'content-readability' => 1,
];
$layout = array_intersect_key( $layout, $allowed );
update_user_meta( get_current_user_id(), 'rank_math_metabox_checklist_layout', $layout );
exit;
}
/**
* Ajax handler to search pages based on the searched string. Used in the Local SEO Settings.
*/
public function search_pages() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$this->has_cap_ajax( 'general' );
$term = Param::get( 'term' );
if ( empty( $term ) ) {
exit;
}
global $wpdb;
$pages = $wpdb->get_results(
$wpdb->prepare(
"SELECT ID, post_title FROM {$wpdb->prefix}posts WHERE post_type = 'page' AND post_status = 'publish' AND post_title LIKE %s",
"%{$wpdb->esc_like( $term )}%"
),
ARRAY_A
);
$data = [];
foreach ( $pages as $page ) {
$data[] = [
'id' => $page['ID'],
'text' => $page['post_title'],
'url' => get_permalink( $page['ID'] ),
];
}
wp_send_json( [ 'results' => $data ] );
}
/**
* Check if the keyword has been used before for another post.
*/
public function is_keyword_new() {
global $wpdb;
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$this->has_cap_ajax( 'onpage_general' );
$result = [ 'isNew' => true ];
if ( empty( $_GET['keyword'] ) ) {
$this->success( $result );
}
$keyword = Param::get( 'keyword', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK );
$object_id = Param::get( 'objectID', 0, FILTER_VALIDATE_INT );
$object_type = Param::get( 'objectType', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
$column_ids = [
'post' => 'ID',
'term' => 'term_id',
'user' => 'ID',
];
if ( ! in_array( $object_type, [ 'post', 'term', 'user' ], true ) ) {
$object_type = 'post';
}
$main = $wpdb->{$object_type . 's'};
$meta = $wpdb->{$object_type . 'meta'};
$query = sprintf( 'select %2$s.%1$s from %2$s inner join %3$s on %2$s.%1$s = %3$s.%4$s_id where ', $column_ids[ $object_type ], $main, $meta, $object_type );
if ( 'post' === $object_type ) {
$query .= sprintf( '%s.post_status = \'publish\' and ', $main );
}
$query .= sprintf( '%1$s.meta_key = \'rank_math_focus_keyword\' and ( %1$s.meta_value = %2$s OR %1$s.meta_value like %3$s ) and %1$s.%4$s_id != %5$d', $meta, '%s', '%s', $object_type, $object_id );
$data = $wpdb->get_row( $wpdb->prepare( $query, $keyword, $wpdb->esc_like( $keyword ) . ',%' ) ); // phpcs:ignore
$result['isNew'] = empty( $data );
$this->success( $result );
}
/**
* Get link suggestions for the current post.
*
* @param int|WP_Post $post Current post.
* @return array
*/
public function get_link_suggestions( $post ) {
global $pagenow;
if ( 'post-new.php' === $pagenow ) {
return;
}
$output = [];
$post = get_post( $post );
$args = [
'post_type' => $post->post_type,
'post__not_in' => [ $post->ID ],
'posts_per_page' => 5,
'meta_key' => 'rank_math_pillar_content',
'meta_value' => 'on',
'tax_query' => [ 'relation' => 'OR' ],
];
$taxonomies = Helper::get_object_taxonomies( $post, 'names' );
$taxonomies = array_filter( $taxonomies, [ $this, 'is_taxonomy_allowed' ] );
foreach ( $taxonomies as $taxonomy ) {
$this->set_term_query( $args, $post->ID, $taxonomy );
}
$posts = get_posts( $args );
foreach ( $posts as $related_post ) {
$item = [
'title' => get_the_title( $related_post->ID ),
'url' => get_permalink( $related_post->ID ),
'post_id' => $related_post->ID,
'focus_keywords' => get_post_meta( $related_post->ID, 'rank_math_focus_keyword', true ),
];
$item['focus_keywords'] = empty( $item['focus_keywords'] ) ? [] : explode( ',', $item['focus_keywords'] );
$output[] = $item;
}
return $output;
}
/**
* Is taxonomy allowed
*
* @param string $taxonomy Taxonomy to check.
*
* @return bool
*/
public function is_taxonomy_allowed( $taxonomy ) {
$exclude_taxonomies = [ 'post_format', 'product_shipping_class' ];
if ( Str::starts_with( 'pa_', $taxonomy ) || in_array( $taxonomy, $exclude_taxonomies, true ) ) {
return false;
}
return true;
}
/**
* Set term query.
*
* @param array $query Array of query.
* @param int $post_id Post ID to get terms from.
* @param string $taxonomy Taxonomy to get terms for.
*/
private function set_term_query( &$query, $post_id, $taxonomy ) {
$terms = wp_get_post_terms( $post_id, $taxonomy, [ 'fields' => 'ids' ] );
if ( empty( $terms ) || is_wp_error( $terms ) ) {
return;
}
$query['tax_query'][] = [
'taxonomy' => $taxonomy,
'field' => 'term_id',
'terms' => $terms,
];
}
/**
* Output link suggestions.
*
* @param array $suggestions Link items.
* @return string
*/
public function get_link_suggestions_html( $suggestions ) {
$output = '<div class="rank-math-link-suggestions-content" data-count="' . count( $suggestions ) . '">';
$is_use_fk = 'focus_keywords' === Helper::get_settings( 'titles.pt_' . get_post_type() . '_ls_use_fk' );
foreach ( $suggestions as $suggestion ) {
$label = $suggestion['title'];
if ( $is_use_fk && ! empty( $suggestion['focus_keywords'] ) ) {
$label = $suggestion['focus_keywords'][0];
}
$output .= sprintf(
'<div class="suggestion-item">
<div class="suggestion-actions">
<button class="dashicons dashicons-clipboard suggestion-copy" title="%5$s" data-clipboard-text="%2$s"></button>
<button class="dashicons dashicons-admin-links suggestion-insert" title="%6$s" data-url="%2$s" data-text="%7$s"></button>
</div>
<span class="suggestion-title" data-fk=\'%1$s\'><a target="_blank" href="%2$s" title="%3$s">%4$s</a></span>
</div>',
esc_attr( wp_json_encode( $suggestion['focus_keywords'] ) ),
$suggestion['url'],
$suggestion['title'],
$label,
esc_attr__( 'Copy Link URL to Clipboard', 'rank-math' ),
esc_attr__( 'Insert Link in Content', 'rank-math' ),
esc_attr( $label )
);
}
$output .= '</div>';
return $output;
}
/**
* Updates the is_configured value.
*
* @param int $object_id The ID of the current object.
* @param string $cmb_id The current box ID.
*/
public function update_is_configured_value( $object_id, $cmb_id ) {
if ( 0 !== strpos( $cmb_id, 'rank_math' ) && 0 !== strpos( $cmb_id, 'rank-math' ) ) {
return;
}
Helper::is_configured( true );
}
/**
* Deactivate plugin.
*/
public function deactivate_plugins() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
if ( ! current_user_can( 'activate_plugins' ) ) {
$this->error( esc_html__( 'You are not authorized to perform this action.', 'rank-math' ) );
}
$plugin = Param::post( 'plugin', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
if ( 'all' !== $plugin ) {
deactivate_plugins( $plugin );
die( '1' );
}
Importers\Detector::deactivate_all();
die( '1' );
}
/**
* Action Scheduler: exclude our actions from the past-due checker.
* Since this is a *_pre hook, it replaces the original checker.
*
* We first do the same check as what ActionScheduler_AdminView->check_pastdue_actions() does,
* but then we also count how many of those past-due actions are ours.
*
* @param null $null Null value.
*/
public function as_exclude_pastdue_actions( $null ) {
$query_args = [
'date' => as_get_datetime_object( time() - DAY_IN_SECONDS ),
'status' => \ActionScheduler_Store::STATUS_PENDING,
'per_page' => 1,
];
$store = \ActionScheduler_Store::instance();
$num_pastdue_actions = (int) $store->query_actions( $query_args, 'count' );
if ( 0 !== $num_pastdue_actions ) {
$query_args['group'] = 'rank-math';
$num_pastdue_rm_actions = (int) $store->query_actions( $query_args, 'count' );
$num_pastdue_actions -= $num_pastdue_rm_actions;
}
$threshold_seconds = (int) apply_filters( 'action_scheduler_pastdue_actions_seconds', DAY_IN_SECONDS );
$threshhold_min = (int) apply_filters( 'action_scheduler_pastdue_actions_min', 1 );
$check = ( $num_pastdue_actions >= $threshhold_min );
return (bool) apply_filters( 'action_scheduler_pastdue_actions_check', $check, $num_pastdue_actions, $threshold_seconds, $threshhold_min );
}
/**
* Check and print the Anniversary icon in the header of Rank Math's setting pages.
*/
public static function offer_icon() {
if ( ! current_user_can( 'manage_options' ) || defined( 'RANK_MATH_PRO_FILE' ) ) {
return;
}
// Holiday Season related variables.
$time = time();
$current_year = 2022;
$anniversary_start_time = gmmktime( 17, 00, 00, 10, 30, $current_year ); // 30 Oct.
$anniversary_end_time = gmmktime( 17, 00, 00, 11, 30, $current_year ); // 30 Nov.
$holiday_start_time = gmmktime( 17, 00, 00, 12, 20, $current_year ); // 20 Dec.
$holiday_end_time = gmmktime( 17, 00, 00, 01, 07, 2023 ); // 07 Jan.
if (
( $time > $anniversary_start_time && $time < $anniversary_end_time ) ||
( $time > $holiday_start_time && $time < $holiday_end_time )
) { ?>
<a href="https://rankmath.com/pricing/?utm_source=Plugin&utm_medium=Header+Offer+Icon&utm_campaign=WP" target="_blank" class="rank-math-tooltip bottom" style="margin-left:5px;">
🎉
<span><?php esc_attr_e( 'Exclusive Offer!', 'rank-math' ); ?></span>
</a>
<?php
}
}
/**
* Code to convert Addiontal Profile URLs from input type text to textarea.
*/
public function convert_additional_profile_url_to_textarea() {
if ( ! Admin_Helper::is_user_edit() ) {
return;
}
$field_description = wp_kses_post( __( 'Additional Profiles to add in the <code>sameAs</code> Schema property.', 'rank-math' ) );
?>
<script type="text/javascript">
( function( $ ) {
$( function() {
const twitterWrapper = $( '.user-twitter-wrap' );
twitterWrapper.before( '<tr><th><h2 style="margin: 0;">Rank Math SEO</h2></th><td></td></tr>' );
const additionalProfileField = $( '#additional_profile_urls' );
if ( ! additionalProfileField.length ) {
return
}
var $txtarea = $( '<textarea />' );
$txtarea.attr( 'id', additionalProfileField[0].id );
$txtarea.attr( 'name', additionalProfileField[0].name );
$txtarea.attr( 'rows', 5 );
$txtarea.val( additionalProfileField[0].value.replaceAll( " ", "\n" ) );
additionalProfileField.replaceWith( $txtarea );
$( '<p class="description"><?php echo $field_description; ?></p>' ).insertAfter( $txtarea );
} );
})(jQuery);
</script>
<?php
}
/**
* Function to replace domain with seo-by-rank-math in translation file.
*
* @param string|false $file Path to the translation file to load. False if there isn't one.
* @param string $handle Name of the script to register a translation domain to.
* @param string $domain The text domain.
*/
public function load_script_translation_file( $file, $handle, $domain ) {
if ( 'rank-math' !== $domain ) {
return $file;
}
$data = explode( '/', $file );
$data[ count( $data ) - 1 ] = preg_replace( '/rank-math/', 'seo-by-rank-math', $data[ count( $data ) - 1 ], 1 );
return implode( '/', $data );
}
}
@@ -0,0 +1,278 @@
<?php
/**
* The RankMath API.
*
* @since 1.5.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
defined( 'ABSPATH' ) || exit;
/**
* Api class.
*/
class Api {
/**
* Rank Math SEO Checkup API.
*
* @var string
*/
protected $api_url = 'https://rankmath.com/wp-json/rankmath/v1/';
/**
* Was the last request successful.
*
* @var bool
*/
protected $is_success = false;
/**
* Last error.
*
* @var string
*/
protected $last_error = '';
/**
* Last response.
*
* @var array
*/
protected $last_response = [];
/**
* Last response header code.
*
* @var int
*/
protected $last_code = 0;
/**
* User agent.
*
* @var string
*/
protected $user_agent = '';
/**
* Is blocking.
*
* @var bool
*/
protected $is_blocking = true;
/**
* Main instance
*
* Ensure only one instance is loaded or can be loaded.
*
* @return Api
*/
public static function get() {
static $instance;
if ( is_null( $instance ) && ! ( $instance instanceof Api ) ) {
$instance = new Api();
$instance->is_blocking = true;
$instance->user_agent = 'RankMath/' . md5( esc_url( home_url( '/' ) ) );
}
return $instance;
}
/**
* Was the last request successful?
*
* @return bool True for success, false for failure
*/
public function is_success() {
return $this->is_success;
}
/**
* Get the last error returned by either the network transport, or by the API.
* If something didn't work, this should contain the string describing the problem.
*
* @return array|false describing the error
*/
public function get_error() {
return $this->last_error ? $this->last_error : false;
}
/**
* Get an array containing the HTTP headers and the body of the API response.
*
* @return array Assoc array with keys 'headers' and 'body'
*/
public function get_response() {
return $this->last_response;
}
/**
* Remove registration data and disconnect from RankMath.com.
*
* @param string $username Username.
* @param string $api_key Api key.
*/
public function deactivate_site( $username, $api_key ) {
$this->is_blocking = false;
$data = wp_json_encode(
[
'username' => $username,
'api_key' => $api_key,
'site_url' => esc_url( home_url() ),
]
);
$response = wp_remote_post(
RANK_MATH_SITE_URL . '/wp-json/rankmath/v1/deactivateSite',
[
'body' => $data,
'headers' => [
'Content-Type' => 'application/json',
],
],
);
}
/**
* Make an HTTP GET request - for retrieving data.
*
* @param string $url URL to do request.
* @param array $args Assoc array of arguments (usually your data).
* @param int $timeout Timeout limit for request in seconds.
*
* @return array|false Assoc array of API response, decoded from JSON.
*/
public function http_get( $url, $args = [], $timeout = 10 ) {
return $this->make_request( 'GET', $url, $args, $timeout );
}
/**
* Make an HTTP POST request - for creating and updating items.
*
* @param string $url URL to do request.
* @param array $args Assoc array of arguments (usually your data).
* @param int $timeout Timeout limit for request in seconds.
*
* @return array|false Assoc array of API response, decoded from JSON.
*/
public function http_post( $url, $args = [], $timeout = 10 ) {
return $this->make_request( 'POST', $url, $args, $timeout );
}
/**
* Make an HTTP PUT request - for creating new items.
*
* @param string $url URL to do request.
* @param array $args Assoc array of arguments (usually your data).
* @param int $timeout Timeout limit for request in seconds.
*
* @return array|false Assoc array of API response, decoded from JSON.
*/
public function http_put( $url, $args = [], $timeout = 10 ) {
return $this->make_request( 'PUT', $url, $args, $timeout );
}
/**
* Make an HTTP DELETE request - for deleting data.
*
* @param string $url URL to do request.
* @param array $args Assoc array of arguments (usually your data).
* @param int $timeout Timeout limit for request in seconds.
*
* @return array|false Assoc array of API response, decoded from JSON.
*/
public function http_delete( $url, $args = [], $timeout = 10 ) {
return $this->make_request( 'DELETE', $url, $args, $timeout );
}
/**
* Performs the underlying HTTP request. Not very exciting.
*
* @param string $http_verb The HTTP verb to use: get, post, put, patch, delete.
* @param string $url URL to do request.
* @param array $args Assoc array of parameters to be passed.
* @param int $timeout Timeout limit for request in seconds.
*
* @return array|false Assoc array of decoded result.
*/
protected function make_request( $http_verb, $url, $args = [], $timeout = 10 ) {
$params = [
'timeout' => $timeout,
'method' => $http_verb,
'user-agent' => $this->user_agent,
'blocking' => $this->is_blocking,
];
if ( ! empty( $args ) && is_array( $args ) ) {
$params['body'] = $args;
}
$this->reset();
$response = wp_remote_request( $this->api_url . $url, $params );
$this->determine_success( $response );
return $this->format_response( $response );
}
/**
* Decode the response and format any error messages for debugging
*
* @param array $response The response from the curl request.
*
* @return array|false The JSON decoded into an array
*/
protected function format_response( $response ) {
$this->last_response = $response;
if ( is_wp_error( $response ) ) {
return false;
}
if ( ! empty( $response['body'] ) ) {
return json_decode( $response['body'], true );
}
return false;
}
/**
* Check if the response was successful or a failure. If it failed, store the error.
*
* @param array $response The response from the curl request.
*/
protected function determine_success( $response ) {
if ( is_wp_error( $response ) ) {
$this->last_error = 'WP_Error: ' . $response->get_error_message();
return;
}
$this->last_code = wp_remote_retrieve_response_code( $response );
if ( in_array( $this->last_code, [ 200, 204 ], true ) ) {
$this->is_success = true;
return;
}
$this->last_error = 'Unknown error, call getLastResponse() to find out what happened.';
}
/**
* Reset request.
*/
protected function reset() {
$this->last_code = 0;
$this->last_error = '';
$this->is_success = false;
$this->is_blocking = true;
$this->last_response = [
'body' => null,
'headers' => null,
];
}
}
@@ -0,0 +1,241 @@
<?php
/**
* Ask user to review Rank Math on wp.org, in the meta box after 2 weeks.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Traits\Ajax;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Ask_Review class.
*/
class Ask_Review {
use Hooker, Ajax;
/**
* Now.
*
* @var string
*/
public $current_time = '';
/**
* Date of release of version 1.0.57. Turned into a timestamp in the constructor.
*
* @var string
*/
public $record_date = '2021-02-03 13:00';
/**
* Rank Math plugin install date.
*
* @var string
*/
public $install_date = '';
/**
* Constructor method.
*/
public function __construct() {
$this->current_time = current_time( 'timestamp' );
$this->record_date = strtotime( $this->record_date );
$this->install_date = get_option( 'rank_math_install_date' );
if ( false === $this->install_date ) {
$this->install_date = $this->current_time;
}
}
/**
* Register hooks.
*/
public function hooks() {
$this->ajax( 'already_reviewed', 'already_reviewed' );
// Post editor tab.
if ( $this->current_time > $this->install_date + ( 10 * DAY_IN_SECONDS ) ) {
Helper::add_json( 'showReviewTab', true );
}
// Admin notice.
$review_notice_date = $this->get_review_notice_date();
if ( $this->current_time > $review_notice_date ) {
if ( get_option( 'rank_math_review_notice_added' ) === false && ! Helper::has_notification( 'rank_math_pro_notice' ) ) {
$this->add_notice();
}
// Make dismiss button work like the "Maybe later" link.
$this->action( 'wp_helpers_notification_dismissed', 'review_notice_after_dismiss' );
}
$this->action( 'admin_footer', 'review_notice_js', 15 );
}
/**
* Add inline JS related to the review notice.
*
* @return void
*/
public function review_notice_js() {
if ( ! Helper::has_notification( 'rank_math_review_plugin_notice' ) ) {
return;
}
?>
<script>
(function( $ ) {
$( function() {
$('.rank-math-dismiss-review-notice').on( 'click', function(e) {
var $this = $(this);
if ( ! $this.hasClass( 'rank-math-review-action' ) ) {
e.preventDefault();
}
if ( $this.hasClass( 'rank-math-maybe-later-action' ) ) {
$('#rank_math_review_plugin_notice').find( '.notice-dismiss' ).trigger('click');
return false;
}
jQuery.ajax( {
url: rankMath.ajaxurl,
data: { action: 'rank_math_already_reviewed', security: rankMath.security,
},
} );
$('#rank_math_review_plugin_notice').find( '.notice-dismiss' ).trigger('click');
});
});
})(jQuery);
</script>
<style>
#rank_math_review_plugin_notice .rank-math-notice.is-dismissible a,
#rank_math_pro_notice .rank-math-notice.is-dismissible a {
color: #4f52d4;
}
#rank_math_review_plugin_notice.is-dismissible,
#rank_math_pro_notice.is-dismissible {
border-width: 0 0 0 4px;
border-left-color: #6668BD;
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
padding: 5px 10px 5px 65px;
}
#rank_math_review_plugin_notice.is-dismissible:before,
#rank_math_pro_notice.is-dismissible:before {
content: '';
width: 50px;
height: 100%;
background: rgba(102, 104, 189, 0.09);
position: absolute;
left: 0;
top: 0;
}
#rank_math_review_plugin_notice.is-dismissible:after,
#rank_math_pro_notice.is-dismissible:after {
content: url('data:image/svg+xml;charset=UTF-8, <svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="20"><g fill="white"><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"></path><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"></path></g></svg>' );
padding: 3px;
border-radius: 3px;
position: absolute;
left: 12px;
top: 18px;
background: linear-gradient(-135deg, #2488e1, #724bb7);
width: 23px;
height: 23px;
display: flex;
justify-content: center;
line-height: 1;
align-items: center;
}
</style>
<?php
}
/**
* Add admin notice.
*
* @return void
*/
public function add_notice() {
$message = '<p>';
// Translators: placeholder is the plugin name.
$message .= sprintf( esc_html__( 'Hey, we noticed you\'ve been using %s for more than a week now – that\'s awesome!', 'rank-math' ), '<strong>' . _x( 'Rank Math SEO', 'plugin name inside the review notice', 'rank-math' ) . '</strong>' );
$message .= '<br>';
$message .= esc_html__( 'Could you please do us a BIG favor and give it a rating on WordPress.org to help us spread the word and boost our motivation?', 'rank-math' ) . '</p>
<p><strong>Bhanu Ahluwalia</strong><br>' . esc_html__( 'Co-founder of Rank Math', 'rank-math' ) . '</p>
<p>
<a href="https://wordpress.org/support/plugin/seo-by-rank-math/reviews/?filter=5#new-post" class="rank-math-dismiss-review-notice rank-math-review-action rank-math-review-out" target="_blank" rel="noopener noreferrer"><strong>' . esc_html__( 'Yes, you deserve it', 'rank-math' ) . '</strong></a><br>
<a href="#" class="rank-math-dismiss-review-notice rank-math-maybe-later-action">' . esc_html__( 'No, maybe later', 'rank-math' ) . '</a><br>
<a href="#" class="rank-math-dismiss-review-notice rank-math-already-reviewed-action">' . esc_html__( 'I already did', 'rank-math' ) . '</a>
</p>';
Helper::add_notification(
$message,
[
'type' => 'info',
'id' => 'rank_math_review_plugin_notice',
'capability' => 'install_plugins',
]
);
update_option( 'rank_math_review_notice_added', '1', false );
}
/**
* Set "already reviewed" flag after the user dismisses the notice.
*
* @param string $notification_id Dismissed notice ID.
* @return void
*/
public function review_notice_after_dismiss( $notification_id ) {
if ( 'rank_math_review_plugin_notice' !== $notification_id ) {
return;
}
delete_option( 'rank_math_review_notice_date' );
delete_option( 'rank_math_review_notice_added' );
update_option( 'rank_math_review_notice_delayed', true, false );
}
/**
* Get stored notice start date.
*
* @return int
*/
public function get_review_notice_date() {
$review_notice_date = get_option( 'rank_math_review_notice_date' );
if ( false !== $review_notice_date ) {
return $review_notice_date;
}
$delay_days = 14;
if ( $this->install_date < $this->record_date && ! get_option( 'rank_math_review_notice_delayed' ) ) {
$delay_days = wp_rand( 7, 30 );
}
$review_notice_date = $this->current_time + ( $delay_days * DAY_IN_SECONDS );
update_option( 'rank_math_review_notice_date', $review_notice_date, false );
return $review_notice_date;
}
/**
* Set "already reviewed" flag.
*/
public function already_reviewed() {
check_ajax_referer( 'rank-math-ajax-nonce', 'security' );
$this->has_cap_ajax( 'onpage_general' );
update_option( 'rank_math_already_reviewed', current_time( 'timestamp' ) );
$this->success( 'success' );
}
}
@@ -0,0 +1,281 @@
<?php
/**
* Register all the necessary CSS and JS.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Google\Console;
use RankMath\Google\Analytics;
use RankMath\Analytics\Url_Inspection;
defined( 'ABSPATH' ) || exit;
/**
* Assets class.
*
* @codeCoverageIgnore
*/
class Assets implements Runner {
use Hooker;
/**
* Prefix for the enqueue handles.
*/
const PREFIX = 'rank-math-';
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'admin_enqueue_scripts', 'register' );
$this->action( 'admin_enqueue_scripts', 'enqueue' );
$this->action( 'admin_enqueue_scripts', 'overwrite_wplink', 99 );
if ( 'elementor' === \RankMath\Helpers\Param::get( 'action' ) ) {
$this->action( 'elementor/editor/before_enqueue_scripts', 'register' );
$this->action( 'elementor/editor/before_enqueue_scripts', 'enqueue' );
$this->action( 'elementor/editor/before_enqueue_scripts', 'overwrite_wplink', 99 );
}
}
/**
* Register styles and scripts.
*/
public function register() {
$js = rank_math()->plugin_url() . 'assets/admin/js/';
$css = rank_math()->plugin_url() . 'assets/admin/css/';
$vendor = rank_math()->plugin_url() . 'assets/vendor/';
// Styles.
wp_register_style( self::PREFIX . 'common', $css . 'common.css', null, rank_math()->version );
wp_register_style( self::PREFIX . 'cmb2', $css . 'cmb2.css', null, rank_math()->version );
wp_register_style( self::PREFIX . 'dashboard', $css . 'dashboard.css', [ 'rank-math-common', 'wp-components' ], rank_math()->version );
wp_register_style( self::PREFIX . 'dashboard-widget', $css . 'dashboard-widget.css', null, rank_math()->version );
// Scripts.
wp_register_script( self::PREFIX . 'common', $js . 'common.js', [ 'jquery', 'wp-i18n', 'lodash' ], rank_math()->version, true );
wp_register_script( self::PREFIX . 'dashboard', $js . 'dashboard.js', [ 'jquery', 'clipboard', 'lodash', 'wp-components', 'wp-element' ], rank_math()->version, true );
// Select2.
wp_register_style( 'select2-rm', $vendor . 'select2/select2.min.css', null, '4.0.6-rc.1' );
wp_register_script( 'select2-rm', $vendor . 'select2/select2.min.js', null, '4.0.6-rc.1', true );
// Inline script for core admin page Settings > Permalinks.
wp_register_script( self::PREFIX . 'core-permalink-settings', '' ); // phpcs:ignore
wp_add_inline_script( self::PREFIX . 'core-permalink-settings', $this->get_permalinks_inline_script() );
if ( ! wp_script_is( 'wp-hooks', 'registered' ) ) {
wp_register_script( 'wp-hooks', rank_math()->plugin_url() . 'assets/vendor/hooks.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'wp-wordcount', 'registered' ) ) {
wp_register_script( 'wp-wordcount', rank_math()->plugin_url() . 'assets/vendor/wordcount.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'wp-autop', 'registered' ) ) {
wp_register_script( 'wp-autop', rank_math()->plugin_url() . 'assets/vendor/autop.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'wp-url', 'registered' ) ) {
wp_register_script( 'wp-url', rank_math()->plugin_url() . 'assets/vendor/url.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'wp-i18n', 'registered' ) ) {
wp_register_script( 'wp-i18n', rank_math()->plugin_url() . 'assets/vendor/i18n.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'clipboard', 'registered' ) ) {
wp_register_script( 'clipboard', rank_math()->plugin_url() . 'assets/vendor/clipboard.min.js', [], rank_math()->version, true );
}
if ( ! wp_script_is( 'lodash', 'registered' ) ) {
wp_register_script( 'lodash', rank_math()->plugin_url() . 'assets/vendor/lodash.js', [], rank_math()->version );
wp_add_inline_script( 'lodash', 'window.lodash = _.noConflict();' );
}
Helper::add_json(
'api',
[
'root' => esc_url_raw( get_rest_url() ),
'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ),
]
);
Helper::add_json(
'keywordsApi',
[
'url' => 'https://api.rankmath.com/ltkw/v1/',
]
);
Helper::add_json(
'links',
KB::get_links()
);
Helper::add_json(
'validationl10n',
[
'regexErrorDefault' => __( 'Please use the correct format.', 'rank-math' ),
'requiredErrorDefault' => __( 'This field is required.', 'rank-math' ),
'emailErrorDefault' => __( 'Please enter a valid email address.', 'rank-math' ),
'urlErrorDefault' => __( 'Please enter a valid URL.', 'rank-math' ),
]
);
Helper::add_json( 'capitalizeTitle', Helper::get_settings( 'titles.capitalize_titles' ) );
Helper::add_json( 'isConsoleConnected', Console::is_console_connected() );
Helper::add_json( 'isAnalyticsConnected', Analytics::is_analytics_connected() );
Helper::add_json( 'isUrlInspectionEnabled', Url_Inspection::is_enabled() );
/**
* Allow other plugins to register/deregister admin styles or scripts after plugin assets.
*/
$this->do_action( 'admin/register_scripts' );
}
/**
* Enqueue styles and scripts.
*/
public function enqueue() {
$screen = get_current_screen();
if ( 'dashboard' === $screen->id ) {
wp_enqueue_style( self::PREFIX . 'dashboard-widget' );
wp_enqueue_script( self::PREFIX . 'dashboard' );
}
// Our screens only.
if ( ! in_array( $screen->taxonomy, Helper::get_allowed_taxonomies(), true ) && ! in_array( $screen->id, $this->get_admin_screen_ids(), true ) ) {
return;
}
// Add thank you.
$this->filter( 'admin_footer_text', 'admin_footer_text' );
/**
* Allow other plugins to enqueue/dequeue admin styles or scripts after plugin assets.
*/
$this->do_action( 'admin/enqueue_scripts' );
}
/**
* Add footer credit on admin pages.
*
* @param string $text Default text for admin footer.
* @return string
*/
public function admin_footer_text( $text ) {
/* translators: plugin url */
return Helper::is_whitelabel() ? $text : sprintf( wp_kses_post( __( 'Thank you for using <a href="%s" target="_blank">Rank Math</a>', 'rank-math' ) ), KB::get( 'seo-suite', 'Admin Footer Text' ) );
}
/**
* Overwrite wplink script file.
* Rank Math adds new options in the link popup when editing a post.
*/
public function overwrite_wplink() {
wp_deregister_script( 'wplink' );
wp_register_script( 'wplink', rank_math()->plugin_url() . 'assets/admin/js/wplink.js', [ 'jquery', 'wp-a11y' ], rank_math()->version, true );
wp_localize_script(
'wplink',
'wpLinkL10n',
[
'title' => esc_html__( 'Insert/edit link', 'rank-math' ),
'update' => esc_html__( 'Update', 'rank-math' ),
'save' => esc_html__( 'Add Link', 'rank-math' ),
'noTitle' => esc_html__( '(no title)', 'rank-math' ),
'noMatchesFound' => esc_html__( 'No matches found.', 'rank-math' ),
'linkSelected' => esc_html__( 'Link selected.', 'rank-math' ),
'linkInserted' => esc_html__( 'Link inserted.', 'rank-math' ),
'relCheckbox' => __( 'Add <code>rel="nofollow"</code>', 'rank-math' ),
'sponsoredCheckbox' => __( 'Add <code>rel="sponsored"</code>', 'rank-math' ),
'linkTitle' => esc_html__( 'Link Title', 'rank-math' ),
]
);
}
/**
* Enqueues styles.
*
* @param string $style Name of the style.
*/
public function enqueue_style( $style ) {
wp_enqueue_style( self::PREFIX . $style );
}
/**
* Enqueues scripts.
*
* @param string $script Name of the script.
*/
public function enqueue_script( $script ) {
wp_enqueue_script( self::PREFIX . $script );
}
/**
* Get admin screen ids.
*
* @return array
*/
private function get_admin_screen_ids() {
$pages = [
'toplevel_page_rank-math',
'rank-math_page_rank-math-role-manager',
'rank-math_page_rank-math-seo-analysis',
'rank-math_page_rank-math-404-monitor',
'rank-math_page_rank-math-redirections',
'rank-math_page_rank-math-link-builder',
'rank-math_page_rank-math-analytics',
'rank-math_page_rank-math-import-export',
'rank-math_page_rank-math-help',
'user-edit',
'profile',
'rank_math_schema',
];
return array_merge( $pages, Helper::get_allowed_post_types() );
}
/**
* Inline script to warn the user about the risks of changing the permalinks on a live site.
*
* @return string
*/
public function get_permalinks_inline_script() {
// Don't add the script if site is set to noindex.
if ( ! get_option( 'blog_public' ) ) {
return '';
}
return "jQuery( window ).load( function() {
var noticeShown = false;
var showNotice = function() {
if ( noticeShown ) {
return true;
}
jQuery( '.rank-math-notice-permalinks-warning' ).removeClass( 'hidden' ).insertBefore( 'p.submit' );
noticeShown = true;
return true;
}
jQuery( '.available-structure-tags button' ).on( 'click', showNotice );
jQuery( 'input[type=text], input[type=radio]' ).on( 'focus change', showNotice );
} );";
}
}
@@ -0,0 +1,152 @@
<?php
/**
* The admin post columns functionality.
*
* @since 1.0.212
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Helpers\Param;
use RankMath\Helpers\Url;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Admin\Admin_Helper;
defined( 'ABSPATH' ) || exit;
/**
* Post_Columns class.
*/
class Bulk_Actions implements Runner {
use Hooker;
/**
* SEO data.
*
* @var array
*/
private $data = [];
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'current_screen', 'init' );
}
/**
* Intialize.
*/
public function init() {
if ( ! Helper::has_cap( 'onpage_general' ) || ! $this->can_add() ) {
return;
}
$this->register_post_columns();
$this->action( 'admin_enqueue_scripts', 'enqueue' );
}
/**
* Register post column hooks.
*/
private function register_post_columns() {
$post_types = Helper::get_allowed_post_types();
foreach ( $post_types as $post_type ) {
$this->filter( "bulk_actions-edit-{$post_type}", 'post_bulk_actions' );
}
$taxonomies = Helper::get_accessible_taxonomies();
unset( $taxonomies['post_format'] );
$taxonomies = wp_list_pluck( $taxonomies, 'label', 'name' );
foreach ( $taxonomies as $taxonomy => $label ) {
$this->filter( "bulk_actions-edit-{$taxonomy}", 'post_bulk_actions' );
}
}
/**
* Add bulk actions for applicable posts, pages, CPTs.
*
* @param array $actions Actions.
* @return array New actions.
*/
public function post_bulk_actions( $actions ) {
$new_actions = [ 'rank_math_options' => __( '&#8595; Rank Math', 'rank-math' ) ];
if ( Helper::has_cap( 'onpage_advanced' ) ) {
$new_actions['rank_math_bulk_robots_noindex'] = __( 'Set to noindex', 'rank-math' );
$new_actions['rank_math_bulk_robots_index'] = __( 'Set to index', 'rank-math' );
$new_actions['rank_math_bulk_robots_nofollow'] = __( 'Set to nofollow', 'rank-math' );
$new_actions['rank_math_bulk_robots_follow'] = __( 'Set to follow', 'rank-math' );
$new_actions['rank_math_bulk_remove_canonical'] = __( 'Remove custom canonical URL', 'rank-math' );
if ( Helper::is_module_active( 'redirections' ) && Helper::has_cap( 'redirections' ) ) {
$new_actions['rank_math_bulk_redirect'] = __( 'Redirect', 'rank-math' );
$new_actions['rank_math_bulk_stop_redirect'] = __( 'Remove redirection', 'rank-math' );
}
}
if ( Helper::is_module_active( 'rich-snippet' ) && Helper::has_cap( 'onpage_snippet' ) ) {
$new_actions['rank_math_bulk_schema_none'] = __( 'Set Schema: None', 'rank-math' );
$post_type = Param::get( 'post_type', get_post_type() );
$post_type_default = Helper::get_settings( 'titles.pt_' . $post_type . '_default_rich_snippet' );
if ( $post_type_default ) {
// Translators: placeholder is the default Schema type setting.
$new_actions['rank_math_bulk_schema_default'] = sprintf( __( 'Set Schema: Default (%s)', 'rank-math' ), $post_type_default );
}
}
if ( is_array( $actions ) && count( $new_actions ) > 1 ) {
return array_merge( $actions, $new_actions );
}
return $actions;
}
/**
* Enqueue styles and scripts.
*/
public function enqueue() {
$screen = get_current_screen();
wp_enqueue_style( 'rank-math-post-bulk-edit', rank_math()->plugin_url() . 'assets/admin/css/post-list.css', [ 'wp-components' ], rank_math()->version );
$allow_editing = Helper::get_settings( 'titles.pt_' . $screen->post_type . '_bulk_editing', true );
if ( ! $allow_editing || 'readonly' === $allow_editing ) {
return;
}
wp_enqueue_script( 'rank-math-post-bulk-edit', rank_math()->plugin_url() . 'assets/admin/js/post-list.js', [ 'lodash', 'wp-element', 'wp-components' ], rank_math()->version, true );
Helper::add_json( 'isUserRegistered', Helper::is_site_connected() );
Helper::add_json( 'contentAICredits', Helper::get_content_ai_credits() );
Helper::add_json( 'contentAIPlan', Helper::get_content_ai_plan() );
Helper::add_json( 'isProActive', defined( 'RANK_MATH_PRO_FILE' ) );
Helper::add_json( 'connectSiteUrl', Admin_Helper::get_activate_url( Url::get_current_url() ) );
}
/**
* Whether to add Bulk actions on the page.
*/
private function can_add() {
global $pagenow;
if ( 'edit-tags.php' === $pagenow ) {
return Helper::get_settings( 'titles.tax_' . Param::get( 'taxonomy' ) . '_add_meta_box' );
}
if ( Admin_Helper::is_post_list() || Admin_Helper::is_media_library() ) {
$screen = get_current_screen();
$allowed_post_types = Helper::get_allowed_post_types();
$allowed_post_types[] = 'attachment';
return in_array( $screen->post_type, $allowed_post_types, true );
}
return false;
}
}
@@ -0,0 +1,290 @@
<?php
/**
* The CMB2 fields for the plugin.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Admin\Admin_Helper;
defined( 'ABSPATH' ) || exit;
/**
* CMB2_Fields class.
*
* @codeCoverageIgnore
*/
class CMB2_Fields implements Runner {
use Hooker;
/**
* Register hooks.
*/
public function hooks() {
if ( ! has_action( 'cmb2_render_switch' ) ) {
$this->action( 'cmb2_render_switch', 'render_switch', 10, 5 );
}
if ( ! has_action( 'cmb2_render_notice' ) ) {
$this->action( 'cmb2_render_notice', 'render_notice' );
}
if ( ! has_action( 'cmb2_render_address' ) ) {
$this->action( 'cmb2_render_address', 'render_address', 10, 5 );
}
if ( ! has_action( 'cmb2_render_advanced_robots' ) ) {
$this->action( 'cmb2_render_advanced_robots', 'render_advanced_robots', 10, 5 );
}
if ( ! has_action( 'cmb2_render_toggle' ) ) {
$this->action( 'cmb2_render_toggle', 'render_toggle', 10, 5 );
}
$this->filter( 'cmb2_sanitize_toggle', 'sanitize_toggle', 10, 2 );
}
/**
* Sanitize toggle field.
*
* @param string $override_value Sanitization override value to return.
* @param string $value The field value.
*/
public function sanitize_toggle( $override_value, $value ) {
return is_null( $value ) ? 'off' : $value;
}
/**
* Render toggle field.
*
* @param array $field The passed in `CMB2_Field` object.
* @param mixed $escaped_value The value of this field escaped
* It defaults to `sanitize_text_field`.
* If you need the unescaped value, you can access it
* via `$field->value()`.
* @param int $object_id The ID of the current object.
* @param string $object_type The type of object you are working with.
* Most commonly, `post` (this applies to all post-types),
* but could also be `comment`, `user` or `options-page`.
* @param object $field_type_object This `CMB2_Types` object.
*/
public function render_toggle( $field, $escaped_value, $object_id, $object_type, $field_type_object ) {
$field_name = $field->_name();
$active_value = ! empty( $field->args( 'active_value' ) ) ? $field->args( 'active_value' ) : 'on';
$escaped_value = ! empty( $field->args( 'force_enable' ) ) ? 'on' : $escaped_value;
$args = [
'type' => 'checkbox',
'id' => $field_name,
'name' => $field_name,
'desc' => '',
'value' => $active_value,
'disabled' => isset( $field->args['disabled'] ) ? $field->args['disabled'] : false,
];
if ( $escaped_value === $active_value ) {
$args['checked'] = 'checked';
}
echo '<label class="cmb2-toggle">';
echo $field_type_object->input( $args );
echo '<span class="cmb2-slider">';
echo '<svg width="3" height="8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2 6" class="toggle_on" role="img" aria-hidden="true" focusable="false"><path d="M0 0h2v6H0z"></path></svg>';
echo '<svg width="8" height="8" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 6 6" class="toggle_off" role="img" aria-hidden="true" focusable="false"><path d="M3 1.5c.8 0 1.5.7 1.5 1.5S3.8 4.5 3 4.5 1.5 3.8 1.5 3 2.2 1.5 3 1.5M3 0C1.3 0 0 1.3 0 3s1.3 3 3 3 3-1.3 3-3-1.3-3-3-3z"></path></svg>';
echo '</span>';
echo '</label>';
$field_type_object->_desc( true, true );
}
/**
* Render switch field.
*
* @param array $field The passed in `CMB2_Field` object.
* @param mixed $escaped_value The value of this field escaped
* It defaults to `sanitize_text_field`.
* If you need the unescaped value, you can access it
* via `$field->value()`.
* @param int $object_id The ID of the current object.
* @param string $object_type The type of object you are working with.
* Most commonly, `post` (this applies to all post-types),
* but could also be `comment`, `user` or `options-page`.
* @param object $field_type_object This `CMB2_Types` object.
*/
public function render_switch( $field, $escaped_value, $object_id, $object_type, $field_type_object ) {
if ( empty( $field->args['options'] ) ) {
$field->args['options'] = [
'off' => esc_html( $field->get_string( 'off', __( 'Off', 'rank-math' ) ) ),
'on' => esc_html( $field->get_string( 'on', __( 'On', 'rank-math' ) ) ),
];
}
$field->set_options();
echo $field_type_object->radio_inline();
}
/**
* Render notices
*
* @param array $field The passed in `CMB2_Field` object.
*/
public function render_notice( $field ) {
$hash = [
'error' => 'notice notice-alt notice-error error inline rank-math-notice',
'info' => 'notice notice-alt notice-info info inline rank-math-notice',
'warning' => 'notice notice-alt notice-warning warning inline rank-math-notice',
];
echo '<div class="' . $hash[ $field->args( 'what' ) ] . '"><p>' . $field->args( 'content' ) . '</p></div>';
}
/**
* Render address field.
*
* @param array $field The passed in `CMB2_Field` object.
* @param mixed $escaped_value The value of this field escaped
* It defaults to `sanitize_text_field`.
* If you need the unescaped value, you can access it
* via `$field->value()`.
* @param int $object_id The ID of the current object.
* @param string $object_type The type of object you are working with.
* Most commonly, `post` (this applies to all post-types),
* but could also be `comment`, `user` or `options-page`.
* @param object $field_type_object This `CMB2_Types` object.
*/
public function render_address( $field, $escaped_value, $object_id, $object_type, $field_type_object ) {
// Make sure we assign each part of the value we need.
$value = wp_parse_args(
$escaped_value,
[
'streetAddress' => '',
'addressLocality' => '',
'addressRegion' => '',
'postalCode' => '',
'addressCountry' => '',
]
);
$strings = [
'streetAddress' => 'Street Address',
'addressLocality' => 'Locality',
'addressRegion' => 'Region',
'postalCode' => 'Postal Code',
'addressCountry' => 'Country',
];
foreach ( array_keys( $value ) as $id ) :
echo '<div class="cmb-address-field">' . $field_type_object->input(
[
'name' => $field_type_object->_name( '[' . $id . ']' ),
'id' => $field_type_object->_id( '_' . $id ),
'value' => $value[ $id ],
'placeholder' => esc_html( $field->get_string( $id . '_text', $strings[ $id ] ) ),
]
) . '</div>';
endforeach;
}
/**
* Render Advanced Robots fields.
*
* @param array $field The passed in `CMB2_Field` object.
* @param mixed $escaped_value The value of this field escaped
* It defaults to `sanitize_text_field`.
* If you need the unescaped value, you can access it
* via `$field->value()`.
* @param int $object_id The ID of the current object.
* @param string $object_type The type of object you are working with.
* Most commonly, `post` (this applies to all post-types),
* but could also be `comment`, `user` or `options-page`.
* @param object $field_type_object This `CMB2_Types` object.
*/
public function render_advanced_robots( $field, $escaped_value, $object_id, $object_type, $field_type_object ) {
// Make sure we assign each part of the value we need.
$values = wp_parse_args(
$escaped_value,
[
'max-snippet' => -1,
'max-video-preview' => -1,
'max-image-preview' => 'large',
]
);
$strings = [
'max-snippet' => __( 'Snippet', 'rank-math' ) . Admin_Helper::get_tooltip( esc_html__( 'Specify a maximum text-length, in characters, of a snippet for your page.', 'rank-math' ) ),
'max-video-preview' => __( 'Video Preview', 'rank-math' ) . Admin_Helper::get_tooltip( esc_html__( 'Specify a maximum duration in seconds of an animated video preview.', 'rank-math' ) ),
'max-image-preview' => __( 'Image Preview', 'rank-math' ) . Admin_Helper::get_tooltip( esc_html__( 'Specify a maximum size of image preview to be shown for images on this page.', 'rank-math' ) ),
];
echo '<ul class="cmb-advanced-robots-list no-select-all cmb2-list cmb-advanced-robots-field">';
foreach ( $values as $id => $value ) :
$value = isset( $escaped_value[ $id ] ) ? $escaped_value[ $id ] : $value;
echo '<li>';
echo '<label for="' . $field_type_object->_id( '_' . $id . '_name' ) . '">';
echo $field_type_object->checkbox(
[
'name' => $field_type_object->_name( "[{$id}][enable]" ),
'id' => $field_type_object->_id( '_' . $id . '_name' ),
'value' => true,
'checked' => ! empty( $escaped_value[ $id ] ) || empty( $escaped_value ) ? 'checked' : false,
]
);
echo $field->get_string( $id . '_text', $strings[ $id ] ) . '</label>';
if ( 'max-image-preview' === $id ) {
echo $field_type_object->select(
[
'name' => $field_type_object->_name( "[{$id}][length]" ),
'id' => $field_type_object->_id( '_' . $id . '_name' ),
'options' => $this->get_image_sizes( $value ),
]
);
}
if ( 'max-image-preview' !== $id ) {
echo $field_type_object->input(
[
'name' => $field_type_object->_name( "[{$id}][length]" ),
'id' => $field_type_object->_id( '_' . $id . '_length' ),
'value' => $value ? $value : -1,
'type' => 'number',
'min' => -1,
]
);
}
echo '</li>';
endforeach;
echo '</ul>';
}
/**
* Get Image sizes.
*
* @param string $size The selected image size.
* @return string $options The image sizes.
*/
private function get_image_sizes( $size = 'large' ) {
$values = [
'large' => __( 'Large', 'rank-math' ),
'standard' => __( 'Standard', 'rank-math' ),
'none' => __( 'None', 'rank-math' ),
];
$options = '';
foreach ( $values as $data => $label ) {
$options .= '<option value="' . $data . '" ' . selected( $size, $data, false ) . ' >' . $label . '</option>';
}
return $options;
}
}
@@ -0,0 +1,224 @@
<?php
/**
* The Dashboard Widget of the plugin.
*
* @since 1.0.81
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Dashboard_Widget class.
*
* @codeCoverageIgnore
*/
class Dashboard_Widget {
use Hooker;
/**
* Constructor.
*/
public function __construct() {
$this->action( 'wp_dashboard_setup', 'add_dashboard_widgets' );
$this->action( 'rank_math/dashboard/widget', 'dashboard_widget_feed', 98 );
$this->action( 'rank_math/dashboard/widget', 'dashboard_widget_footer', 99 );
}
/**
* Register dashboard widget.
*/
public function add_dashboard_widgets() {
// Early Bail if action is not registered for the dashboard widget hook.
if (
( ! Helper::is_module_active( '404-monitor' ) || ! Helper::has_cap( '404_monitor' ) ) &&
( ! Helper::is_module_active( 'redirections' ) || ! Helper::has_cap( 'redirections' ) ) &&
( ! Helper::is_module_active( 'analytics' ) || ! Helper::has_cap( 'analytics' ) )
) {
return;
}
$icon = '<span class="rank-math-icon"><svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="20"><g><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"></path><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"></path></g></svg></span>';
wp_add_dashboard_widget(
'rank_math_dashboard_widget',
$icon . esc_html__( 'Rank Math Overview', 'rank-math' ),
[ $this, 'render_dashboard_widget' ],
null,
null,
'normal',
'high'
);
}
/**
* Render dashboard widget.
*/
public function render_dashboard_widget() {
echo '<div id="rank-math-dashboard-widget" class="rank-math-loading"></div>';
}
/**
* Add Feed data in the admin dashboard widget.
*/
public function dashboard_widget_feed() {
$posts = $this->get_feed();
?>
<h3 class="rank-math-blog-title"><?php esc_html_e( 'Latest Blog Posts from Rank Math', 'rank-math' ); ?></h3>
<?php if ( empty( $posts ) ) : ?>
<p><?php esc_html_e( 'Error: the Rank Math blog feed could not be downloaded.', 'rank-math' ); ?></p>
<?php
return;
endif;
echo '<ul class="rank-math-blog-list">';
$posts = $this->filter_posts( $posts );
$label = $this->get_item_label( $posts );
foreach ( $posts as $index => $post ) :
$link = $this->add_utm_params( $post['link'], $index );
?>
<li class="rank-math-blog-post">
<h4>
<?php if ( $label ) : ?>
<span class="rank-math-new-badge"><?php echo esc_html( $label ); ?></span>
<?php endif; ?>
<a target="_blank" href="<?php echo esc_url( $link ); ?>">
<?php echo esc_html( $post['title']['rendered'] ); ?>
</a>
</h4>
</li>
<?php
$label = '';
endforeach;
echo '</ul>';
}
/**
* Get label for first post.
*
* @param array $posts Posts.
*/
private function get_item_label( $posts ) {
$label = '';
if ( ! empty( $posts[0]['custom_label'] ) ) {
$label = $posts[0]['custom_label'];
}
$is_new = time() - strtotime( $posts[0]['date'] ) < 15 * DAY_IN_SECONDS;
if ( $is_new && empty( $label ) ) {
$label = esc_html__( 'NEW', 'rank-math' );
}
return $label;
}
/**
* Filter posts by display condition.
*
* @param array $posts Posts.
*/
private function filter_posts( $posts ) {
$posts = array_filter(
$posts,
function( $post ) {
if ( isset( $post['condition'] ) && 'is_free' === $post['condition'] && defined( 'RANK_MATH_PRO_FILE' ) ) {
return false;
}
return true;
}
);
return array_slice( $posts, 0, 3 ); // Max 3 posts.
}
/**
* Add UTM tags to links. Only add if UTM params are not already present.
*
* @param string $link Link.
* @param int $index Array index.
*/
private function add_utm_params( $link, $index ) {
// Skip if link has any UTM tags already set.
if ( preg_match( '/[?&]utm_[a-z_]+=/', $link ) ) {
return $link;
}
$utm_params = [
'utm_source' => 'Plugin',
'utm_medium' => 'Dashboard%20Widget%20Post%20' . ( $index + 1 ),
'utm_campaign' => 'WP',
];
return add_query_arg( $utm_params, $link );
}
/**
* Add footer in the admin dashboard widget.
*/
public function dashboard_widget_footer() {
?>
<div class="rank-math-widget-footer">
<a target="_blank" href="<?php KB::the( 'blog', 'Dashboard Widget Blog' ); ?>">
<?php esc_html_e( 'Blog', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<a target="_blank" href="<?php KB::the( 'knowledgebase', 'Dashboard Widget Help' ); ?>">
<?php esc_html_e( 'Help', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<?php if ( ! defined( 'RANK_MATH_PRO_FILE' ) ) { ?>
<a target="_blank" href="<?php KB::the( 'pro', 'Dashboard Widget PRO' ); ?>" class="rank-math-widget-go-pro">
<?php esc_html_e( 'Go Pro', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<?php } ?>
</div>
<?php
}
/**
* Get posts.
*/
private function get_feed() {
$cache_key = 'rank_math_feed_posts_v2';
$cache = get_transient( $cache_key );
if ( false !== $cache ) {
return $cache;
}
$response = wp_remote_get( 'https://rankmath.com/wp-json/wp/v2/posts?dashboard_widget_feed=1' );
if ( is_wp_error( $response ) || 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS );
return false;
}
$posts = json_decode( wp_remote_retrieve_body( $response ), true );
if ( empty( $posts ) || ! is_array( $posts ) ) {
set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS );
return false;
}
set_transient( $cache_key, $posts, 12 * HOUR_IN_SECONDS );
return $posts;
}
}
@@ -0,0 +1,625 @@
<?php
/**
* The Import Export Class
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helper;
use RankMath\Runner;
use RankMath\Traits\Ajax;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Param;
use RankMath\Admin\Importers\Detector;
defined( 'ABSPATH' ) || exit;
/**
* Import_Export class.
*/
class Import_Export implements Runner {
use Hooker, Ajax;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'admin_init', 'handler' );
$this->action( 'admin_enqueue_scripts', 'enqueue', 1 );
$this->filter( 'rank_math/tools/pages', 'add_status_page', 30 );
$this->filter( 'rank_math/export/settings', 'export_other_panels', 10, 2 );
$this->action( 'rank_math/import/settings/pre_import', 'run_backup', 10, 0 );
$this->ajax( 'create_backup', 'create_backup' );
$this->ajax( 'delete_backup', 'delete_backup' );
$this->ajax( 'restore_backup', 'restore_backup' );
$this->ajax( 'clean_plugin', 'clean_plugin' );
$this->ajax( 'import_plugin', 'import_plugin' );
}
/**
* Add subpage to Status & Tools screen.
*
* @param array $pages Pages.
* @return array New pages.
*/
public function add_status_page( $pages ) {
if ( Helper::is_advanced_mode() ) {
$pages['import_export'] = [
'url' => 'status',
'args' => 'view=import_export',
'cap' => 'manage_options',
'title' => __( 'Import & Export', 'rank-math' ),
'class' => '\\RankMath\\Admin\\Import_Export',
];
}
return $pages;
}
/**
* Display Import/Export tools page.
*
* @return void
*/
public function display() {
include $this->get_view( 'main' );
}
/**
* Display panels for Import/Export tools.
*
* @return void
*/
public function show_panels() {
foreach ( (array) $this->get_panels() as $panel ) {
if ( ! isset( $panel['view'] ) || ! file_exists( $panel['view'] ) ) {
continue;
}
echo '<div class="' . ( isset( $panel['class'] ) ? esc_attr( $panel['class'] ) : '' ) . '">';
include $panel['view'];
echo '</div>';
}
}
/**
* Get list of panels.
*
* @return array
*/
public function get_panels() {
$dir = dirname( __FILE__ ) . '/views/import-export/';
$panels = [
'import-export' => [
'view' => $dir . 'import-export-panel.php',
'class' => 'import-export-settings',
],
'plugins' => [
'view' => $dir . 'plugins-panel.php',
'class' => 'import-plugins',
],
'backup' => [
'view' => $dir . 'backup-panel.php',
'class' => 'settings-backup',
],
];
return apply_filters( 'rank_math/admin/import_export_panels', $panels );
}
/**
* Get view file.
*
* @param string $view View filename.
*
* @return string Complete path to view
*/
public function get_view( $view ) {
$view = sanitize_key( $view );
return rank_math()->admin_dir() . "views/import-export/{$view}.php";
}
/**
* Enqueue files & add JSON.
*
* @return void
*/
public function enqueue() {
if ( ! $this->is_import_export_page() ) {
return;
}
\RankMath\Tools\Update_Score::get()->enqueue();
wp_enqueue_script( 'rank-math-import-export', rank_math()->plugin_url() . 'assets/admin/js/import-export.js', [], rank_math()->version, true );
wp_enqueue_style( 'cmb2-styles' );
wp_enqueue_style( 'rank-math-common' );
wp_enqueue_style( 'rank-math-cmb2' );
Helper::add_json( 'importSettingsConfirm', esc_html__( 'Are you sure you want to import settings into Rank Math? Don\'t worry, your current configuration will be saved as a backup.', 'rank-math' ) );
// Translators: %s is the plugin name.
Helper::add_json( 'importPluginConfirm', esc_html__( 'Are you sure you want to import data from %s?', 'rank-math' ) );
Helper::add_json( 'importPluginSelectAction', esc_html__( 'Select data to import.', 'rank-math' ) );
Helper::add_json( 'restoreConfirm', esc_html__( 'Are you sure you want to restore this backup? Your current configuration will be overwritten.', 'rank-math' ) );
Helper::add_json( 'deleteBackupConfirm', esc_html__( 'Are you sure you want to delete this backup?', 'rank-math' ) );
// Translators: %s is the plugin name.
Helper::add_json( 'cleanPluginConfirm', esc_html__( 'Are you sure you want erase all traces of %s?', 'rank-math' ) );
}
/**
* Check if we're on the Tools > Import & Export admin page.
*
* @return boolean
*/
private function is_import_export_page() {
return Param::get( 'page' ) === 'rank-math-status' && Param::get( 'view' ) === 'import_export';
}
/**
* Handle import or export.
*/
public function handler() {
$object_id = Param::post( 'object_id' );
if ( false === $object_id ) {
return;
}
if ( ! Helper::has_cap( 'general' ) ) {
return false;
}
if ( 'export-plz' === $object_id && check_admin_referer( 'rank-math-export-settings' ) ) {
$this->export();
}
if ( isset( $_FILES['import-me'] ) && 'import-plz' === $object_id && check_admin_referer( 'rank-math-import-settings' ) ) {
$this->import();
}
}
/**
* Handles AJAX run plugin clean.
*/
public function clean_plugin() {
$this->verify_nonce( 'rank-math-ajax-nonce' );
$this->has_cap_ajax( 'general' );
$result = Detector::run_by_slug( Param::post( 'pluginSlug' ), 'cleanup' );
if ( $result['status'] ) {
/* translators: Plugin name */
$this->success( sprintf( esc_html__( 'Cleanup of %s data successfully done.', 'rank-math' ), $result['importer']->get_plugin_name() ) );
}
/* translators: Plugin name */
$this->error( sprintf( esc_html__( 'Cleanup of %s data failed.', 'rank-math' ), $result['importer']->get_plugin_name() ) );
}
/**
* Handles AJAX run plugin import.
*/
public function import_plugin() {
$this->verify_nonce( 'rank-math-ajax-nonce' );
$this->has_cap_ajax( 'general' );
$perform = Param::post( 'perform', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
if ( ! $this->is_action_allowed( $perform ) ) {
$this->error( esc_html__( 'Action not allowed.', 'rank-math' ) );
}
try {
$result = Detector::run_by_slug( Param::post( 'pluginSlug' ), 'import', $perform );
$this->success( $result );
} catch ( \Exception $e ) {
$this->error( $e->getMessage() );
}
}
/**
* Handles AJAX create backup.
*/
public function create_backup() {
$this->verify_nonce( 'rank-math-ajax-nonce' );
$this->has_cap_ajax( 'general' );
$key = $this->run_backup();
if ( is_null( $key ) ) {
$this->error( esc_html__( 'Unable to create backup this time.', 'rank-math' ) );
}
$this->success(
[
'key' => $key,
/* translators: Backup formatted date */
'backup' => sprintf( esc_html__( 'Backup: %s', 'rank-math' ), date_i18n( 'M jS Y, H:i a', $key ) ),
'message' => esc_html__( 'Backup created successfully.', 'rank-math' ),
]
);
}
/**
* Handles AJAX delete backup.
*/
public function delete_backup() {
$this->verify_nonce( 'rank-math-ajax-nonce' );
$this->has_cap_ajax( 'general' );
$key = Param::post( 'key', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
if ( ! $key ) {
$this->error( esc_html__( 'No backup key found to delete.', 'rank-math' ) );
}
$this->run_backup( 'delete', $key );
$this->success( esc_html__( 'Backup successfully deleted.', 'rank-math' ) );
}
/**
* Handles AJAX restore backup.
*/
public function restore_backup() {
$this->verify_nonce( 'rank-math-ajax-nonce' );
$this->has_cap_ajax( 'general' );
$key = Param::post( 'key', '', FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
if ( ! $key ) {
$this->error( esc_html__( 'No backup key found to restore.', 'rank-math' ) );
}
if ( ! $this->run_backup( 'restore', $key ) ) {
$this->error( esc_html__( 'Backup does not exist.', 'rank-math' ) );
}
$this->success( esc_html__( 'Backup restored successfully.', 'rank-math' ) );
}
/**
* Run backup actions.
*
* @param string $action Action to perform.
* @param array $key Key to backup.
* @return mixed
*/
public function run_backup( $action = 'add', $key = null ) {
$backups = $this->get_backups();
// Restore.
if ( 'restore' === $action ) {
if ( ! isset( $backups[ $key ] ) ) {
return false;
}
$this->do_import_data( $backups[ $key ], true );
return true;
}
// Add.
if ( 'add' === $action ) {
$key = current_time( 'U' );
$backups = [ $key => $this->get_export_data() ] + $backups;
}
// Delete.
if ( 'delete' === $action && isset( $backups[ $key ] ) ) {
unset( $backups[ $key ] );
}
update_option( 'rank_math_backups', $backups, false );
return $key;
}
/**
* Handle export.
*/
private function export() {
$panels = Param::post( 'panels', [], FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
$data = $this->get_export_data( $panels );
$filename = 'rank-math-settings-' . date_i18n( 'Y-m-d-H-i-s' ) . '.json';
header( 'Content-Type: application/json' );
header( 'Content-Disposition: attachment; filename=' . $filename );
header( 'Cache-Control: no-cache, no-store, must-revalidate' );
header( 'Pragma: no-cache' );
header( 'Expires: 0' );
echo wp_json_encode( $data );
exit;
}
/**
* Handle import.
*/
private function import() {
$file = $this->has_valid_file();
if ( false === $file ) {
return false;
}
// Parse Options.
$wp_filesystem = Helper::get_filesystem();
if ( is_null( $wp_filesystem ) || ! Helper::is_filesystem_direct() ) {
Helper::add_notification( esc_html__( 'Uploaded file could not be read.', 'rank-math' ), [ 'type' => 'error' ] );
return false;
}
$settings = $wp_filesystem->get_contents( $file['file'] );
$settings = json_decode( $settings, true );
\unlink( $file['file'] );
if ( is_array( $settings ) && $this->do_import_data( $settings ) ) {
Helper::add_notification( esc_html__( 'Settings successfully imported. Your old configuration has been saved as a backup.', 'rank-math' ), [ 'type' => 'success' ] );
return;
}
Helper::add_notification( esc_html__( 'No settings found to be imported.', 'rank-math' ), [ 'type' => 'info' ] );
}
/**
* Import has valid file.
*
* @return mixed
*/
private function has_valid_file() {
// Add upload hooks.
$this->filter( 'upload_mimes', 'allow_txt_upload', 10, 2 );
$this->filter( 'wp_check_filetype_and_ext', 'filetype_and_ext', 10, 4 );
// Do the upload.
$file = wp_handle_upload( $_FILES['import-me'], [ 'test_form' => false ] );
// Remove upload hooks.
$this->remove_filter( 'upload_mimes', 'allow_txt_upload', 10 );
$this->remove_filter( 'wp_check_filetype_and_ext', 'filetype_and_ext', 10 );
if ( is_wp_error( $file ) ) {
Helper::add_notification( esc_html__( 'Settings could not be imported:', 'rank-math' ) . ' ' . $file->get_error_message(), [ 'type' => 'error' ] );
return false;
}
if ( isset( $file['error'] ) ) {
Helper::add_notification( esc_html__( 'Settings could not be imported:', 'rank-math' ) . ' ' . $file['error'], [ 'type' => 'error' ] );
return false;
}
if ( ! isset( $file['file'] ) ) {
Helper::add_notification( esc_html__( 'Settings could not be imported: Upload failed.', 'rank-math' ), [ 'type' => 'error' ] );
return false;
}
return $file;
}
/**
* Filters the "real" file type of the given file.
*
* @param array $types {
* Values for the extension, mime type, and corrected filename.
*
* @type string|false $ext File extension, or false if the file doesn't match a mime type.
* @type string|false $type File mime type, or false if the file doesn't match a mime type.
* @type string|false $proper_filename File name with its correct extension, or false if it cannot be determined.
* }
* @param string $file Full path to the file.
* @param string $filename The name of the file (may differ from $file due to
* $file being in a tmp directory).
* @param string[] $mimes Array of mime types keyed by their file extension regex.
*
* @return array
*/
public function filetype_and_ext( $types, $file, $filename, $mimes ) {
if ( false !== strpos( $filename, '.json' ) ) {
$types['ext'] = 'json';
$types['type'] = 'application/json';
} elseif ( false !== strpos( $filename, '.txt' ) ) {
$types['ext'] = 'txt';
$types['type'] = 'text/plain';
}
return $types;
}
/**
* Allow txt & json file upload.
*
* @param array $types Mime types keyed by the file extension regex corresponding to those types.
* @param int|WP_User|null $user User ID, User object or null if not provided (indicates current user).
*
* @return array
*/
public function allow_txt_upload( $types, $user ) {
$types['json'] = 'application/json';
$types['txt'] = 'text/plain';
return $types;
}
/**
* Does import data.
*
* @param array $data Import data.
* @param bool $suppress_hooks Suppress hooks or not.
* @return bool
*/
private function do_import_data( array $data, $suppress_hooks = false ) {
$this->run_import_hooks( 'pre_import', $data, $suppress_hooks );
// Import options.
$down = $this->set_options( $data );
// Import capabilities.
if ( ! empty( $data['role-manager'] ) ) {
$down = true;
Helper::set_capabilities( $data['role-manager'] );
}
// Import redirections.
if ( ! empty( $data['redirections'] ) ) {
$down = true;
$this->set_redirections( $data['redirections'] );
}
$this->run_import_hooks( 'after_import', $data, $suppress_hooks );
return $down;
}
/**
* Set options from data.
*
* @param array $data An array of data.
*/
private function set_options( $data ) {
$set = false;
$hash = [
'modules' => 'rank_math_modules',
'general' => 'rank-math-options-general',
'titles' => 'rank-math-options-titles',
'sitemap' => 'rank-math-options-sitemap',
];
foreach ( $hash as $key => $option_key ) {
if ( ! empty( $data[ $key ] ) ) {
$set = true;
update_option( $option_key, $data[ $key ] );
}
}
return $set;
}
/**
* Set redirections.
*
* @param array $redirections An array of redirections to import.
*/
private function set_redirections( $redirections ) {
foreach ( $redirections as $key => $redirection ) {
$matched = \RankMath\Redirections\DB::match_redirections_source( $redirection['sources'] );
if ( ! empty( $matched ) ) {
continue;
}
$sources = maybe_unserialize( $redirection['sources'] );
if ( ! is_array( $sources ) ) {
continue;
}
\RankMath\Redirections\DB::add(
[
'url_to' => $redirection['url_to'],
'sources' => $sources,
'header_code' => $redirection['header_code'],
'hits' => $redirection['hits'],
'created' => $redirection['created'],
'updated' => $redirection['updated'],
]
);
}
}
/**
* Run import hooks
*
* @param string $hook Hook to fire.
* @param array $data Import data.
* @param bool $suppress Suppress hooks or not.
*/
private function run_import_hooks( $hook, $data, $suppress ) {
if ( ! $suppress ) {
/**
* Fires while importing settings.
*
* @since 0.9.0
*
* @param array $data Import data.
*/
$this->do_action( 'import/settings/' . $hook, $data );
}
}
/**
* Gets export data.
*
* @param array $panels Which panels to export. All panels will be exported if this param is empty.
* @return array
*/
private function get_export_data( array $panels = [] ) {
if ( ! $panels ) {
$panels = [ 'general', 'titles', 'sitemap', 'role-manager', 'redirections' ];
}
$settings = rank_math()->settings->all_raw();
foreach ( $panels as $panel ) {
if ( isset( $settings[ $panel ] ) ) {
$data[ $panel ] = $settings[ $panel ];
continue;
}
$data = $this->do_filter( 'export/settings', $data, $panel );
}
$data['modules'] = get_option( 'rank_math_modules', [] );
return $data;
}
/**
* Export other panels.
*
* @param array $data Gathered data.
* @param string $panel Panel id.
*
* @return array
*/
public function export_other_panels( $data, $panel ) {
if ( 'role-manager' === $panel ) {
$data['role-manager'] = Helper::get_roles_capabilities();
}
if ( 'redirections' === $panel ) {
$items = \RankMath\Redirections\DB::get_redirections( [ 'limit' => 1000 ] );
$data['redirections'] = $items['redirections'];
}
return $data;
}
/**
* Check if given action is in the list of allowed actions.
*
* @param string $perform Action to check.
*
* @return bool
*/
private function is_action_allowed( $perform ) {
$allowed = [ 'settings', 'postmeta', 'termmeta', 'usermeta', 'redirections', 'blocks', 'deactivate', 'locations', 'news', 'video', 'recalculate' ];
return $perform && in_array( $perform, $allowed, true );
}
/**
* Get backups from the database.
*/
public function get_backups() {
$backups = get_option( 'rank_math_backups', [] );
if ( empty( $backups ) ) {
$backups = [];
} elseif ( ! is_array( $backups ) ) {
$backups = (array) $backups;
}
return $backups;
}
}
@@ -0,0 +1,79 @@
<?php
/**
* The List Table Base CLass.
*
* @since 1.0.0
* @package RankMath
* @subpackage RankMath\Admin
* @author RankMath <support@rankmath.com>
*/
namespace RankMath\Admin;
use WP_List_Table;
use RankMath\Helpers\Param;
/**
* List_Table class.
*/
class List_Table extends WP_List_Table {
/**
* The Constructor.
*
* @param array $args Array of arguments.
*/
public function __construct( $args = [] ) {
parent::__construct( $args );
}
/**
* Message to be displayed when there are no items.
*/
public function no_items() {
echo isset( $this->_args['no_items'] ) ? $this->_args['no_items'] : esc_html__( 'No items found.', 'rank-math' );
}
/**
* Get order setting.
*
* @return string
*/
protected function get_order() {
$order = Param::request( 'order', 'desc' );
return in_array( $order, [ 'desc', 'asc' ], true ) ? strtoupper( $order ) : 'DESC';
}
/**
* Get orderby setting.
*
* @param string $default (Optional) Extract order by from request.
*
* @return string
*/
protected function get_orderby( $default = 'create_date' ) {
return Param::get( 'orderby', $default, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH | FILTER_FLAG_STRIP_BACKTICK );
}
/**
* Get search query variable.
*
* @return bool|string
*/
protected function get_search() {
return Param::request( 's', false, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_BACKTICK );
}
/**
* Set column headers.
*
* @codeCoverageIgnore
*/
protected function set_column_headers() {
$this->_column_headers = [
$this->get_columns(),
[],
$this->get_sortable_columns(),
];
}
}
@@ -0,0 +1,264 @@
<?php
/**
* The admin notices.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Runner;
use RankMath\Helper;
use RankMath\Traits\Ajax;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Sitepress;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Notices class.
*/
class Notices implements Runner {
use Hooker, Ajax;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'admin_init', 'notices' );
$this->action( 'wp_helpers_notification_dismissed', 'notice_dismissible' );
}
/**
* Run all notices routine.
*/
public function notices() {
$this->is_plugin_configured();
$this->new_post_type();
$this->convert_wpml_settings();
$this->permalink_changes_warning();
}
/**
* Set known post type after notice dismissal.
*
* @param string $notification_id Notification id.
*/
public function notice_dismissible( $notification_id ) {
if ( 'new_post_type' === $notification_id ) {
$current = get_post_types( [ 'public' => true ] );
update_option( 'rank_math_known_post_types', $current );
if ( Helper::is_module_active( 'sitemap' ) ) {
\RankMath\Sitemap\Cache::invalidate_storage();
}
return;
}
if ( 'convert_wpml_settings' === $notification_id ) {
update_option( 'rank_math_wpml_notice_dismissed', true );
}
if ( 'rank-math-site-url-mismatch' === $notification_id ) {
update_option( 'rank_math_siteurl_mismatch_notice_dismissed', true );
}
}
/**
* If plugin configuration not done.
*/
private function is_plugin_configured() {
if ( 'mts-install-plugins' === Param::get( 'page' ) ) {
return;
}
if ( rank_math()->notification->get_notification_by_id( 'plugin_not_setup' ) && ! Helper::is_configured() ) {
$message = sprintf(
'<b>Warning!</b> You didn\'t set up your Rank Math SEO plugin yet, which means you\'re missing out on essential settings and tweaks! <a href="%s">Complete your setup by clicking here.</a>',
Helper::get_admin_url( 'wizard' )
);
Helper::add_notification(
$message,
[
'type' => 'warning',
'id' => 'plugin_not_setup',
]
);
}
}
/**
* Add notification if a new post type is detected.
*/
private function new_post_type() {
$known = get_option( 'rank_math_known_post_types', [] );
$current = Helper::get_accessible_post_types();
$new = array_diff( $current, $known );
if ( empty( $new ) ) {
return;
}
$list = '<code>' . implode( '</code>, <code>', $new ) . '</code>';
/* Translators: placeholder is the post type name. */
$message = __( 'Rank Math has detected a new post type: %1$s. You may want to check the settings of the <a href="%2$s">Titles &amp; Meta page</a>.', 'rank-math' );
$count = count( $new );
if ( $count > 1 ) {
/* Translators: placeholder is the post type names separated with commas. */
$message = __( 'Rank Math has detected new post types: %1$s. You may want to check the settings of the <a href="%2$s">Titles &amp; Meta page</a>.', 'rank-math' );
}
$message = $this->do_filter( 'admin/notice/new_post_type', $message, $count );
$message = sprintf( wp_kses_post( $message ), $list, Helper::get_admin_url( 'options-titles#setting-panel-post-type-' . key( $new ) ), Helper::get_admin_url( 'options-sitemap#setting-panel-sitemap-post-type-' . key( $new ) ) );
Helper::add_notification(
$message,
[
'type' => 'info',
'id' => 'new_post_type',
]
);
}
/**
* Function to show Show String Translation plugin notice and convert the settings.
*/
private function convert_wpml_settings() {
if ( ! Sitepress::get()->is_active() || get_option( 'rank_math_wpml_data_converted' ) ) {
return;
}
if ( ! function_exists( 'icl_add_string_translation' ) ) {
if ( ! get_option( 'rank_math_wpml_notice_dismissed' ) ) {
Helper::add_notification(
__( 'Please activate the WPML String Translation plugin to convert Rank Math Setting values in different languages.', 'rank-math' ),
[
'type' => 'error',
'id' => 'convert_wpml_settings',
]
);
}
return;
}
$languages = icl_get_languages();
foreach ( $languages as $lang_code => $language ) {
foreach ( [ 'general', 'titles' ] as $option ) {
$data = get_option( "rank-math-options-{$option}_$lang_code" );
if ( empty( $data ) ) {
continue;
}
$common_data = array_intersect( array_keys( $data ), $this->get_translatable_options() );
if ( empty( $common_data ) ) {
continue;
}
foreach ( $common_data as $option_key ) {
$string_id = icl_get_string_id( Helper::get_settings( "$option.$option_key" ), "admin_texts_rank-math-options-$option" );
icl_add_string_translation( $string_id, $lang_code, $data[ $option_key ], 10 );
}
}
}
update_option( 'rank_math_wpml_data_converted', true );
}
/**
* Get Translatable option keys.
*
* @return array
*/
private function get_translatable_options() {
$options = [
'img_alt_format',
'img_title_format',
'breadcrumbs_separator',
'breadcrumbs_prefix',
'breadcrumbs_home_link',
'breadcrumbs_home_label',
'breadcrumbs_archive_format',
'breadcrumbs_search_format',
'breadcrumbs_404_label',
'rss_before_content',
'rss_after_content',
'title_separator',
'homepage_title',
'homepage_description',
'homepage_facebook_title',
'homepage_facebook_description',
'author_archive_title',
'author_archive_description',
'date_archive_title',
'date_archive_description',
'search_title',
'404_title',
];
$post_types = Helper::get_accessible_post_types();
foreach ( $post_types as $post_type => $data ) {
$options = array_merge(
$options,
[
"pt_{$post_type}_title",
"pt_{$post_type}_description",
"pt_{$post_type}_archive_title",
"pt_{$post_type}_archive_description",
"pt_{$post_type}_default_snippet_name",
"pt_{$post_type}_default_snippet_desc",
]
);
}
$taxonomies = Helper::get_accessible_taxonomies();
foreach ( $taxonomies as $taxonomy => $data ) {
$options = array_merge(
$options,
[
"tax_{$taxonomy}_title",
"tax_{$taxonomy}_description",
]
);
}
return $options;
}
/**
* Maybe add notice on Permalinks page about the risks of changing the permalinks on a live site.
*
* @return void
*/
public function permalink_changes_warning() {
global $pagenow;
if ( 'options-permalink.php' !== $pagenow ) {
return;
}
$this->action( 'admin_enqueue_scripts', 'add_permalink_changes_warning', 12 );
}
/**
* Add the notice for the Permalinks page.
*
* @return void
*/
public function add_permalink_changes_warning() {
wp_enqueue_script( 'rank-math-core-permalink-settings' );
$message = __( '<b>Rank Math Warning:</b> Changing the permalinks on a live, indexed site may result in serious loss of traffic if done incorrectly. Consider adding a new redirection from the old URL format to the new one.', 'rank-math' );
Helper::add_notification(
$message,
[
'type' => 'warning',
'screen' => 'options-permalink',
'classes' => 'hidden rank-math-notice-permalinks-warning is-dismissible',
]
);
}
}
@@ -0,0 +1,425 @@
<?php
/**
* The option center of the plugin.
*
* @since 1.0.9
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\KB;
use RankMath\CMB2;
use RankMath\Helper;
use RankMath\Runner;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Arr;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Option_Center class.
*/
class Option_Center implements Runner {
use Hooker;
/**
* Register hooks.
*/
public function hooks() {
$this->action( 'init', 'register_general_settings', 125 );
$this->action( 'init', 'register_title_settings', 125 );
$this->filter( 'rank_math/settings/title', 'title_post_type_settings', 1 );
$this->filter( 'rank_math/settings/title', 'title_taxonomy_settings', 1 );
$this->filter( 'rank_math/settings/general', 'remove_unwanted_general_tabs', 1 );
// Check for fields and act accordingly.
$this->action( 'cmb2_save_options-page_fields_rank-math-options-general_options', 'check_updated_fields', 25, 2 );
$this->action( 'cmb2_save_options-page_fields_rank-math-options-titles_options', 'check_updated_fields', 25, 2 );
}
/**
* General Settings.
*/
public function register_general_settings() {
$tabs = [
'links' => [
'icon' => 'rm-icon rm-icon-link',
'title' => esc_html__( 'Links', 'rank-math' ),
/* translators: Link to kb article */
'desc' => sprintf( esc_html__( 'Change how some of the links open and operate on your website. %s.', 'rank-math' ), '<a href="' . KB::get( 'link-settings', 'Options Panel Links Tab' ) . '" target="_blank">' . esc_html__( 'Learn More', 'rank-math' ) . '</a>' ),
],
'breadcrumbs' => [
'icon' => 'rm-icon rm-icon-direction',
'title' => esc_html__( 'Breadcrumbs', 'rank-math' ),
'classes' => 'rank-math-advanced-option',
/* translators: Link to kb article */
'desc' => sprintf( esc_html__( 'Here you can set up the breadcrumbs function. %s', 'rank-math' ), '<a href="' . KB::get( 'breadcrumbs', 'Options Panel Breadcrumbs Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>. <br/>' ),
'after_row' => current_theme_supports( 'rank-math-breadcrumbs' ) ? '' : '<div class="notice notice-alt notice-warning warning inline rank-math-notice"><p>' . esc_html__( 'Use the following code in your theme template files to display breadcrumbs.', 'rank-math' ) . ' <a href="' . KB::get( 'breadcrumbs-install', 'Options Panel Breadcrumbs Tab' ) . '" target="_blank">' . esc_html__( 'Learn More', 'rank-math' ) . '</a><br /><code>&lt;?php if (function_exists(\'rank_math_the_breadcrumbs\')) rank_math_the_breadcrumbs(); ?&gt;</code> OR <code>[rank_math_breadcrumb]</code></p></div>',
],
'webmaster' => [
'icon' => 'rm-icon rm-icon-toolbox',
'title' => esc_html__( 'Webmaster Tools', 'rank-math' ),
/* translators: Link to kb article */
'desc' => sprintf( esc_html__( 'Enter verification codes for third-party webmaster tools. %s', 'rank-math' ), '<a href="' . KB::get( 'webmaster-tools', 'Options Panel Webmaster Tools Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.<br />' ),
],
'others' => [
'icon' => 'rm-icon rm-icon-misc',
'title' => esc_html__( 'Others', 'rank-math' ),
/* translators: Link to kb article */
'desc' => sprintf( esc_html__( 'Change some uncommon but essential settings here. %s.', 'rank-math' ), '<a href="' . KB::get( 'other-settings', 'Options Panel Others Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
'classes' => 'rank-math-advanced-option',
],
];
if ( is_super_admin() && 'rank-math-options-general' === Param::get( 'page' ) ) {
Arr::insert(
$tabs,
[
'htaccess' => [
'icon' => 'rm-icon rm-icon-htaccess',
'title' => esc_html__( 'Edit .htaccess', 'rank-math' ),
/* translators: Link to kb article */
'desc' => sprintf( esc_html__( 'Edit the contents of your .htaccess file easily. %s.', 'rank-math' ), '<a href="' . KB::get( 'edit-htaccess', 'Options Panel htaccess Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
'classes' => 'rank-math-advanced-option',
],
],
5
);
}
/**
* Allow developers to add new sections in the General Settings.
*
* @param array $tabs
*/
$tabs = $this->do_filter( 'settings/general', $tabs );
new Options(
[
'key' => 'rank-math-options-general',
'title' => esc_html__( 'SEO Settings', 'rank-math' ),
'menu_title' => esc_html__( 'General Settings', 'rank-math' ),
'capability' => 'rank_math_general',
'folder' => 'general',
'tabs' => $tabs,
]
);
}
/**
* Remove unneeded tabs from the General Settings.
*
* @param array $tabs Hold tabs for optional panel.
* @return array
*/
public function remove_unwanted_general_tabs( $tabs ) {
if ( is_multisite() ) {
unset( $tabs['robots'] );
}
if ( ! Helper::has_cap( 'edit_htaccess' ) && is_multisite() ) {
unset( $tabs['htaccess'] );
}
return $tabs;
}
/**
* Register SEO Titles & Meta Settings.
*/
public function register_title_settings() {
$tabs = [
'global' => [
'icon' => 'rm-icon rm-icon-settings',
'title' => esc_html__( 'Global Meta', 'rank-math' ),
/* translators: Link to KB article */
'desc' => sprintf( esc_html__( 'Change Global meta settings that take effect across your website. %s.', 'rank-math' ), '<a href="' . KB::get( 'titles-meta', 'Options Panel Meta Global Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
],
'local' => [
'icon' => 'rm-icon rm-icon-local-seo',
'title' => esc_html__( 'Local SEO', 'rank-math' ),
/* translators: Redirection page url */
'desc' => sprintf( wp_kses_post( __( 'Optimize for local searches and Knowledge Graph using these settings. %s.', 'rank-math' ) ), '<a href="' . KB::get( 'local-seo-settings', 'Options Panel Meta Local Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
'after_row' => '<div class="notice notice-alt notice-info info inline rank-math-notice"><p>' . __( 'Use the <code>[rank_math_contact_info]</code> shortcode to display contact information in a nicely formatted way. You should also claim your business on Google if you have not already.', 'rank-math' ) . '</p></div>',
],
'social' => [
'icon' => 'rm-icon rm-icon-social',
'title' => esc_html__( 'Social Meta', 'rank-math' ),
/* translators: Link to social setting KB article */
'desc' => sprintf( esc_html__( "Add social account information to your website's Schema and Open Graph. %s.", 'rank-math' ), '<a href="' . KB::get( 'social-meta-settings', 'Options Panel Meta Social Tab' ) . '" target="_blank">' . esc_html__( 'Learn More', 'rank-math' ) . '</a>' ),
],
'homepage' => [
'icon' => 'rm-icon rm-icon-home',
'title' => esc_html__( 'Homepage', 'rank-math' ),
'desc' => sprintf(
/* translators: Link to KB article */
esc_html__( 'Add SEO meta and OpenGraph details to your homepage. %s.', 'rank-math' ),
'<a href="' . KB::get( 'homepage-settings', 'Options Panel Meta Home Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>'
),
],
'author' => [
'icon' => 'rm-icon rm-icon-users',
'title' => esc_html__( 'Authors', 'rank-math' ),
/* translators: Link to KB article */
'desc' => sprintf( esc_html__( 'Change SEO options related to the author archives. %s.', 'rank-math' ), '<a href="' . KB::get( 'author-settings', 'Options Panel Meta Author Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
],
'misc' => [
'icon' => 'rm-icon rm-icon-misc',
'title' => esc_html__( 'Misc Pages', 'rank-math' ),
/* translators: Link to KB article */
'desc' => sprintf( esc_html__( 'Customize SEO meta settings of pages like search results, 404s, etc. %s.', 'rank-math' ), '<a href="' . KB::get( 'misc-settings', 'Options Panel Meta Misc Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>' ),
],
];
/**
* Allow developers to add new section in the Title Settings.
*
* @param array $tabs
*/
$tabs = $this->do_filter( 'settings/title', $tabs );
new Options(
[
'key' => 'rank-math-options-titles',
'title' => esc_html__( 'SEO Titles &amp; Meta', 'rank-math' ),
'menu_title' => esc_html__( 'Titles &amp; Meta', 'rank-math' ),
'capability' => 'rank_math_titles',
'folder' => 'titles',
'tabs' => $tabs,
]
);
if ( is_admin() ) {
Helper::add_json( 'postTitle', 'Post Title' );
Helper::add_json( 'postUri', home_url( '/post-title' ) );
Helper::add_json( 'blogName', get_bloginfo( 'name' ) );
}
}
/**
* Add post type tabs in the Title Settings panel.
*
* @param array $tabs Holds the tabs of the options panel.
* @return array
*/
public function title_post_type_settings( $tabs ) {
$icons = Helper::choices_post_type_icons();
$links = [
'post' => '<a href="' . KB::get( 'post-settings', 'Options Panel Meta Posts Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'page' => '<a href="' . KB::get( 'page-settings', 'Options Panel Meta Pages Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'product' => '<a href="' . KB::get( 'product-settings', 'Options Panel Meta Products Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'attachment' => '<a href="' . KB::get( 'media-settings', 'Options Panel Meta Attachments Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
];
$names = [
'post' => 'single %s',
'page' => 'single %s',
'product' => 'product pages',
'attachment' => 'media %s',
];
$tabs['p_types'] = [
'title' => esc_html__( 'Post Types:', 'rank-math' ),
'type' => 'seprator',
];
foreach ( Helper::get_accessible_post_types() as $post_type ) {
$obj = get_post_type_object( $post_type );
$link = isset( $links[ $obj->name ] ) ? $links[ $obj->name ] : '';
$obj_name = isset( $names[ $obj->name ] ) ? sprintf( $names[ $obj->name ], $obj->name ) : $obj->name;
$tabs[ 'post-type-' . $obj->name ] = [
'title' => 'attachment' === $post_type ? esc_html__( 'Attachments', 'rank-math' ) : $obj->label,
'icon' => isset( $icons[ $obj->name ] ) ? $icons[ $obj->name ] : $icons['default'],
/* translators: 1. post type name 2. link */
'desc' => sprintf( esc_html__( 'Change Global SEO, Schema, and other settings for %1$s. %2$s', 'rank-math' ), $obj_name, $link ),
'post_type' => $obj->name,
'file' => rank_math()->includes_dir() . 'settings/titles/post-types.php',
'classes' => 'attachment' === $post_type ? 'rank-math-advanced-option' : '',
];
}
return $tabs;
}
/**
* Add taxonomy tabs in the Title Settings panel.
*
* @param array $tabs Holds the tabs of the options panel.
* @return array
*/
public function title_taxonomy_settings( $tabs ) {
$icons = Helper::choices_taxonomy_icons();
$hash_name = [
'category' => 'category archive pages',
'product_cat' => 'Product category pages',
'product_tag' => 'Product tag pages',
];
$hash_link = [
'category' => '<a href="' . KB::get( 'category-settings', 'Options Panel Meta Categories Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'post_tag' => '<a href="' . KB::get( 'tag-settings', 'Options Panel Meta Tags Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'product_cat' => '<a href="' . KB::get( 'product-categories-settings', 'Options Panel Meta Product Categories Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
'product_tag' => '<a href="' . KB::get( 'product-tags-settings', 'Options Panel Meta Product Tags Tab' ) . '" target="_blank">' . esc_html__( 'Learn more', 'rank-math' ) . '</a>.',
];
$taxonomies_data = [];
foreach ( Helper::get_accessible_taxonomies() as $taxonomy ) {
$attached = implode( ' + ', $taxonomy->object_type );
$taxonomies_data[ $attached ][ $taxonomy->name ] = $taxonomy;
}
foreach ( $taxonomies_data as $attached => $taxonomies ) {
// Seprator.
$tabs[ $attached ] = [
'title' => ucwords( $attached ) . ':',
'type' => 'seprator',
];
foreach ( $taxonomies as $taxonomy ) {
$link = isset( $hash_link[ $taxonomy->name ] ) ? $hash_link[ $taxonomy->name ] : '';
$taxonomy_name = isset( $hash_name[ $taxonomy->name ] ) ? $hash_name[ $taxonomy->name ] : $taxonomy->label;
$tabs[ 'taxonomy-' . $taxonomy->name ] = [
'icon' => isset( $icons[ $taxonomy->name ] ) ? $icons[ $taxonomy->name ] : $icons['default'],
'title' => $taxonomy->label,
/* translators: 1. taxonomy name 2. link */
'desc' => sprintf( esc_html__( 'Change Global SEO, Schema, and other settings for %1$s. %2$s', 'rank-math' ), $taxonomy_name, $link ),
'taxonomy' => $taxonomy->name,
'file' => rank_math()->includes_dir() . 'settings/titles/taxonomies.php',
];
}
}
if ( isset( $tabs['taxonomy-post_format'] ) ) {
$tab = $tabs['taxonomy-post_format'];
unset( $tabs['taxonomy-post_format'] );
$tab['title'] = esc_html__( 'Post Formats', 'rank-math' );
$tab['page_title'] = esc_html__( 'Post Formats Archive', 'rank-math' );
Arr::insert( $tabs, [ 'taxonomy-post_format' => $tab ], 5 );
}
return $tabs;
}
/**
* Check if certain fields got updated.
*
* @param int $object_id The ID of the current object.
* @param array $updated Array of field ids that were updated.
* Will only include field ids that had values change.
*/
public function check_updated_fields( $object_id, $updated ) {
/**
* Filter: Allow developers to add option fields which will flush the rewrite rules when updated.
*
* @param array $flush_fields Array of field IDs for which we need to flush.
*/
$flush_fields = $this->do_filter(
'flush_fields',
[
'strip_category_base',
'disable_author_archives',
'url_author_base',
'attachment_redirect_urls',
'attachment_redirect_default',
'nofollow_external_links',
'nofollow_image_links',
'nofollow_domains',
'nofollow_exclude_domains',
'new_window_external_links',
'redirections_header_code',
'redirections_post_redirect',
'redirections_debug',
]
);
foreach ( $flush_fields as $field_id ) {
if ( in_array( $field_id, $updated, true ) ) {
Helper::schedule_flush_rewrite();
break;
}
}
$this->update_htaccess();
}
/**
* Update .htaccess.
*/
private function update_htaccess() {
if ( empty( Param::post( 'htaccess_accept_changes' ) ) ) {
return;
}
// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Writing to .htaccess file and escaping for HTML will break functionality.
$content = wp_unslash( $_POST['htaccess_content'] );
if ( empty( $content ) ) {
return;
}
if ( ! $this->do_htaccess_backup() ) {
Helper::add_notification(
esc_html__( 'Failed to backup .htaccess file. Please check file permissions.', 'rank-math' ),
[ 'type' => 'error' ]
);
return;
}
if ( ! $this->do_htaccess_update( $content ) ) {
Helper::add_notification(
esc_html__( 'Failed to update .htaccess file. Please check file permissions.', 'rank-math' ),
[ 'type' => 'error' ]
);
return;
}
Helper::add_notification( esc_html__( '.htaccess file updated successfully.', 'rank-math' ) );
}
/**
* Create htaccess backup.
*
* @return bool
*/
private function do_htaccess_backup() {
if ( ! Helper::is_filesystem_direct() ) {
return false;
}
$wp_filesystem = Helper::get_filesystem();
$path = get_home_path();
$file = $path . '.htaccess';
if ( ! $wp_filesystem->is_writable( $path ) || ! $wp_filesystem->exists( $file ) ) {
return false;
}
$backup = $path . uniqid( '.htaccess_back_' );
return $wp_filesystem->copy( $file, $backup, true );
}
/**
* Update htaccess file.
*
* @param string $content Htaccess content.
* @return string|bool
*/
private function do_htaccess_update( $content ) {
if ( empty( $content ) || ! Helper::is_filesystem_direct() ) {
return false;
}
$wp_filesystem = Helper::get_filesystem();
$htaccess_file = get_home_path() . '.htaccess';
return ! $wp_filesystem->is_writable( $htaccess_file ) ? false : $wp_filesystem->put_contents( $htaccess_file, $content );
}
}
@@ -0,0 +1,361 @@
<?php
/**
* The option page functionality of the plugin.
*
* @since 0.9.0
* @package RankMath
* @subpackage RankMath\Admin
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath\Admin;
use WP_Http;
use RankMath\KB;
use RankMath\CMB2;
use RankMath\Helper;
use RankMath\Traits\Hooker;
use RankMath\Helpers\Str;
use RankMath\Helpers\Param;
defined( 'ABSPATH' ) || exit;
/**
* Options class.
*/
class Options {
use Hooker;
/**
* Page title.
*
* @var string
*/
public $title = 'Settings';
/**
* Menu title.
*
* @var string
*/
public $menu_title = 'Settings';
/**
* Hold tabs for page.
*
* @var array
*/
public $tabs = [];
/**
* Hold folder name for tab files.
*
* @var string
*/
public $folder = '';
/**
* Menu Position.
*
* @var int
*/
public $position = 10;
/**
* The capability required for this menu to be displayed to the user.
*
* @var string
*/
public $capability = 'manage_options';
/**
* CMB2 option page id.
*
* @var string
*/
private $cmb_id = null;
/**
* Options key.
*
* @var string
*/
public $key = '';
/**
* The Constructor
*
* @param array $config Array of configuration.
*/
public function __construct( $config ) {
$this->config( $config );
$this->cmb_id = $this->key . '_options';
$this->action( 'cmb2_admin_init', 'register_option_page', $this->position );
$this->action( 'admin_post_' . $this->key, 'reset_options', 2 );
if ( true === empty( get_option( $this->key ) ) ) {
$this->action( 'cmb2_init_hookup_' . $this->cmb_id, 'set_defaults', 11 );
}
if ( ! $this->is_current_page() ) {
return;
}
$this->action( 'admin_enqueue_scripts', 'enqueue' );
$this->action( 'admin_body_class', 'body_class' );
}
/**
* Create cmb2 box.
*
* @return CMB2
*/
private function create_cmb2() {
return new_cmb2_box(
[
'id' => $this->cmb_id,
'title' => $this->title,
'menu_title' => $this->menu_title,
'capability' => $this->capability,
'object_types' => [ 'options-page' ],
'option_key' => $this->key,
'parent_slug' => 'rank-math',
'cmb_styles' => false,
'display_cb' => [ $this, 'display' ],
]
);
}
/**
* Create option object and add settings.
*/
public function register_option_page() {
$cmb = $this->create_cmb2();
$tabs = $this->get_tabs();
$cmb->add_field(
[
'id' => 'setting-panel-container-' . $this->cmb_id,
'type' => 'tab_container_open',
'classes' => 'before-header',
'tabs' => $tabs,
]
);
foreach ( $tabs as $id => $tab ) {
$located = $this->locate_file( $id, $tab );
if ( false === $located ) {
continue;
}
$cmb->add_field(
[
'name' => esc_html__( 'Panel', 'rank-math' ),
'id' => 'setting-panel-' . $id,
'type' => 'tab',
'open' => true,
'classes' => isset( $tab['classes'] ) ? $tab['classes'] : '',
]
);
$cmb->add_field(
[
'id' => $id . '_section_title',
'type' => 'title',
'name' => isset( $tab['page_title'] ) ? $tab['page_title'] : ( isset( $tab['title'] ) ? $tab['title'] : '' ),
'desc' => isset( $tab['desc'] ) ? $tab['desc'] : '',
'after' => isset( $tab['after'] ) ? $tab['after'] : '',
'classes' => 'tab-header',
'after_row' => isset( $tab['after_row'] ) ? $tab['after_row'] : '',
]
);
include $located;
$this->do_action( "admin/settings/{$id}", $cmb, $tab );
$cmb->add_field(
[
'id' => 'setting-panel-' . $id . '-close',
'type' => 'tab',
]
);
}
$cmb->add_field(
[
'id' => 'setting-panel-container-close-' . $this->cmb_id,
'type' => 'tab_container_close',
]
);
CMB2::pre_init( $cmb );
}
/**
* Set the default values if not set.
*
* @param CMB2 $cmb The CMB2 object to hookup.
*/
public function set_defaults( $cmb ) {
foreach ( $cmb->prop( 'fields' ) as $id => $field_args ) {
$field = $cmb->get_field( $id );
if ( isset( $field_args['default'] ) || isset( $field_args['default_cb'] ) ) {
$defaults[ $id ] = $field->get_default();
}
}
// Save Defaults if any.
if ( ! empty( $defaults ) ) {
add_option( $this->key, $defaults );
}
}
/**
* Reset options.
*/
public function reset_options() {
if ( ! check_admin_referer( 'rank-math-reset-options' ) || ! current_user_can( 'manage_options' ) ) {
return false;
}
$url = wp_get_referer();
if ( ! $url ) {
$url = admin_url();
}
if ( filter_has_var( INPUT_POST, 'reset-cmb' ) && Param::post( 'action' ) === $this->key ) {
delete_option( $this->key );
Helper::redirect( esc_url_raw( $url ), WP_Http::SEE_OTHER );
exit;
}
}
/**
* Enqueue styles and scripts.
*/
public function enqueue() {
$screen = get_current_screen();
if ( ! Str::contains( $this->key, $screen->id ) ) {
return;
}
\CMB2_Hookup::enqueue_cmb_css();
rank_math()->variables->setup_json();
wp_enqueue_style( 'rank-math-options', rank_math()->plugin_url() . 'assets/admin/css/option-panel.css', [ 'select2-rm', 'rank-math-common', 'rank-math-cmb2' ], rank_math()->version );
wp_enqueue_script( 'rank-math-options', rank_math()->plugin_url() . 'assets/admin/js/option-panel.js', [ 'underscore', 'select2-rm', 'lodash', 'rank-math-common', 'wp-api-fetch' ], rank_math()->version, true );
// Add thank you.
Helper::add_json( 'indexUrl', rank_math()->plugin_url() . 'assets/admin/js/search-index/' );
Helper::add_json( 'optionPage', str_replace( 'rank-math-options-', '', $this->key ) );
}
/**
* Add classes to <body> of WordPress admin.
*
* @param string $classes List of CSS classes.
* @return string
*/
public function body_class( $classes = '' ) {
$mode = Helper::is_advanced_mode() ? 'advanced' : 'basic';
return $classes . ' rank-math-page rank-math-mode-' . $mode;
}
/**
* Display Setting on a page.
*
* @param CMB2_Options $machine Current CMB2 box object.
*/
public function display( $machine ) {
$cmb = $machine->cmb;
// Header.
rank_math()->admin->display_admin_header();
?>
<?php if ( ! defined( 'RANK_MATH_PRO_FILE' ) ) : ?>
<div class="rank-math-unlock-pro-notice" id="rank-math-unlock-pro-notice">
<a href="<?php KB::the( 'pro', 'Unlock PRO Options Panel Notice' ); ?>" target="_blank" class="pro-link">
<p>
<?php esc_html_e( 'Take your SEO to the Next Level!', 'rank-math' ); ?>
<strong><?php esc_html_e( 'Get Rank Math PRO!', 'rank-math' ); ?></strong>
<span><?php esc_html_e( 'Click here to see all the exciting features.', 'rank-math' ); ?></span>
</p>
<div class="close-notice">
<span class="dashicons dashicons-dismiss"></span>
</div>
</a>
</div>
<?php endif; ?>
<div class="wrap rank-math-wrap rank-math-wrap-settings">
<span class="wp-header-end"></span>
<form class="cmb-form" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="POST" id="<?php echo esc_attr( $cmb->cmb_id ); ?>" enctype="multipart/form-data" encoding="multipart/form-data">
<input type="hidden" name="action" value="<?php echo esc_attr( $machine->option_key ); ?>">
<?php $machine->options_page_metabox(); ?>
<footer class="form-footer rank-math-ui settings-footer wp-clearfix">
<?php wp_nonce_field( 'rank-math-reset-options' ); ?>
<input type="submit" name="submit-cmb" id="submit-cmb" title="<?php echo esc_html__( 'Ctrl/Cmd + Enter', 'rank-math' ); ?>" class="button button-primary save-options" value="<?php esc_attr_e( 'Save Changes', 'rank-math' ); ?>">
<input type="submit" name="reset-cmb" id="rank-math-reset-cmb" value="<?php esc_attr_e( 'Reset Options', 'rank-math' ); ?>" class="button button-secondary reset-options alignleft">
</footer>
</form>
</div>
<?php
}
/**
* Check if we are on the correct page.
*
* @return bool
*/
public function is_current_page() {
return Param::request( 'page' ) === $this->key || Param::request( 'action' ) === $this->key;
}
/**
* Get setting tabs.
*
* @return array
*/
private function get_tabs() {
$filter = str_replace( '-', '_', str_replace( 'rank-math-', '', $this->key ) );
/**
* Allow developers to add new tabs into option panel.
*
* The dynamic part of hook is, page name without 'rank-math-' prefix.
*
* @param array $tabs
*/
return $this->do_filter( "admin/options/{$filter}_tabs", $this->tabs );
}
/**
* Locate tab options file.
*
* @param string $id Tab id.
* @param array $tab Tab options.
* @return string|boolean
*/
private function locate_file( $id, $tab ) {
if ( isset( $tab['type'] ) && 'seprator' === $tab['type'] ) {
return false;
}
$file = isset( $tab['file'] ) && ! empty( $tab['file'] ) ? $tab['file'] : rank_math()->includes_dir() . "settings/{$this->folder}/{$id}.php";
return file_exists( $file ) ? $file : false;
}
}
@@ -0,0 +1,326 @@
<?php
/**
* The admin-page functionality.
*
* @since 1.0.0
* @package RankMath
* @subpackage RankMath\Admin
* @author RankMath <support@rankmath.com>
*/
namespace RankMath\Admin;
use RankMath\Helpers\Param;
/**
* Page class.
*/
class Page {
/**
* Unique ID used for menu_slug.
*
* @var string
*/
public $id = null;
/**
* The text to be displayed in the title tags of the page.
*
* @var string
*/
public $title = null;
/**
* The slug name for the parent menu.
*
* @var string
*/
public $parent = null;
/**
* The The on-screen name text for the menu.
*
* @var string
*/
public $menu_title = null;
/**
* The capability required for this menu to be displayed to the user.
*
* @var string
*/
public $capability = 'manage_options';
/**
* The icon for this menu.
*
* @var string
*/
public $icon = 'dashicons-art';
/**
* The position in the menu order this menu should appear.
*
* @var int
*/
public $position = -1;
/**
* The function/file that displays the page content for the menu page.
*
* @var string|callable
*/
public $render = null;
/**
* The function that run on page POST to save data.
*
* @var callable
*/
public $onsave = null;
/**
* Hold contextual help tabs.
*
* @var array
*/
public $help = null;
/**
* Hold scripts and styles.
*
* @var array
*/
public $assets = null;
/**
* Check if plugin is network active.
*
* @var array
*/
public $is_network = false;
/**
* Hold classes for body tag.
*
* @var array
*/
public $classes = null;
/**
* The Constructor.
*
* @param string $id Admin page unique id.
* @param string $title Title of the admin page.
* @param array $config Optional. Override page settings.
*/
public function __construct( $id, $title, $config = [] ) {
// Early bail!
if ( ! $id ) {
wp_die( esc_html__( '$id variable required', 'rank-math' ), esc_html__( 'Variable Required', 'rank-math' ) );
}
if ( ! $title ) {
wp_die( esc_html__( '$title variable required', 'rank-math' ), esc_html__( 'Variable Required', 'rank-math' ) );
}
$this->id = $id;
$this->title = $title;
foreach ( $config as $key => $value ) {
$this->$key = $value;
}
if ( ! $this->menu_title ) {
$this->menu_title = $title;
}
add_action( 'init', [ $this, 'init' ], 25 );
}
/**
* Init admin page when WordPress Initialises.
*
* @codeCoverageIgnore
*/
public function init() {
$priority = $this->parent ? intval( $this->position ) : -1;
add_action( $this->is_network ? 'network_admin_menu' : 'admin_menu', [ $this, 'register_menu' ], $priority );
// If not the page is not this page stop here.
if ( ! $this->is_current_page() ) {
return;
}
$hooks = [
'admin_init' => [
'callback' => 'save',
'condition' => ! is_null( $this->onsave ) && is_callable( $this->onsave ),
],
'admin_enqueue_scripts' => [
'callback' => 'enqueue',
'condition' => ! empty( $this->assets ),
],
'admin_head' => [
'callback' => 'contextual_help',
'condition' => ! empty( $this->help ),
],
'admin_body_class' => [
'callback' => 'body_class',
'condition' => ! empty( $this->classes ),
],
];
foreach ( $hooks as $hook => $data ) {
if ( true === $data['condition'] ) {
add_action( $hook, [ $this, $data['callback'] ] );
}
}
}
/**
* Register Admin Menu.
*
* @codeCoverageIgnore
*/
public function register_menu() {
if ( ! $this->parent ) {
add_menu_page( $this->title, $this->menu_title, $this->capability, $this->id, [ $this, 'display' ], $this->icon, $this->position );
return;
}
add_submenu_page( $this->parent, $this->title, $this->menu_title, $this->capability, $this->id, [ $this, 'display' ] );
}
/**
* Enqueue styles and scripts.
*
* @codeCoverageIgnore
*/
public function enqueue() {
$this->enqueue_styles();
$this->enqueue_scripts();
}
/**
* Add classes to <body> of WordPress admin.
*
* @codeCoverageIgnore
*
* @param string $classes Space-separated list of CSS classes.
*
* @return string
*/
public function body_class( $classes = '' ) {
return $classes . ' ' . join( ' ', $this->classes );
}
/**
* Save anything you want using onsave function.
*
* @codeCoverageIgnore
*/
public function save() {
call_user_func( $this->onsave, $this );
}
/**
* Contextual Help.
*
* @codeCoverageIgnore
*/
public function contextual_help() {
$screen = get_current_screen();
foreach ( $this->help as $tab_id => $tab ) {
$tab['id'] = $tab_id;
$tab['content'] = $this->get_help_content( $tab );
$screen->add_help_tab( $tab );
}
}
/**
* Render admin page content using render function you passed in config.
*
* @codeCoverageIgnore
*/
public function display() {
if ( is_null( $this->render ) ) {
return;
}
if ( is_callable( $this->render ) ) {
call_user_func( $this->render, $this );
return;
}
if ( is_string( $this->render ) ) {
include_once $this->render;
}
}
/**
* Is the page is currrent page.
*
* @return bool
*/
public function is_current_page() {
return Param::get( 'page' ) === $this->id;
}
/**
* Enqueue styles
*
* @codeCoverageIgnore
*/
private function enqueue_styles() {
if ( ! isset( $this->assets['styles'] ) || empty( $this->assets['styles'] ) ) {
return;
}
foreach ( $this->assets['styles'] as $handle => $src ) {
wp_enqueue_style( $handle, $src, null, rank_math()->version );
}
}
/**
* Enqueue scripts.
*
* @codeCoverageIgnore
*/
private function enqueue_scripts() {
if ( ! isset( $this->assets['scripts'] ) || empty( $this->assets['scripts'] ) ) {
return;
}
foreach ( $this->assets['scripts'] as $handle => $src ) {
wp_enqueue_script( $handle, $src, null, rank_math()->version, true );
}
}
/**
* Get tab content
*
* @codeCoverageIgnore
*
* @param array $tab Tab to get content for.
*
* @return string
*/
private function get_help_content( $tab ) {
ob_start();
// If it is a function.
if ( isset( $tab['content'] ) && is_callable( $tab['content'] ) ) {
call_user_func( $tab['content'] );
}
// If it is a file.
if ( isset( $tab['view'] ) && $tab['view'] ) {
require $tab['view'];
}
return ob_get_clean();
}
}

Some files were not shown because too many files have changed in this diff Show More