From 296e811fc9a81de92b40935eb9157d4981cf7d5d Mon Sep 17 00:00:00 2001 From: liyupi <592789970@qq.com> Date: Sat, 11 Nov 2023 20:17:47 +0800 Subject: [PATCH] git init --- .gitignore | 125 + .vuepress/config.ts | 137 + .vuepress/extraSideBar.ts | 49 + .vuepress/footer.ts | 32 + .vuepress/navbar.ts | 128 + .../baidu_verify_codeva-hlChwhGcel.html | 1 + .vuepress/public/favicon.ico | Bin 0 -> 1903 bytes .vuepress/public/icon/ai.svg | 1 + .vuepress/public/icon/copyright.svg | 1 + .vuepress/public/icon/dianzan.png | Bin 0 -> 944 bytes .vuepress/public/icon/message.svg | 1 + .vuepress/public/icon/mobile.png | Bin 0 -> 388 bytes .vuepress/public/icon/resume.svg | 1 + .vuepress/public/icon/sketch.svg | 1 + .vuepress/public/icon/user.svg | 1 + .vuepress/public/icon/weixin.png | Bin 0 -> 721 bytes .vuepress/public/icon/xiazai.png | Bin 0 -> 739 bytes .vuepress/public/icon/xingqiu.png | Bin 0 -> 1407 bytes .vuepress/public/logo.png | Bin 0 -> 3454 bytes .vuepress/public/qrcode-codefather.png | Bin 0 -> 13666 bytes .vuepress/public/qrcode-codenav.png | Bin 0 -> 5714 bytes .vuepress/public/qrcode-codenavhelper.png | Bin 0 -> 142276 bytes .vuepress/public/qrcode-mpcoder_yupi.jpg | Bin 0 -> 28504 bytes .vuepress/public/qrcode-thumb.jpg | Bin 0 -> 33234 bytes .vuepress/sidebar.ts | 23 + .vuepress/sidebars/codeNavSideBar.ts | 54 + .vuepress/sidebars/knowledgeSideBar.ts | 30 + .vuepress/sidebars/productSideBar.ts | 14 + .../sidebars/programmingDictionarySideBar.ts | 17 + .vuepress/sidebars/programmingShareSideBar.ts | 80 + .vuepress/sidebars/projectSideBar.ts | 16 + .vuepress/sidebars/roadmapSideBar.ts | 19 + .vuepress/sidebars/selfStudySideBar.ts | 103 + .../theme/components/AlgoliaSearchBox.vue | 172 + .vuepress/theme/components/DropdownLink.vue | 250 + .../theme/components/DropdownTransition.vue | 33 + .vuepress/theme/components/ExtraSidebar.vue | 385 + .vuepress/theme/components/Footer.vue | 69 + .vuepress/theme/components/NavLinks.vue | 156 + .vuepress/theme/components/Navbar.vue | 140 + .vuepress/theme/components/Page.vue | 135 + .vuepress/theme/components/PageSidebarToc.vue | 87 + .../theme/components/PageSidebarTocLink.vue | 140 + .vuepress/theme/index.js | 4 + .vuepress/theme/layouts/Layout.vue | 180 + .vuepress/theme/styles/wrapper.styl | 9 + .vuepress/theme/util/index.js | 245 + README.md | 22 + package-lock.json | 27214 ++++++++++++++++ package.json | 24 + .../README.md" | 91 + ...25\350\256\255\347\273\203\350\220\245.md" | 188 + ...57\350\256\255\347\273\203\350\220\245.md" | 318 + ...06\347\232\204\347\245\236\345\231\250.md" | 129 + ...25\351\200\232\345\205\263\346\235\221.md" | 198 + ...41\347\213\227\344\270\212\345\262\270.md" | 116 + "\344\275\234\350\200\205.md" | 146 + ...17\345\221\230\351\261\274\347\232\256.md" | 574 + ...17\345\221\230\351\261\274\347\232\256.md" | 431 + ...17\345\221\230\351\261\274\347\232\256.md" | 2143 ++ ...17\345\221\230\351\261\274\347\232\256.md" | 399 + ...17\345\221\230\351\261\274\347\232\256.md" | 690 + .../README.md" | 31 + ...17\345\221\230\351\261\274\347\232\256.md" | 93 + ...17\345\221\230\351\261\274\347\232\256.md" | 999 + ...17\345\221\230\351\261\274\347\232\256.md" | 318 + ...17\345\221\230\351\261\274\347\232\256.md" | 111 + ...17\345\221\230\351\261\274\347\232\256.md" | 289 + ...\214\226 Java \351\241\271\347\233\256.md" | 225 + ...\267\350\264\235\344\271\213 MapStruct.md" | 417 + ...31\344\271\210\347\224\250\357\274\237.md" | 176 + ...21\345\214\205\346\265\201\347\250\213.md" | 182 + ...55\345\277\203\346\220\255\345\273\272.md" | 169 + .../README.md" | 56 + ...346\265\213\350\257\225( Spring Boot ).md" | 1071 + ...55\347\232\204\345\272\224\347\224\250.md" | 177 + ...37\346\210\220\344\273\243\347\240\201.md" | 529 + ...00\345\217\221\346\225\210\347\216\207.md" | 126 + ...50\347\275\262\351\241\271\347\233\256.md" | 105 + ...\346\236\266\357\274\214Ant Design Pro.md" | 106 + ...3\346\265\213\350\257\225\357\274\237 .md" | 318 + ...66\346\236\204\344\273\213\347\273\215.md" | 91 + ...66\346\217\220\344\272\244\357\274\237.md" | 81 + ...47\251\272\347\232\204 Bug\357\274\237.md" | 124 + ...45\345\217\243\346\226\207\346\241\243.md" | 236 + ...32\346\227\266\346\217\220\351\206\222.md" | 459 + ...56\345\201\232\350\264\241\347\214\256.md" | 85 + ...34\346\225\260\346\215\256\345\272\223.md" | 416 + ...36\347\251\272\346\240\241\351\252\214.md" | 135 + ...1\351\205\215\347\263\273\347\273\237).md" | 390 + .../README.md" | 707 + ...31\347\224\237\346\210\220\345\231\250.md" | 32 + ...13\350\257\255\350\250\200\357\274\201.md" | 296 + ...31\347\224\237\346\210\220\345\231\250.md" | 31 + ...57\345\260\217\346\231\272\357\274\201.md" | 70 + ...10\345\231\250\344\270\273\351\241\265.md" | 214 + ...66\346\216\222\350\241\214\346\246\234.md" | 191 + ...60\347\224\237\346\210\220\345\231\250.md" | 96 + ...04\347\245\236\345\231\250\357\274\201.md" | 130 + ...04\347\275\221\347\253\231\357\274\201.md" | 159 + ...73\351\241\271\347\233\256\357\274\201.md" | 79 + ...11\347\202\271\344\270\215\345\220\214.md" | 72 + ...37\350\247\211\345\244\264\347\247\203.md" | 45 + ...12\347\272\277\345\225\246\357\274\201.md" | 177 + ...64\345\274\200\346\272\220\357\274\201.md" | 185 + ...67\351\200\232\344\272\206\357\274\201.md" | 93 + ...57\344\275\216\351\205\215\347\211\210.md" | 74 + ...24\346\234\272\345\231\250\344\272\272.md" | 210 + ...23\346\210\221\345\225\246\357\274\201.md" | 172 + ...77\345\216\273\347\216\251\357\274\201.md" | 43 + ...25\351\270\255\345\274\200\346\272\220.md" | 271 + ...75\346\235\245\345\225\246\357\274\201.md" | 120 + ...13\345\257\274\350\210\252\357\274\201.md" | 154 + ...52\347\275\221\347\253\231\357\274\201.md" | 155 + ...40\344\273\266\344\272\213\357\274\201.md" | 77 + ...26\347\250\213\350\265\204\346\272\220.md" | 142 + ...- \351\235\242\350\257\225\351\270\255.md" | 132 + ...15\346\264\273\344\272\206\357\274\201.md" | 118 + ...17\351\273\221\345\261\213\357\274\201.md" | 80 + ...00\346\234\257\350\256\262\350\247\243.md" | 213 + .../README.md" | 29 + ...\255\246\344\271\240GitHub\357\274\237.md" | 92 + ...46\347\274\226\347\250\213\357\274\237.md" | 162 + ...46\344\271\240\346\236\266\346\236\204.md" | 226 + ...41\347\214\256\344\273\243\347\240\201.md" | 116 + ...13\350\257\225\345\220\247\357\274\201.md" | 38 + ...42\357\274\214\346\263\252\347\233\256.md" | 137 + ...00\345\256\266\345\205\254\345\217\270.md" | 53 + ...52\344\272\272\345\215\232\345\256\242.md" | 112 + .../README.md" | 85 + ...46\347\274\226\347\250\213\357\274\237.md" | 131 + ...14\350\265\236\344\271\213\357\274\201.md" | 118 + ...75\344\270\200\346\240\267\357\274\201.md" | 85 + ...32\351\222\261\347\232\204\357\274\237.md" | 99 + ...60\346\217\220\351\227\256\357\274\237.md" | 133 + ...40\350\265\204\346\272\220\357\274\237.md" | 176 + ...13\351\241\271\347\233\256\357\274\237.md" | 211 + ...33\346\204\237\345\217\227\357\274\237.md" | 91 + ...21\345\260\217\347\250\213\345\272\217.md" | 114 + ...15\347\253\257\345\230\233\357\274\237.md" | 76 + ...4\271\210\345\255\246\345\245\275 Java.md" | 172 + ...75\351\200\224\345\276\204\357\274\237.md" | 172 + ...75\350\265\267\346\235\245\357\274\201.md" | 82 + ...57\350\221\227\357\274\237\357\274\201.md" | 78 + ...47\345\216\202\344\272\206\357\274\201.md" | 86 + ...32\347\227\205\344\271\210\357\274\237.md" | 102 + ...14\347\273\203\344\271\240\347\224\237.md" | 95 + ...14\344\275\251\346\234\215\357\274\201.md" | 159 + ...55\347\263\273\347\273\237\357\274\237.md" | 66 + ...0\345\212\237\351\200\206\350\242\255!.md" | 94 + ...11\350\250\200\350\256\272\357\274\237.md" | 153 + ...46\230\257\346\211\223 ACM\357\274\237.md" | 95 + ...55\345\221\275\344\271\210\357\274\237.md" | 90 + ...37\350\266\205\347\272\240\347\273\223.md" | 94 + ...00\347\232\204\351\200\211\346\213\251.md" | 174 + ...0\277\230\346\230\257 Java\357\274\237.md" | 114 + ...26\347\250\213\344\271\240\346\203\257.md" | 213 + ...72\344\270\215\346\265\205\357\274\201.md" | 112 + ...37\350\246\201\347\234\213\357\274\201.md" | 73 + ...1\351\227\256\351\242\230 \357\274\201.md" | 59 + ...71\346\227\266\351\227\264\357\274\201.md" | 174 + ...14\344\273\243\347\240\201\357\274\201.md" | 290 + ...07\346\241\243\347\275\221\347\253\231.md" | 167 + ...04\345\276\210\347\210\275\357\274\201.md" | 213 + ...00\345\217\221\345\256\236\346\210\230.md" | 177 + ...17\347\250\213\345\272\217\345\220\247.md" | 233 + ...31\344\275\234\346\225\210\347\216\207.md" | 133 + ...21\347\253\231\346\226\271\346\263\225.md" | 78 + ...12\345\244\251\345\256\244\357\274\201.md" | 126 + ...60\347\275\221\347\253\231\357\274\237.md" | 207 + ...56\344\273\243\347\240\201\357\274\237.md" | 108 + ...06\231 Spring Boot Starter\357\274\201.md" | 150 + ...52\350\256\241\347\256\227\345\231\250.md" | 156 + ...73\344\271\246\347\254\224\350\256\260.md" | 560 + ...04\350\275\257\344\273\266\357\274\237.md" | 73 + ...13\345\272\217\345\221\230\357\274\201.md" | 190 + ...15\203\350\241\214 if else\357\274\201.md" | 213 + ...72\347\216\251\347\216\251\357\274\201.md" | 518 + ...52\347\275\221\347\253\231\357\274\201.md" | 183 + ...36\346\210\230\350\257\204\346\265\213.md" | 355 + ...30\345\244\247\344\270\212\357\274\201.md" | 33 + ...75\346\227\245\345\201\232\346\242\246.md" | 125 + ...15\345\212\241\345\221\242\357\274\237.md" | 86 + ...00\345\205\250\346\225\231\347\250\213.md" | 389 + ...17\346\212\200\345\267\247\357\274\201.md" | 91 + ...6\344\272\2063\345\200\215\357\274\201.md" | 86 + ...b \351\252\232\346\223\215\344\275\234.md" | 193 + ...15\347\237\245\351\201\223\357\274\201.md" | 140 + .../README.md" | 65 + ...32\345\220\227\357\274\237\342\200\235.md" | 114 + ...6\201\345\206\231 Hardcode\357\274\237.md" | 203 + ...50\347\275\262\346\226\271\345\274\217.md" | 134 + ...50\346\204\217\347\232\204\347\202\271.md" | 222 + ...06\345\222\213\345\212\236\357\274\237.md" | 145 + ...64\350\222\231\344\272\206\357\274\201.md" | 100 + ...62\344\273\243\347\240\201\357\274\201.md" | 64 + ...17\344\273\200\344\271\210\357\274\237.md" | 206 + ...46\200\225\347\232\204 Bug\357\274\201.md" | 196 + ...56\347\232\204\346\265\201\347\250\213.md" | 356 + ...46\345\210\260\344\272\206\357\274\201.md" | 262 + ...75\346\226\207\346\241\243\357\274\237.md" | 167 + ...21\346\225\210\347\216\207\357\274\237.md" | 313 + ...56\344\273\243\347\240\201\357\274\237.md" | 106 + ...20\345\267\245\344\275\234\357\274\237.md" | 263 + ...53\346\263\204\351\234\262\357\274\237.md" | 130 + ...52\351\241\271\347\233\256\357\274\201.md" | 140 + ...37\345\233\240\346\261\207\346\200\273.md" | 224 + ...07\347\232\204\347\247\230\350\257\200.md" | 63 + ...67\345\222\214\346\212\200\345\267\247.md" | 166 + ...33\347\211\271\347\202\271\357\274\237.md" | 101 + ...31\346\226\207\346\241\243\357\274\237.md" | 271 + ...27\350\267\257\346\200\273\347\273\223.md" | 204 + ...75\345\220\223\345\210\260\344\272\206.md" | 112 + ...61\345\272\237\344\272\206\357\274\201.md" | 64 + ...15\347\224\250\346\205\214\357\274\201.md" | 80 + ...56\347\232\204\346\212\200\345\267\247.md" | 179 + ...\271\210\346\230\257 Linux\357\274\237.md" | 112 + ...15\346\212\200\346\234\257\357\274\237.md" | 293 + ...75\345\235\207\350\241\241\357\274\237.md" | 121 + ...57\351\255\224\346\225\260\357\274\237.md" | 88 + ...24\346\263\225\345\200\274\357\274\237.md" | 161 + ...41\345\274\217\344\271\210\357\274\237.md" | 161 + ...7\345\211\215\347\253\257 \357\274\237.md" | 187 + ...72\345\235\227\351\223\276\357\274\237.md" | 431 + ...60\346\215\256\345\272\223\357\274\237.md" | 543 + ...15\345\256\232\345\220\221\357\274\237.md" | 148 + ...47\346\225\260\346\215\256\357\274\237.md" | 373 + ...23\345\255\230\345\205\245\351\227\250.md" | 220 + ...66\345\217\221\347\263\273\347\273\237.md" | 537 + ...47\216\260 Bug\357\274\237\357\274\201.md" | 95 + ...44\347\256\200\345\215\225\357\274\201.md" | 138 + ...27\344\272\216\350\202\241\346\216\214.md" | 349 + ...34\347\264\242\344\275\223\351\252\214.md" | 345 + ...54\345\234\260\347\275\221\347\253\231.md" | 166 + ...347\232\204\345\260\217Bug\357\274\201.md" | 84 + ...24\346\255\252\344\272\206\357\274\201.md" | 163 + ...75\347\232\204\351\224\246\345\233\212.md" | 534 + ...344\270\255\347\232\204 n \357\274\237.md" | 127 + ...42\204\351\230\262 rm -rf \357\274\237.md" | 236 + ...06\347\272\247\346\225\231\347\250\213.md" | 893 + ...06\344\270\200\345\221\250\357\274\201.md" | 142 + ...47\233\256\347\232\204 Bug\357\274\201.md" | 165 + ...51\346\226\257\344\271\213\345\211\221.md" | 626 + ...50\345\235\221\344\272\206\357\274\201.md" | 90 + ...14\345\207\211\345\207\211\357\274\201.md" | 63 + ...14\347\202\270\344\272\206\357\274\201.md" | 128 + ...13\345\220\216\345\210\206\346\236\220.md" | 163 + ...42\345\244\261\351\227\256\351\242\230.md" | 90 + ...57\274\214Bug \350\266\212\345\244\232.md" | 60 + ...43\344\270\200\346\204\243\357\274\201.md" | 127 + ...24\345\207\272\345\206\205\344\274\244.md" | 170 + ...57\350\203\275\344\271\210\357\274\237.md" | 196 + ...13\346\225\205\345\210\206\346\236\220.md" | 178 + ...71\346\234\215\345\212\241\357\274\201.md" | 103 + ...36\351\224\231\344\272\206\357\274\201.md" | 110 + ...15\345\220\221\345\216\213\345\212\233.md" | 108 + ...56\346\216\242\346\265\213\357\274\237.md" | 151 + .../\345\244\232\347\216\257\345\242\203.md" | 244 + ...46\344\273\200\344\271\210\357\274\237.md" | 78 + ...10\351\232\276\344\271\210\357\274\237.md" | 106 + ...45\344\275\234\345\216\237\347\220\206.md" | 262 + ...44\350\257\206\344\271\210\357\274\237.md" | 325 + ...21\347\232\204\347\247\230\350\257\200.md" | 94 + ...345\276\210\350\277\267\350\214\253....md" | 78 + ...70\345\205\263\351\227\256\351\242\230.md" | 40 + ...40\344\272\206\343\200\202\343\200\202.md" | 44 + ...47\345\216\202\344\272\206\357\274\201.md" | 86 + ...17\345\273\272\350\256\256\357\274\201.md" | 162 + ...03\344\273\200\344\271\210\357\274\237.md" | 48 + ...07\346\230\245\346\213\233\357\274\237.md" | 86 + ...15\350\246\201\344\277\241\346\201\257.md" | 84 + ...33\345\273\272\350\256\256\357\274\201.md" | 198 + ...31\344\273\266\344\272\213\357\274\201.md" | 108 + ...72\347\232\204\346\204\237\345\217\227.md" | 156 + ...25\347\232\204\346\204\237\345\217\227.md" | 175 + ...5 \344\272\206\344\271\210\357\274\237.md" | 56 + ...12\345\262\270\344\271\213\350\267\257.md" | 139 + ...23\351\274\223\345\212\262\357\274\201.md" | 139 + ...4\345\213\207\342\200\235 \344\272\206.md" | 58 + ...06\347\256\200\345\216\206\357\274\201.md" | 171 + ...06\344\272\253\347\273\217\351\252\214.md" | 109 + ...34\351\200\232\347\227\205\342\200\235.md" | 82 + ...53\345\217\221\347\216\260\344\272\206.md" | 94 + ...45\350\231\232\347\232\204\357\274\201.md" | 75 + ...36\347\232\204\344\270\200\345\271\264.md" | 360 + ...14\346\225\264\351\235\242\347\273\217.md" | 342 + ...14\347\203\255\344\271\216\357\274\201.md" | 89 + ...16\344\270\272\345\225\246\357\274\201.md" | 250 + ...30\351\232\276\344\275\217\344\272\206.md" | 174 + ...03\347\202\271\345\210\206\344\272\253.md" | 367 + ...10\346\227\240\345\245\210\357\274\201.md" | 59 + ...13\347\202\270\351\224\205\344\272\206.md" | 96 + ...06\357\274\201\357\274\201\357\274\201.md" | 74 + ...64\345\276\210\345\244\261\346\234\233.md" | 95 + ...37\345\205\245\345\261\200\344\272\206.md" | 161 + ...77\344\272\206\357\274\237\357\274\201.md" | 80 + ...I \347\232\204\346\225\205\344\272\213.md" | 198 + ...45\345\234\250\345\223\252\357\274\237.md" | 83 + ...02\345\267\262\345\215\270\350\275\275.md" | 125 + ...72\346\211\213\344\272\206\357\274\237.md" | 82 + ...74\347\233\206\345\206\267\346\260\264.md" | 139 + .../\347\246\273\350\260\261\357\274\201.md" | 79 + ...14\345\272\237\344\272\206\357\274\201.md" | 100 + ...7\274\2141000 \344\272\277\357\274\201.md" | 142 + ...17\344\276\277\350\201\212\350\201\212.md" | 101 + ...01\357\274\214\345\215\225\346\211\213.md" | 123 + ...54\344\270\200\345\244\253\344\272\272.md" | 123 + ...P \344\270\273\346\216\250\350\215\220.md" | 125 + ...13\347\275\221\347\253\231\357\274\201.md" | 100 + ...350\277\207\344\272\206 5 \345\271\264.md" | 242 + ...26\347\250\213\350\265\204\346\272\220.md" | 180 + ...13\345\244\247\346\261\207\346\200\273.md" | 121 + ...56\345\244\247\346\261\207\346\200\273.md" | 76 + ...56\345\244\247\346\261\207\346\200\273.md" | 118 + ...\272\247 Java \346\225\231\347\250\213.md" | 65 + ...04\346\272\220\345\210\206\344\272\253.md" | 115 + ...55\347\232\204\351\241\271\347\233\256.md" | 123 + ...04\344\270\211\346\235\277\346\226\247.md" | 69 + ...64\271 Python \350\265\204\346\272\220.md" | 154 + ...61\347\232\204\345\260\217\344\271\246.md" | 47 + ...04\346\272\220\346\261\207\346\200\273.md" | 156 + ...21\347\254\224\350\256\260\357\274\201.md" | 213 + ...53\345\272\223\346\216\250\350\215\220.md" | 108 + ...72\346\217\222\344\273\266\357\274\201.md" | 111 + ...75\345\234\250\347\224\250\357\274\201.md" | 80 + ...00\347\232\204\345\267\245\345\205\267.md" | 70 + ...15\347\253\257\347\245\236\345\231\250.md" | 91 + ...77\351\200\217\345\267\245\345\205\267.md" | 94 + ...71\347\232\204\345\233\276\345\272\212.md" | 139 + ...31\345\220\216\347\253\257\357\274\201.md" | 201 + ...54\345\205\265\345\231\250\357\274\201.md" | 177 + ...04\345\256\235\350\264\235\344\273\254.md" | 155 + ...45\345\205\267\344\272\206\357\274\201.md" | 116 + ...14\346\210\221\345\272\237\344\272\206.md" | 201 + ...74\345\276\227\346\224\266\350\227\217.md" | 588 + ...16\345\274\200\346\272\220\357\274\201.md" | 52 + ...34\344\273\230\350\264\271\357\274\237.md" | 112 + ...37\346\200\201\344\270\200\350\247\210.md" | 135 + ...15\347\253\257\351\241\271\347\233\256.md" | 115 + ...01\345\220\271\347\210\206\357\274\201.md" | 122 + ...52\345\267\261\345\201\232\357\274\201.md" | 178 + ...56\347\201\253\344\272\206\357\274\201.md" | 77 + ...14\345\244\247\350\265\236\357\274\201.md" | 76 + ...52\351\241\266\344\272\206\357\274\201.md" | 244 + ...55\345\271\264\345\215\261\346\234\272.md" | 53 + .../README.md" | 9 + ...21\350\267\257\344\272\206\357\274\201.md" | 54 + ...14\345\244\247\344\275\254\357\274\201.md" | 185 + ...5\244\251 CRUD\343\200\202\343\200\202.md" | 52 + .../README.md" | 19 + ...00\346\224\276\345\271\263\345\217\260.md" | 192 + ...44\351\242\230\347\263\273\347\273\237.md" | 77 + ...71\351\205\215\347\263\273\347\273\237.md" | 195 + ...50\203\275 BI \345\271\263\345\217\260.md" | 197 + ...55\345\277\203\345\271\263\345\217\260.md" | 224 + ...34\347\264\242\345\271\263\345\217\260.md" | 214 + ...00\346\272\220\344\272\206\357\274\201.md" | 107 + ...- \345\260\232\345\214\273\351\200\232.md" | 209 + ...36\345\220\211\345\244\226\345\215\226.md" | 108 + ...05\350\260\267\350\257\276\345\240\202.md" | 188 + ...21\351\251\254\347\202\271\350\257\204.md" | 198 + .../README.md" | 375 + .../README.md" | 76 + ...52\344\272\272\347\273\217\345\216\206.md" | 73 + ...37\344\270\273\344\273\213\347\273\215.md" | 77 + ...26\347\250\213\345\257\274\350\210\252.md" | 54 + ...64\345\272\246\346\200\273\347\273\223.md" | 18 + .../README.md" | 79 + ...16\344\270\272\344\272\206\357\274\201.md" | 161 + ...06\347\233\256\346\240\207\357\274\201.md" | 82 + ...32\346\235\245\344\272\206\357\274\201.md" | 344 + ...04\345\244\247\345\255\246\357\274\201.md" | 69 + ...45\344\270\215\346\231\232\357\274\201.md" | 164 + ...11\350\257\235\350\257\264\357\274\201.md" | 71 + ...21\347\232\204\347\247\230\350\257\200.md" | 167 + ...45\345\226\234\344\272\206\357\274\201.md" | 70 + ...17\347\261\263\344\272\206\357\274\201.md" | 228 + ...12\345\262\270\344\272\206\357\274\201.md" | 58 + ...344\270\212\345\262\270985\357\274\201.md" | 178 + ...14\346\210\220\344\272\206\357\274\201.md" | 185 + ...12\345\262\270\345\225\246\357\274\201.md" | 154 + ...04\347\247\230\350\257\200\357\274\201.md" | 82 + ...06\345\244\247\345\216\202\357\274\201.md" | 83 + ...70\345\255\227\350\212\202\357\274\201.md" | 37 + ...06\350\277\231\344\272\233\357\274\201.md" | 308 + ...33\345\244\247\345\216\202\357\274\201.md" | 102 + ...21\347\232\204\346\204\237\345\217\227.md" | 82 + ...14\347\250\263\344\272\206\357\274\201.md" | 79 + ...47\347\232\204\346\224\271\345\217\230.md" | 71 + ...13\347\232\204\344\270\200\345\271\264.md" | 48 + ...75\345\245\226\344\272\206\357\274\201.md" | 94 + ...41\347\220\206\351\234\200\346\261\202.md" | 92 + ...04\350\275\257\344\273\266\357\274\237.md" | 59 + ...71\351\205\215\347\263\273\347\273\237.md" | 187 + ...50\346\210\267\344\270\255\345\277\203.md" | 213 + ...00\346\224\276\345\271\263\345\217\260.md" | 191 + ...44\351\242\230\347\263\273\347\273\237.md" | 277 + ...50\203\275 BI \345\271\263\345\217\260.md" | 190 + ...34\347\264\242\345\271\263\345\217\260.md" | 184 + ...52\347\273\206\344\272\206\357\274\201.md" | 66 + ...60\350\256\241\345\207\211\344\272\206.md" | 143 + ...14\347\203\255\344\271\216\357\274\201.md" | 97 + ...33\351\200\232\347\227\205\357\274\201.md" | 89 + ...40\344\272\206\343\200\202\343\200\202.md" | 39 + ...60\345\276\227\346\233\264\350\277\234.md" | 73 + ...54\346\212\230\347\202\271\357\274\201.md" | 203 + ...54\347\240\201\347\273\217\345\216\206.md" | 53 + ...54\346\212\230\347\202\271\357\274\201.md" | 105 + ...04\347\233\256\346\240\207\357\274\201.md" | 161 + ...21\347\232\204\346\225\205\344\272\213.md" | 138 + ...14\347\211\233\347\232\256\357\274\201.md" | 62 + ...46\347\274\226\347\250\213\357\274\201.md" | 43 + ...21\344\271\237\350\246\201\347\234\213.md" | 82 + ...22\345\201\207\346\200\273\347\273\223.md" | 173 + ...10\345\212\252\345\212\233\357\274\201.md" | 102 + ...76\345\256\236\344\271\240\357\274\201.md" | 86 + ...26\345\246\202\346\226\257\357\274\201.md" | 173 + ...55\347\263\273\347\273\237\357\274\237.md" | 64 + ...44\347\234\237\344\272\206\357\274\201.md" | 80 + ...37\351\200\206\350\242\255\357\274\201.md" | 84 + ...50\343\200\202\343\200\202\343\200\202.md" | 52 + ...02\345\222\213\345\212\236\357\274\237.md" | 120 + ...17\345\205\270\351\227\256\351\242\230.md" | 89 + .../README.md" | 67 + ...72\350\212\261\346\235\245\357\274\237.md" | 140 + ...11\345\256\276\345\210\206\344\272\253.md" | 43 + ...00\346\234\237\347\233\264\346\222\255.md" | 421 + ...00\345\234\272\350\256\262\345\272\247.md" | 79 + ...36\344\272\244\346\265\201\347\276\244.md" | 55 + ...46\344\271\240\350\267\257\347\272\277.md" | 114 + ...46\344\271\240\350\265\204\346\272\220.md" | 23 + ...46\344\271\240\347\254\224\350\256\260.md" | 28 + ...23\345\267\245\346\227\245\350\256\260.md" | 85 + ...00\346\224\276\345\271\263\345\217\260.md" | 202 + ...71\347\233\256\346\250\241\346\235\277.md" | 86 + ...44\351\242\230\347\263\273\347\273\237.md" | 177 + ...20\345\231\250\351\241\271\347\233\256.md" | 47 + ...10\347\253\257\351\241\271\347\233\256.md" | 43 + ...71\351\205\215\347\263\273\347\273\237.md" | 142 + ...06\346\236\220\345\267\245\345\205\267.md" | 5 + ...50\203\275 BI \345\271\263\345\217\260.md" | 18 + ...55\345\277\203\351\241\271\347\233\256.md" | 258 + ...26\345\212\261\347\263\273\347\273\237.md" | 32 + ...34\347\264\242\345\271\263\345\217\260.md" | 19 + ...56\350\256\255\347\273\203\350\220\245.md" | 49 + .../README.md" | 499 + .../README.md" | 63 + .../README.md" | 139 + ...01\346\210\221\345\245\275\346\205\214.md" | 73 + ...40\346\203\257\343\200\202\343\200\202.md" | 92 + ...32\346\226\207\345\214\226\357\274\201.md" | 70 + ...15\344\270\200\346\240\267\357\274\201.md" | 58 + ...36\344\271\240\347\224\237\346\264\273.md" | 134 + ...00\344\270\232\344\272\206\357\274\201.md" | 65 + ...73\345\210\233\344\270\232\357\274\201.md" | 70 + ...345\244\251Bug\343\200\202\343\200\202.md" | 72 + ...10\344\274\230\347\247\200\357\274\201.md" | 52 + ...21\345\215\264\345\223\255\344\272\206.md" | 243 + ...42\344\275\240\357\274\201\342\200\235.md" | 72 + ...34\347\273\217\345\216\206\343\200\202.md" | 146 + ...73\347\232\204\345\233\242\345\273\272.md" | 71 + .../\344\272\214\345\215\201\345\233\233.md" | 41 + ...66\345\244\247\344\272\213\357\274\201.md" | 236 + ...10\345\275\273\345\272\225\357\274\201.md" | 79 + ...10\344\270\207\347\262\211\344\270\235.md" | 246 + ...66\345\244\247\344\272\213\357\274\201.md" | 83 + ...07\350\256\277\344\272\206\357\274\201.md" | 139 + ...06\346\235\245\344\272\206\357\274\201.md" | 235 + ...\344\270\200\345\220\215UP\344\270\273.md" | 193 + ...03\346\200\201\345\264\251\344\272\206.md" | 87 + ...45\345\270\270\347\224\237\346\264\273.md" | 67 + ...4\270\213\350\205\276\350\256\257offer.md" | 167 + ...32\351\222\261\347\232\204\357\274\237.md" | 95 + ...73\351\241\271\347\233\256\357\274\201.md" | 102 + ...14\345\205\261\345\213\211\357\274\201.md" | 243 + ...20\347\232\204\347\273\217\345\216\206.md" | 283 + ...25\344\270\232\346\204\237\345\217\227.md" | 209 + ...37\350\247\211\345\244\264\347\247\203.md" | 45 + ...03\350\257\201\347\273\217\345\216\206.md" | 193 + ...12\346\265\267\345\277\203\345\276\227.md" | 283 + ...15\345\210\260\345\267\245\344\275\234.md" | 126 + ...30\351\223\201\344\270\212\347\217\255.md" | 307 + ...27\350\212\202\350\267\263\345\212\250.md" | 430 + ...45\347\232\204\347\273\217\345\216\206.md" | 147 + ...10\346\240\267\345\221\242\357\274\237.md" | 84 + ...60\347\233\256\346\240\207\357\274\201.md" | 78 + ...50\347\232\204\347\212\266\346\200\201.md" | 87 + ...35\351\207\215\345\225\212\342\200\246.md" | 54 + ...52\345\276\213\347\232\204\344\272\272.md" | 90 + ...21\345\256\263\346\200\225\344\272\206.md" | 69 + ...62\347\202\271\345\225\245\345\221\242.md" | 72 + ...24\347\246\273\344\272\206\357\274\201.md" | 41 + ...53\346\213\205\345\277\203\357\274\201.md" | 70 + ...40\344\275\217\344\272\206\357\274\201.md" | 55 + ...04\347\212\266\346\200\201\345\220\247.md" | 98 + ...50\343\200\202\343\200\202\343\200\202.md" | 53 + ...17\344\276\277\350\201\212\350\201\212.md" | 120 + ...32\344\273\200\344\271\210\357\274\237.md" | 118 + ...14\350\205\276\350\256\257\357\274\201.md" | 146 + ...06\343\200\202\343\200\202\343\200\202.md" | 163 + ...64\347\232\204\344\271\240\346\203\257.md" | 72 + ...06\344\273\200\344\271\210\357\274\237.md" | 261 + ...64\347\232\204\346\204\237\345\217\227.md" | 164 + ...03\351\201\223\345\270\210\345\225\246.md" | 231 + ...45\344\275\234\346\204\237\345\217\227.md" | 129 + ...50\346\234\237\346\200\273\347\273\223.md" | 222 + ...54\344\270\200\345\220\215\357\274\201.md" | 184 + ...21\346\211\215\346\230\216\347\231\275.md" | 52 + ...06\343\200\202\343\200\202\343\200\202.md" | 94 + ...31\344\273\266\344\272\213\357\274\201.md" | 131 + ...77\344\273\243\347\240\201\357\274\237.md" | 121 + ...00\346\224\276\345\271\263\345\217\260.md" | 315 + ...71\347\233\256\346\250\241\346\235\277.md" | 85 + ...44\351\242\230\347\263\273\347\273\237.md" | 318 + .../README.md" | 204 + ...71\351\205\215\347\263\273\347\273\237.md" | 305 + ...50\203\275 BI \345\271\263\345\217\260.md" | 299 + ...55\345\277\203\351\241\271\347\233\256.md" | 328 + ...34\347\264\242\345\271\263\345\217\260.md" | 294 + 519 files changed, 106314 insertions(+) create mode 100644 .gitignore create mode 100644 .vuepress/config.ts create mode 100644 .vuepress/extraSideBar.ts create mode 100644 .vuepress/footer.ts create mode 100644 .vuepress/navbar.ts create mode 100644 .vuepress/public/baidu_verify_codeva-hlChwhGcel.html create mode 100644 .vuepress/public/favicon.ico create mode 100644 .vuepress/public/icon/ai.svg create mode 100644 .vuepress/public/icon/copyright.svg create mode 100644 .vuepress/public/icon/dianzan.png create mode 100644 .vuepress/public/icon/message.svg create mode 100644 .vuepress/public/icon/mobile.png create mode 100644 .vuepress/public/icon/resume.svg create mode 100644 .vuepress/public/icon/sketch.svg create mode 100644 .vuepress/public/icon/user.svg create mode 100644 .vuepress/public/icon/weixin.png create mode 100644 .vuepress/public/icon/xiazai.png create mode 100644 .vuepress/public/icon/xingqiu.png create mode 100644 .vuepress/public/logo.png create mode 100644 .vuepress/public/qrcode-codefather.png create mode 100644 .vuepress/public/qrcode-codenav.png create mode 100644 .vuepress/public/qrcode-codenavhelper.png create mode 100644 .vuepress/public/qrcode-mpcoder_yupi.jpg create mode 100644 .vuepress/public/qrcode-thumb.jpg create mode 100644 .vuepress/sidebar.ts create mode 100644 .vuepress/sidebars/codeNavSideBar.ts create mode 100644 .vuepress/sidebars/knowledgeSideBar.ts create mode 100644 .vuepress/sidebars/productSideBar.ts create mode 100644 .vuepress/sidebars/programmingDictionarySideBar.ts create mode 100644 .vuepress/sidebars/programmingShareSideBar.ts create mode 100644 .vuepress/sidebars/projectSideBar.ts create mode 100644 .vuepress/sidebars/roadmapSideBar.ts create mode 100644 .vuepress/sidebars/selfStudySideBar.ts create mode 100644 .vuepress/theme/components/AlgoliaSearchBox.vue create mode 100644 .vuepress/theme/components/DropdownLink.vue create mode 100644 .vuepress/theme/components/DropdownTransition.vue create mode 100755 .vuepress/theme/components/ExtraSidebar.vue create mode 100644 .vuepress/theme/components/Footer.vue create mode 100644 .vuepress/theme/components/NavLinks.vue create mode 100644 .vuepress/theme/components/Navbar.vue create mode 100644 .vuepress/theme/components/Page.vue create mode 100755 .vuepress/theme/components/PageSidebarToc.vue create mode 100755 .vuepress/theme/components/PageSidebarTocLink.vue create mode 100755 .vuepress/theme/index.js create mode 100755 .vuepress/theme/layouts/Layout.vue create mode 100644 .vuepress/theme/styles/wrapper.styl create mode 100755 .vuepress/theme/util/index.js create mode 100644 README.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/README.md" create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/\345\211\215\347\253\257\347\252\201\345\207\273 - \345\211\215\347\253\257\351\235\242\350\257\225\350\256\255\347\273\203\350\220\245.md" create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/\345\220\216\347\253\257\347\252\201\345\207\273 - \347\213\202\351\243\231\345\220\216\347\253\257\350\256\255\347\273\203\350\220\245.md" create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/\346\261\202\350\201\214 - \345\270\256\344\275\240\345\206\231\345\245\275\347\256\200\345\216\206\347\232\204\347\245\236\345\231\250.md" create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/\347\256\227\346\263\225\345\255\246\344\271\240 - \347\274\226\347\250\213\345\257\274\350\210\252\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221.md" create mode 100644 "\344\272\247\345\223\201\346\234\215\345\212\241/\350\200\203\347\240\224\351\231\252\350\267\221 - \347\274\226\347\250\213\345\257\274\350\210\252\350\256\241\347\213\227\344\270\212\345\262\270.md" create mode 100644 "\344\275\234\350\200\205.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/C++\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/Git&GitHub\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/Java\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/Linux\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/Python\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/README.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/SQL\345\205\215\350\264\271\345\256\236\346\210\230\350\207\252\345\255\246\347\275\221\347\253\231 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/\345\211\215\347\253\257\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/\346\225\260\346\215\256\347\273\223\346\236\204\345\222\214\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/4 \347\247\215\346\226\271\346\263\225\357\274\214\345\277\253\351\200\237\345\210\235\345\247\213\345\214\226 Java \351\241\271\347\233\256.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/Bean \346\213\267\350\264\235\344\271\213 MapStruct.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/Git \346\217\220\344\272\244\347\253\237\347\204\266\350\277\230\350\203\275\350\277\231\344\271\210\347\224\250\357\274\237.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/Maven \344\270\255\345\244\256\344\273\223\345\272\223\345\217\221\345\214\205\346\265\201\347\250\213.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/Nacos \351\205\215\347\275\256\344\270\255\345\277\203\346\220\255\345\273\272.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/README.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/RESTful \346\216\245\345\217\243\345\256\236\347\216\260\344\270\216\346\265\213\350\257\225( Spring Boot ).md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\343\200\220\350\256\276\350\256\241\346\250\241\345\274\217\343\200\221\350\243\205\351\245\260\350\200\205\346\250\241\345\274\217\357\274\214\345\217\212\345\205\266\345\234\250JDK\346\272\220\347\240\201\344\270\255\347\232\204\345\272\224\347\224\250.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250 FreeMarker \346\250\241\346\235\277\345\274\225\346\223\216\347\224\237\346\210\220\344\273\243\347\240\201.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\345\220\216\347\253\257\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\357\274\214\346\217\220\351\253\230\345\274\200\345\217\221\346\225\210\347\216\207.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\347\254\254\344\270\211\346\226\271\346\234\215\345\212\241(\345\256\235\345\241\224)\345\277\253\351\200\237\351\203\250\347\275\262\351\241\271\347\233\256.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\211\215\347\253\257\345\277\205\345\255\246\347\232\204\345\274\200\345\217\221\346\241\206\346\236\266\357\274\214Ant Design Pro.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\345\246\202\344\275\225\347\274\226\345\206\231\345\215\225\345\205\203\346\265\213\350\257\225\357\274\237 .md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\351\241\271\347\233\256\347\273\217\345\205\270\345\210\206\345\261\202\346\236\266\346\236\204\344\273\213\347\273\215.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\345\277\253\351\200\237\345\277\275\347\225\245 Git \346\226\207\344\273\266\346\217\220\344\272\244\357\274\237.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\350\247\243\345\206\263\346\225\260\346\215\256\346\237\245\350\257\242\344\270\272\347\251\272\347\232\204 Bug\357\274\237.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\351\253\230\346\225\210\346\265\213\350\257\225\346\216\245\345\217\243\357\274\237\350\207\252\345\212\250\347\224\237\346\210\220\346\216\245\345\217\243\346\226\207\346\241\243.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\274\200\345\217\221\344\274\201\344\270\232\345\276\256\344\277\241\347\276\244\346\234\272\345\231\250\344\272\272\357\274\214\345\256\236\347\216\260\345\256\232\346\227\266\346\217\220\351\206\222.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\345\277\253\351\200\237\345\255\246\344\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\201\232\350\264\241\347\214\256.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\346\225\264\345\220\210Spring JDBC\346\223\215\344\275\234\346\225\260\346\215\256\345\272\223.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250@Validated\346\263\250\350\247\243\345\256\236\347\216\260\351\235\236\347\251\272\346\240\241\351\252\214.md" create mode 100644 "\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250\345\233\233\347\247\215\351\224\201\345\256\236\347\216\260\345\212\240\345\205\245\351\230\237\344\274\215\345\212\237\350\203\275(\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237).md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/520\357\274\214\346\210\221\345\201\232\344\272\206\344\270\252\350\241\250\347\231\275\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\344\270\200\344\270\215\345\260\217\345\277\203\345\210\233\351\200\240\344\272\206\346\226\260\347\232\204\347\274\226\347\250\213\350\257\255\350\250\200\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\226\234\350\277\216\346\226\260\346\230\245\357\274\214\346\210\221\345\201\232\344\272\206\344\270\200\344\270\252\347\245\235\347\246\217\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\244\247\345\256\266\345\245\275\357\274\214\346\210\221\346\230\257\345\260\217\346\231\272\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\245\207\346\200\235\345\246\231\346\203\263\357\274\214\345\212\250\346\211\213 DIY \344\275\240\347\232\204\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\270\246\350\200\201\345\274\237\345\201\232\344\270\252\345\256\236\346\227\266\346\216\222\350\241\214\346\246\234.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\204\232\347\232\256\345\201\232\344\272\206\344\270\200\344\270\252 AI \347\274\226\347\250\213\346\230\265\347\247\260\347\224\237\346\210\220\345\231\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\345\201\232\344\272\206\344\270\200\346\254\276\347\224\237\346\210\220\344\273\243\347\240\201+\346\225\260\346\215\256\347\232\204\347\245\236\345\231\250\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\345\201\232\344\272\206\344\270\252\345\276\210\345\270\205\347\232\204\347\275\221\347\253\231\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\345\244\247\344\270\211\346\227\266\345\201\232\347\232\204\347\276\236\350\200\273\351\241\271\347\233\256\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\347\232\204\346\226\260\347\275\221\347\253\231\344\270\212\347\272\277\344\272\206\357\274\201\350\200\214\344\270\224\350\277\231\346\254\241\347\232\204\345\210\266\344\275\234\346\226\271\345\274\217\346\234\211\347\202\271\344\270\215\345\220\214.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\347\232\204\346\257\225\344\270\232\350\256\276\350\256\241\357\274\214\346\227\266\351\232\224\344\270\200\345\271\264\357\274\214\344\273\215\346\204\237\350\247\211\345\244\264\347\247\203.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\347\232\204\350\241\250\346\203\205\345\214\205\347\275\221\347\253\231\344\270\212\347\272\277\345\225\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\346\210\221\351\200\240\344\272\206\344\270\252\350\275\256\345\255\220\357\274\214\345\256\214\346\225\264\345\274\200\346\272\220\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\347\234\213\345\256\214\350\277\231\344\270\252\357\274\214\346\210\221\347\233\264\346\216\245\346\212\212 SQL \345\210\267\351\200\232\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\347\276\212\344\272\206\344\270\252\347\276\212\357\274\214\344\275\206\346\230\257\344\275\216\351\205\215\347\211\210.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\350\207\252\345\210\266 AI \351\227\256\347\255\224\346\234\272\345\231\250\344\272\272.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\350\277\231\346\254\241\346\210\221\345\274\200\346\272\220\357\274\214\345\210\253\345\206\215\346\211\223\346\210\221\345\225\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\346\265\213\350\257\225\351\270\255-\350\207\252\345\255\246\347\275\221\347\253\231\345\256\211\345\205\250/\345\201\232\344\272\206\344\270\252\346\211\276\346\211\223\347\232\204\347\275\221\347\253\231\357\274\214\346\213\277\345\216\273\347\216\251\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\346\265\213\350\257\225\351\270\255-\350\207\252\345\255\246\347\275\221\347\253\231\345\256\211\345\205\250/\346\265\213\350\257\225\351\270\255\345\274\200\346\272\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\347\274\226\347\250\213\345\257\274\350\210\252-\347\274\226\347\250\213\350\265\204\346\272\220\347\275\221/\345\201\207\346\234\237\347\273\223\346\235\237\357\274\214\347\274\226\347\250\213\345\257\274\350\210\252\345\270\246\347\235\200\346\226\260\345\212\237\350\203\275\346\235\245\345\225\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\347\274\226\347\250\213\345\257\274\350\210\252-\347\274\226\347\250\213\350\265\204\346\272\220\347\275\221/\347\210\206\350\202\235 200 \345\260\217\346\227\266\357\274\214\346\210\221\345\201\232\344\272\206\344\270\252\347\274\226\347\250\213\345\257\274\350\210\252\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\347\274\226\347\250\213\345\257\274\350\210\252-\347\274\226\347\250\213\350\265\204\346\272\220\347\275\221/\347\210\206\350\202\235\357\274\201\346\234\213\345\217\213\345\201\232\344\272\206\344\270\252\347\274\226\347\250\213\345\257\274\350\210\252\347\275\221\347\253\231\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\347\274\226\347\250\213\345\257\274\350\210\252-\347\274\226\347\250\213\350\265\204\346\272\220\347\275\221/\347\273\231\347\210\270\347\210\270\344\273\254\346\261\207\346\212\245\345\207\240\344\273\266\344\272\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\347\274\226\347\250\213\345\257\274\350\210\252-\347\274\226\347\250\213\350\265\204\346\272\220\347\275\221/\347\274\226\347\250\213\345\257\274\350\210\252\350\257\236\347\224\237\357\274\201\350\275\273\346\235\276\345\217\221\347\216\260\344\274\230\350\264\250\347\274\226\347\250\213\350\265\204\346\272\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\351\235\242\350\257\225\351\270\255-\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221/\345\205\215\350\264\271\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221 - \351\235\242\350\257\225\351\270\255.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\351\235\242\350\257\225\351\270\255-\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221/\345\257\271\344\270\215\350\265\267\357\274\214\346\210\221\347\232\204\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221\345\244\215\346\264\273\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\351\235\242\350\257\225\351\270\255-\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221/\346\224\273\345\207\273\351\235\242\350\257\225\351\270\255\357\274\237\350\277\233\345\260\217\351\273\221\345\261\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\351\235\242\350\257\225\351\270\255-\351\235\242\350\257\225\345\210\267\351\242\230\347\275\221/\351\235\242\350\257\225\351\270\255\347\275\221\347\253\231\357\274\214\347\224\250\345\210\260\347\232\204\346\212\200\346\234\257\350\256\262\350\247\243.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\245\351\227\250\345\277\205\347\234\213-\345\255\246\344\271\240\350\267\257\347\272\277/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\245\351\227\250\345\277\205\347\234\213-\345\255\246\344\271\240\350\267\257\347\272\277/\345\246\202\344\275\225\345\255\246\344\271\240GitHub\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\245\351\227\250\345\277\205\347\234\213-\345\255\246\344\271\240\350\267\257\347\272\277/\345\246\202\344\275\225\350\207\252\345\255\246\347\274\226\347\250\213\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\245\351\227\250\345\277\205\347\234\213-\345\255\246\344\271\240\350\267\257\347\272\277/\347\274\226\347\250\213\345\205\245\351\227\250\345\210\260\350\277\233\345\244\247\345\216\202\357\274\214\344\275\240\351\234\200\350\246\201\350\277\231\345\245\227\345\255\246\344\271\240\346\236\266\346\236\204.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\266\344\273\226/14 \345\262\201\357\274\2143 \346\254\241\347\273\231\346\210\221\347\232\204\351\241\271\347\233\256\350\264\241\347\214\256\344\273\243\347\240\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\266\344\273\226/\344\275\240\347\234\237\347\232\204\344\272\206\350\247\243\347\250\213\345\272\217\345\221\230\344\271\210\357\274\237\345\201\232\344\270\252\346\265\213\350\257\225\345\220\247\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\266\344\273\226/\345\206\215\346\254\241\347\231\273\344\270\212\345\255\246\347\224\237\346\227\266\344\273\243\347\232\204\344\270\252\344\272\272\345\215\232\345\256\242\357\274\214\346\263\252\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\266\344\273\226/\345\244\247\346\204\217\344\272\206\345\225\212\357\274\214\344\270\215\345\260\217\345\277\203\346\257\201\344\272\206\344\270\200\345\256\266\345\205\254\345\217\270.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\205\266\344\273\226/\345\255\246\345\211\215\347\253\257\347\232\204\346\234\213\345\217\213\345\201\232\347\232\204\344\270\252\344\272\272\345\215\232\345\256\242.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/Mac \345\222\214 Win\357\274\214\345\210\260\345\272\225\347\224\250\345\223\252\344\270\252\347\263\273\347\273\237\345\255\246\347\274\226\347\250\213\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\344\270\200\344\275\215\351\235\236\345\270\270\350\256\244\347\234\237\347\232\204\345\220\214\345\255\246\357\274\214\350\265\236\344\271\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\210\253\346\213\205\345\277\203\357\274\214\346\210\221\344\273\254\351\203\275\344\270\200\346\240\267\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\244\247\345\255\246\357\274\214\346\210\221\346\230\257\346\200\216\344\271\210\350\276\271\345\255\246\347\274\226\347\250\213\350\276\271\350\265\232\351\222\261\347\232\204\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\246\202\344\275\225\346\255\243\347\241\256\345\234\260\346\217\220\351\227\256\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\246\202\344\275\225\346\255\243\347\241\256\351\200\211\346\213\251\347\274\226\347\250\213\345\255\246\344\271\240\350\265\204\346\272\220\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\246\202\344\275\225\351\253\230\346\225\210\346\211\276\345\210\260\344\274\230\350\264\250\347\274\226\347\250\213\351\241\271\347\233\256\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\255\246\344\272\206\345\215\201\345\207\240\347\247\215\347\274\226\347\250\213\350\257\255\350\250\200\345\220\216\357\274\214\346\210\221\346\234\211\345\223\252\344\272\233\346\204\237\345\217\227\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\345\255\246\345\274\237\346\203\263\345\201\232\344\270\252\351\253\230\350\264\250\351\207\217\350\247\206\351\242\221\345\260\217\347\250\213\345\272\217.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\346\210\221\346\230\257\345\220\216\347\253\257\357\274\214\350\246\201\345\255\246\345\211\215\347\253\257\345\230\233\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\346\210\221\347\224\250\344\272\206 6 \345\271\264\357\274\214\345\221\212\350\257\211\344\275\240\346\200\216\344\271\210\345\255\246\345\245\275 Java.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\346\234\211\345\223\252\344\272\233\345\217\202\344\270\216\351\241\271\347\233\256\347\232\204\345\245\275\351\200\224\345\276\204\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\347\216\260\345\234\250\345\201\232\350\277\231\345\207\240\344\273\266\344\272\213\357\274\214\344\270\200\345\256\232\345\245\275\350\265\267\346\235\245\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\350\200\201\345\270\210\347\234\213\344\270\212\344\272\206\346\210\221\347\232\204\351\241\271\347\233\256\357\274\214\350\277\230\346\203\263\347\224\263\350\257\267\344\270\252\350\275\257\350\221\227\357\274\237\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\350\260\201\350\257\264\346\262\241\345\256\236\344\271\240\347\273\217\345\216\206\357\274\214\345\260\261\344\270\215\350\203\275\350\277\233\345\244\247\345\216\202\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\345\273\272\350\256\256/\350\277\231\346\230\257\347\224\250\346\241\206\346\236\266\347\232\204\351\200\232\347\227\205\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\346\225\205\344\272\213/\345\234\250\347\203\247\347\203\244\345\272\227\347\272\246\344\272\206\344\270\200\344\275\215\351\230\277\351\207\214\347\273\203\344\271\240\347\224\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\346\225\205\344\272\213/\345\244\247\344\270\200\345\255\246\345\274\237\347\232\204\345\257\222\345\201\207\346\200\273\347\273\223\357\274\214\344\275\251\346\234\215\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\346\225\205\344\272\213/\345\260\217\345\255\246\345\260\261\350\207\252\345\255\246\347\274\226\347\250\213\357\274\214\351\241\272\346\211\213\351\273\221\344\272\206\345\255\246\346\240\241\345\271\277\346\222\255\347\263\273\347\273\237\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\345\255\246\344\271\240\346\225\205\344\272\213/\350\277\267\350\214\253\345\233\233\345\271\264\345\220\216,\346\210\221\345\207\255\350\277\231\347\202\271\346\210\220\345\212\237\351\200\206\350\242\255!.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\345\246\202\344\275\225\347\234\213\345\276\205 \342\200\234Java \345\267\262\346\255\273\343\200\201\345\211\215\347\253\257\345\267\262\345\207\211\342\200\235 \347\255\211\350\250\200\350\256\272\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\345\255\246\347\275\221\347\253\231\345\274\200\345\217\221\350\277\230\346\230\257\346\211\223 ACM\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\346\204\237\350\247\211\350\277\233\345\244\247\345\216\202\346\234\272\344\274\232\346\270\272\350\214\253\357\274\214\350\246\201\350\200\203\347\240\224\347\273\255\345\221\275\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\350\200\203\347\240\224\350\277\230\346\230\257\345\260\261\344\270\232\357\274\237\346\210\221\345\275\223\346\227\266\344\271\237\350\266\205\347\272\240\347\273\223.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\350\201\212\350\201\212\347\274\226\347\250\213\350\257\255\350\250\200\347\232\204\351\200\211\346\213\251.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\346\226\271\345\220\221\351\200\211\346\213\251/\351\200\211 C++ \350\277\230\346\230\257 Java\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\344\270\200\344\270\252\345\245\275\347\232\204\347\274\226\347\250\213\344\271\240\346\203\257.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\345\207\240\344\270\252\345\257\271\347\250\213\345\272\217\345\221\230\347\232\204\350\257\257\350\247\243\357\274\214\345\256\263\344\272\272\344\270\215\346\265\205\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\345\210\253\344\272\272\347\234\213\346\272\220\347\240\201\357\274\214\351\202\243\346\210\221\344\271\237\350\246\201\347\234\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\345\244\247\345\244\232\346\225\260\344\272\272\344\270\215\346\263\250\346\204\217\357\274\214\350\277\231\346\240\267\345\206\231\344\273\243\347\240\201\344\274\232\346\234\211\351\227\256\351\242\230 \357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\345\255\246\347\274\226\347\250\213\357\274\214\345\210\253\344\270\272\350\277\231\344\272\213\346\265\252\350\264\271\346\227\266\351\227\264\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\255\246\344\271\240\346\214\207\345\215\227/\351\201\277\345\235\221\346\214\207\345\215\227/\345\255\246\347\274\226\347\250\213\357\274\214\345\215\203\344\270\207\345\210\253\350\203\214\344\273\243\347\240\201\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/Docsify + \344\272\221\345\274\200\345\217\221\357\274\214\351\253\230\346\225\210\345\210\233\351\200\240\344\275\240\347\232\204\346\226\207\346\241\243\347\275\221\347\253\231.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/Java \345\244\204\347\220\206\350\241\250\346\240\274\357\274\214\347\234\237\347\232\204\345\276\210\347\210\275\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/VS Code \350\277\234\347\250\213\345\274\200\345\217\221\345\256\236\346\210\230.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\344\270\200\350\265\267\346\235\245\345\201\232\344\270\252\345\205\215\347\231\273\345\275\225\350\265\204\346\272\220\345\257\274\350\210\252\345\260\217\347\250\213\345\272\217\345\220\247.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\344\272\224\345\210\206\351\222\237\357\274\214\344\275\277\347\224\250 Typora + PicGo \346\217\220\345\215\207\347\231\276\345\200\215\345\206\231\344\275\234\346\225\210\347\216\207.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\207\240\347\247\215\347\256\200\345\215\225\345\205\215\350\264\271\347\232\204\344\270\212\347\272\277\347\275\221\347\253\231\346\226\271\346\263\225.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\207\240\350\241\214\344\273\243\347\240\201\357\274\214\347\253\237\347\204\266\345\260\261\350\203\275\345\201\232\344\270\252\350\201\212\345\244\251\345\256\244\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\246\202\344\275\225\347\224\250 5 \345\210\206\351\222\237\344\270\212\347\272\277\346\226\260\347\275\221\347\253\231\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\246\202\344\275\225\347\273\231\347\237\245\345\220\215\345\274\200\346\272\220\351\241\271\347\233\256\350\264\241\347\214\256\344\273\243\347\240\201\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\256\236\346\210\230\345\274\200\345\217\221\347\261\273\345\272\223\357\274\214\346\211\213\345\206\231 Spring Boot Starter\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\256\244\345\217\213\345\216\273\345\216\225\346\211\200\347\232\204\345\212\237\345\244\253\357\274\214\346\210\221\345\206\231\344\272\206\344\270\252\350\256\241\347\256\227\345\231\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\345\260\235\351\262\234 Svelte \345\211\215\347\253\257\346\241\206\346\236\266\357\274\214\345\274\200\345\217\221\350\257\273\344\271\246\347\254\224\350\256\260.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\346\200\216\344\271\210\345\201\232\344\270\252\344\270\215\347\224\250\347\275\221\347\273\234\347\232\204\350\275\257\344\273\266\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\346\210\221\345\215\225\346\226\271\351\235\242\345\256\243\345\270\203\357\274\214\350\207\252\345\267\261\346\230\257 ChatGPT \347\250\213\345\272\217\345\221\230\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\346\210\221\347\224\250\350\277\231\344\270\252\346\212\200\346\234\257\357\274\214\345\271\262\346\216\211\345\207\240\345\215\203\350\241\214 if else\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\346\220\236\345\217\260\350\231\232\346\213\237\346\234\272\347\216\251\347\216\251\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\347\202\270\350\243\202\347\232\204 AutoGPT\357\274\214\345\270\256\346\210\221\345\201\232\344\272\206\344\270\252\347\275\221\347\253\231\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\350\205\276\350\256\257\345\205\254\346\265\213\344\272\221\345\274\200\345\217\221\344\275\216\347\240\201\357\274\201\345\205\250\347\275\221\351\246\226\347\257\207\345\256\236\346\210\230\350\257\204\346\265\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\350\256\251\344\275\240\347\232\204 GitHub \347\247\222\345\217\230\351\253\230\345\244\247\344\270\212\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\350\256\251\347\250\213\345\272\217\345\221\230\350\200\201\345\274\237\345\216\273\345\201\232 PPT\357\274\237\347\231\275\346\227\245\345\201\232\346\242\246.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\350\260\201\344\274\232\346\213\222\347\273\235\344\270\200\344\270\252\345\205\215\350\264\271\347\232\204\351\203\250\347\275\262\346\234\215\345\212\241\345\221\242\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\256\236\346\210\230\346\225\231\347\250\213/\351\255\224\346\224\271\345\222\214\344\270\212\347\272\277\344\275\240\347\232\204\345\220\210\346\210\220\345\244\247\350\245\277\347\223\234\357\274\214\346\234\200\345\205\250\346\225\231\347\250\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/1024\357\274\214\350\257\264\350\257\264\346\210\221\350\277\231\345\207\240\345\271\264\346\200\273\347\273\223\347\232\204\345\260\217\346\212\200\345\267\247\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/2\345\210\206\351\222\237\357\274\214\346\210\221\346\212\212\347\275\221\347\253\231\346\200\247\350\203\275\344\274\230\345\214\226\344\272\2063\345\200\215\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/GitHub \351\252\232\346\223\215\344\275\234.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/GitHub\350\277\2315\344\270\252\351\252\232\346\223\215\344\275\234\357\274\21499%\347\232\204\344\272\272\344\270\215\347\237\245\351\201\223\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\342\200\234\350\277\231\344\270\215\346\230\257\344\270\252\345\244\247\345\255\246\347\224\237\351\203\275\350\203\275\345\201\232\345\220\227\357\274\237\342\200\235.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\344\270\272\344\273\200\344\271\210\344\270\215\350\246\201\345\206\231 Hardcode\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\344\270\273\346\265\201\345\211\215\345\220\216\347\253\257\351\241\271\347\233\256\351\203\250\347\275\262\346\226\271\345\274\217.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\201\232\351\241\271\347\233\256\346\227\266\350\246\201\346\263\250\346\204\217\347\232\204\347\202\271.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\210\232\345\205\245\350\201\214\346\226\260\345\205\254\345\217\270\357\274\214\344\273\243\347\240\201\347\234\213\346\207\265\351\200\274\344\272\206\345\222\213\345\212\236\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\210\232\350\277\233\345\205\254\345\217\270\345\260\261\350\264\237\350\264\243\351\241\271\347\233\256\357\274\214\346\212\212\350\200\201\345\274\237\346\225\264\350\222\231\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\215\203\344\270\207\345\210\253\347\233\264\346\216\245\346\225\262\344\273\243\347\240\201\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\220\216\347\253\257\345\274\200\345\217\221\351\234\200\350\246\201\346\263\250\346\204\217\344\273\200\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\221\230\345\267\245\345\206\231\344\272\206\344\270\252\346\257\224\345\210\240\345\272\223\346\233\264\345\217\257\346\200\225\347\232\204 Bug\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\244\247\345\216\202\345\201\232\351\241\271\347\233\256\347\232\204\346\265\201\347\250\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\244\247\345\216\202\347\232\204 SDK \345\206\231\346\263\225\357\274\214\345\201\267\345\255\246\345\210\260\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\246\202\344\275\225\345\206\231\345\245\275\346\226\207\346\241\243\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\246\202\344\275\225\347\224\250 IDEA \346\217\220\345\215\207\345\274\200\345\217\221\346\225\210\347\216\207\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\246\202\344\275\225\347\273\231\347\237\245\345\220\215\345\274\200\346\272\220\351\241\271\347\233\256\350\264\241\347\214\256\344\273\243\347\240\201\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\246\202\344\275\225\350\266\205\345\211\215\345\256\214\346\210\220\345\267\245\344\275\234\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\246\202\344\275\225\351\201\277\345\205\215\351\205\215\347\275\256\346\226\207\344\273\266\344\270\255\347\232\204\345\257\206\347\240\201\350\242\253\346\263\204\351\234\262\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\255\246\344\274\232\350\277\231\346\213\233\357\274\214\344\270\200\345\244\251\345\201\232\344\270\200\344\270\252\351\241\271\347\233\256\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\345\270\270\350\247\201\347\232\204\345\206\231 Bug \345\216\237\345\233\240\346\261\207\346\200\273.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\346\217\220\351\253\230\345\267\245\344\275\234\346\225\210\347\216\207\347\232\204\347\247\230\350\257\200.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\347\250\213\345\272\217\345\221\230\347\273\230\345\233\276\345\267\245\345\205\267\345\222\214\346\212\200\345\267\247.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\347\274\226\347\250\213\345\244\247\344\275\254\346\234\211\345\223\252\344\272\233\347\211\271\347\202\271\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\350\200\201\345\255\220\345\206\231\344\270\252\344\273\243\347\240\201\350\200\214\345\267\262\357\274\214\345\207\255\344\273\200\344\271\210\350\277\230\350\246\201\346\210\221\345\206\231\346\226\207\346\241\243\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\350\247\243\345\206\263 Bug \345\245\227\350\267\257\346\200\273\347\273\223.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\350\277\230\350\203\275\350\277\231\344\271\210\345\201\232\351\234\200\346\261\202\357\274\237\344\272\247\345\223\201\347\273\217\347\220\206\351\203\275\345\220\223\345\210\260\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\350\277\267\347\232\204\344\270\200\346\211\271\357\274\214\344\270\212\347\272\277\344\272\206\346\226\260\345\212\237\350\203\275\357\274\214\350\200\201\345\212\237\350\203\275\345\260\261\345\272\237\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\351\241\271\347\233\256\345\220\257\345\212\250\345\244\261\350\264\245\357\274\237\344\270\215\347\224\250\346\205\214\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\345\274\200\345\217\221\347\273\217\351\252\214/\351\246\226\346\254\241\345\205\254\345\274\200\357\274\201\346\210\221\345\277\253\351\200\237\345\201\232\351\241\271\347\233\256\347\232\204\346\212\200\345\267\247.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\273\200\344\271\210\346\230\257 Linux\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\273\200\344\271\210\346\230\257\346\227\240\351\232\234\347\242\215\346\212\200\346\234\257\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\273\200\344\271\210\346\230\257\350\264\237\350\275\275\345\235\207\350\241\241\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\273\200\344\271\210\346\230\257\351\255\224\346\225\260\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\273\200\344\271\210\346\230\257\351\255\224\346\263\225\345\200\274\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\344\275\240\347\234\237\347\232\204\344\274\232\345\206\231\345\215\225\344\276\213\346\250\241\345\274\217\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\225\245\346\230\257\345\211\215\347\253\257 \357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\225\245\346\230\257\345\214\272\345\235\227\351\223\276\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\225\245\346\230\257\346\225\260\346\215\256\345\272\223\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\225\245\346\230\257\351\207\215\345\256\232\345\220\221\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\244\247\347\232\204\346\225\260\346\215\256\345\260\261\346\230\257\345\244\247\346\225\260\346\215\256\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\345\205\245\351\227\250\347\247\221\346\231\256/\345\260\217\347\231\275\351\203\275\350\203\275\347\234\213\346\207\202\347\232\204\347\274\223\345\255\230\345\205\245\351\227\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\270\200\345\221\250\344\270\212\347\272\277\347\231\276\344\270\207\347\272\247\351\253\230\345\271\266\345\217\221\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\270\207\344\270\207\346\262\241\346\203\263\345\210\260\357\274\214\350\277\231\351\203\275\350\203\275\345\217\221\347\216\260 Bug\357\274\237\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\270\215\346\225\242\346\203\263\357\274\214\345\201\232\344\270\252\345\215\232\345\256\242\347\253\237\345\246\202\346\255\244\347\256\200\345\215\225\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\273\216 0 \345\210\260 1\357\274\214\347\234\213\346\210\221\347\216\251\345\274\204\345\215\203\344\270\207\346\227\245\345\277\227\344\272\216\350\202\241\346\216\214.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\275\277\347\224\250 ES \344\274\230\345\214\226\347\275\221\347\253\231\346\220\234\347\264\242\344\275\223\351\252\214.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\344\275\277\347\224\250\345\206\205\347\275\221\347\251\277\351\200\217\357\274\2141 \345\210\206\351\222\237 \342\200\234\344\270\212\347\272\277\342\200\235 \346\234\254\345\234\260\347\275\221\347\253\231.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\206\231\344\272\2067\345\271\264\344\273\243\347\240\201\357\274\214\347\254\254\344\270\200\346\254\241\350\247\201\350\277\231\344\271\210\347\213\227\350\241\200\347\232\204\345\260\217Bug\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\215\203\344\270\207\345\210\253\345\274\272\345\210\266\345\201\234\346\234\272\357\274\201\346\210\221\345\230\264\351\203\275\346\260\224\346\255\252\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\244\247\345\216\202\346\234\272\345\257\206\357\274\20130 \344\270\252\346\217\220\345\215\207\345\233\242\351\230\237\347\240\224\345\217\221\346\225\210\350\203\275\347\232\204\351\224\246\345\233\212.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\246\202\344\275\225\345\216\273\351\231\244\345\255\227\347\254\246\344\270\262\344\270\255\347\232\204 n \357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\246\202\344\275\225\351\242\204\351\230\262 rm -rf \357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\345\277\253\351\200\237\351\203\250\347\275\262\345\276\256\346\234\215\345\212\241\351\241\271\347\233\256\357\274\214\344\277\235\345\247\206\347\272\247\346\225\231\347\250\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\346\210\221\347\253\237\350\242\253\350\277\231\344\270\252 Bug \345\235\221\344\272\206\344\270\200\345\221\250\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\346\211\222\344\270\252\347\237\245\345\220\215\351\241\271\347\233\256\347\232\204 Bug\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\346\217\255\347\247\230\350\275\257\344\273\266\345\274\200\345\217\221\347\232\204\350\276\276\346\221\251\345\205\213\345\210\251\346\226\257\344\271\213\345\211\221.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\346\260\224\347\202\270\357\274\201\345\217\210\344\270\200\346\254\241\350\242\253\347\274\226\350\276\221\345\231\250\345\235\221\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\347\274\226\347\250\213\345\257\274\350\210\252\357\274\214\345\207\211\345\207\211\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\200\201\345\274\237\345\201\232\344\272\206\344\270\252\347\275\221\347\233\230\357\274\214\347\202\270\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\242\253\346\224\273\345\207\273\344\272\206\357\274\201\344\272\213\345\220\216\345\210\206\346\236\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\256\260\344\270\200\346\254\241\345\211\215\347\253\257\351\225\277\346\225\264\346\225\260\347\262\276\345\272\246\344\270\242\345\244\261\351\227\256\351\242\230.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\266\212\350\207\252\344\277\241\357\274\214Bug \350\266\212\345\244\232.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\277\231\344\270\252Bug\357\274\214\347\273\231\346\210\221\346\225\264\345\276\227\344\270\200\346\204\243\344\270\200\346\204\243\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\345\256\236\350\267\265/\350\277\231\344\272\233\344\273\243\347\240\201\357\274\214\345\267\256\347\202\271\346\212\212\346\210\221\346\260\224\345\207\272\345\206\205\344\274\244.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/00 \345\220\216\346\236\266\346\236\204\345\270\210\357\274\214\351\202\243\345\217\257\350\203\275\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/B \347\253\231\345\264\251\347\233\230\344\272\213\346\225\205\345\210\206\346\236\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\344\270\212\347\272\277\347\275\221\347\253\231\357\274\214\350\260\250\346\205\216\344\275\277\347\224\250\346\214\211\351\207\217\350\256\241\350\264\271\346\234\215\345\212\241\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\345\211\215\345\220\216\347\253\257\345\210\206\347\246\273\357\274\214\345\215\203\344\270\207\345\210\253\345\206\215\346\220\236\351\224\231\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\345\217\215\345\220\221\345\216\213\345\212\233.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\345\225\245\346\230\257\347\203\255\346\225\260\346\215\256\346\216\242\346\265\213\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\345\244\232\347\216\257\345\242\203.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\346\210\221\344\273\254\345\255\246\345\271\266\345\217\221\346\227\266\357\274\214\345\210\260\345\272\225\345\234\250\345\255\246\344\273\200\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\346\211\213\345\206\231 OJ \347\263\273\347\273\237\357\274\214\347\234\237\347\232\204\345\276\210\351\232\276\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\346\220\234\347\264\242\345\274\225\346\223\216\345\267\245\344\275\234\345\216\237\347\220\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\212\200\346\234\257\345\210\206\344\272\253/\346\212\200\346\234\257\347\237\245\350\257\206/\351\231\244\344\272\206 MySQL\357\274\214\350\277\231\344\272\233\346\225\260\346\215\256\345\272\223\344\275\240\351\203\275\350\256\244\350\257\206\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\345\256\236\344\271\240/\345\255\227\350\212\202\345\256\236\344\271\240\350\275\254\346\255\243\344\272\206\357\274\214\350\277\231\346\230\257\346\210\221\347\232\204\347\247\230\350\257\200.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\345\256\236\344\271\240/\345\256\236\344\271\240\345\244\251\345\244\251crud\357\274\214\345\276\210\350\277\267\350\214\253....md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\345\256\236\344\271\240/\345\256\236\344\271\240\347\233\270\345\205\263\351\227\256\351\242\230.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\345\256\236\344\271\240/\346\203\263\346\227\267\350\257\276\345\216\273\345\217\202\345\212\240\345\256\236\344\271\240\344\272\206\343\200\202\343\200\202.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\345\256\236\344\271\240/\350\260\201\350\257\264\346\262\241\345\256\236\344\271\240\347\273\217\345\216\206\357\274\214\345\260\261\344\270\215\350\203\275\350\277\233\345\244\247\345\216\202\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\344\270\215\350\246\201\346\205\214\357\274\214\346\210\221\346\234\211\345\207\240\344\270\252\345\260\217\345\273\272\350\256\256\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\344\273\216\345\260\217\345\205\254\345\217\270\345\210\260\345\244\247\345\216\202\357\274\214\351\207\215\347\202\271\351\203\275\350\200\203\344\273\200\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\345\210\232\350\200\203\345\256\214\347\240\224\357\274\214\346\200\216\344\271\210\345\216\273\345\207\206\345\244\207\346\230\245\346\213\233\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\347\273\231\345\255\246\345\274\237\345\207\240\344\270\252\346\211\276\345\267\245\344\275\234\347\232\204\351\207\215\350\246\201\344\277\241\346\201\257.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\347\273\231\345\255\246\345\274\237\345\246\271\344\273\254\347\232\204\347\247\213\346\213\233\345\273\272\350\256\256\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\350\200\203\347\240\224\347\273\223\346\235\237\357\274\214\346\212\223\347\264\247\345\201\232\350\277\231\344\273\266\344\272\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\350\257\264\350\257\264\346\210\221\346\234\200\350\277\221\346\213\233\344\272\272\347\232\204\346\204\237\345\217\227.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\345\273\272\350\256\256/\350\257\264\350\257\264\346\210\221\346\234\200\350\277\221\347\255\233\347\256\200\345\216\206\345\222\214\351\235\242\350\257\225\347\232\204\346\204\237\345\217\227.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\346\225\205\344\272\213/\346\210\221\350\242\253\351\235\242\350\257\225\345\256\230 \342\200\234\350\200\215\342\200\235 \344\272\206\344\271\210\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\346\225\205\344\272\213/\346\237\220\344\275\215\351\261\274\345\217\213\347\232\204\346\230\245\346\213\233\344\270\212\345\262\270\344\271\213\350\267\257.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\346\261\202\350\201\214\346\225\205\344\272\213/\347\273\231\345\244\247\345\256\266\351\274\223\351\274\223\345\212\262\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\345\205\263\344\272\216\347\256\200\345\216\206\351\200\240\345\201\207\357\274\214\345\217\252\350\203\275\350\257\264\345\244\252 \342\200\234\345\213\207\342\200\235 \344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\345\206\205\346\216\250\345\255\246\345\274\237\350\277\233\344\272\206\350\205\276\350\256\257\357\274\214\347\234\213\347\234\213\344\273\226\347\232\204\346\240\207\346\235\206\347\256\200\345\216\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\345\270\256\345\244\247\344\272\214\345\210\233\344\270\232\347\232\204\345\255\246\345\274\237\344\274\230\345\214\226\347\256\200\345\216\206\357\274\214\345\210\206\344\272\253\347\273\217\351\252\214.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\345\270\256\346\224\271\347\256\200\345\216\206\357\274\214\345\217\221\347\216\260\344\272\206\344\270\200\344\272\233 \342\200\234\351\200\232\347\227\205\342\200\235.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\347\256\200\345\216\206\351\241\271\347\233\256\351\200\240\345\201\207\357\274\214\350\242\253\345\217\221\347\216\260\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\347\256\200\345\216\206\346\212\200\345\267\247/\350\207\252\346\210\221\344\273\213\347\273\215\357\274\214\345\215\203\344\270\207\345\210\253\346\235\245\350\231\232\347\232\204\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\347\273\217/\344\273\216\345\256\266\351\207\214\345\210\260\351\230\277\351\207\214\357\274\214\345\255\246\345\274\237\350\266\205\347\245\236\347\232\204\344\270\200\345\271\264.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\347\273\217/\345\217\214\351\235\236\351\235\236\347\247\221\347\217\255\357\274\214\344\270\200\345\271\264\351\200\206\350\242\255\347\231\276\345\272\246\357\274\201\345\256\214\346\225\264\351\235\242\347\273\217.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\347\273\217/\345\244\247\344\272\214\345\255\246\345\274\237\345\210\232\351\235\242\345\256\214\345\255\227\350\212\202\357\274\214\347\203\255\344\271\216\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\347\273\217/\347\233\264\347\263\273\345\255\246\345\274\237\350\277\233\345\215\216\344\270\272\345\225\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\350\257\225\351\242\230/\350\205\276\350\256\257\344\272\214\351\235\242\357\274\214\346\210\221\350\242\253 \342\200\234\350\265\233\351\251\254\342\200\235 \351\227\256\351\242\230\351\232\276\344\275\217\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\346\261\202\350\201\214\347\273\217\351\252\214/\351\235\242\350\257\225\351\242\230/\351\200\201\350\200\201\345\274\237\345\216\273\345\244\247\345\216\202\351\235\242\350\257\225\357\274\214\345\220\216\347\253\257\350\200\203\347\202\271\345\210\206\344\272\253.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/Gitee \345\276\210\346\227\240\345\245\210\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/IE \344\273\212\345\244\251\346\255\243\345\274\217\345\201\234\347\224\250\357\274\201\347\275\221\345\217\213\347\202\270\351\224\205\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/Log4j\357\274\214\347\202\270\344\272\206\357\274\201\357\274\201\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/Spring Boot \350\210\271\346\226\260\347\211\210\346\234\254\357\274\237\346\210\221\345\215\264\345\276\210\345\244\261\346\234\233.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\346\201\220\346\200\226\347\232\204 GPT4\357\274\201\346\210\221\344\271\237\345\205\245\345\261\200\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\346\210\221\345\210\232\344\271\260\344\272\206\346\260\270\344\271\205\344\274\232\345\221\230\357\274\214\344\275\240\345\260\261\344\270\213\347\272\277\344\272\206\357\274\237\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\346\210\221\345\222\214 AI \347\232\204\346\225\205\344\272\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\346\221\224\345\210\260\350\200\201\344\270\211\347\232\204 Java\357\274\214\346\234\252\346\235\245\345\234\250\345\223\252\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\346\227\240\350\257\255\357\274\214\345\217\210\344\270\200\344\270\252\347\237\245\345\220\215\351\241\271\347\233\256\346\224\266\350\264\271\344\272\206\343\200\202\343\200\202\343\200\202\345\267\262\345\215\270\350\275\275.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\347\231\276\345\272\246\347\273\210\344\272\216\350\246\201\345\207\272\346\211\213\344\272\206\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\347\234\213\344\272\206\345\215\216\344\270\272\351\270\277\350\222\231\345\217\221\345\270\203\344\274\232\357\274\214\346\263\274\347\233\206\345\206\267\346\260\264.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\347\246\273\350\260\261\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\347\252\201\345\217\221\357\274\201Gitee \345\233\276\345\272\212\357\274\214\345\272\237\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\350\205\276\350\256\257\357\274\2141000 \344\272\277\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\212\200\350\265\204\350\256\257/\350\245\277\345\256\211\345\201\245\345\272\267\347\240\201\345\217\210\345\264\251\344\272\206\357\274\201\351\232\217\344\276\277\350\201\212\350\201\212.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\231\256/\347\251\277\350\203\214\345\277\203\347\232\204\350\200\201\351\231\242\345\243\253\357\274\21486\345\262\201\357\274\214\351\207\215\347\227\205\357\274\214\350\277\230\345\234\250\346\225\262\344\273\243\347\240\201\357\274\214\345\215\225\346\211\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\247\221\346\212\200\347\247\221\346\231\256/\347\247\221\346\231\256/\350\256\241\347\256\227\346\234\272\345\245\263\347\245\236\357\274\214\344\272\222\350\201\224\347\275\221\347\254\254\344\270\200\345\244\253\344\272\272.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\205\266\344\273\226/B \347\253\231 UP \344\270\273\346\216\250\350\215\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\205\266\344\273\226/\345\207\240\344\270\252\344\273\212\345\271\264\350\266\205\347\201\253\347\232\204\347\274\226\347\250\213\347\275\221\347\253\231\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\205\266\344\273\226/\350\277\231\344\272\233\347\275\221\347\253\231\357\274\214\351\231\252\346\210\221\350\277\207\344\272\206 5 \345\271\264.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/10\344\270\252\345\256\235\350\227\217\347\272\247\347\274\226\347\250\213\350\265\204\346\272\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/Java \346\226\207\346\241\243\346\225\231\347\250\213\345\244\247\346\261\207\346\200\273.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/Java \346\272\220\347\240\201\346\225\231\347\250\213\351\241\271\347\233\256\345\244\247\346\261\207\346\200\273.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/Java \347\237\245\350\257\206\346\200\273\347\273\223\351\241\271\347\233\256\345\244\247\346\261\207\346\200\273.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\345\210\206\344\272\253\344\270\200\345\245\227\344\277\235\345\247\206\347\272\247 Java \346\225\231\347\250\213.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\345\210\267\347\256\227\346\263\225\347\232\204\350\265\204\346\272\220\345\210\206\344\272\253.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\345\270\256\344\275\240\345\255\246\350\213\261\350\257\255\347\232\204\351\241\271\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\345\277\253\351\200\237\345\217\221\347\216\260\344\274\230\347\247\200\345\274\200\346\272\220\351\241\271\347\233\256\347\232\204\344\270\211\346\235\277\346\226\247.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\346\261\207\346\200\273\344\270\200\346\263\242\345\205\215\350\264\271 Python \350\265\204\346\272\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\347\250\213\345\272\217\345\221\230\345\246\202\344\275\225\350\265\232\351\222\261\347\232\204\345\260\217\344\271\246.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\255\246\344\271\240\350\265\204\346\272\220/\347\274\226\347\250\213\345\257\274\350\210\252\345\205\215\350\264\271\345\255\246\344\271\240\350\265\204\346\272\220\346\261\207\346\200\273.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/3\345\210\206\351\222\237\357\274\214\347\273\231\345\245\263\346\234\213\345\217\213\345\201\232\344\270\252\344\272\221\347\254\224\350\256\260\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/Java \347\210\254\350\231\253\345\272\223\346\216\250\350\215\220.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\344\270\200\344\270\252\345\205\215\350\264\271\343\200\201\344\270\215\346\200\225\346\211\223\347\232\204\350\257\204\350\256\272\346\217\222\344\273\266\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\344\270\200\344\270\252\345\216\211\345\256\263\347\232\204\345\260\217\345\267\245\345\205\267\357\274\214\345\260\217\351\273\221\345\255\220\351\203\275\345\234\250\347\224\250\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\344\270\200\351\224\256\345\257\271\346\257\224 30 \347\247\215\347\274\226\347\250\213\350\257\255\350\250\200\347\232\204\345\267\245\345\205\267.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\344\270\200\351\224\256\347\224\237\346\210\220\345\207\240\345\215\203\345\245\227\344\273\243\347\240\201\346\250\241\346\235\277\347\232\204\345\211\215\347\253\257\347\245\236\345\231\250.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\345\205\215\350\264\271\345\245\275\347\224\250\347\232\204\345\206\205\347\275\221\347\251\277\351\200\217\345\267\245\345\205\267.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\345\210\206\344\272\253\345\207\240\344\270\252\345\245\275\347\224\250\345\205\215\350\264\271\347\232\204\345\233\276\345\272\212.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\345\276\256\344\277\241\345\217\221\345\212\233\344\272\206\357\274\214\344\270\200\351\224\256\351\203\250\347\275\262\347\275\221\347\253\231\345\220\216\347\253\257\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\346\210\221\345\206\231\344\273\243\347\240\201\347\232\204\345\215\201\345\205\253\350\210\254\345\205\265\345\231\250\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\346\210\221\345\267\245\344\275\234\344\270\255\344\270\215\345\217\257\346\210\226\347\274\272\347\232\204\345\256\235\350\264\235\344\273\254.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\346\212\261\346\255\211\357\274\214\346\210\221\344\270\215\347\224\250\345\210\253\347\232\204\346\265\213\350\257\225\345\267\245\345\205\267\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\347\224\250\344\272\206\350\277\231\344\270\252 Java \345\260\217\345\267\245\345\205\267\357\274\214\346\210\221\345\272\237\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\345\274\200\345\217\221\345\267\245\345\205\267/\347\262\276\345\223\201 IDEA \346\217\222\344\273\266\345\244\247\346\261\207\346\200\273\357\274\201\345\200\274\345\276\227\346\224\266\350\227\217.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/N \345\271\264\346\262\211\346\267\200\357\274\214\350\205\276\350\256\257\350\277\231\345\245\227\347\263\273\347\273\237\347\273\210\344\272\216\345\274\200\346\272\220\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\345\207\240\344\270\252\345\205\215\350\264\271\347\232\204\345\257\214\346\226\207\346\234\254\347\274\226\350\276\221\345\231\250\357\274\214\350\277\231\344\270\215\345\256\214\350\203\234\344\273\230\350\264\271\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\345\211\215\347\253\257\347\246\217\351\237\263\357\274\214\350\232\202\350\232\201\351\207\221\346\234\215 Ant Design \347\224\237\346\200\201\344\270\200\350\247\210.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\345\217\210\347\201\253\344\270\200\344\270\252\345\211\215\347\253\257\351\241\271\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\345\255\227\350\212\202\345\211\215\347\253\257\347\273\210\344\272\216\345\274\200\346\272\220\357\274\201\345\220\271\347\210\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\345\276\210\345\244\232\347\275\221\347\253\231\357\274\214\346\240\271\346\234\254\344\270\215\347\224\250\350\207\252\345\267\261\345\201\232\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\347\224\250 Git \346\223\215\344\275\234\347\232\204\346\225\260\346\215\256\345\272\223\357\274\237\350\277\231\344\270\252\351\241\271\347\233\256\347\201\253\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\350\205\276\350\256\257\347\232\204\345\206\205\351\203\250\345\210\206\344\272\253\357\274\214\345\244\247\350\265\236\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\347\274\226\347\250\213\350\265\204\346\272\220/\351\241\271\347\233\256\346\216\250\350\215\220/\350\277\231 10 \344\270\252\345\210\233\346\204\217\351\241\271\347\233\256\357\274\214\345\244\252\351\241\266\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\350\201\214\345\234\272\347\273\217\351\252\214/23 \345\262\201\357\274\214\346\210\221\346\213\205\345\277\203\344\270\255\345\271\264\345\215\261\346\234\272.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\350\201\214\345\234\272\347\273\217\351\252\214/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\350\201\214\345\234\272\347\273\217\351\252\214/\345\205\245\350\201\214\347\254\254\344\270\200\345\244\251\357\274\214\346\203\263\350\267\221\350\267\257\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\350\201\214\345\234\272\347\273\217\351\252\214/\345\234\250\350\275\246\344\270\212\345\201\266\351\201\207\344\270\200\344\275\215\351\230\277\351\207\214\345\244\247\344\275\254\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\350\201\214\345\234\272\347\273\217\351\252\214/\345\267\245\344\275\234\344\270\200\345\271\264\357\274\214\345\244\251\345\244\251 CRUD\343\200\202\343\200\202.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/README.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - API \345\274\200\346\224\276\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - OJ \345\210\244\351\242\230\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - \344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - \346\231\272\350\203\275 BI \345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - \347\224\250\346\210\267\344\270\255\345\277\203\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256 - \350\201\232\345\220\210\346\220\234\347\264\242\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\344\277\235\345\247\206\347\272\247\345\256\236\346\210\230\351\241\271\347\233\256\346\225\231\347\250\213/\345\256\236\346\210\230\351\241\271\347\233\256\344\273\243\347\240\201\345\274\200\346\272\220\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\351\241\271\347\233\256\345\257\274\345\255\246/\351\241\271\347\233\256\345\257\274\345\255\246 - \345\260\232\345\214\273\351\200\232.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\351\241\271\347\233\256\345\257\274\345\255\246/\351\241\271\347\233\256\345\257\274\345\255\246 - \347\221\236\345\220\211\345\244\226\345\215\226.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\351\241\271\347\233\256\345\257\274\345\255\246/\351\241\271\347\233\256\345\257\274\345\255\246 - \347\241\205\350\260\267\350\257\276\345\240\202.md" create mode 100644 "\347\274\226\347\250\213\345\210\206\344\272\253/\351\241\271\347\233\256\346\225\231\347\250\213/\351\241\271\347\233\256\345\257\274\345\255\246/\351\241\271\347\233\256\345\257\274\345\255\246 - \351\273\221\351\251\254\347\202\271\350\257\204.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/README.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\345\205\263\344\272\216\346\210\221\344\273\254/README.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\345\205\263\344\272\216\346\210\221\344\273\254/\344\270\252\344\272\272\347\273\217\345\216\206.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\345\205\263\344\272\216\346\210\221\344\273\254/\346\230\237\344\270\273\344\273\213\347\273\215.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\345\212\240\345\205\245\347\274\226\347\250\213\345\257\274\350\210\252.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\345\271\264\345\272\246\346\200\273\347\273\223.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/README.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\344\270\212\345\262\270\345\215\216\344\270\272\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\344\273\216\345\244\261\350\264\245\345\210\260\351\200\206\350\242\255\357\274\214\346\210\221\345\256\214\346\210\220\344\272\206\347\233\256\346\240\207\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\344\273\216\346\221\206\347\203\202\345\210\260\351\200\206\350\242\255\357\274\214\345\244\247\344\272\214\345\216\273\350\224\232\346\235\245\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\344\273\216\350\272\272\345\271\263\345\210\260\344\270\212\345\262\270\357\274\214\346\210\221\345\216\273\344\272\206\347\220\206\346\203\263\347\232\204\345\244\247\345\255\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\244\247\344\270\211\346\221\206\347\203\202\345\210\260\346\261\202\350\201\214\344\270\212\345\262\270\357\274\214\345\212\252\345\212\233\344\273\216\346\235\245\344\270\215\346\231\232\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\244\247\345\216\202\345\267\245\344\275\234\344\270\200\345\271\264\345\215\212\357\274\214\346\210\221\346\234\211\350\257\235\350\257\264\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\255\227\350\212\202\345\256\236\344\271\240\350\275\254\346\255\243\344\272\206\357\274\214\350\277\231\346\230\257\346\210\221\347\232\204\347\247\230\350\257\200.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\255\246\345\274\237\346\211\276\346\210\221\346\235\245\346\212\245\345\226\234\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\255\246\345\274\237\350\277\233\345\260\217\347\261\263\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\345\256\266\351\207\214\350\271\262\345\215\212\345\271\264\357\274\214\346\210\221\347\273\210\344\272\216\344\270\212\345\262\270\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\346\210\221\345\201\232\344\272\206\350\277\231\344\272\233\344\272\213\357\274\214\344\277\235\347\240\224\344\270\212\345\262\270985\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\346\210\221\347\232\204\347\233\256\346\240\207\345\256\214\346\210\220\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\346\230\245\346\213\233\344\270\212\345\262\270\345\225\246\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\347\247\213\346\213\233\344\270\212\345\262\270\351\230\277\351\207\214\357\274\214\350\277\231\346\230\257\346\210\221\347\232\204\347\247\230\350\257\200\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\351\235\236\347\247\221\347\217\255\347\232\204\346\210\221\357\274\214\344\271\237\350\277\233\344\272\206\345\244\247\345\216\202\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\344\270\212\345\262\270\345\210\206\344\272\253/\351\235\236\347\247\221\347\217\255\350\275\254\347\240\201\357\274\214\347\247\213\346\213\233\344\270\212\345\262\270\345\255\227\350\212\202\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/2022\357\274\214\346\210\221\345\255\246\344\274\232\344\272\206\350\277\231\344\272\233\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\344\273\216\346\221\206\347\203\202\345\210\260\350\247\211\351\206\222\357\274\214\346\242\246\346\203\263\350\277\233\345\244\247\345\216\202\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\345\201\232\344\272\206\345\276\210\345\244\232\351\241\271\347\233\256\357\274\214\350\257\264\350\257\264\346\210\221\347\232\204\346\204\237\345\217\227.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\345\255\246\345\274\237\350\277\231\346\240\267\345\255\246\357\274\214\347\250\263\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\346\210\221\344\273\212\345\271\264\346\234\200\345\244\247\347\232\204\346\224\271\345\217\230.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\346\210\221\346\234\200\345\212\261\345\277\227\343\200\201\346\234\200\350\207\252\345\276\213\347\232\204\344\270\200\345\271\264.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\345\255\246\344\271\240\346\200\273\347\273\223/\346\210\221\350\277\231\346\240\267\345\207\206\345\244\207\350\223\235\346\241\245\346\235\257\357\274\214\346\213\277\345\233\275\345\245\226\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\344\270\200\350\265\267\350\256\250\350\256\272\346\235\203\351\231\220\347\256\241\347\220\206\351\234\200\346\261\202.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\200\216\344\271\210\345\201\232\344\270\252\344\270\215\347\224\250\347\275\221\347\273\234\347\232\204\350\275\257\344\273\266\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\210\221\346\273\264\351\241\271\347\233\256\345\256\214\346\210\220\345\225\246\357\274\201\357\274\201\357\274\201\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\210\221\347\232\204\351\241\271\347\233\256\345\256\214\346\210\220\345\225\246\357\274\201\357\274\201\357\274\201\347\224\250\346\210\267\344\270\255\345\277\203.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\226\260\351\241\271\347\233\256\346\220\236\345\256\214\345\225\246\357\274\201\357\274\201\357\274\201API\345\274\200\346\224\276\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\226\260\351\241\271\347\233\256\346\220\236\345\256\214\345\225\246\357\274\201\357\274\201\357\274\201\345\234\250\347\272\277\345\210\244\351\242\230\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\226\260\351\241\271\347\233\256\346\220\236\345\256\214\345\225\246\357\274\201\357\274\201\357\274\201\346\231\272\350\203\275 BI \345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\346\226\260\351\241\271\347\233\256\346\220\236\345\256\214\345\225\246\357\274\201\357\274\201\357\274\201\350\201\232\345\220\210\346\220\234\347\264\242\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\230\237\344\270\273\345\210\206\344\272\253/\351\261\274\347\232\256\357\274\214\344\275\240\345\244\252\347\273\206\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\261\202\350\201\214\351\235\242\347\273\217/\345\210\232\351\235\242\345\256\214\345\255\227\350\212\202\350\267\263\345\212\250\357\274\214\344\274\260\350\256\241\345\207\211\344\272\206.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\261\202\350\201\214\351\235\242\347\273\217/\345\244\247\344\272\214\345\255\246\345\274\237\345\210\232\351\235\242\345\256\214\345\255\227\350\212\202\357\274\214\347\203\255\344\271\216\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\261\202\350\201\214\351\235\242\347\273\217/\345\270\256\346\224\271\347\256\200\345\216\206\357\274\214\345\217\221\347\216\260\344\272\206\344\270\200\344\272\233\351\200\232\347\227\205\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\346\261\202\350\201\214\351\235\242\347\273\217/\346\203\263\346\227\267\350\257\276\345\216\273\345\217\202\345\212\240\345\256\236\344\271\240\344\272\206\343\200\202\343\200\202.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\270\200\344\270\252\344\272\272\350\265\260\345\276\227\345\276\210\345\277\253\357\274\214\344\270\200\347\276\244\344\272\272\350\265\260\345\276\227\346\233\264\350\277\234.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\273\216\346\211\223\350\236\272\344\270\235\345\210\260\345\206\231\344\273\243\347\240\201\357\274\214\346\210\221\347\232\204\344\272\272\347\224\237\350\275\254\346\212\230\347\202\271\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\273\216\346\220\254\347\240\226\345\210\260\346\265\213\345\274\200\357\274\214\346\210\221\347\232\204\350\275\254\347\240\201\347\273\217\345\216\206.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\273\216\347\204\212\346\235\277\345\255\220\345\210\260\346\225\262\344\273\243\347\240\201\357\274\214\346\210\221\347\232\204\344\272\272\347\224\237\350\275\254\346\212\230\347\202\271\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\273\216\350\277\267\350\214\253\345\210\260\351\206\222\346\202\237\357\274\214\346\210\221\346\230\216\347\241\256\344\272\206\346\210\221\347\232\204\347\233\256\346\240\207\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\344\273\216\351\242\223\345\272\237\345\210\260\345\212\252\345\212\233\357\274\214\350\277\231\346\230\257\346\210\221\347\232\204\346\225\205\344\272\213.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\205\250\346\240\210\345\210\235\344\270\255\347\224\237\357\274\214\347\211\233\347\232\256\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\210\233\344\270\232\345\244\261\350\264\245\357\274\214\344\270\213\345\256\232\345\206\263\345\277\203\345\255\246\347\274\226\347\250\213\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\210\253\344\272\272\350\246\201\347\234\213\346\272\220\347\240\201\357\274\214\351\202\243\346\210\221\344\271\237\350\246\201\347\234\213.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\244\247\344\270\200\345\255\246\345\274\237\347\232\204\345\257\222\345\201\207\346\200\273\347\273\223.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\244\247\344\270\200\345\255\246\345\274\237\357\274\214\347\234\237\347\232\204\345\276\210\345\212\252\345\212\233\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\244\247\344\270\200\357\274\214\346\210\221\346\203\263\346\211\276\345\256\236\344\271\240\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\260\217\345\255\246\345\260\261\345\274\200\345\247\213\345\255\246\347\274\226\347\250\213\344\272\206\357\274\214\346\201\220\346\200\226\345\246\202\346\226\257\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\260\217\345\255\246\345\260\261\350\207\252\345\255\246\347\274\226\347\250\213\357\274\214\350\277\230\351\273\221\344\272\206\345\255\246\346\240\241\347\232\204\345\271\277\346\222\255\347\263\273\347\273\237\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\345\274\200\345\247\213\350\256\244\347\234\237\344\272\206\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\350\277\267\350\214\253\345\233\233\345\271\264\345\220\216\357\274\214\346\210\221\345\207\255\350\277\231\347\202\271\346\210\220\345\212\237\351\200\206\350\242\255\357\274\201.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\347\220\203\345\217\213\347\273\217\345\216\206/\351\203\275\350\277\231\344\270\252\347\202\271\345\204\277\344\272\206\357\274\214\350\277\231\345\270\256\344\272\272\347\253\237\347\204\266\345\234\250\343\200\202\343\200\202\343\200\202.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\351\227\256\351\242\230\350\247\243\346\203\221/\345\210\232\345\205\245\350\201\214\346\226\260\345\205\254\345\217\270\357\274\214\344\273\243\347\240\201\347\234\213\344\270\215\346\207\202\345\222\213\345\212\236\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\346\225\205\344\272\213/\351\227\256\351\242\230\350\247\243\346\203\221/\350\200\203\347\240\224\350\277\230\346\230\257\345\260\261\344\270\232\357\274\237\347\273\217\345\205\270\351\227\256\351\242\230.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\347\233\264\346\222\255/README.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\347\233\264\346\222\255/\344\270\215\345\260\261\351\203\250\347\275\262\344\270\252\347\275\221\347\253\231\344\271\210\357\274\237\350\277\230\350\203\275\347\216\251\345\207\272\350\212\261\346\235\245\357\274\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\347\233\264\346\222\255/\345\230\211\345\256\276\345\210\206\344\272\253.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\347\233\264\346\222\255/\345\276\200\346\234\237\347\233\264\346\222\255.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\347\233\264\346\222\255/\347\273\231\345\244\247\345\255\246\347\232\204\345\274\237\345\246\271\344\273\254\345\201\232\344\272\206\344\270\200\345\234\272\350\256\262\345\272\247.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\350\265\204\346\226\231/\344\270\223\345\261\236\344\272\244\346\265\201\347\276\244.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\350\265\204\346\226\231/\344\270\223\345\261\236\345\255\246\344\271\240\350\267\257\347\272\277.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\350\265\204\346\226\231/\345\255\246\344\271\240\350\265\204\346\272\220.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\350\265\204\346\226\231/\351\261\274\347\232\256\347\232\204\345\255\246\344\271\240\347\254\224\350\256\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\350\265\204\346\226\231/\351\261\274\347\232\256\347\232\204\346\211\223\345\267\245\346\227\245\350\256\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/API\345\274\200\346\224\276\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/Java \345\220\216\347\253\257\344\270\207\347\224\250\351\241\271\347\233\256\346\250\241\346\235\277.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/OJ \345\234\250\347\272\277\345\210\244\351\242\230\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/SQL \347\224\237\346\210\220\345\231\250\351\241\271\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/Web \347\273\210\347\253\257\351\241\271\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\345\267\245\344\275\234\350\256\260\345\275\225\345\210\206\346\236\220\345\267\245\345\205\267.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\346\231\272\350\203\275 BI \345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\347\224\250\346\210\267\344\270\255\345\277\203\351\241\271\347\233\256.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\347\274\226\347\250\213\345\257\274\350\210\252\345\245\226\345\212\261\347\263\273\347\273\237.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\350\201\232\345\220\210\346\220\234\347\264\242\345\271\263\345\217\260.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\346\230\237\347\220\203\351\241\271\347\233\256/\351\241\271\347\233\256\350\256\255\347\273\203\350\220\245.md" create mode 100644 "\347\274\226\347\250\213\345\257\274\350\210\252/\347\234\237\345\256\236\350\257\204\344\273\267/README.md" create mode 100644 "\347\274\226\347\250\213\350\257\215\345\205\270/README.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/README.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\345\205\254\345\217\270\345\244\252\347\250\263\345\256\232\344\272\206\357\274\201\346\210\221\345\245\275\346\205\214.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\345\210\233\344\270\232\344\270\200\346\234\210\345\215\212\357\274\214\344\270\215\345\244\252\344\271\240\346\203\257\343\200\202\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\346\210\221\344\273\254\345\205\254\345\217\270\347\232\204\344\274\201\344\270\232\346\226\207\345\214\226\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\346\210\221\344\273\254\345\205\254\345\217\270\347\232\204\346\213\233\344\272\272\346\226\271\345\274\217\357\274\214\346\234\211\347\202\271\344\270\215\344\270\200\346\240\267\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\346\210\221\345\234\250\351\261\274\345\216\202\347\232\204\345\256\236\344\271\240\347\224\237\346\264\273.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\346\210\221\345\274\200\344\270\232\344\272\206\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\346\262\241\344\272\213\345\210\253\346\203\263\344\270\215\345\274\200\345\216\273\345\210\233\344\270\232\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\347\276\216\345\245\275\347\232\204\345\221\250\346\234\253\357\274\214\345\217\210\346\224\271\344\272\206\344\270\200\345\244\251Bug\343\200\202\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\270\232\347\273\217\345\216\206/\351\235\242\344\272\206\344\270\252Java\345\256\236\344\271\240\347\224\237\357\274\214\345\260\217\344\274\231\345\276\210\344\274\230\347\247\200\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/10w\347\262\211\344\270\235\357\274\214\346\210\221\345\215\264\345\223\255\344\272\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\342\200\234\350\200\201\345\270\210\357\274\214\346\210\221\350\260\242\350\260\242\344\275\240\357\274\201\342\200\235.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\344\270\200\346\254\241\345\276\210\346\204\217\345\244\226\347\232\204\347\275\221\347\253\231\346\225\205\351\232\234\347\273\217\345\216\206\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\344\270\200\346\254\241\351\235\242\345\220\221UP\344\270\273\347\232\204\345\233\242\345\273\272.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\344\272\214\345\215\201\345\233\233.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\344\273\212\345\244\251\357\274\214\346\210\221\350\246\201\346\220\236\344\273\266\345\244\247\344\272\213\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\345\270\256\351\230\277\351\207\214\344\272\221\346\213\211\346\226\2607000\344\272\272\357\274\214\346\210\221\350\276\223\347\232\204\345\276\210\345\275\273\345\272\225\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\346\210\221\344\271\237\346\213\245\346\234\211\344\272\20610\344\270\207\347\262\211\344\270\235.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\346\210\221\344\273\254\346\220\236\344\272\206\344\273\266\345\244\247\344\272\213\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\346\210\221\350\242\253\346\234\200\346\201\250\347\232\204\345\205\254\345\217\270\351\207\207\350\256\277\344\272\206\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\346\235\245\344\272\206\346\235\245\344\272\206\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\346\257\225\344\270\232\350\277\231\345\271\264\357\274\214\346\210\221\346\210\220\344\270\272\344\272\206\344\270\200\345\220\215UP\344\270\273.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\347\275\221\347\253\231\345\217\210\350\242\253\346\224\273\345\207\273\357\274\214\346\210\221\345\277\203\346\200\201\345\264\251\344\272\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\210\233\344\275\234\347\273\217\345\216\206/\351\261\274\347\232\256\345\267\245\344\275\234+\345\210\233\344\275\234\347\232\204\346\227\245\345\270\270\347\224\237\346\264\273.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\344\273\216\345\244\247\345\255\246\345\210\260\347\247\213\346\213\233\357\274\214\346\210\221\345\246\202\344\275\225\346\213\277\344\270\213\350\205\276\350\256\257offer.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\345\244\247\345\255\246\357\274\214\346\210\221\346\230\257\346\200\216\344\271\210\350\276\271\345\255\246\347\274\226\347\250\213\350\276\271\350\265\232\351\222\261\347\232\204\357\274\237.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\346\210\221\345\244\247\344\270\211\346\227\266\345\201\232\347\232\204\347\276\236\350\200\273\351\241\271\347\233\256\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\346\210\221\345\255\246\350\256\241\347\256\227\346\234\272\347\232\204\345\233\233\345\271\264\357\274\214\345\205\261\345\213\211\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\351\261\274\347\232\256\345\234\250\345\256\236\351\252\214\345\256\244\345\207\272\347\211\210\346\225\231\346\235\220\347\232\204\347\273\217\345\216\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\351\261\274\347\232\256\347\232\204\346\257\225\344\270\232\346\204\237\345\217\227.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\351\261\274\347\232\256\347\232\204\346\257\225\344\270\232\350\256\276\350\256\241\357\274\214\346\227\266\351\232\224\344\270\200\345\271\264\357\274\214\344\273\215\346\204\237\350\247\211\345\244\264\347\247\203.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\351\261\274\347\232\256\347\232\204\350\200\203\350\257\201\347\273\217\345\216\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\345\244\247\345\255\246\347\273\217\345\216\206/\351\261\274\347\232\256\350\220\275\346\210\267\344\270\212\346\265\267\345\277\203\345\276\227.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\346\261\202\350\201\214\347\273\217\345\216\206/\344\273\226\344\270\223\344\270\232\347\254\254\344\270\200\357\274\214\345\215\264\346\211\276\344\270\215\345\210\260\345\267\245\344\275\234.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\346\261\202\350\201\214\347\273\217\345\216\206/\346\210\221\347\232\204\347\254\254\344\270\200\344\273\275\345\256\236\344\271\240\357\274\214\345\235\220\351\253\230\351\223\201\344\270\212\347\217\255.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\346\261\202\350\201\214\347\273\217\345\216\206/\346\210\221\347\232\204\347\254\254\344\272\214\344\273\275\345\256\236\344\271\240\357\274\214\345\255\227\350\212\202\350\267\263\345\212\250.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\346\261\202\350\201\214\347\273\217\345\216\206/\351\235\242\350\257\225\351\230\277\351\207\2146\346\254\241\357\274\214\344\273\215\347\204\266\345\244\261\350\264\245\347\232\204\347\273\217\345\216\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/2022\357\274\214\345\244\247\345\256\266\350\277\207\345\276\227\346\200\216\344\271\210\346\240\267\345\221\242\357\274\237.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\344\274\221\345\201\207\347\273\223\346\235\237\357\274\214\345\256\232\344\270\252\346\226\260\347\233\256\346\240\207\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\345\206\215\350\201\212\350\201\212\350\277\231\345\221\250\347\232\204\347\212\266\346\200\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\345\244\247\345\256\266\344\277\235\351\207\215\345\225\212\342\200\246.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\345\257\271\344\270\215\350\265\267\357\274\214\346\210\221\344\270\215\346\230\257\344\270\200\344\270\252\350\207\252\345\276\213\347\232\204\344\272\272.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\345\274\200\345\267\245\347\254\254\344\270\200\345\244\251\357\274\214\346\210\221\345\256\263\346\200\225\344\272\206.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\346\210\221\346\224\276\345\201\207\345\225\246\357\274\201\350\277\23122\345\244\251\345\271\262\347\202\271\345\225\245\345\221\242.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\346\210\221\350\242\253\351\232\224\347\246\273\344\272\206\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\346\210\221\351\230\263\350\277\207\344\272\206\357\274\214\345\210\253\346\213\205\345\277\203\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\346\226\260\345\271\264\347\254\254\344\270\200\345\244\251\357\274\214\346\210\221\345\260\261\350\232\214\345\237\240\344\275\217\344\272\206\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\350\201\212\350\201\212\346\234\200\350\277\221\347\232\204\347\212\266\346\200\201\345\220\247.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\351\203\275\350\277\231\344\270\252\347\202\271\345\204\277\344\272\206\357\274\214\350\277\231\345\270\256\344\272\272\347\253\237\347\204\266\345\234\250\343\200\202\343\200\202\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\347\224\237\346\264\273\346\227\245\345\270\270/\351\232\217\344\276\277\350\201\212\350\201\212.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/Java\345\274\200\345\217\221\350\200\205\345\267\245\344\275\234\351\203\275\345\201\232\344\273\200\344\271\210\357\274\237.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\345\206\215\350\247\201\344\272\206\357\274\214\350\205\276\350\256\257\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\345\244\247\345\216\202\345\201\232\347\250\213\345\272\217\345\221\230\344\270\244\345\271\264\345\215\212\357\274\214\346\210\221\347\273\210\344\272\216\345\255\246\344\274\232\344\272\206\343\200\202\343\200\202\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\345\267\245\344\275\234\345\220\216\357\274\214\346\210\221\345\235\232\346\214\201\344\272\206\345\244\232\345\271\264\347\232\204\344\271\240\346\203\257.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\344\273\216\345\257\274\345\270\210\350\272\253\344\270\212\345\255\246\345\210\260\344\272\206\344\273\200\344\271\210\357\274\237.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\345\205\245\350\201\214\344\270\200\345\271\264\347\232\204\346\204\237\345\217\227.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\345\215\207\347\272\247\344\270\272\344\272\221\345\274\200\345\217\221\351\253\230\347\272\247\345\270\203\351\201\223\345\270\210\345\225\246.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\345\234\250\350\205\276\350\256\257\345\222\214\345\255\227\350\212\202\347\232\204\345\267\245\344\275\234\346\204\237\345\217\227.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\345\234\250\350\205\276\350\256\257\347\232\204\350\257\225\347\224\250\346\234\237\346\200\273\347\273\223.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\346\210\221\350\216\267\345\276\227\344\272\206\350\205\276\350\256\257\345\206\205\351\203\250\347\253\236\350\265\233\347\254\254\344\270\200\345\220\215\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\347\246\273\345\274\200\345\255\246\346\240\241\345\220\216\357\274\214\346\210\221\346\211\215\346\230\216\347\231\275.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\350\275\254\350\241\214\345\244\247\346\225\260\346\215\2561\344\270\252\346\234\210\357\274\214\346\210\221\351\272\273\344\272\206\343\200\202\343\200\202\343\200\202.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\350\277\231\345\221\250\346\262\241\345\206\231\344\273\243\347\240\201\357\274\214\347\253\237\347\204\266\345\234\250\345\201\232\350\277\231\344\273\266\344\272\213\357\274\201.md" create mode 100644 "\350\207\252\345\255\246\344\271\213\350\267\257/\350\201\214\345\234\272\345\267\245\344\275\234/\351\261\274\347\232\256\350\277\231\344\270\252\346\234\210\345\260\261\345\206\231\344\272\206\350\277\231\347\202\271\345\204\277\344\273\243\347\240\201\357\274\237.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/API \345\274\200\346\224\276\345\271\263\345\217\260.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/Java \345\220\216\347\253\257\344\270\207\347\224\250\351\241\271\347\233\256\346\250\241\346\235\277.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/OJ \345\210\244\351\242\230\347\263\273\347\273\237.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/README.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/\346\231\272\350\203\275 BI \345\271\263\345\217\260.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/\347\224\250\346\210\267\344\270\255\345\277\203\351\241\271\347\233\256.md" create mode 100644 "\351\241\271\347\233\256\345\256\236\346\210\230/\350\201\232\345\220\210\346\220\234\347\264\242\345\271\263\345\217\260.md" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1d9045b --- /dev/null +++ b/.gitignore @@ -0,0 +1,125 @@ +### Node template +.idea +.DS_Store +dist + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.temp +yarn.lock + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the assets line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# assets + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +/.vuepress/dist/ diff --git a/.vuepress/config.ts b/.vuepress/config.ts new file mode 100644 index 0000000..dd3cecc --- /dev/null +++ b/.vuepress/config.ts @@ -0,0 +1,137 @@ +import { defineConfig } from "vuepress/config"; +import navbar from "./navbar"; +import sidebar from "./sidebar"; +import footer from "./footer"; +import extraSideBar from "./extraSideBar"; + +const author = "程序员鱼皮"; +const domain = "https://codefather.cn"; +const tags = ["程序员", "编程", "计算机"]; + +export default defineConfig({ + title: "鱼皮的编程宝典", + description: "贴心的编程学习路线,全面的编程知识百科", + head: [ + // 站点图标 + ["link", { rel: "icon", href: "/favicon.ico" }], + // SEO + [ + "meta", + { + name: "keywords", + content: + "程序员鱼皮, 编程学习路线, 编程知识百科, Java, 编程导航, 前端, 开发, 编程分享, 项目, IT, 求职, 面经", + }, + ], + // 百度统计 + [ + "script", + {}, + ` + var _hmt = _hmt || []; + (function() { + var hm = document.createElement("script"); + hm.src = "https://hm.baidu.com/hm.js?2675818a983a3131404cee835018f016"; + var s = document.getElementsByTagName("script")[0]; + s.parentNode.insertBefore(hm, s); + })(); + `, + ], + ], + permalink: "/:slug", + + // 监听文件变化,热更新 + extraWatchFiles: [".vuepress/*.ts", ".vuepress/sidebars/*.ts"], + markdown: { + // 开启代码块的行号 + lineNumbers: true, + // 支持 4 级以上的标题渲染 + extractHeaders: ["h2", "h3", "h4", "h5", "h6"], + }, + // @ts-ignore + plugins: [ + ["@vuepress/back-to-top"], + // Google 分析 + [ + "@vuepress/google-analytics", + { + ga: "GTM-WVS9HM6W", // 补充自己的谷歌分析 ID,比如 UA-00000000-0 + }, + ], + ["@vuepress/medium-zoom"], + // https://github.com/lorisleiva/vuepress-plugin-seo + [ + "seo", + { + siteTitle: (_, $site) => $site.title, + title: ($page) => $page.title, + description: ($page) => + $page.frontmatter.description || $page.description, + author: (_, $site) => $site.themeConfig.author || author, + tags: ($page) => $page.frontmatter.tags || tags, + type: ($page) => "article", + url: (_, $site, path) => + ($site.themeConfig.domain || domain || "") + path, + image: ($page, $site) => + $page.frontmatter.image && + (($site.themeConfig.domain && + !$page.frontmatter.image.startsWith("http")) || + "") + $page.frontmatter.image, + publishedAt: ($page) => + $page.frontmatter.date && new Date($page.frontmatter.date), + modifiedAt: ($page) => $page.lastUpdated && new Date($page.lastUpdated), + }, + ], + // https://github.com/ekoeryanto/vuepress-plugin-sitemap + [ + "sitemap", + { + hostname: domain, + }, + ], + // https://github.com/IOriens/vuepress-plugin-baidu-autopush + ["vuepress-plugin-baidu-autopush"], + // https://github.com/zq99299/vuepress-plugin/tree/master/vuepress-plugin-tags + ["vuepress-plugin-tags"], + // https://github.com/znicholasbrown/vuepress-plugin-code-copy + [ + "vuepress-plugin-code-copy", + { + successText: "代码已复制", + }, + ], + // https://github.com/webmasterish/vuepress-plugin-feed + [ + "feed", + { + canonical_base: domain, + count: 10000, + // 需要自动推送的文档目录 + posts_directories: [], + }, + ], + // https://github.com/tolking/vuepress-plugin-img-lazy + ["img-lazy"], + ], + // 主题配置 + themeConfig: { + logo: "/logo.png", + nav: navbar, + sidebar, + lastUpdated: "最近更新", + + // GitHub 仓库位置 + repo: "liyupi/codefather", + docsBranch: "master", + + // 编辑链接 + editLinks: true, + editLinkText: "完善页面", + + // @ts-ignore + // 底部版权信息 + footer, + // 额外右侧边栏 + extraSideBar, + }, +}); diff --git a/.vuepress/extraSideBar.ts b/.vuepress/extraSideBar.ts new file mode 100644 index 0000000..1d3d011 --- /dev/null +++ b/.vuepress/extraSideBar.ts @@ -0,0 +1,49 @@ +/** + * 额外右侧边栏 + */ +export default [ + { + title: "手机看", + icon: "/icon/mobile.png", + popoverTitle: "微信扫一扫", + popoverUrl: + "/qrcode-codefather.png", + popoverDesc: "可以手机看或分享至朋友圈", + }, + { + title: "星球", + icon: "/icon/xingqiu.png", + popoverTitle: + '保姆级实战项目教程、编程学习指南、学习资源、求职指南、技术分享、编程交流', + popoverUrl: + "/qrcode-codenav.png", + popoverDesc: "知识星球:编程导航", + }, + { + title: "交流群", + icon: "/icon/weixin.png", + popoverTitle: + '扫码添加 编程导航小助手微信,拉你进专属编程学习交流群', + popoverUrl: + "/qrcode-codenavhelper.png", + }, + { + title: "下资料", + icon: "/icon/xiazai.png", + popoverTitle: + '扫码关注站长公众号,回复 学习 获取海量编程学习资源「无任何套路」', + popoverUrl: + "/qrcode-mpcoder_yupi.jpg", + popoverDesc: "公众号: 程序员鱼皮", + }, + { + title: "支持我", + icon: "/icon/dianzan.png", + popoverTitle: + ' 鼓励和赞赏我', + popoverUrl: + "/qrcode-thumb.jpg", + popoverDesc: + "感谢您的支持,作者头发++", + }, +]; diff --git a/.vuepress/footer.ts b/.vuepress/footer.ts new file mode 100644 index 0000000..912cb07 --- /dev/null +++ b/.vuepress/footer.ts @@ -0,0 +1,32 @@ +/** + * 底部版权信息 + */ +export default { + friendLinks: [ + { + label: "站长 - 程序员鱼皮", + // icon: "/icon/user.svg", + href: "https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah", + }, + { + label: "鱼鸢网络", + href: "https://yuyuanweb.com/", + }, + { + label: "老鱼简历", + href: "https://www.laoyujianli.com/", + }, + { + label: "鱼聪明 AI", + href: "https://www.yucongming.com/", + }, + { + label: "编程学习圈", + href: "https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde", + }, + ], + copyright: { + href: "https://beian.miit.gov.cn/", + name: "沪ICP备19026706号-6", + }, +}; diff --git a/.vuepress/navbar.ts b/.vuepress/navbar.ts new file mode 100644 index 0000000..5c8efc3 --- /dev/null +++ b/.vuepress/navbar.ts @@ -0,0 +1,128 @@ +import {NavItem} from "vuepress/config"; + +export default [ + { + text: "学习路线", + link: '/学习路线/' + }, + { + text: "自学之路", + link: "/自学之路/", + items: [ + { + text: "大学经历", link: "/自学之路/#大学经历", + }, + { + text: "求职经历", link: "/自学之路/#求职经历", + }, + { + text: "职场工作", link: "/自学之路/#职场工作", + }, + { + text: "创作经历", link: "/自学之路/#创作经历", + }, + { + text: "创业经历", link: "/自学之路/#创业经历", + }, + { + text: "生活日常", link: "/自学之路/#生活日常", + }, + + ] + }, + { + text: "编程分享", + link: '/编程分享/', + items: [ + { + text: "入门必看-学习路线", link: "/编程分享/#入门必看-学习路线", + }, + { + text: "学习指南", link: "/编程分享/#学习指南", + }, + { + text: "开发经验", link: "/编程分享/#开发经验", + }, + { + text: "求职经验", link: "/编程分享/#求职经验", + }, + { + text: "职场经验", link: "/编程分享/#职场经验", + }, + { + text: "技术分享", link: "/编程分享/#技术分享", + }, + { + text: "实战教程", link: "/编程分享/#实战教程", + }, + { + text: "其他", link: "/编程分享/#其他", + }, + { + text: "项目教程", link: "/编程分享/#📚-项目教程", + }, + { + text: "个人作品", link: "/编程分享/#个人作品", + }, + + { + text: "编程资源", link: "/编程分享/#🎁-编程资源", + }, + + { + text: "科技科普", link: "/编程分享/#🌐-科技科普", + }, + + + + + ] + }, + { + text: "编程词典", + link: "/编程词典/" + }, + { + text: "项目实战", + link: '/项目实战/', + items: [ + { + text: "OJ 判题系统", link: "/项目实战/OJ 判题系统.md", + }, + { + text: "智能 BI 平台", link: "/项目实战/智能 BI 平台.md", + }, + { + text: "聚合搜索平台", link: "/项目实战/聚合搜索平台.md", + }, + { + text: "API 开放平台", link: "/项目实战/API 开放平台.md", + }, + { + text: "伙伴匹配系统", link: "/项目实战/伙伴匹配系统.md", + }, + { + text: "用户中心项目", link: "/项目实战/用户中心项目.md", + }, + { + text: "Java 后端万用项目模板", link: "/项目实战/Java 后端万用项目模板.md", + }, + ] + }, + { + text: "知识碎片", + link: '/知识碎片/' + }, + { + text: "🔥 编程导航", + link: '/编程导航/' + }, + { + text: "产品服务", + link: '/产品服务/' + }, + { + text: "作者", + link: '/作者/' + }, +] as NavItem[]; diff --git a/.vuepress/public/baidu_verify_codeva-hlChwhGcel.html b/.vuepress/public/baidu_verify_codeva-hlChwhGcel.html new file mode 100644 index 0000000..ebca386 --- /dev/null +++ b/.vuepress/public/baidu_verify_codeva-hlChwhGcel.html @@ -0,0 +1 @@ +a4b32671d3703c3969a3d20817fda860 \ No newline at end of file diff --git a/.vuepress/public/favicon.ico b/.vuepress/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..aac7fc6a94a07b0687e900c093f8f09c57c161f9 GIT binary patch literal 1903 zcmV-#2ax!QP)3aY6Cd4- zOcP%VO(@2w5u?Du5JN&)xNuWy6kQl)5{)|vqfN{tm?^NAA_^VkRkR2wrR~g6rmthZ znRBOi=DUw`?qfuM$preHbLQUj-S7Y1^BRRQ2LA_?WF`mzeE_hHcV`^`W?_GiS@-Tr z2PnPJ29WSjc!CrFY-eGAj9ArncasBn$NO|Tatr{v*>1Q@8WlQ^ zPkA3HC~%5}{cXgmw)N5hN@u(Y0J;Dm$W3Da5Mznx7^&L}SQnpkfP7JbVT=m48%o+L z$xH_TBuVX3mawp&Tob7x7MD;u<2wQ15&#_FPiG(h|7E2!-mP<$BPN|kLIAL{tn)$M z&I-c_@WcVU^9M*l0qo=^G5`l$}a%F`AG83#X}c5DUk32PmEKHj~b4 z*{5{IW6B4&Uj~48NvS>oH42nuM$~Cw76Gp20Hre?6m9PkrT-Sq%~NhRMzxP%+&%PZs`lh?2|@8Q69} z#dIIa0W5UwRqc)gDyIATX@Gzu-IwE91oU~Xd;cuJiX1UJgd{>~2k?o^Hd0`OZQb7? zW)~nsXDJ78-S?3KBUY@or+e(Y3rSB8K7B4C>;SI&nBeTI@YGw^6SF0aQ-$#Nj*>he z69MA0FVs6GJz3pj!fSB+zPCc&0n)l(YeV-7=L)Yp?~#*$E!{6)Ma-6XsQWTPd?hK5 zsRJsedz|6fpXAt~C<9XmR7CgACpmT~%D~V8716yrlN>vkM?l4NkMsM==)RodMhkI( zwC-`7Z%6m|uJ`tRZ$wmI4QkC=q1y!Lmou%B$QY9pXqSoi-uQ1`kISL=W-QtBnMN@cDyrOcM= zUW;B56le5rfSGA~Z6`h3mn~&v=5?c;VZ`}e+_*+eLZsz3glutc@;G}n@TFN(tpmi@ z__UlKvKIwjN5J*jG<)NI-KB6X+PjGHb2V~I-iCEoe~`bysVdYbF}p$*=HSZ27Ll(i zI)I(;)M*(XO6O6%ReM`1IQhq6IddOlcD|kO-k9?{7dog&l~o@M&A&r zV~E>{@cPUsd$ZwbVmE;}K!qiuIALh#<7Y#*Hvd{I3RX?zoe-!>8&xkQh2n z)qhkxDY_8_sqA6)R^uUJ7eLtkED;?jkA_gqD5<9+oD^?6jDV5pzu1mt&k?&IQdc*N z20et5qLT>7!W?^LNju(V` zrV8I>o`M&z9whc64^7H1kDbXLb`tt36`7J*CPi5pj7*QX(Rsu)0&@K=LB3AVruo=j zGAL;|_~mL`4(+11X2SyIF#C^8^AlRoHX=MlZD2EAMxG#n{f zIbe8dn7z~ZHnBT|T-6sz4f0=Tc!q9LG@BZavl-T1r+e1dDMrbpi_1WKgM@+;sU~$F zZX^>3#xJbz8qF;Z9si>lhSPq4HP-;@8ww4LW`?Nyb7Kz!)Q}=K&`p9c{{}c>biz`A z2Yitf`Hc@hT-lSC8SW@;-ZHW9)Qe(bI3I{sdMTWgP=!Psy zMEiJD9LujIo<2FhrdU26@JRPs3?rbNTz^ZKW?Q*QU<)nmi=+mKReNzY8tNMZ`Ll$0 zKuSF$baO7pp0B-^G;$fk2q?!FNgeS;Qa$*=A3l)^HYi5JjX#gUh1C4a5RVF79Dl^? z&Leh*!lqAF29}6kW{GGAoFCc`mu?nXo}Jj^_WRxlTMpo%Z6_}nl3#+mc;WHZL23D2kE7|ZFOrHGtQ>nfl5`Wt p>jC^ptNRG*u9DnAi+>9M_y;yZO}oi)<*Wbz002ovPDHLkV1fXKaPR;C literal 0 HcmV?d00001 diff --git a/.vuepress/public/icon/ai.svg b/.vuepress/public/icon/ai.svg new file mode 100644 index 0000000..474e8f5 --- /dev/null +++ b/.vuepress/public/icon/ai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vuepress/public/icon/copyright.svg b/.vuepress/public/icon/copyright.svg new file mode 100644 index 0000000..4b544e5 --- /dev/null +++ b/.vuepress/public/icon/copyright.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vuepress/public/icon/dianzan.png b/.vuepress/public/icon/dianzan.png new file mode 100644 index 0000000000000000000000000000000000000000..3984eefc558ffad9b4a1dd993bb140d45db3f12a GIT binary patch literal 944 zcmV;h15f;kP)rZKo}gfwj`f^-vkZTk ze_z1ma?JqI*4FkOc`z!0#ZKorJ@^J{LT2pcfLU;Rz1|>ob0%*Ahr`iOWi+0+I7zTT z3ZhBk{6UgkyC;gP>Fb=yTflC&H*PH{*}u&;5%}>QDm5V`@yO>lP%~%p7FgnP-8@)Y zT3;;)K;SK)DA*c7@@Z13^ZWf?wt=77JzIY7zhF*0_i zrJ}-M-LwgK{tRfn4sU|vRGhuI(k9NQ%W`H!0<`pY(BmCBH+{NcPF)=!NxzLY6ckJ#5}+vy;!KR=Y>YQi zrEEl+@e!a^f@B;!CCCrs@+z8w8x&13J_6|kbcd9rZh}QqsUI(_BPm)F7yQ0A*E;EMumj3|-2qTfnU4TTk;JpkcAYO6jTV}9BL92C`{ z5m;2?xVp36y0YGGqTV2*5=hVg?tZR3NMhLht7rt&ZMcZZ?K7toWrm=uPc}hfm{MFE zqi)XVxLjPU$i}e3d5E(&w?%Otg@>UL_=Wn`gE4|J7NjSCO3kcf6&O$c3;YC7b;d9m SlTT*=0000 \ No newline at end of file diff --git a/.vuepress/public/icon/mobile.png b/.vuepress/public/icon/mobile.png new file mode 100644 index 0000000000000000000000000000000000000000..7e7bd36d3c786867955ffac303f250545b543955 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFnW8sIEGZrIeYz}?_mcKmJ2tz z8n_Cy8ih0%wHB~k6LnzUA+myHIn#>+Jx}L%+gd-0c04utnb9fv-xIpI_k=%de7WH~ zM*_nIv$kR!4zHR+tEo%ghdUzpyR z*C&>zNWMvIx;rs-Lpx`g`?P~{YByvf*{WwG&|0GH^241c(oY)2{Nb)K>W|=Icqg&k zKzb98@MD=7g57)v#2<^KIZsPWnj`(JeP-#8cJUd<*Uy;7&)|RN&D@>tw \ No newline at end of file diff --git a/.vuepress/public/icon/sketch.svg b/.vuepress/public/icon/sketch.svg new file mode 100644 index 0000000..761383b --- /dev/null +++ b/.vuepress/public/icon/sketch.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vuepress/public/icon/user.svg b/.vuepress/public/icon/user.svg new file mode 100644 index 0000000..474a83f --- /dev/null +++ b/.vuepress/public/icon/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/.vuepress/public/icon/weixin.png b/.vuepress/public/icon/weixin.png new file mode 100644 index 0000000000000000000000000000000000000000..33658f128a5f11d1d7a05b65dd87a8fb6660c8c0 GIT binary patch literal 721 zcmV;?0xtcDP)>)`X@q!#XXiczdKB1(E;+Lx&~sGn zE&An<;yp!&^o9`9;#tPmGP0mDAbBpsDJlGF;$cp8C_pM@;zDOV|!fDz9- zG+oB5v&-`A({CXkL;mK7S?OYi63_*pZlc4OyS6c%zGJ3sXcLPFK$L(MfVZ^#s0NkT zV{i{eG4KjcJ0S&d2qF50+=%ZmWD^n2xLAhuH3Htt2b8!BBt{%qyMivzJMh`Lujyr@ zb|1+Gb7yh2gi&W&yWEgR5pCpw_eumPa`yrQ-8HyWr$-eZm~u0#;?{C0cu2T%Oru74o&Lfs1l-U&2seu`>UU))bCNiQVA6Ee*`-nqQ#~Pc+Cb- z<#n1O?sQt7e#yc(5zos?NM$d18YWk0SYxke*S3Eb7_0DW%$(Odm`e0)=oS}_za*Qb3X!BQE%AO z$i&vxVE%HNi1g`!&F5jp?-8&GCFDjF`SSu+_%GlWT$bG7c1qQe00000NkvXXu0mjf Dt`$v# literal 0 HcmV?d00001 diff --git a/.vuepress/public/icon/xiazai.png b/.vuepress/public/icon/xiazai.png new file mode 100644 index 0000000000000000000000000000000000000000..e17d64cd372af37f72ef6ea5eaf78290f0ea2313 GIT binary patch literal 739 zcmV<90v!E`P)X1^@s6P!BAT00082Nkl50NC{+f4#2hebuxv3n zc~uzjf&Uf|0?3(8>S@2&OX0R*=N?BS=l^d1Mud~75JH7g5%n|0=oh`Cva#* zpgt`SwCNbC!1q8JKSFlLwa%3ZdR(L;0(EJL&JPai3LH%3bOX_HU0MRdw%3>=&IgUp zkLXqZ1-#-H-#F0q5E!F`M@uj8ag5rKDgK~IvjAqfy_zvI;=91*q=gzS{JXe_9fx-M z7OeLVp}e?3nGzyvLUUx?SAio7E;_#`U_l!AI^sYATE`Fy(_`SzuT!RkbX>@+IqIuG z_gfpyrVgesib`xI;Nhlo3%&|mcx@pr!nFItRs!A_Dk{K^o(1X;gEzIoS^flN?j^+Z z{oF5#8nY+*%TWD9pUR{D1>jTd&mQKU!+PJR*H93jCS1$CB zP7z>LAB5U<2WoW#o&P+t69Wj(C+P_l&s*N=B7x}K9yQunrAEP7`G3te!|TGSZ-5dG zQbgUZZ9?GW0IYWp5c>LrGF04hAanUqx{P|*rDRR33o%0JM)<^ug$TOmYr%94j4N>T zT5u~vGqI>GHhpq?Ttldb8Ph37?^gtAG{-CmgDFavR9KV>WuzmX(JgUXHD;!;&M&xS VXECNkl+8qu+jro- z<`r)DmB_%u;SBEBO)?#sO9;Q0n)1@BdIiE^DlkTN?XJ_=HkJURUSP}zga?7hBYum? zdJT{k0y)J%ZV6nMy*P9FJPYybK+<-Pr~N!qkWxUIx$>M4sIzUhiv6E%BYmiy9kcUv z$SFZ!K{ZbPa6z~_-Na5D1iGhi6gfq#5-R}QV{u1_Z)QUUBxw6&4@`WjiN6{@tAcIyHMXQr$_PBg^=~PfkNp7|QcaYU!vJ-8JeL}# z3EDJ#_5V#g9307Hr!5?bIxu`ciMg~=)K;&K9H@P$Iny0C}!X0BwD5m_XcgAJIn0*%!`1TyCx0D5`MSmE>>7k5(*|vUN(j)V z-ubWcQM5dRE%QV3Ps6x=a~$99Ulg0R@9%w}Iz7NCaPVXGK91R3)dV39&#d4VrEf5b zgC~Yim@lJomoYJ8VzY(l2p3=zn7EahPXTA0qv+@f;=_$O*tRK$Et8}aprzpAcP1=b zDzoMJxqfpZmg`&|tvc#uJo>5h^+!?r`GD$lb_%p2{ASl;RFr42C4JOINnHcfVr$%K zK*hTY*gBi;-f|but`329)1D zqf*josO^3xgD%|qwJ8I6oRDYW>V1Nn+PGyAY+E>tN&1}XSY3A4zLm+=If(LiZ6P$b4NVKb3Rz04?d;T%nUzt@ z+oYc(;WHWJw_Em^bow{=4HltJsZMt6>IpudV-sLlYqQ`Ufk`+^+GIP}s zNvP3OY1?tds%){fEQdO81<~yd!Ll}sHyQohp`J>ZuLly2UK|n~zTmX&ScBBU%76VWw*!fOJG`8oD)GQjp;HuOtl*-D=get(c~v`urK{Afnn!GP}#eBI}&@R5L9 z5Ut>asa}o5m(@nn=Ssk0F3cRhQU!s-jWGfq69S_Oj<)+n_pK+ymc;Hi6MmMOr{c~n zHOi5l6?r<_8a{ZcsD~hlg=ovgIA0O&O8v{YZUk}S@-XLIky4FZgTHz<@dXM^fLO0i z(G9B>=t`DnQK3ObQDJ=3^4^bo?))bx+_yr?SV-X*Q5Q(pFf->fnNxsC4R|!oW#KaIiXEs7YL#ijr{@c zi`z3Gq<&}`H&7L&6@3vx1r^~U0beRN5$z`=;?i%VN_vt(vH+b^R0*{eO$cq`&?d24 z(-hjqXP@JoUvAKIo{Kl0-P_sOnc3O({k}Mvv3=g1|33d`UUtSJgg_PZu(J7D0O$sQ zE&!;p{efozpqI2KkIML?s{$|(E1PctfPn=KzYr8c7imwPVQPF(6@X!IHh!5Q0B9lY z$x)_;lV!2Kn-Z~l02`(g05CM;zwyb#8$UpvDm7SOXxM+1v+@K0FlK!->@M!gvLjD1!f{%UF$GM(Lo9_ofI08g62e49^Hrlvep&7}Q{JB5P z)o-Sre~PK_&qF*pftAe<1Q1)99BEGqSx@9Fz)EGXA+wx~4>U47Z>2KcjnM-;sjy_w z?fH4xe2_?U%Qe#Oqi-T50NRL;GZlOsvQn8dRw`5JN%7MK^P@ToVtG5CCm3DP!L@5!_6isPD^s z8p|}&-+dE-!5&`XDF7O>dnMm6{9Rd$Dw2KQi6<76sfaWnnoC3>0;sxS$Z@za`KE%W z(ar&@XRe!OW%Dv@%oRGG;0vP#Aj$XL*}WHF<*N0r_44SZS-LD6bHld{7%KqDzR%LI z1E8^qDOSQ#asXznR}@DYh?M{o`2IX=Y5;cMuH;uc(pW$d>~gA-Ogt=r4)&<={bkDm z_O{M_)xpMTfSMUSpM|}Sxn2f0#tFbmWmI*^=Ge1$E&}LaRS}?}py#vZ@nr)>3BXEa z)ON|x_qT3mij}aG05nbN`K(*!E2{T0Qz&>ueBHef;oh?nm#HDZBHGz1VU-``f4 z>-L!ecODR$0Al6)IMB0Unkfzu?wP?*1Q09V$EUtg`(TeJyi3HwiU9HOef0ZAV|;%h zW(uI{``R#10I~A@`e}fAZIe7Aa3zA;1W@&T?Qlg|oe>~Dz8}sck8gOEh-ndka^G*= zug~}K$q#3eM+DD2K)C>v`~KcL0amSMij|;uafb}TjR3YK-D+su1+a0m%1f9BCwcTQ z?g&cg5g~#AYA~|_k(VD;Eqn;H*b8UNx5{Ya;uWL~!&~D%2;aSq2bUo9^Qvk|+AG>_I z*7F1H_QiO>X91^4d(v^k>M}eLfcIbqF?Qxb8!q3s!w7)B%ctoj`w*D5;(BFIiku|Q2*7RD zNC`JWn2DQoy5xv+eaR)#o)kJ;!Rc-|ju|Uq^1A*TKNYhGFl9}{>f)D}a!#BCppVZ! z(f^s_OPQibGqKdS@7oDq05h7$nV>k$ z90fq>q>Bo)aB$CCaCpP3@XWdw^n75HqCm;_NAH*A`*vIfK>E|8bW~7_2!8g}KbO8f zv+g%=Z}P89y>y~99`N48@5qtuCzx^xxC#K~6T+RU?ckn<_hHAHYd8P@+s#kI9SOzV z!>Ei1j!ch`A8h&_Q!a^$0stBbNPik5!IP?@!Gn9=y5;}1OU6nfs97@3e6KX3FcvUD zX2}C}+n92RaNh;epFT=w3Z+Mbdw0FVloFkx=_|6M z!F^5dK+Ov0?%#dMzo<fH&4er_YK2v5#X;Nrv9-!Fw?Fc^t zvZ4VdfLE@xic{p!x;;#}29#YrPc+!K{y$6^4^orD zup9vvnQ~1imA_Xss7;713zwc0hS?hk!T0TGxpG@Hkhai7YEl?h6bQ-p?P!xe zomj$XaEz%GL|Rf9Mjr5Ku@IK;+tGUEbYcnLJ8YK~4WuN6x+4JYOL-~x6{b7{LNPzm zpT>9BTQ;uFk1&-21WpR4G%poDKlXH(zHi4OB)kn13VqE3vUVOjTi65N{NQEC71uCz zTzp|t&)xx-Z~UDcUjH?wJS1ZCrX(hX&u#n_Q_hVJ8~Ai~!lcFr0|X#-joZPsC*iTW z-!tW0sGb=t0D((mMm0VdAOPuaAw9R@m+BMMpE$ko4!0_}|rmiBpudCTZ@Z#ia;t1do*gIm*Q{mA4PlwzKcmpsyp!%B)MfHkGUcT3;j6!9>RiD*K&Alj zCC=foyG`D4hg$%JzGmDy4i|qMVk!*@Xt@S!szT;fV<|u z1*b;NHjBb9p*$N_F91OmPW6i6HuZL>nJOX9KASDlYj} zM6KUnTXA{%$guMkb-an-hf`O{qniS6))*$jeV#~jF{lIdMV*J$we8|=>ImDUG@@DisgWUmLP zrMruD(&%8H20KeL_CQl(iH<=jt2gOMsPk*`7bb<+3utoQxB||Nzes+#8g+P(72rnaZU*`4x;j% z2)a>To__OX6?;Id;5yCHgDaJ*#km;`W~STW?3*9KD9w-1_hXXuEkw5fgif}y zljs;!CV(=fXpkHIBAmPYdg&$3nEAdP?XQLv`kGM$k24jV$m#}GnInuOusc955cxF; zrlDN`IC@Bzl#4W`-t&wW0ikpQZSx3zMWEdO7aO6C0|<(s8UZ8|>Oc?`fuCJQWppE} z*a&?jkap|ZIQ9-2k~IfVWga7jg6Xt!c{tW>2l8H~q)K2y-6F;f`qnWDB2B;Lr9{VI gm&>`c`$N&HU literal 0 HcmV?d00001 diff --git a/.vuepress/public/qrcode-codefather.png b/.vuepress/public/qrcode-codefather.png new file mode 100644 index 0000000000000000000000000000000000000000..96f90cee2b61356beb1073a5ba29650b0fc41cac GIT binary patch literal 13666 zcmeI3dsq|Kw!qV>q=G=(Q@{%XRf`WEiYQQmn9o<`A*eh8Nr0e;76L>K5d}i5DRM2f zD9A&Ea? zpu@|M^2gEMf&M5|$~qM4+?OcS0#bEu9EGAeqfir3C={j;g|awN+;C_+((vvPzkPd9 zDE6hbE=Xzl32!_VIU-jfKNWdb7jlA5^6}q`Rv22ogI*G2#6&D^3-Q^rGx$v3RLRbq zRi0n(W@wDlmdU|4TdzOc|D{97>Q9yiruAYrod1|qkUTF3AAeafA-wy}mk0N&vLAT12S8j z@zvAf^%n4~;t*pJ1G-*@>p0hTv|goZ<)_k%i!csx-ltNFd`e@Sgnv?3O}nhZ|4;>q=Y-#7ERo2P??rg zG&AuGz`YUIRDS8cu)M)}U6G-w0U$bj(4JY*aBI`o7m+JOKohZr8H75-ZsF8qxjOlvB$t_Jv?B^?`6Tb+V0y|+vidUeQdwzPg&ez~3&EtMT{EQ|A&VB8@q7k*+# zAMxvqU}F|Rae=XWOnM2QnpJa|y*gxaKt*|^H~zQB&ey(C9(UUD?SfUZmlyRyNR9ZwS8 z+|wSZe%SiZf=bksT$Ol06c5s1eQh5mc^HI;DNHa~$lHLE0{7JrfChFRKcr9zM+baA zfJ#d}#~mkD!Te(4#`9p7iZ0n(@&M#h9rmgi>977+du#FiBC-5ExU0)L$(&{ah+^(X zA~0Xi6yFpNGurF()@ZTVQA$gi-$K%{kA`P1&*nV@|sAQq*Js~FdY7=A&f z*6`*(K$O^t8xKItdEn&lm82E!R|(5mnI@oMIn3Xtemo3Zew9kTnkn6GL8i$?=7cma zsAs;b?LaP>6;ih@B+GZ~2=|p|7|CucB|c%|r%DMOJ;^ybc8TjBagEoYjH2gtG}iD~ z4z)Oqb!An~HTOC3$7H>I-FbM9&O{p8)?r1w-r%xm zaKZlC*=TZ5=rO&K|B9=~HR;Nlm((X&d`4NeKUpr4j@6kQYuYL@Ka=kA{yRl?B7h;!{CZ zV{hB@>m6AWr47>j*3Ti6I)i7~KNAkevhW<&i%?eQWXmz0R5RTSlr@I1)1QkcwaU|v zj6{t41bOSQuz&UDrQjVh-8K^>W;VVLp)1w&RqzkiGrLr_)l!ZA;=iPEcK$$B0x8Qh z0?@xD>Kq%?(<1|%$6Q;B0vo^+b34mFh(jhvBPkA(wu5CkRB{v7h}ROR4IGwVi92kk zkfsnV;x3h|7C*@(&Awu;x^7dqrQfh$24f#PBd?e^nGkWyHNUyQ5PTDC&d*+=$8>${Op4AEs3@;0mZwsTSI%+gk(p23QXuI(a>_w6eHpK|e`rxKKVr?W?(sw9)X7l&Y;&>wfPHMplpGS6$u)dd*B zOA6w7$7tyZ$`L{Cd2rv3$i$xkuVrGQ#;36%BXrU-VE4|BiV1OS~0fykwx|qR2wU9}tbS`M^gINo*lKpwKXk<39I^SU!=O>=GiqgiHsDa5sD_g-~ zkLEKg5>ormUJ0Ght(A3;NI8Lm@J>*66{`36#mv>1F&B?{5j-S6gN zpAHo9NH0%LCU-r=vIA+aO$F-SoSKhLr%(ABQWhUsA==H!{%svP69b?&P^QMK^R;Hft^ z94bdhugj>DQGGAyF%fO{-6PFEi@wL@?>C0qm&5(bVPj@&w#E$N{{gZx_}ND3prx$W zy0574l7*_|0V>MM{i%&rL&B0FxpU#%8Ip+MDH0xbo|+b%2dB?79xSR|2BwyR3!=NN zI>XkfZ_-RDF9UdIlO;mA)9Klwn=A7MH4Jep;=W?)y-;bM9VfTu6ORpz z6eLG1EFbZ@zvyzn%})8wTaV*!JZt*ahlT!aspl457$o@0mb~>~O3;kWTL)%b&(WaX z`fvZ$M)X_vl~?@gRs9kP=Nj?jwrFP2C84BT>5eSHiQ9CWwAIr&CDL>|vQ%`JPHw&X zZW!C9oe{_hN=kH`#}+h8D}kok5C+`Wk#k#x=69N<2+nfNozi*UWwSa1z~9(Z@TQ|G zqq5pnEA)Ta^vm&dCnQb0$WR@5Psp9URj9Ezvk+vCRuR?`S)RqM zZ*00?5ktGptyHb zGRh31cqMj@PPsO2;7}7{GOB!D+_y*8e+?A1_mj^Y!YTTGG9=};d=Y~5?4D}@zejbm zQq0RU6Rf+mgfqmL)OYY#LhxY`o5z>b&#~gBY#NaajKD@V*Z%?+D^Dd^-w8GbM0+ST zYAS&%z{xTQ%AFi(aIXhs#jZmB9;=$Fbq^*vXyt*26)MUt0S*bi&EjGCK{^-7CuWp9 z5Z+iIAn8Iw&rHT{H4jNCnw>TQ7beJv7ux@_3O1JXAinpTRCrTdLb@}TZc4~eKN!1N zT)Ga>;M%&!62Zfncz0pSU}iZZGeEAMakPzw&ij$A^}QxB+AnGmrY zVr*dK!#?u0Z^d5X1NyvBi%!5y_LA*SN zR^6Okm4aYBg$YHQVzM`FKhx%8_Sv=+lOyxB#bSwwDgMsLH1bqn#s`be{kb`h zlD+x5752`XeTM2#c4QirKHZc&9r$pDnD=$L3VG`y%^y({Yce*jGxxX%Cp literal 0 HcmV?d00001 diff --git a/.vuepress/public/qrcode-codenav.png b/.vuepress/public/qrcode-codenav.png new file mode 100644 index 0000000000000000000000000000000000000000..c64075f1fb34b8fce9dc412a42ac0ed1ceabdfde GIT binary patch literal 5714 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 zν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 literal 0 HcmV?d00001 diff --git a/.vuepress/public/qrcode-mpcoder_yupi.jpg b/.vuepress/public/qrcode-mpcoder_yupi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..73f6686a5d2dec33113365df60fa0ccc05e6636c GIT binary patch literal 28504 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

H2CR^wo?@C9$eZ*hDKU+ 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 literal 0 HcmV?d00001 diff --git a/.vuepress/public/qrcode-thumb.jpg b/.vuepress/public/qrcode-thumb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5ec6c657f9f18d3409e24bc627fbd223a50b09ce GIT binary patch literal 33234 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%0DJF@YpB6>W8ylT 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 U?5O|rZvQWz=>PLIkUw+(3o|i>=Kufz literal 0 HcmV?d00001 diff --git a/.vuepress/sidebar.ts b/.vuepress/sidebar.ts new file mode 100644 index 0000000..0646624 --- /dev/null +++ b/.vuepress/sidebar.ts @@ -0,0 +1,23 @@ +import {SidebarConfig4Multiple} from "vuepress/config"; +import codeNavSideBar from "./sidebars/codeNavSideBar"; +import knowledgeSideBar from "./sidebars/knowledgeSideBar"; +import roadmapSideBar from "./sidebars/roadmapSideBar"; +import projectSideBar from "./sidebars/projectSideBar"; +import productSideBar from "./sidebars/productSideBar"; +import selfStudySideBar from "./sidebars/selfStudySideBar"; +import programmingShareSideBar from "./sidebars/programmingShareSideBar"; +import programmingDictionarySideBar from "./sidebars/programmingDictionarySideBar"; +// @ts-ignore +export default { + "/学习路线/": roadmapSideBar, + "/项目实战/": projectSideBar, + "/编程导航/": codeNavSideBar, + "/产品服务/": productSideBar, + "/知识碎片/": knowledgeSideBar, + "/自学之路/": selfStudySideBar, + "/编程分享/": programmingShareSideBar, + "/编程词典/": programmingDictionarySideBar, + "/关于我们/": ["", "个人经历"], + // 降级,默认根据文章标题渲染侧边栏 + "/": "auto", +} as SidebarConfig4Multiple; diff --git a/.vuepress/sidebars/codeNavSideBar.ts b/.vuepress/sidebars/codeNavSideBar.ts new file mode 100644 index 0000000..90e1e98 --- /dev/null +++ b/.vuepress/sidebars/codeNavSideBar.ts @@ -0,0 +1,54 @@ +export default [ + "", + { + title: "星球资料", + collapsable: true, + children: [ + "星球资料/学习资源", + "星球资料/专属学习路线", + "星球资料/专属交流群", + "星球资料/鱼皮的学习笔记", + "星球资料/鱼皮的打工日记", + ], + }, + { + title: "星球项目", + collapsable: true, + children: [ + "/项目实战/OJ 判题系统", + "/项目实战/智能 BI 平台", + "/项目实战/API 开放平台", + "/项目实战/聚合搜索平台", + "/项目实战/用户中心项目", + "/项目实战/伙伴匹配系统", + "/项目实战/Java 后端万用项目模板", + "星球项目/项目训练营", + "星球项目/Web 终端项目", + "星球项目/编程导航奖励系统", + "星球项目/SQL 生成器项目", + "星球项目/工作记录分析工具", + ], + }, + { + title: "星球直播", + collapsable: true, + children: ["星球直播/", "星球直播/往期直播", "星球直播/嘉宾分享"], + }, + { + title: "真实评价", + collapsable: true, + children: ["真实评价/"], + }, + { + title: "星球故事", + collapsable: true, + children: ["星球故事/"], + }, + { + title: "关于我们", + collapsable: true, + children: ["关于我们/", "关于我们/个人经历"], + }, + "星球年度总结", + "加入编程导航", +]; diff --git a/.vuepress/sidebars/knowledgeSideBar.ts b/.vuepress/sidebars/knowledgeSideBar.ts new file mode 100644 index 0000000..dea207b --- /dev/null +++ b/.vuepress/sidebars/knowledgeSideBar.ts @@ -0,0 +1,30 @@ +export default [ + "", + { + title: "知识碎片", + collapsable: false, + children: [ + "4 种方法,快速初始化 Java 项目.md", + "使用后端代码生成器,提高开发效率.md", + "前端必学的开发框架,Ant Design Pro.md", + "后端如何编写单元测试? .md", + "后端项目经典分层架构介绍.md", + "如何高效测试接口?自动生成接口文档.md", + "开发企业微信群机器人,实现定时提醒.md", + "如何解决数据查询为空的 Bug?.md", + "Git 提交竟然还能这么用?.md", + "【设计模式】装饰者模式,及其在JDK源码中的应用.md", + "用四种锁实现加入队伍功能(伙伴匹配系统).md", + "用@Validated注解实现非空校验.md", + "使用第三方服务(宝塔)快速部署项目.md", + "RESTful 接口实现与测试( Spring Boot ).md", + "快速学会为开源项目做贡献.md", + "整合Spring JDBC操作数据库.md", + "Maven 中央仓库发包流程.md", + "Nacos 配置中心搭建.md", + "Bean 拷贝之 MapStruct.md", + "使用 FreeMarker 模板引擎生成代码.md", + "如何快速忽略 Git 文件提交?.md", + ], + }, +]; diff --git a/.vuepress/sidebars/productSideBar.ts b/.vuepress/sidebars/productSideBar.ts new file mode 100644 index 0000000..a64099c --- /dev/null +++ b/.vuepress/sidebars/productSideBar.ts @@ -0,0 +1,14 @@ +export default [ + "", + { + title: "产品服务", + collapsable: false, + children: [ + "算法学习 - 编程导航算法通关村.md", + "后端突击 - 狂飙后端训练营.md", + "前端突击 - 前端面试训练营.md", + "考研陪跑 - 编程导航计狗上岸.md", + "求职 - 帮你写好简历的神器.md" + ], + }, +]; diff --git a/.vuepress/sidebars/programmingDictionarySideBar.ts b/.vuepress/sidebars/programmingDictionarySideBar.ts new file mode 100644 index 0000000..18a3be4 --- /dev/null +++ b/.vuepress/sidebars/programmingDictionarySideBar.ts @@ -0,0 +1,17 @@ +export default [ + "", + { + title: "Java", + collapsable: true, + children: [ + "Java/Java目录", + ], + }, + { + title: "学习指南", + collapsable: true, + children: [ + "学习指南/", + ], + }, +]; diff --git a/.vuepress/sidebars/programmingShareSideBar.ts b/.vuepress/sidebars/programmingShareSideBar.ts new file mode 100644 index 0000000..0fd457b --- /dev/null +++ b/.vuepress/sidebars/programmingShareSideBar.ts @@ -0,0 +1,80 @@ +export default [ + "", + { + title: "入门必看-学习路线", + collapsable: true, + children: [ + "入门必看-学习路线/" + ], + }, + { + title: "学习指南", + collapsable: true, + children: [ + "学习指南/", + ], + }, + { + title: "开发经验", + collapsable: true, + children: [ + "开发经验/", + ], + }, + { + title: "求职经验", + collapsable: true, + children: [ + "求职经验/", + ], + }, + { + title: "职场经验", + collapsable: true, + children: [ + "职场经验/", + ], + }, + { + title: "技术分享", + collapsable: true, + children: [ + "技术分享/", + ], + }, + { + title: "实战教程", + collapsable: true, + children: [ + "实战教程/", + ], + }, + { + title: "项目教程", + collapsable: true, + children: [ + "项目教程/", + ], + }, + { + title: "编程资源", + collapsable: true, + children: [ + "编程资源/", + ], + }, + { + title: "科技科普", + collapsable: true, + children: [ + "科技科普/", + ], + }, + { + title: "其他", + collapsable: true, + children: [ + "其他/", + ], + }, +]; diff --git a/.vuepress/sidebars/projectSideBar.ts b/.vuepress/sidebars/projectSideBar.ts new file mode 100644 index 0000000..7e5de17 --- /dev/null +++ b/.vuepress/sidebars/projectSideBar.ts @@ -0,0 +1,16 @@ +export default [ + "", + { + title: "项目实战", + collapsable: false, + children: [ + "OJ 判题系统", + "智能 BI 平台", + "聚合搜索平台", + "API 开放平台", + "伙伴匹配系统", + "用户中心项目", + "Java 后端万用项目模板", + ], + }, +]; diff --git a/.vuepress/sidebars/roadmapSideBar.ts b/.vuepress/sidebars/roadmapSideBar.ts new file mode 100644 index 0000000..a52bc19 --- /dev/null +++ b/.vuepress/sidebars/roadmapSideBar.ts @@ -0,0 +1,19 @@ +export default [ + "", + { + title: "学习路线", + collapsable: false, + children: [ + "Java学习路线 by 程序员鱼皮.md", + "前端学习路线 by 程序员鱼皮.md", + "C++学习路线 by 程序员鱼皮.md", + "Python学习路线 by 程序员鱼皮.md", + "数据结构和算法学习路线 by 程序员鱼皮.md", + "SQL免费实战自学网站 by 程序员鱼皮.md", + "计算机基础学习路线 by 程序员鱼皮.md", + "Git&GitHub学习路线 by 程序员鱼皮.md", + "设计模式学习路线 by 程序员鱼皮.md", + "Linux学习路线 by 程序员鱼皮.md", + ], + }, +]; diff --git a/.vuepress/sidebars/selfStudySideBar.ts b/.vuepress/sidebars/selfStudySideBar.ts new file mode 100644 index 0000000..2e3b843 --- /dev/null +++ b/.vuepress/sidebars/selfStudySideBar.ts @@ -0,0 +1,103 @@ +export default [ + "", + { + title: "大学经历", + collapsable: true, + children: [ + "大学经历/我学计算机的四年,共勉!.md", + "大学经历/从大学到秋招,我如何拿下腾讯offer.md", + "大学经历/大学,我是怎么边学编程边赚钱的?.md", + "大学经历/我大三时做的羞耻项目!.md", + "大学经历/鱼皮的考证经历.md", + "大学经历/鱼皮在实验室出版教材的经历.md", + "大学经历/鱼皮的毕业设计,时隔一年,仍感觉头秃.md", + "大学经历/鱼皮的毕业感受.md", + "大学经历/鱼皮落户上海心得.md" + ], + }, + { + title: "求职经历", + collapsable: true, + children: [ + "求职经历/我的第一份实习,坐高铁上班.md", + "求职经历/我的第二份实习,字节跳动.md", + "求职经历/他专业第一,却找不到工作.md", + "求职经历/面试阿里6次,仍然失败的经历.md" + ], + }, + { + title: "职场工作", + collapsable: true, + children: [ + "职场工作/Java开发者工作都做什么?.md", + "职场工作/我从导师身上学到了什么?.md", + "职场工作/我在腾讯的试用期总结.md", + "职场工作/我在腾讯和字节的工作感受.md", + "职场工作/我升级为云开发高级布道师啦.md", + "职场工作/我入职一年的感受.md", + "职场工作/离开学校后,我才明白.md", + "职场工作/我获得了腾讯内部竞赛第一名!.md", + "职场工作/鱼皮这个月就写了这点儿代码?.md", + "职场工作/这周没写代码,竟然在做这件事!.md", + "职场工作/工作后,我坚持了多年的习惯.md", + "职场工作/转行大数据1个月,我麻了。。。.md", + "职场工作/大厂做程序员两年半,我终于学会了。。。.md", + "职场工作/再见了,腾讯!.md", + ], + }, + { + title: "创作经历", + collapsable: true, + children: [ + "创作经历/毕业这年,我成为了一名UP主.md", + "创作经历/我也拥有了10万粉丝.md", + "创作经历/10w粉丝,我却哭了.md", + "创作经历/鱼皮工作+创作的日常生活.md", + "创作经历/二十四.md", + "创作经历/今天,我要搞件大事!.md", + "创作经历/我们搞了件大事!.md", + "创作经历/一次很意外的网站故障经历。.md", + "创作经历/一次面向UP主的团建.md", + "创作经历/“老师,我谢谢你!”.md", + "创作经历/我被最恨的公司采访了!.md", + "创作经历/帮阿里云拉新7000人,我输的很彻底!.md", + "创作经历/网站又被攻击,我心态崩了.md", + "创作经历/来了来了!.md", + ], + }, + { + title: "创业经历", + collapsable: true, + children: [ + "创业经历/公司太稳定了!我好慌.md", + "创业经历/创业一月半,不太习惯。。.md", + "创业经历/我们公司的企业文化!.md", + "创业经历/我们公司的招人方式,有点不一样!.md", + "创业经历/我在鱼厂的实习生活.md", + "创业经历/我开业了!.md", + "创业经历/没事别想不开去创业!.md", + "创业经历/美好的周末,又改了一天Bug。。.md", + "创业经历/面了个Java实习生,小伙很优秀!.md", + + ], + }, + { + title: "生活日常", + collapsable: true, + children: [ + "生活日常/2022,大家过得怎么样呢?.md", + "生活日常/休假结束,定个新目标!.md", + "生活日常/再聊聊这周的状态.md", + "生活日常/大家保重啊….md", + "生活日常/对不起,我不是一个自律的人.md", + "生活日常/开工第一天,我害怕了.md", + "生活日常/我放假啦!这22天干点啥呢.md", + "生活日常/我被隔离了!.md", + "生活日常/我阳过了,别担心!.md", + "生活日常/新年第一天,我就蚌埠住了!.md", + "生活日常/聊聊最近的状态吧.md", + "生活日常/都这个点儿了,这帮人竟然在。。。.md", + "生活日常/随便聊聊.md", + ], + }, +]; diff --git a/.vuepress/theme/components/AlgoliaSearchBox.vue b/.vuepress/theme/components/AlgoliaSearchBox.vue new file mode 100644 index 0000000..7071fb8 --- /dev/null +++ b/.vuepress/theme/components/AlgoliaSearchBox.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/.vuepress/theme/components/DropdownLink.vue b/.vuepress/theme/components/DropdownLink.vue new file mode 100644 index 0000000..d14eea9 --- /dev/null +++ b/.vuepress/theme/components/DropdownLink.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/.vuepress/theme/components/DropdownTransition.vue b/.vuepress/theme/components/DropdownTransition.vue new file mode 100644 index 0000000..eeaf12b --- /dev/null +++ b/.vuepress/theme/components/DropdownTransition.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/.vuepress/theme/components/ExtraSidebar.vue b/.vuepress/theme/components/ExtraSidebar.vue new file mode 100755 index 0000000..db883c5 --- /dev/null +++ b/.vuepress/theme/components/ExtraSidebar.vue @@ -0,0 +1,385 @@ + + + + + + diff --git a/.vuepress/theme/components/Footer.vue b/.vuepress/theme/components/Footer.vue new file mode 100644 index 0000000..a2154ab --- /dev/null +++ b/.vuepress/theme/components/Footer.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/.vuepress/theme/components/NavLinks.vue b/.vuepress/theme/components/NavLinks.vue new file mode 100644 index 0000000..2656ae2 --- /dev/null +++ b/.vuepress/theme/components/NavLinks.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/.vuepress/theme/components/Navbar.vue b/.vuepress/theme/components/Navbar.vue new file mode 100644 index 0000000..f8dd49c --- /dev/null +++ b/.vuepress/theme/components/Navbar.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/.vuepress/theme/components/Page.vue b/.vuepress/theme/components/Page.vue new file mode 100644 index 0000000..c67159c --- /dev/null +++ b/.vuepress/theme/components/Page.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/.vuepress/theme/components/PageSidebarToc.vue b/.vuepress/theme/components/PageSidebarToc.vue new file mode 100755 index 0000000..149a7ee --- /dev/null +++ b/.vuepress/theme/components/PageSidebarToc.vue @@ -0,0 +1,87 @@ + + + diff --git a/.vuepress/theme/components/PageSidebarTocLink.vue b/.vuepress/theme/components/PageSidebarTocLink.vue new file mode 100755 index 0000000..bc5c2c2 --- /dev/null +++ b/.vuepress/theme/components/PageSidebarTocLink.vue @@ -0,0 +1,140 @@ + + + diff --git a/.vuepress/theme/index.js b/.vuepress/theme/index.js new file mode 100755 index 0000000..9e9dcd7 --- /dev/null +++ b/.vuepress/theme/index.js @@ -0,0 +1,4 @@ +// .vuepress/theme/index.js +module.exports = { + extend: '@vuepress/theme-default' +} diff --git a/.vuepress/theme/layouts/Layout.vue b/.vuepress/theme/layouts/Layout.vue new file mode 100755 index 0000000..35d38c9 --- /dev/null +++ b/.vuepress/theme/layouts/Layout.vue @@ -0,0 +1,180 @@ + + + diff --git a/.vuepress/theme/styles/wrapper.styl b/.vuepress/theme/styles/wrapper.styl new file mode 100644 index 0000000..a99262c --- /dev/null +++ b/.vuepress/theme/styles/wrapper.styl @@ -0,0 +1,9 @@ +$wrapper + max-width $contentWidth + margin 0 auto + padding 2rem 2.5rem + @media (max-width: $MQNarrow) + padding 2rem + @media (max-width: $MQMobileNarrow) + padding 1.5rem + diff --git a/.vuepress/theme/util/index.js b/.vuepress/theme/util/index.js new file mode 100755 index 0000000..91ca52f --- /dev/null +++ b/.vuepress/theme/util/index.js @@ -0,0 +1,245 @@ + +export const hashRE = /#.*$/ +export const extRE = /\.(md|html)$/ +export const endingSlashRE = /\/$/ +export const outboundRE = /^[a-z]+:/i + +export function normalize (path) { + return decodeURI(path) + .replace(hashRE, '') + .replace(extRE, '') +} + +export function getHash (path) { + const match = path.match(hashRE) + if (match) { + return match[0] + } +} + +export function isExternal (path) { + return outboundRE.test(path) +} + +export function isMailto (path) { + return /^mailto:/.test(path) +} + +export function isTel (path) { + return /^tel:/.test(path) +} + +export function ensureExt (path) { + if (isExternal(path)) { + return path + } + const hashMatch = path.match(hashRE) + const hash = hashMatch ? hashMatch[0] : '' + const normalized = normalize(path) + + if (endingSlashRE.test(normalized)) { + return path + } + return normalized + '.html' + hash +} + +export function isActive (route, path) { + const routeHash = decodeURIComponent(route.hash) + const linkHash = getHash(path) + if (linkHash && routeHash !== linkHash) { + return false + } + const routePath = normalize(route.path) + const pagePath = normalize(path) + return routePath === pagePath +} + +export function resolvePage (pages, rawPath, base) { + if (isExternal(rawPath)) { + return { + type: 'external', + path: rawPath + } + } + if (base) { + rawPath = resolvePath(rawPath, base) + } + const path = normalize(rawPath) + for (let i = 0; i < pages.length; i++) { + if (normalize(pages[i].regularPath) === path) { + return Object.assign({}, pages[i], { + type: 'page', + path: ensureExt(pages[i].path) + }) + } + } + console.error(`[vuepress] No matching page found for sidebar item "${rawPath}"`) + return {} +} + +function resolvePath (relative, base, append) { + const firstChar = relative.charAt(0) + if (firstChar === '/') { + return relative + } + + if (firstChar === '?' || firstChar === '#') { + return base + relative + } + + const stack = base.split('/') + + // remove trailing segment if: + // - not appending + // - appending to trailing slash (last segment is empty) + if (!append || !stack[stack.length - 1]) { + stack.pop() + } + + // resolve relative path + const segments = relative.replace(/^\//, '').split('/') + for (let i = 0; i < segments.length; i++) { + const segment = segments[i] + if (segment === '..') { + stack.pop() + } else if (segment !== '.') { + stack.push(segment) + } + } + + // ensure leading slash + if (stack[0] !== '') { + stack.unshift('') + } + + return stack.join('/') +} + +/** + * @param { Page } page + * @param { string } regularPath + * @param { SiteData } site + * @param { string } localePath + * @returns { SidebarGroup } + */ +export function resolveSidebarItems (page, regularPath, site, localePath) { + const { pages, themeConfig } = site + + const localeConfig = localePath && themeConfig.locales + ? themeConfig.locales[localePath] || themeConfig + : themeConfig + + const pageSidebarConfig = page.frontmatter.sidebar || localeConfig.sidebar || themeConfig.sidebar + if (pageSidebarConfig === 'auto') { + return resolveHeaders(page) + } + + const sidebarConfig = localeConfig.sidebar || themeConfig.sidebar + if (!sidebarConfig) { + return [] + } else { + const { base, config } = resolveMatchingConfig(regularPath, sidebarConfig) + if (config === 'auto') { + return resolveHeaders(page) + } + return config + ? config.map(item => resolveItem(item, pages, base)) + : [] + } +} + +/** + * @param { Page } page + * @returns { SidebarGroup } + */ +export function resolveHeaders (page) { + const headers = groupHeaders(page.headers || []) + return [{ + type: 'group', + collapsable: false, + title: page.title, + path: null, + children: headers.map(h => ({ + type: 'auto', + title: h.title, + basePath: page.path, + path: page.path + '#' + h.slug, + children: h.children || [] + })) + }] +} + +export function groupHeaders (headers) { + // group h3s under h2 + headers = headers.map(h => Object.assign({}, h)) + let lastH2 + headers.forEach(h => { + if (h.level === 2) { + lastH2 = h + } else if (lastH2) { + (lastH2.children || (lastH2.children = [])).push(h) + } + }) + return headers.filter(h => h.level === 2) +} + +export function resolveNavLinkItem (linkItem) { + return Object.assign(linkItem, { + type: linkItem.items && linkItem.items.length ? 'links' : 'link' + }) +} + +/** + * @param { Route } route + * @param { Array | Array | [link: string]: SidebarConfig } config + * @returns { base: string, config: SidebarConfig } + */ +export function resolveMatchingConfig (regularPath, config) { + if (Array.isArray(config)) { + return { + base: '/', + config: config + } + } + for (const base in config) { + if (ensureEndingSlash(regularPath).indexOf(encodeURI(base)) === 0) { + return { + base, + config: config[base] + } + } + } + return {} +} + +function ensureEndingSlash (path) { + return /(\.html|\/)$/.test(path) + ? path + : path + '/' +} + +function resolveItem (item, pages, base, groupDepth = 1) { + if (typeof item === 'string') { + return resolvePage(pages, item, base) + } else if (Array.isArray(item)) { + return Object.assign(resolvePage(pages, item[0], base), { + title: item[1] + }) + } else { + const children = item.children || [] + if (children.length === 0 && item.path) { + return Object.assign(resolvePage(pages, item.path, base), { + title: item.title + }) + } + return { + type: 'group', + path: item.path, + title: item.title, + sidebarDepth: item.sidebarDepth, + initialOpenGroupIndex: item.initialOpenGroupIndex, + children: children.map(child => resolveItem(child, pages, base, groupDepth + 1)), + collapsable: item.collapsable !== false + } + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..9eca436 --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +--- +permalink: / +--- + +# 鱼皮的编程宝典 + +> 贴心的编程学习路线,全面的编程知识百科 +> +> 作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +## 本站内容 + +- [编程学习路线](/学习路线) +- [鱼皮的编程学习之路](/自学之路) +- [编程干货分享](/编程分享) +- [原创项目实战](/项目实战) +- [技术知识分享](/知识碎片) +- [编程导航星球](/编程导航) +- [编程产品服务](/产品服务) +- [作者介绍](/作者) diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..27a57ff --- /dev/null +++ b/package-lock.json @@ -0,0 +1,27214 @@ +{ + "name": "codefather", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "codefather", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "vuepress-plugin-code-copy": "^1.0.6", + "vuepress-plugin-img-lazy": "^1.0.4" + }, + "devDependencies": { + "@vuepress/plugin-back-to-top": "^1.9.10", + "@vuepress/plugin-google-analytics": "^1.9.10", + "@vuepress/plugin-medium-zoom": "^1.9.10", + "vuepress": "^1.9.10", + "vuepress-plugin-baidu-autopush": "^1.0.1", + "vuepress-plugin-feed": "^0.1.9", + "vuepress-plugin-seo": "^0.1.4", + "vuepress-plugin-sitemap": "^2.3.1", + "vuepress-plugin-tags": "^1.0.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true, + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", + "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", + "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/highlight.js": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", + "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", + "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.3.tgz", + "integrity": "sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/highlight.js": "^9.7.0", + "@types/linkify-it": "*", + "@types/mdurl": "*", + "highlight.js": "^9.7.0" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", + "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.3.tgz", + "integrity": "sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.25.1" + } + }, + "node_modules/@types/q": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", + "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/send/node_modules/@types/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/serve-static": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.4.tgz", + "integrity": "sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.10.tgz", + "integrity": "sha512-q8F20SdXG5fdVJQ5yxsVlH+f+oekP42QeHv4s5KlrxTMT0eopXn7ol1rhxMcksf8ph7XNv811iVDE2hOpUvEPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uglify-js": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.3.tgz", + "integrity": "sha512-ToldSfJ6wxO21cakcz63oFD1GjqQbKzhZCD57eH7zWuYT5UEZvfUoqvrjX5d+jB9g4a/sFO0n6QSVzzn5sMsjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.35", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.35.tgz", + "integrity": "sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@types/webpack-dev-server/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/babel-plugin-jsx/node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-preset-app": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.19.tgz", + "integrity": "sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + }, + "peerDependencies": { + "@babel/core": "*", + "core-js": "^3", + "vue": "^2 || ^3.0.0-0" + }, + "peerDependenciesMeta": { + "core-js": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0", + "vue": "*" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-sfc/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vue/compiler-sfc/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "optionalDependencies": { + "prettier": "^1.18.2 || ^2.0.0" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/@vue/component-compiler-utils/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@vuepress/core": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.10.tgz", + "integrity": "sha512-H9ddo5fSinPb8QYl8OJFbZikMpOW84bm/U3Drzz8CnCXNtpda7CU2wX/XzOhe98G8jp45xhtZRkxOrqzBBAShA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.9.10", + "@vuepress/markdown-loader": "1.9.10", + "@vuepress/plugin-last-updated": "1.9.10", + "@vuepress/plugin-register-components": "1.9.10", + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "bundle-require": "2.1.8", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "esbuild": "0.14.7", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", + "webpackbar": "3.2.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@vuepress/markdown": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", + "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/shared-utils": "1.9.10", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "node_modules/@vuepress/markdown-loader": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.10.tgz", + "integrity": "sha512-94BlwKc+lOaN/A5DkyA9KWHvMlMC1sWunAXE3Tv0WYzgYLDs9QqCsx7L5kLkpcOOVVm/8kBJumnXvVBwhqJddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/markdown": "1.9.10", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "node_modules/@vuepress/plugin-active-header-links": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.10.tgz", + "integrity": "sha512-2dRr3DE2UBFXhyMtLR3sGTdRyDM8YStuY6AOoQmoSgwy1IHt7PO7ypOuf1akF+1Nv8Q2aISU06q6TExZouu3Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10", + "lodash.debounce": "^4.0.8" + } + }, + "node_modules/@vuepress/plugin-back-to-top": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.10.tgz", + "integrity": "sha512-iInIp66wu717CAnT2pyd9Bs/vAgrUBOBIQ7WMnfJo07cW/ZIothpyrSHnpCRSsfJ/jLivMPqW0pviqppt64BzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10", + "lodash.debounce": "^4.0.8" + } + }, + "node_modules/@vuepress/plugin-google-analytics": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-google-analytics/-/plugin-google-analytics-1.9.10.tgz", + "integrity": "sha512-AyQ3IFbYIHhuTQCUBMez6qpgvqOYT05cVoxuezuCpmBQBp+xSDjTXB+C9YjP+5w3thY5x1K+13QPJfFWW8S0mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10" + } + }, + "node_modules/@vuepress/plugin-last-updated": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.10.tgz", + "integrity": "sha512-YxzWGF/OfU6WsHSynZFn74NGGp7dY27Bjy9JyyFo8wF5+2V1gpyDjveHKHGKugS/pMXlxfjzhv9E2Wmy9R7Iog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10", + "cross-spawn": "^6.0.5" + } + }, + "node_modules/@vuepress/plugin-medium-zoom": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", + "integrity": "sha512-/MsICWZ/mUTs+ZdqqA1AVtWAtNL5ksgnnGR2X24LnXaPJp+M1IB2ETcyNKh264YVODSrmVsS/Y+kbCRK0qKkdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10", + "medium-zoom": "^1.0.4" + } + }, + "node_modules/@vuepress/plugin-nprogress": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", + "integrity": "sha512-I1kkm6yWUQd7vwiV3lEDVpVP0Lr04K0zlczU502lDUa1RufSZ7vt+mlF5fOM28GqT+pKTEToWmm+VNT/R3qvMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10", + "nprogress": "^0.2.0" + } + }, + "node_modules/@vuepress/plugin-register-components": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", + "integrity": "sha512-sgdJ5OydTPZAoTkselpvVP3Xsd6bfZ0FpaxOTinal0gJ99h49lvLu9bvzMx13rdGRFO/kRXn0qQQpwKTAfTPqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10" + } + }, + "node_modules/@vuepress/plugin-search": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", + "integrity": "sha512-bn2XJikaRgQZXvu8upCjOWrxbLHIRTqnJ3w7G0mo6jCYWGVsHNo6XhVpqylpLR2PWnHT/ImO2bGo38/5Bag/tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/types": "1.9.10" + } + }, + "node_modules/@vuepress/shared-utils": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", + "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + } + }, + "node_modules/@vuepress/shared-utils/node_modules/globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vuepress/shared-utils/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@vuepress/shared-utils/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@vuepress/theme-default": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.10.tgz", + "integrity": "sha512-XnXn9t+pYCIhWi3cZXJlighuy93FFm5yXdISAAlFlcNkshuGtqamkjacHV8q/QZMfOhSIs6wX7Hj88u2IsT5mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/plugin-active-header-links": "1.9.10", + "@vuepress/plugin-nprogress": "1.9.10", + "@vuepress/plugin-search": "1.9.10", + "@vuepress/types": "1.9.10", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" + } + }, + "node_modules/@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/algoliasearch/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/algoliasearch/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true, + "license": "ISC" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "^3.2.3" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/babel-loader/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/babel-loader/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, + "license": "MIT" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/boxen/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-rsa/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bundle-require": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-2.1.8.tgz", + "integrity": "sha512-oOEg3A0hy/YzvNWNowtKD0pmhZKseOFweCbgyMqTIih4gRY1nJWsvrOCT27L9NbIyL5jMjTFrAUpGxxpW68Puw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "esbuild": ">=0.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001551", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", + "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/chokidar/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/chokidar/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true, + "license": "MIT" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bluebird": "^3.1.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/core-js": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", + "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", + "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.22.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/cross-spawn/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.561", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.561.tgz", + "integrity": "sha512-eS5t4ulWOBfVHdq9SW2dxEaFarj1lPjvJ8PaYMOjY0DecBaj/t4ARziL2IPpDr4atyWwjLFGQ2vo/VCgQFezVQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esprima": "^4.0.0", + "through": "~2.3.4" + }, + "bin": { + "envify": "bin/envify" + } + }, + "node_modules/envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.7.tgz", + "integrity": "sha512-+u/msd6iu+HvfysUPkZ9VHm83LImmSNnecYPfFI01pQ7TTcsFR+V0BkybZX7mPtIaI7LCrse6YRj+v3eraJSgw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.7", + "esbuild-darwin-64": "0.14.7", + "esbuild-darwin-arm64": "0.14.7", + "esbuild-freebsd-64": "0.14.7", + "esbuild-freebsd-arm64": "0.14.7", + "esbuild-linux-32": "0.14.7", + "esbuild-linux-64": "0.14.7", + "esbuild-linux-arm": "0.14.7", + "esbuild-linux-arm64": "0.14.7", + "esbuild-linux-mips64le": "0.14.7", + "esbuild-linux-ppc64le": "0.14.7", + "esbuild-netbsd-64": "0.14.7", + "esbuild-openbsd-64": "0.14.7", + "esbuild-sunos-64": "0.14.7", + "esbuild-windows-32": "0.14.7", + "esbuild-windows-64": "0.14.7", + "esbuild-windows-arm64": "0.14.7" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.7.tgz", + "integrity": "sha512-68e7COhmwIiLXBEyxUxZSSU0akgv8t3e50e2QOtKdBUE0F6KIRISzFntLe2rYlNqSsjGWsIO6CCc9tQxijjSkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", + "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "luxon": "^1.3.3", + "xml": "^1.0.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true, + "license": "ISC" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-cache-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true, + "license": "MIT" + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "dev": true, + "license": "BSD" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "1.3.7" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dev": true, + "dependencies": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "bin": { + "hulk": "bin/hulk" + } + }, + "node_modules/hogan.js/node_modules/mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "dev": true, + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true, + "license": "MIT" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true, + "license": "ISC" + }, + "node_modules/icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true, + "license": "MIT" + }, + "node_modules/immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-from": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "dev": true, + "license": "MIT" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true, + "license": "ISC" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true, + "license": "ISC" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "dev": true, + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "node_modules/lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "node_modules/lodash.trimend": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", + "integrity": "sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.trimstart": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", + "integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/luxon": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", + "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "markdown-it": "*" + } + }, + "node_modules/markdown-it-chain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", + "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "webpack-chain": "^4.9.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "markdown-it": ">=5.0.0" + } + }, + "node_modules/markdown-it-chain/node_modules/javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-chain/node_modules/webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + }, + "node_modules/markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha512-IxPOaq2LzrGuFGyYq80zaorXReh2ZHGFOB1/Hen429EJL1XkPI3FJTpx9TsJeua+j2qTru4h3W1TiCRdeivMmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it-img-lazy": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-img-lazy/-/markdown-it-img-lazy-1.0.3.tgz", + "integrity": "sha512-H1wOixBCI8Jm9vxn5f5lsDsTdhG8HxLiC5eh5TjVe/Dv//zwAi/R5+WSpRYmQtyc1+RF1kS4cuLPt1wGid0xWA==", + "license": "MIT" + }, + "node_modules/markdown-it-imsize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz", + "integrity": "sha512-5SH90ademqcR8ifQCBXRCfIR4HGfZZOh5pO0j2TglulfSQH+SBXM4Iw/QlTUbSoUwVZArCYgECoMvktDS2kP3w==", + "license": "MIT" + }, + "node_modules/markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">6.4.0" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/medium-zoom": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.8.tgz", + "integrity": "sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==", + "dev": true, + "license": "MIT" + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true, + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/node-libs-browser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true, + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "license": "MIT", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "license": "ISC", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "license": "MIT", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true, + "license": "MIT" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.1.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "license": "MIT", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-markdown": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", + "integrity": "sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true, + "license": "ISC" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true, + "license": "ISC" + }, + "node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "license": "(MIT AND BSD-3-Clause)", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", + "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.chunk": "^4.2.0", + "lodash.padstart": "^4.6.1", + "whatwg-url": "^7.0.0", + "xmlbuilder": "^13.0.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=4.0.0" + } + }, + "node_modules/slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/smoothscroll-polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", + "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://tidelift.com/funding/github/npm/sockjs-client" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sockjs-client/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/sockjs/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sort-keys/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy-transport/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/spdy/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/spdy/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.1.1" + } + }, + "node_modules/std-env/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha512-3HVl+cOkJOlNUDAYdoCAfGx/fzUzG53YvJAl3RYlTvAcBdPqSp1Uv4wrmHymm7oEypTijSQqcqplW8cz0/r/YA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + }, + "peerDependencies": { + "stylus": ">=0.52.4" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/svgo/node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/svgo/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/svgo/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/svgo/node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/svgo/node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/svgo/node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha512-JVYrY42wMG7ddf+wBUQR/uHGbjUHZbLisJ8N62AMm0iTZ0p8YTcZLzdtomU0+H+wa99VbkyvQGB3zxB7NDzgIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-js/node_modules/commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true, + "license": "MIT" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-browserslist-db/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true, + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + } + }, + "node_modules/url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true, + "license": "ISC" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/verror/node_modules/extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "node_modules/vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-loader": { + "version": "15.11.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "peerDependencies": { + "css-loader": "*", + "webpack": "^3.0.0 || ^4.1.0 || ^5.0.0-0" + }, + "peerDependenciesMeta": { + "cache-loader": { + "optional": true + }, + "prettier": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-server-renderer": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.7.14.tgz", + "integrity": "sha512-NlGFn24tnUrj7Sqb8njhIhWREuCJcM3140aMunLNcx951BHG8j3XOrPP7psSCaFA8z6L4IWEjudztdwTp1CBVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "hash-sum": "^2.0.0", + "he": "^1.2.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.22.0", + "serialize-javascript": "^6.0.0", + "source-map": "0.5.6" + } + }, + "node_modules/vue-server-renderer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/vue-server-renderer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/vue-server-renderer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/vue-server-renderer/node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue-server-renderer/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/vue-server-renderer/node_modules/source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vuepress": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.10.tgz", + "integrity": "sha512-UnGm9vjQvG918SZVNvgiUlNimLqawdYPq0aPRXDpEB1VksvqegVFy/GKdA8ShXJaEpOMPSt7YD4uK21jaMs3kA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@vuepress/core": "1.9.10", + "@vuepress/theme-default": "1.9.10", + "@vuepress/types": "1.9.10", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "bin": { + "vuepress": "cli.js" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/vuepress-html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vuepress-html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, + "node_modules/vuepress-plugin-baidu-autopush": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-baidu-autopush/-/vuepress-plugin-baidu-autopush-1.0.1.tgz", + "integrity": "sha512-KVQkrmMgPY+GG8dtI2wcRxUv1n2h5DM8aFs75ltsSlFBSS9C/vfLb2LmywXAsoCXk2EHya2p66cpn7BxofK+Mw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vuepress-plugin-code-copy": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vuepress-plugin-code-copy/-/vuepress-plugin-code-copy-1.0.6.tgz", + "integrity": "sha512-FiqwMtlb4rEsOI56O6sSkekcd3SlESxbkR2IaTIQxsMOMoalKfW5R9WlR1Pjm10v6jmU661Ex8MR11k9IzrNUg==", + "license": "GPL-3.0-or-later" + }, + "node_modules/vuepress-plugin-container": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" + } + }, + "node_modules/vuepress-plugin-feed": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/vuepress-plugin-feed/-/vuepress-plugin-feed-0.1.9.tgz", + "integrity": "sha512-iOJkR7zPmJAX0TEVdxNsUT07xNQB6lZFpU7DqsYzO01FhaPkMOOVM5Vx5a/iOOuOggAeoI9H9yuah+cRmCImlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "feed": "2.0.4", + "lodash.defaultsdeep": "4.6.1", + "lodash.isempty": "4.4.0", + "lodash.trimend": "^4.5.1", + "lodash.trimstart": "^4.5.1", + "remove-markdown": "0.3.0", + "striptags": "3.1.1" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "vuepress": "1.x" + } + }, + "node_modules/vuepress-plugin-img-lazy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-img-lazy/-/vuepress-plugin-img-lazy-1.0.4.tgz", + "integrity": "sha512-4mMIy3vZzNZupFuohPKlOHGd0rNZEMEHEyN8b2M3j1yBANrkhGg1wNnpsdpe7ZnLdtVpxH3JQT7a3TDdxLLFmQ==", + "license": "MIT", + "dependencies": { + "markdown-it-img-lazy": "^1.0.2", + "markdown-it-imsize": "^2.0.1" + } + }, + "node_modules/vuepress-plugin-seo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-seo/-/vuepress-plugin-seo-0.1.4.tgz", + "integrity": "sha512-foNKrAAKihiC47bx0UXFzs/+BIFmnowTQsLVF/8pfsnsPDp8FXjkTGyjxyjOhbwj7ADPv32CdX3pEoYGnZ7OjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vuepress-plugin-sitemap": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-sitemap/-/vuepress-plugin-sitemap-2.3.1.tgz", + "integrity": "sha512-n+8lbukhrKrsI9H/EX0EBgkE1pn85LAQFvQ5dIvrZP4Kz6JxPOPPNTQmZMhahQV1tXbLZQCEN7A1WZH4x+arJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sitemap": "^3.0.0" + }, + "bin": { + "vuepress-sitemap": "cli.js" + }, + "peerDependencies": { + "chalk": "^2.0.0", + "commander": "^2.0.0", + "esm": "^3.0.0" + } + }, + "node_modules/vuepress-plugin-smooth-scroll": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", + "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "smoothscroll-polyfill": "^0.4.3" + } + }, + "node_modules/vuepress-plugin-tags": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-tags/-/vuepress-plugin-tags-1.0.2.tgz", + "integrity": "sha512-6BL53cnZ72ZOlYDlhsE92sIZCzuNHoVLtWDeFd36Gw7eoQuuR3Rk95ND8EHsgSo26SSPo1/H+zyYtzXecdyD+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack/node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "optional": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/watchpack/node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/watchpack/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/watchpack/node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/watchpack/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/watchpack/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/watchpack/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/webpack": { + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha512-d1VUP9F96w664lKINMGeElWdhhb5sC+thXM+ydZGU3ZnaE09Wv6FaS+mpM9570kcDs/xMfcXJBTLsMdHEFYY9Q==", + "dev": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/widest-line/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true, + "license": "MIT" + }, + "node_modules/xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha512-C1x6lfvBICFTQIMgbt3JqMOno3VOtkWat/xEakLTOurskYIHPmzJrzd1e8BnmtdDVJlGuk5D+FxyCA8MPmkIyA==", + "dev": true, + "license": "MIT" + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "requires": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + } + }, + "@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "dev": true + }, + "@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", + "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true + }, + "@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dev": true, + "requires": { + "@babel/types": "^7.23.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.15" + } + }, + "@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" + } + }, + "@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + } + }, + "@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" + } + }, + "@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dev": true, + "requires": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + } + }, + "@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-proposal-decorators": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", + "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "requires": {} + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-decorators": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", + "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", + "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/preset-env": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", + "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.23.2", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.23.2", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.23.0", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.23.0", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.23.0", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-modules-systemjs": "^7.23.0", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.23.0", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.23.0", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + } + }, + "@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, + "@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + } + }, + "@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + } + }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "dev": true, + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dev": true, + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/body-parser": { + "version": "1.19.4", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", + "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/connect": { + "version": "3.4.37", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", + "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.2.tgz", + "integrity": "sha512-gX2j9x+NzSh4zOhnRPSdPPmTepS4DfxES0AvIFv3jGv5QyeAJf6u6dY5/BAoAJU9Qq1uTvwOku8SSC2GnCRl6Q==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/express": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", + "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.39", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", + "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/highlight.js": { + "version": "9.12.4", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz", + "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==", + "dev": true + }, + "@types/http-errors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "dev": true + }, + "@types/http-proxy": { + "version": "1.17.13", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.13.tgz", + "integrity": "sha512-GkhdWcMNiR5QSQRYnJ+/oXzu0+7JJEPC8vkWXK351BkhjraZF+1W13CUYARUvX9+NqIU2n6YHA4iwywsc/M6Sw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "@types/linkify-it": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.4.tgz", + "integrity": "sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ==", + "dev": true + }, + "@types/markdown-it": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.3.tgz", + "integrity": "sha512-daHJk22isOUvNssVGF2zDnnSyxHhFYhtjeX4oQaKD6QzL3ZR1QSgiD1g+Q6/WSWYVogNXYDXODtbgW/WiFCtyw==", + "dev": true, + "requires": { + "@types/highlight.js": "^9.7.0", + "@types/linkify-it": "*", + "@types/mdurl": "*", + "highlight.js": "^9.7.0" + } + }, + "@types/mdurl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.4.tgz", + "integrity": "sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A==", + "dev": true + }, + "@types/mime": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.3.tgz", + "integrity": "sha512-i8MBln35l856k5iOhKk2XJ4SeAWg75mLIpZB4v6imOagKL6twsukBZGDMNhdOVk7yRFTMPpfILocMos59Q1otQ==", + "dev": true + }, + "@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "@types/node": { + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "requires": { + "undici-types": "~5.25.1" + } + }, + "@types/q": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.7.tgz", + "integrity": "sha512-HBPgtzp44867rkL+IzQ3560/E/BlobwCjeXsuKqogrcE99SKgZR4tvBBCuNJZMhUFMz26M7cjKWZg785lllwpA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.9", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "dev": true + }, + "@types/send": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", + "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + }, + "dependencies": { + "@types/mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "dev": true + } + } + }, + "@types/serve-static": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", + "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "dev": true, + "requires": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.4.tgz", + "integrity": "sha512-Kdfm7Sk5VX8dFW7Vbp18+fmAatBewzBILa1raHYxrGEFXT0jNl9x3LWfuW7bTbjEKFNey9Dfkj/UzT6z/NvRlg==", + "dev": true + }, + "@types/tapable": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.10.tgz", + "integrity": "sha512-q8F20SdXG5fdVJQ5yxsVlH+f+oekP42QeHv4s5KlrxTMT0eopXn7ol1rhxMcksf8ph7XNv811iVDE2hOpUvEPg==", + "dev": true + }, + "@types/uglify-js": { + "version": "3.17.3", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.3.tgz", + "integrity": "sha512-ToldSfJ6wxO21cakcz63oFD1GjqQbKzhZCD57eH7zWuYT5UEZvfUoqvrjX5d+jB9g4a/sFO0n6QSVzzn5sMsjg==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "@types/webpack": { + "version": "4.41.35", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.35.tgz", + "integrity": "sha512-XRC6HLGHtNfN8/xWeu1YUQV1GSE+28q8lSqvcJ+0xt/zW9Wmn4j9pCSvaXPyRlCKrl5OuqECQNEJUy2vo8oWqg==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "@types/webpack-dev-server": { + "version": "3.11.6", + "resolved": "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz", + "integrity": "sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==", + "dev": true, + "requires": { + "@types/connect-history-api-fallback": "*", + "@types/express": "*", + "@types/serve-static": "*", + "@types/webpack": "^4", + "http-proxy-middleware": "^1.0.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "http-proxy-middleware": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "@types/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-acCzhuVe+UJy8abiSFQWXELhhNMZjQjQKpLNEi1pKGgKXZj0ul614ATcx4kkhunPost6Xw+aCq8y8cn1/WwAiA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "@vue/babel-helper-vue-jsx-merge-props": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz", + "integrity": "sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA==", + "dev": true + }, + "@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", + "dev": true + }, + "@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true + }, + "html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true + } + } + }, + "@vue/babel-plugin-transform-vue-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz", + "integrity": "sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "html-tags": "^2.0.0", + "lodash.kebabcase": "^4.1.1", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-preset-app": { + "version": "4.5.19", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-4.5.19.tgz", + "integrity": "sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==", + "dev": true, + "requires": { + "@babel/core": "^7.11.0", + "@babel/helper-compilation-targets": "^7.9.6", + "@babel/helper-module-imports": "^7.8.3", + "@babel/plugin-proposal-class-properties": "^7.8.3", + "@babel/plugin-proposal-decorators": "^7.8.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-jsx": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.11.0", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.0", + "@vue/babel-plugin-jsx": "^1.0.3", + "@vue/babel-preset-jsx": "^1.2.4", + "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", + "core-js-compat": "^3.6.5", + "semver": "^6.1.0" + } + }, + "@vue/babel-preset-jsx": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz", + "integrity": "sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==", + "dev": true, + "requires": { + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "@vue/babel-sugar-composition-api-inject-h": "^1.4.0", + "@vue/babel-sugar-composition-api-render-instance": "^1.4.0", + "@vue/babel-sugar-functional-vue": "^1.4.0", + "@vue/babel-sugar-inject-h": "^1.4.0", + "@vue/babel-sugar-v-model": "^1.4.0", + "@vue/babel-sugar-v-on": "^1.4.0" + } + }, + "@vue/babel-sugar-composition-api-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz", + "integrity": "sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-composition-api-render-instance": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz", + "integrity": "sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-functional-vue": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz", + "integrity": "sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-inject-h": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz", + "integrity": "sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0" + } + }, + "@vue/babel-sugar-v-model": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz", + "integrity": "sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0", + "html-tags": "^2.0.0", + "svg-tags": "^1.0.0" + } + }, + "@vue/babel-sugar-v-on": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz", + "integrity": "sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA==", + "dev": true, + "requires": { + "@babel/plugin-syntax-jsx": "^7.2.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.4.0", + "camelcase": "^5.0.0" + } + }, + "@vue/compiler-sfc": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", + "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "dev": true, + "requires": { + "@babel/parser": "^7.18.4", + "postcss": "^8.4.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "dev": true, + "requires": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + } + } + }, + "@vue/component-compiler-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz", + "integrity": "sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==", + "dev": true, + "requires": { + "consolidate": "^0.15.1", + "hash-sum": "^1.0.2", + "lru-cache": "^4.1.2", + "merge-source-map": "^1.1.0", + "postcss": "^7.0.36", + "postcss-selector-parser": "^6.0.2", + "prettier": "^1.18.2 || ^2.0.0", + "source-map": "~0.6.1", + "vue-template-es2015-compiler": "^1.9.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + } + } + }, + "@vuepress/core": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.10.tgz", + "integrity": "sha512-H9ddo5fSinPb8QYl8OJFbZikMpOW84bm/U3Drzz8CnCXNtpda7CU2wX/XzOhe98G8jp45xhtZRkxOrqzBBAShA==", + "dev": true, + "requires": { + "@babel/core": "^7.8.4", + "@vue/babel-preset-app": "^4.1.2", + "@vuepress/markdown": "1.9.10", + "@vuepress/markdown-loader": "1.9.10", + "@vuepress/plugin-last-updated": "1.9.10", + "@vuepress/plugin-register-components": "1.9.10", + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10", + "autoprefixer": "^9.5.1", + "babel-loader": "^8.0.4", + "bundle-require": "2.1.8", + "cache-loader": "^3.0.0", + "chokidar": "^2.0.3", + "connect-history-api-fallback": "^1.5.0", + "copy-webpack-plugin": "^5.0.2", + "core-js": "^3.6.4", + "cross-spawn": "^6.0.5", + "css-loader": "^2.1.1", + "esbuild": "0.14.7", + "file-loader": "^3.0.1", + "js-yaml": "^3.13.1", + "lru-cache": "^5.1.1", + "mini-css-extract-plugin": "0.6.0", + "optimize-css-assets-webpack-plugin": "^5.0.1", + "portfinder": "^1.0.13", + "postcss-loader": "^3.0.0", + "postcss-safe-parser": "^4.0.1", + "toml": "^3.0.0", + "url-loader": "^1.0.1", + "vue": "^2.6.10", + "vue-loader": "^15.7.1", + "vue-router": "^3.4.5", + "vue-server-renderer": "^2.6.10", + "vue-template-compiler": "^2.6.10", + "vuepress-html-webpack-plugin": "^3.2.0", + "vuepress-plugin-container": "^2.0.2", + "webpack": "^4.8.1", + "webpack-chain": "^6.0.0", + "webpack-dev-server": "^3.5.1", + "webpack-merge": "^4.1.2", + "webpackbar": "3.2.0" + } + }, + "@vuepress/markdown": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", + "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.9.10", + "markdown-it": "^8.4.1", + "markdown-it-anchor": "^5.0.2", + "markdown-it-chain": "^1.3.0", + "markdown-it-emoji": "^1.4.0", + "markdown-it-table-of-contents": "^0.4.0", + "prismjs": "^1.13.0" + } + }, + "@vuepress/markdown-loader": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.10.tgz", + "integrity": "sha512-94BlwKc+lOaN/A5DkyA9KWHvMlMC1sWunAXE3Tv0WYzgYLDs9QqCsx7L5kLkpcOOVVm/8kBJumnXvVBwhqJddw==", + "dev": true, + "requires": { + "@vuepress/markdown": "1.9.10", + "loader-utils": "^1.1.0", + "lru-cache": "^5.1.1" + } + }, + "@vuepress/plugin-active-header-links": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.10.tgz", + "integrity": "sha512-2dRr3DE2UBFXhyMtLR3sGTdRyDM8YStuY6AOoQmoSgwy1IHt7PO7ypOuf1akF+1Nv8Q2aISU06q6TExZouu3Mw==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10", + "lodash.debounce": "^4.0.8" + } + }, + "@vuepress/plugin-back-to-top": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.10.tgz", + "integrity": "sha512-iInIp66wu717CAnT2pyd9Bs/vAgrUBOBIQ7WMnfJo07cW/ZIothpyrSHnpCRSsfJ/jLivMPqW0pviqppt64BzQ==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10", + "lodash.debounce": "^4.0.8" + } + }, + "@vuepress/plugin-google-analytics": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-google-analytics/-/plugin-google-analytics-1.9.10.tgz", + "integrity": "sha512-AyQ3IFbYIHhuTQCUBMez6qpgvqOYT05cVoxuezuCpmBQBp+xSDjTXB+C9YjP+5w3thY5x1K+13QPJfFWW8S0mA==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10" + } + }, + "@vuepress/plugin-last-updated": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.10.tgz", + "integrity": "sha512-YxzWGF/OfU6WsHSynZFn74NGGp7dY27Bjy9JyyFo8wF5+2V1gpyDjveHKHGKugS/pMXlxfjzhv9E2Wmy9R7Iog==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10", + "cross-spawn": "^6.0.5" + } + }, + "@vuepress/plugin-medium-zoom": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", + "integrity": "sha512-/MsICWZ/mUTs+ZdqqA1AVtWAtNL5ksgnnGR2X24LnXaPJp+M1IB2ETcyNKh264YVODSrmVsS/Y+kbCRK0qKkdg==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10", + "medium-zoom": "^1.0.4" + } + }, + "@vuepress/plugin-nprogress": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", + "integrity": "sha512-I1kkm6yWUQd7vwiV3lEDVpVP0Lr04K0zlczU502lDUa1RufSZ7vt+mlF5fOM28GqT+pKTEToWmm+VNT/R3qvMQ==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10", + "nprogress": "^0.2.0" + } + }, + "@vuepress/plugin-register-components": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", + "integrity": "sha512-sgdJ5OydTPZAoTkselpvVP3Xsd6bfZ0FpaxOTinal0gJ99h49lvLu9bvzMx13rdGRFO/kRXn0qQQpwKTAfTPqA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10" + } + }, + "@vuepress/plugin-search": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", + "integrity": "sha512-bn2XJikaRgQZXvu8upCjOWrxbLHIRTqnJ3w7G0mo6jCYWGVsHNo6XhVpqylpLR2PWnHT/ImO2bGo38/5Bag/tQ==", + "dev": true, + "requires": { + "@vuepress/types": "1.9.10" + } + }, + "@vuepress/shared-utils": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", + "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==", + "dev": true, + "requires": { + "chalk": "^2.3.2", + "escape-html": "^1.0.3", + "fs-extra": "^7.0.1", + "globby": "^9.2.0", + "gray-matter": "^4.0.1", + "hash-sum": "^1.0.2", + "semver": "^6.0.0", + "toml": "^3.0.0", + "upath": "^1.1.0" + }, + "dependencies": { + "globby": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + } + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@vuepress/theme-default": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.10.tgz", + "integrity": "sha512-XnXn9t+pYCIhWi3cZXJlighuy93FFm5yXdISAAlFlcNkshuGtqamkjacHV8q/QZMfOhSIs6wX7Hj88u2IsT5mw==", + "dev": true, + "requires": { + "@vuepress/plugin-active-header-links": "1.9.10", + "@vuepress/plugin-nprogress": "1.9.10", + "@vuepress/plugin-search": "1.9.10", + "@vuepress/types": "1.9.10", + "docsearch.js": "^2.5.2", + "lodash": "^4.17.15", + "stylus": "^0.54.8", + "stylus-loader": "^3.0.2", + "vuepress-plugin-container": "^2.0.2", + "vuepress-plugin-smooth-scroll": "^0.0.3" + } + }, + "@vuepress/types": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", + "dev": true, + "requires": { + "@types/markdown-it": "^10.0.0", + "@types/webpack-dev-server": "^3", + "webpack-chain": "^6.0.0" + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "agentkeepalive": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz", + "integrity": "sha512-TnB6ziK363p7lR8QpeLC8aMr8EGYBKZTpgzQLfqTs3bR0Oo5VbKdwKf8h0dSzsYrB7lSCgfJnMZKqShvlq5Oyg==", + "dev": true + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true, + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "algoliasearch": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-3.35.1.tgz", + "integrity": "sha512-K4yKVhaHkXfJ/xcUnil04xiSrB8B8yHZoFEhWNpXg23eiCnqvTZw1tn/SqvdsANlYHLJlKl0qi3I/Q2Sqo7LwQ==", + "dev": true, + "requires": { + "agentkeepalive": "^2.2.0", + "debug": "^2.6.9", + "envify": "^4.0.0", + "es6-promise": "^4.1.0", + "events": "^1.1.0", + "foreach": "^2.0.5", + "global": "^4.3.2", + "inherits": "^2.0.1", + "isarray": "^2.0.1", + "load-script": "^1.0.0", + "object-keys": "^1.0.11", + "querystring-es3": "^0.2.1", + "reduce": "^1.0.1", + "semver": "^5.1.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==", + "dev": true + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "array.prototype.reduce": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + } + }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "assert": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", + "dev": true, + "requires": { + "object.assign": "^4.1.4", + "util": "^0.10.4" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autocomplete.js": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.36.0.tgz", + "integrity": "sha512-jEwUXnVMeCHHutUt10i/8ZiRaCb0Wo+ZyKxeGsYwBDtw6EJHqEeDrq4UwZRD8YBSvp3g6klP678il2eeiVXN2Q==", + "dev": true, + "requires": { + "immediate": "^3.2.3" + } + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + } + } + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", + "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.3", + "semver": "^6.3.1" + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", + "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3", + "core-js-compat": "^3.32.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", + "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.4.3" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + } + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true + }, + "bundle-require": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-2.1.8.tgz", + "integrity": "sha512-oOEg3A0hy/YzvNWNowtKD0pmhZKseOFweCbgyMqTIih4gRY1nJWsvrOCT27L9NbIyL5jMjTFrAUpGxxpW68Puw==", + "dev": true, + "requires": {} + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-3.0.1.tgz", + "integrity": "sha512-HzJIvGiGqYsFUrMjAJNDbVZoG7qQA+vy9AIoKs7s9DscNfki0I589mf2w6/tW+kkFH3zyiknoWV5Jdynu6b/zw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^1.0.0" + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + } + }, + "call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001551", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz", + "integrity": "sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + } + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + } + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dev": true, + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + }, + "dependencies": { + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + } + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "consolidate": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", + "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "dev": true, + "requires": { + "bluebird": "^3.1.1" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.2.tgz", + "integrity": "sha512-Uh7crJAco3AjBvgAy9Z75CjK8IG+gxaErro71THQ+vv/bl4HaQcpkexAY8KVW/T6D2W2IRr+couF/knIRkZMIQ==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "webpack-log": "^2.0.0" + } + }, + "core-js": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.1.tgz", + "integrity": "sha512-qVSq3s+d4+GsqN0teRCJtM6tdEEXyWxjzbhVrCHmBS5ZTM0FS2MOS0D13dUXAWDUN6a+lHI/N1hF9Ytz6iLl9Q==", + "dev": true + }, + "core-js-compat": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.1.tgz", + "integrity": "sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==", + "dev": true, + "requires": { + "browserslist": "^4.22.1" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==", + "dev": true + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-2.1.1.tgz", + "integrity": "sha512-OcKJU/lt232vl1P9EEDamhoO9iKY3tIjY5GU+XDLblAykTdgs6Ux9P1hTHve8nFKy5KPpOXOsVI/hIwi3841+w==", + "dev": true, + "requires": { + "camelcase": "^5.2.0", + "icss-utils": "^4.1.0", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.14", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^2.0.6", + "postcss-modules-scope": "^2.1.0", + "postcss-modules-values": "^2.0.0", + "postcss-value-parser": "^3.3.0", + "schema-utils": "^1.0.0" + } + }, + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "dev": true, + "requires": { + "css": "^2.0.0" + } + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + } + } + }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "cyclist": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.2.tgz", + "integrity": "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true + }, + "deepmerge": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz", + "integrity": "sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ==", + "dev": true + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "dev": true, + "requires": { + "path-type": "^3.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "docsearch.js": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/docsearch.js/-/docsearch.js-2.6.3.tgz", + "integrity": "sha512-GN+MBozuyz664ycpZY0ecdQE0ND/LSgJKhTLA0/v3arIS3S1Rpf2OJz6A35ReMsm91V5apcmzr5/kM84cvUg+A==", + "dev": true, + "requires": { + "algoliasearch": "^3.24.5", + "autocomplete.js": "0.36.0", + "hogan.js": "^3.0.2", + "request": "^2.87.0", + "stack-utils": "^1.0.1", + "to-factory": "^1.0.0", + "zepto": "^1.2.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==", + "dev": true + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer3": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", + "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.561", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.561.tgz", + "integrity": "sha512-eS5t4ulWOBfVHdq9SW2dxEaFarj1lPjvJ8PaYMOjY0DecBaj/t4ARziL2IPpDr4atyWwjLFGQ2vo/VCgQFezVQ==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envify": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", + "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "dev": true, + "requires": { + "esprima": "^4.0.0", + "through": "~2.3.4" + } + }, + "envinfo": { + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.11" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "esbuild": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.7.tgz", + "integrity": "sha512-+u/msd6iu+HvfysUPkZ9VHm83LImmSNnecYPfFI01pQ7TTcsFR+V0BkybZX7mPtIaI7LCrse6YRj+v3eraJSgw==", + "dev": true, + "requires": { + "esbuild-android-arm64": "0.14.7", + "esbuild-darwin-64": "0.14.7", + "esbuild-darwin-arm64": "0.14.7", + "esbuild-freebsd-64": "0.14.7", + "esbuild-freebsd-arm64": "0.14.7", + "esbuild-linux-32": "0.14.7", + "esbuild-linux-64": "0.14.7", + "esbuild-linux-arm": "0.14.7", + "esbuild-linux-arm64": "0.14.7", + "esbuild-linux-mips64le": "0.14.7", + "esbuild-linux-ppc64le": "0.14.7", + "esbuild-netbsd-64": "0.14.7", + "esbuild-openbsd-64": "0.14.7", + "esbuild-sunos-64": "0.14.7", + "esbuild-windows-32": "0.14.7", + "esbuild-windows-64": "0.14.7", + "esbuild-windows-arm64": "0.14.7" + } + }, + "esbuild-darwin-arm64": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.7.tgz", + "integrity": "sha512-68e7COhmwIiLXBEyxUxZSSU0akgv8t3e50e2QOtKdBUE0F6KIRISzFntLe2rYlNqSsjGWsIO6CCc9tQxijjSkw==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "peer": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "dev": true + }, + "eventsource": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", + "integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", + "dev": true, + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "feed": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/feed/-/feed-2.0.4.tgz", + "integrity": "sha512-sWatfulDP6d18qVaWcu34qmq9ml6UeN6nHSBJpNZ2muBqxjPAdT375whPYAHP+gqLfyabtYU5qf2Dv4nqtlp0w==", + "dev": true, + "requires": { + "luxon": "^1.3.3", + "xml": "^1.0.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-3.0.1.tgz", + "integrity": "sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "schema-utils": "^1.0.0" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "foreach": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz", + "integrity": "sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg==", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==", + "dev": true + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dev": true, + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", + "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", + "dev": true, + "requires": { + "ini": "1.3.7" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dev": true, + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hogan.js": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz", + "integrity": "sha512-RqGs4wavGYJWE07t35JQccByczmNUXQT0E12ZYV1VKYu5UiAU9lsos/yBAcf840+zrUQQxgVduCR5/B8nNtibg==", + "dev": true, + "requires": { + "mkdirp": "0.3.0", + "nopt": "1.0.10" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha512-OHsdUcVAQ6pOtg5JYWpCBo9W/GySVuwvP9hueRMW7UqshC0tbfzLv8wjySTPm3tfUZ/21CE9E1pJagOA91Pxew==", + "dev": true + } + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==", + "dev": true + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-minifier": { + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + } + }, + "html-tags": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", + "integrity": "sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g==", + "dev": true + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-replace-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", + "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", + "dev": true + }, + "icss-utils": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==", + "dev": true + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "immediate": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz", + "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==", + "dev": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha512-Ew5AZzJQFqrOV5BTW3EIoHAnoie1LojZLXKcCQ/yTRyVZosBhK1x1ViYjHGf5pAFOq8ZyChZp6m/fSN7pJyZtg==", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha512-0vdnLL2wSGnhlRmzHJAg5JHjt1l2vYhzJ7tNLGbeVg0fse56tpGaH0uzH+r9Slej+BSXXEHvBKDEnVSLLE9/+w==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", + "dev": true + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", + "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", + "dev": true + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha512-58yWmlHpp7VYfcdTwMTvwMmqx/Elfxjd9RXTDyMsbL7lLWmhMylLEqiYVLKuLzOZqVgiWXD9MfR62Vv89VRxkw==", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "dev": true, + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + } + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "requires": { + "which-typed-array": "^1.1.11" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "dev": true + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "javascript-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz", + "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dev": true, + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, + "linkify-it": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, + "load-script": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/load-script/-/load-script-1.0.0.tgz", + "integrity": "sha512-kPEjMFtZvwL9TaZo0uZ2ml+Ye9HUMmPwbYRJ324qF9tqMejwykJ5ggTyvzmrbBeapCAbk98BSbTeovHEEP1uCA==", + "dev": true + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", + "dev": true + }, + "lodash.chunk": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.chunk/-/lodash.chunk-4.2.0.tgz", + "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w==", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "lodash.defaultsdeep": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", + "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", + "dev": true + }, + "lodash.isempty": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz", + "integrity": "sha512-oKMuF3xEeqDltrGMfDxAPGIVMSSRv8tbRSODbrs4KGsRRLEhrW8N8Rd4DRgB2+621hY8A8XwwrTVhXWpxFvMzg==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha512-sW73O6S8+Tg66eY56DBk85aQzzUJDtpoXFBgELMd5P/SotAguo+1kYO6RuYgXxA4HJH3LFTFPASX6ET6bjfriw==", + "dev": true + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", + "dev": true + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.trimend": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimend/-/lodash.trimend-4.5.1.tgz", + "integrity": "sha512-lsD+k73XztDsMBKPKvzHXRKFNMohTjoTKIIo4ADLn5dA65LZ1BqlAvSXhR2rPEC3BgAUQnzMnorqDtqn2z4IHA==", + "dev": true + }, + "lodash.trimstart": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", + "integrity": "sha512-b/+D6La8tU76L/61/aN0jULWHkT0EeJCmVstPBn/K9MtD2qBW83AsBNrr63dKuWYwVMO7ucv13QNO/Ek/2RKaQ==", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "loglevel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz", + "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==", + "dev": true + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "luxon": { + "version": "1.28.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz", + "integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-it": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", + "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "entities": "~1.1.1", + "linkify-it": "^2.0.0", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + } + } + }, + "markdown-it-anchor": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-5.3.0.tgz", + "integrity": "sha512-/V1MnLL/rgJ3jkMWo84UR+K+jF1cxNG1a+KwqeXqTIJ+jtA8aWSHuigx8lTzauiIjBDbwF3NcWQMotd0Dm39jA==", + "dev": true, + "requires": {} + }, + "markdown-it-chain": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/markdown-it-chain/-/markdown-it-chain-1.3.0.tgz", + "integrity": "sha512-XClV8I1TKy8L2qsT9iX3qiV+50ZtcInGXI80CA+DP62sMs7hXlyV/RM3hfwy5O3Ad0sJm9xIwQELgANfESo8mQ==", + "dev": true, + "requires": { + "webpack-chain": "^4.9.0" + }, + "dependencies": { + "javascript-stringify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-1.6.0.tgz", + "integrity": "sha512-fnjC0up+0SjEJtgmmG+teeel68kutkvzfctO/KxE3qJlbunkJYAshgH3boU++gSBHP8z5/r0ts0qRIrHf0RTQQ==", + "dev": true + }, + "webpack-chain": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-4.12.1.tgz", + "integrity": "sha512-BCfKo2YkDe2ByqkEWe1Rw+zko4LsyS75LVr29C6xIrxAg9JHJ4pl8kaIZ396SUSNp6b4815dRZPSTAS8LlURRQ==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^1.6.0" + } + } + } + }, + "markdown-it-container": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-it-container/-/markdown-it-container-2.0.0.tgz", + "integrity": "sha512-IxPOaq2LzrGuFGyYq80zaorXReh2ZHGFOB1/Hen429EJL1XkPI3FJTpx9TsJeua+j2qTru4h3W1TiCRdeivMmA==", + "dev": true + }, + "markdown-it-emoji": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz", + "integrity": "sha512-QCz3Hkd+r5gDYtS2xsFXmBYrgw6KuWcJZLCEkdfAuwzZbShCmCfta+hwAMq4NX/4xPzkSHduMKgMkkPUJxSXNg==", + "dev": true + }, + "markdown-it-img-lazy": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/markdown-it-img-lazy/-/markdown-it-img-lazy-1.0.3.tgz", + "integrity": "sha512-H1wOixBCI8Jm9vxn5f5lsDsTdhG8HxLiC5eh5TjVe/Dv//zwAi/R5+WSpRYmQtyc1+RF1kS4cuLPt1wGid0xWA==" + }, + "markdown-it-imsize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/markdown-it-imsize/-/markdown-it-imsize-2.0.1.tgz", + "integrity": "sha512-5SH90ademqcR8ifQCBXRCfIR4HGfZZOh5pO0j2TglulfSQH+SBXM4Iw/QlTUbSoUwVZArCYgECoMvktDS2kP3w==" + }, + "markdown-it-table-of-contents": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", + "integrity": "sha512-TAIHTHPwa9+ltKvKPWulm/beozQU41Ab+FIefRaQV1NRnpzwcV9QOe6wXQS5WLivm5Q/nlo0rl6laGkMDZE7Gw==", + "dev": true + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "medium-zoom": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/medium-zoom/-/medium-zoom-1.0.8.tgz", + "integrity": "sha512-CjFVuFq/IfrdqesAXfg+hzlDKu6A2n80ZIq0Kl9kWjoHh9j1N9Uvk5X0/MmN0hOfm5F9YBswlClhcwnmtwz7gA==", + "dev": true + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dev": true, + "requires": { + "dom-walk": "^0.1.0" + } + }, + "mini-css-extract-plugin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz", + "integrity": "sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "^2.0.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", + "dev": true + }, + "nan": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", + "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==", + "dev": true, + "optional": true + }, + "nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "dev": true + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", + "dev": true, + "requires": { + "array.prototype.reduce": "^1.0.6", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "safe-array-concat": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "dev": true, + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "^2.2.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "dev": true, + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dev": true, + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz", + "integrity": "sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^3.3.1" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz", + "integrity": "sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==", + "dev": true, + "requires": { + "icss-replace-symbols": "^1.1.0", + "postcss": "^7.0.6" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dev": true, + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dev": true, + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==", + "dev": true + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dev": true, + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dev": true, + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + } + }, + "postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dev": true, + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", + "dev": true + }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "optional": true + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true + }, + "prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dev": true, + "requires": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + } + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "reduce": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/reduce/-/reduce-1.0.2.tgz", + "integrity": "sha512-xX7Fxke/oHO5IfZSk77lvPa/7bjMh9BuCk4OOoX5XTXrM7s0Z+MkPfSDfz0q7r91BhhGSs8gii/VEN/7zhCPpQ==", + "dev": true, + "requires": { + "object-keys": "^1.1.0" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + } + }, + "regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dev": true, + "requires": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + } + }, + "registry-auth-token": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", + "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", + "dev": true, + "requires": { + "rc": "1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remove-markdown": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/remove-markdown/-/remove-markdown-0.3.0.tgz", + "integrity": "sha512-5392eIuy1mhjM74739VunOlsOYKjsH82rQcTBlJ1bkICVC3dQ3ksQzTHh4jGHQFnM+1xzLzcFOMH+BofqXhroQ==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha512-ccu8zQTrzVr954472aUVPLEcB3YpKSYR3cg/3lo1okzobPBM+1INXBbBZlDbnI/hbEocnf8j0QVo43hQKrbchg==", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "dev": true + }, + "selfsigned": { + "version": "1.10.14", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.14.tgz", + "integrity": "sha512-lkjaiAye+wBZDCBsu5BGi0XiLRxeUlsGod5ZP924CRSEoGuZAw/f7y9RKu28rwTfiHVhdavhB0qH0INV6P1lEA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sitemap": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-3.2.2.tgz", + "integrity": "sha512-TModL/WU4m2q/mQcrDgNANn0P4LwprM9MMvG4hu5zP4c6IIKs2YLTu6nXXnNr8ODW/WFtxKggiJ1EGn2W0GNmg==", + "dev": true, + "requires": { + "lodash.chunk": "^4.2.0", + "lodash.padstart": "^4.6.1", + "whatwg-url": "^7.0.0", + "xmlbuilder": "^13.0.0" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==", + "dev": true + }, + "smoothscroll-polyfill": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", + "integrity": "sha512-TK5ZA9U5RqCwMpfoMq/l1mrH0JAR7y7KRvOBx0n2869aLxch+gT9GhN3yUfjiw+d/DiF1mKo14+hd62JyMmoBg==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "sockjs-client": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.6.1.tgz", + "integrity": "sha512-2g0tjOR+fRs0amxENLi/q5TiJTqY+WXFOzb5UwXndlK6TO3U/mirZznpx6w34HVMoc3g7cY24yC/ZMIYnDlfkw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "eventsource": "^2.0.2", + "faye-websocket": "^0.11.4", + "inherits": "^2.0.4", + "url-parse": "^1.5.10" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true + } + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + }, + "std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + }, + "dependencies": { + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + } + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true + }, + "striptags": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz", + "integrity": "sha512-3HVl+cOkJOlNUDAYdoCAfGx/fzUzG53YvJAl3RYlTvAcBdPqSp1Uv4wrmHymm7oEypTijSQqcqplW8cz0/r/YA==", + "dev": true + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dev": true, + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + } + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "dev": true + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dev": true, + "requires": { + "boolbase": "~1.0.0" + } + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "term-size": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", + "dev": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", + "dev": true + }, + "to-factory": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-factory/-/to-factory-1.0.0.tgz", + "integrity": "sha512-JVYrY42wMG7ddf+wBUQR/uHGbjUHZbLisJ8N62AMm0iTZ0p8YTcZLzdtomU0+H+wa99VbkyvQGB3zxB7NDzgIQ==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "toml": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", + "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", + "dev": true + }, + "toposort": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true + }, + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "dev": true, + "requires": { + "commander": "~2.19.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", + "dev": true + } + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + } + } + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "url": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", + "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "dev": true, + "requires": { + "punycode": "^1.4.1", + "qs": "^6.11.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "url-loader": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz", + "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "mime": "^2.0.3", + "schema-utils": "^1.0.0" + } + }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "extsprintf": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", + "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", + "dev": true + } + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", + "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "dev": true, + "requires": { + "@vue/compiler-sfc": "2.7.14", + "csstype": "^3.1.0" + } + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-loader": { + "version": "15.11.1", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz", + "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + } + }, + "vue-router": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", + "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==", + "dev": true + }, + "vue-server-renderer": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.7.14.tgz", + "integrity": "sha512-NlGFn24tnUrj7Sqb8njhIhWREuCJcM3140aMunLNcx951BHG8j3XOrPP7psSCaFA8z6L4IWEjudztdwTp1CBVw==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "hash-sum": "^2.0.0", + "he": "^1.2.0", + "lodash.template": "^4.5.0", + "lodash.uniq": "^4.5.0", + "resolve": "^1.22.0", + "serialize-javascript": "^6.0.0", + "source-map": "0.5.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true + }, + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", + "dev": true + } + } + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "requires": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "vuepress": { + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.10.tgz", + "integrity": "sha512-UnGm9vjQvG918SZVNvgiUlNimLqawdYPq0aPRXDpEB1VksvqegVFy/GKdA8ShXJaEpOMPSt7YD4uK21jaMs3kA==", + "dev": true, + "requires": { + "@vuepress/core": "1.9.10", + "@vuepress/theme-default": "1.9.10", + "@vuepress/types": "1.9.10", + "cac": "^6.5.6", + "envinfo": "^7.2.0", + "opencollective-postinstall": "^2.0.2", + "update-notifier": "^4.0.0" + } + }, + "vuepress-html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vuepress-html-webpack-plugin/-/vuepress-html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-BebAEl1BmWlro3+VyDhIOCY6Gef2MCBllEVAP3NUAtMguiyOwo/dClbwJ167WYmcxHJKLl7b0Chr9H7fpn1d0A==", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, + "vuepress-plugin-baidu-autopush": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-baidu-autopush/-/vuepress-plugin-baidu-autopush-1.0.1.tgz", + "integrity": "sha512-KVQkrmMgPY+GG8dtI2wcRxUv1n2h5DM8aFs75ltsSlFBSS9C/vfLb2LmywXAsoCXk2EHya2p66cpn7BxofK+Mw==", + "dev": true + }, + "vuepress-plugin-code-copy": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vuepress-plugin-code-copy/-/vuepress-plugin-code-copy-1.0.6.tgz", + "integrity": "sha512-FiqwMtlb4rEsOI56O6sSkekcd3SlESxbkR2IaTIQxsMOMoalKfW5R9WlR1Pjm10v6jmU661Ex8MR11k9IzrNUg==" + }, + "vuepress-plugin-container": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vuepress-plugin-container/-/vuepress-plugin-container-2.1.5.tgz", + "integrity": "sha512-TQrDX/v+WHOihj3jpilVnjXu9RcTm6m8tzljNJwYhxnJUW0WWQ0hFLcDTqTBwgKIFdEiSxVOmYE+bJX/sq46MA==", + "dev": true, + "requires": { + "@vuepress/shared-utils": "^1.2.0", + "markdown-it-container": "^2.0.0" + } + }, + "vuepress-plugin-feed": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/vuepress-plugin-feed/-/vuepress-plugin-feed-0.1.9.tgz", + "integrity": "sha512-iOJkR7zPmJAX0TEVdxNsUT07xNQB6lZFpU7DqsYzO01FhaPkMOOVM5Vx5a/iOOuOggAeoI9H9yuah+cRmCImlw==", + "dev": true, + "requires": { + "feed": "2.0.4", + "lodash.defaultsdeep": "4.6.1", + "lodash.isempty": "4.4.0", + "lodash.trimend": "^4.5.1", + "lodash.trimstart": "^4.5.1", + "remove-markdown": "0.3.0", + "striptags": "3.1.1" + } + }, + "vuepress-plugin-img-lazy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-img-lazy/-/vuepress-plugin-img-lazy-1.0.4.tgz", + "integrity": "sha512-4mMIy3vZzNZupFuohPKlOHGd0rNZEMEHEyN8b2M3j1yBANrkhGg1wNnpsdpe7ZnLdtVpxH3JQT7a3TDdxLLFmQ==", + "requires": { + "markdown-it-img-lazy": "^1.0.2", + "markdown-it-imsize": "^2.0.1" + } + }, + "vuepress-plugin-seo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/vuepress-plugin-seo/-/vuepress-plugin-seo-0.1.4.tgz", + "integrity": "sha512-foNKrAAKihiC47bx0UXFzs/+BIFmnowTQsLVF/8pfsnsPDp8FXjkTGyjxyjOhbwj7ADPv32CdX3pEoYGnZ7OjA==", + "dev": true + }, + "vuepress-plugin-sitemap": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/vuepress-plugin-sitemap/-/vuepress-plugin-sitemap-2.3.1.tgz", + "integrity": "sha512-n+8lbukhrKrsI9H/EX0EBgkE1pn85LAQFvQ5dIvrZP4Kz6JxPOPPNTQmZMhahQV1tXbLZQCEN7A1WZH4x+arJQ==", + "dev": true, + "requires": { + "sitemap": "^3.0.0" + } + }, + "vuepress-plugin-smooth-scroll": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/vuepress-plugin-smooth-scroll/-/vuepress-plugin-smooth-scroll-0.0.3.tgz", + "integrity": "sha512-qsQkDftLVFLe8BiviIHaLV0Ea38YLZKKonDGsNQy1IE0wllFpFIEldWD8frWZtDFdx6b/O3KDMgVQ0qp5NjJCg==", + "dev": true, + "requires": { + "smoothscroll-polyfill": "^0.4.3" + } + }, + "vuepress-plugin-tags": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vuepress-plugin-tags/-/vuepress-plugin-tags-1.0.2.tgz", + "integrity": "sha512-6BL53cnZ72ZOlYDlhsE92sIZCzuNHoVLtWDeFd36Gw7eoQuuR3Rk95ND8EHsgSo26SSPo1/H+zyYtzXecdyD+g==", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + }, + "dependencies": { + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "webpack": { + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + } + }, + "webpack-chain": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", + "integrity": "sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA==", + "dev": true, + "requires": { + "deepmerge": "^1.5.2", + "javascript-stringify": "^2.0.1" + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, + "webpack-dev-server": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz", + "integrity": "sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==", + "dev": true, + "requires": { + "ansi-html-community": "0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dev": true, + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "webpackbar": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-3.2.0.tgz", + "integrity": "sha512-PC4o+1c8gWWileUfwabe0gqptlXUDJd5E0zbpr2xHP1VSOVlZVPBZ8j6NCR8zM5zbKdxPhctHXahgpNK1qFDPw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.1.0", + "chalk": "^2.4.1", + "consola": "^2.6.0", + "figures": "^3.0.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha512-d1VUP9F96w664lKINMGeElWdhhb5sC+thXM+ydZGU3ZnaE09Wv6FaS+mpM9570kcDs/xMfcXJBTLsMdHEFYY9Q==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "which-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.4", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", + "dev": true + }, + "xmlbuilder": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-13.0.2.tgz", + "integrity": "sha512-Eux0i2QdDYKbdbA6AM6xE4m6ZTZr4G4xF9kahI2ukSEMCzwce2eX9WlTI5J3s+NU7hpasFsr8hWIONae7LluAQ==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "zepto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zepto/-/zepto-1.2.0.tgz", + "integrity": "sha512-C1x6lfvBICFTQIMgbt3JqMOno3VOtkWat/xEakLTOurskYIHPmzJrzd1e8BnmtdDVJlGuk5D+FxyCA8MPmkIyA==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4c29fee --- /dev/null +++ b/package.json @@ -0,0 +1,24 @@ +{ + "name": "codefather", + "version": "1.0.0", + "scripts": { + "docs:dev": "vuepress dev .", + "docs:build": "vuepress build ." + }, + "license": "MIT", + "devDependencies": { + "@vuepress/plugin-back-to-top": "^1.9.10", + "@vuepress/plugin-google-analytics": "^1.9.10", + "@vuepress/plugin-medium-zoom": "^1.9.10", + "vuepress": "^1.9.10", + "vuepress-plugin-baidu-autopush": "^1.0.1", + "vuepress-plugin-feed": "^0.1.9", + "vuepress-plugin-seo": "^0.1.4", + "vuepress-plugin-sitemap": "^2.3.1", + "vuepress-plugin-tags": "^1.0.2" + }, + "dependencies": { + "vuepress-plugin-code-copy": "^1.0.6", + "vuepress-plugin-img-lazy": "^1.0.4" + } +} diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/README.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/README.md" new file mode 100644 index 0000000..d5074cc --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/README.md" @@ -0,0 +1,91 @@ +# 产品服务 + +鱼皮创立的公司 —— 鱼鸢网络,我们的官网:[https://www.yuyuanweb.com](https://www.yuyuanweb.com) + + + +## 关于我们 + +鱼鸢网络是一家新兴的互联网科技公司,我们的使命愿景是 “用科技节约您的每一分钟”。 + +我们希望通过科技创新,为您提升学习、工作、生活、以及获取信息的效率,拥抱更美好的未来。 + + + +## 业务领域 + +自研创新产品 + 编程教育 + 科技自媒体 + + + +## 产品服务 + +### 自研产品 + +老鱼简历:[https://laoyujianli.com](https://laoyujianli.com)(快速制作精美专业的个人简历) + +鱼聪明 AI:[https://yucongming.com](https://yucongming.com)(智能 AI 助手,写书问答绘画) + +知识助手:[https://zhishizhushou.com](https://zhishizhushou.com)(强大的知识管理辅助工具) + +框框大学:[https://kkdaxue.com](https://kkdaxue.com)(公益项目,大学各专业学习建议汇总) + + + +### 编程教育 + +[💎 学好编程 - 编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) + +编程导航网站:[https://www.code-nav.cn](https://www.code-nav.cn)(编程交流、面试题、简历修改平台) + +[算法学习 - 编程导航算法通关村](https://yuyuanweb.feishu.cn/wiki/J9qLwpv75iropZkXpmIcYrZ8nNM) + +[后端突击 - 狂飙后端训练营](https://yuyuanweb.feishu.cn/wiki/EShmwklfJifDv4k4fCEcdp0Qnrd) + +[前端突击 - 前端面试训练营](https://yuyuanweb.feishu.cn/wiki/UIoAwQAZLiDecgkVw65cQFoenKf) + +[考研陪跑 - 编程导航计狗上岸](https://yuyuanweb.feishu.cn/wiki/Qr35wx2dgif2wNkIwikc0jjRnyw) + + + +### 科技自媒体 + +[程序员鱼皮](https://space.bilibili.com/12890453/):编程知识、学习经验、科技科普、原创项目分享,全网粉丝量超 150 万 + +编程导航:编程知识、编程学习经历分享 + +面试鸭:专注分享优质编程面试题的公众号 + +无敌信息差:科技类前沿资讯热点分享 + +鱼聪明 AI:AI 相关内容资讯分享 + + + +## 合作伙伴 + +我们的合作伙伴包括: + +1)50 多名编程、科技、知识领域的自媒体博主 / 技术专家 + +2)微软官方认证的商业合作伙伴 + +3)科大讯飞、Api Fox 等知名公司和产品合作 + + + +## 团队信息 + +[年轻快乐的团队](https://yuyuanweb.feishu.cn/wiki/DmB9wCm52iVVQLk98E2clx26nFg) + + + +## 加入我们 + +[招聘岗位](https://yuyuanweb.feishu.cn/wiki/GlMiw80xIiOC3PkQb59c5ecKnoH) + + + +## 商务合作 + +点击联系我们:[商务合作](https://yuyuanweb.feishu.cn/wiki/AOzgw1mOliX6SskAVEicK6u7nDA) \ No newline at end of file diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/\345\211\215\347\253\257\347\252\201\345\207\273 - \345\211\215\347\253\257\351\235\242\350\257\225\350\256\255\347\273\203\350\220\245.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/\345\211\215\347\253\257\347\252\201\345\207\273 - \345\211\215\347\253\257\351\235\242\350\257\225\350\256\255\347\273\203\350\220\245.md" new file mode 100644 index 0000000..a8aaba0 --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/\345\211\215\347\253\257\347\252\201\345\207\273 - \345\211\215\347\253\257\351\235\242\350\257\225\350\256\255\347\273\203\350\220\245.md" @@ -0,0 +1,188 @@ +# 前端突击 - 前端面试训练营 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +这是由鱼皮和月哥等多名大厂技术专家合伙打造的编程训练营,主打 **前端求职面试突击** ,帮助学员 **用最短的时间** 从 0 到 1 拿到满意的前端开发 offer! + +下面依次介绍下我们训练营提供的服务。 + +> ⭐️ [文末有报名方式](https://yuyuanweb.feishu.cn/docx/KeqUdEAcFobEUFxr5gvcc03tn3e#PAdgdg7ffoLm3kxhZ44cTV9lnQb) + +## 专业面试辅导 + +保姆级别的服务,多位前端技术专家的导师阵容,和传统培训机构不一样的是,我们主打一对一辅导,让大家感受到 vip 服务的体验,在这里全程都会有督学监督,直到流程结束。 + +## 学员拿过哪些offer? + +面试训练营开办 3 年以来学员基本拿完所有大厂 offer,我们沉淀下来的技术经验,面试经验是巨量且丰富的。**学员拿过offer有:华为,京东,阿里,腾讯,字节,快手,网易,美团,百度,携程,B站,小红书,小米,得物,喜马拉雅,滴滴,有赞,拼多多,米哈游,蚂蚁,招商银行,平安,叮咚买菜,国企,奇安信,顺丰,哈啰,中通,申通,货拉拉,明源云,途虎,茄子快传,海康,蔚来,虾皮,shein,花旗银行,zoom,亚马逊,微软,sap 还有各种独角兽及其他中小公司的的 offer,一大推,基本上能叫的上名字的公司都被我们的学员收割了一遍** + +### 就业率 + +面试训练营升级之后,目前二期近 180+ 人,我们就业数据完全群里的小伙伴都可以看到,因为实名制,通过我们的综合面试的就业率高达 **95%+** ,每一位同学我们都每周跟踪状态。做好前端面试培训我们是专业的! + +![](https://pic.yupi.icu/5563/asynccode) + +- [4月面试训练营offer复盘,10几位同学拿到offer,最高40k,两位同学超过35k](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488065&idx=1&sn=03e8925d18573ad6ae87605807924ff3&chksm=cf1301cef86488d8c3dccefcb5f972021c29b9c1fa287b2b503026e85a2d64172e157406f49a&scene=21#wechat_redirect) +- [5月中旬战绩!近10位同学拿到offer,最高27k](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488120&idx=1&sn=c2e78ed13b020c2b27abd63aa2a384e2&chksm=cf1301f7f86488e1b1e7107fca959eaff823fe464efbf0938a75ac1003b7bef44aece9d84d85&scene=21#wechat_redirect) +- [6月份11位同学拿到offer,最高28k,最高涨幅1w](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488405&idx=1&sn=e0a56b73bfbe1c55981b2c2ee79fffe1&chksm=cf13001af864890cb278ac66c467345edb97fdbf5b0b2d365a76cfd9a4762f19452fdf494e8f&scene=21#wechat_redirect) +- [7月面试训练营喜报,10几位同学拿到offer,最高涨幅1w+,最高薪资30k+](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488496&idx=1&sn=6c39125ca8261fddb6237671f060db65&chksm=cf13007ff864896952a412e6828565c2ab99071458026b8c12e58221e9b1630ee8985ef4dfd0&scene=21#wechat_redirect) +- [8月,开门红,两位同学拿到offer,15k+](http://mp.weixin.qq.com/s?__biz=Mzg3ODUyODIyNA==&mid=2247488511&idx=1&sn=6e8cf8fb79ef8d0a273714eb3bc8859c&chksm=cf130070f8648966bfcc12188af436561d770c95f4ad2a7b6dceabe78f6f4ca27c647a5cdd97&scene=21#wechat_redirect) + +## 前端导师团队 + +导师的水平可能就是学员的天花板,所以我们不断的为训练营注入新鲜的血液,邀请很多前端技术大佬,多位技术专家,高级技术专家加入我们的团队,帮助到学员更好的成长!目前导师团队如下: + +**凡哥**:前腾讯高级工程师,现一线大厂前端高级技术专家,职级p8+,teamleader,掘金小册作者 + +**红老师**: 阿里前端高级技术专家,P8 级,知名前端博主,拥有 10 余年前端开发经验,Github 多个过千 Stars 的开源项目作者,负责部门的前端技术架构选型及演化、研发效率的提升和用户体验的深挖。负责团队招聘面试,累计面试上千余人。 + +**samson**: 阿里云前端技术专家,职级p7,十余年从业经验,曾负责 toB 低代码开发平台,服务超 10万+ 企业客户。在职期间主导并获得了多个国家级技术专利,参与过行业级别低代码标准申请。据有丰富的前端架构和全栈研发经验,对低代码、移动多端适配、数据可视化、前端性能优化等多个领域都有深入的研究。多年带团队经验,熟悉大厂人才选育标准。 + +**旋哥**:某厂前端架构师,职级p7,7年+开发经验,拥有众多开源明星项目,在公司主导组件库、低代码平台、基础设施等,有非常强的工程化经验落地, + +**龙哥**:某一线前端开发专家,职级p7,8年从业经验。据有丰富的前端架构和全栈研发经验,对低代码、数据可视化、前端工程化等领域都有深入的研究。在公司负责前端架构研发,针对前端工程化、微前端架构、数据可视化渲染等技术进行落地实施。 + +**月哥**:前端面试训练营创始人,卷王一枚,主攻前端面试进阶 3 年以来学员超千人,分布在国内外。学员拿遍了一线大厂offer,有丰富的前端面试进阶的经验,以身作则,善于激发学员突破自己,努力学习达到自己的目标 + +**鱼皮**:前腾讯全栈工程师,现科技公司创始人,全网150w+粉丝的编程博主,爱做项目爱分享,github 中国区前20,有30+独立项目经验,善于把java后端、前端项目讲的通俗易懂 + +**CUGGZ**:目前在一线教育公司担任前端开发。掘金 LV8 作者,公众号“前端充电宝”号主,一年多时间输出 200 多篇原创文章,累计阅读 300w+。专注前端进阶知识,面试题分享,努力写出小白都能看懂的教程文章。 + +**小鑫**:双非校招拿到多个大厂的校招 offer,包括阿里和字节,最后去了字节,会帮助我们训练营的校招同学辅助学习各方面关于校招注意事项,以及基础算法相关。 + +**杨杰**:6 年前端开发及 4 年 IT 教育经验,千锋教育担任高级前端讲师。有丰富的实战教学经验,我们 0 基础班的负责人。 + +### 后端导师 + +**雷老师**:宋雷:曾就职于京东和去哪儿网,前美团高级技术经理,前vipkid后端技术委员会主席,前新东方在线技术总监,对大型分布式、高并发、高可用、高性能的复杂系统设计具备丰富经验 + +## 辅导流程 + +区别于市面上原有的录播课或直播大班课教学模式,我们会根据根据学员的真实技术等级(初级、中级、高级、专家)和技术特点(长短板),进行有针对性的、千人千面的培训辅导。**我们侧重 1v1 的重服务辅导,所以效果比较明显** + +### 1、1v1模拟面试摸底 + +所以第一步,报名的1-2日之内,助教联系大家安排技术摸底,通过模拟真实面试场景,根据学员在面试中的真实表现,进行学员的能力和特点评估。全方位的了解学员的前端各方面的水平,从而制定相应的学习计划!这个其他机构你是看不到的。我们主打一对一的摸底! + +![](https://pic.yupi.icu/5563/asynccode) + +### 2、制定学习计划 + +该学习计划会在充分考虑学员诉求和职业发展的基础上,根据学员的客观工作情况进行合理安排,(这里主要有两条线,一条是需要快速跳槽,第二条是需要长期准备面试的)帮助学员补齐现有技术体系中的短板,及合理地对学员的强项进行针对性地深耕,让学员在广度和深度上均有所建树。同时,也在帮助学员做减法,摒弃一些前景不明、面试阶段涉及可能性不大的技术体系,让学员的时间和精力投入可以精准命中,取得结果。 + +### 3、阶段性成果验收 + +此阶段会对学员一段时间内的学习成果进行检验,包括**八股文**、**算法**和**项目中的实际解决方案**。同时,我们也关注学员是否与预期学习成果存在差距,学习过程中是否存在疑惑和困难,并及时进行答疑和纠偏。我们始终会贴着学员的目标走,一点一点的攻克! + +### 4、全周期成果验收(综合面试) + +此阶段主要针对于辅导学员**简历优化**,面试技巧、心得、节奏把控等,以及针对于不同面试官的不同面试策略。同时,仍然会对学员的八股文、算法和项目中的实际解决方案进行考察和优化。 + +![](https://pic.yupi.icu/5563/asynccode) + +### 5、项目重难点优化 + +我们梳理了一系列的项目重难点,亮点,以及告诉大家怎么样去提炼,如果去回答,比方微前端、组件库、脚手架、大文件上传、性能优化等等;一直在做后台管理项目,怎么提炼......,在我们这里都能够找到答案! + +很多时候,难点、亮点本身就是悖论问题,你觉得难,你觉得亮,但是面试官不觉得,那就很尴尬,我们在这个过程中如何的表述好,让面试官能够感受到我们在其中的思考,很成长,这也是非常玄学的东西,千人千面,我们该如何表述项目经历,体现自己价值,也是难点之一,在这里我们都会case by case的帮助到大家如果去表达! + +![](https://pic.yupi.icu/5563/asynccode) + +### 6、专项的面试复盘 + +通过综合面试之后,学员们出去面试,我们还会对学员进行实战的面试复盘,分析总结同学在面试中发挥的情况,针对性的复盘总结,帮助到同学们更好更加明确的准备接下来的面试! + +## 优秀的导师带来的经验价值 + +我们的前端导师团队的水平是非常强的,面试能力或者的技术能力,每个人都在自己擅长的领域为我们的团队做贡献,我们每周都会开例会,总结这周我们更新了哪些资料,下周的目标有哪些,这是我们的事业,会努力做的更好。 + +![](https://pic.yupi.icu/5563/asynccode) + +### 完善的内部库资料 + +区分每个 topic 的重难点,让学员更加清晰的学习,同时每个topic有对应的群聊讨论,每个topic都有专门擅长这个领域的导师负责维护,同时会不断的更新优化,对应topic的内容 + +![](https://pic.yupi.icu/5563/asynccode) + +专项的topic群聊: + +![](https://pic.yupi.icu/5563/asynccode) + +3 年以来我们沉淀了大量的学习资料,这次学员进了我们 **新版内部库** 的感受,我们非常用心的整理沉淀体系化了,包含基础,项目重难点,各个框架的侧重点,以及如果回答,如何表述! + +![](https://pic.yupi.icu/5563/asynccode) + +### 每周技术分享 + +- 每周都会有技术分享,导师的主题直播分享,学员学习经验、拿到offer的情况的分享。 + +![](https://pic.yupi.icu/5563/asynccode) + +![](https://pic.yupi.icu/5563/asynccode) + +### 学员学习记录 + +**时间证明价值**:我们学员的内部库目前已经沉淀的160w字,这是我们已经在做的事,全部的都是学员自己写的,所以在面试训练营里面你会看到一个积极向上的学习氛围,大家都在默默的努力着,追寻自己的目标! + +![](https://pic.yupi.icu/5563/asynccode) + +面试辅导拒绝躺平,你既然花了钱,就必须学习,**环境****寒心,但是心不能寒,依旧要努力把这件事做好,才能更有机会,今年大家出去面试应该能够深刻的感受到**,虽然你花了钱不找我们,对我们来说是件好事,但是,对你自己来说你这个钱花的就毫无意义,我们也不希望看到这样的现象,所以我们为大家准备了内部学习库,监督你刷题学习。 + +### 导师给学员建立学习档案 + +我们给每一位同学,都建立了学习档案,记录你每一次检测的情况,如有问题及时同步,**要求每一位导师必须详细记录,我们实时监督!**,我们是做服务的,从进入到面试训练营,到拿到offer结束,每一次一对一都是会责任到人,都要落实到文档中记录! + +![](https://pic.yupi.icu/5563/asynccode) + +### 每周监督 + +![](https://pic.yupi.icu/5563/asynccode) + +- 我们这边目前是人力监督,没有做一些自动的化操作,让学员自己写,因为之前也试过,效果不是很好,所有我们这边每周都有专门的助教人工统计大家的学习进度,有问题方便对齐,目的就是监督大家持续学习 +- 懒惰、三天打鱼两天晒网是我们很多同学常见的现象,但是在这里不行,我们要求每周同学都必须学习总结,不然的话,老师会单独找到你们,说明理由,不能花钱进来躺平,这个是不允许的! +- 所以你们能够看到,我们确实在用心的为大家考虑,我们重服务,成本高,我们希望你们学有所成,这种重服务,你应该在其他培训里面是看不到的。 +- 有问题的同学,都会被约谈话,目的就是为了鼓励和督促大家学习,我们是在用心做辅导! + +![](https://pic.yupi.icu/5563/asynccode) + +## 适合人群 + +校招:时间紧迫,想在短时间内提升各方面的前端面试能力,我们导师都有丰富的大厂校招招聘经验,帮助大家针对性的快速提升能力,冲刺大厂 + +社招:已经离职,或者在职进阶,我们面试训练营目前有70%的同学在职提升,30%的同学离职准备面试。离职的同学还可以来到线下面试训练营学习! + +通过我们面试训练营的标准,进大厂的很多,但是我们依旧不能保证你肯定能够进大厂,保证你的基本都是在割你,现在这个行情什么样,不用我说大家都知道,我们尽力的帮助到大家进阶提升,通过我们的面试标准,直到拿到offer为止! + +### 学习周期 + +- 这个每个人都不一样,这边最快的同学一周就可以拿到offer了,但是实话实说案例不具有代表性,因为我们每个人目前的技术水平不同,所以我们有摸底的一个流程,摸底之后,知道你目前的水平,然后结合我们的经验,大概的能够给出你需要多久 +- 中位数,全职准备的周期大概是一个月左右,准备进大厂的时间在3个月+; +- 最终目的:我们的要求是通过我们的综合面试 + +## **服务多久**? + +加入前端训练营后,我们服务分为两个阶段,不同阶段的服务强度会有所区分: + +**密集训练阶段**:校招拿到offer为止,社招以找到新offer为止(社招最长限制2年,校招最长限制到毕业)。密集指导涵盖**一对一摸底定制化学习路线**、专项前端训练指导、一对一综合模拟面试、面试复盘、项目指导、每周督学等等。 + +**养老阶段**:是指已经通过我们的培训拿到offer的同学,我们后续新沉淀的知识库都是一直对学员开放的,并且需要帮忙的时候,我们还是会给你提供人脉和方向性建议。但为了规避法律风险,本阶段我们声明不再承担任何责任,并有权利终止任何服务。 + +### **怎么收费?** + +我们是多位导师强服务的模式,目前定价 **5000** **元** 。 + +比起其他培训机构动辄一两万的收费标准,这个价格说是白菜价格也不太过分吧。 + +随着报名的人越来越多,训练营沉淀的内容越来越多,我们付出的精力更多的时候,后面肯定会涨价的,而且涨价的幅度不是几十块的涨,而是几百块,甚至上千块的涨,所以**早加入训练营,是有价格优势** 的。 + +## 怎么报名? + +如果想报名、或者还有什么想要咨询的。 + +请直接 **扫码添加鱼皮** 的微信,记得要加备注【**前端训练营**】,发送您的个人情况,我们会帮你进行评估,看看是否适合加入~ + +> 添加好友后,免费送整理好的面试题资料哦! + +![](https://pic.yupi.icu/5563/asynccode) \ No newline at end of file diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/\345\220\216\347\253\257\347\252\201\345\207\273 - \347\213\202\351\243\231\345\220\216\347\253\257\350\256\255\347\273\203\350\220\245.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/\345\220\216\347\253\257\347\252\201\345\207\273 - \347\213\202\351\243\231\345\220\216\347\253\257\350\256\255\347\273\203\350\220\245.md" new file mode 100644 index 0000000..d6d3723 --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/\345\220\216\347\253\257\347\252\201\345\207\273 - \347\213\202\351\243\231\345\220\216\347\253\257\350\256\255\347\273\203\350\220\245.md" @@ -0,0 +1,318 @@ +# 后端突击 - 狂飙后端训练营 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +这是由鱼皮和几位腾讯高级工程师朋友们合伙打造的编程训练营,主打 **后端求职面试突击** ,帮助学员 **用最短的时间** 从 0 到 1 拿到满意的后端开发 offer! + +下面依次介绍下我们训练营已经积累的优势、提供的服务等。 + +> ⭐️ [文末有报名方式](https://yuyuanweb.feishu.cn/docx/ZvoZdFiUUoRNAdxGlSUcnbslnnb#EvBGdMn7eonLQpxXSXJcD4ednLc) + +## 训练营优势 + +### **1、成果太好看!** + +短短几个月,狂飙训练营的很多学员得到了飞速成长,接近 **60 位** 同学拿到了 **中大厂 offer**! + +如下图,覆盖了字节、阿里、美团、腾讯、百度、京东、快手、滴滴、华为、网易、微博、搜狐、拼多多、七牛云、B站、华为、小米、米哈游、理想、58 同城、携程、猿辅导、OPPO 等各大互联网公司。 + +![img](https://pic.yupi.icu/5563/asynccode) + +这个成绩,放到任何一家培训机构来看,都是无敌的存在。 + +![img](https://pic.yupi.icu/5563/asynccode) + +![img](https://pic.yupi.icu/5563/asynccode) + +### **2、导师团队太强大!** + +狂飙训练营的导师团队不仅有多名 BAT 国内大厂的后端高级工程师,还有爆款编程图解书籍的作者 - 小林 coding,知名技术 Redis 的核心贡献者等等。 + +![img](https://pic.yupi.icu/5563/asynccode) + +狂飙训练营的导师团队中,有 6 名以上都是 **全职** 来做训练营的!他们很多人放弃了自己的大厂工作,全身心投入到辅导学员这件事,也难怪出了这么多成果。 + +### **3、沉淀太丰富!** + +大家都知道,现在网上的学习资料非常多,找到资源并不难,难的是找到 **体系化的、高质量的** 学习资源,能够一条高速路学到底。 + +虽然我自己运营付费编程学习社群有一定年头了,也持续原创和整理了自己的编程学习体系资料。但是看到狂飙训练营的内容,还是深感佩服。 + +比如下面这张图,是最外层的知识体系,各个板块的建设都很全面: + +![img](https://pic.yupi.icu/5563/asynccode) + +最关键的是,狂飙训练营的很多资料都是 **多名导师共同原创** 的,汇集了多名大厂面试官的知识和经验,这不是任何一位个人 UP 主、或者网上那些资料能够比拟的。 + +比如下图的专项面试题库: + +![img](https://pic.yupi.icu/5563/asynccode) + +### **4、方法太专业!** + +只凭好的导师和丰富的资料,也是很难带这么多学员拿到 offer 的,更关键的是狂飙训练营独特的 **教学方法** 。 + +大部分刚加入同学都是学习很迷茫的同学,但通过给他们 **私人定制** 学习路线,很多同学就坚持跟着学了,大部分校招生由于时间比较充裕,能保持每日高强度的学习,再加上训练营 **多对 1** 的答疑指导服务,基本 3 个月就卷出了可以去实习面试的水平。 + +有一个学员是很典型的案例,刚进来时候,很多技术栈都是不清楚不了解的状态,卷了几个月后,达到可面试的水平,不过刚去找实习的时候,也是屡屡碰壁,周报的内容也充斥很多 emo 信息,还好顶住了情绪和压力,持续 1 个多月面试,最终还是拿下了美团offer。 + +![img](https://pic.yupi.icu/5563/asynccode) + +也有黑马级别的同学,进来才 2 个星期,他们给辅导了项目,就拿到了美团实习 offer,甚至还自愿帮忙打广告。 + +![img](https://pic.yupi.icu/5563/asynccode) + +下面是我拉到狂飙训练营中参与学习的小伙伴的真实反馈: + +![img](https://pic.yupi.icu/5563/asynccode) + +导师们强强联合,共同做好一件事,给学员带来更大的价值。 + +一句话,做好后端训练营这件事,我们是认真的! + +接下来,详细说说我们的 狂飙训练营,能为大家提供什么?怎么带大家 **求职突击** ? + +## **我们能帮你什么?** + +### **1、1 对 1 定制学习计划** + +网上有很多大而全的学习路线,如果你的时间足够,跟着学倒也没什么问题。但是如果你想要 **弯道超车** ,就必须在有限的时间,学到最重要的知识,才能把我们的时间价值放大化。 + +训练营导师里有多名资深的大厂面试官,所以 **我们会根据大厂后端面试重点,1 对 1 定制化你的学习计划**,让你所学知识在大厂面试中都能 **命中** ,而不会让你无厘头的乱学、低效努力。 + +我们首先会根据你目前的情况,判断处于哪一个阶段,为你量身定做一份学习计划。你要做的很简单,只要坚持学就行,学习上的问题我们都会帮你解决。 + +每个学员都自己的专属学员空间,你的学习计划、专项学习笔记、综合模拟面试的记录都会记录在这里,便于复盘。 + +![img](https://pic.yupi.icu/5563/asynccode) + +### **2、保姆级专项训练** + +我们把后端必学的知识,划分成一个一个 **专项训练** ,比如 **Java 语言专项训练、Go 语言专项训练、****MySQL** **专项训练、Redis 专项训练、项目专项训练、网络专项训练、操作系统专项训练、系统设计专项** 等等。 + +每一个专项训练,我们都会提供严格甄选的资料,让你快速进入专项学习,根据你当前的技术情况,告诉你看什么资料,哪些知识点重要,带着什么问题去看。 + +![img](https://pic.yupi.icu/5563/asynccode) + +每个专项周期通常是 2-3 周,具体根据你当前的基础、以及能投入的时间决定,导师们在中间会关注你的进度,并解答问题。 + +比如,下面是 MySQL 专项训练的指引,每一个知识都给出需不需要重点掌握,以及要学到什么程度,**带着什么问题学**。 + +![img](https://pic.yupi.icu/5563/asynccode) + +除了之外,我们还会对每一个专项训练,**原创「学习与面试」的资料**,是完全体系化的学习资料,我们相比传统的理论书籍,会更注重面试方面的问答。 + +![img](https://pic.yupi.icu/5563/asynccode) + +![img](https://pic.yupi.icu/5563/asynccode) + +专项学习过程中,遇到任何不会的问题,都可以在专项群进行提问。 + +![img](https://pic.yupi.icu/5563/asynccode) + +每个专项群的氛围还是很不错的,有问题在专项群提问,同学之间共同讨论,各个导师也会负责解答。 + +![img](https://pic.yupi.icu/5563/asynccode) + +![img](https://pic.yupi.icu/5563/asynccode) + +而且好的问题,我们会统一收录起来,会定期分享一些好的问题给大家一起学习。 + +![img](https://pic.yupi.icu/5563/asynccode) + +只要学习专项过程中遇到问题,把问题抛给我们就行,我们会讲解到你明白为止。 + +我们不希望同学们浪费了大量时间去搜寻答案,还没有结果的话,就糟糕了,这样学习积极性就会有所下滑。 + +### **3、专项练习题** + +很多同学其实学习能力没问题,看过很多书,也能理解知识,但是面试的时候,总是答不到重点,不知道面试官想要的回答是什么,这是很吃亏的。 + +甚至有的同学,在面试的时候,背题的痕迹太过于明显,这样很容易被面试官感觉你是背的,没有自己理解,也是有可能被挂掉的。 + +![img](https://pic.yupi.icu/5563/asynccode) + +这里贴几个学员在大厂面试中,由于背的太好,被面试官提一嘴。 + +![img](https://pic.yupi.icu/5563/asynccode) + +![img](https://pic.yupi.icu/5563/asynccode) + +所以,为了培养学员回答面试问题的能力。当学员学完某一个专项知识后,我们会要求你 **用自己语言在专项题库答题** ,题库都是 **高频的面试题** ,回答完题库后,**发给导师点评,导师会给予补充和提意见**。 + +通过这种专项练习题库,学员可以了解知识掌握情况,找出自己的问题查漏补缺,同时也更能理解面试官到底在问什么,增强学员的面试能力。 + +当然,**我们导师团队自己也写了专项练习题库的答案**,会从「分析->回答->推荐资料」三个环节,帮助大家掌握这道面试题的知识,同时会说怎么样的回答才是重点。贴几个给大家看看。 + +mysql题库-导师版: + +![img](https://pic.yupi.icu/5563/asynccode) + +redis题库-导师版: + +![img](https://pic.yupi.icu/5563/asynccode) + +golang题库-导师版: + +![img](https://pic.yupi.icu/5563/asynccode) + +等学员完成了全部专项训练后,我们最后会进行 **模拟面试** ,面试流程都会让学员经历一遍,我们所问的问题,都是 **对标大厂面试标准** 的,所以相当于你可以获得很多次的大厂面试机会。 + +![img](https://pic.yupi.icu/5563/asynccode) + +下面是某位学员模拟面试后的感受: + +![img](https://pic.yupi.icu/5563/asynccode) + +这样可以让学员适应面试节奏,根治学员面试的紧张感。更重要的是梳理面试回答的层次和逻辑,清楚知道面试官想要的答案,等到真实自己去面试的时候,就能从容应对面试了。 + +### **4、对标大厂的项目** + +最让校招的同学头疼的事情就是项目了,很多同学的项目都是网上烂大街的,比如 webserver、动态线程池、XX 外卖、各类电商项目,面试官一看,就知道是玩具项目来的,很难让面试官眼前一亮。 + +面试官对你的项目不感兴趣的话,项目问题就不会怎么问了,但是这样整个面试都会深挖你八股文,面试难度就会上来了。 + +我们训练营的项目是 **大厂的真实项目** ,是某位大厂程序员晋升答辩用的项目,我们经过改造后,作为训练营的项目,所以项目的立意是站的住的,**拿晋升的项目,给大家用来面试,妥妥地****降维****打击**。 + +![img](https://pic.yupi.icu/5563/asynccode) + +我们会从方案设计、方案评审、代码开发一一给大家讲解,这样的项目有数据支撑并经过生产验证,知道哪里有问题,哪里可优化,在面试时也会比较有优势。同时 **针对项目的简历描述和面试问题**,我们都帮你整理好的了。 + +![img](https://pic.yupi.icu/5563/asynccode) + +根据学员的反馈,训练营的项目是能让面试官感兴趣的。**一个能引起面试官感兴趣的项目,在面试是很加分的。**你想想,面试的时长一般都是固定的**,如果有 60-70% 时间都在问项目,那么是不是八股文就问的少了?**这样面试的难度相比全程都在挖八股文就降低了很多。 + +我们项目的问题也都帮大家准备好了,完全不用担心面试时不知道怎么回答项目相关的问题! + +![img](https://pic.yupi.icu/5563/asynccode) + +怎么样?够保姆级吧,我们导师把最脏活累的事情都给干了,学员们坐享其成就好。当然项目肯定是要学员自己去实现的哦。 + +除了大厂项目外,我们也提供了很多 **适合练手学习、提升项目经验** 的原创项目。 + +鱼皮本人的原创项目,也会对训练营的同学们提供: + +![img](https://pic.yupi.icu/5563/asynccode) + +如果你又有对标大厂的深度项目、又有足够的做项目能力,那么无论是简历还是面试,通过率都会大大增加! + +### **5、简历指导 & 项目挖掘** + +在学员准备找工作前,我们还会对学员的简历进行优化。 + +比如这位同学,之前自己写的简历,投了很多岗位,都没有面试机会,被我们修改之后,获得了很多机会,并且还进了大厂。 + +![img](https://pic.yupi.icu/5563/asynccode) + +![img](https://pic.yupi.icu/5563/asynccode) + +对于社招同学来说,**项目挖掘** 这一块是收益最大的,提前挖掘你的项目面试的重难点,然后针对性的复习和巩固,到真实面试的时候,就能从容应对的了,项目挖掘会议平均持续 1 小时。 + +![img](https://pic.yupi.icu/5563/asynccode) + +### **6、面试复盘** + +模拟面试后,我们都会给学员复盘,给学员反馈哪些知识学员还需要加强学习的、哪些知识是没有回答到重点的,然后要求学员将模拟面试的会议总结成文档。 + +然后导师们会针对面试总结的内容进行评论,学员再进行回复,通过这种方式,**可以将一次面试的知识,吃干抹净**。经过这样的 **专项题库练习 + 综合模拟面试 + 面试复盘** ,学员的成长是很快的,多次查漏补缺,快速达到求职的面试标准。 + +另外,我们也会**对学员真实的面试记录进行复盘**,目前训练营沉淀了很多同学新鲜出炉的大厂面经。 + +![img](https://pic.yupi.icu/5563/asynccode) + +这里的每一份面经都是可以学习的资料,因为每一份面经,导师们都针对同学面试回答做了评论和解析,会补充怎样答会更好,又或者需要去看哪些资料进一步学习。 + +![img](https://pic.yupi.icu/5563/asynccode) + +根据学员的反馈,这样他们边面试、导师边点评面经的效果还是不错,能够快速发现他们哪些知识点是缺失的,然后提供解答,快速补齐上来,下次在遇到相同的题目,就能回答更好。 + +### **7、每周分享会** + +每周六晚上,我们都会组织全员的分享会(平均每次 1 小时),主题涉猎技术讨论、技术开阔、求职心得、学习方法等等。 + +这些是我们历史沉淀的视频分享会,每周都会有新的视频分享会,一周周的积累,以后这里也是一个庞大的学习资料。 + +![img](https://pic.yupi.icu/5563/asynccode) + +### **8、周报监督学员** + +来了训练营的学员,就 **不准躺平** !每周我们会要求学员写周报,把自己这一周所学的知识记录下来。 + +同学们在学习上(或者生活上)有困难,都可以在周报提出,我们会针对你的困难做出答复,除了技术问题解答之外,情绪上开始焦虑、emo 了、工作上被 pua 了,都可以找我们沟通,我们也会做给你做 **心理按摩** 哈哈。 + +![img](https://pic.yupi.icu/5563/asynccode) + +针对不活跃的同学,我们导师也会私下去沟通学员,看看是不是遇到什么困难,或者也可能是出现了迷茫,其实这些情况有很多办法可以调整、解决,但是当事人往往会陷入巨大的内耗,此时就需要沟通来找到问题所在、走出困境。 + +OK,我们的服务就介绍到这里,在你下决心报名前,请先再耐心阅读下面的内容哦!**文末有报名方式。** + +## **其他问题** + +### **适合什么群体?** + +- 校招冲刺:玩了几年,时间紧迫,想在短时间内提升最多战力的;基础还可以,想冲刺中大厂后端 Offer 的; +- 在校生:计算机萌新,感到迷茫,不知道怎么学习的;想好好规划四年又无从下手的;想拼搏几年,找个好出路的;非科班专业想转行后端程序员的; +- 社招:想转行后端开发;需要体系化指导或者挖掘项目问题的; + +还是多啰嗦一句,我们是**后端训练营**,如果你是想从事嵌入式、机器学习、前端开发、大数据开发等等,就不符合我们训练营的方向了。 + +### **导师团队什么配置?** + +目前我们导师团队: + +- **小林哥**,小林coding 公众号作者, 图解网站站长,全网粉丝超 40W+,著有《图解网络》、《图解系统》、《图解MySQL》、《图解 Redis》开源书籍,Gihutb 开源不到 1 年,斩获 6k+ star,文章阅读量累计超上千万,帮助数万程序员击破八股文的恐惧。 +- **牛哥**:大厂资深面试官,腾讯 T10 工程师。末流二本,校招逆袭进腾讯,多年来混迹各个大厂:腾讯->外企->字节->腾讯,融多家所长于一身,深谙面试方法论,极具答辩和指导才能。 +- **鱼皮**:前腾讯全栈工程师,现科技公司创始人,全网 150 万+ 粉丝编程博主。爱做项目爱分享,GitHub 中国区前 20,有 30+ 独立项目经验,善于把 Java 后端项目讲得通俗易懂。 +- **川哥**:阿里高级工程师。面试经验丰富,实习腾讯,校招字节,社招阿里。有过C++,Go语言开发经历,资深Java工程师,有多年大厂核心项目经验。 +- **鹏哥**:腾讯高级工程师,职场经历丰富,从华为到外企、从外企到腾讯,有过 Java,C++ 语言的开发经历,资深 Gopher ,有多年后台微服务架构经验和实操经验,对后台知识的学习颇有心得。 +- **涛哥**:某赛道国内头部公司,资深Java工程师、同时还具备Go 多年项目研发经验,有丰富的项目管理经验。 +- **七哥**:某一线大厂高级工程师,曾就职字节中台部门,有 Java、Go 大型项目工作经验,擅长微服务和分布式领域,熟悉面试官心理和把控面试节奏。 +- **飞哥**:百度高级工程师,熟悉Java,做过多个Java大型项目,同时也是资深Golang玩家,有多年相关实操经验。 +- **彬彬**:开源爱好者,Redis 7.0 和 7.2 活跃贡献者,Redis 社区 Member,积极参与社区贡献,200+ 的 PR 和 commit数,目前社区 commit 数量是排第四,专业解答 Redis 各种问题。 + +### **支持什么语言?** + +我们目前训练营主要是 Java 后端 和 Go 后端。 + +### **会亲自录制视频授课吗?** + +**我们卖的是服务,卖的不是课**,所以我们训练营的主线是服务,而不是传统培训的上课模式。 + +简单的知识,可以通过一份资料快速Get,这些资料互联网都很多,我们可以给你选择效率最高、坑最少的。 + +复杂的内容,通常需要很多操作才能理解,比如,先看B站初步认识,然后看几篇资料加深理解,然后可能是看某本经典的丛书,甚至可能是看源码去理解,有些东西,他一定不是一个课程就能讲清楚的。 + +### **一定能进大厂吗?** + +说保证进大厂的训练营,大概率是想割你的,我们不承诺这件事情。 + +我们能保证的是什么?只要你按我们的安排走,你一定可以通过专项训练得到巨大的提升,至于提升多少,其实是边际递减的。 + +你离大厂越远,提升得就越多,假设现在你只有 10 分,那在我们的科学指导下,提升到 70 分,那进度肯定是突飞猛进;而你本身就离大厂很近,已经 80 分了,我们有信心给你提升到 90 分,但也就增加了 10分,当然**这 10 分的含金量非常的大**,也许你差大厂就一步之遥,这一步,我们来给你补上。 + +### **怎么收费?** + +我们是多位导师强服务的模式,目前定价 **5000 元**(校招可分期)。 + +比起其他培训机构动辄一两万的收费标准,这个价格说是白菜价格也不太过分吧。 + +随着报名的人越来越多,训练营沉淀的内容越来越多,我们付出的精力更多的时候,后面肯定会涨价的,而且涨价的幅度不是几十块的涨,而是几百块,甚至上千块的涨,所以**早加入训练营,是有价格优势** 的。 + +### **服务多久?** + +加入后端训练营后,我们服务分为两个阶段,不同阶段的服务强度会有所区分: + +- **密集指导阶段**:校招拿到offer为止,社招以找到新offer为止(社招最长限制2年,校招最长限制到毕业)。密集指导涵盖定制化学习路线、专项训练指导、模拟面试、面试复盘、项目指导、监督周报等等。 +- **社群会员阶段**:在密集指导阶段结束之后,你就成为了我们的长期会员,我们后续新沉淀的知识库都是一直对学员开放的,并且需要帮忙的时候,我们还是会给你提供人脉和方向性建议。但为了规避法律风险,本阶段我们声明不再承担任何责任,并有权利终止任何服务。 + +## **怎么报名?** + +如果想报名、或者还有什么想要咨询的。 + +请直接 **扫码添加鱼皮** 的微信,记得要加备注【**后端训练营**】,发送您的个人情况,我们会帮你进行评估,看看是否适合加入~ + +> 添加好友后,免费送整理好的面试题资料哦! + +![img](https://pic.yupi.icu/5563/asynccode) \ No newline at end of file diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/\346\261\202\350\201\214 - \345\270\256\344\275\240\345\206\231\345\245\275\347\256\200\345\216\206\347\232\204\347\245\236\345\231\250.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/\346\261\202\350\201\214 - \345\270\256\344\275\240\345\206\231\345\245\275\347\256\200\345\216\206\347\232\204\347\245\236\345\231\250.md" new file mode 100644 index 0000000..9d447ba --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/\346\261\202\350\201\214 - \345\270\256\344\275\240\345\206\231\345\245\275\347\256\200\345\216\206\347\232\204\347\245\236\345\231\250.md" @@ -0,0 +1,129 @@ +# 求职 - 帮你写好简历的神器 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +鱼皮团队研发的《老鱼简历》网站:https://www.laoyujianli.com/ (1 分钟帮你生成精美的个人简历) + +鱼皮的大学简历在线版:https://laoyujianli.com/share/yupi ,欢迎体验~ + +![](https://pic.yupi.icu/5563/asynccode) + +## 优势 + +- 多种简洁专业的简历模板 +- 支持 AI 快速生成简历 +- 支持多种格式的简历导入 +- 简历实时编辑浏览 +- 简历内容智能纠错 +- 智能一页美化简历 +- 现成的简历例句和建议参考 +- AI 优化简历内容 +- 自定义简历模块和内容 +- 支持导出简历为 PDF 和图片 +- 在线分享简历链接 +- 简历一键脱敏分享 +- 求职经验分享百科 + +## 功能介绍 + +### 多种简洁专业的简历模板 + +![](https://pic.yupi.icu/5563/asynccode) + +### 支持 AI 快速生成简历 + +只需填写个人简介,即可快速生成一份求职简历 + +![](https://pic.yupi.icu/5563/asynccode) + +### 支持多种格式的简历导入 + +支持快速导入 Word、PDF、JPG、PNG、Markdown、Doc、Html 等多种格式的简历文件 + +![](https://pic.yupi.icu/5563/asynccode) + +### 简历实时编辑浏览 + +简单易用的简历编辑器,左侧编辑,右侧实时浏览。还支持自由调整样式、一键切换主题、自由添加模块、自由调整内容,帮你快速制作精美简历! + +![](https://pic.yupi.icu/5563/asynccode) + +### 自定义简历模块和内容 + +支持自由添加模块、自由调整内容和格式 + +![](https://pic.yupi.icu/5563/asynccode) + +### 简历内容智能纠错 + +不仅能够帮你快速修正错别字,还能优化专业名词、大小写、语句的连贯性等 + +![](https://pic.yupi.icu/5563/asynccode) + +### 智能一页美化简历 + +一键调整简历排版,自动优化到一页纸 + +![](https://pic.yupi.icu/5563/asynccode) + +### 现成的简历例句和建议参考 + +提供了丰富的、各职位、各模块的简历例句和简历建议,帮助你快速写好简历! + +![](https://pic.yupi.icu/5563/asynccode) + +![](https://pic.yupi.icu/5563/asynccode) + +### AI 优化简历内容 + +只需一键,AI 帮你优化简历的内容,修复错别字、内容更连贯、表达更专业! + +![](https://pic.yupi.icu/5563/asynccode) + +效果如下: + +![](https://pic.yupi.icu/5563/asynccode) + +### 支持导出简历为 PDF 和图片 + +示例导出效果如下图: + +![](https://pic.yupi.icu/5563/asynccode) + +### 在线分享简历链接 + +支持分享极简、干净的在线简历链接,以及自定义链接地址。 + +比如鱼皮的简历:https://laoyujianli.com/share/yupi + +![](https://pic.yupi.icu/5563/asynccode) + +### 简历一键脱敏分享 + +简历支持一键隐藏个人敏感信息: + +![](https://pic.yupi.icu/5563/asynccode) + +效果如下: + +![](https://pic.yupi.icu/5563/asynccode) + +### 求职经验分享百科 + +精选大厂同学的求职经验分享文章,帮助你提高求职竞争力! + +![](https://pic.yupi.icu/5563/asynccode) + +## 欢迎免费使用 + +老鱼简历网站:https://www.laoyujianli.com/ (1 分钟帮你生成精美的个人简历) + +会员可以在个人主页加入专属群聊哦: + +![](https://pic.yupi.icu/5563/asynccode) + +## 老鱼简历团队招人啦! + +[🔥 招聘中 - 产品运营岗位(实习)](https://yuyuanweb.feishu.cn/wiki/EpYUwByuHi3GSWkTNcpcULX6nPd) \ No newline at end of file diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/\347\256\227\346\263\225\345\255\246\344\271\240 - \347\274\226\347\250\213\345\257\274\350\210\252\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/\347\256\227\346\263\225\345\255\246\344\271\240 - \347\274\226\347\250\213\345\257\274\350\210\252\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221.md" new file mode 100644 index 0000000..c65c631 --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/\347\256\227\346\263\225\345\255\246\344\271\240 - \347\274\226\347\250\213\345\257\274\350\210\252\347\256\227\346\263\225\351\200\232\345\205\263\346\235\221.md" @@ -0,0 +1,198 @@ +# 算法学习 - 编程导航算法通关村 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +> 帮助你更快学习算法的服务 +> +> 本期开营时间:**10 月 15 日** 开营,服务将持续 2 个月整,现在开放报名中! + + + +大家好,我是鱼皮。 + +先问朋友们一个问题,大家觉得学习算法难不难? + +近一年来,我收到了很多私信,说想要入门学习算法、提升算法能力、过关笔试面试,但是却被算法折磨得非常头疼! + +比如第一次刷算法,找不到系统学习路线,担心自学效率太低: + +![img](https://pic.yupi.icu/1/(null)-20231031221047616.(null)) + +学习算法坚持不下去,需要有人能监督自己: + +![img](https://pic.yupi.icu/1/(null)-20231031221047866.(null)) + +刷算法题目遇到问题,需要人答疑: + +![img](https://pic.yupi.icu/1/(null)-20231031221048024.(null)) + +刷过的算法题不会总结,下次遇到了还是不会做: + +![img](https://pic.yupi.icu/1/(null)-20231031221048175.(null)) + +可即使算法难学,我们还是得迎难而上啊。因为算法和数据结构实在是太重要了!只要是学编程的同学,无论你是考研、还是求职笔试面试,基本都会考察算法。 + +那有没有 **更轻松、更高效** 的方式学习算法呢? + +之前虽然给大家分享过我原创的算法学习路线和方法,但很多同学还是学不会。。。 + +所以,我终于决定出手了!经过很长时间的准备后,建设了 `编程导航算法通关村 🏡`,以 **独创的闯关模式** 带大家更轻松地攻克算法数据结构! + +目前已经开展了多期算法通关村,广受大家好评,有不少小伙伴表示 **学上头了** !这才有底气给大家宣传。 + +![img](https://pic.yupi.icu/1/(null)-20231031221048427.(null)) + +### 算法通关村是什么? + +区别于传统死板地刷题,各位算法村的勇士,将通过我们独创的 **闯关** 模式,在 **2 个月** 的时间,通过一系列精心设置的关卡(教程 + 挑战),循序渐进地系统掌握 **20 大面试必学** 算法知识。 + +![img](https://pic.yupi.icu/1/(null)-20231031221048618.(null)) + +我们有专业的算法教官和学习群,为你提供问题解答、定期直播算法分享等服务,助力勇士们通关算法! + +### 算法教官 - 鱼骨头 + +算法村有专业的算法教官,名为 `鱼骨头`。 + +> 为什么叫鱼骨头? +> +> 因为算法是编程学习中难啃的骨头,教官会带同学们啃下这块硬骨头。 + +教官介绍: + +- **中国科学院计算机硕士** +- 曾任职 **新浪微博、美团** 等 **大厂高级工程师** +- 19 年 DoraHacks 比赛一等奖、微软赛道 **冠军** +- 多年算法教学经验,精通算法体系和面试考点 +- 不仅教你做题,还教你出题! + +![img](https://pic.yupi.icu/1/(null)-20231031221048776.(null)) + +在学习算法过程中遇到的任何问题都可以询问算法教官,我们会尽最大的能力帮大家掌握算法知识点。 + +### 算法通关村提供的服务 + +一句话概括:算法闯关式学习教程 + 每日算法答疑 + 实时辅导督促跟进 + 每周算法直播分享。 + +#### 闯关式学习 + +我们不是传统讲课式的算法教学,那样学效率太低了!且枯燥。 + +算法村主打的学习方式就是 **闯关**。我们将算法教官根据多年教学经验创作的一套精品算法教程改造为 20 大关卡。 + +![img](https://pic.yupi.icu/1/(null)-20231031221048919.(null)) + +每关又包含青铜、白银、黄金 3 个级别,还有我们算法村 **原创** 的过关挑战题目: + +![img](https://pic.yupi.icu/1/(null)-20231031221049090.(null)) + +这样一来,大家只需要 **按照顺序** 跟着教程闯关学习,就能循序渐进地掌握算法,不用想着今天刷什么、明天刷什么,也不用担心太早接触难题被劝退了。 + +建议每天能抽出 1 - 2 小时进行算法学习。不过也不用担心学得慢或学不完,只要加入了算法村,2 个月之后仍然可以 **无限阅读** 算法教程(只不过我们不再提供额外服务)。 + +#### 每日答疑 + +大家遇到任何问题都可以随时向算法教官提问,有问必答! + +![img](https://pic.yupi.icu/1/(null)-20231031221049243.(null)) + +#### **监督学习** + +我们会全程陪伴大家完成算法闯关。 + +比如每日在群内督促大家、发布关卡、答疑指导: + +![img](https://pic.yupi.icu/1/(null)-20231031221049440.(null)) + +持续鼓励大家闯关打卡,制作算法闯关排行榜。大家不仅可以对比和其他同学的学习进度,还可以阅读他人的闯关笔记,帮助自己学习: + +![img](https://pic.yupi.icu/1/(null)-20231031221049610.(null)) + +我们还会不定期回访同学们的学习情况和进度,主打一个学习陪伴: + +![img](https://pic.yupi.icu/1/(null)-20231031221049804.(null)) + +#### 直播算法分享 + +每周定期开展,会针对性地讲解大家易错的算法知识点和进行算法答疑: + +![img](https://pic.yupi.icu/1/(null)-20231031221049968.(null)) + +### 适合同学 + +- 算法零基础,想快速学会算法 +- 求职在即,想快速应对笔试面试 +- 学算法很累,缺乏学习动力 +- 学算法困难,需要答疑辅导 +- 想全面掌握算法体系,开拓思维 +- 想巩固计算机基础,提升编程能力 + +目前支持的语言有:Java、C++、Python。 + +> 如果你自学能力很强,并且有算法基础能够自己完成算法刷题,那么不需要加入算法通关村。 +> +> 当然,如果你已经学过算法,也可以试试挑战一下算法村里的题目~ + +### 开营时间 + +本期开营时间:**10 月中旬**,服务将持续 2 个月整。 + +### 报名方式 + +算法村的价格是 **288 元**,新人限时优惠 🧧 **28 元**(券后 260 元),这个价格是包含了全程算法学习规划以及答疑指导的,**2 个月**的时间带大家循序渐进掌握 20 大算法。 + +> 如果你是 **[编程导航知识星球](https://mp.weixin.qq.com/s/O7G_oW0MqvOPZijOkcD7PA)** 里的同学,可享更大 **52 元**优惠(券后 236 元),付款的时候记得给算法村长截图你的星球编号页面 + +想加入算法村的同学,可以加 `算法村长` 微信,会给你发送报名链接并拉你进算法学习群,等待开营通知即可,早加入早学习! + +![img](https://pic.yupi.icu/1/(null)-20231031221050097.(null)) + +### 真实评价 + +以下是部分同学的真实反馈。 + +1)算法通关村安排的学习路线和学习氛围很给力 + +![img](https://pic.yupi.icu/1/(null)-20231031221050228.(null)) + +2)我们会监督大家持续的学习打卡,并且不定期的回访跟进大家的学习情况 + +![img](https://pic.yupi.icu/1/(null)-20231031221050380.(null)) + +3)每个专题的内容都非常重要,每一题都值得认真思考并弄懂 + +![img](https://pic.yupi.icu/1/(null)-20231031221050519.(null)) + +4)算法村的学习氛围非常好,算法教官和同学们都很热情的去帮助解决大家的算法困惑 + +![img](https://pic.yupi.icu/1/(null)-20231031221050640.(null)) + +5)在我们的引导和督促下,大家学习打卡非常积极,也分享了很多学习总结,甚至有的小伙伴的总结文章被评为 CSDN 数据结构与算法热榜第一名。 + +![img](https://pic.yupi.icu/1/(null)-20231031221050767.(null)) + +![img](https://pic.yupi.icu/1/(null)-20231031221050912.(null)) + +6)每关的学习打卡总结,让自己对每个算法知识点理解得更深刻 + +![img](https://pic.yupi.icu/1/(null)-20231031221051057.(null)) + +更多算法学习笔记,大家可以在百度搜索 "编程导航算法通关村" 🔍 参考学习下。 + +![img](https://pic.yupi.icu/1/(null)-20231031221051210.(null)) + +7)加入算法村,开始系统性的学习算法 + +![img](https://pic.yupi.icu/1/(null)-20231031221051354.(null)) + +8)一期学员算法刷题总结 + +![img](https://pic.yupi.icu/1/(null)-20231031221051524.(null)) + +### 报名方式 + +想加入算法村的同学,可以加 `算法村长` 微信,会给你发送报名链接并拉你进算法学习群,等待开营通知即可,早加入早学习! + +![img](https://pic.yupi.icu/1/(null)-20231031221051728.(null)) diff --git "a/\344\272\247\345\223\201\346\234\215\345\212\241/\350\200\203\347\240\224\351\231\252\350\267\221 - \347\274\226\347\250\213\345\257\274\350\210\252\350\256\241\347\213\227\344\270\212\345\262\270.md" "b/\344\272\247\345\223\201\346\234\215\345\212\241/\350\200\203\347\240\224\351\231\252\350\267\221 - \347\274\226\347\250\213\345\257\274\350\210\252\350\256\241\347\213\227\344\270\212\345\262\270.md" new file mode 100644 index 0000000..fd9eed3 --- /dev/null +++ "b/\344\272\247\345\223\201\346\234\215\345\212\241/\350\200\203\347\240\224\351\231\252\350\267\221 - \347\274\226\347\250\213\345\257\274\350\210\252\350\256\241\347\213\227\344\270\212\345\262\270.md" @@ -0,0 +1,116 @@ +# 考研陪跑 - 编程导航计狗上岸 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +大家好,我是鱼皮。 + +考研,近几年成为越来越多同学的选择,如果你此时也在备战考研,首先希望你要明白:考研是一个人的长跑 + +大家从近几年的数据统计也能看出,考研每年一战报名的人数还没有二战三战多,计算机考研作为考研中最激烈的赛道之一,尤其是随着各大高校改考408,竞争强度更加激烈。 + +近两年,和很多正在备战考研的同学都有过不同形式的接触,发现大家多数有如下两个问题的困惑,越是到考研后期,伴随着焦虑、恐惧的蔓延,越是无法直面回答这两个问题: + +- 互联网如此发达的今天,现在大家轻而易举的都能在交流群、网盘拿到各种复习资料,视频课程,择校信息,而且随着统考的规范,信息差也在快速减小。相同条件下,造成考研失败的原因有哪些? +- 基础、强化、冲刺复习阶段,为什么有的人节奏越来越乱,效率越来越低?越是复习到后期,发现会的越少,心态逐渐发生变化,该怎么及时调整节奏和效率? + +## 什么是计狗上岸? + +### 问题分析 + +上面的问题,本质还是因为缺乏复习规划和进度把控,这也是大多数考研同学的核心痛点 + +1. 没有领路人,考研就像自己关着灯洗衣服,你永远不知道衣服有没有洗干净。 +2. 进度把控不精准,不知道该怎么分配各阶段的学习时间,不知道自己的目标分数应分配多少的学习时长。 +3. 对于无基础跨考考生,408学的比较吃力,找不到重点,白白浪费时间。 +4. 缺少学习氛围,容易松懈,难以调整学习状态 +5. 自己搜集资料费时费力,机构的网课价格过高,质量堪忧。 +6. 录取信息不透明,考了高分却没有学上。 + +这些核心问题,网上充斥着大量的标题党,导致大家都熟悉这些话题,但是一直无法重视起来,**当在复习中后期因为时间的力量把这些问题从量变引起质变的时候,发现节奏会深受影响,进而加深焦虑进入负循环。** + +对于短平快的当下,社交媒体的信息大多是无效的垃圾信息、碎片化信息,但窥其究竟还是无法学以致用。 + +### 星球介绍 + +为了解决上面这些问题,鱼皮联手多名考研上岸的大佬共同开创了【计狗上岸】知识星球。 + +用一句话来描述我们做的事情:帮助大家进行计算机考研基础、强化、冲刺全阶段的复习规划,根据时间轴将复习规划拆分到各个阶段,关键位置的卡点监督,辅助大家进行合理进度把控。 + +以此为核心,扩展的服务参考下面服务详情 + +### 成员介绍 + +**1、**星主寅贝勒毕业于 **华中科技大学** 计算机专业,得益于考研的学历提升,毕业后有幸进入国内某头部互联网大厂,从事Go语言后端开发岗位。读研期间一直在帮助考研同学做复习规划、进度把控相关的事情,也**收获了一批上岸同学的感谢以及反馈**,我们非常想把这个模式推广给更多的同学。 + +- 华中科技大学硕士 +- 现字节跳动后端工程师 +- 帮助学弟学妹考研规划多年,上岸共计 53 位 985、211 的同学 + +**2、**个人的力量是有限的,同时还邀请了12位(目前)985、211的高分研0学长学姐们,其中也有之前帮助规划过的,今年一举上岸**北大、浙大、华科**的同学,以及经过多次会议沟通、学习方法突出、进度规划高效的高分学长学姐,来共建我们的计算机考研圈子! + +**3、**更加重要的是学习氛围,目前已经有**上百名**同学加入到我们的考研圈子,按照学长学姐的规划投入到紧张有序的复习中。 + +我们学计算机的同学,真的是累并快乐着,学习累的像狗一样,工作了连狗都不如,所以不要辜负我们的努力,一举上岸,上岸不止眼前的考研更是以后的编程打怪成长之路。 + +故取名:**计狗上岸**,自嘲的同时,又表达了我们的美好愿景! + +![](https://pic.yupi.icu/5563/asynccode) + +### 提供的服务 + +**主要服务方向** + +1. 复习规划: 根据每个人的复习情况,采用波浪复习计划,制定真正**适合自己的**复习规划。我们的目标就是“量体裁衣”! +2. 进度把控: 学长学姐对你的专业进度把控。你只需要安心学习,其他的全部交给我们。 +3. 监督打卡: 星球内发起的打卡挑战,通过打卡把进度展现给我们,我们会起到监督作用,同时根据情况调整学习规划。 +4. 资料分享:我们的初衷是让信息公平化。星球内包含11408、22408考生需要的全部资料,以及院校信息、扩招/改考信息、近年录取名单等。 +5. 心态调整:考研是一场持久战,不仅考验学习能力,还考验心理素质。有一位过来人帮你作心态调整,相信你可以比别人跑得更快、更远! + +**具体内容** + +- 综合大量985,211学长学姐的上岸经验和学习方法论,总结出全网超高效基础、强化、冲刺三阶段复习规划 +- 根据时间轴将复习规划拆分到各个阶段,关键位置的卡点监督,辅助大家进行合理进度把控 +- 一对一向985、211的直系学长学姐提问,向有结果的人学习 +- 复习氛围浓厚,通过各阶段打卡切身感受到大家的真实进度,破除碎片化自媒体带来的焦虑 +- 针对25考研采取波浪复习计划,为不同复习进度的同学提供差异化复习方案 +- 原创408每日一题、408带背计划,巧妙帮你解决复习难点问题 +- 独家408刷题小程序 +- 专业的考研院校分析员,为大家提供“抄底信息”供大家参考 +- 一站式获得齐全的复习资料,省时省力备考 +- 知识点框架梳理,高密度知识总结 + +| ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | +| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| | | | | | | | | | | | + +## 适合同学 + +24 考研冲刺阶段、25 考研早鸟(其实也不算早了,越早准备越好) + +## 真实评价 + +| ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | ![](https://pic.yupi.icu/5563/asynccode) | +| ---------------------------------------- | ---------------------------------------- | ---------------------------------------- | +| | | | + +## 加入方式 + +用微信扫描下方二维码,可直接领取限时优惠并加入体验,3 天内不满意全额退款! + +![](https://pic.yupi.icu/5563/asynccode) + +如果你是 [编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 的成员,可以再多优惠 10 元,微信扫描下方二维码加入: + +![](https://pic.yupi.icu/5563/asynccode) + +如果还在犹豫,可以微信搜索《计狗上岸》公众号并关注,领取免费的资料。 + +## 常见问题 + +### 我现在是 25 届,现在加入星球对我有帮助么? + +25 届正常进度来看过完年就要开始基础阶段的复习,在当前的考研竞争环境中,非常建议早开始,早规划,早点清楚自己该做什么,星球里的专栏已经有基础阶段的全年规划贴以及25打卡活动,其中也有不少25的同学今年暑假就投入复习。现在加入在费用上也是比之后要便宜,而且可以早些享用服务,快人一步,提前感受一下 24 考研的冲刺氛围。 + +而且加入星球一年后续费是 5 折半价优惠哦~ \ No newline at end of file diff --git "a/\344\275\234\350\200\205.md" "b/\344\275\234\350\200\205.md" new file mode 100644 index 0000000..f1433e3 --- /dev/null +++ "b/\344\275\234\350\200\205.md" @@ -0,0 +1,146 @@ +# 本站作者 - 程序员鱼皮 + +## 个人介绍 + +98 年,前腾讯全栈工程师,担任腾讯云开发高级布道师、新人导师、曾获腾讯内云开发竞赛冠军。 + +现科技公司 [鱼鸢网络](https://yuyuanweb.feishu.cn/wiki/A9rGw0oLCilbqSk2XMPcTOv2nSs) CEO,全网 150 万+ 粉丝编程知识博主,2 万人付费编程学习社群 [【编程导航】](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 的创始人,用户 10 万+ 编程学习网站创始人。 + +热爱分享编程知识,善于把 Java 后端、前端、项目讲得通俗易懂。 + +爱做项目,编程 7 年间,有 30+ 丰富的网站和独立项目开发经验,GitHub 中国区前 20。 + +热爱写作,累积创作近千万字,大学曾出版区块链书籍。 + +会持续分享编程干货和好玩的知识~ + + + +## 个人经历 + +大学期间,我自学了多种编程语言和技术栈,如 Java 后端、前端、小程序开发等,在校作为工作室负责人带队建设了 **几十个** 网站,以 **专业第一** 的成绩拿过国家奖学金、挑战杯学术竞赛 **国奖** & 上海市 **特等奖**、上海市优秀毕业生、大学年度人物。大三曾出版过《区块链智能合约技术与应用》教材,也曾有过金融科技公司、**字节跳动**、**腾讯** 等三家公司的实习经历。 + +秋招时拿到多家大厂 offer,最终以 **组内第一** 的成绩转正腾讯,斩获 **SSP 最高级别** offer。 + +在职腾讯近 4 年,独立负责 BI 项目研发、大数据研发等,曾获腾讯内部应用开发竞赛 **冠军**、**5 星优秀员工**,担任过新人导师。 + +平时绝大多数的时间都花在了工作 + 创作上,知识分享是我的爱好,想给大家留下一些有用的东西。 + + + +## 知识分享 + +### 公众号程序员鱼皮 + +关注者 40 万+,鱼皮原创博客,编程学习经验、技术干货、项目设计思路、大厂求职面经、个人成长经历、免费编程学习资料分享,帮你少走弯路进大厂: + +![](https://pic.yupi.icu/1/20231026104004688.png) + + + +### 公众号编程导航 + +关注者 15 万+,分享编程学习指南、编程学习者们的亲身经验和干货。 + +![](https://pic.yupi.icu/1/20231026104005005.png) + + + +### B 站 + +主页:[https://space.bilibili.com/12890453](https://space.bilibili.com/12890453) + +关注者 60 万+,分享编程干货、个人学习方法、自制的、好玩的编程项目,希望做一些不一样的内容,带大家一起感受编程的乐趣! + + + +### GitHub + +中国区排名前 20,有很多本人原创的项目代码~ + +地址:[https://github.com/liyupi](https://github.com/liyupi) + +国内:[https://gitee.com/liyupi](https://gitee.com/liyupi) + +欢迎 follow ⭐️ + + + +### 其他平台 + +抖音:50 万粉,分享有意思的编程小知识 + +知乎:10 万粉,[https://www.zhihu.com/people/coder_yupi](https://www.zhihu.com/people/coder_yupi) + +CSDN:[https://liyupi.blog.csdn.net/](https://liyupi.blog.csdn.net/) + +掘金:[https://juejin.cn/user/2444938365386621](https://juejin.cn/user/2444938365386621) + +网易云音乐等平台均叫【程序员鱼皮】。 + +欢迎大家关注俺,一起学习进步~ + + + +### 创业记录 + +我的创业记录分享《屑老板不破产》:[https://space.bilibili.com/1754801268](https://space.bilibili.com/1754801268) + + + +## 作品 + +### 主导项目 + +老鱼简历,1 分钟生成精美的个人简历:[https://www.laoyujianli.com](https://www.laoyujianli.com) + +鱼聪明 AI,做您强大的 AI 助手:[https://www.yucongming.com/](https://www.yucongming.com/) + +编程导航,做您编程路上的导航员:[https://www.code-nav.cn/](https://www.code-nav.cn/) + +框框大学:[https://kkdaxue.com/](https://kkdaxue.com/) ,曾被澎湃新闻等媒体报道的免费大学各专业建议网站 + + + +### 纯个人作品 + +SQL 闯关式自学网(纯前端项目):[https://github.com/liyupi/sql-mother](https://github.com/liyupi/sql-mother) + +极客范儿浏览器主页(重前端项目):[https://github.com/liyupi/yuindex](https://github.com/liyupi/yuindex) + +SQL 数据生成器(React + Java):[https://github.com/liyupi/sql-father-frontend-public](https://github.com/liyupi/sql-father-frontend-public) + +免费网络安全自学网(纯前端项目):[https://github.com/liyupi/ceshiya](https://github.com/liyupi/ceshiya) + +结构化 SQL 语句生成器:[https://github.com/liyupi/sql-generator](https://github.com/liyupi/sql-generator) + +面试刷题网(React + Node):[https://github.com/liyupi/mianshiya-public](https://github.com/liyupi/mianshiya-public) + +编程资源网(React + 云开发):[https://github.com/liyupi/code-nav](https://github.com/liyupi/code-nav) + +AI 自动回复工具(Java 项目):[https://github.com/liyupi/yu-auto-reply](https://github.com/liyupi/yu-auto-reply) + +鱼了个鱼(纯前端项目):[https://github.com/liyupi/yulegeyu](https://github.com/liyupi/yulegeyu) + +表情包网站(Vue + Java):[https://github.com/liyupi/father](https://github.com/liyupi/father) + +静态文档网站:[https://github.com/liyupi/code-xingqiu](https://github.com/liyupi/code-xingqiu) + +Ikun 测试器(Vue):[https://github.com/liyupi/ikun-test](https://github.com/liyupi/ikun-test) + +名称生成器(Vue):[https://github.com/liyupi/good-name](https://github.com/liyupi/good-name) + + + +## 万人编程学习圈 + +2 万多人的编程学习圈子,欢迎加入,开启你的编程起飞之旅:[💎 编程学习 - 编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) + +![](https://pic.yupi.icu/1/20231026104005197.jpeg) + + + +## 商务合作 + +欢迎阅读:[商务合作](https://yuyuanweb.feishu.cn/wiki/AOzgw1mOliX6SskAVEicK6u7nDA) + diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/C++\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/C++\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..7f3112c --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/C++\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,574 @@ +# C++ 学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + + +## C++ 介绍 +### 语言特性 + +> 比较官方,仅供参考 + + +C++ 是一种面向对象的、通用的、静态类型的编程语言,它是 C 语言的一种扩展。 + +C++ 语言支持多种编程范式,包括面向对象编程、泛型编程和过程式编程等,因此具有很高的灵活性和可扩展性。 + +C++ 相对于其他高级语言(比如 Java)来说,更加底层,因此具有高性能、可移植、可重用等优点,被广泛应用于系统开发、嵌入式系统、服务端开发、游戏开发、图形学、音视频处理、金融分析等领域。 + +C++ 标准语法的发展也是非常快的,目前最新的标准都到 C++ 20 了!而且随着它的发展,它具有了丰富的语法和库支持,大学计算机专业的同学一般也会从 C++(C 语言)开始学起。 + +### 就业方向 + +C++ 的就业方向还是非常多的,鱼皮建议大家 **首先根据自己的兴趣爱好** 来做选择。 + +#### 服务端开发 + +一般就是我们常说的后端开发了。C++ 语言在高性能服务器开发、大数据处理、金融领域等都有广泛应用。对于用户 / 并发量非常高的系统(比如微信),通常会选择更高性能的 C++ 框架来开发。服务端开发工程师除了要学习后端都要学习的通用知识(比如数据库、缓存),还需要更熟悉网络编程、并发编程、内存管理等技术。 + +#### 系统开发 + +高性能的 C++ 无疑是系统开发的王牌语言!系统开发工程师负责设计和实现操作系统、驱动程序、嵌入式系统、网络协议栈等 **系统级** 软件,从事这个岗位必须熟练掌握 C++ 的语法、各种数据结构、算法、多线程编程、Linux 操作系统等技术。 + +#### 客户端开发 + +一般是指开发用户看的到的界面。C++ 语言在桌面应用程序、移动应用程序和游戏开发中有着广泛应用。C++ 客户端开发工程师和前端开发有着相似的学习要求,都需要掌握 GUI 编程、布局知识、跨平台开发技术。现在主流的开发软件是 Qt(鱼皮的毕设就是用它做的)。 + +#### 嵌入式开发 + +也是考虑到 C++ 的高性能,它被广泛应用于开发网络设备、汽车电子、智能家居、医疗设备等产品。嵌入式开发工程师和系统开发工程师的学习路径有相似之处,都需要学好 C++ 系统级编程以及操作系统知识。此外,嵌入式开发还需要了解硬件、嵌入式开发平台和相关工具。 + +#### 游戏开发 + +C++ 语言是游戏开发的主语言之一(另一个是 C#),比如当下很火的虚幻引擎的主语言就是 C++!对于游戏开发工程师,最重要的是热爱游戏!然后游戏开发也分界面和后台开发,前者需要熟悉游戏引擎、图形学、物理引擎等技术,后者和服务端开发的要求差不多,都要学好网络编程、并发编程。 + +#### 音视频处理 + +还是考虑到 C++ 的高性能,它在音视频编解码、视频渲染等领域有着非常广泛的应用!音视频处理工程师除了 C++ 基础知识外,还需要熟悉音视频格式、编解码技术、图形学等相关技术。 + +#### 图像处理 + +和音视频处理类似,都属于 C++ 计算类工作。图像处理工程师需要熟悉图像处理算法、计算机视觉等,掌握各种 C++ 的图像处理库和相关算法。图像处理和音视频处理这方面的工作细分内容可能比较多,而且这类工作对数学会有一定要求,有些公司可能把它们定义为 “算法工程师”。 + +#### SDK 开发 + +C++ 也适用于开发各种 SDK(软件开发工具包)。SDK 开发工程师需要熟悉 C++ 的语言特性、SDK / API 的设计和接口开发、掌握软件开发原则和设计模式,要能够设计出易用、高性能、可靠的 SDK 接口,提供给其他开发者使用。国内这方面的岗位没那么多,很多时候合并到后端(服务端)开发了。 + +--- + +从上面这些岗位,我们会发现,虽然都是学 C++,但不同方向的工程师需要侧重掌握的技能和专业知识也是有区别的。但是如果你还没确定选什么具体的方向,不妨先掌握它们都要求的通用技能,即能够熟练使用 C++ 语法来编程。 + +### 选 C++ 还是 Java? + +首先,明确一点,C++ 和 Java 都是非常优秀的主流编程语言,编程语言和技术没有绝对的优劣之分,只不过在不同的场景下,有更优的选择。而且,像很多大神说的一样,语言只是工具,编程思想才是核心。不过,选择好的工具也是至关重要的,“好的抓手才能带来更大的赋能”。 + +如果你对操作系统底层、嵌入式、图像处理、音视频处理、游戏开发等方向感兴趣,建议选择 C++;而如果你更喜欢开发应用系统、思考和实现业务逻辑,就选择 Java。 + +不过对于身在校园、且时间充裕的同学来说,我更建议 “我全都要”。可以先学 C 语言或 C++ 打基础(这也是大部分计算机专业学生在高校内学到的第一门编程语言),因为它相对底层,能帮助你接触到更多计算机的概念,比如操作系统资源管理、网络通讯等,从而为学习其他的编程语言做铺垫。然后再学习 Java 来做项目、找工作。 + +此外,因为 Java 和 C++ 都可以作为后端开发语言,所以无论把哪门语言作为主语言,都要重点学好后台开发通用知识,比如数据库、缓存、消息队列、Socket 通讯、Linux、Git、计算机基础知识等。但选择 C++ 的同学要对操作系统、网络和 Linux **更熟悉一些** 。 + +鱼皮专门针对这个问题写了一篇文章,欢迎阅读:[https://www.code-nav.cn/post/1640611259688742914](https://www.code-nav.cn/post/1640611259688742914) + +## 学习建议 + +1. 基础一定要打牢!这是 C++ 相对于 Java 这种上层语言来说最重要的一个建议,因为 C++ 可以更灵活地操作系统(比如自主分配内存),所以如果基础不牢固,你不仅不能发挥出 C++ 的高性能等特性,反而还可能写出更辣鸡的程序。像 C++ 基础特性(指针、引用等)、操作系统、计算机网络、算法数据结构等计算机基础都要认真去学。 +2. 其他的建议就不是 C++ 的专属了,学任何编程语言都一样,要多练习语法、多学习类库框架、多实践做项目、多读别人的项目和开源代码、多积累总结等等。 + +## 学习大纲 + +不同的 C++ 就业方向,要学的知识也是不同的,但是会有很多交集。 + +只要你学习 C++,C++ 的语法、Linux 服务器、操作系统、计算机网络等知识几乎都是必学的!(纯客户端界面开发除外,但最好也学习下) + +本学习路线以 C++ 的主流岗位 —— 服务端开发为例,大致分为以下几个阶段: + +1. C++ 语法基础 +2. C++ 进阶 +3. 计算机基础 +4. 软件开发通用 +5. 后端开发通用 +6. C++ 项目实战 +7. C++ 求职备战 + +## 一、C++ 语法基础 + +### 学习建议 + +对于完全 0 编程基础的同学来说,不建议上来就去看《C Primer Plus》(或者《C++ Primer Plus》)这种很厚的书籍,可能会被劝退。 + +对于大多数入门的同学,快速上手语法、能写出代码是最重要的。所以建议这里还是看培训机构在 B 站的免费视频教程:https://www.bilibili.com/video/BV1et411b73Z/,它们做入门课真的是有一手。 + +如果你们学校是从 C 语言开始学起,可以看浙大翁恺老师的 C 语言入门课:https://www.bilibili.com/video/BV1dr4y1n7vA,好评很多。 + +除了视频教程外,建议大家搭配一个文档教程(https://www.runoob.com/cplusplus/cpp-tutorial.html)一起学习,起到查漏补缺的作用。 + +初学 C++,除了学习基本的概念(比如变量、指针、引用)之外,一定要多上手敲代码练习、熟能生巧,还要能熟练地 debug 自己的程序,为以后开发更复杂的项目打好基础。 + +开发工具可以使用 Visual Studio(功能最强大)、Dev Cpp(最简单易用)、Code::Blocks(中规中矩)等。除了必须会用一款本地开发工具外,还可以搭配在线编程工具学习:[https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp](https://www.runoob.com/try/runcode.php?filename=helloworld&type=cpp) ,效率更高。 + +此外,建议把自己写过的每个代码文件都分类保存好、整理自己的笔记,忘了就查,而不要死记硬背。 + +学完本阶段后,可以试着用 C++ 去做一个简单的 XX 管理系统(控制台里运行即可),或者做一些 LeetCode 上入门级别的算法题目、学校里的 OJ 等等。 + +### 知识点 + +- 基础概念 + - 变量 + - 常量 + - 关键字 + - 数据类型 + - 运算符 + - 表达式 + - 控制结构 + - 条件分支 + - 循环 +- 开发工具 +- 函数 + - 函数重载 + - 默认参数 +- 基本数据结构 + - 数组 + - 字符串 +- 内存管理 + - 内存模型 + - 动态内存分配 + - 动态内存释放 +- 指针 + - 空指针 + - 野指针 +- 引用 + - 函数参数引用 + - 返回值引用 +- 结构体 + - 定义 + - 访问 +- 命名空间 +- 面向对象编程 + - 类 + - 对象 + - 封装 + - 成员变量 + - 成员函数 + - this 指针 + - 构造函数 + - 析构函数 + - 拷贝构造函数 + - 静态成员 + - 友元 + - 友元函数 + - 友元类 + - 运算符重载 + - 继承 + - 对象初始化顺序 + - 同名成员问题 + - 多继承 + - 虚继承 + - 菱形继承 + - 多态 + - 虚函数 + - 纯虚函数 + - 抽象类 + - 虚析构函数 + - 纯虚析构函数 +- 异常处理 + - 抛出 + - 捕获 + - 异常类型 + - 标准异常 +- STL + - 容器 + - vector + - string + - list + - pair + - set + - map + - deque + - stack + - 迭代器 + - 函数对象 + - 谓词 + - 一元谓词 + - 二元谓词 + - 内置函数对象 + - 算法 + - 排序 + - 查找 +- 类型转换 +- 模板 + - 函数模板 + - 类模板 +- 泛型 +- I / O 操作 + - 文件操作 + +> by 程序员鱼皮 [知识星球](https://docs.qq.com/doc/DUG93dVNHbVZjZXpo/) + + +## 二、C++ 进阶 + +上个阶段我们主要通过看视频来快速入门 C++ 基础编程语法;而这个阶段要做的是巩固基础、学习更多 C++ 的特性、甚至是底层原理,建议大家通过阅读经典书籍的方式来学习。 + +先系统学习 C++ 基础及进阶语法,可以读下面 2 本书籍: + +- 《C++ Primer Plus》:[https://book.douban.com/subject/10789789/](https://book.douban.com/subject/10789789/) +- 《Effective C++》:[https://book.douban.com/subject/5387403/](https://book.douban.com/subject/5387403/) + +学到这里,建议先去学习本路线第三阶段的计算机基础,否则下面的书啃起来会很累。 + +当你学完一遍算法、数据结构、操作系统、计算机网络后,再开始学习下面的内容。 + +学习 STL 源码,阅读《STL 源码剖析》:[https://book.douban.com/subject/1110934/](https://book.douban.com/subject/1110934/) + +然后学习 Linux 服务端编程,可以阅读: + +- 《Linux高性能服务器编程》:[https://book.douban.com/subject/24722611/](https://book.douban.com/subject/24722611/) +- 《Linux多线程服务端编程》:[https://book.douban.com/subject/20471211/](https://book.douban.com/subject/20471211/) + +网上有很多博主还推荐下面 2 本书,但是难度比较大,请大家根据学习进度和自身能力选择性阅读: + +- 《UNIX网络编程》:https://book.douban.com/subject/26434583/、[https://book.douban.com/subject/26434599/](https://book.douban.com/subject/26434599/) +- 《UNIX环境高级编程》:[https://book.douban.com/subject/1788421/](https://book.douban.com/subject/1788421/) + +### 知识点 + +- RAII +- C++ 11 新特性 + - 自动类型推导 + - lambda 表达式 + - 智能指针 + - 移动语义 + - 右值引用 + - 标准多线程库 + - nullptr 关键字 +- 类型转换 + - static_cast + - reinterpret_cast + - dynamic_cast + - const_cast +- 异常处理 + - 栈解旋 + - 异常接口声明 + - 异常对象生命周期 +- 工具 + - 编译工具 + - GCC + - 构建工具 + - CMake + - 调试工具 + - GDB + - 静态分析工具 + - Clang Static Analyzer +- 编码规范 + - Google C++ Style +- 程序执行原理 + - 编译 + - 链接 + - 静态链接 + - 动态链接 +- STL 容器实现原理 + - vector + - string + - list + - pair + - set + - map + - deque + - stack + +## 三、计算机基础 + +### 学习建议 + +由于 C++ 语言本身相对更底层,常用于系统开发、嵌入式、高性能计算等领域。因此 C++ 开发者相对于学 Java 或其他方向的同学来说,需要具备更扎实、更深入的计算机基础能力。 + +基础不是短短几天就能掌握的,需要持续学习、持续巩固。因此建议想快速就业的同学,可以先跳过这部分内容,把更多的精力放在后面开发框架的学习上,争取快速用 C++ 做出项目,等到面试前再去突击补习基础。而对于绝大多数计算机相关专业、或者学习时间比较富裕的同学,建议每天花 1 - 2 小时左右持续学习并巩固计算机基础,比如每天刷 2 - 3 道算法题,坚持半年那就是 500 多道,面试的算法关就基本没什么问题了。 + +### 知识点 + +> 点击可跳转到该知识点的详细学习路线 + + +- [计算机导论(计算机基本概念)](https://www.code-nav.cn/post/1641035880439271426) +- [数据结构和算法](https://www.code-nav.cn/post/1640586867363954689) +- [操作系统](https://www.code-nav.cn/post/1640587909942099969) +- [计算机网络](https://www.code-nav.cn/post/1640588119619551233) + +## 四、软件开发通用 + +### 学习建议 + +只要你想从事软件开发方面的工作,以下这些知识点,最好都按照顺序学习一遍! + +对 C++ 开发来说,Linux 系统是重中之重。掌握 Linux 可以帮你更好地理解系统底层的运行机制,比如进程管理、内存管理、文件系统、网络传输等。 + +除了 Linux 之外,软件开发的其他通用技能都可以融入到日常学习中,而不是花一大段连续时间去专攻。比如企业项目研发流程,读一遍有个印象就好;Git & GitHub 需要在平时做项目、用开源项目时多多使用;23 种主流的设计模式可以每天学 2 - 3 个;软件工程的专业知识大学科班一般都会教,学校不教的话作为一个课外知识去补充即可。 + +### 知识点 + +> 点击可跳转到该知识点的详细学习路线 + + +- [企业项目研发流程](https://www.code-nav.cn/post/1640631858620329986) +- [Git & GitHub](https://www.code-nav.cn/post/1640588753362108417) +- [Linux 系统](https://www.code-nav.cn/post/1640586295529324545) +- [设计模式](https://www.code-nav.cn/post/1640588392073150465) +- [软件工程](https://www.code-nav.cn/post/1640648711119892481) + +> by 程序员鱼皮 [知识星球](https://docs.qq.com/doc/DUG93dVNHbVZjZXpo/) + + +## 五、后端开发通用 + +### 学习建议 + +以下这部分知识点几乎适用于所有后端方向的同学(比如 Java、Go、Python 等),比如数据库、Redis、Nginx、消息队列都是通用的。只不过不同编程语言的后端开发用到的具体的开发框架、编程语法会有差别,比如 Java 的主流开发框架有 Spring Boot、Netty 等,而 C++ 主流开发框架有 Boost、gRPC、crow 等。 + +如果你还在纠结学 C++ 还是 Java,或者别的语言,不妨在能够独立做出项目的前提下,把最大的精力投入在数据库、Redis、Nginx、消息队列、架构设计等通用后端开发技能。 + +### 知识点 + +- 数据库 +- 开发框架 +- 包管理工具 +- Redis +- 消息队列 +- Nginx +- 微服务 +- 容器 +- 架构设计 + +由于这部分内容的大多数知识点都和 [鱼皮的 Java 学习路线](https://www.code-nav.cn/post/1640584449888772098) 一致,此处不再赘述,下面只列举 C++ 学习和 Java 学习中有差异的地方。 + +### 数据库 + +数据库就是存放数据的库,负责存储、管理和检索数据。 + +我们平时看到的网站上的数据,基本都是存放到数据库中的,在用户需要的时候,再通过后端程序从数据库中取出来。 + +数据库又分为关系型数据库和非关系型数据库。关系型数据库适用于存储相互之间有关联的数据,比如做一个学生管理系统,要存储学生、班级,一个班级有多个学生,这就是一种关联关系,关系型数据库典型的技术是 MySQL;而非关系型数据库主要用于存储零散的、相互独立的数据,典型的技术是 Redis。 + +此处我们主要学习的是关系型数据库,并且以最主流、学习成本相对更低的关系型数据库 MySQL 为主。 + +对 C++ 同学来说,对数据库的学习包括以下 4 个方面: + +1. 学习关系型数据库理论:包括关系模型、关系代数、数据库范式、事务理论等,能够帮助你更好地理解数据库的结构和设计。 +2. SQL 语言:作为关系型数据库的标准查询语言,掌握 SQL 是非常重要的!学习过程以实践为主,要能够熟练使用 SQL 来操作数据库(增删改查) +3. 数据库设计和编程:学习如何根据实际业务场景来设计数据库表、并且学习如何使用 C++ 来操作数据库,这是企业开发中最重要的能力。 +4. 数据库高级:初学数据库时这部分可以跳过。主要是学习数据库的高级特性、底层原理、数据库的分析、运维、性能优化等,可以帮助你更好地运用数据库来解决问题。 + +详细学习路线请参考:[https://www.code-nav.cn/post/1641797333479903234](https://www.code-nav.cn/post/1641797333479903234) + +### 开发框架 + +ORM 框架,作用是操作数据库。比如 ODB(https://www.codesynthesis.com/products/odb/)、QxOrm 等,学习一个即可。 + +Web 开发框架:作用是编写 HTTP 接口,可用于应用的后端(类似 Java 的 Spring MVC)。比如 Drogon(https://github.com/drogonframework/drogon)、Pistache(https://github.com/pistacheio/pistache)等,学习一个即可。 + +RPC 框架,作用是远程调用其他的服务,可用于实现分布式、微服务架构。推荐学习 Google 的 gRPC(https://github.com/grpc/grpc)。 + +其他框架可以从这个库中按需学习:[https://github.com/fffaraz/awesome-cpp](https://github.com/fffaraz/awesome-cpp) + +### 包管理工具 + +作用是帮你管理复杂的 C++ 项目依赖包。建议学习 conan:[https://github.com/conan-io/conan](https://github.com/conan-io/conan) + +### Redis + +详细学习路线请参考:[https://www.code-nav.cn/post/1640589994284695553](https://www.code-nav.cn/post/1640589994284695553) + +### 消息队列 + +参考:[https://www.code-nav.cn/post/1640584449888772098#heading-93](https://www.code-nav.cn/post/1640584449888772098#heading-93) + +### Nginx + +参考:[https://www.code-nav.cn/post/1640584449888772098#heading-98](https://www.code-nav.cn/post/1640584449888772098#heading-98) + +### 微服务 + +微服务是一种思想,可以使用上面提到的 gRPC 框架(https://github.com/grpc/grpc)实现微服务。 + +### 容器 + +参考:[https://www.code-nav.cn/post/1640584449888772098#heading-116](https://www.code-nav.cn/post/1640584449888772098#heading-116) + +### 架构设计 + +参考:[https://www.code-nav.cn/post/1640584449888772098#heading-169](https://www.code-nav.cn/post/1640584449888772098#heading-169) + +## 六、C++ 项目实战 + +初学 C++ 语法时,最好的项目就是刷算法题目,因为每道题目本质上就是在解决一个小问题。参考鱼皮的 [数据结构和算法学习路线](https://www.code-nav.cn/post/1640586867363954689) 。 + +由于 C++ 是个相对底层、注重基础的编程语言,很多 C++ 的练手项目都是 “手写轮子” 相关的,比如下面这些: + +- 编程语言 + - 用 C 语言实现自己的编程语言:[https://buildyourownlisp.com/](https://buildyourownlisp.com/) +- 开发工具 + - 开发自己的文本编辑器:[https://viewsourcecode.org/snaptoken/kilo/](https://viewsourcecode.org/snaptoken/kilo/) + - 国外手写 Linux 调试器教程:[https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/](https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/) +- 工具库 + - 手写简易 STL:[https://github.com/Alinshans/MyTinySTL](https://github.com/Alinshans/MyTinySTL) + - 简单 JSON 库:[https://github.com/dropbox/json11](https://github.com/dropbox/json11) + - 简单堆内存分配器:[https://github.com/CCareaga/heap_allocator](https://github.com/CCareaga/heap_allocator) + - XML 解析库:[https://github.com/leethomason/tinyxml2](https://github.com/leethomason/tinyxml2) + - 国外手写 TCP / IP 协议栈教程:[https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/](https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/) +- 数据库 + - SQLite:[https://github.com/sqlite/sqlite](https://github.com/sqlite/sqlite) +- 中间件 + - KV 存储引擎 LevelDB:[https://github.com/google/leveldb](https://github.com/google/leveldb) +- 开发框架 + - 网络编程库 muduo:[https://github.com/chenshuo/muduo](https://github.com/chenshuo/muduo) + - 超轻量 web 框架 oatpp:[https://github.com/oatpp/oatpp](https://github.com/oatpp/oatpp) + - 微信 RPC 框架 phxrpc:https://github.com/Tencent/phxrpc(简化版的微信后台 RPC 框架,冲鹅厂的同学推荐看) + - 搜狗 RPC 框架 srpc:https://github.com/sogou/srpc(有使用教程,上手还是比较容易的,先会用再仿写) + - 国外手写 RPC 框架教程:[https://users.cs.cf.ac.uk/Dave.Marshall/C/node33.html](https://users.cs.cf.ac.uk/Dave.Marshall/C/node33.html) +- 服务器 + - 轻量级 Web 服务器学习:[https://github.com/qinguoyi/TinyWebServer](https://github.com/qinguoyi/TinyWebServer) + - 超轻量型 Http Server - Tinyhttpd:https://github.com/EZLippi/Tinyhttpd(代码不到 500行,适合学习,详细注释版:https://github.com/cbsheng/tinyhttpd) + - 分布式服务器视频教程:https://www.bilibili.com/video/BV1YG41137Vk(评论区有资料) + - 高性能 web 服务器项目:[https://github.com/linyacool/WebServer](https://github.com/linyacool/WebServer) + - 国外并发服务器教程:[https://eli.thegreenplace.net/2017/concurrent-servers-part-1-introduction/](https://eli.thegreenplace.net/2017/concurrent-servers-part-1-introduction/) + - 代理服务器 tinyfecVPN:[https://github.com/wangyu-/tinyfecVPN](https://github.com/wangyu-/tinyfecVPN) +- 分布式系统 + - MIT6.824 中文教程:[https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/](https://mit-public-courses-cn-translatio.gitbook.io/mit6-824/) + +C++ 的项目视频比较少,建议大家在学做 C++ 项目的过程中多在网上搜索相关的文章和教程。 + +大家也可以从以下网站中挑选自己感兴趣的项目去学习: + +- C++ 相关类库:[https://en.cppreference.com/w/cpp/links/libs](https://en.cppreference.com/w/cpp/links/libs) +- GitHub C++ 内容合集:[https://github.com/fffaraz/awesome-cpp](https://github.com/fffaraz/awesome-cpp) + +## 七、C++ 求职备战 + +C++ 同学的面试重点主要分为 3 个大方向: + +1. C++ 语言本身 +2. 计算机基础 +3. C++ 领域技能(比如后端、嵌入式、游戏开发、客户端开发等) + +鱼皮分别从这 3 个方面给大家找了一些经典面试题,其中领域技能以后端为主,大家可以试着回答下。 + +### C++ 面试题 + +1. 是否关注过 C++ 的版本更新?比如 C++ 11 新增了哪些新特性? +2. 什么是 C++ 的虚函数和纯虚函数?它们分别有什么作用? +3. 如果虚函数是有效的,那为什么不把所有函数设为虚函数? +4. 什么是 C++ 的多态?它是怎么实现的? +5. C++ 函数重载和覆盖有什么区别? +6. 什么是 C++ 的智能指针?它有什么作用?有哪些种类? +7. 什么是 C++ 的模板?你在开发中是怎么运用模板的? +8. 什么是 C++ 的动态内存分配?用它有什么优缺点? +9. 什么是 C++ 的友元函数?它有什么作用? +10. 什么是 C++ 的 STL?你用过哪些 STL,是否有了解过 STL 的底层实现? +11. 指针和引用有什么区别?各自的应用场景是什么? +12. 如何计算一个类或结构体的大小? +13. C++ 会出现内存泄漏么?有哪些避免内存泄漏的方法? +14. new 和 malloc 有什么区别? +15. C++ 中有几种类型转换的方法? + +### 计算机基础面试题 + +#### 数据结构和算法 + +- LeetCode 精选 100 道:[https://leetcode-cn.com/problem-list/2cktkvj/](https://leetcode-cn.com/problem-list/2cktkvj/) +- LeetCode 精选算法 200 题:[https://leetcode-cn.com/problem-list/qg88wci/](https://leetcode-cn.com/problem-list/qg88wci/) +- LeetCode 算法高频面试题汇总:[https://leetcode-cn.com/leetbook/detail/top-interview-questions/](https://leetcode-cn.com/leetbook/detail/top-interview-questions/) + +#### 操作系统 + +1. 什么是进程和线程?二者有什么区别? +2. 操作系统是如何做到进程阻塞的? +3. 有哪些常见的进程通信方式? +4. 进程调度算法有哪些? +5. 线程是如何实现的? +6. 什么是 CPU 的缓存? +7. 什么是内核态和用户态?二者有什么区别? +8. 操作系统是怎么实现锁的? +9. 什么是死锁,什么情况下会出现死锁(必要条件)?怎么预防和处理? +10. 什么是系统调用? +11. 操作系统如何进行内存管理? + +#### 计算机网络 + +1. 介绍下计算机网络分层结构,各层有哪些常用协议? +2. TCP 和 UDP 协议有什么区别?分别适用于什么场景? +3. TCP 为什么需要三次握手和四次挥手?为什么不是两次握手、四次握手?为什么不是三次挥手? +4. TCP 滑动窗口和拥塞控制机制 +5. TCP 如何保证可靠性? +6. HTTP 协议常用状态码和含义 +7. HTTP 和 HTTPS 协议的区别? +8. HTTP/1.0、1.1、2.0 有哪些区别和改进? + +### C++ 后端面试题 + +1. 你用过哪些 C++ 网络编程库或 web 开发框架? +2. 你用过哪些 C++ 日志框架? +3. 什么是 socket 编程?C++ 中怎么进行 socket 编程? +4. C++ 有没有 ORM 框架?你用过哪些? +5. 你是怎么在 C++ 中进行多线程编程的? +6. 什么是 I/O 多路复用?如何使用 epoll 和 select 等 I/O 多路复用技术? +7. 有哪些知名技术(或框架)是用 C++ 实现的?是否有了解过它们的实现原理? +8. 是否了解过设计模式?请用 C++ 实现单例模式 + +### 资源 + +建议大家可以多主动看看各公司的招聘要求(尤其是大厂的要求),确认自己的学习重点。 + +#### 校招岗位 + +- 阿里 C++ 岗位: + - 研发工程师:[https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014816](https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014816) + - 客户端开发工程师:[https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014805](https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014805) + - 游戏开发工程师:[https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014826](https://talent.alibaba.com/campus/position-detail?lang=zh&positionId=2014826) +- 腾讯 C++ 岗位: + - 后台开发:[https://join.qq.com/post_detail.html?pid=1&id=101&tid=2](https://join.qq.com/post_detail.html?pid=1&id=101&tid=2) + - PC 客户端开发:[https://join.qq.com/post_detail.html?pid=2&id=102&tid=2](https://join.qq.com/post_detail.html?pid=2&id=102&tid=2) + - 游戏客户端开发:[https://join.qq.com/post_detail.html?pid=1&id=107&tid=2](https://join.qq.com/post_detail.html?pid=1&id=107&tid=2) + - 游戏引擎开发:[https://join.qq.com/post_detail.html?pid=1&id=221&tid=2](https://join.qq.com/post_detail.html?pid=1&id=221&tid=2) +- 美团 C++ 岗位: + - 软件开发:[https://zhaopin.meituan.com/web/position/detail?jobUnionId=1423888888&highlightType=campus](https://zhaopin.meituan.com/web/position/detail?jobUnionId=1423888888&highlightType=campus) + - 后端开发:[https://zhaopin.meituan.com/web/position/detail?jobUnionId=1422483100&highlightType=campus](https://zhaopin.meituan.com/web/position/detail?jobUnionId=1422483100&highlightType=campus) +- 华为软件开发:[https://career.huawei.com/reccampportal/portal5/campus-recruitment-detail.html?jobId=235686](https://career.huawei.com/reccampportal/portal5/campus-recruitment-detail.html?jobId=235686) + +#### 社招岗位 + +- 阿里社招:[https://job.alibaba.com/zhaopin/positionList.htm](https://job.alibaba.com/zhaopin/positionList.htm) +- 腾讯社招:[https://careers.tencent.com/search.html](https://careers.tencent.com/search.html) + +#### 实习 + +- 实习僧:[https://www.shixiseng.com/](https://www.shixiseng.com/) + + +## 学习资源 + +### 知识总结 + +- C++ 参考手册:[https://en.cppreference.com/w/](https://en.cppreference.com/w/)(最新的语法特性都在这里) +- 程序喵大人 C++ 知识仓库:[https://github.com/chengxumiaodaren/cpp-learning](https://github.com/chengxumiaodaren/cpp-learning) +- 计算机基础知识总结 CS-Notes:[http://www.cyc2018.xyz/](http://www.cyc2018.xyz/) +- C++ 相关问答:[http://www.sunistudio.com/cppfaq/](http://www.sunistudio.com/cppfaq/) + +### 自学 C++ 专题资源 + +- ⭐ GitHub C++ 专区:[https://github.com/topics/cpp](https://github.com/topics/cpp) +- ⭐ GitHub C++ 内容合集:[https://github.com/fffaraz/awesome-cpp](https://github.com/fffaraz/awesome-cpp) +- StackOverflow:[https://stackoverflow.com/questions/tagged/c%2B%2B](https://stackoverflow.com/questions/tagged/c%2b%2b) (解决问题必备) +- 掘金 C++ 专区:https://juejin.cn/tag/C++(阅读技术文章) +- 大厂技术博客 + - 美团技术团队:[https://tech.meituan.com/](https://tech.meituan.com/) + - 阿里技术团队:[https://102.alibaba.com/tech/list/](https://102.alibaba.com/tech/list/) + - 有赞技术团队:[https://tech.youzan.com/tag/back-end/](https://tech.youzan.com/tag/back-end/) +- 知名 C++ 大佬陈硕的博客(muduo 网络库的作者):[https://blog.csdn.net/solstice/](https://blog.csdn.net/solstice/) +- C++ 编程技巧:[https://abseil.io/tips/](https://abseil.io/tips/) +- C++ 之父的一些问答:[https://www.stroustrup.com/bsfaqcn.html](https://www.stroustrup.com/bsfaqcn.html) + +--- + +小伙伴们加油! diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/Git&GitHub\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/Git&GitHub\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..f8e1ab3 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/Git&GitHub\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,431 @@ +# Git & GitHub 学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +不喜欢阅读文字的同学可以看视频讲解:[https://www.bilibili.com/video/BV1KZ4y1e7cG](https://www.bilibili.com/video/BV1KZ4y1e7cG) +## 介绍 +### Git / GitHub 是什么? + +Git 是目前最主流的 `分布式版本控制系统` (Version Control System),是团队协作开发不可或缺的工具。它可以保存和管理文件的所有更新记录、并且使用 **版本号** 进行区分。从而支持将编辑后的文档恢复到修改前的状态(历史版本)、对比不同版本的文件差异、防止旧版本覆盖新版本等功能。 + +GtiHub 是目前最主流的、免费的 `代码开源托管平台` ,可以理解为一个存储和管理代码的 “网盘”。所有用户或团队都可以把自己的代码上传到 GitHub 进行共享和维护、从 GitHub 下载代码等。开发者们可以从 GitHub 上白嫖代码,进行学习或引用。 + +很多同学刚开始容易把这两个概念搞混,其实很好区分,Git 和 GitHub 的区别和关系如下: + +1. Git 是工具,而 GitHub 是平台。 +2. 我们可以用 Git 之外的版本控制系统(比如 SVN)来向 GitHub 提交代码;同样可以用 Git 将代码提交到 GitHub 之外的其他代码托管平台(比如企业级代码托管平台 GitLab)上。 + +> SVN 和 Git  是同类的工具,两者的用法很相似。但目前 Git 相对更主流一些,因此只学习 Git 足够了。 + + +### 为什么要用 Git / GitHub? +#### Git + +Git 起初是由 Linux 的创始人 Linus Torvalds 为了更好地管理 Linux 内核开发而创立的。Linux 的内核开发极其复杂,我们可以试想一下,如果有 100 个人要共同来开发这样一个大型项目、维护同一个代码目录和文件,怎么样才能够保证大家的代码不重复、不冲突、即时共享呢?难道要把代码放到 U 盘里,每个人写完代码后再拷贝到别人电脑上么? + +肯定不行对吧,这样做不仅麻烦,而且只能人为去解决冲突,可能会出现下面的对话: + +A:“哎,这行我改了,你别改!” + +B:“TNND,你改了也不跟我说一声。” + +所以 Git 的出现正是为了解决上述难题。 + +使用 Git 工具,大家可以很方便地拉取和提交代码、及时得到代码的修改信息、对比新老代码之间的差异等,让系统代替人工来自动检查和解决冲突。从而提高团队协作开发的效率,保证代码和项目的稳定推进。 + +除了团队开发外,我们自己做项目时也可以用 Git 来管理代码,如果一不小心改错或者删除了文件,可以快速还原。 + +因此 Git 也是目前开发岗同学 **必学** 的技能,企业开发的基本功。 + +#### GitHub + +既然要团队协作开发,那么大家肯定要 **共享代码** ,在同一套代码的基础上进行开发。所以需要一个集中存储和管理代码的地方,所有团队成员都能访问到。而且不同于网盘,最好大家能使用 Git 工具来操作代码的上传和拉取,并且在平台上方便地浏览和对比代码。 + +于是,有能力的公司开始自己建设公司内部的代码托管平台。但是对大多数小公司来说,他们没有这种条件自建,只能依赖其他大公司的代码托管服务。 + +此外,在 Linux 之父以及很多优秀程序员的影响下,越来越多的程序员倡导 **开源** ,认为软件开发应当是开放的,所有开发者都可以加入贡献。而开源的背后,必须要有一个开放共享的代码托管平台来支撑,而不是每个公司的代码都被封闭在自己内部的平台上。 + +于是,以 GitHub 为代表的代码托管平台出现了。团队可以利用 GitHub 进行协作开发;开发者可以轻松阅读并参与到世界知名的开源项目中;我们每位同学也都可以免费使用 GitHub 上的代码,站在巨人的肩膀上打造自己的项目,或者通过参与开源来提升个人影响力等。 + +此外,如今的 GitHub 还提供了更多强大的功能,比如问题讨论、在线编程、托管网站、自动构建项目等,对开发者非常有帮助。除了代码外,鱼皮也经常把一些需要团队内共享的文档上传到 GitHub 私仓和其他成员协作,免费无限制谁不爱呢? + +当然,GitHub 只是代码托管平台中最有代表性的一个,其他知名的代码开源托管平台有国内的 Gitee、国外的 Bitbucket 等;面向企业的私有代码托管平台有 GitLab、腾讯工蜂等。它们没有什么本质的区别,都是平台而已,会用 GitHub,就会用其他的。 + +综上,强烈建议大家养成使用 GitHub 的习惯,感受开源的魅力。 + +## 学习条件 + +1. 学过至少一门编程语言后就可以学习 Git 了 +2. 准备开发个人完整项目前建议学习。注意是完整项目,还停留在初学编程语言写练习阶段的同学先不用学,抓紧熟悉编程语言就好。 +3. 正式找工作前必须学习! + +## 学习建议 + +1. Git 只是工具,学 Git 的时候可以轻松一些,千万不要去背命令!初学者只要先了解工作中常用命令的作用、提交代码的流程,然后跟着教程实操一遍,有个大致的印象就够了。忘了的话就掏出说明书(百度 / 文档等),随用随查即可。因此建议将专门学习 Git 的时间控制在 1 天内,一般几个小时就足够了,最快的话只用十几分钟也能上手。 +2. 虽然现在有很多傻瓜式可视化 Git 工具,但还是建议初学 Git 的同学多自己手敲 Git 命令,可以多把自己平时写的练习代码用 Git 上传到 GitHub 上管理,用的多了自然就熟悉了。 +3. Git 的学习不是一蹴而就的。随着你使用 Git 管理的项目越来越多、工作经验越来越丰富,你对 Git 和 GitHub 的熟练程度才会越来越高。总之,想学好 Git,实践是关键。 + +## 学习路线 + +⭐️ - 重点知识 / 强烈推荐 +😐 - 了解即可 + +### 大纲 +![Git & GitHub 学习路线 by 程序员鱼皮.png](https://cdn.nlark.com/yuque/0/2022/png/398476/1655990159102-a826251e-fbb3-461b-9318-d560cd32a13d.png#clientId=ua3c55a2b-7415-4&from=paste&height=3197&id=ub68f9a98&originHeight=7033&originWidth=1728&originalType=binary&ratio=1&rotation=0&showTitle=false&size=1000924&status=done&style=shadow&taskId=u64a6f249-5014-41bc-82a2-ac71f7a368c&title=&width=785.454528430277) + +### 零、无痛上手 + +Git 本身只是一个工具,不涉及太多复杂的的理论知识,看了说明书就能用;再加上现在很多主流的开发工具都支持可视化地操作 Git 来管理项目,将它的使用成本降到了最低。所以我们可以随用随学,哪怕之前完全不会,工作用到时也可以直接 **赶鸭子上架** ,做到能用界面来拉取和提交代码、完成开发即可。 + +我自己刚开始接触 Git 的时候就是这样,完全没有上网搜教程,就是看别人提交项目的时候用到了这个工具、在编辑器上点几下就可以了,觉得很厉害很方便。然后我就有样学样地用起了这个工具,而且很长一段时间我都是用 GitHub Desktop 来傻瓜式的操作,遇到问题了再上网搜解决方案。 + +这里我建议大家无论是否要学习 Git,都可以先把它安装到你的电脑中(直接去官网安装)。因为有可能一些软件或工具会依赖 Git,不装的话后面会出现一些问题。 + +#### 目标 + +1. 能用软件操作 Git 来拉取和提交代码 + +#### 资源 + +⭐️ Git 官方下载:[https://git-scm.com/downloads](https://git-scm.com/downloads) + +Git 可视化管理软件: + +> 一般情况下不用额外安装软件,用开发工具自带的 Git 可视化功能即可(比如 IDEA、VS Code 等) + + +- ⭐️ GitKraken:https://www.gitkraken.com/(炫酷且友好) +- Sourcetree:[https://www.sourcetreeapp.com/](https://www.sourcetreeapp.com/) +- TortoiseGit:[https://tortoisegit.org/](https://tortoisegit.org/) +- GitHub Desktop:[https://desktop.github.com/](https://desktop.github.com/) +- Git GUI(安装 Git 后自带) + +### 一、Git 基础 + +虽然使用可视化工具也可以操作 Git 完成开发工作,但如果不了解 Git 的概念和每个操作具体做了什么,在团队开发中很容易出现问题(比如出现冲突)。 + +因此本阶段的目标如下: + +#### 目标 + +1. 了解 Git 基本概念和常用命令的作用(理论) +2. 能够使用 Git 命令来管理和提交项目代码(实践) + +#### 知识点 + +- ⭐️ 基本概念 + - 什么是 Git(版本控制系统) + - 什么是 GitHub(代码托管平台) + - Git 和 GitHub 的作用 + - Git 和 GitHub 的联系与区别 +- ⭐️ Git 概念 + - 工作区 + - 暂存区(索引) + - 本地版本库 + - 远程仓库 + - Git 文件状态 + - 版本 + - HEAD + - 分支 +- Git 的安装 +- Git 常见配置(git config) + - 修改配置 + - 个人信息 + - 查看配置 +- ⭐️ Git 基本操作(开发流程) + - 初始化仓库(git init) + - 克隆(git clone) + - 暂存(git add) + - 提交(git commit) + - 推送(git push) + - 拉取(git fetch) + - 拉取合并(git pull) + - 😐 查看状态(git status) + - 😐 查看历史(git log) +- ⭐️ 分支操作 + - 创建分支 + - 查看分支 + - 切换分支 + - 删除分支 + - 合并分支(git merge) + +#### 学习方法 + +入门 Git 时没必要买书,而是直接看网上的文档或视频教程,大概花几分钟 ~ 几小时就可以入门了。 + +比如 [猴子都能懂的 Git 入门](https://backlog.com/git-tutorial/cn/) ,图文并茂、通俗易懂,看完入门篇就足够了: + +![](https://xingqiu-tuchuang-1256524210.cos.ap-shanghai.myqcloud.com/1/image-20220623195749271.png#id=qSReP&originHeight=780&originWidth=2008&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=shadow&title=) + +或者看 B 站上一些免费的分享,比如下面资源里提到的一节课入门视频,可以帮助你快速了解 Git。 + +但是大家要切记,**一定要跟着教程敲命令** ,自己走完一套从新建文件到提交文件的完整流程! + +还可以配合可视化工具来观察每个命令执行带来的效果,比如 IDEA 会自动把 Git 托管的文件变成绿色,从而帮助你理解每个命令的作用。 + +Git 的分支概念还是很重要的,大家可以使用 [Learning Git Branching](https://learngitbranching.js.org/?locale=zh_CN) 这个在线游戏来学习和理解分支。 + +> 当然,习惯阅读官方文档的同学也可以直接看 Git 官方文档入门。 + + +#### 资源 + +在线文档: + +- ⭐️ 猴子都能懂的 Git 入门:https://backlog.com/git-tutorial/cn/(强烈推荐) +- 菜鸟教程:[https://www.runoob.com/git/git-tutorial.html](https://www.runoob.com/git/git-tutorial.html) +- 廖雪峰的教程:[https://www.liaoxuefeng.com/wiki/896043488029600/](https://www.liaoxuefeng.com/wiki/896043488029600/) +- Git 简明指南:[http://rogerdudler.github.io/git-guide/index.zh.html](http://rogerdudler.github.io/git-guide/index.zh.html)(几分钟看一遍就好,可以用来复习) + +视频教程: + +> Git 相关的入门视频太多了,B 站随便一搜一大把 + + +- 一节课入门:[https://www.bilibili.com/video/BV1s3411g7PS](https://www.bilibili.com/video/BV1s3411g7PS)(18 分钟) +- 一节课入门:[https://www.bilibili.com/video/BV1KD4y1S7FL](https://www.bilibili.com/video/BV1KD4y1S7FL)(10 分钟) +- 5h 打通 Git 全套教程:[https://www.bilibili.com/video/BV1vy4y1s7k6](https://www.bilibili.com/video/BV1vy4y1s7k6)(较完整,时间多的话可以看) + +在线游戏: + +- ⭐️ Learning Git Branching:[https://learngitbranching.js.org/?locale=zh_CN](https://learngitbranching.js.org/?locale=zh_CN)(帮助你学习 Git 分支的用法) + +工具: + +- ⭐️ Git 命令大全:[https://backlog.com/git-tutorial/cn/reference/](https://backlog.com/git-tutorial/cn/reference/)(适合收藏) +- Git 参考手册:[http://gitref.justjavac.com/](http://gitref.justjavac.com/)(只列举了常用的命令,不是很全) + +### 二、GitHub 基础 + +可以把 GitHub 简单理解为一个资源网站,第一次接触 GitHub 时直接注册一个账号,然后在搜索框里输入你想搜的东西就可以了,不需要任何的教程。但是如果我们想上传代码到 GitHub、更好地用它来管理项目,还是有必要了解一下平台的玩法。 + +#### 目标 + +1. 熟悉 GitHub 基本操作,并能够使用 GitHub 来管理代码 +2. 了解如何利用 GitHub 搜索和下载项目代码 +3. 了解 GitHub 协作流程;了解开源,并能向开源项目提交代码 + +#### 知识点 + +- 什么是 GitHub? +- ⭐️ 如何访问 GitHub? +- ⭐️ 基本概念 + - 仓库 + - 分支 + - 主分支 + - README + - Star + - Follow + - 账户类型(个人 / 组织) +- 必备操作 + - ⭐️ 搜索仓库 / 代码 + - 创建仓库 + - 公开 + - 私有 + - Fork 仓库 + - Watch 仓库 + - ⭐️ 上传本地代码 + - 修改个人信息 +- ⭐️ GitHub Flow 协作流程 + - 克隆 / Fork 仓库 + - 创建分支 + - 修改代码 + - 发起 Pull Request + - Code Review + - Merge 分支 + - 删除分支 +- ⭐️ 了解 GitHub Issues +- ⭐️ 贡献代码流程 + +#### 学习方法 + +我们学 GitHub 时主要是了解这个平台提交代码的规则以及和他人协作的方法,因此还是以实践为主。 + +推荐先在 B 站上找一个 GitHub 的短视频分享,了解下 GitHub 是个啥,大概咋用(下面有推荐视频)。然后再按照 GitHub  官方提供的 [Hello World 入门教程](https://docs.github.com/cn/get-started/quickstart/hello-world) 来实操一遍流程,基本就了解大家是如何在 GitHub 上协作的了。 + +之后我建议大家可以像读课外书一样阅读下 [《GitHub 漫游指南》](https://github.phodal.com/) ,能够比较全面地加深你对 GitHub 的了解。 + +#### 资源 + +文档: + +- ⭐️ GitHub 官方 Hello World 入门:[https://docs.github.com/cn/get-started/quickstart/hello-world](https://docs.github.com/cn/get-started/quickstart/hello-world)(带你体验一次完整的 GitHub 开发流程) +- ⭐️ GitHub 漫游指南:[https://github.phodal.com/](https://github.phodal.com/)(很多作者个人的实战经验,建议当课外书读,受益匪浅) +- ⭐️ 教你给开源项目贡献代码:[https://github.com/firstcontributions/first-contributions/blob/master/translations/README.chs.md](https://github.com/firstcontributions/first-contributions/blob/master/translations/README.chs.md) +- ⭐️ 开源指北:[https://oschina.gitee.io/opensource-guide/](https://oschina.gitee.io/opensource-guide/)(给开源新手的保姆级开源百科,建议当课外书读) + +视频: + +- 一节课入门:[https://www.bilibili.com/video/BV1hS4y1S7wL](https://www.bilibili.com/video/BV1hS4y1S7wL) +- 5 分钟入门:[https://www.bilibili.com/video/BV1hS4y1S7wL](https://www.bilibili.com/video/BV1hS4y1S7wL) +- 如何利用 GitHub 找到优质项目:[https://www.bilibili.com/video/BV1Ki4y1T7Cu](https://www.bilibili.com/video/BV1Ki4y1T7Cu)(鱼皮早期作品,特么青涩!) + +工具: + +- ⭐️ 如何更快地访问 GitHub:[https://github.com/dotnetcore/FastGithub](https://github.com/dotnetcore/FastGithub)(进不去可以自行百度:fast github) +- ⭐️ GitHub 备忘清单:[https://training.github.com/downloads/zh_CN/github-git-cheat-sheet/](https://training.github.com/downloads/zh_CN/github-git-cheat-sheet/)(包含了常用命令) + +### 三、Git 进阶 + +企业开发项目可能会比较复杂,往往会面临两个问题: + +1. 项目更大,更难管理 +2. 协作人员更多,更容易出现冲突 + +如果协作开发时出现了代码冲突,又不了解如何解决的话,就很可能导致提交了错误的代码影响项目,或者丢失自己写过的代码。 + +因此我们需要进一步了解 Git,学习实际工作中可能要用到的操作、经验和技巧,更好地管理团队项目和协作。 + +#### 目标 + +1. 学习 Git 高级操作,尤其是能够熟练地规避和解决冲突 +2. 了解企业常用的 Git 协作流程和规范,能独立管理项目 + +#### 知识点 + +- 高级操作 + - 标签(git tag) + - 检出(git checkout) + - ⭐️ 贮藏(git stash) + - 清理(git clean) + - 变基(git rebase) + - 重置(git reset) + - 还原(git revert) + - 😐 检索(git grep) + - 😐 展示差异(git diff) + - 😐 溯源(git blame) + - 😐 参考日志(git reflog) + - 😐 交互式命令行(-i 参数) +- ⭐️ 预防冲突 +- ⭐️ 解决冲突(重中之重) +- ⭐️ 配置 SSH +- 子模块 +- Git 钩子 + - 提交钩子(pre-commit) +- ⭐️ 忽略提交(Gitignore) +- ⭐️ cherry-pick +- 分布式工作流程 +- Git worktree +- Git Flow +- 😐 Git 内部原理 +- Monorepo +- 了解其他版本控制系统,和 Git 对比 + +#### 学习方法 + +其实我们在大多数情况下是用不到上面那些高级命令的,但是一定要知道有这么个命令和用法,在关键时刻才能想起来,然后再去通过官方文档和百度去搜详情即可。 + +所以,建议大家有空完整地阅读一遍 Git 的官方文档(支持中文、详细又权威),有些地方看不懂或记不住也没关系(比如像 reset 的几种模式),有个大致的印象就行。 + +学好 Git 最主要的方法还是多实操,比如实际工作中最实用的技能之一 —— 解决代码冲突,只有经历过的同学才会懂。不过如今的编辑器基本都自带了可视化解决冲突的功能,通过红绿等颜色来区分代码,可比我们用命令行要方便和清晰多了,所以也不用去记忆相关的命令。 + +另外,建议大家去网上了解一下企业开发中常用的 Git 协作机制,比如怎么定义分支、怎么个提交代码的流程等,如图: + +![](https://xingqiu-tuchuang-1256524210.cos.ap-shanghai.myqcloud.com/1/webp#id=nopW5&originHeight=341&originWidth=586&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=shadow&title=) + +还可以了解一些 “先进” 的协作方式,比如一些大公司在采用的 Monorepo(单仓 / 大仓)方案,了解它和传统项目管理模式的优缺点。 + +此外,大家感兴趣的话也可以深入下 Git 工具的原理,如果能够自己做出一个类似的系统,相信在简历上也会是个不错的项目~ + +#### 资源 + +- ⭐️ Git 官方文档:[https://git-scm.com/book/zh/v2](https://git-scm.com/book/zh/v2)(强烈推荐,有图有文,全面详细) +- Git Flow 演示学习:[http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html](http://danielkummer.github.io/git-flow-cheatsheet/index.zh_CN.html) +- Git Flow 学习:[https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow](https://www.git-tower.com/learn/git/ebook/cn/command-line/advanced-topics/git-flow) +- Monorepo 学习:[https://www.jianshu.com/p/c10d0b8c5581](https://www.jianshu.com/p/c10d0b8c5581) + +工具: + +- Git 中文开发手册:[https://www.php.cn/manual/view/34943.html](https://www.php.cn/manual/view/34943.html)(可以用来查命令) + +### 四、GitHub 进阶 + +如今 GitHub 的能力已经非常强了,除了代码的管理和检索外,它还集成了各种辅助团队开发和运营的功能。 + +#### 目标 + +1. 按需学习更多 GitHub 功能,提升研发效率、更好地管理项目 +2. 尝试用心维护和推广自己的 GitHub 项目 + +#### 知识点 + +- 开发 + - ⭐️ 配置 SSH 拉取 + - 😐 GitHub 快捷键 + - 😐 GitHub 命令面板 + - 😐 GitHub Apps + - 代码安全 +- 协作 + - ⭐️ GitHub Codespaces + - GitHub Discussions + - Pull Requests +- 项目管理 + - Organizations 组织 + - GitHub Issues 问题反馈 + - 😐 GitHub Projects 项目管理 + - Insights 数据分析 + - 贡献者管理 + - 开源协议 +- DevOps + - ⭐️ GitHub Pages 网站托管 + - Gitpod 代码托管 + - GitHub Actions + - 😐 GitHub Packages + - GitHub Webhook +- 😐 Git 私服搭建 + - GitLab + - Gogs + +#### 学习方法 + +进阶 GitHub 最好的方式就是 **阅读官方文档** ! + +因为首先官方文档通常比任何教程都 **全面、权威、准确** ;再加上 GitHub 的更新迭代很快、时不时会推出一些新功能,导致网上的教程和文章很难做到实时和官方同步。 + +而 GitHub 的官方文档不仅支持中文,而且写的非常通俗好懂,本身就是一个贴心的教程了。所以建议大家跟着文档来学习,完整阅读一遍后,相信你会学到很多之前完全没关注过的 GitHub 功能,帮助自己更好地利用这个平台。 + +此外,大家也可以多看一些其他同学分享的 GitHub 小技巧,比如我之前分享过的:按句号键就能用 web 编辑器直接打开项目,从而给我们带来极大的方便。(下面也给大家列举了一些我之前分享过的 GitHub 骚操作) + +#### 资源 + +文档: + +- ⭐️ GitHub 官方文档:[https://docs.github.com/cn](https://docs.github.com/cn) +- ⭐️ GitHub 秘籍:[https://snowdream86.gitbooks.io/github-cheat-sheet/content/zh/](https://snowdream86.gitbooks.io/github-cheat-sheet/content/zh/)(收录了一些 Git 和 Github 非常酷同时又少有人知的功能) +- ⭐️ GitHub 隐藏技巧:[https://www.bilibili.com/video/BV1q54y1f7h6](https://www.bilibili.com/video/BV1q54y1f7h6) +- 让你的 GitHub 秒变高大上:[https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247491908&idx=1&sn=568e8c0dcb54a610d886eb992d424273&scene=21#wechat_redirect](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247491908&idx=1&sn=568e8c0dcb54a610d886eb992d424273&scene=21#wechat_redirect) +- GitHub 骚操作:[https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247495440&idx=1&sn=99147cdcb7c881c9d983e7b2373abcdb&scene=21#wechat_redirect](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247495440&idx=1&sn=99147cdcb7c881c9d983e7b2373abcdb&scene=21#wechat_redirect) + +工具: + +- GitHub 快捷键:[https://docs.github.com/cn/get-started/using-github/keyboard-shortcuts](https://docs.github.com/cn/get-started/using-github/keyboard-shortcuts) +- GitHub 命令面板:[https://docs.github.com/cn/get-started/using-github/github-command-palette](https://docs.github.com/cn/get-started/using-github/github-command-palette) + +## 面试考点 + +其实 Git 在面试中的占比一般是很低的,至少我秋招 20 多轮面试中 1 次都没被问到过。所以大家不用刻意去准备,多去用它、积累经验就好了。 + +不过时间足够的同学也可以了解一下常见的面试题,比如下面这些: + +#### 理论 + +1. 简述 Git 的原理和工作流程 +2. 什么是版本控制系统?为什么需要版本控制系统? +3. git fetch 和 git pull 命令的区别? +4. git rebase 和 git merge 命令的区别? +5. 什么是 Git Flow,它有什么好处? +6. 什么是暂存区?Git 为什么需要暂存区? + +#### 实践 + +1. 分享下你在团队中使用 Git 协作开发的流程(从拉取项目到上线) +2. 如何控制某些文件不被提交? +3. 什么情况下提交会冲突,如何解决冲突? +4. 不小心改错了代码、删除了文件,如何恢复? +5. 不小心提交错了文件,如何撤销? +6. 团队开发中,如何区分和管理分支? +7. 如果让你负责团队,会怎么管理项目的代码? +8. 如何防止错误的代码提交? diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/Java\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/Java\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..87d8066 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/Java\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,2143 @@ +# Java 学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + + +## 符号表 + +可以通过路线知识点前的表情字符,根据自己的实际情况选择学习: + +- 🌕 所有同学必须学习!!! +- 🌖 非常急着找工作,才可不学;目标大厂,必须学习! +- 🌗 急着找工作的话,可不学;目标大厂,建议学习 +- 🌘 时间充足的话,再去学 +- ⭐ 表示推荐资源 + +## 前言 + +首先呢,我们要了解 Java 的应用场景和就业方向,看看和自己的学习目的是否一致。 + +目前,Java 由于其优秀的特性以及火爆的生态,岗位需求量大,是后台开发、安卓开发、大数据开发的主流编程语言,因此学习资源也很丰富,值得学习! + +## 阶段 1:编程语言基础 + +### 目标 + +培养兴趣、快速上手,能运行和编写简单的 Java 程序。 + +学完本阶段后,可以试着用 Java 解决一些数学计算问题、编写图书管理系统等桌面端 GUI 程序,甚至是五子棋之类的小游戏。 + +### 🌕 Java 编程基础(45 天) + +#### 知识 + +- Java 特点(看不懂没事,别背!) +- 环境搭建 +- IDEA 开发工具 + - 新建项目 + - 运行调试 + - 界面配置 + - 插件管理 +- **Java 基础语法** + - 数据类型 + - 流程控制 +- 数组 +- **面向对象** + - 方法 + - 重载 + - 封装 + - 继承 + - 多态 +- 抽象类 +- 接口 +- 枚举 +- 常用类 + - String + - 日期时间 +- 集合类 +- 泛型 +- 注解 +- 异常处理 +- 多线程 +- IO 流 +- 反射 + +#### 学习建议 + +1)坚持:初学一门语言时,一定要持续学习,不能中断! + +2)实践:想要学好编程,一定要多敲代码!建议先跟着书上的例子敲一遍代码,然后试着自主编写代码,并完成课后练习。 + +3)万事开头难:不理解代码也没关系,可以学习 Debug 后,一行一行地打断点执行,查看程序的执行过程。千万不要觉得麻烦,养成习惯后真的能节省很多重复学习的时间。 + +#### 经典面试题 + +1. 为什么重写 equals 还要重写 hashcode? +2. == 和 equals 比较的区别 +3. 为啥有时会出现 4.0 - 3.6 = 0.40000001 这种现象? +4. final 关键字的作用 +5. 介绍 Java 的集合类 +6. ArrayList 和 LinkedList 的区别 + +#### 资源 + +- 视频 + - ⭐ 韩顺平 - 零基础 30 天学会 Java:[https://www.bilibili.com/video/BV1fh411y7R8](https://www.bilibili.com/video/BV1fh411y7R8) (900 多集,顺序安排很合理,每个知识真正的打碎了,通俗、有示例、有实战、有思想) +- 文档 + - ⭐ 菜鸟教程:[https://www.runoob.com/java/java-tutorial.html](https://www.runoob.com/java/java-tutorial.html) (可以在线练习) + - 廖雪峰 Java 教程:[https://www.liaoxuefeng.com/wiki/1252599548343744](https://www.liaoxuefeng.com/wiki/1252599548343744) + - IDEA 中文教程:[https://github.com/judasn/IntelliJ-IDEA-Tutorial](https://github.com/judasn/IntelliJ-IDEA-Tutorial) (可以作为课外书来看) + - IDEA Mac 快捷键指南,地址:[https://www.jianshu.com/p/454c71172c46](https://www.jianshu.com/p/454c71172c46) + - IDEA Win 常用快捷键,地址:[https://www.jianshu.com/p/5de7cca0fefc](https://www.jianshu.com/p/5de7cca0fefc) +- 书籍 + - 《Head First Java》 +- 在线游戏 + - Codegym:[https://codegym.cc/zh](https://codegym.cc/zh) (玩玩前几关培养兴趣不错,但后面收费了,不太建议用) + +### 🌖 Java 8(3 天) + +#### 知识 + +- Stream API +- Lambda 表达式 +- 新日期时间 API +- 接口默认方法 + +#### 学习建议 + +Java 8 是如今企业开发中最主流的 Java 稳定版本,在这个版本出现了很多实用的新特性,虽然面试考点不多,但能够提升编程效率,建议学习。 + +此外,很多同学不怎么在简历上写自己会 Java 8,因此如果你把 Java 8 的知识点写在简历上,会大大加分的。 + +#### 经典面试题 + +1. Java 8 有哪些新特性? +2. HashMap 在 jdk 1.7 和 1.8 的区别? + +#### 资源 + +- 视频 + - ⭐ 宋红康 - 全网最全Java零基础入门教程:[https://www.bilibili.com/video/BV1Kb411W75N](https://www.bilibili.com/video/BV1Kb411W75N) (只看 Java 8 部分即可) +- 文档 + - ⭐ 菜鸟教程:[https://www.runoob.com/java/java8-new-features.html](https://www.runoob.com/java/java8-new-features.html) +- 书籍 + - 《Java 8 实战》:[https://book.douban.com/subject/26772632/](https://book.douban.com/subject/26772632/) +- 工具 + - ⭐ 在线编写运行  Java 8:[https://www.tutorialspoint.com/compile_java8_online.php](https://www.tutorialspoint.com/compile_java8_online.php) +- 其他 + - Java 8 小代码片段:[https://github.com/biezhi/30-seconds-of-java8](https://github.com/biezhi/30-seconds-of-java8) + +### 练手项目 + +- Java 实现简单计算器:[https://www.lanqiao.cn/courses/185](https://www.lanqiao.cn/courses/185) +- Eclipse 实现 Java 编辑器:[https://www.lanqiao.cn/courses/287](https://www.lanqiao.cn/courses/287) +- 一本糊涂账:[https://how2j.cn/module/104.html](https://how2j.cn/module/104.html) +- Java 五子棋:[https://blog.csdn.net/cnlht/article/details/8176130](https://blog.csdn.net/cnlht/article/details/8176130) +- Java 中国象棋:[https://blog.csdn.net/cnlht/article/details/8205733](https://blog.csdn.net/cnlht/article/details/8205733) +- JAVA GUI 图书馆管理系统:[https://github.com/uboger/LibraryManager](https://github.com/uboger/LibraryManager) +- JAVA 坦克大战小游戏:[https://github.com/wangzhengyi/TankWar](https://github.com/wangzhengyi/TankWar) +- Swing 编写的俄罗斯方块:[https://github.com/HelloClyde/Tetris-Swing](https://github.com/HelloClyde/Tetris-Swing) +- 小小记账本:[https://github.com/xenv/SmallAccount](https://github.com/xenv/SmallAccount) (适合了解数据库的同学) + +### 尾声 + +学完了 Java 基础后,有些同学会感到迷茫了啊,感觉好像啥也做不出来,不知道下一步做什么,我这一身的本领该如何施展啊? + +不要慌,也不要急着去学新技术,接下来我们要多用 Java 来写代码了,巩固基础,但是写什么呢? + +当然是数据结构和算法! + +## 阶段 2:巩固基础 +注意!如果你时间不够(比如只有 6 个月左右),只是想快速找到工作,那么本章节甚至可以完全跳过,先去学习开发框架做项目,后面再慢慢弥补基础即可。 + +### 目标 + +想学好编程,计算机基础知识要学好。 + +比如算法,是程序员的灵魂。学好算法有助于我们理解程序、开拓思路,因此也是很多公司面试时考察的关键,在找工作前,还是要刷个上百道算法题目的。 + +我们这个阶段的目标是:熟练使用 Java 语言来编写程序,巩固 Java 基础。(那直接用 Java 来写算法题目,一举两得,岂不美哉?) + +此外,建议大家利用零碎时间多去了解 **计算机基础知识** ,比如操作系统、计算机网络等,对你后面学习开发框架之类的知识都有帮助。 + +### Java 基础(30 天) + +#### 学习建议 + +建议大家去阅读 《Java 核心技术卷 1》,这本书堪称经典,是帮助你复习巩固  Java 的不二之选,其中图形界面章节可以选择不看。 + +之后可以刷网上免费的 Java 练习题,检验自己的水平,我当时刷了两遍 1000 题(每天 30 题,1 个月也就刷完了,二刷会更快!)。虽然都是选择题,但能学到很多 Java 语言的特性、避免写代码时容易犯的错误。 + +#### 资源 + +- 书籍 + - ⭐《Java 核心技术卷 1》:[https://www.aliyundrive.com/s/SNdB6gr1Xz4](https://www.aliyundrive.com/s/SNdB6gr1Xz4) 提取码: u74e + +### 🌖 数据结构与算法 +请参考学习路线:[数据结构和算法学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/cyovgg) + +### 🌘 计算机导论 +详情请参考:[计算机基础学习路线](https://bcdh.yuque.com/staff-wpxfif/resource/ro1v8px2ng0ifexw?view=doc_embed) + +#### 知识 + +- 计算机发展历史 +- 计算机应用领域 +- 计算机发展方向 +- 计算机基本组成 +- 二进制 +- 编程语言发展 + +#### 学习建议 +大学计算机专业的同学一般刚开学就会上这门课,虽说学习它并不会直接提高你的编程技能,但能够让你更了解计算机和编程,从而在一定程度上帮助你培养学习兴趣、确定学习方向。 + +自学的话,不用刻意去学习计算机导论,而是可以通过看视频、阅读课外读物的方式慢慢地了解计算机的故事。 + +#### 资源 + +- 视频 + - 《计算机科学速成课》:[https://www.bilibili.com/video/BV1EW411u7th](https://www.bilibili.com/video/BV1EW411u7th) (从底层到上层的计算机知识科普,强烈推荐) +- 书籍 + - 《半小时漫画计算机》:[https://book.douban.com/subject/35619441/](https://book.douban.com/subject/35619441/) +- 闯关学算法:[编程导航算法通关村](https://yuyuanweb.feishu.cn/wiki/J9qLwpv75iropZkXpmIcYrZ8nNM) + +### 🌖 操作系统 +详情请参考学习路线:[操作系统学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/udgg85) + +#### 知识 + +- 操作系统的组成 +- 进程、线程 +- 进程 / 线程间通讯方式 +- 进程调度算法 +- 进程 / 线程同步方式 +- 进程 / 线程状态 +- 死锁 +- 内存管理 +- 局部性原理 + +#### 学习建议 + +说实话,操作系统这一块知识挺枯燥的。你说说我现在项目都不会做,你又让我看这些理论,是不是想让我头秃? + +我的建议是,可以先利用课余时间看一些网课或者有趣的课外书,对一些操作系统的概念先有个大致的印象,比如进程、线程、死锁,等后面有时间了再系统学习、等到找工作了再去背相关八股文。 + +还在校园就跟着学校的进度学习就成,自学的话可以看下《清华操作系统原理》视频,有实力的小伙伴,能看懂大黑书就更好了,但如果看不懂也别担心,这并不影响你后续知识的学习。 + +#### 经典面试题 + +1. 什么是死锁?死锁产生的条件? +2. 线程有哪几种状态? +3. 有哪些进程调度算法? +4. 什么是缓冲区溢出? + +#### 资源 + +- 视频 + - 《清华操作系统原理》:[https://www.bilibili.com/video/BV1uW411f72n](https://www.bilibili.com/video/BV1uW411f72n) +- 书籍 + - 《编码》 + - 《30天自制操作系统》 + - 《现代操作系统》(难度较大,不推荐新手看) + - 《深入理解计算机系统》(难度较大,不推荐新手看) + - 《 自己动手写操作系统》(国产好书,网上可以下载) +- 大学课件 + - 浙大操作系统:[https://github.com/QSCTech/zju-icicles](https://github.com/QSCTech/zju-icicles) + +### 🌖 计算机网络 +详情请参考学习路线:[计算机网络学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/phgtgu) + +#### 知识 + +- 网络分层模型 +- 网络传输过程 +- IP、端口 +- HTTP / HTTPS 协议 +- UDP / TCP 协议 +- ARP 地址解析协议 +- 网络安全 +- DNS 域名解析 + +#### 学习建议 + +很多学习 Java 开发的同学最后都是从事 **后端开发** 的工作,而计算机网络知识是后端开发的重点。 + +和操作系统一样,自学网络可能会很枯燥,建议先看有趣的课外书,比如《图解 HTTP》;或者有趣的视频,比如《计算机网络微课堂》。后面要找工作面试前,再重点去背一些八股文就好了。还在学校的同学好好上课一般就没问题。 + +学习基础能帮助自己今后发展更稳定,且更容易接受新知识,所以请不要相信基础无用论。 + +#### 经典面试题 + +1. 计算机网络各层有哪些协议? +2. TCP 和 UDP 协议的区别? +3. TCP 为什么需要三次握手和四次挥手? +4. HTTP 和 HTTPS 协议的区别? + +#### 资源 + +- 视频 + - 《计算机网络微课堂》:[https://www.bilibili.com/video/BV1c4411d7jb](https://www.bilibili.com/video/BV1c4411d7jb) +- 书籍 + - ⭐《图解 HTTP》 + - 《网络是怎样连接的》 + - ⭐《图解 TCP / IP》 +- 大学课件 + - 浙大计算机网络基础:[https://github.com/QSCTech/zju-icicles](https://github.com/QSCTech/zju-icicles) + +### 尾声 + +巩固基础要花至少 1 个月的时间,当你读完《Java 核心技术卷1》并且不用查询文档也能熟练地用 Java 做题时,就可以接着往下了。 + +## 阶段 3:企业开发基础 + +### 目标 + +面向薪资编程,学习实际后台开发工作要用的基础技术和框架,并能 **独立** 做出一个具有完整功能的 Java Web 项目。 + +学完这个阶段后,你应该已经能独立开发出大多数常见的后台系统了,比如各种管理系统、商城系统等。 + +### 🌕 MySQL 数据库(7 天) +详情请参考学习路线:[数据库学习路线](https://bcdh.yuque.com/staff-wpxfif/resource/dpikl6npld34ydll?view=doc_embed) + +企业中大部分业务数据都是用关系型数据库存储的,因此数据库是后台开发同学的必备技能,其中 MySQL 数据库是目前的主流,也是面试时的重点。 + +#### 知识 + +- 基本概念 +- MySQL 搭建 +- SQL 语句编写 +- 约束 +- 索引 +- 事务 +- 锁机制 +- 设计数据库表 +- 性能优化 + +#### 学习建议 + +其中,**SQL 语句编写** 和 **设计数据库表** 这两个能力一定要有! + +比如让你做一个学生管理系统,你要能想到需要哪些表,比如学生表、班级表;每个表需要哪些字段、字段类型。 + +这就要求大家多写 SQL、多根据实际的业务场景去练习设计能力。 + +#### 经典面试题 + +1. MySQL 索引的最左原则 +2. InnoDB 和 MyIsam 引擎的区别? +3. 有哪些优化数据库性能的方法? +4. 如何定位慢查询? +5. MySQL 支持行锁还是表锁?分别有哪些优缺点? + +#### 资源 + +- 视频 + - ⭐ 2022 黑马 MySQL 教程:[https://www.bilibili.com/video/BV1Kr4y1i7ru](https://www.bilibili.com/video/BV1Kr4y1i7ru)(倾向于速成,初学只看完 P57 节前的基础篇即可,后面可以再来补进阶知识) + - 老杜 - mysql入门基础 + 数据库实战:[https://www.bilibili.com/video/BV1Vy4y1z7EX](https://www.bilibili.com/video/BV1Vy4y1z7EX) (内容相对精炼,有习题) + - 尚硅谷 - MySQL基础教程:[https://www.bilibili.com/video/BV1xW411u7ax](https://www.bilibili.com/video/BV1xW411u7ax) (小姐姐讲课,但感觉音质一般) +- 在线练习 + - ⭐ 鱼皮的闯关式 SQL 自学网:[http://sqlmother.yupi.icu/](http://sqlmother.yupi.icu/) + - ⭐ SQL 在线运行:[https://www.bejson.com/runcode/sql/](https://www.bejson.com/runcode/sql/) +- 文档 + - SQL - 菜鸟教程:[https://www.runoob.com/sql/sql-tutorial.html](https://www.runoob.com/sql/sql-tutorial.html) + - MySQL - 菜鸟教程:[https://www.runoob.com/mysql/mysql-tutorial.html](https://www.runoob.com/mysql/mysql-tutorial.html) +- 网站 + - [数据库大全](https://www.code-nav.cn/rd/?rid=b00064a76012546b016e274a3724c5f0):果创云收录的各种数据库表设计 + +### 🌕 开发框架(60 天) + +Java 之所以能成为主流的企业开发语言,很大一部分原因是它完善的框架生态,用好框架,不仅能够大大提升开发效率,还能提高项目的稳定性、减少维护成本。 + +开发框架是后台开发工作中不可或缺的,也是面试考察的重点,一定要好好学! + +不知道 Java 能做什么的朋友们,学完开发框架,就会有答案啦。 + +下面给大家推荐的都是企业中应用最多的主流开发框架,知识点比较零碎,就放在一起讲了。 + +#### 知识 + +##### 🌕 Java Web + +- 描述:Java 网页应用开发基础 +- 一丢丢前端基础 +- XML +- JSON +- Servlet +- Filter +- Listener +- JSP +- JSTL +- Cookie +- Session + +##### 🌕 Spring 5 + +- 描述:Java 轻量级应用框架 +- IOC +- AOP +- 事务 + +##### 🌕 SpringMVC + +- 描述:Java 轻量级 web 开发框架 +- 什么是 MVC? +- 请求与响应 +- Restful API +- 拦截器 +- 配置 +- 执行过程 + +##### 🌕 MyBatis + +- 描述:数据访问框架,操作数据库进行增删改查等操作 +- 增删改查 +- 全局配置 +- 动态 SQL +- 缓存 +- 和其他框架的整合 +- 逆向工程 + +##### 🌗 MyBatis Plus + +- 描述:Mybatis 的增强工具,能够简化开发、提高效率 +- 引入 +- 通用 CRUD +- 条件构造器 +- 代码生成器 +- 插件扩展 +- 自定义全局操作 + +##### 🌕 SpringBoot 2 + +- 描述:简化 Spring 应用的初始搭建以及开发过程,提高效率 +- 常用注解 +- 资源整合 +- 高级特性 +- 本地热部署 + +##### 🌗 Spring Security + +- 描述:Spring 的安全管理框架 +- 用户认证 +- 权限管理 +- 相关技术:Shiro + +##### 🌗 Maven / Gradle + +- 描述:项目管理工具 +- 构建 +- 依赖管理 +- 插件 +- 配置 +- 子父工程 +- 多模块打包构建 +- Nexus 私服搭建 + +#### 学习建议 + +由于技术较多,且框架之间存在一定的联系,因此建议大家看同一系列的视频教程(尚硅谷、狂神说等等都可以),以保证学习内容的连续以及体验上的一致。 + +学这些技术的时候,**千万不能懒** !一定要多记笔记,并且跟着老师写代码。原理部分不要太过纠结,先以能跟着敲出代码、写出可运行的项目为主,有些东西做出来也能帮助你更好地理解理论。 + +学习顺序挺重要的,建议按我推荐的顺序学,不要一上手就学 Spring Boot。只有先学习下自己整合框架的方法,才能帮你理解 SpringBoot 解决的问题,感受到它的方便和高效。 + +Maven / Gradle 当成工具用就好,面试基本不问,跟着框架教程去用就行了,急着找工作的话,先不用花太多时间去深入学。大厂面试问这个的也不多。 + +#### 经典面试题 + +1. Spring 的 IOC 和 AOP 是什么,有哪些优点? +2. Spring 框架用到了哪些设计模式? +3. 介绍 Spring Bean 的生命周期 +4. MyBatis 如何实现延迟加载? +5. 介绍 MyBatis 的多级缓存机制 + +#### 资源 +已下资源分为两大类,希望快速做出项目、快速就业的同学请看【速成视频】。 + +- 速成视频(按顺序看,同类视频任意选择 1 个即可) + - ⭐ 2023 黑马 JavaWeb:[https://www.bilibili.com/video/BV1m84y1w7Tb](https://www.bilibili.com/video/BV1m84y1w7Tb)(包含了前端、MySQL 数据库、Java Web、MyBatis、Spring MVC、Spring、Spring Boot、Maven 等知识) + - 2022 尚硅谷 SSM + MyBatis Plus 整合学习:[https://www.bilibili.com/video/BV1Ya411S7aT](https://www.bilibili.com/video/BV1Ya411S7aT) + - 2022 黑马 SSM + MyBatis Plus 整合学习:[https://www.bilibili.com/video/BV1Fi4y1S7ix](https://www.bilibili.com/video/BV1Fi4y1S7ix) + - 黑马 Spring Boot 2:[https://www.bilibili.com/video/BV15b4y1a7yG](https://www.bilibili.com/video/BV15b4y1a7yG)(较新) + - 尚硅谷 Spring Boot 2:[https://www.bilibili.com/video/BV19K4y1L7MT](https://www.bilibili.com/video/BV19K4y1L7MT) + +- 非速成视频(按顺序看) + - ⭐ 尚硅谷 JavaWeb 全套教程:[https://www.bilibili.com/video/BV1Y7411K7zz](https://www.bilibili.com/video/BV1Y7411K7zz) (前端部分最好也看下) + - ⭐ 尚硅谷 - Spring 5 框架最新版教程(idea版):[https://www.bilibili.com/video/BV1Vf4y127N5](https://www.bilibili.com/video/BV1Vf4y127N5) + - ⭐ 尚硅谷 - SpringMVC 2021 最新教程:[https://www.bilibili.com/video/BV1Ry4y1574R](https://www.bilibili.com/video/BV1Ry4y1574R) + - ⭐ 尚硅谷 - MyBatis 实战教程全套完整版:[https://www.bilibili.com/video/BV1mW411M737](https://www.bilibili.com/video/BV1mW411M737) + - ⭐ 尚硅谷 - MyBatisPlus 教程:[https://www.bilibili.com/video/BV1Ds411E76Y](https://www.bilibili.com/video/BV1Ds411E76Y) + - Maven 零基础入门教程:[https://www.bilibili.com/video/BV1TW411g7hP](https://www.bilibili.com/video/BV1TW411g7hP) (搞不懂 Maven 可以看看) + - ⭐ 雷丰阳 2021 版 SpringBoot2 零基础入门:[https://www.bilibili.com/video/BV19K4y1L7MT](https://www.bilibili.com/video/BV19K4y1L7MT) + - 尚硅谷 - SpringSecurity 框架教程:[https://www.bilibili.com/video/BV15a411A7kP](https://www.bilibili.com/video/BV15a411A7kP) + +学习完框架后,即可跟着鱼皮的原创项目教程系列边学边做项目。用项目驱动学习,更快地掌握后端必学技术,并直接写在简历上:[项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 。 + +### 🌘 开发规范(3 天) + +开发不规范,同事两行泪。 + +开发规范是团队开发中必须遵守的,有利于提高项目的开发效率、降低维护成本。 + +#### 知识 + +- 代码规范 + - 代码风格 + - 命名 + - 其他规则 +- 代码校验(CheckStyle) +- 提交规范 + +#### 学习建议 + +有时间的话,简单过一遍大厂团队的代码规范手册就好了,以后做项目的时候能想起来的话就去使用,或者从书中、网上查规范文档,再去遵守。 + +项目做得多了,自然会养成好的习惯,不用刻意去记(毕竟每个团队规范也不完全相同,背了也没用)。也可以直接利用开发工具自带的一些代码检查插件,帮忙养成好的编码习惯。 + +#### 资源 + +- 书籍 + - ⭐ 阿里巴巴 Java 开发手册:[https://developer.aliyun.com/graph/java](https://developer.aliyun.com/graph/java) (搜索《Java开发手册》) +- 视频 + - 华山版《Java开发手册》独家讲解:[https://developer.aliyun.com/live/1201](https://developer.aliyun.com/live/1201) +- 文档 + - Google Java Style Guide:[https://google.github.io/styleguide/javaguide.html](https://google.github.io/styleguide/javaguide.html) (谷歌 Java 代码规范) + +### 🌕 Git(3 天) +详情请参考学习路线:[Git & GitHub 学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/nvb6om) + +此前大家可能听说过 GitHub,一流的代码开源托管平台。 + +Git 和它可不一样,是一个版本控制工具,可以更好地管理和共享项目代码,比如把自己的代码传到 GitHub 上、或者从远程下载。 + +无论自己做项目、还是团队开发,Git 都是现在不可或缺的神器。 + +#### 知识 + +- 区分 Git 和 GitHub +- 工作区 +- 分支 +- 代码提交、推送、拉取、回退、重置 +- 分支操作 +- 代码合并、解决冲突 +- 标签 +- cherry-pick +- Git Flow +- 相关技术:SVN(比较老) + +#### 学习建议 + +每个命令跟着敲一遍,有个大致的印象,会用即可。 + +建议平时大家可以多把自己的代码使用 Git 命令上传到 GitHub 上,用的多了自然就熟悉了。 + +#### 经典面试题 + +1. 如何解决提交冲突? +2. 提交不小心出现误操作,如何撤销? +3. 什么是 Git Flow,它有什么好处? + +#### 资源 + +- 视频 + - ⭐【尚硅谷】5h打通Git全套教程丨2021最新IDEA版 [https://www.bilibili.com/video/BV1vy4y1s7k6](https://www.bilibili.com/video/BV1vy4y1s7k6) +- 书籍 + - 猴子都能懂的 Git 入门 [https://backlog.com/git-tutorial/cn/](https://backlog.com/git-tutorial/cn/) + - ⭐ GitHub 漫游指南 [https://github.phodal.com/](https://github.phodal.com/) +- 文档 + - GitHub 官方文档:[https://docs.github.com/cn](https://docs.github.com/cn) +- 游戏 + - Learning Git Branching:[https://learngitbranching.js.org/?locale=zh_CN](https://learngitbranching.js.org/?locale=zh_CN) + +### 🌖 Linux(10 天) +详情请参考学习路线:[Linux 学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/qofaxe) + +企业中的很多前后台项目都是部署在 Linux 服务器上的,因此很有必要熟悉 Linux 的操作和脚本的编写。 + +后面学微服务、学架构都是在多台服务器操作,如果你不熟悉 Linux,会有点吃力。 + +#### 知识 + +- Linux 系统安装 +- 环境变量 +- 文件管理 +- 用户管理 +- 内存管理 +- 磁盘管理 +- 进程管理 +- 网络管理 +- 软件包管理 +- 服务管理 +- 日志管理 +- Linux 内核 +- **常用命令** +- **常用环境搭建** +- **Shell 脚本编程** +- **VIM 的使用** + +#### 学习建议 + +多动手实践,建议自己购买一台云服务器,并且在本地搭建 Linux 虚拟机环境。 + +一定要自己从 0 开始手敲命令安装软件、部署服务,熟悉整个项目的上线流程。 + +每个命令至少要跟着敲一遍,了解它们的作用,并通过自然地练习,熟悉常用的 Linux 命令。 + +记不住没关系,用文档查就行了。 + +先会用,再理解。一般面试问的 Linux 题目也不会很难,面试前去背一下八股文就没什么问题,感兴趣的话可以去看看 Linux 内核设计。 + +#### 经典面试题 + +1. 如何查看某个进程的运行状态? +2. 如何在 Linux 上查看 2 G 的大文件? +3. Linux 软链接和硬链接的区别 + +#### 资源 + +- 视频 + - ⭐ 2021 韩顺平 一周学会Linux [https://www.bilibili.com/video/BV1Sv411r7vd](https://www.bilibili.com/video/BV1Sv411r7vd) (基于 CentOS 7.6 版本较新) +- 书籍 + - 《鸟哥的 Linux 私房菜 —— 基础篇》[http://cn.linux.vbird.org/linux_basic/linux_basic.php](http://cn.linux.vbird.org/linux_basic/linux_basic.php) (经典) +- 文档 + - Linux 工具快速教程:[https://linuxtools-rst.readthedocs.io](https://linuxtools-rst.readthedocs.io) (基础、工具进阶、工具参考) +- 实战 + - ⭐ 蓝桥云课 Linux 基础入门:[https://www.lanqiao.cn/courses/1](https://www.lanqiao.cn/courses/1) + - 腾讯云动手实验室:[https://cloud.tencent.com/developer/labs](https://cloud.tencent.com/developer/labs) + - 阿里云体验实验室:[https://developer.aliyun.com/adc/labs/](https://developer.aliyun.com/adc/labs/) + - 阿里云知行实验室:[https://start.aliyun.com/](https://start.aliyun.com/) + - 华为云沙箱实验室:[https://lab.huaweicloud.com/](https://lab.huaweicloud.com/) +- 社区 + - Linux 中国:[https://linux.cn/](https://linux.cn/) +- 工具 + - ⭐ Linux 命令搜索:[https://wangchujiang.com/linux-command](https://wangchujiang.com/linux-command) + - Linux 命令大全手册:[https://www.linuxcool.com/](https://www.linuxcool.com/) + - Linux 命令示例:[http://linux-commands-examples.com/](http://linux-commands-examples.com/) + - 宝塔 Linux 面板:[https://www.bt.cn/](https://www.bt.cn/) + +### 🌘 前端基础(14 天) +详情请参考鱼皮原创的前端学习路线:[https://mp.weixin.qq.com/s/HbzLEt6NOP9Is9F3GOnbUQ](https://mp.weixin.qq.com/s/HbzLEt6NOP9Is9F3GOnbUQ) + +虽然 Java 程序员面试时基本不会出现前端相关问题,但是在企业中,往往需要前后端程序员配合完成工作。会一些前端,不仅可以提高你们的协作效率,还能提高自己对整个项目的了解和掌控力,甚至能独立开发出一个完整项目!这点也是能给面试加分的。 + +#### 知识 + +- HTML +- CSS +- JavaScript + - Ajax +- Vue + +#### 学习建议 + +不需要学习太多的前端技术,熟悉下基础的前端三件套,了解前端是如何向后端发送请求来做数据交互的一般就够了。有时间的话可以学下 Vue ,是比较容易上手的主流前端开发框架,Vue + SpringBoot 还是很香的。 + + +### 练手项目 +推荐跟着鱼皮的原创项目教程系列边学边做项目,每个项目都是前端 + 后端的全栈项目。用项目驱动学习,更快掌握前端基础和后端必学技术,并直接写在简历上:[项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 。 + +- HotelSystem:[https://github.com/misterchaos/HotelSystem](https://github.com/misterchaos/HotelSystem) (酒店管理系统 Java,tomcat,mysql,servlet,jsp实现,没有使用任何框架) +- 超市管理系统:[https://github.com/zhanglei-workspace/shopping-management-system](https://github.com/zhanglei-workspace/shopping-management-system) +- Mall4j:[https://github.com/gz-yami/mall4j](https://github.com/gz-yami/mall4j) (Spring Boot 电商系统) +- newbee-mall:[https://github.com/newbee-ltd/newbee-mall](https://github.com/newbee-ltd/newbee-mall) (基于 Spring Boot 2.X 的全栈电商系统) +- litemall:[https://github.com/linlinjava/litemall](https://github.com/linlinjava/litemall) (小商城系统,Spring Boot 后端 + Vue 管理员前端 + 微信小程序用户前端 + Vue 用户移动端) +- forum-java:[https://github.com/Qbian61/forum-java](https://github.com/Qbian61/forum-java) (一款用 Java Spring Boot 实现的现代化社区系统) + +### 尾声 + +学完这个阶段的知识后,一定要再串起来回忆一遍,必须自己独立开发一个 Java Web 项目(量级可以不大,但你学过的技术尽可能地用上),能发布到 Linux 服务器上让其他小伙伴访问就更好了~ + +如果你只是对 Java 感兴趣、或者只是想试着自己开发后台,并不是想靠 Java 找工作的话,学到这里就可以了。可以把更多时间投入到你主方向的学习中。 + +但如果你是想找 Java 方向的工作,尤其是想进大厂的话,一定要继续努力,用心学习下个阶段的企业开发进阶知识。 + +## 阶段 4:企业开发进阶 + +### 目标 + +学习更多企业级开发技术和编程思想,能够结合多种技术,独立开发出架构合理的完整系统,**解决实际问题** 。 + +要了解为什么需要这个技术?什么时候用这个技术?某个需求该用哪些技术? + +当然,这个阶段的内容有些过于丰富,不是所有的东西都要学,大家可以根据自己的实际情况(时间),有选择地学习。 + +### 🌘 软件工程 +详情请参考学习路线:[软件工程学习路线](https://bcdh.yuque.com/staff-wpxfif/resource/vff7p0rafgxhyryi?view=doc_embed) + +软件开发和管理的一些概念、原则、技术、方法、工具和经验。 + +#### 知识 + +- 软件的本质 +- 软件特性 +- 软件过程 +- 软件开发原则 + - 开闭原则 + - 里氏替换原则 + - 依赖倒置原则 + - 单一职责原则 + - 接口隔离原则 + - 迪米特法则 +- 软件过程模型 +- 敏捷开发 +- 软件开发模型 +- 需求建模 +- 软件设计 +- UML +- 体系结构设计 +- 设计模式 +- 软件质量管理 +- 评审 +- 软件质量保证 +- 软件测试 + - 单元测试 + - 集成测试 + - 系统测试 + - 压力测试 + - 部署测试 +- 软件配置管理 +- 软件项目管理 +- 软件项目估算 +- 项目进度安排 +- 风险管理 +- 软件过程改进 + - 成熟度模型 + +#### 学习建议 + +大学软件专业的必修课,偏理论,能学到很多企业软件开发的方法,也是对软件开发同学综合能力的提升,有时间的话可以了解下。但对想要快速找工作的同学来说,忽略即可,面试基本不会问。 + +#### 资源 + +- 书籍 + - 《软件工程:实践者的研究方法》:[https://book.douban.com/subject/6047742/](https://book.douban.com/subject/6047742/) (经典大黑书,讲的非常全面,但同样完整读下来还是有些难度的) + - 《软件开发的 201 个原则》:[https://book.douban.com/subject/35628886/](https://book.douban.com/subject/35628886/) (工具书,看一遍挺好的) +- 视频 + - 清华大学软件工程:[https://www.bilibili.com/video/BV1eE411V7Cr](https://www.bilibili.com/video/BV1eE411V7Cr) + - 北京大学软件工程:[https://www.bilibili.com/video/BV1Vt411V72G](https://www.bilibili.com/video/BV1Vt411V72G) + - 大连工业大学软件工程:[https://www.bilibili.com/video/BV1Ns41177VM](https://www.bilibili.com/video/BV1Ns41177VM) +- 大学课件 + - 浙大计算机软件工程:[https://github.com/QSCTech/zju-icicles](https://github.com/QSCTech/zju-icicles) + +### 🌖 设计模式(21 天) +详情请参考学习路线:[设计模式学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/gemmvk) + +设计模式是软件开发中解决一类问题的通用方法。 + +使用设计模式能让你写出更优雅、可维护的代码,也正因如此,很多框架源码都用到了设计模式,你不学很难看懂。 + +此外,鱼皮改了几百份简历,基本上没有同学把设计模式写在项目经历中。因此学好设计模式并写在简历上是很加分的! + +#### 知识 + +- 创建型模式:对象实例化的模式,创建型模式用于解耦对象的实例化过程 + - 单例模式 + - 工厂方法模式 + - 抽象工厂 + - 建造者模式 + - 原型模式 +- 结构型模式:把类或对象结合在一起形成一个更大的结构 + - 适配器模式 + - 组合模式 + - 装饰器模式 + - 代理模式 + - 享元模式 + - 外观模式 + - 桥接模式 +- 行为型模式:类和对象如何交互,及划分责任和算法 + - 迭代器模式 + - 模板方法模式 + - 策略模式 + - 命令模式 + - 状态模式 + - 责任链模式 + - 备忘录模式 + - 观察者模式 + - 访问者模式 + - 中介者模式 + - 解释器模式 + +#### 学习建议 + +先理解概念,了解每个设计模式的特点和应用场景,再多加练习,运用到实际项目。 + +#### 经典面试题 + +1. 单例模式有哪些实现方式?有哪些优缺点?请手写其中一种 +2. 你用过哪些设计模式,为什么用它? + +#### 资源 + +- 项目 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的聚合搜索项目、OJ 项目都运用了大量的设计模式,推荐学习 +- 书籍 + - ⭐《图解设计模式》(强烈推荐这本书,正是用 Java 语言实现,图多、有示例代码、有习题和答案,很不错) + - 《Head First 设计模式》 + - 《大话设计模式》 + - 《设计模式:可复用面向对象软件的基础》(大黑书,有能力的话也可以去读) +- 视频 + - 尚硅谷图解 Java 设计模式:[https://www.bilibili.com/video/BV1G4411c7N4](https://www.bilibili.com/video/BV1G4411c7N4) +- 文档 + - 菜鸟教程:[https://www.runoob.com/design-pattern/design-pattern-tutorial.html](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) + - 图说设计模式:[https://design-patterns.readthedocs.io/zh_CN/latest/](https://design-patterns.readthedocs.io/zh_CN/latest/) + +### 🌕 Redis(14 天) +详情请参考学习路线:[Redis 学习路线](https://bcdh.yuque.com/books/share/2dd2567c-a826-4d9d-9303-bd288269e874/qunv5d) + +缓存是高并发系统不可或缺的技术,可以提高系统的性能和并发,而 Redis 是实现缓存的最主流技术,因此它是后台开发必学的知识点,也是面试重点。 + +#### 知识 + +- Redis 基础 +- 什么是缓存? +- 本地缓存 + - Caffeine 库 +- 多级缓存 +- Redis 分布式缓存 + - 数据类型 + - 常用操作 + - Java 操作 Redis + - Spring Boot Redis Template + - Redisson + - 主从模型搭建 + - 哨兵集群搭建 + - 日志持久化 +- 缓存(Redis)应用场景 + - 数据共享 + - 单点登录 + - 计数器 + - 限流 + - 点赞 + - 实时排行榜 + - 分布式锁 +- 缓存常见问题 + - 缓存雪崩 + - 缓存击穿 + - 缓存穿透 + - 缓存更新一致性 +- 相关技术:Memcached、Ehcache + +#### 学习建议 + +学会如何简单地使用缓存并不难,和数据库类似,无非就是调用 API 对数据进行增删改查。 + +因此,建议先能够独立使用它,了解缓存的应用场景;再学习如何在 Java 中操作缓存中间件,并尝试和项目相结合,提高系统的性能。 + +跟着视频教程实操一遍即可,可以等到面试前再去深入了解原理和高级特性。 + +#### 经典面试题 + +1. Redis 为什么快? +2. Redis 有哪些常用的数据结构? +3. Redis RDB 和 AOF 持久化的区别,如何选择? +4. 如何解决缓存击穿、缓存穿透、雪崩问题? +5. 如何用 Redis 实现点赞功能,怎么设计 Key / Value? + +#### 资源 + +- 项目 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的伙伴匹配系统、智能 BI 项目都运用了 Redis 解决实际问题,推荐学习 +- 视频 + - ⭐ 2022 黑马 Redis 从基础到原理:[https://www.bilibili.com/video/BV1cr4y1671t](https://www.bilibili.com/video/BV1cr4y1671t)(结合项目去讲,强烈推荐) + - 尚硅谷 - 2021 最新 Redis 6 入门到精通教程:[https://www.bilibili.com/video/BV1Rv41177Af](https://www.bilibili.com/video/BV1Rv41177Af) (基于 Redis 6 的,推荐) +- 文档 + - Redis 命令参考:[http://redisdoc.com/](http://redisdoc.com/) + - Redis 面试题整理:[https://github.com/lokles/Web-Development-Interview-With-Java/blob/main/Redis问题.md](https://github.com/lokles/Web-Development-Interview-With-Java/blob/main/Redis%E9%97%AE%E9%A2%98.md) +- 书籍 + - 《Redis 实战》(经典) +- 工具 + - ⭐ Redis 在线练习:[https://try.redis.io/](https://try.redis.io/) (强烈推荐) + +### 🌖 消息队列(14 天) +消息队列是用于传输和保存消息的容器,也是大型分布式系统中常用的技术,主要解决应用耦合、异步消息、流量削锋等问题。后台开发必学,也是面试重点。 + +#### 知识 + +- 消息队列的作用 +- RabbitMQ 消息队列 + - 生产消费模型 + - 交换机模型 + - 死信队列 + - 延迟队列 + - 消息持久化 + - Java 操作 + - 集群搭建 +- 相关技术:Kafka、ActiveMQ、TubeMQ、RocketMQ + +#### 学习建议 + +和缓存一样,学会如何使用消息队列并不难,无非就是调用 API 去生产、转发和消费消息。 + +因此,建议先能够独立使用它,了解消息队列的应用场景;再学习如何在 Java 中操作消息队列中间件,并尝试和项目相结合,感受消息队列带来的好处。 + +这里我建议初学者先学习 RabbitMQ,比 Kafka 要好理解一些。跟着视频教程实操一遍即可,可以等到面试前再去深入了解原理和高级特性。 + +#### 经典面试题 + +1. 使用消息队列有哪些优缺点? +2. 如何保证消息消费的幂等性? +3. 消息队列有哪些路由模型? +4. 你是否用过消息队列,解决过什么问题? + +#### 资源 + +- 项目 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的智能 BI 项目、在线判题系统都运用了消息队列解决实际问题,推荐学习 +- 视频 + - ⭐️ 2023 黑马 RabbitMQ 消息队列教程:[https://www.bilibili.com/video/BV1Xm4y1i7HP](https://www.bilibili.com/video/BV1Xm4y1i7HP)(适合快速入门) + - ⭐ 尚硅谷 - 2021 最新 RabbitMQ 教程:[https://www.bilibili.com/video/BV1cb4y1o7zz](https://www.bilibili.com/video/BV1cb4y1o7zz) (更加全面) +- 文档 + - RabbitMQ 中文文档:[http://rabbitmq.mr-ping.com/](http://rabbitmq.mr-ping.com/) +- 书籍 + - ⭐️ 编程导航原创 Rocket MQ 消息队列专栏:[https://yuyuanweb.feishu.cn/wiki/R5mbwIMwCi9xkmkrpyOcp1pzn9b](https://yuyuanweb.feishu.cn/wiki/R5mbwIMwCi9xkmkrpyOcp1pzn9b) + - 《RabbitMQ 实战:高效部署分布式消息队列》(经典) +- 工具 + - ⭐ RabbitMQ 在线模拟器:[http://tryrabbitmq.com/](http://tryrabbitmq.com/) + +### 🌖 Nginx(14 天) + +Nginx 是主流的、开源的、高性能的 HTTP 和反向代理 web 服务器,可以用于挂载网站、请求转发、负载均衡、网关路由等。前后端开发同学都需要学习,在后端开发的面试中有时会考到。 + +#### 知识 + +- Nginx 作用 +- 正向代理 +- 反向代理(负载均衡) +- 常用命令 +- 配置 +- 动静分离(网站部署) +- 集群搭建 +- 相关技术:HAProxy、Apache + +#### 学习建议 + +Nginx 的基本使用非常简单,甚至不需要看任何的视频,跟着一篇文章就能够用它来提供网站访问能力、实现反向代理。 + +但是在企业中,Nginx 的使用往往没那么简单,作为负载均衡、请求转发的重要组件,往往需要针对实际场景去写一些特定的配置。因此建议有时间的话,实践下 Nginx 的配置方法,了解 Nginx 基本的设计思想,对今后自己设计系统时也有帮助。 + +#### 经典面试题 + +1. Nginx 有哪些作用? +2. Nginx 为什么支持高并发? +3. Nginx 有哪些负载均衡策略? +4. 什么是 Nginx 惊群问题,如何解决它? + +#### 资源 + +- 视频 + - ⭐ 尚硅谷 - Nginx 教程由浅入深:[https://www.bilibili.com/video/BV1zJ411w7SV](https://www.bilibili.com/video/BV1zJ411w7SV) (讲的比较全面) + - ⭐ Nginx 鱼皮 - 手把手带你从0搭建个人网站:[https://www.bilibili.com/video/BV1rU4y1J785/](https://www.bilibili.com/video/BV1rU4y1J785/) (简单演示 Nginx 部署网站) +- 文档 + - Nginx 中文文档:[https://www.nginx.cn/doc/index.html](https://www.nginx.cn/doc/index.html) +- 工具 + - Nginx 配置在线生成:[https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN](https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN) + +### 🌗 Netty 网络编程(21 天) + +开源的 Java 网络编程框架,用于开发高性能(事件驱动、异步非阻塞)、高可靠的网络服务器和客户端程序。 + +很多网络框架和服务器程序都用到了 Netty 作为底层,学好 Netty 不仅可以让我们自己实现高性能服务器,也能更好地理解其他的框架应用、阅读源码。 + +#### 知识 + +- IO 模型(BIO / NIO) +- Channel +- Buffer +- Seletor +- Netty 模型 +- WebSocket 编程(动手做个聊天室) +- 相关技术:Vertx(中文文档:[http://vertxchina.github.io/vertx-translation-chinese/](http://vertxchina.github.io/vertx-translation-chinese/) ,比 Netty 简单多了,实在看不懂 Netty 也可以学习下这个) + +#### 学习建议 + +不同于之前学的 SSM 框架,Netty 还是需要一定学习成本的,一方面是国内资源太缺乏,另一方面很多重要的概念(比如 NIO)还是要多动手写代码调试才能理解。 + +还是建议先从视频入门,并且不建议在 Netty 上花太多时间,面试的时候一般也就考察一些 Netty 背后的思想(比如 NIO)而非框架本身的语法细节。 + +#### 经典面试题 + +1. Netty 有哪些优点? +2. 什么是 NIO? +3. 介绍 Netty 的零拷贝机制 + +#### 资源 + +- 视频 + - ⭐ 尚硅谷Netty教程:[https://www.bilibili.com/video/BV1DJ411m7NR](https://www.bilibili.com/video/BV1DJ411m7NR) + - Netty 技术演讲(中文字幕版):[https://www.youtube.com/watch?v=I8yy2Cy7dDI](https://www.youtube.com/watch?v=I8yy2Cy7dDI) +- 文档 + - Netty 4 用户指南:[https://www.w3cschool.cn/netty_4_user_guide/](https://www.w3cschool.cn/netty_4_user_guide/) +- 书籍 + - 《Netty 实战》 + +### 🌖 微服务(60 天) + +随着互联网的发展,项目越来越复杂,单机且庞大的巨石项目已无法满足开发、运维、并发、可靠性等需求。 + +因此,后台架构不断演进,可以将庞大的项目拆分成一个个职责明确、功能独立的细小模块,模块可以部署在多台服务器上,相互配合协作,提供完整的系统能力。 + +换言之,想做大型项目,这块儿一定要好好学! + +#### 知识 + +##### Dubbo + +- 架构演进 +- RPC +- Zookeeper +- 服务提供者 +- 服务消费者 +- 项目搭建 +- 相关技术:DubboX(对 Dubbo 的扩展) + +##### 🌖 微服务 + +- 微服务概念 +- Spring Cloud 框架 + - 子父工程 + - 服务注册与发现 + - 注册中心 Eureka、Zookeeper、Consul + - Ribbon 负载均衡 + - Feign 服务调用 + - Hystrix 服务限流、降级、熔断 + - Resilience4j 服务容错 + - Gateway(Zuul)微服务网关 + - Config 分布式配置中心 + - 分布式服务总线 + - Sleuth + Zipkin 分布式链路追踪 +- Spring Cloud Alibaba + - Nacos 注册、配置中心 + - OpenFeign 服务调用 + - Sentinel 流控 + - Seata 分布式事务 + +##### 接口管理 + +- Swagger 接口文档 +- Postman 接口测试 +- 相关技术:YApi、ShowDoc + +#### 学习建议 + +时间不急的话,建议先从 Dubbo 学起,对分布式、RPC、微服务有些基本的了解,再去食用 Spring Cloud 全家桶会更香。学完 Spring Cloud 全家桶后,再去学 Spring Cloud Alibaba 就很简单了。 + +这部分内容的学习,原理 + 实践都很重要,也不要被各种高大上的词汇唬住了,都是上层(应用层)的东西,基本没有什么算法,跟着视频教程学,其实还是很好理解的。 + +分布式相关知识非常多,但这里不用刻意去背,先通过视频教程实战使用一些微服务框架,也能对其中的概念有基本的了解。 + +大厂面试的时候很少问 Spring Cloud 框架的细节,更多的是微服务以及各组件的一些思想,比如网关的好处、消息总线的好处等。 + +#### 经典面试题 + +1. 什么是微服务,有哪些优缺点? +2. 什么是注册中心,能解决什么问题? + +#### 资源 + +- 项目实战 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的 API 开放平台、在线判题系统都运用了微服务,推荐学习 +- 视频 + - ⭐️ 黑马 Spring Cloud 视频教程:[https://www.bilibili.com/video/BV1kH4y1S7wz](https://www.bilibili.com/video/BV1kH4y1S7wz)(11 小时,非常凝练,适合快速入门) + - ⭐️ 尚硅谷 Dubbo 教程:[https://www.bilibili.com/video/BV1ns411c7jV](https://www.bilibili.com/video/BV1ns411c7jV) + - 尚硅谷 SpringCloud(H版&alibaba)框架开发教程(微服务分布式架构):[https://www.bilibili.com/video/BV18E411x7eT](https://www.bilibili.com/video/BV18E411x7eT) (把国外的 Spring Cloud 和国内的 Spring Cloud Alibaba 结合在一起对比着去讲,主流技术栈、知识点都讲到了,内容更全面) +- 文档 + - Apache Dubbo 官方文档:[https://dubbo.apache.org/zh/](https://dubbo.apache.org/zh/) + - Spring Cloud Alibaba 官方文档:[https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md](https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md) + - ⭐ Swagger 教学文档:[https://doc.xiaominfo.com/](https://doc.xiaominfo.com/) (跟着快速开始直接用就好了) + +### 🌖 容器(7 天) + +将应用和环境进行封装,相互隔离、独立部署、便于移植,提高安全性、提高开发和维护效率。 + +便于实现微服务、持续集成和交付。 + +#### 知识 + +- 🌖 Docker + - 容器概念 + - 镜像 + - 部署服务 + - Dockerfile + - Docker Compose + - Docker Machine + - Docker Swarm + - 多阶段构建 +- 🌘 K8S(Kubernetes) + - K8S 架构 + - 工作负载 + - 资源类型 + - Pod + - Pod 生命周期 + - Pod 安全策略 + - K8S 组件 + - K8S 对象 + - 部署应用 + - 服务 + - Ingress + - Kubectl 命令行 + - 集群管理 +- 相关技术:Apache Mesos、Mesosphere + +#### 学习建议 + +业务上云是趋势,但是对于开发同学来说,会用 Docker / K8S 部署项目和服务就行。实际工作中,企业一般都有现成的平台直接用,面试考察的也不多,不用花太多时间。 + +#### 经典面试题 + +1. 什么是容器? +2. 使用  Docker 有哪些好处? +3. 如何快速启动多个 Docker 节点? + +#### 资源 + +- 项目实战 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的在线判题项目运用了 Docker 解决实际问题,推荐学习 +- 视频 + - ⭐【狂神说】Docker 最新超详细版教程通俗易懂:[https://www.bilibili.com/video/BV1og4y1q7M4](https://www.bilibili.com/video/BV1og4y1q7M4) + - K8S 视频教程:[https://www.bilibili.com/video/BV1K5411N7j8](https://www.bilibili.com/video/BV1K5411N7j8) +- 书籍 + - 《深入浅出 Docker》:[https://www.zhihu.com/pub/reader/119632192](https://www.zhihu.com/pub/reader/119632192) +- 文档 + - Docker — 从入门到实践:[https://vuepress.mirror.docker-practice.com/](https://vuepress.mirror.docker-practice.com/) + - 菜鸟教程 Docker:[https://www.runoob.com/docker/docker-tutorial.html](https://www.runoob.com/docker/docker-tutorial.html) + - 国外 Docker 官方文档:[https://docs.docker.com/get-started/](https://docs.docker.com/get-started/) +- 网站 + - Docker 中文社区:[https://www.docker.org.cn/](https://www.docker.org.cn/) (强烈推荐,有很多 Docker 技术文章和学习笔记) + - Docker Blog:[https://www.docker.com/blog/](https://www.docker.com/blog/) (国外 Docker 技术博客) +- 镜像源 + - Docker Hub:[https://hub.docker.com](https://hub.docker.com) + - 腾讯软件源:[http://mirrors.tencent.com/#/index](http://mirrors.tencent.com/#/index) + - 阿里云 Docker 仓库:[https://cr.console.aliyun.com/](https://cr.console.aliyun.com/) + +### 🌗 CI / CD(3 天) + +持续集成 / 持续交付,贯穿整个研发到项目上线的过程,提高效率。 + +大公司一般都有自己的 CI / CD 平台。 + +#### 知识 + +- 什么是 CI / CD +- CI / CD 有什么好处 +- 使用任一 CI / CD 平台 +- 相关技术:Jenkins、GitLab、微信云托管 + +#### 学习建议 + +了解它是什么,并且实战使用任一 CI / CD 平台,感受它和传统开发运维到底有什么不同,就足够了。其实很简单,不要花太多时间。 + +真正要自己去搭建的时候,跟着官方文档来就行。 + +#### 资源 + +- 视频 + - ⭐【狂神说】CI/CD到底是什么?十分钟理解企业级DevOps:[https://www.bilibili.com/video/BV1zf4y127vu](https://www.bilibili.com/video/BV1zf4y127vu) (讲的非常棒!带你快速理解 CI / CD 的作用和部分原理) + - 尚硅谷 - Jenkins 持续集成工具教程:[https://www.bilibili.com/video/BV1GW411w7pn](https://www.bilibili.com/video/BV1GW411w7pn) (实在要用到 Jenkins 再去学) +- 文档 + - Jenkins 官方文档:[https://www.jenkins.io/zh/](https://www.jenkins.io/zh/) (有很多案例,要用的时候查一下就行了) +- 实战平台 + - ⭐ 微信云托管:[https://cloud.weixin.qq.com/cloudrun](https://cloud.weixin.qq.com/cloudrun) (直播演示过,鱼皮后面会给大家出视频教程) + - 前端托管 Webify:[https://cloud.tencent.com/product/webify](https://cloud.tencent.com/product/webify) (鱼皮给大家出过视频教程的 https://www.bilibili.com/video/BV11V411p7vf/) + +### 练手项目 +学习完框架后,即可跟着鱼皮的原创项目教程系列边学边做项目。用项目驱动学习,更快地掌握后端必学技术,并直接写在简历上:[项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 。 + +- mall-learning:[https://github.com/macrozheng/mall-learningmall](https://github.com/macrozheng/mall-learningmall) (学习教程,架构、业务、技术要点全方位解析) +- miaosha:[https://github.com/qiurunze123/miaosha](https://github.com/qiurunze123/miaosha) (秒杀系统设计与实现) +- Mall:[https://github.com/macrozheng/mall](https://github.com/macrozheng/mall) (包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现) +- Spring-Cloud-Admin:[https://github.com/wxiaoqi/Spring-Cloud-AdminCloud-Admin](https://github.com/wxiaoqi/Spring-Cloud-AdminCloud-Admin) (基于 Spring Cloud 微服务化开发平台,具有统一授权、认证的后台管理系统) +- paascloud-master:[https://github.com/paascloud/paascloud-master](https://github.com/paascloud/paascloud-master) (基于 spring cloud + vue + oAuth2.0,前后端分离商城系统) +- mall-swarm:[https://github.com/macrozheng/mall-swarm](https://github.com/macrozheng/mall-swarm) (一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技术,同时提供了基于 Vue 的管理后台方便快速搭建系统) +- SecKill:[https://github.com/hfbin/Seckill](https://github.com/hfbin/Seckill) (基于 SpringBoot+Mybatis+Redis+RabbitMQ 秒杀系统) +- jeecg-boot:[https://github.com/zhangdaiscott/jeecg-boot](https://github.com/zhangdaiscott/jeecg-boot) (低代码开发平台) +- PassJava-Platform:[https://github.com/Jackson0714/PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform) (一款面试刷题的 Spring Cloud 开源系统) + +### 尾声 + +看到这里,相信你已经感叹:编程语言一辈子学不完了! + +但是,不用担心,通过对这么多知识点的学习,相信你已经有了一定的积累,也不知不觉地锻炼了自主学习能力、资源检索能力、代码阅读能力、问题解决能力,之后的学习会越来越轻松。 + +接下来,可以试着用你学到的技术来解决实际的问题,自主从 0 开始做一些项目,保持编程手感。 + +## 阶段 5:项目实战 + +### 目标 + +综合所学技术从 0 到 1 开发和上线一个全面、有特色的、可以写进简历的个人项目。 + +### 学习建议 + +其实在之前的框架学习视频中应该就做过几个项目了,但相对不够完整和体系化。 + +有想法的同学可以做任何自己想做的项目,推荐参加一些作品类竞赛,练手、拿奖、收获项目经历一举三得。 + +暂时没想法的朋友,建议先跟着专门带做项目的视频教程做 1 - 2 套 Java 完整项目,一定要从 0 到 1 自己手写! + +有能力的朋友也可以试着用 GitHub 上的源码来学习啦~ + +做一个完整的项目的确很不容易,建议大家根据自己的 **时间、兴趣** 选择 **较新的**、**有配套源码的** 教程,保持耐心。 + +如何选择编程学习资源,可以看下我的原创文章:[https://mp.weixin.qq.com/s/mlMql9RJCd7THt6rpGb8UA](https://mp.weixin.qq.com/s/mlMql9RJCd7THt6rpGb8UA) + +下面推荐一些优质的、较新的项目实战视频教程 + 50 套项目源码。 + +### 视频教程 +[编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 内部分享: + +1. ⭐️ 鱼皮全程直播带做的保姆级全栈项目,带现成的简历写法和面试题:[项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd)。 +2. [项目训练营(寻爱网项目)](https://t.zsxq.com/06EIMNr3R):学习从立项到上线的完整做项目流程 + 优化思路 +3. [从 0 到 1 开发用户中心](https://t.zsxq.com/03RjeeYZJ):保姆级前后端完整项目教程,适合刚学完框架的新手 +4. [伙伴匹配系统](https://t.zsxq.com/03jmU7eAa):移动端网站,设计分布式和并发编程知识,适合已经做过一个小项目的同学练习 +5. [Web 终端项目经验分享](https://t.zsxq.com/04bqFI66M):前后端技术选型 + 系统设计 + 源码解读 + 简历亮点全面分享 +6. [面试刷题网站项目经验分享](https://t.zsxq.com/03auZnAM3):从 0 到 1 分享数万用户网站的创作过程和经验分享 +7. [瑞吉外卖 - 外卖点餐系统](https://t.zsxq.com/07Yr7i6ai):Java Spring Boot 入门级项目,适合刚学完框架的同学 +8. [尚医通 - 在线预约挂号平台](https://t.zsxq.com/07EEiyfq7):业务功能完整的 Java Spring Cloud 微服务项目,适合刚学完微服务的同学 +9. [硅谷课堂 - 在线学习平台](https://t.zsxq.com/07e2FIMzb):业务功能完整的 Java Spring Cloud 微服务项目,适合想学习第三方服务对接的同学 +10. [黑马点评 - 类似大众点评的移动 APP](https://t.zsxq.com/07JMnQvne):专门为学习 Redis 定制的单体项目,适合刚学完 Spring Boot、想系统学习 Redis 的同学 + +公开: + +- 尚硅谷 - 谷粒学院 - 微服务 + 全栈 - 在线教育实战项目:[https://www.bilibili.com/video/BV1dQ4y1A75e](https://www.bilibili.com/video/BV1dQ4y1A75e) (全栈项目,前后端讲得都很全面) +- 尚硅谷 - 尚筹网 - Java项目实战开发教程 - SSM 框架 + 微服务架构:https://www.bilibili.com/video/BV1bE411T7oZ(500 多集,包含完整的用户权限管理,功能丰富、讲得很细致全面) +- 黑马 - 24 小时搞定 Java 毕设电商项目:[https://www.bilibili.com/video/BV13f4y1r7fS](https://www.bilibili.com/video/BV13f4y1r7fS) +- 黑马程序员 Java 项目《传智健康》,超完整的企业级医疗行业项目:[https://www.bilibili.com/video/BV1Bo4y117zV](https://www.bilibili.com/video/BV1Bo4y117zV) +- 黑马程序员 Java 项目《万信金融》企业级开发实战,互联网金融行业解决方案:[https://www.bilibili.com/video/BV1Ub4y1f7rk](https://www.bilibili.com/video/BV1Ub4y1f7rk) +- 黑马程序员 Java 项目 SaaS 移动办公完整版《iHRM 人力资源管理系统》,跨行业 SaaS 办公整合性解决方案:[https://www.bilibili.com/video/BV18A411L7UX](https://www.bilibili.com/video/BV18A411L7UX) +- 黑马程序员 Java 大型分布式微服务闪聚支付项目,Java 移动支付全生态系统:[https://www.bilibili.com/video/BV17v411V79c](https://www.bilibili.com/video/BV17v411V79c) +- 黑马程序员 Java 项目《好客租房》:[https://www.bilibili.com/video/BV1sZ4y1F7PD](https://www.bilibili.com/video/BV1sZ4y1F7PD) + +### 常用类库 + +##### 工具 + +- Guava:谷歌开发的 Java 工具库(https://github.com/google/guava) +- Apache Commons:各类工具库,比如 commons-lang、commons-io、commons-collections 等(https://github.com/apache/commons-lang) +- Hutool:Java 工具集库(https://github.com/looly/hutool) +- Lombok:Java 增强库(https://github.com/projectlombok/lombok) +- Apache HttpComponents Client:HTTP 客户端库(https://github.com/apache/httpcomponents-client) +- OkHttp:适用于 JVM、Android 等平台的 Http 客户端(https://github.com/square/okhttp) +- Gson:谷歌的 JSON 处理库(https://github.com/google/gson) +- Jcommander:Java 命令行参数解析框架(https://github.com/cbeust/jcommander) +- Apache PDFBox:PDF 操作库(https://github.com/apache/pdfbox) +- EasyExcel:阿里的 Excel 处理库(https://github.com/alibaba/easyexcel) +- Apache POI:表格文件处理库(https://github.com/apache/poi) + +##### 测试 + +- JUnit:Java 测试框架(https://github.com/junit-team/junit4) +- Mockito:Java 单元测试 Mock 框架(https://github.com/mockito/mockito) +- Selenium:浏览器自动化框架(https://github.com/SeleniumHQ/selenium) +- htmlunit:Java 模拟浏览器(https://github.com/HtmlUnit/htmlunit) +- TestNG:Java 测试框架(https://github.com/cbeust/testng) +- Jacoco:Java 代码覆盖度库(https://github.com/jacoco/jacoco) + +##### 其他 + +- cglib:字节码生成库(https://github.com/cglib/cglib) +- Arthas:Java 诊断工具(https://github.com/alibaba/arthas) +- config:针对 JVM 的配置库(https://github.com/lightbend/config) +- Quasar:Java 纤程库(https://github.com/puniverse/quasar) +- drools:Java 规则引擎(https://github.com/kiegroup/drools) +- Caffeine:Java 高性能缓存库(https://github.com/ben-manes/caffeine) +- Disruptor:高性能线程间消息传递库(https://github.com/LMAX-Exchange/disruptor) +- Knife4j:Swagger 文档增强(https://doc.xiaominfo.com/) +- Thumbnailator:Java 缩略图生成库(https://github.com/coobird/thumbnailator) +- Logback:Java 日志库(https://github.com/qos-ch/logback) +- Apache Camel:消息传输集成框架(https://github.com/apache/camel) +- Quartz:定时任务调度库(https://github.com/quartz-scheduler/quartz) +- Apache Mahout:机器学习库(https://github.com/apache/mahout) +- Apache OpenNLP:NLP 工具库(https://github.com/apache/opennlp) +- RxJava:JVM 反应式编程框架(https://github.com/ReactiveX/RxJava) +- JProfiler:性能分析库(https://www.ej-technologies.com/products/jprofiler/overview.html) +- jsoup:HTML 文档解析库(https://jsoup.org/) +- webmagic:Java 爬虫框架(https://github.com/code4craft/webmagic/) + +### IDEA 插件 + +综合实用性、易用性、流行度、维护频率,精选了以下插件,简单分类为天地二品。 + +#### 精选地品插件 + +简单好用、增强功能 + +- Background Image Plus + + - 描述:给编辑器设置背景图片(小姐姐图片) + - 官网:[https://plugins.jetbrains.com/plugin/11247-background-image-plus-](https://plugins.jetbrains.com/plugin/11247-background-image-plus-) +- Chinese Language Pack + - 描述:中文支持 + - 官网:[https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----](https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----) +- Translation + - 描述:翻译插件,鼠标选中文本,点击右键即可自动翻译成多国语言。 + - 官网:[https://plugins.jetbrains.com/plugin/8579-translation/](https://plugins.jetbrains.com/plugin/8579-translation/) +- Key Promoter X + - 描述:快捷键提示插件。当你执行鼠标操作时,如果该操作可被快捷键代替,会给出提示,帮助你自然形成使用快捷键的习惯,告别死记硬背。 + - 官网:[https://plugins.jetbrains.com/plugin/9792-key-promoter-x/](https://plugins.jetbrains.com/plugin/9792-key-promoter-x/) +- Rainbow Brackets + - 描述:给括号添加彩虹色,使开发者通过颜色区分括号嵌套层级,便于阅读 + - 官网:[https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/](https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/) +- CodeGlance + - 描述:在编辑器右侧生成代码小地图,可以拖拽小地图光标快速定位代码,阅读行数很多的代码文件时非常实用。 + - 官网:[https://plugins.jetbrains.com/plugin/7275-codeglance/](https://plugins.jetbrains.com/plugin/7275-codeglance/) +- WakaTime + - 描述:代码统计和跟踪插件 + - 官网:[https://plugins.jetbrains.com/plugin/7425-wakatime](https://plugins.jetbrains.com/plugin/7425-wakatime) +- Statistic + - 描述:代码统计 + - 官网:[https://plugins.jetbrains.com/plugin/4509-statistic](https://plugins.jetbrains.com/plugin/4509-statistic) + +#### 精选天品插件 + +提高开发效率和代码质量 + +- String Manipulation + - 描述:字符串快捷处理 + - 官网:[https://plugins.jetbrains.com/plugin/2162-string-manipulation](https://plugins.jetbrains.com/plugin/2162-string-manipulation) +- Tabnine AI Code Completion + - 描述:使用 AI 去自动提示和补全代码,比 IDEA 自带的代码补全更加智能化 + - 官网:[https://plugins.jetbrains.com/plugin/12798-tabnine-ai-code-completion-js-java-python-ts-rust-go-php--more](https://plugins.jetbrains.com/plugin/12798-tabnine-ai-code-completion-js-java-python-ts-rust-go-php--more) +- GsonFormatPlus + - 描述:根据 json 生成对象 + - 官网:[https://plugins.jetbrains.com/plugin/14949-gsonformatplus](https://plugins.jetbrains.com/plugin/14949-gsonformatplus) +- JUnitGenerator V2.0 + - 描述:自动生成单元测试 + - 官网:[https://plugins.jetbrains.com/plugin/3064-junitgenerator-v2-0](https://plugins.jetbrains.com/plugin/3064-junitgenerator-v2-0) +- RestfulTool + - 描述:辅助 web 开发的工具集 + - 官网:[https://plugins.jetbrains.com/plugin/14280-restfultool](https://plugins.jetbrains.com/plugin/14280-restfultool) +- SequenceDiagram + - 描述:自动生成方法调用时序图 + - 官网:[https://plugins.jetbrains.com/plugin/8286-sequencediagram](https://plugins.jetbrains.com/plugin/8286-sequencediagram) +- CheckStyle-IDEA + - 描述:自动检查 Java 代码规范 + - 官网:[https://plugins.jetbrains.com/plugin/1065-checkstyle-idea](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea) +- Alibaba Java Coding Guidelines + - 描述:代码规范检查插件 + - 官网:[https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines](https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines) +- SonarLint + - 描述:帮助你发现和修复代码的错误和漏洞 + - 官网:[https://plugins.jetbrains.com/plugin/7973-sonarlint](https://plugins.jetbrains.com/plugin/7973-sonarlint) +- MybatisX + - 描述:MyBatis 增强插件,支持自动生成 entity、mapper、service 等常用操作的代码,优化体验 + - 官网:[https://plugins.jetbrains.com/plugin/10119-mybatisx](https://plugins.jetbrains.com/plugin/10119-mybatisx) + +#### 美化类 + +- Extra Icons + - 描述:图标美化插件,支持更多文件类型 + - 官网:[https://plugins.jetbrains.com/plugin/11058-extra-icons](https://plugins.jetbrains.com/plugin/11058-extra-icons) +- Chinese Language Pack + - 描述:中文支持 + - 官网:[https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----](https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----) +- Grep Console + - 描述:自定义设置控制台输出颜色 + - 官网:[https://plugins.jetbrains.com/idea/plugin/7125-grep-console](https://plugins.jetbrains.com/idea/plugin/7125-grep-console) +- Material Theme UI + - 描述:美观的主题 + - 官网:[https://plugins.jetbrains.com/plugin/8006-material-theme-ui](https://plugins.jetbrains.com/plugin/8006-material-theme-ui) +- Nyan Progress Bar + - 描述:进度条美化 + - 官网:[https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar](https://plugins.jetbrains.com/plugin/8575-nyan-progress-bar) +- activate-power-mode + - 描述:打字特效 + - 官网:[https://plugins.jetbrains.com/plugin/8330-activate-power-mode](https://plugins.jetbrains.com/plugin/8330-activate-power-mode) +- Power Mode II + - 描述:打字特效插件升级版 + - 官网:[https://plugins.jetbrains.com/plugin/8251-power-mode-ii](https://plugins.jetbrains.com/plugin/8251-power-mode-ii) +- Rainbow Brackets + - 描述:给括号添加彩虹色,使开发者通过颜色区分括号嵌套层级,便于阅读 + - 官网:[https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/](https://plugins.jetbrains.com/plugin/10080-rainbow-brackets/) +- Background Image Plus + + - 描述:给编辑器设置背景图片 + - 官网:[https://plugins.jetbrains.com/plugin/11247-background-image-plus-](https://plugins.jetbrains.com/plugin/11247-background-image-plus-) + +#### 代码生成类 + +- Codota AI Autocomplete for Java and JavaScript + - 描述:使用 AI 去自动提示和补全代码,比 IDEA 自带的代码补全更加智能化 + - 官网:[https://plugins.jetbrains.com/plugin/7638-codota-ai-autocomplete-for-java-and-javascript](https://plugins.jetbrains.com/plugin/7638-codota-ai-autocomplete-for-java-and-javascript) +- Tabnine AI Code Completion + - 描述:使用 AI 来自动提示和补全代码,比 IDEA 自带的代码补全更加智能化 + - 官网:[https://plugins.jetbrains.com/plugin/12798-tabnine-ai-code-completion-js-java-python-ts-rust-go-php--more](https://plugins.jetbrains.com/plugin/12798-tabnine-ai-code-completion-js-java-python-ts-rust-go-php--more) +- UUID Generator + - 描述:生成随机的 UUID + - 官网:[https://plugins.jetbrains.com/plugin/8320-uuid-generator](https://plugins.jetbrains.com/plugin/8320-uuid-generator) +- Randomness + - 描述:生成随机值 + - 官网:[https://plugins.jetbrains.com/plugin/9836-randomness](https://plugins.jetbrains.com/plugin/9836-randomness) +- .ignore + - 描述:生成不同语言的版本控制忽略文件 + - 官网:[https://plugins.jetbrains.com/plugin/7495--ignore](https://plugins.jetbrains.com/plugin/7495--ignore) +- Auto filling Java call arguments + - 描述:通过快捷键自动补全函数的调用参数 + - 官网:[https://plugins.jetbrains.com/plugin/8638-auto-filling-java-call-arguments/](https://plugins.jetbrains.com/plugin/8638-auto-filling-java-call-arguments/) +- GenerateAllSetter + - 描述:快速生成调用对象 setter 方法的代码 + - 官网:[https://plugins.jetbrains.com/plugin/9360-generateallsetter](https://plugins.jetbrains.com/plugin/9360-generateallsetter) +- GenerateSerialVersionUID + - 描述:一键为实现 Serializable 接口的类生成 SerialVersionUID + - 官网:[https://plugins.jetbrains.com/plugin/185-generateserialversionuid/](https://plugins.jetbrains.com/plugin/185-generateserialversionuid/) +- GsonFormatPlus + - 描述:根据 json 生成对象 + - 官网:[https://plugins.jetbrains.com/plugin/14949-gsonformatplus](https://plugins.jetbrains.com/plugin/14949-gsonformatplus) +- Lombok + - 描述:配合 Lombok 依赖及注解使用,能够大大减少 Java 对象的代码量。IDEA 已自带,无需安装。 + - 官网:[https://plugins.jetbrains.com/plugin/6317-lombok/](https://plugins.jetbrains.com/plugin/6317-lombok/) +- Easy Code + - 描述:根据数据库表生成 Java entity、dao、mapper、service、controller 等代码 + - 官网:[https://plugins.jetbrains.com/plugin/10954-easy-code](https://plugins.jetbrains.com/plugin/10954-easy-code) +- Easy Javadoc + - 描述:快速生成 Javadoc 文档 + - 官网:[https://plugins.jetbrains.com/plugin/12977-easy-javadoc](https://plugins.jetbrains.com/plugin/12977-easy-javadoc) +- JavaDoc + - 描述:生成 Javadoc 文档 + - 官网:[https://plugins.jetbrains.com/plugin/7157-javadoc](https://plugins.jetbrains.com/plugin/7157-javadoc) +- Json2Pojo + - 描述:根据 JSON 生成 POJO,根据 POJO 生成 JSON + - 官网:[https://plugins.jetbrains.com/plugin/8533-json2pojo](https://plugins.jetbrains.com/plugin/8533-json2pojo) +- JUnitGenerator V2.0 + - 描述:自动生成单元测试 + - 官网:[https://plugins.jetbrains.com/plugin/3064-junitgenerator-v2-0](https://plugins.jetbrains.com/plugin/3064-junitgenerator-v2-0) +- Jindent - Source Code Formatter + - 描述:根据自定义模板来生成 javadoc 注释 + - 官网:[https://plugins.jetbrains.com/plugin/8309-jindent--source-code-formatter](https://plugins.jetbrains.com/plugin/8309-jindent--source-code-formatter) +- MybatisX + - 描述:MyBatis 增强插件,支持自动生成 entity、mapper、service 等常用操作的代码,优化体验 + - 官网:[https://plugins.jetbrains.com/plugin/10119-mybatisx](https://plugins.jetbrains.com/plugin/10119-mybatisx) +- MyBatisCodeHelperPro + - 描述:MyBatis 增强插件,支持自动生成 entity、mapper、service 等常用操作的代码(收费) + - 官网:[https://plugins.jetbrains.com/plugin/9837-mybatiscodehelperpro](https://plugins.jetbrains.com/plugin/9837-mybatiscodehelperpro) + +#### 功能提效类 + +##### 源码阅读 + +- Call Graph + - 描述:生成调用关系图,便于查看源码 + - 官网:[https://plugins.jetbrains.com/plugin/12304-call-graph](https://plugins.jetbrains.com/plugin/12304-call-graph) +- Jump to Line + - 描述:支持跳转到任意行进行调试 + - 官网:[https://plugins.jetbrains.com/plugin/14877-jump-to-line](https://plugins.jetbrains.com/plugin/14877-jump-to-line) +- SequenceDiagram + - 描述:自动生成方法调用时序图 + - 官网:[https://plugins.jetbrains.com/plugin/8286-sequencediagram](https://plugins.jetbrains.com/plugin/8286-sequencediagram) +- jclasslib Bytecode Viewer + - 描述:字节码查看器 + - 官网:[https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer](https://plugins.jetbrains.com/plugin/9248-jclasslib-bytecode-viewer) +- BrowseWordAtCaret + - 描述: 快速在相同单词间进行跳转 + - 官网:[https://plugins.jetbrains.com/plugin/201-browsewordatcaret](https://plugins.jetbrains.com/plugin/201-browsewordatcaret) +- CodeGlance + - 描述:在编辑器右侧生成代码小地图,可以拖拽小地图光标快速定位代码,阅读行数很多的代码文件时非常实用。 + - 官网:[https://plugins.jetbrains.com/plugin/7275-codeglance/](https://plugins.jetbrains.com/plugin/7275-codeglance/) + +##### 代码规范 + +- CheckStyle-IDEA + - 描述:自动检查 Java 代码规范 + - 官网:[https://plugins.jetbrains.com/plugin/1065-checkstyle-idea](https://plugins.jetbrains.com/plugin/1065-checkstyle-idea) +- Alibaba Java Coding Guidelines + - 描述:代码规范检查插件 + - 官网:[https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines](https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines) +- SonarLint + - 描述:帮助你发现和修复代码的错误和漏洞 + - 官网:[https://plugins.jetbrains.com/plugin/7973-sonarlint](https://plugins.jetbrains.com/plugin/7973-sonarlint) +- FindBugs-IDEA + - 描述:帮你找出代码中潜藏的 Bug + - 官网:[https://plugins.jetbrains.com/plugin/3847-findbugs-idea](https://plugins.jetbrains.com/plugin/3847-findbugs-idea) +- MetricsReloaded + - 描述:代码复杂度分析 + - 官网:[https://plugins.jetbrains.com/plugin/93?pr=idea](https://plugins.jetbrains.com/plugin/93?pr=idea) + +##### 格式处理 + +- CamelCase + - 描述:快速字符串格式转换工具,如驼峰式 + - 官网:[https://plugins.jetbrains.com/plugin/7160-camelcase](https://plugins.jetbrains.com/plugin/7160-camelcase) +- Json Parser + - 描述:验证和格式化 Json 字符串的工具 + - 官网:[https://plugins.jetbrains.com/plugin/10650-json-parser](https://plugins.jetbrains.com/plugin/10650-json-parser) +- Properties to YAML Converter + - 描述:把 Properties 文件的格式转为 YAML 格式 + - 官网:[https://plugins.jetbrains.com/plugin/8000-properties-to-yaml-converter](https://plugins.jetbrains.com/plugin/8000-properties-to-yaml-converter) +- String Manipulation + - 描述:字符串快捷处理 + - 官网:[https://plugins.jetbrains.com/plugin/2162-string-manipulation](https://plugins.jetbrains.com/plugin/2162-string-manipulation) + +##### 代码统计 + +- WakaTime + - 描述:代码统计和跟踪插件 + - 官网:[https://plugins.jetbrains.com/plugin/7425-wakatime](https://plugins.jetbrains.com/plugin/7425-wakatime) +- Statistic + - 描述:代码统计 + - 官网:[https://plugins.jetbrains.com/plugin/4509-statistic](https://plugins.jetbrains.com/plugin/4509-statistic) + +##### 代码检索 + +- OnlineSearch + - 描述:选择文本后支持不同搜索引擎进行搜索 + - 官网:[https://plugins.jetbrains.com/plugin/8298-onlinesearch/](https://plugins.jetbrains.com/plugin/8298-onlinesearch/) +- CodeSearch + - 描述:快捷地打开搜索引擎进行搜索 + - 官网:[https://plugins.jetbrains.com/plugin/12578-codesearch](https://plugins.jetbrains.com/plugin/12578-codesearch) + +##### 其他 + +- Leetcode Editor + - 描述:在 IDEA 里刷算法题 + - 官网:[https://plugins.jetbrains.com/plugin/12132-leetcode-editor](https://plugins.jetbrains.com/plugin/12132-leetcode-editor) +- File Watchers + - 描述:监听文件,当其发生变化时自动执行命令 + - 官网:[https://plugins.jetbrains.com/plugin/7177-file-watchers](https://plugins.jetbrains.com/plugin/7177-file-watchers) +- PlantUML integration + - 描述:UML 建模工具,只需简单的代码就能画出复杂的 UML 类图 + - 官网:[https://plugins.jetbrains.com/plugin/7017-plantuml-integration](https://plugins.jetbrains.com/plugin/7017-plantuml-integration) +- Bytecode Editor + - 描述:字节码编辑工具 + - 官网:[https://plugins.jetbrains.com/plugin/8461-bytecode-editor](https://plugins.jetbrains.com/plugin/8461-bytecode-editor) +- Alibaba Cloud Toolkit + - 描述:阿里云工具集 + - 官网:[https://plugins.jetbrains.com/plugin/11386-alibaba-cloud-toolkit](https://plugins.jetbrains.com/plugin/11386-alibaba-cloud-toolkit) +- Tencent Cloud Toolkit + - 描述:腾讯云工具集 + - 官网:[https://plugins.jetbrains.com/plugin/15653-tencent-cloud-toolkit](https://plugins.jetbrains.com/plugin/15653-tencent-cloud-toolkit) +- EduTools + - 描述:面向教育者,允许创建、分享和加入练习 + - 官网:[https://plugins.jetbrains.com/plugin/10081-edutools](https://plugins.jetbrains.com/plugin/10081-edutools) +- IDE Features Trainer + - 描述:IntelliJ IDEA 官方出的学习辅助插件 + - 官网:[https://plugins.jetbrains.com/plugin/8554-ide-features-trainer](https://plugins.jetbrains.com/plugin/8554-ide-features-trainer) +- JRebel Plugin + - 描述:项目热更新,提高效率(可惜要收费) + - 官网:[https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel-for-intellij](https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel-for-intellij) +- Key Promoter X + - 描述:快捷键提示插件。当你执行鼠标操作时,如果该操作可被快捷键代替,会给出提示,帮助你自然形成使用快捷键的习惯,告别死记硬背。 + - 官网:[https://plugins.jetbrains.com/plugin/9792-key-promoter-x/](https://plugins.jetbrains.com/plugin/9792-key-promoter-x/) +- Translation + - 描述:翻译插件,鼠标选中文本,点击右键即可自动翻译成多国语言。 + - 官网:[https://plugins.jetbrains.com/plugin/8579-translation/](https://plugins.jetbrains.com/plugin/8579-translation/) +- idea_seat + - 描述:自动提醒,防止你久坐不动 + - 官网:[https://github.com/s-unscrupulous/idea_seat](https://github.com/s-unscrupulous/idea_seat) +- RestfulTool + - 描述:辅助 web 开发的工具集 + - 官网:[https://plugins.jetbrains.com/plugin/14280-restfultool](https://plugins.jetbrains.com/plugin/14280-restfultool) +- Multirun + - 描述:同时启动多应用 + - 官网:[https://plugins.jetbrains.com/plugin/7248-multirun](https://plugins.jetbrains.com/plugin/7248-multirun) + +#### 扩展增强类 + +- Free Mybatis Plugin + - 描述:MyBatis 增强插件,支持 mapper => xml 的跳转、代码生成等功能 + - 官网:[https://plugins.jetbrains.com/plugin/8321-free-mybatis-plugin](https://plugins.jetbrains.com/plugin/8321-free-mybatis-plugin) +- MyBatis Log Plugin + - 描述:MyBatis SQL 提取和格式化输出 + - 官网:[https://plugins.jetbrains.com/plugin/10065-mybatis-log-plugin](https://plugins.jetbrains.com/plugin/10065-mybatis-log-plugin) +- Maven Helper + - 描述:Maven 辅助插件 + - 官网:[https://plugins.jetbrains.com/plugin/7179-maven-helper](https://plugins.jetbrains.com/plugin/7179-maven-helper) +- Gradle View + - 描述:Gradle 项目管理工具的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/7150-gradle-view](https://plugins.jetbrains.com/plugin/7150-gradle-view) +- Arthas Idea + - 描述: Arthas 命令生成插件。Arthas 是阿里开源的 Java 在线诊断工具,该插件可以自动生成 Arthas 在线 Java 代码诊断命令,不用再到官网翻文档拼命令啦! + - 官网:[https://plugins.jetbrains.com/plugin/13581-arthas-idea/](https://plugins.jetbrains.com/plugin/13581-arthas-idea/) +- GitToolBox + - 描述: Git 增强插件。在自带的 Git 功能之上,新增了查看 Git 状态、自动拉取代码、提交通知等功能。最好用的是可以查看到每一行代码的最近一次提交信息。 + - 官网:[https://plugins.jetbrains.com/plugin/7499-gittoolbox/](https://plugins.jetbrains.com/plugin/7499-gittoolbox/) +- BashSupport + - 描述:支持 Bash 脚本文件的高亮和提示等 + - 官网:[https://plugins.jetbrains.com/plugin/4230-bashsupport](https://plugins.jetbrains.com/plugin/4230-bashsupport) +- Git Flow Integration + - 描述:Git Flow 的图形界面操作 + - 官网:[https://plugins.jetbrains.com/plugin/7315-git-flow-integration](https://plugins.jetbrains.com/plugin/7315-git-flow-integration) +- Gitee + - 描述:开源中国的码云插件 + - 官网:[https://plugins.jetbrains.com/plugin/8383-gitee](https://plugins.jetbrains.com/plugin/8383-gitee) +- Drools + - 描述:规则引擎的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/16871-drools](https://plugins.jetbrains.com/plugin/16871-drools) +- EnvFile + - 描述:对多环境配置文件的支持 + - 官网:[https://plugins.jetbrains.com/plugin/7861-envfile](https://plugins.jetbrains.com/plugin/7861-envfile) +- Kubernetes + - 描述:容器管理的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/10485-kubernetes](https://plugins.jetbrains.com/plugin/10485-kubernetes) +- Vue.js + - 描述:Vue.js 前端框架的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/9442-vue-js](https://plugins.jetbrains.com/plugin/9442-vue-js) +- Scala + - 描述:Scala 语言的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/1347-scala](https://plugins.jetbrains.com/plugin/1347-scala) +- Zookeeper + - 描述:Zookeeper 中间件的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/7364-zookeeper](https://plugins.jetbrains.com/plugin/7364-zookeeper) +- Jms messenger + - 描述:对 Java 消息服务的扩展 + - 官网:[https://plugins.jetbrains.com/plugin/10949-jms-messenger](https://plugins.jetbrains.com/plugin/10949-jms-messenger) +- MapStruct Support + - 描述:对 MapStruct 对象转换的支持 + - 官网:[https://plugins.jetbrains.com/plugin/10036-mapstruct-support](https://plugins.jetbrains.com/plugin/10036-mapstruct-support) +- Big Data Tools + - 描述:提供了 HDFS 等大数据框架的工具集 + - 官网:[https://plugins.jetbrains.com/plugin/12494-big-data-tools](https://plugins.jetbrains.com/plugin/12494-big-data-tools) +- CSV + - 描述:支持 CSV 文件的高亮和提示等 + - 官网:[https://plugins.jetbrains.com/plugin/10037-csv](https://plugins.jetbrains.com/plugin/10037-csv) +- Ideolog + - 描述:识别和格式化 log 日志文件 + - 官网:[https://plugins.jetbrains.com/plugin/9746-ideolog](https://plugins.jetbrains.com/plugin/9746-ideolog) +- Toml + - 描述:支持 toml 文件的高亮和提示等 + - 官网:[https://plugins.jetbrains.com/plugin/8195-toml](https://plugins.jetbrains.com/plugin/8195-toml) +- .env files support + - 描述:支持 .env 文件的高亮和提示等 + - 官网:[https://plugins.jetbrains.com/plugin/9525--env-files-support](https://plugins.jetbrains.com/plugin/9525--env-files-support) + +### 常用软件 +##### 开发相关 + +- JetBrains IDEA:Java 集成开发环境,凭学生邮箱可申请免费使用(https://www.jetbrains.com/idea/) +- Reset Jetbrains:你懂的 +- Visual Studio Code:插件化代码编辑器(https://code.visualstudio.com/) +- Sublime Text:轻量代码编辑器(https://www.sublimetext.com/) +- Navicat:数据库管理软件(https://www.navicat.com.cn/) +- JMeter:Java 性能测试工具(https://jmeter.apache.org/) +- JVisual VM:Java 运行状态可视化工具(https://visualvm.github.io/) +- XShell:SSH 连接软件(https://www.netsarang.com/zh/xshell/) +- XFtp:FTP 连接软件(https://www.netsarang.com/zh/xftp/) +- Redis Desktop Manager:Redis 可视化管理工具(https://github.com/uglide/RedisDesktopManager) +- Postman:接口测试工具(https://www.postman.com/) +- VMware:虚拟机软件(https://www.vmware.com/) +- Chocolatey:Windows 软件包管理器(https://chocolatey.org/) +- Typora:写文档软件(https://typora.io/) + +##### 效率 + +- Ditto:强大的剪切板(https://ditto-cp.sourceforge.io/) +- uTools:插件化的效率工具(https://u.tools/) +- XMind:思维导图软件(https://www.xmind.cn/) +- Qdir:Windows 多窗口管理器(https://q-dir.en.softonic.com/) + +### 项目源码(50 套) +#### 鱼皮原创项目 + +- [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) +- SQL 数据生成器(React + Java):[https://github.com/liyupi/sql-father-frontend-public](https://github.com/liyupi/sql-father-frontend-public) +- 结构化 SQL 语句生成器:[https://github.com/liyupi/sql-generator](https://github.com/liyupi/sql-generator) +- AI 自动回复工具(Java 项目):[https://github.com/liyupi/yu-auto-reply](https://github.com/liyupi/yu-auto-reply) +- 表情包网站(Vue + Java):[https://github.com/liyupi/father](https://github.com/liyupi/father) + +#### 电商秒杀 + +- 天猫整站 J2EE:[https://how2j.cn/module/115.htm](https://how2j.cn/module/115.htm) +- 天猫整站 SSM:[https://how2j.cn/module/134.html](https://how2j.cn/module/134.html) +- 天猫整站 Springboot:[https://how2j.cn/module/156.html](https://how2j.cn/module/156.html) +- mall-learning:[https://github.com/macrozheng/mall-learningmall](https://github.com/macrozheng/mall-learningmall) (学习教程,架构、业务、技术要点全方位解析) +- SpringBoot 电商商城系统 Mall4j:[https://github.com/gz-yami/mall4j](https://github.com/gz-yami/mall4j) +- SpringBoot 完整电商系统 Mall:[https://github.com/macrozheng/mall](https://github.com/macrozheng/mall) (包括前台商城系统及后台管理系统,基于 SpringBoot+MyBatis 实现) +- newbee-mall:[https://github.com/newbee-ltd/newbee-mall](https://github.com/newbee-ltd/newbee-mall) (一套电商系统,包括 newbee-mall 商城系统及 newbee-mall-admin 商城后台管理系统,基于 Spring Boot 2.X 及相关技术栈开发) +- paascloud-master:[https://github.com/paascloud/paascloud-master](https://github.com/paascloud/paascloud-master) (基于 spring cloud + vue + oAuth2.0,前后端分离商城系统) +- mall-swarm:[https://github.com/macrozheng/mall-swarm](https://github.com/macrozheng/mall-swarm) (一套微服务商城系统,采用了 Spring Cloud Greenwich、Spring Boot 2、MyBatis、Docker、Elasticsearch 等核心技术,同时提供了基于 Vue 的管理后台方便快速搭建系统) +- onemall:[https://github.com/YunaiV/onemall](https://github.com/YunaiV/onemall) (mall 商城,基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba) +- litemall:[https://github.com/linlinjava/litemall](https://github.com/linlinjava/litemall) (又一个小商城,litemall = Spring Boot 后端 + Vue 管理员前端 + 微信小程序用户前端 + Vue 用户移动端) +- xmall:[https://github.com/Exrick/xmall](https://github.com/Exrick/xmall) (基于SOA架构的分布式电商购物商城 前后端分离 前台商城:Vue全家桶 后台管理系统) +- miaosha:[https://github.com/qiurunze123/miaosha](https://github.com/qiurunze123/miaosha) (秒杀系统设计与实现) +- SecKill:[https://github.com/hfbin/Seckill](https://github.com/hfbin/Seckill) (基于 SpringBoot+Mybatis+Redis+RabbitMQ 秒杀系统) + +#### 博客论坛 + +- [Mblog](https://github.com/langhsu/mblog):开源 Java 博客系统 +- [halo](https://github.com/halo-dev/halo):一个优秀的开源博客发布应用 +- [forum-java](https://github.com/Qbian61/forum-java):一款用 Java(spring boot) 实现的现代化社区(论坛/问答/BBS/社交网络/博客)系统平台 +- [vhr](https://github.com/lenve/vhr):微人事是一个前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发。 +- [favorites-web](https://github.com/cloudfavorites/favorites-web):云收藏 Spring Boot 2.X 开源项目。云收藏是一个使用 Spring Boot 构建的开源网站,可以让用户在线随时随地收藏的一个网站,在网站上分类整理收藏的网站或者文章。 +- [community](https://github.com/codedrinker/community):码问,开源论坛、问答系统,现有功能提问、回复、通知、最新、最热、消除零回复功能。技术栈 Spring、Spring Boot、MyBatis、MySQL/H2、Bootstrap +- [NiterForum](https://github.com/yourkevin/NiterForum):尼特社区-NiterForum-一个论坛/社区程序。后端Springboot/MyBatis/Maven/MySQL,前端Thymeleaf/Layui。可供初学者,学习、交流使用。 +- [VBlog](https://github.com/lenve/VBlog):V部落,Vue+SpringBoot实现的多用户博客管理平台! +- [NiceFish](https://github.com/damoqiongqiu/NiceFish):SpringBoot/SpringCloud 前后端分离项目 +- [My-Blog](https://github.com/ZHENFENG13/My-Blog): My Blog 是由 SpringBoot + Mybatis + Thymeleaf 等技术实现的 Java 博客系统,页面美观、功能齐全、部署简单及完善的代码,一定会给使用者无与伦比的体验。 +- [My-Blog-layui](https://github.com/ZHENFENG13/My-Blog-layui):layui 版本的 My-Blog : A simple & beautiful blogging system implemented with spring-boot & layui & thymeleaf & mybatis My Blog 是由  SpringBoot + Layui + Mybatis + Thymeleaf 等技术实现的 Java  博客系统,页面美观、功能齐全、部署简单及完善的代码,一定会给使用者无与伦比的体验 +- [symphony](https://github.com/88250/symphony):Java 实现的现代化社区 + +#### 管理系统 + +- [Spring-Cloud-Admin](https://github.com/wxiaoqi/Spring-Cloud-Admin):Cloud-Admin 是国内首个基于 Spring Cloud 微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关 API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用 Spring Boot2 以及 Spring Cloud Gateway 相关核心组件,前端采用 vue-element-admin 组件。 +- [bootshiro](https://github.com/tomsun28/bootshiro):基于 springboot+shiro+jwt 的资源无状态认证权限管理系统后端 +- [悟空CRM](https://github.com/72crm/72crm-java):基于jfinal+vue+ElementUI的前后端分离CRM系统 +- [EL-ADMIN](https://github.com/elunez/eladmin):基于 SpringBoot 的后台管理系统 +- [pig](https://gitee.com/log4j/pig):基于 Spring Boot 2.2、 Spring Cloud Hoxton & Alibaba、 OAuth2 的 RBAC 权限管理系统。 +- [FEBS-Shiro](https://github.com/wuyouzhuguli/FEBS-Shiro):Spring Boot 2.1.3,Shiro1.4.0 & Layui 2.5.4 权限管理系统。 +- [Spring Boot-Shiro-Vue](https://github.com/Heeexy/SpringBoot-Shiro-Vue):基于Spring Boot-Shiro-Vue 的权限管理 +- [studentmanager](https://github.com/ZeroWdd/studentmanager):基于springboot+mybatis学生管理系统 +- [jshERP](https://github.com/jishenghua/jshERP):华夏ERP基于SpringBoot框架和SaaS模式,立志为中小企业提供开源好用的ERP软件,目前专注进销存+财务功能。主要模块有零售管理、采购管理、销售管理、仓库管理、财务管理、报表查询、系统管理等。支持预付款、收入支出、仓库调拨、组装拆卸、订单等特色功能。拥有库存状况、出入库统计等报表。同时对角色和权限进行了细致全面控制,精确到每个按钮和菜单。 +- [HotelSystem](https://github.com/misterchaos/HotelSystem):酒店管理系统 Java,tomcat,mysql,servlet,jsp实现,没有使用任何框架 + +#### 开发平台 + +- [open-capacity-platform](https://github.com/2014shijina2014/open-capacity-platform):微服务能力开发平台 +- [jeecg-boot](https://github.com/zhangdaiscott/jeecg-boot):JeecgBoot是一款基于BPM的低代码平台!前后端分离架构 SpringBoot 2.x,SpringCloud,Ant  Design&Vue,Mybatis-plus,Shiro,JWT,支持微服务。强大的代码生成器让前后端代码一键生成,实现低代码开发! + +#### 其他 + +- [学之思在线考试系统](https://github.com/mindskip/xzs):一款 java + vue 的前后端分离的考试系统 +- [PassJava-Platform](https://github.com/Jackson0714/PassJava-Platform):一款面试刷题的 Spring Cloud 开源系统 +- [kkFileView](https://github.com/kekingcn/kkFileView):使用spring boot打造文件文档在线预览项目 +- [dynamic-datasource](https://github.com/baomidou/dynamic-datasource-spring-boot-starter):一个基于springboot的快速集成多数据源的启动器 +- [moti-cloud](https://github.com/373675032/moti-cloud):莫提网盘,基于 SpringBoot+MyBatis+ThymeLeaf+BootStrap,适合初学者 +- [threadandjuc](https://github.com/qiurunze123/threadandjuc):three-high-import 高可用\高可靠\高性能,三高多线程导入系统(该项目意义为理论贯通) +- [proxyee-down](https://github.com/proxyee-down-org/proxyee-down):http下载工具,基于http代理,支持多连接分块下载 +- [hosp_order](https://github.com/sfturing/hosp_order):医院预约挂号系统,基于 SSM 框架 +- [趋势投资 SpringCloud](https://how2j.cn/module/170.html) +- [DiyTomcat](https://how2j.cn/module/176.html) + +## 阶段 6:Java 高级 + +### 目标 + +不满足于能做,而是通过更 **深入** 和 **广泛** 的学习,实现高质量的代码和更优秀的架构,培养解决问题的能力。 + +已经到了这个阶段,建议除了看完成的教程外,平时多自主搜索信息去学习,积少成多。比如遇到了一个不了解的名词,可以去网上搜一下,感兴趣的话再进行下一步的学习。 + +### 🌖 并发编程(21 天) + +对 Java 后端开发程序员来说,懂得如何利用有限的系统资源来提高系统的性能是很重要的,也是大厂面试考察的重点,因此并发编程(尤其是 Java 并发包的使用)这块的知识很重要。 + +把它放到高级,是因为在学并发编程前,需要有一定的编程经验、了解一定的操作系统知识。 + +#### 知识 + +- 线程和进程 +- 线程状态 +- 并行和并发 +- 同步和异步 +- Synchronized +- Volatile 关键字 +- Lock 锁 +- 死锁 +- 可重入锁 +- 线程安全 +- 线程池 +- JUC 的使用 +- AQS +- Fork Join +- CAS + +#### 学习建议 + +并发编程入门不难,依然是 **先学会使用** 基础的 Java 并发包, 再通过大量地实践和测试,了解一些原理,才能真正掌握何时使用、如何更合理地使用并发编程。而不是张口闭口多线程,上天入地高并发。 + +#### 经典面试题 + +1. volatile 关键字的作用 +2. 使用线程池有哪些好处? +3. 线程池参数如何设置? +4. 什么是线程安全问题,如何解决? +5. 介绍 synchronized 的锁升级机制 +6. CopyOnWriteArrayList 适用于哪种场景? + +#### 资源 + +- 项目实战 + - [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) 中的伙伴匹配系统、智能 BI 项目、OJ 判题系统都运用了并发编程解决实际问题,推荐学习 +- 视频 + - ⭐【尚硅谷】大厂必备技术之JUC并发编程2021最新版:[https://www.bilibili.com/video/BV1Kw411Z7dF](https://www.bilibili.com/video/BV1Kw411Z7dF) (特点是短、精、新) + - 黑马程序员全面深入学习Java并发编程:[https://www.bilibili.com/video/BV16J411h7Rd](https://www.bilibili.com/video/BV16J411h7Rd) (讲的很细、全面深入) +- 书籍 + - ⭐《Java并发编程实战》(国外的经典) + - ⭐《Java 并发编程艺术》(国人写的,理论思想内容较多,有时间建议反复看) + - ⭐《图解 Java 多线程设计模式》:[https://www.aliyundrive.com/s/MBKzUxWWBbe](https://www.aliyundrive.com/s/MBKzUxWWBbe) 提取码: 9gc7(如果已经学了 Java 并发编程,可以额外学习,这里的设计模式) +- 项目 + - ⭐ Java 并发知识点总结:[https://github.com/CL0610/Java-concurrency](https://github.com/CL0610/Java-concurrency) + +### 🌖 JVM(30 天) + +想要深入理解 Java,探秘 Java 跨平台的奥秘,一定要了解 Java 底层的虚拟机技术。 + +了解虚拟机、掌握虚拟机性能调优方法,有助于你写出更高性能、资源占用更小的优质程序。 + +在学习 JVM 的过程中,也能学到很多精妙的设计,开拓思路。 + +#### 知识 + +- JVM 内存结构 +- JVM 生命周期 +- 主流虚拟机 +- Java 代码执行流程 +- 类加载 + - 类加载器 + - 类加载过程 + - 双亲委派机制 +- 垃圾回收 + - 垃圾回收器 + - 垃圾回收策略 + - 垃圾回收算法 + - StopTheWorld +- 字节码 +- 内存分配和回收 +- JVM 性能调优 + - 性能分析方法 + - 常用工具 + - 参数设置 +- Java 探针 +- 线上故障分析 + +#### 学习建议 + +JVM 的知识略显枯燥,建议先看视频,有实操的地方一定要实操!自己多去分析。 + +第一遍不理解没有关系,可以再看书来巩固,想要真正学好,《深入理解 Java 虚拟机(第三版)》一定要读。 + +如果只是为了通过面试可以直接看更精简的视频,比如狂神的。 + +#### 经典面试题 + +1. 介绍 JVM 的内存模型? +2. JVM 内存为什么要分代? +3. 介绍一次完整的 GC 流程 +4. 介绍双亲委派模型,为什么需要它? + +#### 资源 + +- 视频 + - ⭐ 尚硅谷宋红康 - JVM 全套教程详解:[https://www.bilibili.com/video/BV1PJ411n7xZ](https://www.bilibili.com/video/BV1PJ411n7xZ) (讲得相当全面!附有实操) + - 【狂神说Java】JVM快速入门篇:[https://www.bilibili.com/video/BV1iJ411d7jS](https://www.bilibili.com/video/BV1iJ411d7jS) (讲得有点浅,但都是面试重点,时间紧的小伙伴可以直接看这个) +- 书籍 + - ⭐《深入理解 Java 虚拟机(第三版)》(有理论有实践,内容丰富,不可多得的 JVM 学习神书,就是有点废头发) +- 项目 + - ⭐ Java 虚拟机底层原理知识总结:[https://github.com/doocs/jvm](https://github.com/doocs/jvm) +- 实战 + - 阿里云 JVM 实战:[https://developer.aliyun.com/graph/java/point/64](https://developer.aliyun.com/graph/java/point/64) +- 工具 + - Arthas 开源 Java 诊断工具:[https://github.com/alibaba/arthas](https://github.com/alibaba/arthas) + +### 🌖 Java 高级知识 +> 通过阅读文章了解即可 + +#### 知识 + +- 动态代理 +- Java 探针 +- 字节码,参考:[https://github.com/fuzhengwei/itstack-demo-bytecode](https://github.com/fuzhengwei/itstack-demo-bytecode) +- UnSafe 类 +- 协程 / 纤程 + +### 架构设计 + +#### 🌖 分布式 + +- 分布式理论 + - CAP + - BASE +- 分布式缓存 + - Redis + - Memcached + - Etcd +- 一致性算法 + - Raft + - Paxos + - 一致性哈希 +- 分布式事务 + - 解决方案 + - 2PC + - 3PC + - TCC + - 本地消息表 + - MQ 事务消息 + - 最大努力通知 + - LCN 分布式事务框架:[https://github.com/codingapi/tx-lcn](https://github.com/codingapi/tx-lcn) +- 分布式 id 生成 + - Leaf 分布式 id 生成服务:[https://github.com/Meituan-Dianping/Leaf](https://github.com/Meituan-Dianping/Leaf) +- 分布式任务调度 + - XXL-JOB 调度平台:[https://www.xuxueli.com/xxl-job/](https://www.xuxueli.com/xxl-job/) + - elastic-job:[https://gitee.com/elasticjob/elastic-job](https://gitee.com/elasticjob/elastic-job) +- 分布式服务调用 + - trpc +- 分布式存储 + - HDFS + - Ceph +- 分布式数据库 + - TiDB + - OceanBase +- 分布式文件系统 + - HDFS +- 分布式协调 + - Zookeeper +- 分布式监控 + - Prometheus + - Zabbix +- 分布式消息队列 + - RabbitMQ + - Kafka + - Apache Pulsar +- 分布式日志收集 + - Elastic Stack + - Loki +- 分布式搜索引擎 + - Elasticsearch +- 分布式链路追踪 + - Apache SkyWalking +- 分布式配置中心 + - Apollo + - Nacos + +#### 🌗 高可用 + +- 限流 +- 降级熔断 +- 冷备 +- 双机热备 +- 同城双活 +- 异地双活 +- 异地多活 +- 容灾备份 + +#### 🌗 高并发 + +- 数据库 + - 分库分表 + - MyCat 中间件 + - Apache ShardingSphere 中间件 + - 读写分离 +- 缓存 + - 缓存雪崩 + - 缓存击穿 + - 缓存穿透 +- 负载均衡 + - 负载均衡算法 + - 软硬件负载均衡(2、3、4、7 层) + +#### 🌘 服务网格 + +服务网格用来描述组成应用程序的微服务网络以及它们之间的交互。服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理,常见的需求包括服务发现、负载均衡、故障恢复、度量和监控等。 + +##### 知识 + +- Istio + - 流量管理 + - 安全性 + - 可观测性 +- Envoy(开源的边缘和服务代理) + +##### 资源 + +- 资料大全:[https://www.servicemesher.com/awesome-servicemesh/](https://www.servicemesher.com/awesome-servicemesh/) +- istio 官方文档:[https://preliminary.istio.io/latest/zh](https://preliminary.istio.io/latest/zh) +- istio 视频教程:[https://www.bilibili.com/video/BV1Lf4y1x7j8](https://www.bilibili.com/video/BV1Lf4y1x7j8) +- 在线体验 istio:[https://katacoda.com/courses/istio/](https://katacoda.com/courses/istio/) + +#### 🌘 DDD 领域驱动设计 + +将数据、业务流程抽象成容易理解的领域模型,通过用代码实现领域模型,来组成完整的业务系统。 + +##### 知识 + +- DDD 的优势 +- DDD 的适用场景 +- DDD 核心概念 + - 领域模型分类:失血、贫血、充血、涨血 + - 子域划分:核心域、通用域、支撑域 + - 限界上下文 + - 实体和值对象 + - 聚合设计 + - 领域事件 +- DDD 实践 + +##### 资源 + +- DDD 入门:[https://juejin.cn/post/7004002483601145863](https://juejin.cn/post/7004002483601145863) +- DDD 编码实践:[https://juejin.cn/post/6844903903104860174](https://juejin.cn/post/6844903903104860174) +- DDD 实践教程:[https://www.bilibili.com/video/BV1Y341167Xp](https://www.bilibili.com/video/BV1Y341167Xp) + +#### 🌘 其他 + +- Sidecar +- Serverless +- 云原生 + +#### 学习建议 + +架构设计的学习没有顶点,多看文章,思考每种设计的优缺点和适用场景,有机会的话在企业中实践即可。 + +还在学校、或者初入这行的同学切记,千万不要一味地去背诵架构设计的八股文。你可以背,但是这一块的知识只有结合具体的项目才有意义,所以要多做项目去实践设计的合理性,而不是什么设计都咔咔往系统里去怼。比如面试问到分布式事务,能结合自己项目中用分布式事务解决问题的经验去回答最好。 + +### 🌘 其他技术 + +- 热数据探测技术:京东 HotKey +- 数据库流水订阅:阿里 Canal +- 监控告警 +- 应用安全 +- 故障演练 +- 流量回放 + +## 阶段 7:Java 求职 + +### 目标 + +找到好工作 + +### 建议 + +1. 尽早做规划,可以通过大厂招聘官网的岗位描述来了解岗位的要求 +2. 雕琢一份优秀的简历,推荐阅读:[https://mp.weixin.qq.com/s/wfabzdpOPdq89faFFpZ4NA](https://mp.weixin.qq.com/s/wfabzdpOPdq89faFFpZ4NA) +3. 多读面经,坚持刷算法 +4. 多参与面试,持续复盘总结 + +### 资源 + +#### 校招岗位 + +- 阿里 Java 开发:[https://campus.alibaba.com/position.htm?refno=12699](https://campus.alibaba.com/position.htm?refno=12699) +- 腾讯后台开发:[https://join.qq.com/post_detail.html?pid=1&id=101&tid=2](https://join.qq.com/post_detail.html?pid=1&id=101&tid=2) +- 腾讯全栈开发:[https://join.qq.com/post_detail.html?pid=1&id=137&tid=2](https://join.qq.com/post_detail.html?pid=1&id=137&tid=2) +- 腾讯运营开发:[https://join.qq.com/post_detail.html?pid=1&id=105&tid=2](https://join.qq.com/post_detail.html?pid=1&id=105&tid=2) +- 美团后端开发:[https://campus.meituan.com/jobs?jobFamily=1&jobId=4005&jobType=1&pageNo=2](https://campus.meituan.com/jobs?jobFamily=1&jobId=4005&jobType=1&pageNo=2) +- 华为软件开发:[https://career.huawei.com/reccampportal/portal5/campus-recruitment-detail.html?jobId=176044](https://career.huawei.com/reccampportal/portal5/campus-recruitment-detail.html?jobId=176044) + +#### 社招岗位 + +- 阿里社招:[https://job.alibaba.com/zhaopin/positionList.htm](https://job.alibaba.com/zhaopin/positionList.htm) +- 腾讯社招:[https://careers.tencent.com/search.html](https://careers.tencent.com/search.html) + +#### 实习 + +- 实习僧:[https://www.shixiseng.com/](https://www.shixiseng.com/) + +#### 鱼皮经历 + +- 从 0 开始的编程学习进大厂经历 + - ⭐ 我学计算机的四年,共勉:[https://mp.weixin.qq.com/s/Nc7Ee2UyrPg6hGseQUCzeg](https://mp.weixin.qq.com/s/Nc7Ee2UyrPg6hGseQUCzeg) +- 实习经历 + - ⭐ 我的第一份实习:[https://mp.weixin.qq.com/s/SwGiRzyTkCOOCUXfXPR1Pw](https://mp.weixin.qq.com/s/SwGiRzyTkCOOCUXfXPR1Pw) + - ⭐ 我的第二份实习,字节跳动:[https://mp.weixin.qq.com/s/3q-YIfuZBjPjSnamNwOraw](https://mp.weixin.qq.com/s/3q-YIfuZBjPjSnamNwOraw) + +#### 知识总结 + +- ⭐ JavaGuide:[https://snailclimb.gitee.io/javaguide/#/](https://snailclimb.gitee.io/javaguide/#/) +- ⭐ CS-Notes:[http://www.cyc2018.xyz/](http://www.cyc2018.xyz/) +- 阿里 Java 技术图谱:[https://developer.aliyun.com/graph/java](https://developer.aliyun.com/graph/java) + +#### 面经 +编程导航面经汇总:[https://yuyuanweb.feishu.cn/wiki/PLHrwcEPCiJcxXk7Ki4csRoJn2f](https://yuyuanweb.feishu.cn/wiki/PLHrwcEPCiJcxXk7Ki4csRoJn2f) + +#### 面试题解 +编程导航精选面试题汇总:[https://yuyuanweb.feishu.cn/wiki/CmFywXs0Oi0MS9kU3yocJugFn2e](https://yuyuanweb.feishu.cn/wiki/CmFywXs0Oi0MS9kU3yocJugFn2e) + +#### 视频 + +- ⭐ 尚硅谷 2021 逆袭版 Java 面试题第三季:[https://www.bilibili.com/video/BV1Hy4y1B78T](https://www.bilibili.com/video/BV1Hy4y1B78T) +- ⭐ 阿里大佬透彻讲解 Java 面试 500 道必考题:[https://www.bilibili.com/video/BV1yU4y1J7Bb](https://www.bilibili.com/video/BV1yU4y1J7Bb) + +## 阶段 8:持续学习 + +### 目标 + +持续追求技术的深度和广度,培养自己的 **核心竞争力** 和 **不可替代性** ,学无止境! + +### 学习建议 + +自主学习,自主搜索教程,多看书,多阅读技术博客,多实践。 + +### 学习方向 + +#### 框架源码 + +- Spring +- SpringBoot +- SpringMVC +- MyBatis +- Netty +- Dubbo +- SpringCloud + +#### 计算机原理 + +- 《算法导论》:[https://www.bilibili.com/video/av48922404](https://www.bilibili.com/video/av48922404) +- 《现代操作系统》:[https://www.bilibili.com/video/av9555596](https://www.bilibili.com/video/av9555596) +- 《深入理解计算机系统》:[https://www.bilibili.com/video/av31289365](https://www.bilibili.com/video/av31289365) +- 《编译原理》: [https://www.bilibili.com/video/av17649289](https://www.bilibili.com/video/av17649289) +- 《计算机网络:自顶向下方法》:[https://www.bilibili.com/video/BV1JV411t7ow](https://www.bilibili.com/video/BV1JV411t7ow) +- 《计算机程序的构造和解释》:[https://www.bilibili.com/video/av8515129](https://www.bilibili.com/video/av8515129) +- 《数据库系统概论》:[https://www.bilibili.com/video/BV1G54y1d7ZK](https://www.bilibili.com/video/BV1G54y1d7ZK) + +#### 数据库 / 中间件 / 分布式 + +- 数据库 + - MySQL + - PostgreSQL +- 缓存 + - Redis +- 队列 + - Apache Kafka + - Apache Pulsar +- 搜索引擎 + - Elastic Stack + - Elasticsearch + - logstash + - kibana + - beats +- 容器 + - Docker + - K8S + +#### 解决方案 + +- 广告系统 +- 电商系统 +- 搜索系统 +- 支付转账 +- 游戏后台 +- 即时通讯 +- 社交系统 +- CMS 系统 +- ERP 系统 +- OA 系统 +- 代码生成 +- 权限管理 +- 秒杀活动 + +#### 架构设计 + +同阶段 6 架构设计部分 + +#### 大数据 + +- 5V 特点 +- Hadoop +- HDFS +- MapReduce +- Spark +- Flink +- Storm +- Hive +- HBase +- Druid +- Kylin +- Pig +- Mahout + +#### 前沿技术 + +- 云原生:[https://www.jianshu.com/p/a37baa7c3eff](https://www.jianshu.com/p/a37baa7c3eff) + - Quasar Framework:[http://www.quasarchs.com/](http://www.quasarchs.com/) +- 服务网格:[https://www.redhat.com/zh/topics/microservices/what-is-a-service-mesh](https://www.redhat.com/zh/topics/microservices/what-is-a-service-mesh) + - istio:[https://github.com/istio/istio](https://github.com/istio/istio) +- GraalVM:[https://juejin.cn/post/6850418120570437646](https://juejin.cn/post/6850418120570437646) (高性能的通用虚拟机) + - 官网:[https://www.graalvm.org/](https://www.graalvm.org/) +- ZGC:[https://juejin.cn/post/6859276583656980493](https://juejin.cn/post/6859276583656980493) (新一代垃圾回收器) + - 官网:[http://openjdk.java.net/projects/zgc/](http://openjdk.java.net/projects/zgc/) + +### 自学 Java 专题资源 + +- ⭐ GitHub Java 专区:[https://github.com/topics/java](https://github.com/topics/java) +- ⭐ GitHub Java 合集:[https://github.com/akullpp/awesome-java](https://github.com/akullpp/awesome-java) +- StackOverflow:[https://stackoverflow.com/questions/tagged/java](https://stackoverflow.com/questions/tagged/java) (解决问题必备) +- ⭐ 掘金 Java 专区:[https://juejin.cn/tag/Java](https://juejin.cn/tag/Java) +- 美团技术团队:[https://tech.meituan.com/](https://tech.meituan.com/) +- 阿里技术团队:[https://102.alibaba.com/tech/list/](https://102.alibaba.com/tech/list/) +- 有赞技术团队:[https://tech.youzan.com/tag/back-end/](https://tech.youzan.com/tag/back-end/) diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/Linux\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/Linux\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..f7e66fc --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/Linux\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,399 @@ +# Linux 学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +💂 + 💻 = 👴🏽 + +建议先观看视频入门:[https://www.bilibili.com/video/BV1ev411G7VE/](https://www.bilibili.com/video/BV1ev411G7VE/) + +## 为什么学 Linux? + +相比于 Windows,Linux 免费、开源、安全、灵活、稳定、便于开发,所以更受企业青睐,甚至 **90% 以上** 的企业应用都是用 Linux 服务器部署的。 + +无论是前端、后端、算法、测试、运维等计算机相关岗位的同学,都建议学习下 Linux,大有裨益。 + +## 学习境界 + +首先,Linux 入门很简单,但想学的透彻难上加难! + +因此,在学习之前要明确目标。 + +可以 Linux 的学习分为几种境界: + +1. 明劲,就是了解 Linux 的基本概念,会敲常用命令来应对工作。对于大多数想从事开发和运维岗位的同学,学到这就足够找到工作了。 +2. 暗劲,又分为两种境界,能理解 Linux 尤其是其内核的设计思想,为小圆满;能将其思想应用到系统的架构设计中,为大圆满。暗劲境界的高手,冲击大厂、做架构师、从事底层开发,都不成问题。 +3. 化劲,可谓出神入化,不仅熟知 Linux 的使用、思想和细节,更能推陈出新,自主创造新的系统。 + +当然,一般情况下,会用就够了,想进大厂最好也学习一些内核的设计思想。找到工作后,是否要深入学习完全取决于你自己。 + +## 大纲 + +![](https://qiniuyun.code-nav.cn/img/%E9%B1%BC%E7%9A%AE%20-%20Linux%20%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF.png#id=b9adW&originHeight=20254&originWidth=2163&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +## 路线 + +### Linux 基础知识 + +- 发展历史 +- ⭐ 特点和优势 +- 应用场景 +- ⭐ 常见 Linux 系统版本(推荐 CentOS 7+) + - ⭐ CentOS + - ⭐ Ubuntu + - Debian + - Fedora +- 何为开源? + +### Linux 环境 + +- 搭建方式 + - ⭐ 虚拟机 + - ⭐ 云服务器 + - 在线工具 + - WSL + - Docker 容器 +- 远程连接 + - ⭐ SSH + - 连接工具 + - ⭐ XShell + - ⭐ MobaXterm + - SecureCRT + - Putty + +### Linux 常用命令 + +> 此处只列举命令名称,命令的具体用法可直接在手册中(https://www.linuxcool.com/)查询 + + +#### 系统信息 + +- uname 查看系统信息 +- hostname 查看主机名 +- cat /proc/cpuinfo 查看 CPU 信息 +- lsmod 查看已加载的系统模块 +- top 查看系统使用情况 +- df 查看磁盘使用情况 +- fdisk 查看磁盘分区 +- du 查看目录使用情况 +- iostat 查看 I / O 使用情况 +- free 显示系统内存情况 +- env 查看环境变量 +- uptime 查看系统运行时间、用户数、负载 + +#### 系统操作 + +- shutdown 关机 +- reboot 重启 +- mount 挂载设备 +- umount 卸载设备 + +#### 用户相关 + +- su 切换用户 +- sudo 以管理员身份执行 +- who 查看当前用户名 +- ssh 远程连接 +- logout 注销 +- useradd 创建用户 +- userdel 删除用户 +- usermod 修改用户 +- groupadd 创建用户组 +- groupdel 删除用户组 +- groupmod 修改用户组 +- passwd 修改密码 +- last 显示用户或终端的登录情况 + +#### 文件相关 + +- cd 切换目录 +- ls 查看目录列表 +- tree 打印目录树 +- mkdir 创建目录 +- rm 删除目录 +- touch 新建文件 +- cp 复制文件 +- mv 移动文件 +- ln 创建文件链接 +- find 搜索文件 +- locate 定位文件 +- whereis 查看可执行文件路径 +- which 在 PATH 指定的路径中,搜索某系统命令的位置 +- chmod 设置目录权限 +- cat / more / less 查看文件 +- tac 倒序查看文件 +- head / tail 查看文件开头 / 结尾 +- paste 合并文件 +- zip / tar / gzip 压缩文件 +- unzip / tar / gunzip 解压文件 +- grep / sed / awk 文本处理 +- vim 文本编辑 + +#### 程序相关 + +- crontab 计划任务 +- nohup 后台运行程序 +- jobs 查看系统任务 +- ps 查看进程 +- kill 杀死进程 +- rpm / yum / apt / apt-get / dpkg 软件包管理 +- service / systemctl 服务管理 + +#### 网络相关 + +- ifconfig 查看网络属性 +- netstat 查看网络状态 +- iptables 查看 iptables 规则 + +#### 其他 + +- date 显示系统时间 +- cal 显示日历 +- history 显示与操作历史 +- help 帮助 +- alias 别名 + +### 用户管理 + +- 用户 +- 用户组 +- ACL 权限管理 +- 用户切换 +- 管理员 + +### 文件管理 + +- 文件操作 + - 创建 + - 修改 + - 复制 + - 移动 + - 删除 +- 文件浏览 +- 文件搜索 +- 文件权限 +- 软硬链接 +- 压缩 / 解压 + +### 文本操作 + +- 正则表达式 +- grep +- sed +- awk + +### VIM 编辑器 + +- 基本操作 +- 模式 +- 快捷键 +- VIM 定制 +- 插件增强 + +送张 VIM 键盘图: + +![](https://qiniuyun.code-nav.cn/img/vi-vim-cheat-sheet-sch.gif#id=uRBZ7&originHeight=724&originWidth=1024&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +### 磁盘管理 + +- 使用情况查询 +- 磁盘分区 +- 挂载 + +### 驱动管理 + +- 驱动加载 +- 驱动更新 +- 网卡 +- 显卡 + +### 进程管理 + +- 启动进程 +- 杀死进程 +- 查看进程 +- 前台 / 后台任务 +- 进程监控 + +### 计划任务 + +- crond 服务 +- crontab 命令 + +### 网络管理 + +- IP +- 端口 +- 主机名 +- hosts +- 网络配置 +- 网络状态 +- 网络监控 + +### 系统管理 + +- 系统设置 + - 日期时间 + - 语言 + - 字符集 +- 系统服务 +- 环境变量 +- 日志 +- 系统关机 / 重启 +- 数据备份与恢复 + +### 服务管理 + +- 服务查看 +- 启动服务 +- 禁用服务 +- 删除服务 +- 开机自启 + +### 软件管理 + +- 软件包管理器 + - ⭐ rpm + - ⭐ yum + - apt + - apt-get + - dpkg +- 软件安装 +- 软件更新 +- 软件卸载 +- 源码安装 + +### 常用软件 / 服务搭建 + +- HTTP +- Mail +- NFS +- DNS +- FTP +- mysql +- LVS + Keepalived +- Apache +- Nginx +- Redis +- 日志服务 + +### Shell 脚本编程 + +- 默认变量 +- 运算符 +- 条件 +- 循环 +- 执行 +- 函数 + - 系统函数 + - 自定义函数 +- 规范 +- 调试方法 +- 管道 +- I/O 重定向 + +### Linux 启动过程 + +- BIOS 启动引导 +- 引导加载程序 +- 内核加载 +- 系统初始化(init) +- 运行级别 +- 启动内核 +- 执行初始化脚本 +- 用户登录 + +### Linux 内核 + +- 内核的组成 +- 目录结构 +- 版本 +- 模块 +- 编译 +- 裁剪 + +具体路线图参考: + +![](https://qiniuyun.code-nav.cn/img/%E5%86%85%E6%A0%B8%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB.jpg#id=HMWtl&originHeight=2443&originWidth=1869&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +### 第三方工具 + +- Ansible +- Webmin +- 宝塔 Linux + +## 岗位 + +- 后端开发(Java / Go / C++) +- 底层开发(C / C++) +- 运维开发 +- 大数据 +- 云计算 +- 自动化运维 +- 嵌入式开发 +- 网络工程师 + +## 学习建议 + +多动手实践,建议自己购买一台云服务器,并且在本地搭建 Linux 虚拟机环境。 + +一定要自己从 0 开始手敲命令安装软件、部署服务,熟悉整个项目的上线流程。 + +每个命令至少要跟着敲一遍,了解它们的作用,并通过自然地练习,熟悉常用的 Linux 命令。 + +记不住没关系,用文档查就行了。 + +先会用,再理解。 + +时间不多的话,可以通过面试题来了解一些 Linux 设计思想,而不是直接去深入学习内核,虽说学会了的确大有裨益,但性价比不高。 + +## 资源 + +- 视频 + - ⭐ 2021 韩顺平 一周学会Linux:https://www.bilibili.com/video/BV1Sv411r7vd(基于 CentOS 7.6 版本较新,视频长度刚刚好,也比较完整) + - 【千锋】Linux 云计算基础视频教程 650 集入门:https://www.bilibili.com/video/BV1pz4y1D73n(很全面,适合时间足够、想认真学的同学) + - 【狂神说Java】Linux 教程 - 阿里云真实环境学习:https://www.bilibili.com/video/BV187411y7hF(算是个小的入门教程吧,时间足够的话还是推荐看更完整的) + - 细说Linux - 从入门到精通:https://study.163.com/course/courseMain.htm?courseId=983014(感觉有点啰嗦,作为备用吧) + - 玩转Vim 从放弃到爱不释手:https://www.imooc.com/learn/1129(好评很多) + - 阿里云 Linux 运维学习路线:[https://edu.aliyun.com/roadmap/linux](https://edu.aliyun.com/roadmap/linux) +- 书籍 + - 《鸟哥的 Linux 私房菜 —— 基础篇》:http://cn.linux.vbird.org/linux_basic/linux_basic.php(经典) + - 《深入理解 LINUX 内核》:[https://book.douban.com/subject/1767120/](https://book.douban.com/subject/1767120/) + - 《深入Linux内核架构》:[https://book.douban.com/subject/4843567/](https://book.douban.com/subject/4843567/) + - 《Linux内核完全剖析》:[https://book.douban.com/subject/3229243/](https://book.douban.com/subject/3229243/) + - 《Linux内核设计与实现(原书第3版)》:[https://book.douban.com/subject/6097773/](https://book.douban.com/subject/6097773/) +- 文档 + - Linux  教程(菜鸟教程):[https://www.runoob.com/linux/linux-tutorial.html](https://www.runoob.com/linux/linux-tutorial.html) + - Linux 教程(W3CSchool):[https://www.w3cschool.cn/linux/](https://www.w3cschool.cn/linux/) + - Linux 工具快速教程:https://linuxtools-rst.readthedocs.io(基础、工具进阶、工具参考) +- 合集 + - Linux内核学习资料:[https://github.com/0voice/linux_kernel_wiki](https://github.com/0voice/linux_kernel_wiki) + - GitHub Linux 专区:https://github.com/topics/linux(很多好项目) + - GitHub Linux 合集:https://github.com/inputsh/awesome-linux(Linux 系列技术) + - StackOverflow:https://stackoverflow.com/questions/tagged/linux(解决问题必备) + - 掘金 Linux 专区:https://juejin.cn/tag/Linux(技术文章) +- 实战 + - ⭐ 蓝桥云课 Linux 基础入门:https://www.lanqiao.cn/courses/1(强烈推荐) + - 腾讯云动手实验室:[https://cloud.tencent.com/developer/labs](https://cloud.tencent.com/developer/labs) + - 阿里云体验实验室:[https://developer.aliyun.com/adc/labs/](https://developer.aliyun.com/adc/labs/) + - 阿里云知行实验室:[https://start.aliyun.com/](https://start.aliyun.com/) + - 华为云沙箱实验室:[https://lab.huaweicloud.com/](https://lab.huaweicloud.com/) +- 社区(国内倒的差不多了) + - Linux 中国:[https://linux.cn/](https://linux.cn/) + - 开源中国:https://www.oschina.net/(综合的开源社区) + - 红帽官网:[https://www.redhat.com/zh](https://www.redhat.com/zh) +- 工具 + - DistroTest 在线操作系统测试:[https://distrotest.net](https://distrotest.net) + - ⭐ Linux 命令搜索:[https://wangchujiang.com/linux-command](https://wangchujiang.com/linux-command) + - Linux 命令大全手册:[https://man.linuxde.net/](https://man.linuxde.net/) + - Linux 命令大全手册:[https://www.linuxcool.com/](https://www.linuxcool.com/) + - Linux 命令示例:[http://linux-commands-examples.com/](http://linux-commands-examples.com/) + - 宝塔 Linux 面板:[https://www.bt.cn/](https://www.bt.cn/) + - 在线 Shell 脚本检查:[https://www.shellcheck.net](https://www.shellcheck.net) +- 面试题 + - Linux 常见面试题整理:[https://zhuanlan.zhihu.com/p/376749877](https://zhuanlan.zhihu.com/p/376749877) + - Linux 常见面试题整理:[https://github.com/0voice/linux_kernel_wiki#-面试题](https://github.com/0voice/linux_kernel_wiki#-%E9%9D%A2%E8%AF%95%E9%A2%98) +# [ +](https://github.com/0voice/linux_kernel_wiki#-%E9%9D%A2%E8%AF%95%E9%A2%98) diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/Python\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/Python\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..05d95bd --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/Python\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,690 @@ +# Python 学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + + +在看路线前,建议大家先通过以下视频了解几个问题: + +- Python 为什么这么火? +- 为什么都在说学 Python 找不到工作?Python 真香么? +- 我要学 Python 么? +- 怎么快速学习? + +视频地址:[https://www.bilibili.com/video/BV133411C7u5/](https://www.bilibili.com/video/BV133411C7u5/) + +## Python 为什么火了? + +有很多原因,列举几点: + +1. 语法简单易学,其他语言 5 行代码才能实现的东西,Python 一行搞定!可以少写很多代码,因此不少同学拿 Python 刷算法题(但注意要理解算法本身哦)。 +2. 类库生态丰富,想做什么功能基本都有现成的代码,拿来直接用就行,无比方便! +3. 免费开源,感兴趣、有能力的同学可以自己去研究源码。 +4. 其他特性,比如跨平台、可扩展等。 +5. 作为数据科学、人工智能的首选语言,踩到了时代的风口。 + +于是乎,Python 被推向了神坛,甚至在 2021 年 10 月的编程语言排行榜中,Python 登上了第一位! + +![](https://qiniuyun.code-nav.cn/image-20211009115608685.png#id=RyD8M&originHeight=1076&originWidth=1908&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +但就是这样一门 “永远的神” 的编程语言,却在网上被口口相传说:学了 Python 找不到工作! + +哎,为啥呢? + +## 为什么 Python 不适合找工作? + +一方面是,大多数的企业,都不用 Python 来开发应用。 + +因为 Python 的运行速度太慢了,别说跟底层的 C++ 比了,Java 都能甩它几条街!而且这和语言本身的设计实现有关,所以哪怕你再出什么技术去优化它的性能,也终究有个瓶颈,世界上最好的语言 PHP 也是一样。 + +而对企业来说,**性能** 会直接影响用户体验和机器成本,尤其是在这个信息爆炸、大家都在追求性能的时代,Python 在应用开发领域的地位就很尴尬,而开发岗又正好是程序员中占比极高的岗位。 + +另一方面,虽然 Python 的应用场景很多、相关岗位也不少,又是什么 AI、数据科学的主流语言是吧,未来很美好。但是,这些前沿技术的难点并不是 Python 语言的代码本身,而是算法和思想。Python 只是一个调包、把你思想表达出来的工具而已。所以这些前沿岗位的门槛远比你入门 Python、或者听培训机构画饼时要高的多,算法岗位、大厂的产品岗真就是神仙打架,而且研究生居多。 + +## 学习目标 + +既然这样,那我还要不要学 Python 呢? + +我认为:**必须要学!** + +但是,一定要先思考自己的学习目标,目标不同,对 Python 的学习态度和投入的时间也不同。 + +如果想找开发岗位的工作,像上面说的,不建议把 Python 作为你的主语言,而是把它当做你的副武器。只需简单学学 Python 基础,就可以编写 Python 脚本来自动化办公、提高工作效率、做一些小工具了,性价比很高。 + +**如果说编程语言是工具,那 Python 是对这句话的完美诠释。** 多会用一个神器,谁不爱呢? + +如果你想找其他岗位的工作,比如运维、测试、数据分析、产品经理、大数据、爬虫、人工智能、图像处理、多媒体处理、算法研究,当然也可以,只是如果以这些岗位为目标,除了要打好 Python 基础外,更重要的是理解对应领域的思想、方法和实践,而不是只会引库调包。 + +如果你是初学编程或者出于好奇学编程,我也建议你学 Python,好玩、能学下去、能培养兴趣,这些对初学者非常重要,有了兴趣之后,再学别的语言就会如鱼得水。 + +## 学习建议 + +对于初学者和非 Python 岗位的从业者,就把 Python 当工具学,了解下基础语法和常用类库,需要写 Python 脚本时,能利用搜索引擎和文档写出(或者复制)代码就行。只要你学过其他编程语言,上手 Python 真的都很容易,3 - 7 天就能学会。 + +建议学习时多写些小例子,比如 Python 处理表格、Python 处理 PDF 等,感受 Python 类库的强大就完事儿~ + +## 学习路线大纲 + +折叠了一部分,还是老长,**思维导图获取见文末** : + +![](https://qiniuyun.code-nav.cn/img/%E9%B1%BC%E7%9A%AE%20-%20Python%20%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF.png#id=ZnuEV&originHeight=8214&originWidth=1960&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +## 学习路线 + +### 基础 + +- Python 安装 +- 开发工具 + - PyCharm + - Sublime + - VS Code +- 变量 + - 定义变量 + - 关键字 + - 命名规则 + - 基本数据类型 + - 类型转换 +- 运算符和表达式 +- 流程控制 + - 条件分支 + - 循环 +- 基本数据结构 + - 字符串 + - 列表 + - 元组 + - 集合 + - 字典 +- 函数 + - 定义 + - 参数传递 + - 作用域 + - lambda 表达式 + - 常用内置函数 +- ⭐ 面向对象编程 + - 类和对象 + - 三大特性 + - 封装 + - self + - 属性 + - 方法 + - 类方法 + - 实例方法 + - 静态方法 + - 访问控制 + - 继承 + - 单继承 + - 多继承 + - 多态 + - 方法重写 + - 运算符重载 + - 装饰器 + - 反射 +- 模块 + - 导入模块 + - 常用模块 + - 文件处理 + - 日期时间 +- 包 + - 导入包 + - 生成包 +- 异常处理 + - 捕获异常 + - try ... else ... finally 结构 + - 自定义异常 +- 文件操作 + - 文件开闭 + - 文件读写 + +### 进阶 + +- 函数进阶 + - 闭包 + - 匿名函数 + - 生成器函数 + - 装饰器 + - 高阶函数 +- 正则表达式 +- 数据库编程 + - 数据库基础 + - SQL 编写 + - 查询 + - 聚合 + - 分组 + - 关联 + - 排序 + - 事务 + - 数据库设计 + - 数据库调优 +- 并发编程 + - 同步和异步 + - 阻塞和非阻塞 + - 多线程 + - 多进程 + - 协程 + - 并发类库 +- 网络编程 + - 网络基础(七层模型、IP) + - 网络协议(TCP、UDP、HTTP、HTTPS、FTP、DNS) + - WebSocket + +### web 开发 + +- Django 框架 + - 安装与 Demo + - MVT 分层 + - 模型 + - 数据库基础 + - ORM + - 单表查询 + - 多表查询 + - 聚合查询 + - 视图 + - 模板 + - 模板语法 + - 静态资源 + - 路由 + - Django Admin 管理工具 + - 测试 + - 会话 + - 鉴权 + - 文件上传 + - 中间件 + - 高级特性 + - 分页 + - 缓存 + - 本地缓存 + - Redis 分布式缓存 + - 序列化 + - 信号 + - celery 任务调度 + - Restful API 开发 + - 概念 + - 数据序列化 + - Django Rest Framework + - 部署 + - 项目实战 +- 前端基础 + - HTML + - CSS + - JavaScript +- Flask 框架 + +### 爬虫 + +- 概念 +- 合法性 +- 数据抓取 + - 常用网络协议(http / https)概念 + - 请求 + - 请求头 + - 请求参数 + - 请求类型 + - 响应 + - 响应头 + - 响应参数 + - requests 模块 + - urllib 模块 + - 模拟登陆 + - 静态 / 动态网站抓取 + - 无头浏览器 + - selenium + - puppeteer +- 数据解析 + - 常用标签 + - BeautifulSoup + - 正则表达式 + - xpath +- 数据导出 + - 文件 + - Excel + - CSV + - 数据库 + - MongoDB + - MySQL + - 中间件 + - Redis +- Scrapy 框架 + - 核心概念 + - 命令行工具 + - Spiders + - Selectors + - Items + - Item Loaders + - 管道 + - Scrapy Shell + - Link Extractors + - 调度器 + - 分布式爬虫 + - 部署 +- 并发异步爬虫 + - aioHttp + - asyncio +- 高级 + - IP 代理 + - 验证码识别 + - APP 抓取 + - 增量式爬虫 +- 项目实战 +- 反爬虫 + - 请求头限制 + - 验证码 + - 黑白名单 + - 封禁 IP + - 数据加密 + - 数据混淆 + - 行为分析 + +### 自动化运维 + +- Linux 环境 +- Shell 脚本编写 +- 脚本管理 +- 脚本发布 +- Python 运维库 +- 常用运维工具 + +### 数据分析(数据科学) + +- 环境搭建 + - Anaconda + - Conda + - Miniconda + - Jupyter Notebook +- 常用数据结构 +- 常用类库 + - Numpy + - 数组 + - 索引 + - 切片 + - 多维数组 + - 函数 + - Pandas + - Series + - DataFrame + - 索引 + - 对齐 + - 函数 + - 统计 +- 数据处理 + - 数据清洗 + - 层次化索引 + - 数据连接 + - 数据合并 + - 分组聚合 + - 轴向旋转 +- 数据可视化 + - matplotlib + - seaborn + - pyechart + +### 算法(人工智能) + +> 鱼皮自己没怎么接触人工智能,结合网上很多大神的资料整理而成,也有一定参考意义。 + + +- 数学基础 + - 高等数学 + - 线性代数 + - 概率论 + - 统计分析 +- 机器学习 + - 特征工程 + - 模型 + - 模型分类 + - 模型评估 + - 模型训练 + - 模型调优 + - 常用算法 + - 监督与无监督学习 + - 回归(有监督) + - 线性回归 + - 决策树 + - 集成算法 + - 分类(有监督) + - 逻辑回归 + - 决策树 + - 支持向量机 + - 集成算法 + - 贝叶斯算法 + - 聚类(无监督) + - k-means + - dbscan + - 降维 + - 主成分分析 + - 线性判别分析 + - 进阶 + - GBDT 提升算法 + - lightgbm + - EM 算法 + - 隐马尔科夫模型 + - 多因子模型 + - 常用库 + - Scikit-learn + - 量化交易策略 +- 深度学习 + - 数据预处理 + - 算法 + - 神经网络 + - 卷积神经网络 + - 递归神经网络 + - 对抗生成网络 + - 序列网络模型 + - 常用算法 + - 框架和平台 + - Tenserflow2 + - Pytorch + - Keras + - Caffe +- 自然语言处理 +- 图像处理 +- 计算机视觉 + +## 常用类库 + +Python 能被广泛应用,很大程度上是因为其丰富的类库,就是他人提前写好并封装的代码。基本你要做什么东西都能找到对应的类库,直接看文档用就行了,大大提高开发效率! + +开源项目 `awesome-python-cn`(地址:https://github.com/jobbole/awesome-python-cn) 和 `awesome-python`(地址:https://github.com/vinta/awesome-python)已经帮大家整理了各方向的 Python 类库,数量非常多。鱼皮在此基础上筛选了一些相对优质的库,分享给大家。 + +### 通用 + +#### 日期处理 + +- delorean:日期处理库 +- pendulum:日期时间操作库 +- dateutil:对标准 datetime 模块的强大扩展 + +#### 终端优化 + +- IPython:功能丰富的交互式 Python 解析器 +- Jupyter Notebook:基于网页的用于交互计算的应用程序 +- Prettytable:生成美观的 ASCII 格式的表格 +- Colorama:让终端具有颜色 +- bashplotlib:在终端中进行基本绘图 +- emoji:支持在 Python 终端输出表情 +- Ipyvolume:在 Jupyter notebook 中可视化 3d 体积和字形 + +#### 文本处理 + +- FlashText:高效的文本查找替换库 +- furl:url 处理库 +- pypinyin:汉字拼音转换工具 +- simplejson:JSON 编 / 解码器 +- JMESPath:JSON 查询语法库 + +#### 其他 + +- Pipenv:Python 官方推荐的新一代包管理工具 +- threading:自带的线程库 +- multiprocessing:自带的多线程库 +- Chardet:字符编码检测器 +- logging:日志功能 +- PySnooper:Python 调试工具 +- sphinx:Python 文档生成器 +- pyttsx3:文字转语音库 +- PyWin32:提供和 windows 的交互 +- shortuuid:生成唯一 uuid 的库 +- more-itertools:支持迭代操作对象 +- cryptography:密码学工具包 + +### 网络请求 & 解析 + +- requests:HTTP 请求库 +- aiohttp:异步 HTTP 网络库 +- scrapy:分布式网页采集框架 +- pyspider:一个强大的爬虫系统 +- BeautifulSoup:从 HTML 或 XML 文件中提取数据的库 +- you-get:网页视频下载器 +- wget:网页文件下载 +- musicdl:Python 音乐下载器 + +### 文件处理 + +- openpyxl:Excel 读写库 +- tablib:处理表格数据 +- csvkit:用于转换和操作 CSV 的工具 +- XlsxWriter:操作 Excel +- python-docx:操作 office word 文档 +- PyPDF2:操作 PDF 文档 +- pdfminer:从 PDF 文档中抽取信息的工具 +- xhtml2pdf:HTML 转 PDF 工具 +- WeasyPrint:可视化网页,并支持导出为 PDF +- html2text:将 HTML 转换为 Markdown 文档 +- xmltodict:像处理 JSON 一样处理 XML +- moviepy:基于脚本的视频编辑模块 +- eyeD3:操作音频文件的工具 +- pyAudioAnalysis:音频特征提取分析 + +### 界面开发 + +- pyQT:跨平台的用户界面开发框架 +- Turtle:交互式绘画库 +- pyglet:跨平台界面及多媒体框架 +- wxPython:Python 用户界面开发工具 +- Pygame:一组用来开发游戏的 Python 模块 +- Manim:Python 数学动画引擎 +- progressbar:一个滚动条函数库 +- progress:进度条输出 +- tqdm:快速、可扩展的进度条 + +### 测试 + +- nose:测试框架 +- faker:生成假数据 +- PyAutoGUI:跨平台 GUI 自动测试模块 +- coverage:代码覆盖率测量 +- sqlmap:自动 SQL 注入和渗透测试工具 + +### Web 开发 + +- Django:Python 界最流行的 web 框架 +- Django REST framework:用于开发 web api 的框架 +- FastAPI:快速构建 web 应用程序 +- flask:Python 微型框架 +- Twisted:一个事件驱动的网络引擎 + +### 运维 + +- psutil:跨平台的进程和系统工具模块 +- supervisor:进程控制管理系统 +- sh:让 Python 支持 shell 脚本 +- dnspython:DNS 工具包 +- scapy:数据包处理库 +- pexpect:在伪终端中控制交互程序 +- paramiko:远程连接服务 +- Ansible:IT 自动化平台 +- SaltStack:基础设施自动化和管理系统 +- watchdog:管理文件系统事件的 API 和 shell 工具 + +### 图像处理 & 计算机视觉 + +- Pillow:图像处理库 +- kornia:计算机视觉库 +- Opencv:开源计算机视觉库 +- Mahotas:计算机视觉和图像处理库 +- Luminoth:计算机视觉的深度学习工具集 + +### 数据分析 & 数据科学 + +- NumPy:数值计算工具包 +- Pandas:主流的数据分析工具 +- pyecharts:基于百度 Echarts 的数据可视化库 +- Dash:快速构建 Web 数据可视化应用 +- matplotlib:Python 2D 绘图库 +- Seaborn:使用 Matplotlib 进行统计数据可视化 +- python-recsys:实现推荐系统的库 +- vaex:高速大数据处理库 +- SciPy:算法和数学工具库 +- blaze:NumPy 和 Pandas 的大数据接口 +- statsmodels:统计建模和计量经济学 + +### 人工智能 + +- Tensorflow:谷歌开源的最受欢迎的深度学习框架 +- keras:深度学习封装库,快速上手神经网络 +- Pytorch:具有张量和动态神经网络,并有强大 GPU 加速能力的深度学习框架 +- Caffe2:一个轻量、模块化、可扩展的深度学习框架 +- scikit-learn:基于 SciPy 构建的机器学习 Python 模块 +- PyMC:马尔科夫链蒙特卡洛采样工具 +- mmdetection:深度学习目标检测工具箱 +- imbalanced-learn:不平衡学习工具包 +- XGBoost:分布式梯度增强库 +- Gym:强化学习算法的工具包 + +### 自然语言处理 + +- NLTK:自然语言处理工具包 +- Gensim:话题建模库 +- Pattern:自然语言处理工具 +- fuzzywuzzy:用于字符串模糊匹配、令牌匹配等 +- TextBlob:为进行普通自然语言处理任务提供一致的 API +- PyFlux:时间序列处理库 +- jieba:中文分词工具 + +## 大纲 + +(大纲图) + +## 岗位 + +- 腾讯校招 Python 相关岗位:[https://join.qq.com/post.html?keyword=python](https://join.qq.com/post.html?keyword=python) +- 岗位薪资查询:OfferShow 小程序 +- 运维工程师 +- Web 开发工程师(后端、全栈为主) +- 测试工程师 +- 数据分析师 +- 产品经理 +- 算法工程师 + - 机器学习 + - 计算机视觉 + - NLP + - 多媒体处理 +- 大数据工程师 + - 大数据开发 + - 数据挖掘 +- 网络爬虫工程师 +- 技术研究员 + +## 资源 + +### 视频 + +#### 零基础 + +- ⭐ 千锋教育 700 集零基础 Python 教程:https://www.bilibili.com/video/BV1R7411F7JV(非常全面,基础、web 开发、爬虫、数据分析、AI 基础都讲了,例子也很丰富) +- ⭐ 黑马程序员600集 Python 教程:https://www.bilibili.com/video/BV1ex411x7Em(比较全面,基于 Linux 环境学习,以 Python 基础 + 面向对象为重点,还包含一部分游戏开发) +- ⭐ Python 全栈开发教程:https://www.bilibili.com/video/BV1wD4y1o7AS(很纯粹的 Python 基础教程,案例多,适合快速入门) +- 小甲鱼 -《零基础入门学习Python》最新版:https://www.bilibili.com/video/av52080698(可惜,更新到一半就没了。。) +- 【麻省理工学院-中文字幕版】Python 和计算机科学导论公开课:https://www.bilibili.com/video/BV1ty4y1x7xP(适合外语不错的同学课外看,感受国外教学氛围) +- 阿里云 python 工程师学习:https://developer.aliyun.com/graph/python(有在线编程体验) +- 鱼皮公众号【程序员鱼皮】后台回复 Python,也有一套视频课 + +#### 其他 + +- Web 开发 + - Python Django 项目实战教程:[https://www.bilibili.com/video/BV1pq4y1W7a1](https://www.bilibili.com/video/BV1pq4y1W7a1) + - Python + 微信小程序实战开发:https://www.bilibili.com/video/BV1Xy4y1s792(挺完整,后台用的 Django 框架) +- 数据结构与算法 + - Python 数据结构与算法全套 100 节:[https://www.bilibili.com/video/BV1uA411N7c5](https://www.bilibili.com/video/BV1uA411N7c5) + - 【北京大学】数据结构与算法Python版(完整版):[https://www.bilibili.com/video/BV1VC4y1x7uv](https://www.bilibili.com/video/BV1VC4y1x7uv) +- 爬虫 + - 2020 年Python爬虫全套课程(学完可做项目):[https://www.bilibili.com/video/BV1Yh411o7Sz](https://www.bilibili.com/video/BV1Yh411o7Sz) + - Python 爬虫编程基础 5 天速成:https://www.bilibili.com/video/BV12E411A7ZQ(很短的爬虫实战入门课) +- 数据分析 + - 自学数据分析课程:https://www.bilibili.com/video/BV1ZM4y1u7uF(很纯粹的数据分析 + 可视化课程,适合办公党快速上手) + - 完整数据分析课程:https://www.bilibili.com/video/BV1vV411p7D6(数据分析 + 机器学习,很全面) + - Python 数据分析入门视频合集:[https://shimowendang.com/docs/36pykCPH6XCjKJcv/read](https://shimowendang.com/docs/36pykCPH6XCjKJcv/read) +- 其他 + - 一天搞定人脸识别项目(python+opencv):[https://www.bilibili.com/video/BV1Lq4y1Z7dm](https://www.bilibili.com/video/BV1Lq4y1Z7dm) + - Python 自动化办公:https://www.bilibili.com/video/BV1uv411W7Fi(主要是处理 Excel) + +### 书籍 + +- ⭐《Python编程:从入门到实践》:[https://www.code-nav.cn/rd/?rid=cbddf0af6064484f002658102cdbba17](https://www.code-nav.cn/rd/?rid=cbddf0af6064484f002658102cdbba17) +- 《python学习手册》:[https://www.code-nav.cn/rd/?rid=79550af260643c8e0ce47ab84633e200](https://www.code-nav.cn/rd/?rid=79550af260643c8e0ce47ab84633e200) +- 《笨办法学Python3》:[https://www.code-nav.cn/rd/?rid=b00064a760643bb90cbba72836995fd5](https://www.code-nav.cn/rd/?rid=b00064a760643bb90cbba72836995fd5) +- 《Python编程快速上手》(第2版):[https://book.douban.com/subject/35387685/](https://book.douban.com/subject/35387685/) +- 《Python Cookbook 中文版》(第3版):[https://book.douban.com/subject/26381341/](https://book.douban.com/subject/26381341/) +- 《父与子的编程之旅》:[https://www.code-nav.cn/rd/?rid=8937eaa9615519680ed81c0e3165ee65](https://www.code-nav.cn/rd/?rid=8937eaa9615519680ed81c0e3165ee65) +- ⭐《Python 深度学习》[https://www.code-nav.cn/rd/?rid=2d44d6c261624dd31224ed1b5841920c](https://www.code-nav.cn/rd/?rid=2d44d6c261624dd31224ed1b5841920c) +- 《Python网络爬虫实战》第2版:[https://www.code-nav.cn/rd/?rid=b00064a7606440d40cbc2fca19192e4f](https://www.code-nav.cn/rd/?rid=b00064a7606440d40cbc2fca19192e4f) +- 《Python数据科学手册》:[https://book.douban.com/subject/27667378/](https://book.douban.com/subject/27667378/) +- 《利用Python进行数据分析》:[https://book.douban.com/subject/25779298/](https://book.douban.com/subject/25779298/) +- 《轻量级Django》:[https://www.code-nav.cn/rd/?rid=28ee4e3e60641fd60d91fd2441418491](https://www.code-nav.cn/rd/?rid=28ee4e3e60641fd60d91fd2441418491) +- ⭐ **编程导航 - 超多 Python 书籍直接免费下载** :https://www.code-nav.cn/topic/Python(选择书籍标签) +- Python Guide(英文):[https://docs.python-guide.org/](https://docs.python-guide.org/) + +### 文档 + +- ⭐ Python 入门教程(菜鸟教程):https://www.runoob.com/python3/python3-tutorial.html(可以在线写代码练习) +- Python 入门教程(W3Cschool):https://www.w3cschool.cn/python3/(支持手机阅读) +- Python 中文学习大本营:http://www.pythondoc.com/(一系列文档教程的集合) +- Python 100 天:[https://github.com/jackfrued/Python-100-Days](https://github.com/jackfrued/Python-100-Days) +- 廖雪峰 Python 入门教程:[https://www.liaoxuefeng.com/wiki/1016959663602400](https://www.liaoxuefeng.com/wiki/1016959663602400) +- 莫烦 Python 教程:https://mofanpy.com/(包括基础、数据处理、机器学习等,部分内容有视频) +- Django 官方教程:[https://docs.djangoproject.com/zh-hans/3.2/intro/tutorial01/](https://docs.djangoproject.com/zh-hans/3.2/intro/tutorial01/) +- Manim 动画引擎教程:[https://docs.manim.org.cn/shaders/](https://docs.manim.org.cn/shaders/) +- A Byte of Python:https://python.swaroopch.com/(Python 英文入门教程) +- ⭐ 谷歌 Python 代码规范:[https://google.github.io/styleguide/pyguide.html](https://google.github.io/styleguide/pyguide.html) + +### 实战 + +- ⭐ 蓝桥云课 Python 实战合集:[https://www.lanqiao.cn/courses/?fee=free&tag=Python](https://www.lanqiao.cn/courses/?fee=free&tag=Python) +- 腾讯云在线 Python 实验:[https://cloud.tencent.com/developer/labs/gallery?tagId=23](https://cloud.tencent.com/developer/labs/gallery?tagId=23) +- 阿里云 Python 入门实验:[https://developer.aliyun.com/adc/scenario/e04fe73ad95d4782aef7aecca206196e](https://developer.aliyun.com/adc/scenario/e04fe73ad95d4782aef7aecca206196e) +- 华为云沙箱实验室:[https://lab.huaweicloud.com/testList.html](https://lab.huaweicloud.com/testList.html) +- Python123:https://python123.io/index(在线编程,部分课收费) +- CheckiO 游戏学 Python:[https://py.checkio.org/](https://py.checkio.org/) +- 通过测试交互式学 Python(英文):[https://github.com/gregmalcolm/python_koans](https://github.com/gregmalcolm/python_koans) +- 交互式 Python 挑战(英文):[https://github.com/donnemartin/interactive-coding-challenges](https://github.com/donnemartin/interactive-coding-challenges) +- 通过项目学 Python(英文):[https://github.com/practical-tutorials/project-based-learning#python](https://github.com/practical-tutorials/project-based-learning#python) +- 通过示例交互式学 Python(英文):[https://github.com/jerry-git/learn-python3](https://github.com/jerry-git/learn-python3) + +### 代码 + +- 数据结构和算法 Python 实现:[https://github.com/keon/algorithms](https://github.com/keon/algorithms) +- 《剑指 Offer》算法面试题 Python 实现:[https://github.com/JushuangQiao/Python-Offer](https://github.com/JushuangQiao/Python-Offer) +- 设计模式 Python 实现:[http://www.pythontip.com/python-patterns/detail/abstract_factory](http://www.pythontip.com/python-patterns/detail/abstract_factory) +- Python Machine Learning 代码:[https://github.com/rasbt/python-machine-learning-book-3rd-edition](https://github.com/rasbt/python-machine-learning-book-3rd-edition) +- Python 小脚本:[https://github.com/RealHacker/python-gems](https://github.com/RealHacker/python-gems) + +### 合集 + +- ⭐ GitHub Python 专区:[https://github.com/topics/python](https://github.com/topics/python) +- 神经网络和深度学习相关框架:[https://github.com/ChristosChristofidis/awesome-deep-learning](https://github.com/ChristosChristofidis/awesome-deep-learning) +- 机器学习相关库:[https://github.com/josephmisiti/awesome-machine-learning#python](https://github.com/josephmisiti/awesome-machine-learning#python) +- 开源 Python 应用程序大全:[https://github.com/mahmoud/awesome-python-applications](https://github.com/mahmoud/awesome-python-applications) +- Python 类库大全:[https://github.com/vinta/awesome-python](https://github.com/vinta/awesome-python) +- Python 类库大全(中文版):[https://github.com/jobbole/awesome-python-cn](https://github.com/jobbole/awesome-python-cn) +- Python 异步大全:[https://github.com/timofurrer/awesome-asyncio](https://github.com/timofurrer/awesome-asyncio) +- jupyter 相关:[https://github.com/markusschanta/awesome-jupyter](https://github.com/markusschanta/awesome-jupyter) +- Python 书单:[https://github.com/Junnplus/awesome-python-books](https://github.com/Junnplus/awesome-python-books) +- Python 书单(中文版):[https://github.com/jobbole/awesome-python-books](https://github.com/jobbole/awesome-python-books) +- StackOverflow Python 专区:https://stackoverflow.com/questions/tagged/python(解决问题必备) +- ⭐ 掘金 Python 专区:https://juejin.cn/tag/Python(看技术文章) + +### 社区 + +- ⭐ PythonTab:https://www.pythontab.com/(中文 Python 开发者社区) +- Learnku Python 技术论坛:[https://learnku.com/python](https://learnku.com/python) +- 开源中国:https://www.oschina.net/(综合的开源社区) + +### 工具 + +- ⭐ Python 在线编程(菜鸟教程):[https://c.runoob.com/compile/6/](https://c.runoob.com/compile/6/) +- 腾讯云 Python 在线手册:[https://cloud.tencent.com/developer/devdocs](https://cloud.tencent.com/developer/devdocs) +- Python 在线手册汇总:[https://docs.pythontab.com/](https://docs.pythontab.com/) + +### 面试题 + +- Python 面试题整理:[https://github.com/taizilongxu/interview_python](https://github.com/taizilongxu/interview_python)(高星) +- Python 面试题整理:[https://github.com/kenwoodjw/python_interview_question](https://github.com/kenwoodjw/python_interview_question) +- 机器学习面试题:[https://geektutu.com/post/qa-ml.html](https://geektutu.com/post/qa-ml.html) + +### 其他 + +- ⭐ Python 常见问题:https://docs.python.org/zh-cn/3/faq/general.html(官方提供的 ) +- GitHub Python 趋势:[https://github.com/trending/python](https://github.com/trending/python) +- Python 模块推荐:[https://pymotw.com/3/](https://pymotw.com/3/) +- Python 练习册:https://github.com/Yixiaohan/show-me-the-code(一些 Python 练习题目) diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/README.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/README.md" new file mode 100644 index 0000000..467dc7f --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/README.md" @@ -0,0 +1,31 @@ +# 免费学习路线 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +[Java 学习路线 by 程序员鱼皮](Java学习路线%20by%20程序员鱼皮.md) + +[前端学习路线 by 程序员鱼皮](前端学习路线%20by%20程序员鱼皮.md) + +[C++ 学习路线 by 程序员鱼皮](C++学习路线%20by%20程序员鱼皮.md) + +[Python 学习路线 by 程序员鱼皮](Python学习路线%20by%20程序员鱼皮.md) + +[SQL 免费实战自学网站 by 程序员鱼皮](SQL免费实战自学网站%20by%20程序员鱼皮.md) + +[计算机基础学习路线 by 程序员鱼皮](计算机基础学习路线%20by%20程序员鱼皮.md) + +[数据结构和算法学习路线 by 程序员鱼皮](数据结构和算法学习路线%20by%20程序员鱼皮.md) + +[Git & GitHub 学习路线 by 程序员鱼皮](Git&GitHub学习路线%20by%20程序员鱼皮.md) + +[Linux 学习路线 by 程序员鱼皮](Linux学习路线%20by%20程序员鱼皮.md) + +[设计模式学习路线 by 程序员鱼皮](设计模式学习路线%20by%20程序员鱼皮.md) + + + + + diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/SQL\345\205\215\350\264\271\345\256\236\346\210\230\350\207\252\345\255\246\347\275\221\347\253\231 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/SQL\345\205\215\350\264\271\345\256\236\346\210\230\350\207\252\345\255\246\347\275\221\347\253\231 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..6deef53 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/SQL\345\205\215\350\264\271\345\256\236\346\210\230\350\207\252\345\255\246\347\275\221\347\253\231 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,93 @@ +# SQL 免费实战自学网站 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +大家好,我是鱼皮。 + +相信很多学编程的同学都学习过 SQL 吧?SQL 作为数据库查询语言,实在是太重要了,可以说是程序员、产品经理、数据分析同学的必备技能。 + +为了帮助大家自学 SQL,这段时间,我一个人做了个 **免费** 的 **闯关式** SQL 自学网,并且决定把代码 **完全开源** 给大家学习! + +如果你还不知道什么是 SQL,那么相信这个网站可以帮助你轻松入门;如果你已经学过了 SQL,那么不妨来挑战一下,看看自己的 SQL 水平是否过关。 + +![](https://pic.yupi.icu/5563/202311051244948.png)某 B 友的评价 + +项目演示视频:https://www.bilibili.com/video/BV1pV4y1i7LW(推荐先看这个) + +> 开源地址:https://github.com/liyupi/sql-mother + +## 项目介绍 + +这个 SQL 自学网的名称为 `SQL 之母` ,寓意是像妈妈一样贴心地带你入门 SQL~ + +> 了解我的朋友应该知道,我曾经做了个 SQL 代码生成器叫 `SQL 之父` ,寓意是 “生 SQL” 的 + +![](https://pic.yupi.icu/5563/202311051244134.png) + +我个人认为,比起看教程学 SQL,**实战闯关练习** 的方式更容易带大家入门,所以给系统设计了 **一系列关卡**(总共 30 多关,都是我自己做的)。 + +怎么使用网站来自学呢?步骤如下: + +1)在主页左侧,是关卡的教程题目区域,包括了知识讲解、示例和题目,请先完整阅读 + +2)然后呢,在右上角的做题区域,编写代码并提交,尝试返回题目中要求的数据 + +3)如果觉得题目太难了,可以使用右下角助手区域的查看提示、查看建表语句功能来帮助你答题,甚至你也可以直接查看答案 + +4)如果你写的 SQL 语句和预期的结果一致,那么就可以进入下一关啦 + +也可以直接看下面这张图: + +![](https://pic.yupi.icu/5563/202311051244196.png) + +> SQL 之母使用教程 + +除了按照顺序过关外,大家还可以进入关卡页面自由选择关卡、自由学习,不用担心卡在一道题目上过不去、也可以不做自己觉得简单的题目。 + +![](https://pic.yupi.icu/5563/202311051244023.png) + +> 选择关卡 + +在关卡页面,我还提供了几个自定义关卡。毕竟时间和想象力有限,剧情可能比较水,大家别介意: + +![](https://pic.yupi.icu/5563/202311051244968.png) + +> 自定义关卡 + +除了闯关外,我还提供了一个 SQL 广场功能,可以在小小的编辑器里随意输入 SQL 语句来练习~ + +![](https://pic.yupi.icu/5563/202311051244889.png) + +> SQL 练习广场 + +## 项目开源 + +大家可能会好奇这个网站是怎么实现的?其实很简单,我把代码完全开源了,大家可以自行阅读,源码之前没有秘密!当然,拿去学习练手、或者做毕设也是 OK 的~ + +开源地址:https://github.com/liyupi/sql-mother + +很关键的一点是,这个项目 **没有后端** !甚至没有用到数据库!是纯前端实现的项目! + +有同学要问了:为什么不用后端呢? + +鱼皮:当然是为了减少被攻击的风险啊!!! + +![](https://pic.yupi.icu/5563/202311051244977.png) + +虽然项目是纯前端实现,而且我自己是主后端开发的,都觉得这个项目不难。 + +首先框架用的是 Vue3,然后站在巨人的肩膀上,核心的 SQL 执行部分使用了 `sql.js` 开源库,通过 webassembly 实现了浏览器环境内 SQL 的执行。 + +这个项目主要的麻烦之处在于关卡的设计,相当于梳理并编写了一套 SQL 的教程,很花时间。 + +更多的项目信息我都写在开源文档里了,希望项目代码能给大家一些启发。我还写了一些项目贡献指南和扩展思路,希望能让更多同学有机会参与进来成为贡献者,一起让这个项目更好。 + +![](https://pic.yupi.icu/5563/202311051244891.png) + +> 开源文档 + +最后,希望这个网站能帮助大家顺利入门 SQL,欢迎大家体验并且在评论区打出你通关的时间、或者是倒在第几关了,便于我们去改良网站。 + +制作不易,也希望朋友们可以点赞支持下,谢谢大家~ diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/\345\211\215\347\253\257\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/\345\211\215\347\253\257\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..5ea82d2 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/\345\211\215\347\253\257\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,999 @@ +# 前端学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + + +💂 + 💻 = 👴🏽 + +建议先观看视频导读:[https://www.bilibili.com/video/BV1nh411e7oG/](https://www.bilibili.com/video/BV1nh411e7oG/) + +## 路线特点 + +1. 一份全面的前端知识点大梳理和汇总 +2. 分阶段学习,每个阶段给出学习目标 +3. 使用符号对知识点的重要程度做了区分,按需学习 +4. 知识点附有描述和资源链接 +5. 提供一份清晰的个人顺序学习路线方法 +6. 提供大量优质学习资源 + +## 符号表 + +可根据知识点前的符号按需选学,并获取知识点描述和学习资源。 + +- ⭐️ 必学(追求速成) +- ✅ 建议学(重要知识) +- ❗ 面试重点 +- ❌ 一般没必要学习 +- 💬 描述 +- 📚 资源 +- 🎯 目标 + +## 大纲 + +1. 前言 - 学编程需要的特质 +2. 前端学习七阶段 + 1. 前端入门 + 2. 巩固基础 + 3. 前端工程化 + 4. 前端优化 + 5. 前端生态 + 6. 前端求职 + 7. 前端未来 +3. 我的前端学习路线 +4. 尾声 - 持续学习 + +## 前言 - 学编程需要的特质 + +相信自己有能力,那么你就真的会有! + +- 兴趣 +- 坚持 +- 付出 +- 心态 + +## 一、前端入门 + +- 💬 描述:学习前端基础三件套,建议从实战开始,边学边练,培养兴趣,快速入门。 +- 📚 资源 + - freeCodecamp 在线编程:[https://www.freecodecamp.org/](https://www.freecodecamp.org/) + - 阿里云前端实战学习:[https://edu.aliyun.com/roadmap/frontend](https://edu.aliyun.com/roadmap/frontend) + - W3Cschool 编程入门实战:[https://www.w3cschool.cn/codecamp/](https://www.w3cschool.cn/codecamp/) + - pink老师前端入门教程:[https://www.bilibili.com/video/BV14J4114768](https://www.bilibili.com/video/BV14J4114768) +- 🎯 目标:了解和实践各语言的基础语法,并能使用开发工具来独立开发一个留言板网站。 + +### ⭐️ 开发工具 + +- 💬 描述:工欲善其事,必先利其器。 + +#### 浏览器 + +- ⭐️ Chrome +- ✅ Edge +- ✅ Firefox +- ❌ Opera +- Safari + +#### 编辑器 + +- ⭐️ VSCode +- ✅ WebStorm +- Atom +- ⭐️ Sublime Text +- HBuilder X +- 记事本 +- 在线 IDE + +#### 文档笔记 + +- ✅ Markdown 语法 +- ✅ Typora +- 在线笔记 + - 语雀 + - 腾讯文档 + - 石墨文档 + - 印象笔记 +- Mdnice + +### ⭐️ HTML + +- 💬 描述:用于定义一个网页结构的基本技术。 +- 📚 资源:[https://developer.mozilla.org/zh-CN/docs/Learn/HTML](https://developer.mozilla.org/zh-CN/docs/Learn/HTML) +- ⭐️ 基本语法 +- ⭐️ 标签 + - 分区 div + - 标题 h1 ~ h6 + - 段落 p + - 图像 img + - 列表 ul / ol + - 超链接 a + - 表单 form + - 表格 table + - 框架 iframe +- ⭐️ 属性 +- ✅ HTML5 特性 + - 语义化标签 + - 浏览器支持 + - 多媒体标签 + - Canvas 画布 + - ❌ 内联 SVG + - 本地存储 + - localStorage + - sessionStorage + - ❌ Web SQL + - Web Workers + - 应用缓存(Cache Manifest) + - 无障碍 + +### ⭐️ CSS + +- 💬 描述:层叠样式表,用于设计风格和布局。 +- 📚 资源:[https://developer.mozilla.org/zh-CN/docs/Learn/CSS](https://developer.mozilla.org/zh-CN/docs/Learn/CSS) +- ⭐️ 基本语法 +- ⭐️ 引入方式 + - 行内样式 + - 内部样式表 + - 外部样式表 +- ⭐️ 选择器 + - 通用选择器 + - 标签选择器 + - id 选择器 + - class 选择器 + - 属性选择器 + - 派生选择器 + - 后代选择器 + - 子元素选择器 + - 相邻兄弟选择器 + - 组合选择器 + - 伪选择器 + - 选择器优先级 +- ⭐️ 属性 + - 单位 + - px + - em + - rem + - vw + - vh + - 背景 + - 文本 + - 字体 + - 列表 + - 表格 +- ⭐️ 文档流 + - 标准流 + - 浮动流 + - 定位流 +- ⭐️ 内联元素 / 块状元素 +- ⭐️ 盒子模型 + - content + - padding + - border + - margin +- ⭐️ 浮动 + - 设置浮动 float + - 清除浮动 clear +- ⭐️ 定位 + - static + - absolute + - fixed + - relative + - sticky +- ⭐️ 层叠规则 +- ❗ BFC 和 IFC 机制 +- CSS3 + - ⭐️ 响应式布局 + - 媒体查询 + - Flex 布局 + - Grid 布局 + - 瀑布流 + - 动画 + - 过渡 + - 渐变 + - 背景 + - 边框 + - 圆角 + - 字体 + - 2D / 3D 转换 + +### ⭐️ JavaScript + +- 💬 描述:具有函数优先的轻量级,解释型或即时编译型的编程语言。 +- 📚 资源:[https://developer.mozilla.org/zh-CN/docs/Web/JavaScript](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript) +- ⭐️ 基本语法 +- ⭐️ 数据类型 + - 值类型 + - 字符串 String + - 数组 Number + - 布尔 Boolean + - 空值 Null + - 未定义 Undefined + - Symbol + - 引用类型 + - 对象 Object + - 数组 Array + - 函数 Function +- ✅ 数据类型转换 +- ✅ 函数 + - ⭐️ 概念 + - ⭐️ 自定义函数 + - 调用方式 + - ⭐️ 全局调用 + - 构造函数调用 + - ⭐️ 函数方法调用 + - apply + - call + - ✅❗ 闭包 +- ✅ 对象 + - 概念 + - this + - 原型链和继承 + - 常用对象 + - 数字 Number + - 字符串 String 对象 + - 日期 Date 对象 + - 数组 Array + - 布尔 Boolean + - 算数 Math + - 自定义对象 +- ✅❗ 作用域(作用域链) +- ✅ BOM API +- ⭐️ DOM API +- ⭐️ JSON +- ⭐️ Ajax +- ✅ JavaScript 执行机制 + +#### ✅ ES6+ 特性 + +- 💬 描述:新引入的 JavaScript 语法特性。 +- 📚 资源:ES6 入门教程 [https://es6.ruanyifeng.com/](https://es6.ruanyifeng.com/) +- let 和 const +- 变量解构赋值 +- 对象扩展和新增方法 +- Symbol +- Set 和 Map 数据结构 +- ⭐️❗ Promise & async / await 异步编程 +- Generator 函数异步编程 + +## 二、巩固基础 + +- 💬 描述:学习前端、计算机、软件开发相关基础知识,并复习巩固上阶段学到的前端三件套。 +- 📚 资源 + - 《JavaScript 高级程序设计》:[https://t.zsxq.com/0eKWGbTgL](https://t.zsxq.com/0eKWGbTgL) + - 《JavaScript 忍者秘籍》:[https://www.code-nav.cn/rd/?rid=28ee4e3e606b16c00e3c5b18609e3dc2](https://www.code-nav.cn/rd/?rid=28ee4e3e606b16c00e3c5b18609e3dc2) +- 🎯 目标:熟悉前端三件套语法,尤其是 JavaScript,并了解互联网、域名、浏览器、服务器等,扎实前端程序员的基本功,为下面进入实战开发做准备。 + +### 前端基础知识 + +- ✅ 互联网 +- ⭐️ 域名 +- ⭐️ DNS +- ⭐️ 服务器 +- ✅ 浏览器 + - 浏览器 DOM 事件流 / 事件委托 + - ⭐️ 浏览器加载顺序 + - ⭐️ 浏览器渲染过程 + - 浏览器事件循环 + - 浏览器同源策略 + - ❗ 跨域解决方案 + - 浏览器缓存 + - 控制台调试技巧 +- ✅ HTTP + - ❗ HTTP 请求过程 + - 常见 HTTP 协议 + - HTTP 1.0 + - ⭐️ HTTP 1.1 + - HTTP 2 + - HTTP 3 + - ⭐️ HTTP 请求类别 + - ⭐️ 常见状态码 + - 1xx 信息 + - 2xx 成功 + - 3xx 重定向 + - 4xx 客户端错误 + - 5xx 服务器错误 + - WebSocket + - ⭐️ Cookie + - Session + - ⭐️ HTTPS + +### 计算机基础 + +#### ✅ 算法和数据结构 + +- ⭐️ 时间 / 空间复杂度分析 +- 数据结构 + - 数组 + - 字符串 + - 队列 + - 栈 + - 链表 + - 集合 + - 哈希表 + - 二叉树 +- 算法 + - 排序 + - 双指针 + - 查找 + - 分治 + - 动态规划 + - 递归 + - 回溯 + - 贪心 + - 位运算 + - DFS + - BFS + - 图 + +#### ✅ 计算机网络 + +- HTTP 协议 +- 网络模型 +- UDP / TCP 协议 + +#### ✅ 操作系统 + +- 进程、线程 +- 进程 / 线程间通讯方式 +- 进程调度算法 +- 进程 / 线程状态 +- 死锁 +- 内存管理 + +### 软件开发基础 + +#### ✅ 设计模式 + +- 单例模式 +- 代理模式 +- 工厂模式 +- 装饰者模式 +- 观察者模式 +- 策略模式 +- 门面模式 + +#### ⭐️ Git 版本控制 + +- 常用命令 + +#### ✅ Linux 服务器 + +- 常用命令 + +#### ✅ 正则表达式 + +## 三、前端工程化 + +- 💬 描述:前端工程化是使用软件工程的技术和方法来进行前端的开发流程、技术、工具、经验等规范化、标准化,其主要目的为了提高开发过程中的开发效率,减少不必要的重复工作时间。 +- 📚 资源 + - 什么是前端工程化?[https://www.zhihu.com/question/433854153/answer/1713597311](https://www.zhihu.com/question/433854153/answer/1713597311) +- 🎯 目标:至少学会一门主流的前端开发框架(Vue / React),并配合脚手架、组件库、工具等从 0 开始独立搭建并开发一个完整的前端网站,可以试着仿一些知名站点。要求遵循企业开发规范,将项目代码提交到代码仓库中,并独立发布上线,供他人访问。此外,建议抓住机会参与一些团队项目,感受团队开发模式和前端工程化的优势。 + +### ⭐️ 研发流程 + +1. 技术选型 +2. 初始化 +3. 开发 +4. 本地测试 +5. 代码提交 +6. 编译、打包、构建 +7. 部署 +8. 集成测试 +9. 发布上线 +10. 监控运维 + +### ⭐️ 代码托管 + +- 💬 描述:集中存储、备份你的代码,还能和团队成员协作开发。 +- ⭐️ GitHub +- Gitee +- GitLab + +### ✅ Node.JS + +- 💬 描述:一个开源与跨平台的 JavaScript 运行时环境。 它是一个可用于几乎任何项目的流行工具! +- 📚 资源 + - Node.js 官方教程:[http://nodejs.cn/learn](http://nodejs.cn/learn) + - Node.js 入门:[https://cnodejs.org/getstart](https://cnodejs.org/getstart) + +#### ⭐️ 包管理 + +- 💬 描述:用于安装 Node.js 的扩展、工具等。 +- ⭐️ npm +- ⭐️ yarn +- ❌ bower +- ✅ npx + +#### 开发框架 + +- Express +- Koa +- Egg + +### 开发框架 + +- 💬 描述:解决特定的问题,提高_开发_效率、简化我们的代码复杂度。 + +#### ⭐️ CSS 框架 + +- ✅ BootStrap +- ⭐️ Tailwind CSS + +#### ⭐️ JavaScript 框架 + +##### ⭐️ Vue + +- Vue Router +- Vuex + +##### ⭐️ React + +- React DOM +- React Router +- Redux +- MobX +- React Hooks + +##### ❌ Angular + +- RxJS +- NgRx + +##### ✅ Svelte + +##### ✅ UmiJS + +### 封装库 + +#### ⭐️ 组件库 + +- ✅ LayUI +- ⭐️ ElementUI(Vue) +- ✅ VantUI(Vue) +- ⭐️ Ant Design(React) +- Material UI + +#### 数据可视化 + +- ✅ AntV +- Apache ECharts +- HighCharts +- D3.js + +#### 组件(插件) + +- 富文本编辑器 +- 弹窗 +- 轮播图 + +#### 工具库 + +- ✅ jQuery +- ✅ Lodash +- ✅ Axios +- 时间处理 Moment.js + +#### 动效库 + +- ✅ Animate.css +- Ant Motion + +#### 字体图标库 + +- ⭐️ IconFont +- IconPark +- Font Awesome + +### ⭐️ 脚手架 + +- 💬 描述:快速生成新项目的目录模板,提升开发效率和开发舒适性。 +- 📚 资源:[https://www.jianshu.com/p/25ce8cf2e6a7](https://www.jianshu.com/p/25ce8cf2e6a7) +- Vue CLI +- create-react-app +- ✅ Yeoman + +### ⭐️ 前端架构设计 + +- 💬 描述:一系列工具和流程的集合,旨在提升前端代码的质量,并实现高效可持续的工作流。 +- 模块化 +- 组件化 +- ✅ MVVM +- 设计原则 +- ⭐️ SPA 单页应用 +- ⭐️ 多页应用 +- ✅ 前端路由 +- PWA +- 有损服务 + +#### ✅ 服务端渲染 + +- 💬 描述:在服务端渲染 HTML 页面的模式。 +- 📚 资源:[https://www.zhihu.com/question/379563505](https://www.zhihu.com/question/379563505) +- Next.js(React) +- Nuxt.js(Vue) +- ❌ Universal(Angular) + +#### BFF + +- 💬 描述:Backend For Frontend(服务于前端的后端),就是服务器设计 API 时会考虑前端的使用,并在服务端直接进行业务逻辑的处理。 +- 📚 资源:[https://www.jianshu.com/p/eb1875c62ad3](https://www.jianshu.com/p/eb1875c62ad3) +- GraphQL + +#### ✅ 微前端 + +- 💬 描述:将前端应用分解成一些更小、更简单的能够独立开发、测试、部署的小块,从而解决庞大的一整块后端服务带来的变更与扩展方面的限制。 +- 📚 资源:[https://zhuanlan.zhihu.com/p/96464401](https://zhuanlan.zhihu.com/p/96464401) +- qiankun +- single-spa + +### CSS in JS + +- 💬 描述:用 JavaScript 来写 CSS。 +- 📚 资源:[http://www.ruanyifeng.com/blog/2017/04/css_in_js.html](http://www.ruanyifeng.com/blog/2017/04/css_in_js.html) +- 内联样式 +- 声明样式 +- 引入样式 + +#### ⭐️ CSS 模块化 + +- ⭐️ CSS Modules +- ✅ styled-components +- ✅ Styled JSX +- Emotion + +### ✅ 开发调试 + +- 💬 描述:本地开发时热更新,提升开发效率。 +- webpack-dev-server +- serve + +#### 内网穿透 + +- 💬 描述:将内网外网通过 nat 隧道打通,让内网的网站、数据让外网可以访问。 +- Ngrok +- NATAPP + +### ⭐️ CSS 预编译 + +- 💬 描述:使用新的扩展语言以增强 CSS 的能力,并通过预编译的方式将其转换为浏览器认识的 CSS 代码。 +- ⭐️ SASS +- ✅ PostCSS +- Stylus +- ❌ LESS + +### 测试 + +#### 测试分类 + +- ⭐️ UT 单元测试 +- SIT 系统集成测试 +- E2E 端到端测试 +- UAT 用户验收测试 + +#### ✅ Mock + +- 💬 描述:通过随机数据,模拟各种场景,增加单元测试的真实性。 +- Mock.js + +#### ✅ 测试框架 + +- ✅ Jest +- Enzyme +- ✅ Puppeteer(Headless Browser) +- Mocha +- Jasmine + +### ✅ 代码质量 + +#### 开发规范 + +- 💬 描述:依照规范写出的代码会更加合理。 +- 📚 资源:Airbnb 代码规范 [https://github.com/BingKui/javascript-zh](https://github.com/BingKui/javascript-zh) +- CSS Style Guide +- JavaScript Style Guide + +#### 类型校验 + +- TypeScript + +#### 代码检查 + +- ESLint +- StyleLint + +#### 代码风格 + +- 💬 描述:根据配置自动格式化代码,统一格式。 +- Prettier + +#### 提交规范 + +- 约定式提交 + +#### 提交检查 + +- 💬 描述:在提交代码时触发一些操作,比如检查代码的风格等。 +- pre-commit +- husky + +### 构建工具 + +#### 自动化构建 + +- 💬 描述:按照配置好的流程自动打包构建项目,提高团队的开发效率,降低项目的维护难度。 +- Gulp +- ✅ npm script +- Grunt + +#### 打包工具 + +- 💬 描述:将各种零散的📚 资源文件打包为可在浏览器等环境运行的代码。 +- ⭐️ Webpack +- ✅ Rollup +- ✅ Vite +- Parcel +- Snowpack + +### CI / CD + +- 💬 描述:通过在应用开发阶段引入自动化来频繁向客户交付应用。 +- GitLab CI +- ✅ Jenkins + +### 部署 + +#### ⭐️ Web 服务器 + +##### ⭐️ Nginx + +- 💬 描述:高性能的 HTTP 和反向代理 web 服务器。 +- 📚 资源:腾讯云动手实验室 [https://cloud.tencent.com/developer/labs/gallery](https://cloud.tencent.com/developer/labs/gallery) +- 反向代理 +- 解决跨域 +- 改写请求 + +##### ✅ Apache + +#### 容器 + +##### ✅ Docker + +- 💬 描述:容器是一个标准化的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境可靠快速地运行到另一个计算环境。Docker容器镜像是一个轻量的独立的可执行的软件包。包含程序运行的时候所需的一切:代码,运行时间,系统工具,系统库和设置。 +- 📚 资源:Docker 从入门到实践 [https://vuepress.mirror.docker-practice.com/](https://vuepress.mirror.docker-practice.com/) +- Dockerfile + +##### Kubernetes + +#### 部署策略 + +- 全量发布 +- 蓝绿部署 +- 滚动发布 +- 灰度发布 + +### 监控告警 + +- 前端埋点 +- 错误监控 +- 性能监控 +- 行为监控 + +## 四、前端优化 + +- 💬 描述:通过分析和优化手段,提高网站的性能和用户体验。 +- 🎯 目标:实践前端优化方法,从多个方面优化自己做过的项目,最好能将优化后的网站与原网站进行对比,得到一些数据和体验上的明显提升。 + +### ✅ 性能优化 + +#### 性能指标 + +- 💬 描述:用于衡量一个 Web 页面的性能。 +- 📚 资源:[https://juejin.cn/post/6844904153869713416](https://juejin.cn/post/6844904153869713416) +- FP(First Paint) + - 💬 描述:从开始加载到浏览器首次绘制像素到屏幕上的时间,也就是页面在屏幕上首次发生视觉变化的时间。 +- FCP(First Contentful Paint) + - 💬 描述:浏览器首次绘制来自 DOM 的内容的时间。 +- FMP(First Meaningful Paint) + - 💬 描述:页面的主要内容绘制到屏幕上的时间。 +- FSP(First Screen Paint) + - 💬 描述:页面从开始加载到首屏内容全部绘制完成的时间,用户可以看到首屏的全部内容。 +- TTI(Time to Interactive) + - 💬 描述:表示网页第一次完全达到可交互状态的时间点,浏览器已经可以持续性的响应用户的输入。 + +#### 优化手段 + +- 性能监控 + - Performance API +- 样式优化 +- JavaScript 优化 + - 防抖 + - 节流 +- 代码分割 +- 📚 资源压缩 +- 打包优化 +- 服务器优化 +- 缓存优化 + - Service Worker +- 动画性能 +- dns-prefetch +- Lazy loading +- 优化启动性能 + - 异步化 +- 渲染优化 +- 网络优化 +- 移动端性能优化 +- ✅ CDN + - 💬 描述:内容分发网络,是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。 + - 📚 资源:BootCDN [https://www.bootcdn.cn/](https://www.bootcdn.cn/) + +### 用户体验 + +- 设计系统 +- 骨架屏 + +### ✅ 兼容性 + +#### 浏览器兼容性 + +- normalize.css +- html5shiv.js +- respond.js +- Babel +- Polyfill + +#### 屏幕分辨率兼容性 + +#### 跨平台兼容性 + +### SEO + +- 💬 描述:搜索引擎优化,利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。 +- 📚 资源:百度搜索📚 资源平台 [https://ziyuan.baidu.com/cooperateresource/index](https://ziyuan.baidu.com/cooperateresource/index) +- robots.txt +- description +- keywords +- SiteMap +- HTML 标签优化 +- 站内链接建设 +- 友情链接 + +### ✅ 安全 + +- ⭐️ XSS +- CSRF +- 反爬虫 +- SQL 注入 +- DDoS + +## 五、前端生态 + +- 💬 描述:如今,前端领域的范围越来越广,出现了更多前端工程师需要了解和关注的技术。 +- 🎯 目标:能用学到的前端技术去做更多的事情,比如开发个人博客、文档网站、小程序、APP 等。 + +### ⭐️ 静态站点构建 + +#### 开发 + +- React Static + +#### 博客 + +- ✅ Gatsby.js +- ✅ Docusaurus +- Hugo +- Hexo + +#### 文档 + +- JekyII +- ⭐️ Docsify +- VuePress +- ✅ Dumi + +### ✅ 大前端 + +💬 描述:前端技术的融合更加紧密,应用的领域也更加广泛,前端领域的内容呈现多样化,除了网站外,还可以用前端技术跨平台开发 Android、iOS、小程序、虚拟现实、增强现实等。 + +#### 移动应用 + +- Hybrid +- WebView +- React Native +- Flutter + +#### 移动应用打包 + +- Weex +- Cordova +- Phonegap +- Ionic + +#### 桌面应用 + +- Electron +- NW.js +- Proton Native + +#### 小程序 + +- 原生 +- WebView + +#### 跨端开发框架 + +- ✅ uni-app +- ✅ Taro +- Flutter +- Chameleon +- Wepy +- Rax + +#### 移动端调试 + +- Chrome Dev Tools +- Android Simulator +- IOS Simulator + +### ✅ Serverless + +- 💬 描述:一种构建和管理基于微服务架构的完整流程,允许你在服务部署级别而不是服务器部署级别来管理你的应用部署,你甚至可以管理某个具体功能或端口的部署,这就能让开发者快速迭代,更快速地开发软件。 + +### ✅ 云开发 + +- 💬 描述:云端一体化的后端云服务 ,采用 Serverless 架构,免去了移动应用构建中繁琐的服务器搭建和运维。同时云开发提供的静态托管、命令行工具(CLI)、Flutter SDK 等能力降低了应用开发的门槛。使用云开发可以构建完整的小程序/小游戏、H5、Web、移动 App 等应用。 +- ✅ 腾讯云云开发 +- 阿里云云开发 + +### 低代码 + +- 💬 描述:无需编码(零代码)或通过少量代码就可以快速生成应用程序的开发平台。通过可视化进行应用程序开发的方法,使具有不同经验水平的开发人员可以通过图形化的用户界面,使用拖拽组件和模型驱动的逻辑来创建网页和移动应用程序。 +- 腾讯云低码 +- 阿里宜搭 + +## 六、前端求职 + +- 💬 描述:求职是一个漫长的过程,建议拉长战线,尽早准备。 +- 🎯 目标:找到理想的工作。 + +### 简历 + +- 老鱼简历:[https://laoyujianli.com/](https://laoyujianli.com/)(1 分钟帮你生成精美的个人简历) + +### 面试题库 + +- 编程导航精选面试题汇总:[https://yuyuanweb.feishu.cn/wiki/CmFywXs0Oi0MS9kU3yocJugFn2e](https://yuyuanweb.feishu.cn/wiki/CmFywXs0Oi0MS9kU3yocJugFn2e) +- 前端面试每日 3+1:[https://github.com/haizlin/fe-interview](https://github.com/haizlin/fe-interview) +- React 面试题目 & 题解:[https://github.com/sudheerj/reactjs-interview-questions](https://github.com/sudheerj/reactjs-interview-questions) + +### 面经 + +- 编程导航面经汇总:[https://yuyuanweb.feishu.cn/wiki/PLHrwcEPCiJcxXk7Ki4csRoJn2f](https://yuyuanweb.feishu.cn/wiki/PLHrwcEPCiJcxXk7Ki4csRoJn2f) + +## 七、前端未来 + +- 💬 描述:前端未来可能的发展趋势和热门技术。 +- 🎯 目标:关注前沿,持续进步。 +- WebAssembly +- 智能 UI +- React Server Component +- CSS Houdini + +### WebComponents + +- HTML templates(HTML模板) +- Custom elements(自定义元素) +- Shadow DOM(影子DOM) + +## 我的前端学习路线 + +虽然上面整理的学习路线知识点非常多,但是大家也别太担心,其实按照一定顺序和方法来学习,并不会很难,聊聊我的学习经历。 + +### 1. 快速入门,培养兴趣 + +刚开始学习前端时,一定要以培养兴趣、快速入门为目标。我入门前端时,由于没有基础、啥都不懂,因此选择在线实战教程网站来学习,跟着教程案例一行行把代码敲下来,实时浏览显示效果,很轻松地就把 HTML、CSS、JavaScript 的语法基础过了一遍。但是这时,我对看过的知识点没有什么印象,基本是看了就忘,当我想要自己写一个网站,也根本无从下手。 + +于是,我开始试着死记硬背代码,结果发现背了之后还是不会写。那干脆一不做二不休,直接打开编辑器和教程网站,把之前在线实战时敲过的代码复制粘贴到编辑器中,然后再修改保存,到浏览器中打开文件。这样虽然要在编辑器和浏览器中来回切换,但起码能看到自己的网页文件运行的效果了。后来,我利用浏览器开发者工具提升了自己开发网站的调试效率,敲出的代码达不到满意的效果时,就再去查,再改,再浏览,最后终于完成了一个留言板网站! + +通过这件事,我明白了一个道理,既然记不住知识,那就先别强行记忆,上手多写,忘了就去查不就好了?不要担心自己知识不够做不出来,只要你去试,都一定能实现。 + +### 2. 多看多写,巩固基础 + +在这种操作下,我虽然能使用基础三件套开发简易网站了,但做的很慢,还老出问题。于是,我开始完整地看了几本前端入门和项目实战书籍,有三件套入门的,也有响应式网站设计的,还有 JavaScript 综合讲解的,以及一套完整的视频教程,通过这些来复习巩固之前学过的知识,打好了基础,并且了解了更多实战教程上没见到的知识。 + +看书和视频的过程中,我跟着做了几个简易的网站,也是边看边做。在这之后,我发现自己渐渐地能够脱离文档来写网站了! + +### 3. 框架学习,学以致用 + +但是,总感觉开发网站时,什么都要自己写,重复的代码写一大堆,很麻烦。于是,我试着上网搜了解决这些问题的方法,发现可以用组件库减少重复编写 HTML 和 CSS 代码,于是学了 LayUI,其实和之前一样的,就是打开官网找到要用的组件,然后复制到项目中修改就行了,写的多了竟然还真记住了一些(虽然这个没必要记)。 + +界面和样式代码简化了,但是 JavaScript 写的我依旧头疼。于是我决定进入下一个阶段的学习,当时先看了本书叫《锋利的 jQuery》来学习 jQuery,学会之后使用它趁热打铁做了几个网站,发现的确能大大简化繁琐的 JavaScript DOM 操作,让我尝到了甜头,又有了继续学习前端的动力。 + +在那之后大概半年,我开始学习主流前端框架 Vue,也是跟着视频教程学,并且结合 ElementUI 组件库开发了一个响应式网站。不得不说,习惯了用原生 JavaScript 和 jQuery 开发后,再去用 Vue 开发,真的是爽飞了,小有成就感。 + +### 4. 根据需要,自主学习 + +在那之后,我就是通过不断地做项目来积累经验,既然编程知识太多学不完,那我就随需随学,逐渐拓宽自己的知识面。举个例子,我要做一个移动端 H5 页面,那就去搜 Vue 的移动端组件库,学会了 MintUI、VantUI 等;项目中要处理日期,那我就去搜日期处理库,学会了 Moment.js;项目重复文件和代码太多,我就去网上搜一些组件化、模块化的最佳实践;项目代码太大、加载太慢,我就去网上搜一些前端压缩、性能优化的方式;要把开发好的项目变成 APP,那我就去网上搜到了 Cordova 等打包工具;跟其他同学一起做项目时比较混乱、开发效率低,我就去搜了一些代码规范、前端工程化等;遇到 Bug 时,也是自己去网上搜索解决方案,并且还要看看有没有知识点是我遗漏的,我会再去弥补学习。通过不断实践、不断遇到问题和自主解决问题,我始终保持着学习的积极性,学到了越来越多前端的知识,并通过归纳总结来加深印象。 + +### 5. 渐入佳境,拓宽视野 + +在那之后,我学前端技术非常快了,像 React、TypeScript、Redux、Dva、Umi、Lerna 等等都随用随学,随学随用。此外,我不仅仅关注前端网页开发本身,还同时关注前端的生态和发展,学习了微前端、Serverless、云开发、低代码等技术,因此个人的能力提升也很大。如今在鹅厂工作中也是,面对各种不同技术栈的前端项目,我都能迎难而上,毕竟不会就学嘛! + +哦,写的渐入佳境,我都忘了,自己是一名后端工程师,还搁这儿吹牛逼呢( 所以本路线难免会有不专业的地方,请大家见谅~ + +### 6. 总结 + +总结一下,学前端的路线其实就一句话:基础三件套 => 巩固基础 => 学习框架 => 多做项目 => 按需学习 => 拓宽视野。还有一个学任何编程技术都要注意的点,全程多敲代码!多敲代码!多敲代码! + +## 尾声 - 持续学习 +### 前端职业发展的几个阶段 + +1. 作为一名合格的前端开发,首先你要能干活、能通过 Vue 之类的前端框架完成公司的需求,比如还原设计稿、开发交互、搭建项目的初始框架(架构)、开发内部的组件库(基建)等等,重点是要学会如何和后端系统进行对接(前后端联调),有时候也需要完成一些简单的服务端开发,比如使用 Node 搭建中间层 / 接入层(BFF)。 +2. 这就需要你除了学习前端基础三件套之外,还要熟练使用一个开发框架 Vue / React 以及前端工程化的一些工具 / 轮子,比如打包工具用 webpack、性能分析工具、SSR 等),可以帮助你更好地设计项目、开发项目,从而应对需求的变化、使项目更易于维护、可扩展。 +3. 如果要成为高级前端开发,要了解常用框架 / 工具的运行原理和机制。最好有一个自己擅长 / 专攻的领域,比如低代码、Web IDE、可视化、性能优化、Web Assembly 等等,并且积极参与开源项目和公开分享。 + +随着学习知识的不断丰富和深入,要学会主动到网上关注和汲取知识、了解前端的发展和新技术趋势。比如看书、掘金、InfoQ 等技术网站,或者关注某个领域的大佬、参加一些大会等。 + +### 优秀前端人的特质 + +- 深厚的功底 +- 良好的编码习惯 +- 发现问题的洞察力 +- 思维灵活,善于思考 +- 追求技术,紧跟前沿 +- 有创造力,有行动力 +- 追求用户体验 +- 时刻保持好奇 +- 全栈意识 +- 解决问题的能力强 +- 懂得合作和高效沟通 +- 重视工作,同样重视生活 +- 责任心和全局观 +- 个人的进步能带动团队的进步 + +### 学习资源 + +- 编程导航(包含以下所有资源,强烈推荐 👍):[https://www.code-nav.cn](https://www.code-nav.cn) +- freeCodecamp 在线编程:[https://learn.freecodecamp.one/](https://learn.freecodecamp.one/) +- 阿里云前端实战学习:[https://edu.aliyun.com/roadmap/frontend](https://edu.aliyun.com/roadmap/frontend) +- W3Cschool 编程入门实战:[https://www.w3cschool.cn/codecamp/](https://www.w3cschool.cn/codecamp/) +- 腾讯云动手实验室:[https://cloud.tencent.com/developer/labs/gallery](https://cloud.tencent.com/developer/labs/gallery) +- pink老师前端入门教程:[https://www.bilibili.com/video/BV14J4114768](https://www.bilibili.com/video/BV14J4114768) +- MDN 前端文档:[https://developer.mozilla.org/zh-CN](https://developer.mozilla.org/zh-CN) +- Node.js 入门:[https://cnodejs.org/getstart](https://cnodejs.org/getstart) +- 前端清单:[https://cheatsheets.devtool.tech/](https://cheatsheets.devtool.tech/) +- 前端小课:[https://lefex.github.io/](https://lefex.github.io/) +- 被删的前端游乐场:[http://www.godbasin.com/](http://www.godbasin.com/) +- 《ES6 入门教程》:[https://es6.ruanyifeng.com/](https://es6.ruanyifeng.com/) +- 谷歌 Web 开发者:[https://developers.google.com/web](https://developers.google.com/web) +- JavaScript 明星项目:[https://risingstars.js.org/2020/zh](https://risingstars.js.org/2020/zh) +- Best of JS:[https://bestofjs.org/](https://bestofjs.org/) +- Codewars:[https://www.codewars.com/?language=javascript](https://www.codewars.com/?language=javascript) +- Vue.js examples:[https://vuejsexamples.com/](https://vuejsexamples.com/) + +### 前端资讯 + +- 掘金资讯:[https://juejin.cn/news](https://juejin.cn/news) +- InfoQ:[https://www.infoq.cn/topic/Front-end](https://www.infoq.cn/topic/Front-end) +- daily.dev:[https://daily.dev/](https://daily.dev/) + +### 技术博客 + +- 掘金:[https://juejin.cn/frontend](https://juejin.cn/frontend) +- 腾讯前端 IMWEB:[http://imweb.io](http://imweb.io) +- 腾讯 Web 前端团队 Alloy Team:[http://www.alloyteam.com](http://www.alloyteam.com) +- 淘宝前端团队:[http://taobaofed.org](http://taobaofed.org) +- 百度 Web 前端研发部:[http://fex.baidu.com](http://fex.baidu.com) +- 京东凹凸实验室:[https://aotu.io](https://aotu.io) +- 360 奇舞团:[https://75team.com](https://75team.com) +- 七牛团队技术博客:[http://blog.qiniu.com](http://blog.qiniu.com) +- 有赞技术团队:[https://tech.youzan.com/tag/front-end/](https://tech.youzan.com/tag/front-end/) +- 百度 EFE Tech:[https://efe.baidu.com/](https://efe.baidu.com/) +- css-tricks:[https://css-tricks.com/archives](https://css-tricks.com/archives) +- web.dev:[https://web.dev/blog/](https://web.dev/blog/) + +### 学习要点 + +- 前期学习以培养兴趣为主,不要过于追求深层理解。 +- 前端学习不能靠死记硬背,要多敲代码、多做项目实践。 +- 不要急于求成,踏实积累才是硬道理。 diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/\346\225\260\346\215\256\347\273\223\346\236\204\345\222\214\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/\346\225\260\346\215\256\347\273\223\346\236\204\345\222\214\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..bdb93b0 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/\346\225\260\346\215\256\347\273\223\346\236\204\345\222\214\347\256\227\346\263\225\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,318 @@ +# 数据结构和算法学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +为什么数据结构和算法如此重要?因为:程序 = 数据结构 + 算法 + +数据结构是一组数据的存储结构和组织方式,使得该组数据便于访问、修改、存储。 + +算法是操作数据的一组方法,解决问题的一系列步骤。 + +## 学习的必要性 + +有些同学可能会因为平时写代码用不到数据结构和算法,就认为它们不重要,这是**一个错误的认识 **! + +其实很多时候,并不是用不到,而是因为你欠缺了一部分知识后,根本就想不到去用它来优化你的程序,比如提高性能、节省内存等。 + +还有一个平时很少用到算法的原因是:其他开发者给你封装好了。但假如有一天,你用的框架或算法库出了问题、或者某个算法效率低下,需要你来优化的时候,如果没学过数据结构和算法你大概率是搞不定的。 + +换句话说,不是不报,是时候未到。学好算法和数据结构,有助于开拓我们的思路,改变我们思考问题的方式,提高我们的问题解决能力(公司最看重的也是这点)。 + +至少我觉得,学习数据结构和算法让我受益匪浅。 + +## 学习条件 + +1. 必须要学过至少一门编程语言 +2. 需预留至少 2 个月的空余时间,急着找工作的同学可以先不学 + +## 什么时候学数据结构和算法? + +时间足够的话,我个人建议 **学完一门编程语言后 **就可以开始刷算法了。一方面是因为算法真的是太重要了;另一方面是用 Java 刷算法还能巩固一下语法基础,避免出现纸上谈兵、后面做项目时因为不熟悉语法导致写不出代码的情况。 + +完全零基础的话,数据结构和算法不是面试前短短几周就能准备过来的(除非你很聪明)。鱼皮是从大二上开始跟着学校学习数据结构(虽然我没怎么听课,是靠后面自己看书补回来的),并且从大二暑假开始刷题,一年多的时间总共刷了 1000 多道算法题。因为自己准备得早,所以学得还算比较扎实,面试时遇到的算法题目基本都能答出来;也是因为准备得早,每天的压力没那么大。 + +## 大纲 +思维导图源文件: +[数据结构和算法学习路线 by 程序员鱼皮.xmind](https://bcdh.yuque.com/attachments/yuque/0/2022/xmind/398476/1647767616242-2d26b3c0-0a6f-425f-a125-5ddc78e532e0.xmind) +![](https://qiniuyun.code-nav.cn/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%92%8C%E7%AE%97%E6%B3%95%20by%20%E7%A8%8B%E5%BA%8F%E5%91%98%E9%B1%BC%E7%9A%AE.png#id=zLsxq&originHeight=1828&originWidth=1782&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +## 知识 + +- 数据结构 + - 线性结构 + - 数组 + - 字符串 + - 链表 + - 单向链表 + - 双向链表 + - 循环链表 + - 栈 + - 队列 + - 普通队列 + - 双端队列 + - 散列结构 + - 集合 + - 映射 + - BitMap + - 树 + - 二叉树 + - 二叉查找树 + - 多叉树 + - 前缀树 + - 堆 + - 小顶堆 + - 大顶堆 + - 图 + - 最短路径 + - 并查集 + - 最小生成树 + - 拓扑排序 +- 算法 + - 排序 + - 冒泡排序 + - 快速排序 + - 插入排序 + - 希尔排序 + - 选择排序 + - 堆排序 + - 归并排序 + - 计数排序 + - 桶排序 + - 基数排序 + - 贪心 + - 分治 + - 动态规划 + - 递归 + - 回溯 + - 枚举 + - 查找 + - 有序表查找 + - 二分查找 + - 线性表查找 + - 树结构查找 + - 散列表查找 + - 搜索 + - 深度优先搜索 DFS + - 广度优先搜索 BFS + - 字符串匹配 + - KMP + - 前缀树 + - 位运算 +- 复杂度分析 + - 时间复杂度 + - 空间复杂度 + +## 学习建议 + +1. 数据结构和算法不可追求速成(学得快忘得快),而是应该每天坚持刷 2 道以上的题目保持手感。(可以在星球中打卡分享自己每天所刷的题目,也许会有小伙伴和你一起讨论哦) +2. 自己在写算法题目时,要给代码多写一些注释,记录自己当时的思考,并且做过的每道算法题目的代码都要分类保存好,便于自己复习。 +3. 可以根据实际情况自己写一些题解,写题解的过程中,不仅能检验自己是否真的理解,还能再次巩固、帮助自己复习。 +4. 算法是一种思想,用任何你正在学习或者熟悉的编程语言来写代码均可,可以帮助你复习编程语言的语法和细节。 +5. 不用因为担心自己算法不够而不敢面试,只要你有了基本的开发技能就足够了,算法可以持续强化。 +6. 很多同学可能会习惯性地刷自己觉得很简单的题目,而对于中等 / 困难的题目有恐惧感,下意识地回避。这在刚开始入门时没什么问题,但如果已经刷了几百题,不要满足于自己会的知识,要适当挑战,走出舒适圈。 +7. 有时间的朋友也可以试着参与各种算法竞赛和考证书,比如蓝桥杯、PAT 认证、LeetCode 周赛等。这些比赛没什么门槛,难度也没有 ACM 那么高。可以帮助你集中精神高效做题、提前适应面试的节奏感。 + +## 学习路线 +> 本学习路线适用于所有从 0 开始学算法的同学,但如果是要搞 ACM 算法竞赛的话,只学这些是远远不够的哦。 + + +### 预热 +> 该阶段可跳过,或者与之后的阶段同时进行 + + +初学编程、刚开始学习算法时,可以先通过阅读课外书、科普视频来培养兴趣,简单地入门,而不要求真正的理解。 + +推荐阅读[《漫画算法:小灰的算法之旅》](https://zh.u1lib.org/book/18051247/c74b8f) ,轻松幽默。 + +### 依次学习 + +了解每个数据结构和算法的概念、特点、适用场景、时空复杂度,并且能够自己写代码从 0 到 1 实现一遍每个数据结构和算法。注意要按顺序学习,而不是一次性看完所有的数据结构和算法后才再回过头来写代码! + +要重点学的知识点基本就是大纲中提到的那些,图论这一块了解即可,优先级不高,面试考的也不多。链表、树是面试重点。 + +推荐直接从 LeetCode 的学习板块 LeetBook 开始刷起,边学边写代码,学的更扎实。 + +#### 学习顺序 + +1. 算法基础理论和复杂度分析:https://www.bilibili.com/video/BV1nJ411V7bd(看前几节就可以了,后面可以配合着 LeetCode 去看,依次攻克每个知识点) +2. 数组和字符串:[https://leetcode-cn.com/leetbook/detail/array-and-string/](https://leetcode-cn.com/leetbook/detail/array-and-string/) +3. 链表:[https://leetcode-cn.com/leetbook/detail/linked-list/](https://leetcode-cn.com/leetbook/detail/linked-list/) +4. 队列 & 栈:[https://leetcode-cn.com/leetbook/detail/queue-stack/](https://leetcode-cn.com/leetbook/detail/queue-stack/) +5. 哈希表:[https://leetcode-cn.com/leetbook/detail/hash-table/](https://leetcode-cn.com/leetbook/detail/hash-table/) +6. 查找表类算法:[https://leetcode-cn.com/leetbook/detail/all-about-lockup-table/](https://leetcode-cn.com/leetbook/detail/all-about-lockup-table/) +7. 二分查找:[https://leetcode-cn.com/leetbook/detail/binary-search/](https://leetcode-cn.com/leetbook/detail/binary-search/) +8. 二叉树:[https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/](https://leetcode-cn.com/leetbook/detail/data-structure-binary-tree/) +9. 二叉搜索树:[https://leetcode-cn.com/leetbook/detail/introduction-to-data-structure-binary-search-tree/](https://leetcode-cn.com/leetbook/detail/introduction-to-data-structure-binary-search-tree/) +10. 前缀树:[https://leetcode-cn.com/leetbook/detail/trie/](https://leetcode-cn.com/leetbook/detail/trie/) +11. N 叉树:[https://leetcode-cn.com/leetbook/detail/n-ary-tree/](https://leetcode-cn.com/leetbook/detail/n-ary-tree/) +12. 数组类算法:[https://leetcode-cn.com/leetbook/detail/all-about-array/](https://leetcode-cn.com/leetbook/detail/all-about-array/) +13. 初级算法:[https://leetcode-cn.com/leetbook/detail/top-interview-questions-easy/](https://leetcode-cn.com/leetbook/detail/top-interview-questions-easy/) +14. 中级算法:[https://leetcode-cn.com/leetbook/detail/top-interview-questions-medium/](https://leetcode-cn.com/leetbook/detail/top-interview-questions-medium/) + +#### 完整教程 + +- 数据结构与算法基础(青岛大学-王卓):[https://www.bilibili.com/video/BV1nJ411V7bd](https://www.bilibili.com/video/BV1nJ411V7bd) +- 尚硅谷 Java 数据结构与算法(视频):[https://www.bilibili.com/video/BV1E4411H73v](https://www.bilibili.com/video/BV1E4411H73v) (难度和涉及的知识点比面试的要求大一些,**初次学习不建议看** ,适合时间充裕、希望更全面学习的朋友来查漏补缺) +- 《算法图解》书籍:[https://www.aliyundrive.com/s/MFSC8TP7ANB](https://www.aliyundrive.com/s/MFSC8TP7ANB) 提取码: 73dl +- 《大话数据结构》书籍:[https://www.aliyundrive.com/s/MFSC8TP7ANB](https://www.aliyundrive.com/s/MFSC8TP7ANB) 提取码: 73dl +- 还有一些不同语言的数据结构与算法教程,可以在 [知识库 - 资源汇总](https://bcdh.yuque.com/staff-wpxfif/resource/all) 里搜索和获取。 + +#### 辅助学习的工具 + +- VisuAlgo 数据结构和算法动态可视化:[https://visualgo.net/zh](https://visualgo.net/zh) +- 数据结构可视化:[https://www.cs.usfca.edu/~galles/visualization/Algorithms.html](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) +- RegExr:[https://www.code-nav.cn/rd/?rid=79550af2601114e9012110711798772b](https://www.code-nav.cn/rd/?rid=79550af2601114e9012110711798772b) (学习、创建和测试正则表达式的在线可视化工具) + +### 依次练习 + +学完某个数据结构和算法后,立刻趁热打铁去做几道相关的题目。 + +每道题目给自己一个时间限制,超出时间后就直接去阅读题解(建议看带有图片和动画演示的题解),有一些思路后再试着自己去做题,直到把题目完成写出,并且要真正理解每道题目的解法。 + +即使是自己做出的题目,也建议去看下其他同学的题解,多积累一种方法。 + +### 刷题 + +当把每个知识点学完一遍后,可以去 LeetCode 网站的题库中刷题,按照难易度、通过率、热门程度每天坚持刷几道。时间紧张(三个月内)的话也可以直接去刷热门题目集合。 + +有时间的话,建议大家可以参加 [蓝桥杯竞赛](https://www.lanqiao.cn/) 、考 [PAT 认证](https://www.patest.cn/),检验自己的学习、丰富自己的简历。 + +#### 刷题顺序 +> 仅供参考,可以有自己的学习方法和习惯 + +1. 先按知识点逐个去刷,可以进入 [https://leetcode-cn.com/leetbook/](https://leetcode-cn.com/leetbook/),这里有按知识点分类的教程和题目,比如初级算法、数组、字符串、队列、栈、树等等。每刷完一个知识点,可以再做几道相关的题目,举一反三,每道题目都要做到 100% 通过。 +2. 把所有知识点逐个刷完后,可以再按照难度、通过率去自由刷题,刷大概几十道简单题目后,可以去做 LeetCode 热题 100 道:[https://leetcode-cn.com/problem-list/2cktkvj/](https://leetcode-cn.com/problem-list/2cktkvj/)。当然,时间紧迫的话,也可以直接刷热题。 +3. 算法最好刷 200 道题以上,每天 2 - 3 道,坚持 2 个月以上,并且还要整理好自己的代码、定期复习。尽量不要去刷冷门的题目!别逞能去刷那么多 Hard 题,性价比不高,不如省点时间去做项目。 +4. 刷完 LeetCode 经典题目后,可以去刷刷《剑指 Offer》或者《剑指 Offer 面试精装版》进行巩固。 + +#### 相关资源 + +- 算法刷题网站 + - LeetCode:[https://leetcode-cn.com/](https://leetcode-cn.com/) + - 洛谷:[https://www.luogu.com.cn/](https://www.luogu.com.cn/) + - 蓝桥:[https://lx.lanqiao.cn/](https://lx.lanqiao.cn/) +- LeetCode 精选 100 道:[https://leetcode-cn.com/problem-list/2cktkvj/](https://leetcode-cn.com/problem-list/2cktkvj/) +- LeetCode 精选算法 200 题:[https://leetcode-cn.com/problem-list/qg88wci/](https://leetcode-cn.com/problem-list/qg88wci/) +- LeetCode 算法高频面试题汇总:[https://leetcode-cn.com/leetbook/detail/top-interview-questions/](https://leetcode-cn.com/leetbook/detail/top-interview-questions/) + +### 面试前 + +在面试前,建议刷一遍 LeetCode 热门题目,有时间的话还可以阅读《剑指 Offer》、《剑指 Offer 专项突破版》、《程序员代码面试指南》等书籍,争取面试时撞到原题。 + +#### 几份完整的题解 +> 有空的话挑一份看即可 + + +- 图解算法数据结构:[https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/](https://leetcode-cn.com/leetbook/detail/illustration-of-algorithm/) +- Leetcode 真题解析视频:[https://www.bilibili.com/video/BV1a54y1b74k](https://www.bilibili.com/video/BV1a54y1b74k) +- LeetCode 101(C++):[https://github.com/changgyhub/leetcode_101](https://github.com/changgyhub/leetcode_101) +- LeetCode 题解(C++):[https://github.com/soulmachine/leetcode](https://github.com/soulmachine/leetcode) +- LeetCode Cookbook(Go 语言):[https://github.com/halfrost/LeetCode-Go](https://github.com/halfrost/LeetCode-Go) + +如果有意向公司(比如大厂)的话,可以去刷一下 [历年笔试题目](https://www.nowcoder.com/exam/company) (难度可能比较大,不要因此丧失信心,多练习后就习惯了)。 + +### 工作后 + +工作之后,如果有兴趣的话,可以通过刷题来帮助自己巩固编程语言、提升思维能力。 + +## 额外服务 +适合想要更轻松、更快速学算法的同学:[编程导航算法通关村](https://yuyuanweb.feishu.cn/wiki/J9qLwpv75iropZkXpmIcYrZ8nNM) + +## 更多学习建议 +### 1、刷题顺序 +最直接的就是按照知识点标签选题,从【简单的】题目刷起,从【通过率高】的题目刷起,循序渐进。 + +![](https://pic.yupi.icu/1/640-20231009103248320.png#height=305&id=pVNvD&originHeight=611&originWidth=1080&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=538.4000244140625) + +### 2、养成自己的刷题习惯 + +的确,学算法是枯燥的,想长期坚持非常难,像鱼皮当时刷了 1000 多道不同平台的题目,现在回过头来都觉得不可思议。 + +分析下我能够坚持刷这么多题的原因,主要是因为养成了自己的刷题习惯,把刷算法当成了像刷牙洗脸一样的日常任务。 + +怎么养成自己的刷题习惯呢? + +1)每天在固定的时间学习算法。比如我当时每天早上 6 点多就会躺在床上思考没解决的算法题,想到方案后就会拿个枕头靠在床上敲代码做题,其实都有点魔怔了哈哈。 + +2)给自己定每日的学习目标。比如我每天会花 1 个半小时左右完成 3 道题目,不多也不少。如果没做完,就等其他工作完成后再静下心来思考;如果超前达到目标,那么可以奖励自己一顿番茄炒蛋。 + +3)分享自己的学习记录。比如我当时每刷几十道题目,就会跟朋友小小 “炫耀” 一下,看着自己的打卡表越来越满,也会有不小的成就感。 + +### 3、找到自己的灯塔 + +如果一个人学算法觉得很累,那么就一定要找到能伴你共同前行的伙伴,或者给你指路的灯塔。 + +可能是和你一起努力刷题的伙伴,可能是一个算法交流圈子,可能是一位专业的算法导师。 + +说不定一个问题你自己思考 30 分钟还没办法解决,而请教他人 5 分钟就能解决了,能大大节约你的时间。 + +至于一些三天打鱼两天晒网、动不动就摆烂的人,还是敬而远之。 + +### 4、学会总结 + +解决学算法学了就忘的最好方法,就是多记录总结,把知识沉淀成电子文档,而不是全部装在大脑里。 + +不要觉得写总结很麻烦,记录自己的解题思路、或者在代码上补充详细的注释都是可以的。如果你连自己的思路都表述不清楚,那么说明这道题你就没有理解!打回去重做! + +可以通过云文档、GitHub 仓库、或者各平台的发帖来总结分享自己的题解和心得,费曼学习法,能够给别人讲清楚题目的做法,你自己的印象就会更深刻。 + +这样做了之后,哪怕刷了算法就忘,也能快速通过自己的笔记总结捡起来当时的思路,大幅提高复习效率。 + +### 5、利用题解 +LeetCode 平台的每道题目都有很多小伙伴给出了题解,讲述如何解决这道题。 + +**怎么才算利用好题解呢?** + +首先,读题解包括两个部分,**读思路** 和 **读代码**,既要理解作者做题的思路和逻辑,也要细致入微地学习他人代码中优秀的写法。即使这道题目你做出来了,击败 100% 了,我也建议去看看别人的题解,学习更多他人解题的思路,帮助自己打开脑洞,做到 **一题多解**。 + +话说,现在网上的题解实在是太多啦!在刷题时,读个一两份就行了,别给自己太大压力。 + +除了看题解外,很多同学没有意识到,多写题解 才是真正的法宝,把自己的解题思路整理成文,或者讲给别人听。这样做不仅能够加深自己对题目的印象,进一步加深对算法的理解,帮助自己回顾解题过程,从而在面试的时候更容易复述;还能帮助到更多同学。 + +甚至有一些厉害的同学通过记录和分享自己的题解,还没毕业,就已经出版了自己的书籍,年入几十万或者百万! + +写题解利人利己,何乐而不为呢? + +### 6、精益求精 +当你每次成功解题时,LeetCode 系统会生成一份解题报告,告诉你的程序在时间和空间上击败了多少用户。 + +虽然答出题目就已经很棒了,但还不够。面试的时候,一些面试官就喜欢给你出题目的变种,或者要求你用更优的方式解出题目。所以,在保证完全理解题目解法的基础上,请不断优化你的代码,找到更多的思路和更优解,直到击败 100% 的用户吧。 + +我们在工作中,虽然未必会直接和算法打交道,但学习算法对工作的帮助真的很大! + +解算法题时,我们要对多种算法分析复杂度,从中选择最优解。而在工作中,也是如此,一个需求有很多种实现方式,经常也要设计几种不同的方案,分析他们的成本、性能等差异,选择其中最好的一种进行实施。 + +所以,请认真对待每一道算法题目,把它当成一个工程问题来解决,相信你的思维会逐渐打开,并逐渐掌握编写高性能程序的技巧。 + + +### 7、多实践 +#### 参加竞赛 + +我建议大家多参加算法竞赛,这里的竞赛不是指 ACM 区域赛那种大神级别的,别忘了此时我们的目标只是找工作。 + +其实,LeetCode 网站每周都会开展一次线上算法竞赛,看看谁能在有限时间内最快最多地解题。 + +![](https://pic.yupi.icu/1/640-20231009114923573.png#height=283&id=xxc4z&originHeight=695&originWidth=1080&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=440.4000244140625) + +在竞赛的过程中,紧张刺激的环境会使我们的精神保持高度集中,能够激发出我们的思维,从而在有限的时间内进行更多的思考,也能帮助我们适应面试的节奏。多多参加还有机会获得他们官方提供的奖励! + +此外,参加蓝桥杯竞赛也是不错的,我自己也参加了两届,题目的难度和找工作要求的算法题目难度相当,也能发现自身的不足、激励自己进步吧。 + +#### 考取证书 + +这几年,PAT 计算机程序设计能力考试在逐渐升温,分为顶级、甲级、乙级三个级别。 + +![](https://pic.yupi.icu/1/640-20231009114923606.png#height=66&id=Pv22s&originHeight=130&originWidth=822&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=&width=420.4000244140625) + +我亲身参与过甲级和乙级的考试,难度适中,虽然目前这个证书的含金量不高,但在备战考证的过程中,你有一个学习的目标,会更有动力坚持下去。在我看来,过程大于结果。 + +网址:[https://www.patest.cn/](https://www.patest.cn/) + + +--- + + +加油小伙伴们! diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..2472d49 --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\241\347\256\227\346\234\272\345\237\272\347\241\200\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,111 @@ +# 计算机基础学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +这篇文章汇总分享一些计算机领域的通用基础知识,主要包括: + +- 计算机导论(计算机基本概念) +- 数据结构和算法 +- 操作系统 +- 计算机网络 + +俗话说的好,基础不牢,地动山摇!只要你想入行并学好计算机,无论是什么岗位,最好都系统地学习下这些知识。尤其对于以逻辑思考为主的岗位(比如后端开发、算法工程师、系统开发、游戏开发等),这些基础知识更为重要。 + +短时间来看,学这些知识可能会花费你一些时间;但从长期来看,基础好的同学,往往更容易理解后面学习的新知识,后期的发展会更顺利。 + +就拿 “算法” 来举例,鱼皮刚开始也被算法折磨,觉得刷题没什么用,就是为了应付面试;但等到工作后,遇到复杂的业务场景时,由于我刷过算法,我才能想到用算法来解决问题,提高程序的执行效率。 + +当然,如果你的时间非常有限,比如只有不到半年的时间就要找工作,那么先不用系统学习这些,课外时间看看视频或书籍了解一下就好了,工作后再去补充基础知识。 + +## 计算机导论 +### 介绍 +计算机导论是介绍和科普计算机的入门课程,主要帮助大家在正式开始计算机学习前,先对计算机科学有一个大致的认识,包括计算机的历史和发展、计算机的应用领域和方向、计算机中的重要概念等等。 + +### 学习建议 +计算机导论也是很多计算机专业同学的第一门课程,但是,它却是很多同学口中的 “水课”!鱼皮曾经也这么认为,甚至还在课堂上打起了斗地主,并且因此被点名批评。。。 + +不是说这门课不重要,而是很多学校没有把它讲好,再加上学生学完这个课又做不出东西,所以才给了大家一种 “水” 的感觉吧。 + +如果学校教了这门课,讲的还不错,那么建议适当听一听。虽说学习计算机导论并不会直接提高你的编程技能,但是它能够让你更了解计算机,从而在一定程度上帮助你培养学习兴趣、确定学习方向。 + +而如果你是自学编程,不用刻意去学习计算机导论(尤其是不要读什么计算机导论书籍),而是可以通过看视频、阅读课外读物的方式慢慢地了解计算机。 + +但无论你是跟学校的课还是自学,都必须要了解以下这些知识点和概念!都是我觉得比较重要的。 + +千万别真的只会埋头写代码,却连最基本的计算机知识都不懂。 + +### 知识 + +- 计算机的历史和发展过程 +- 计算机应用领域和发展方向 +- 数字技术 + - 进制 + - 电路 +- 计算机体系结构 + - CPU + - 内存 + - I / O 设备 + - 硬盘 +- 程序设计语言 +- 算法(简单了解) +- 操作系统(简单了解) +- 计算机网络(简单了解) + - 网络拓扑结构 + - 网络设备 + - 因特网 + - 网址和域名解析服务 +- 数据库(简单了解) +- 网络信息安全 + - 数据加密 + - 数字签名 + - 身份鉴权 + - 访问控制 + - 计算机病毒 +- 多媒体 + - 数字图像 + - 数字声音 + - 数字视频 +- 职业道德 + +### 资源 +#### 入门 +一般情况下,看以下几份资料就足够了: + +- 视频《计算机科学速成课》:[https://www.bilibili.com/video/BV1EW411u7th](https://www.bilibili.com/video/BV1EW411u7th) (从底层到上层的计算机知识科普,强烈推荐) +- 书籍《半小时漫画计算机》:https://book.douban.com/subject/35619441/(很有趣的科普书籍) +- 书籍《码农翻身》:https://github.com/luanguang/book-pdf/blob/master/%E7%A0%81%E5%86%9C%E7%BF%BB%E8%BA%AB%EF%BC%9A%E7%94%A8%E6%95%85%E4%BA%8B%E7%BB%99%E6%8A%80%E6%9C%AF%E5%8A%A0%E7%82%B9%E6%96%99.pdf(也是很有趣的科普书籍) + +#### 进阶 +想要进大厂、或者准备考研的同学,可以抽些时间去啃下面的书籍。 +这里鱼皮给出对应的视频公开课,自己学校的老师讲的不清楚的话,可以通过这些课程查漏补缺: + +- 《算法导论》:[https://www.bilibili.com/video/av48922404](https://www.bilibili.com/video/av48922404) +- 《现代操作系统》:[https://www.bilibili.com/video/av9555596](https://www.bilibili.com/video/av9555596) +- 《深入理解计算机系统》:[https://www.bilibili.com/video/av31289365](https://www.bilibili.com/video/av31289365) +- 《编译原理》: [https://www.bilibili.com/video/BV1dL4y1H7T8](https://www.bilibili.com/video/BV1dL4y1H7T8) +- 《计算机网络:自顶向下方法》:[https://www.bilibili.com/video/BV1JV411t7ow](https://www.bilibili.com/video/BV1JV411t7ow) +- 《计算机程序的构造和解释》:[https://www.bilibili.com/video/av8515129](https://www.bilibili.com/video/av8515129) +- 《数据库系统概论》:[https://www.bilibili.com/video/BV1G54y1d7ZK](https://www.bilibili.com/video/BV1G54y1d7ZK) + +## 数据结构和算法 +因为程序的本质就是 “数据结构 + 算法”,所以数据结构和算法可能是所有计算机基础知识中最重要的,也是面试时最容易被考察的。 +对于科班的同学来说,一般大一学编程语言时,学校老师就会让你刷 OJ 题目来接触数据结构和算法了;对于非科班的同学、或者着急就业的同学来说,数据结构和算法可以先不学,先去学习能让你做出作品的技术框架,之后有时间了再刷刷题。 +更详细的路线请见:[https://www.code-nav.cn/post/1640586867363954689](https://www.code-nav.cn/post/1640586867363954689) + +## 操作系统 +操作系统是管理计算机硬件与软件资源的计算机程序,是计算机系统中 **最基本** 的系统软件,大到 PC 电脑,小到微型芯片,都离不开操作系统,学习它的必要性也就不言而喻了。 +后端开发(尤其是 C++ 开发),一定要学好操作系统,才能帮助我们开发出更高性能的系统。 +更详细的路线请见:[https://www.code-nav.cn/post/1640587909942099969](https://www.code-nav.cn/post/1640587909942099969) + +## 计算机网络 +如今,我们开发的绝大多数程序都依赖网络来加载文件和数据,比如网站、小程序、后台程序等,因此计算机网络的重要性不言而喻。 +个人感觉,计算机网络的知识可能比操作系统更普适一些,无论是前端、后端、还是网络运维,都要学好计算机网络,有助于我们开发出占用带宽更少、加载更快的网络程序。 +更详细的路线请见:[https://www.code-nav.cn/post/1640588119619551233](https://www.code-nav.cn/post/1640588119619551233) + +--- + + +加油小伙伴们 💪🏻 diff --git "a/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" "b/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" new file mode 100644 index 0000000..537238b --- /dev/null +++ "b/\345\255\246\344\271\240\350\267\257\347\272\277/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\350\267\257\347\272\277 by \347\250\213\345\272\217\345\221\230\351\261\274\347\232\256.md" @@ -0,0 +1,289 @@ +# 设计模式学习路线 by 程序员鱼皮 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +## 介绍 +大家有没有思考过如下几个问题? + +- 同样都是写代码,为什么有些同学的思路清晰、代码整洁;而我的代码却充满了重复和混乱,每次要修改时都无从下手、Bug 一堆? +- 如何写代码,才能使得项目易于扩展和维护? +- 我每天都在写重复的代码,如何提升水平? +- 为什么我读不懂大佬写的源码?是不是缺少了什么知识? + +如果存在上述问题,那么我们一定要学习软件开发中的重要技能 —— 设计模式。 + +设计模式是软件开发人员在软件开发过程中面临的一般问题的 **通用** 解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 + +通俗地说就是前辈们在写代码时摸索出了一些不错的方法,可以用于解决一类问题、更好地开发和维护项目。于是其他软件开发者纷纷效仿,久而久之,就得出了一套优秀的软件开发方法总结。 + +目前最为经典的设计模式有 23 种,学习之后,不仅能帮助我们开拓思路、写出更优质的代码、提高项目的开发和维护效率;还能够帮助我们更好地阅读和理解源码,甚至可以根据文件名称直接推断出源码的架构设计(有点行话的感觉)!因此,在准备阅读框架源码前,强烈建议先学习设计模式。 + +此外,设计模式也是软件开发相关岗位面试的重点(尤其是大厂、后端开发岗位),建议大家有时间的话都要学习。 + +## 问题 + +Q:前端要不要学设计模式? + +A:先学习基础的界面开发、组件库和框架的使用,之后可以将设计模式作为进阶知识来学习,想进大厂建议学习。毕竟设计模式是软件开发的通用思想 / 技能,独立于编程语言。 + +## 学习条件 + +1. 至少学过一门编程语言(学设计模式时需要多写代码实践) +2. 使用过至少一门开发框架(这样在学习设计模式的时候能够和框架的设计结合起来,更好理解) + +## 大纲 + +![](https://xingqiu-tuchuang-1256524210.cos.ap-shanghai.myqcloud.com/1/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%AD%A6%E4%B9%A0%E8%B7%AF%E7%BA%BF%20by%20%E7%A8%8B%E5%BA%8F%E5%91%98%E9%B1%BC%E7%9A%AE.png#id=ygV2a&originHeight=1303&originWidth=2290&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&title=) + +## 知识 + +- 软件开发原则 + - 单一职责原则(SRP) + - 开闭原则(OCP) + - 里氏替换原则(LSP) + - 依赖倒置原则(DIP) + - 接口隔离原则(ISP) + - 迪米特法则(最少知道原则) + - 合成 / 聚合复用原则(CARP) +- 设计模式分类 + - 根据作用范围:类 / 对象模式 + - 根据目的分类:创建型 / 结构型 / 行为型模式 +- 创建型模式:如何创建对象 + - 单例模式(懒汉式、饿汉式、双检锁、线程唯一单例) + - 工厂方法模式(类) + - 抽象工厂模式 + - 建造者模式 + - 原型模式 +- 结构型模式:如何将类或对象结合在一起形成一个更强大的结构 + - 适配器模式(类 / 对象) + - 组合模式 + - 装饰器模式 + - 代理模式 + - 享元模式 + - 外观模式 + - 桥接模式 +- 行为型模式:类或对象间如何交互、如何划分职责,从而更好地完成任务 + - 迭代器模式 + - 模板方法模式(类) + - 策略模式 + - 命令模式 + - 状态模式 + - 责任链模式 + - 备忘录模式 + - 观察者模式 + - 访问者模式 + - 中介者模式 + - 解释器模式(类) + +### 知识表 + +> 表格来源: [schips](https://home.cnblogs.com/u/schips/) + +| 设计模式 | 适用层次 | 引入时机 | 复杂度 | 变化 | 实现 | 体现的原则 | +| --- | --- | --- | --- | --- | --- | --- | +| 工厂方法 | 代码级 | 编码时 | 简单 | 子类的实例化 | 对象的创建工作延迟到子类 | 开闭原则 | +| 单例 | 代码级、应用级 | 设计时、编码时 | 简单 | 唯一实例 | 封装对象产生的个数 | | +| 门面 | 应用级、构架级 | 设计时、编码时 | 简单 | 子系统的高层接口 | 封装子系统 | 开闭原则 | +| 模板方法 | 代码级 | 编码时、重构时 | 简单 | 算法子步骤的变化 | 封装算法结构 | 依赖倒置原则 | +| 抽象工厂 | 应用级 | 设计时 | 较复杂 | 产品家族的扩展 | 封装产品族系列内容的创建 | 开闭原则 | +| 组合 | 代码级 | 编码时、重构时 | 较复杂 | 复杂对象接口的统一 | 统一复杂对象的接口 | 里氏代换原则 | +| 代理 | 应用级、构架级 | 设计时、编码时 | 简单 | 对象访问的变化 | 封装对象的访问过程 | 里氏代换原则 | +| 命令 | 应用级 | 设计时、编码时 | 较简单 | 请求的变化 | 封装行为对对象 | 开闭原则 | +| 观察者 | 应用级、构架级 | 设计时、编码时 | 较简单 | 通讯对象的变化 | 封装对象通知 | 开闭原则 | +| 策略 | 应用级 | 设计时 | 一般 | 算法的变化 | 封装算法 | 里氏代换原则 | +| 建造者 | 代码级 | 编码时 | 一般 | 对象组建的变化 | 封装对象的组建过程 | 开闭原则 | +| Adapter | 代码级 | 重构时 | 一般 | 对象接口的变化 | 接口的转换 | | +| 桥接 | 代码级 | 设计时、编码时 | 一般 | 对象的多维度变化 | 分离接口以及实现 | 开闭原则 | +| 装饰器 | 代码级 | 重构时 | 较复杂 | 对象的组合职责 | 在稳定接口上扩展 | 开闭原则 | +| 迭代器 | 代码级、应用级 | 编码时、重构时 | 较简单 | 对象内部集合的变化 | 封装对象内部集合的使用 | 单一职责原则 | +| 中介者 | 应用级、构架级 | 编码时、重构时 | 一般 | 对象交互的变化 | 封装对象间的交互 | 开闭原则 | +| 备忘录 | 代码级 | 编码时 | 较简单 | 状态的辅助保存 | 封装对象状态的变化 | 接口隔离原则 | +| 状态 | 应用级 | 设计时、编码时 | 一般 | 对象状态的变化 | 封装与状态相关的行为 | 单一职责原则 | +| 访问者 | 应用级 | 设计时 | 较复杂 | 对象操作变化 | 封装对象操作变化 | 开闭原则 | +| 原型 | 应用级 | 编码时、重构时 | 较简单 | 实例化的类 | 封装对原型的拷贝 | 依赖倒置原则 | +| 享元 | 代码级、应用级 | 设计时 | 一般 | 系统开销的优化 | 封装对象的获取 | | +| 责任链 | 应用级、构架级 | 设计时、编码时 | 较复杂 | 对象的请求过程 | 封装对象的责任范围 | | +| 解释器 | 应用级 | 设计时 | 较复杂 | 领域问题的变化 | 封装特定领域的变化 | | + + +除了这 23 种主流设计模式外,还有一些其他设计模式,比如 Immutable 不可变模式等,了解即可。 + +## 学习建议 + +1. 对设计模式的学习和其他知识一样,先了解每种设计模式是什么?作用是什么?能够解决什么问题?适用于什么场景?有什么特点?类和对象的关系是什么(建议结合 UML 类图来理解)?再去考虑编码实现和进一步在项目中应用。 +2. 一定要多写代码实践,最好每个设计模式都实现一遍,不要去背代码,用的多了自然就能写出代码了。 +3. 每个设计模式都可以 **独立学习** ,互相之间联系不大,因此可以根据自己的时间来选择性学习(比如先学重点的单例模式)。 +4. 在学会基础的设计模式后,可以分析之前学过的框架源码(比如 Spring、MyBatis 等),参考别人是如何应用设计模式的。 +5. **不要过度依赖设计模式!!!!!!** 它并不是银弹,过分使用设计模式可能只会增加系统的复杂度。 + +## 学习路线 + +主流的设计模式共有 23 种,建议大家按照以下四个阶段来学习: + +1. 基础学习 +2. 编码实现 +3. 项目实战 +4. 备战面试 + +其中第一个阶段和第二个阶段 **可以同时进行** ,即对于每个设计模式的学习都是:先了解、再编码实现。 + +### 一、基础学习 + +本阶段的目标:依次了解每一种设计模式的应用场景、特点、UML 类图,能够对设计模式有个基础的印象。 + +#### 学习顺序 + +根据使用频率、难易度、面试考察率等综合排序,仅供参考,并不绝对! + +优先: + +1. 单例模式 +2. 工厂方法模式 +3. 迭代器模式 +4. 策略模式 +5. 建造者模式 +6. 模板方法模式 +7. 代理模式 +8. 责任链模式 +9. 抽象工厂模式 +10. 适配器模式 +11. 观察者模式 +12. 外观模式 + +一般: + +1. 桥接模式 +2. 组合模式 +3. 装饰器模式 +4. 状态模式 +5. 访问者模式 +6. 中介者模式 +7. 命令模式 +8. 备忘录模式 + +低优先: + +1. 原型模式 +2. 享元模式 +3. 解释器模式 + +#### 推荐资源 + +> 以下资源看 1 - 2 个就足够入门了 + + +- 书籍 + - 《图解设计模式》:[https://www.aliyundrive.com/s/jcQugLGNs1V](https://www.aliyundrive.com/s/jcQugLGNs1V) 提取码: 5i9c(强烈推荐,用 Java 语言实现,图多、有示例代码、有习题和答案,很不错) + - 《大话设计模式》:[https://www.aliyundrive.com/s/73jZWnfAtaA](https://www.aliyundrive.com/s/73jZWnfAtaA) 提取码: 9gc7(比较有趣) + - 《Head First 设计模式》:[https://www.aliyundrive.com/s/GnuQcruh7Us](https://www.aliyundrive.com/s/GnuQcruh7Us) 提取码: 9gc7 + - 《设计模式:可复用面向对象软件的基础》:[https://www.aliyundrive.com/s/T9ECaPtxzg4](https://www.aliyundrive.com/s/T9ECaPtxzg4) 提取码: 9gc7(大黑书,难度较大,有能力和时间才去读) + - 《JavaScript 设计模式与开发实践》:[https://www.aliyundrive.com/s/tzcZCU8bqnR](https://www.aliyundrive.com/s/tzcZCU8bqnR) 提取码: 9gc7(适合前端同学阅读) + - 《Python 设计模式》:[https://www.aliyundrive.com/s/3RNoX31XqUy](https://www.aliyundrive.com/s/3RNoX31XqUy) 提取码: 9gc7 +- 视频 + - 尚硅谷图解 Java 设计模式:[https://www.bilibili.com/video/BV1G4411c7N4](https://www.bilibili.com/video/BV1G4411c7N4) (讲的很棒也很全面,也和一些主流框架相结合,系统学习 Java 的同学可以看) + - 五分钟学设计模式:[https://www.bilibili.com/video/BV1af4y1y7sS](https://www.bilibili.com/video/BV1af4y1y7sS) (小短快科普,比较轻松) + - 黑马程序员Java设计模式详解:[https://www.bilibili.com/video/BV1Np4y1z7BU](https://www.bilibili.com/video/BV1Np4y1z7BU) (很完整,最后讲解了 Spring 框架的部分设计) + - 用一个项目讲解 23 种设计模式:[https://www.bilibili.com/video/BV19g411N7yx](https://www.bilibili.com/video/BV19g411N7yx) (和项目结合,思路不错,但其中有一些直播翻车,可部分跳过) +- 文档 + - 菜鸟教程:[https://www.runoob.com/design-pattern/design-pattern-tutorial.html](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) (还是比较推荐的,学过设计模式后如果忘记了,可以查看这个文档快速补回来) + - C++ 图说设计模式:[https://design-patterns.readthedocs.io/zh_CN/latest/](https://design-patterns.readthedocs.io/zh_CN/latest/) + - Go 语言设计模式系列博客:[https://lailin.xyz/post/singleton.html](https://lailin.xyz/post/singleton.html) + +### 二、编码实现 + +本阶段的目标:依次编码实现每个设计模式,用任何支持面向对象的编程语言都可以,最好能够独立(不借助任何资料)从 0 写出每个设计模式的代码。 + +#### 资源 + +一些源码示例,仅供参考,更多的内容可以直接在 GitHub 搜索关键词 `Design Pattern` 或 `设计模式` : + +- 各语言设计模式示例代码:[https://github.com/wx-chevalier/design-pattern-examples](https://github.com/wx-chevalier/design-pattern-examples) +- Java 23 种设计模式全归纳:[https://github.com/youlookwhat/DesignPattern](https://github.com/youlookwhat/DesignPattern) (教程 + 源码) +- C++ 设计模式源码:[https://github.com/liu-jianhao/Cpp-Design-Patterns](https://github.com/liu-jianhao/Cpp-Design-Patterns) (设计模式介绍 + 源码) +- JavaScript 示例代码: + - [https://github.com/wchaowu/javascript](https://github.com/wchaowu/javascript) + - [https://github.com/zy445566/design-pattern-in-javascript](https://github.com/zy445566/design-pattern-in-javascript) +- Python 示例代码: + - [https://github.com/wklken/py-patterns](https://github.com/wklken/py-patterns) +- Go 示例代码 + - [https://github.com/mohuishou/go-design-pattern](https://github.com/mohuishou/go-design-pattern) + +### 三、项目实战 + +本阶段的目标:通过做项目或阅读项目源码来进一步强化每个设计模式的实际应用。做到能根据某个场景主动选出合适的设计模式来优化代码、灵活运用,并且能够通过文件命名、项目目录结构等途径来快速判断出某个框架是否使用了设计模式。 + +可以先通过一个视频了解设计模式的实际应用: + +- 实际工作中,如何运用 Java 设计模式:[https://www.bilibili.com/video/BV1tK4y1s7Uo](https://www.bilibili.com/video/BV1tK4y1s7Uo) + +列举一些设计模式在框架源码中的应用: + +> 部分内容源于网络 + + +- Spring + - 工厂模式:通过 BeanFactory 和 ApplicationContext 来创建对象 + - 单例模式:Spring Bean 默认为单例模式 + - 策略模式:例如 Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略 + - 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术 + - 模板方法:可以将相同部分的代码放在父类中,而将不同的代码放入不同的子类中,用来解决代码重复的问题。比如RestTemplate、JmsTemplate、JpaTemplate + - 适配器模式:Spring AOP 的增强或通知(Advice)使用到了适配器模式 + - 观察者模式:Spring 事件驱动模型 + - 桥接模式:可以根据客户的需求能够动态切换不同的数据源。比如我们的项目需要连接多个数据库,客户在每次访问中根据需要会去访问不同的数据库 +- Spring MVC + - 组合模式:WebMvcConfigurerComposite,树枝和树叶都实现了相同的抽象类或接口 WebMvcConfigurer + - 责任链模式:DispatcherServlet 依次拦截和处理请求 + - 适配器模式:HandlerAdapter 处理器适配 +- MyBatis(参考:[https://blog.csdn.net/aha_jasper/article/details/108701785](https://blog.csdn.net/aha_jasper/article/details/108701785) ) + - Builder + Factory 模式:创建 SqlSession 工厂和 SqlSession + - 模板方法模式:BaseExecutor 定义执行器基本流程 + - 解释器模式:SqlNode 动态解析 SQL + - 单例模式:ErrorContext 线程唯一 + - 装饰器模式:Cache 的实现用组合而非继承实现更灵活地缓存方式结合 + - 迭代器模式:PropertyTokenizer 利用迭代器模式实现属性解析器 + - 适配器模式:Log 适配不同的日志框架 +- Google Guava(参考:[https://blog.csdn.net/aha_jasper/article/details/108695561](https://blog.csdn.net/aha_jasper/article/details/108695561) ) + - Builder 模式:更方便地构建内存缓存 + - Wrapper 模式(代理模式、装饰器、适配器模式):轻松实现对类的扩展 + - Immutable 模式:不可变集合实现,如 ImmutableList、ImmutableSet、ImmutableMap 等 +- 更多可以自行学习: + - Netty + - SpringBoot + - Tomcat + - Dubbo + - Spring Cloud + +### 资源 + +- 《设计模式之美》专栏:[https://blog.csdn.net/aha_jasper/article/details/105695163](https://blog.csdn.net/aha_jasper/article/details/105695163) (原作者 Google 王争设计模式之美:[https://time.geekbang.org/column/intro/250](https://time.geekbang.org/column/intro/250) ,是极客时间的付费课,里面的内容,尤其是开源实战和项目实战的部分讲的很好!有收获的朋友还是请支持正版哦) +- Spring 相关框架源码分析视频:[https://www.bilibili.com/video/BV1kF411e7WR](https://www.bilibili.com/video/BV1kF411e7WR) (结合设计模式,包括 Spring、SpringMVC、SpringBoot、Tomcat 等) + +### 四、备战面试 + +面试时对设计模式的考察主要有 4 种形式: + +1. 直接问你某个设计模式的作用和大致的原理,考察你对设计模式的了解程度 +2. 让你手写某个设计模式的代码,考察你对设计模式的熟悉程度和编码能力 +3. 给你一个实际的业务场景,让你去设计系统,考察你对设计模式的理解应用能力和逻辑思维 +4. 问你某个框架(轮子)的核心设计和源码细节,考察你对设计模式的理解应用能力 + +#### 经典面试题 + +1. 理论:简单介绍一下软件开发原则? +2. 理论:设计模式如何分类? +3. 你用过哪些设计模式?举例说明设计模式在你的项目或是某个框架源码中的应用。 +4. 说出某个设计模式的优缺点?什么时候使用它? +5. 单例模式有哪些实现方式?分别有哪些优缺点?请手写其中一种 +6. 原型模式和单例模式的区别是什么? +7. 简单工厂、工厂方法和抽象工厂三者有什么区别? +8. 介绍一下代理模式,说一下静态代理和动态代理(比如 Spring AOP 就用到了)的区别? + +#### 资源 + +- 设计模式面试题汇总:[https://pan.baidu.com/s/1tjIGc7pnHjgiFPo0fhcKXw](https://pan.baidu.com/s/1tjIGc7pnHjgiFPo0fhcKXw) 提取码: wuan(朋友 JavaGuide 整理,很全面 👍🏻) +- 面试官最爱问的13道"设计模式"题(视频):[https://www.bilibili.com/video/BV1fR4y1N74H](https://www.bilibili.com/video/BV1fR4y1N74H) + +加油小伙伴们! diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/4 \347\247\215\346\226\271\346\263\225\357\274\214\345\277\253\351\200\237\345\210\235\345\247\213\345\214\226 Java \351\241\271\347\233\256.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/4 \347\247\215\346\226\271\346\263\225\357\274\214\345\277\253\351\200\237\345\210\235\345\247\213\345\214\226 Java \351\241\271\347\233\256.md" new file mode 100644 index 0000000..0963075 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/4 \347\247\215\346\226\271\346\263\225\357\274\214\345\277\253\351\200\237\345\210\235\345\247\213\345\214\226 Java \351\241\271\347\233\256.md" @@ -0,0 +1,225 @@ +# 4 种方法,快速初始化 Java 项目 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +大家好,我是鱼皮。今天给大家分享常用的快速初始化 Java 项目的几种方法。比较全面,有一些方法你可能并不知道,但如果都掌握的话,基本上够用一辈子了哈哈。 + + + +## 如何快速初始化 Java 项目? + +### 1、使用开发工具 + +Java 开发者最常用的开发工具当属 JetBrains IDEA 了! + +IDEA 不仅功能完善、插件丰富,而且其实对新手比较友好。 + +比如在 IDEA 中,你可以快速安装需要的指定版本的 JDK,不用自己到官网下载: + +![](https://pic.yupi.icu/1/1696909595255-ee7eb1c6-b224-4a13-9fc1-1ea3475492aa.png) + + + +使用 IDEA 来创建初始化项目也是最常用的方法了,点击左上角的 File => New => Project: + +![](https://pic.yupi.icu/1/1696909731186-3a8dc367-e54a-482c-8f70-10b8523df19a.png) + +然后进入项目创建界面,左侧选择需要的模板,右侧填写项目信息,即可完成创建: + +![](https://pic.yupi.icu/1/1696909787420-057ce671-1e17-45fd-9c55-a757e0d94331.png) + + + +最常用的模板当属 `Spring Initializr` 了,可以快速初始化 Spring Boot 项目: + +> 注意选择 Java 的版本号 + +![](https://pic.yupi.icu/1/1696909883195-394d2e0f-be2a-4074-89eb-061dd8c07578.png) + +支持可视化地选择项目的依赖,一般不用自己去写依赖配置或者粘贴了: + +![](https://pic.yupi.icu/1/1696909903799-7afbbeff-5f47-4107-ae14-b8cd820a226f.png) + + + +如果要引入更多 Java 的包,可以到 Maven 中心仓库寻找:http://mvnrepository.com/ 。 + + + +### 2、项目管理工具 + +对于 Java 开发者,最常用的项目管理工具是 Maven 和 Gradle。它们不仅可以管理项目依赖、打包构建项目,也可以快速创建新项目。 + +不过对于不熟悉这些工具的同学来说,不推荐使用这种方式创建项目,仅做了解即可。 + +下面分别演示 2 种工具创建新项目的方法。 + + + +#### 使用 Maven 创建项目 + +安装 Maven 后,使用以下命令创建 Spring Boot 项目(仅供参考): + +```shell +mvn archetype:generate \ + -DgroupId=com.example \ + -DartifactId=my-spring-boot-app \ + -DarchetypeArtifactId=maven-archetype-quickstart \ + -DinteractiveMode=false +``` + + +解释一下上面命令中的参数: + +- `-DgroupId`: 你的项目的组 ID +- `-DartifactId`: 你的项目的 Artifact ID +- `-DarchetypeArtifactId`: Maven 快速启动项目的模板 +- `-DinteractiveMode=false`: 禁用交互模式,使其自动创建项目 + + + +#### 使用 Gradle 创建项目 + +Gradle 的项目模板相比 Maven 来说少了一些。安装 Gradle 后,使用以下命令创建项目: + +```shell +gradle init +``` + + + +然后跟着操作提示输入选项,即可创建出不同的项目: + +![](https://pic.yupi.icu/1/1696910728917-3af539be-800f-461a-916f-029e150a9443.png) + +![](https://pic.yupi.icu/1/1696911159701-49e9bd37-4294-4365-91d1-b8a988ab442c.png) + + + +### 3、项目模板生成器 + +有很多专门用来创建初始化项目模板的工具和网站,这里分享其中 4 种: + + + +#### Spring Initializr + +Spring 官方的项目模板生成器,可以使用可视化界面来选择项目配置,并快速生成 Spring Boot 项目的初始代码。 + +> 指路:https://start.spring.io/ + + + +界面如下,还可以分享自己的配置给别人: + +![](https://pic.yupi.icu/1/1696911433077-59902ba9-42d5-4f0d-87d1-b009d3a9b262.png) + + + +不过 IDEA 开发工具内已经集成了 `Spring Initializr`,一般没必要专门在网站中使用。 + + + +#### 微服务模板生成器 + +阿里提供了一款云原生应用脚手架,如果你的项目需要用到 Spring Cloud Alibaba 组件,那么强烈建议使用该脚手架来创建项目,可以保证各组件依赖版本号的一致性。 + +> 指路:https://start.aliyun.com/ + + + +用法和 Spring Initializr 几乎完全一致,可以自己选择依赖: + +![](https://pic.yupi.icu/1/1696911677188-5f4046ae-d780-4e11-b04b-2ef269a1aa5e.png) + + + +#### JHipster + +专门用于生成 Java 项目的工具,模板和选项非常丰富。 + +> 指路:https://www.jhipster.tech/cn/ + + + +![](https://pic.yupi.icu/1/1696912132153-7e5c25b8-cc11-4ccc-bc8d-7dd5cf2197e8.png) + + + +JHipster 的功能还是很强大的,但只是创建初始化项目的话,用法非常简单,只需要输入 `jhipster` 命令: + +![](https://pic.yupi.icu/1/1696912086867-d652cac3-b81c-4c0a-b6ca-f33673b0682d.png) + +然后跟着命令行的提示输入选项即可: + +![](https://pic.yupi.icu/1/1696912231115-459e0b27-5a68-4cb2-91d8-6196db3a9dc7.png) + + + +#### Yeoman + +Yeoman 是一个生成项目模板的工具,通常用于前端项目的初始化。 + +虽然 Yeoman 主要用于前端开发,但也有一些 Java 项目的初始化模板。而且你可以编写自己的 Yeoman 生成器来生成 Java 代码或者任何其他类型的代码。 + +> 指路:https://yeoman.io/generators/ + + + +![](https://pic.yupi.icu/1/1696911915135-b3eb2368-28f8-4ae5-9e53-1f604e17597e.png) + + + +### 4、开源项目 + +除了生成项目外,我们也可以直接下载并使用 GitHub 上的开源项目代码,也就是直接用别人创建好的项目。 + +比较有名的有 Jeecg Boot: + +> 指路:https://github.com/jeecgboot/jeecg-boot + +![](https://pic.yupi.icu/1/1696912400972-7d2cddf0-7835-4c8b-bc12-bfe512fa7325.png) + + + +项目效果: + +![](https://pic.yupi.icu/1/1696912521645-578e68f7-0c5c-47fa-b4ff-e74fdf46935b.png) + + + +还有若依: + +> 指路:https://github.com/yangzongzhuan/RuoYi + + + +![](https://pic.yupi.icu/1/1696912457395-990f7637-8068-4799-bfd6-f9f55da8061b.png) + + + +项目效果: + +![](https://pic.yupi.icu/1/1696912486344-d7a1c5fa-264f-4493-99ca-b4038984ea33.png) + + + +这些项目一般都是大而全的、功能十分丰富的管理系统,对于企业来说会比较实用,但是对于编程学习者来说,不是很推荐,想要自定义开发一些额外的功能会比较麻烦。 + + + +------ + + + +除了以上方法外,最推荐的方法还是在学习和开发过程中,持续整理和沉淀一套属于自己的万用项目模板,企业中也通常都会有适应业务的基础建设代码。这样一来,绝大多数功能都不用重复写第 2 遍,以后开发新项目会越来越快。 + + + +## 实践 + +编程导航星球的用户中心项目使用了 IDEA 来创建 Spring Boot 项目,其他项目使用了鱼皮自己封装的 [Spring Boot 后端万用项目模板](https://yuyuanweb.feishu.cn/wiki/Nnu3wSBrri3umyk1StnctK0LnAd),OJ 判题项目使用了微服务模板生成器。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/Bean \346\213\267\350\264\235\344\271\213 MapStruct.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/Bean \346\213\267\350\264\235\344\271\213 MapStruct.md" new file mode 100644 index 0000000..0320a91 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/Bean \346\213\267\350\264\235\344\271\213 MapStruct.md" @@ -0,0 +1,417 @@ +# Bean 拷贝之 MapStruct + +> 作者:[顾恙ツ](https://juejin.cn/user/128017175944557),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 2784 + +> 大家好,今天我给大家带来一个 Bean 拷贝的高效工具,MapSrtuct 。有人会问 MapSturct 是什么?简单来说,MapStruct 就是一个 Java Bean 的映射器,我们只需要在一个 XXXStructMapper 的接口中定义好方法,MapStruct 就会在编译的时候生成相应的实现类,这个实现类中包含了具体的映射代码,极大地提高了我们编码的效率,省去了大量的模板代码。 + +## 传统写法带来的困扰 + +假如没有使用 MapStruct 的话,当我们需要把 DO 对象转成一个 DTO 对象时,我们需要这样做。 + +```java +public static ArticleDTO toDto(ArticleDO articleDO) { + if (articleDO == null) { + return null; + } + ArticleDTO articleDTO = new ArticleDTO(); + articleDTO.setAuthor(articleDO.getUserId()); + articleDTO.setArticleId(articleDO.getId()); + articleDTO.setArticleType(articleDO.getArticleType()); + articleDTO.setTitle(articleDO.getTitle()); + articleDTO.setShortTitle(articleDO.getShortTitle()); + articleDTO.setSummary(articleDO.getSummary()); + articleDTO.setCover(articleDO.getPicture()); + articleDTO.setSourceType(SourceTypeEnum.formCode(articleDO.getSource()).getDesc()); + articleDTO.setSourceUrl(articleDO.getSourceUrl()); + articleDTO.setStatus(articleDO.getStatus()); + articleDTO.setCreateTime(articleDO.getCreateTime().getTime()); + articleDTO.setLastUpdateTime(articleDO.getUpdateTime().getTime()); + articleDTO.setOfficalStat(articleDO.getOfficalStat()); + articleDTO.setToppingStat(articleDO.getToppingStat()); + articleDTO.setCreamStat(articleDO.getCreamStat()); + + // 设置类目id + articleDTO.setCategory(new CategoryDTO(articleDO.getCategoryId(), null)); + return articleDTO; +} +``` + +如果是需要批量进行转化的话,这个时候还需要遍历进行批量转化。 + +```java +public static List toArticleDtoList(List articleDOS) { + return articleDOS.stream().map(ArticleConverter::toDto).collect(Collectors.toList()); +} +``` + +这样的代码如果只是一个方法可能还好,但是如果写多了,你就会发现代码不是很优雅,而且每次写代码量还巨大,虽然有插件可以帮你写,但是感觉还是不好,这个时候,肯定有人会说用 BeanUtils,这个时候我会给你大大的一巴掌,主要是 BeeanUtils 其可能会踩一些坑,你可能把握不是很好,这里我找了一些关于 BeanUtils 的一些文章,感兴趣的同学可以一起看看:
Spring的BeanUtils.copyProperties()避坑指南:[https://juejin.cn/post/7012279747526787080](https://juejin.cn/post/7012279747526787080)
几个 BeanUtils 中的坑,千万别踩![https://cloud.tencent.com/developer/article/1522266](https://cloud.tencent.com/developer/article/1522266)
SpringBoot 整合mapstruct|赶紧丢掉BeanUtils吧:[https://juejin.cn/post/7035161765948162078](https://juejin.cn/post/7035161765948162078)
![](https://pic.yupi.icu/5563/202311081045996.jpeg) + +那有什么简单的解决方法,那就是我们今天的主角, MapStruct 了,接下来我们简单使用一下 MapStruct演示一下。 + +```java +@Mapper +public interface ArticleStructMapper { + ArticleStructMapper INSTANCE = Mappers.getMapper(ArticleStructMapper.class ); + + ArticleDTO toDTO(ArticleDO do); +} +``` + +定义了一个接口 ArticleStructMapper,该接口的主要作用是将 ArticleDO 对象转换为 ArticleDTO 对象。 + +让我们一步步地分析代码: + +> 1. [**@Mapper**](https://www.yuque.com/Mapper)**:** + +这是 MapStruct 的核心注解之一。它标记了这个接口为一个映射器,并告诉 MapStruct 的注解处理器在编译时为此接口生成实现。 + +> 2. **INSTANCE 常量** + +```java +ArticleStructMapper INSTANCE = Mappers.getMapper( ArticleStructMapper.class ); +``` + +Mappers.getMapper 是 MapStruct 提供的一个工具方法,用于在不使用 Spring 或其他依赖注入框架的情况下获取映射器的实例。 + +> 3. **toDTO 方法**: + +这个方法定义了一个转换。这个大家都懂,我就不做过多的赘述了。 + +## MapStruct 的用法 + +### 引入依赖 + +在 pom.xml 文件中引入 MapStruct 的 Maven 坐标,这里需要注意,引入 guava 的时候需要注意版本冲突问题,尽量引入大于 19.0 以上的版本,不然可能会报错。 + +```java + + + org.mapstruct + mapstruct + 1.5.5.Final + + + org.mapstruct + mapstruct-processor + 1.5.5.Final + +``` + +它们的作用如下: + +1. **org.mapstruct:mapstruct**: + +- MapStruct 的核心库。它提供了 MapStruct 所需的主要注解和工具方法,例如 @Mapper, @Mapping 等注解以及 Mappers.getMapper() 方法。 +- 在运行时,这个库是必需的,生成的映射代码会依赖它。 + +2. **org.mapstruct:mapstruct-processor**: + +- MapStruct 的注解处理器。它在编译时生成具体的映射实现代码。 +- compile 作用域,意味着它只在编译时被使用。 +- 当你编译一个使用了 MapStruct 注解的项目时,注解处理器会检测你的代码,然后为你的 @Mapper 注解的接口或抽象类生成实现。 + +### 定义映射器接口 + +像前面大家看到的 ArticleStructMapper 接口,我们稍微来一个复杂的。这里需要注意导入的 Mapper,是 MapStruct 的 Mapper ,而不是 MyBatis 下的 Mapper。 + +```java +@Mapper +public interface ColumnStructMapper { + ColumnStructMapper INSTANCE = Mappers.getMapper( ColumnStructMapper.class ); + + /** + * ColumnInfoDO to ColumnDTO + * @param columnInfoDO + * @return + */ + // sources 是参数,target 是目标 + @Mapping(source = "id", target = "columnId") + @Mapping(source = "columnName", target = "column") + @Mapping(source = "userId", target = "author") + // Date 转 Long + @Mapping(target = "publishTime", expression = "java(columnInfoDO.getPublishTime().getTime())") + @Mapping(target = "freeStartTime", expression = "java(columnInfoDO.getFreeStartTime().getTime())") + @Mapping(target = "freeEndTime", expression = "java(columnInfoDO.getFreeEndTime().getTime())") + ColumnDTO infotoDto(ColumnInfoDO columnInfoDO); + + List infoToDtos(List columnInfoDOs); + + @Mapping(source = "column", target = "columnName") + @Mapping(source = "author", target = "userId") + // Long 转 Date + @Mapping(target = "freeStartTime", expression = "java(new java.util.Date(req.getFreeStartTime()))") + @Mapping(target = "freeEndTime", expression = "java(new java.util.Date(req.getFreeEndTime()))") + ColumnInfoDO toDo(ColumnReq req); +} +``` + +这段代码定义了如何在 ColumnInfoDO 和 ColumnDTO 之间转换,以及如何从 ColumnReq 转换到 ColumnInfoDO。我将为你分析其每一部分: + +1. **infotoDto 方法** + +- 使用 @Mapping 注解来指定属性映射规则。例如,将 ColumnInfoDO 的 id 属性映射到 ColumnDTO 的 columnId 属性。 +- 使用 expression 属性来定义更复杂的属性转换,例如从 Date 对象获取时间戳。 + +2. **infoToDtos 方法** + +显示了 MapStruct 如何轻松地转换对象列表。此方法将 List\ 转换为 List\。因为单个对象的映射已经在 infotoDto 方法中定义,所以这里不需要额外的注解。 + +3. **toDo 方法** + +对于 freeStartTime 和 freeEndTime,因为它们在 ColumnReq 中是 Long 类型的时间戳,而在ColumnInfoDO 中是 Date 类型,所以使用了 expression 属性进行转换。 + +### [@Mapping](https://www.yuque.com/Mapping) 注解 + +这里重点说一下 @Mapping 注解,当两个对象中的字段名或者字段类型不一致的时候,就需要该注解来进行转换。 + +换句话说,如果对象的字段名/类型完全一样,就完全不需要该注解,Mapstruct 会自动拷贝。 + +比如说 SimpleSource 和 SimpleDestination 的字段名和类型完全一样: + +```java +public class SimpleSource { + private String name; + private String description; + // getters and setters +} + +public class SimpleDestination { + private String name; + private String description; + // getters and setters +} +``` + +就只需要定义映射器 SimpleSourceDestinationMapper 就行了。 + +```java +@Mapper +public interface SimpleSourceDestinationMapper { + SimpleSourceDestinationMapper INSTANCE = Mappers.getMapper(SimpleSourceDestinationMapper.class); + SimpleDestination sourceToDestination(SimpleSource source); + SimpleSource destinationToSource(SimpleDestination destination); +} +``` + +用的时候,可以这样 SimpleSourceDestinationMapper.INSTANCE 进行转换。 + +```java +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = QuickForumApplication.class) +public class SimpleSourceDestinationMapperIntegrationTest { + + @Test + public void givenSourceToDestination_whenMaps_thenCorrect() { + SimpleSource simpleSource = new SimpleSource(); + simpleSource.setName("沉默王二"); + simpleSource.setDescription("是条狗"); + SimpleDestination destination = SimpleSourceDestinationMapper.INSTANCE.sourceToDestination(simpleSource); + assertEquals(simpleSource.getName(), destination.getName()); + assertEquals(simpleSource.getDescription(), destination.getDescription()); + } +} +``` + +OK,回到 [@Mapping](https://www.yuque.com/Mapping) 注解。 + +@Mapping 是 MapStruct 中用于定义字段之间映射规则的注解。它非常灵活,能够处理各种复杂的映射情况。以下是 @Mapping 的一些常见用法: + +1. **基本映射**: + +通过指定 source 和 target 来映射源对象的属性到目标对象的属性。 + +```java +@Mapping(source = "name", target = "fullName") +``` + +这将源对象的 name 属性映射到目标对象的 fullName 属性。 + +2. **常量映射** + +可以将目标字段设置为固定的常量值。 + +```java +@Mapping(target = "status", constant = "ACTIVE") +``` + +这会将目标对象的 status 属性设置为 "ACTIVE"。 + +3. **默认值** + +当源属性为 null 时,可以为目标属性设置默认值。 + +```java +@Mapping(source = "count", target = "total", defaultValue = "0") +``` + +如果 count 为 null,则 total 将被设置为 "0"。 + +4. **表达式** + +对于需要更复杂的转换逻辑,可以使用 Java 表达式。 + +```java +@Mapping(target = "timestamp", expression = "java(source.getDate().getTime())") +``` + +5. **日期格式** + +对于日期和字符串之间的映射,可以指定日期格式。 + +```java +@Mapping(source = "date", target = "formattedDate", dateFormat = "yyyy-MM-dd") +``` + +这会将 Date 对象转换为 "yyyy-MM-dd" 格式的字符串。 + +6. **条件映射** + +使用 qualifiedByName 或 qualifiedBy 来指定一个条件方法或注解,这些方法/注解决定是否应该进行映射。 + +```java +@Mapping(source = "value", target = "data", qualifiedByName = "specialConverter") +``` + +这里,映射会使用名为 specialConverter 的方法进行。 + +7. **嵌套映射** + +当处理嵌套对象时,可以使用点表示法。 + +```java +@Mapping(source = "address.street", target = "streetName") +``` + +这会将源对象中的 address 对象的 street 属性映射到目标对象的 streetName 属性。 + +8. **忽略映射** + +在某些情况下,可能不希望特定的属性被映射,可以使用 ignore。 + +```java +@Mapping(target = "internalId", ignore = true) +``` + +这会确保目标对象的 internalId 属性不被设置。 + +9. **使用自定义映射方法** + +可以指定自定义方法来进行映射。 + +```java +@Mapping(target = "data", source = "value", qualifiedByName = "customMethod") +``` + +### Spring 依赖注入 + +截止到目前为止,我们一直在使用 Mappers.getMapper 来获取映射器 INSTANCE。 + +```java +ColumnStructMapper INSTANCE = Mappers.getMapper( ColumnStructMapper.class); +``` + + +如果是在 Spring 环境下,还可以在 [@Mapper](https://www.yuque.com/Mapper) 注解中添加 componentModel = "spring" 参数来告诉 MapStruct 在生成映射实现类的时候,提供 Spring 依赖注入。 + +```java +@Mapper(componentModel = "spring") +public interface ColumnStructMapper {} +``` + + +这样我们在使用映射器的时候,可以直接通过 @Autowired 注解来注入 ColumnStructMapper 对象,然后就可以直接这样使用。 + +```java +@Autowired +private ColumnStructMapper columnStructMapper; +ColumnInfoDO columnInfoDO = columnStructMapper.toDo(req); +``` + +这样就不需要在映射器接口中添加 INSTANCE 了。 + +## MapStruct 插件 + +如果你在 Intellij IDEA 中安装 MapStruct 插件的话,直接在插件市场搜 MapStruct 关键字就可以了。 + +![](https://pic.yupi.icu/5563/202311081048480.png) + +安装完成后,可以直接在 [@Mapper](https://www.yuque.com/Mapper) 接口和它的实现类之间快速导航。 + +![](https://pic.yupi.icu/5563/202311081048118.png) + +比如说点击上图中的跳转小图标,就可以直接到实现类。 + +![](https://pic.yupi.icu/5563/202311081048973.png) + +## **MapStruct 的背后原理** + +Java 程序执行的过程,是由编译器先把 java 文件编译成 class 字节码文件,然后由 JVM 去解释执行 class 文件。 + +Mapstruct 正是在 java 文件到 class 这一步帮我们实现了转换方法,即做了预处理,提前编译好文件,用过 lombok 的小伙伴一定能理解其好处。 + +首先我们来看最简单的 SimpleSourceDestinationMapper,它是这样定义的。 + +```java +@Mapper +public interface SimpleSourceDestinationMapper { + SimpleSourceDestinationMapper INSTANCE = Mappers.getMapper(SimpleSourceDestinationMapper.class); + + SimpleDestination sourceToDestination(SimpleSource source); + + SimpleSource destinationToSource(SimpleDestination destination); +} +``` + +
其在编译后会生成两个文件 SimpleSourceDestinationMapper 和 SimpleSourceDestinationMapperImpl。 + +![](https://pic.yupi.icu/5563/202311081049390.png) + +通过终端可以看到 class 文件的后缀。 + +![](https://pic.yupi.icu/5563/202311081049134.png) + +OK,我们直接来看 class 文件的内容,当然是反编译后的,Intellij IDEA 可以直接打开,先是 SimpleSourceDestinationMapper。 + +![](https://pic.yupi.icu/5563/202311081049183.png) + +再来看实现类 SimpleSourceDestinationMapperImpl,我们直接贴反编译后的代码。 + +```java +public class SimpleSourceDestinationMapperImpl implements SimpleSourceDestinationMapper { + public SimpleSourceDestinationMapperImpl() { + } + + public SimpleDestination sourceToDestination(SimpleSource source) { + if (source == null) { + return null; + } else { + SimpleDestination simpleDestination = new SimpleDestination(); + simpleDestination.setName(source.getName()); + simpleDestination.setDescription(source.getDescription()); + return simpleDestination; + } + } + + public SimpleSource destinationToSource(SimpleDestination destination) { + if (destination == null) { + return null; + } else { + SimpleSource simpleSource = new SimpleSource(); + simpleSource.setName(destination.getName()); + simpleSource.setDescription(destination.getDescription()); + return simpleSource; + } + } +} +``` + +其实内容和我们直接去写 Converter 是一样的,通过 new 创建一个对象,然后通过 set 方法进行赋值。 + +如果是 @Mapper(componentModel = "spring") 的话,在生成的时候,会带上 [@Component](https://www.yuque.com/Component) 注解。
![](https://pic.yupi.icu/5563/202311081050327.png) + +> 使用 [**@Component**](https://www.yuque.com/Component) 注解的类将会在 Spring 的组件扫描期间被检测并注册到 ApplicationContext 中,从而使其成为一个 Spring Bean。 + + +这也是为什么我们可以直接通过 [@Autowired](https://www.yuque.com/Autowired) 注解获得映射器对象的原因。 + +由于 MapStruct 并不是在运行时使用 Java 反射来实现对象之间的映射,而是在编译时生成明确、简单、易于跟踪的普通 Java 代码。这意味着它的执行速度更快,因为没有运行时的反射开销,并且可以避免与反射相关的各种问题。 diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/Git \346\217\220\344\272\244\347\253\237\347\204\266\350\277\230\350\203\275\350\277\231\344\271\210\347\224\250\357\274\237.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/Git \346\217\220\344\272\244\347\253\237\347\204\266\350\277\230\350\203\275\350\277\231\344\271\210\347\224\250\357\274\237.md" new file mode 100644 index 0000000..5d2737e --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/Git \346\217\220\344\272\244\347\253\237\347\204\266\350\277\230\350\203\275\350\277\231\344\271\210\347\224\250\357\274\237.md" @@ -0,0 +1,176 @@ +# Git 提交竟然还能这么用? + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +大家好,我是鱼皮。Git 是主流的代码版本控制系统,是团队协作开发中必不可少的工具。 + +之前已经给大家分享过 Git / GitHub 的学习指南,感兴趣的同学可以先看视频了解:[https://www.bilibili.com/video/BV1KZ4y1e7cG](https://www.bilibili.com/video/BV1KZ4y1e7cG)。 + +这篇文章,主要是给大家分享 Git 的核心功能 `提交`(Commit)的作用,帮助大家更好地利用 Git 这一工具来提高自己的开发工作效率。 + + + +## 什么是 Git 提交? + +Git 提交是指将你的代码保存到 Git 本地存储库,就像用 Word 写长篇论文时进行保存文件一样。每次 Git 提交时都会创建一个唯一的版本,除了记录本次新增或发生修改的代码外,还可以包含提交信息,来概括自己这次提交的改动内容。 + +如下图,就是一次 Git 提交: + +![](https://pic.yupi.icu/1/1698386167354-03b333b6-a0db-4683-a7ad-a3f088786e92.png) + + + +## Git 提交的作用 + +Git 提交有很多作用,我将它分为 **基础用法** 和 **其他妙用** 。 + + + +### 基本作用 + +#### 历史记录 + +Git 提交最基本的作用就是维护项目的历史记录。每次提交都会记录代码库的状态,包括文件的添加、修改和删除;还包括一些提交信息,比如提交时间、描述等。这使得我们可以通过查看所有的历史提交来追溯项目的开发进度和历程,了解每个提交中都发生了什么变化。 + +比如查看我们编程导航文档网站项目的提交记录,能看到我是怎么一步一步构建出这个文档网站的: + +> 开源地址:[https://github.com/liyupi/code-xingqiu](https://github.com/liyupi/code-xingqiu) + +![](https://pic.yupi.icu/1/1698386560903-9cf1f805-8b8b-4132-aa42-e321c366a458.png) + + + +在企业开发中,如果一个人写了 Bug,还死不承认,那么就可以搬出 Git 提交记录,每一行代码是谁提交的都能很快地查出来,谨防甩锅! + + + +#### 版本控制 + +另一个 Git 提交的基本作用是版本控制。每个提交都代表了代码库的一个版本,这意味着开发者可以随时切换代码版本进行开发,恢复旧版本的代码、或者撤销某次提交的代码改动。 + +推荐新手使用可视化工具而不是 Git 命令进行版本的切换和撤销提交,在不了解 Git 工作机制的情况下使用命令操作很容易出现问题。 + +如下图,在 JetBrains 系列开发工具中,右键某个提交,就可以切换版本或撤销提交了: + +![](https://pic.yupi.icu/1/1698386927568-f731adf9-8ffb-4383-af36-72acd7405f26.png) + + + +#### 代码对比 + +你可以轻松地查看两个提交之间的所有代码更改,便于快速了解哪些部分发生了变化。这对于解决代码冲突、查找错误或审查代码非常有帮助。 + +在 JetBrains 系列开发工具中,只需要选中 2 个提交,然后点右键,选择 `Compare Versions` 就能实现代码对比了: + +![](https://pic.yupi.icu/1/1698387206540-7383bf4f-9f52-4d7c-b336-595691eda6ba.png) + +改动了哪些代码一目了然: + +![](https://pic.yupi.icu/1/1698387236268-d956dd21-5ad1-4439-ae62-a145291b7f07.png) + +一般情况下,如果我们因为某次代码改动导致项目出现了新的 Bug。通过这种方式对比本次改动的所有代码,很快就能发现 Bug 出现的原因了。 + + + +### 其他妙用 + +除了基本作用外,Git 提交还有一些妙用~ + + + +#### 记录信息 + +像上面提到的,Git 提交不仅能用于记录代码更改,我们还可以在提交信息中包含有关这次更改的重要信息。比如本次改动代码的介绍、代码更改的原因、相关的任务(需求单)或功能等。可以简单理解为给本次工作写总结和描述。 + +如果提交信息编写得非常清晰完善,那么项目的团队成员可以更容易地理解每个提交,甚至能做到 “提交即文档”,提高协作和项目维护效率。 + +正因如此,很多团队会定制自己的提交信息规范,比如之前我在鹅厂的时候,每次提交都建议带上需求单的地址,便于了解这次提交是为了完成什么需求。 + +这里给大家推荐一种很常用的提交信息规范 —— 约定式提交,每次提交信息都需要遵循以下的结构: + +> 《约定式提交》文档:[https://www.conventionalcommits.org/zh-hans/v1.0.0/](https://www.conventionalcommits.org/zh-hans/v1.0.0/) + + + +```plain +<类型>[可选 范围]: <描述> + +[可选 正文] + +[可选 脚注] +``` + + + +![](https://pic.yupi.icu/1/1698387672503-53057f93-7a85-4282-8745-f2d88d697a5a.png) + + + +当然,这种方式有利有弊,可能有同学会觉得 “我注释都懒得写,你还让我写提交信息?” 这取决于你们项目的规模和紧急程度等因素,反正团队内部保持一致就好。 + + + +像我在用 Git 开发个人项目时,也不是每次都写很详细的提交信息的。但是带 [编程导航](https://mp.weixin.qq.com/s/eNjauC-3361z-l7fy3VssA) 的同学从 0 开发项目时,每场直播写的代码都会单独作为一次提交,如下图: + +![](https://pic.yupi.icu/1/1698387871191-d4108f32-e3fc-415e-8ca1-3f722dd39292.png) + + + +是不是很清晰呢?这样做的好处是,大家想获取某场直播对应的中间代码(而不是最终的成品代码)时,只需要点击某次提交记录就可以获取到了,很方便。 + +![](https://pic.yupi.icu/1/1698388047321-47d47a3d-f979-4054-b721-5541323e1879.png) + + + +如果你的提交信息写得非常标准、统一结构,那么甚至还可以用程序自动读取所有的提交信息,生成日志、或者输出提交报告。 + + + +#### 自动化构建部署 + +大厂研发流程中,一般都是使用 CI / CD(持续集成和持续部署)平台,以流水线的形式自动构建部署项目的。 + +Git 提交可以和 CI / CD 平台进行集成,比如自动监视代码库中的提交,并在每次提交后自动触发构建和部署任务。一个典型的使用场景是,每次代码开发完成后,先提交代码到测试分支,然后 CI / CD 平台监测到本次提交,并立即在测试环境中构建和部署,而不需要人工操作,从而提交效率。 + +GitHub Actions 和 GitHub Webhooks 都可以实现上述功能,感兴趣的同学可以尝试下。 + +> GitHub Actions 文档教程:[https://docs.github.com/zh/actions/quickstart](https://docs.github.com/zh/actions/quickstart) + + + +![](https://pic.yupi.icu/1/1698388468389-03cf84de-f56a-4a8a-ace1-ea1531ba08a9.png) + + + +#### 检验项目真假 + +最后这个点就比较独特了,那就是面试官可以通过查看 Git 的提交记录来判断你的项目真假、是不是自己做的。 + +比如我收到一些同学的简历中,有的开源项目看起来感觉很厉害,但是点进仓库看了下提交记录,发现寥寥无几,甚至有的只有 1 次!像下图这样: + +![](https://pic.yupi.icu/1/1698388718653-20a58e8b-2336-4867-9874-37566b08c145.png) + + + +那么这个项目真的是他自己从 0 开始做的么?答案就显而易见了。 + +如果真的是你自己用心做的项目,提交记录绝对不止 1 次,而且面试官能够通过提交记录很清晰地了解到你的项目开发周期。 + +像我的 yuindex Web 终端项目一样,这才是比较真实、有说服力的: + +![](https://pic.yupi.icu/1/1698388825722-92cdc9c8-8b15-4eb6-a7b2-0f8652cf10c4.png) + + + +其他人也能从你的提交记录中,感受到你对项目的用心程度。 + +讲到这里,是不是有些同学恍然大悟,知道为啥自己的项目明明开源了,但是没有收到面试邀请、或者被面试官觉得项目不真实了? + + + +## 实践 + +以上就是本次分享,Git 提交的实践其实非常简单,我建议大家每次做新项目时,无论大小,都用 Git 来托管你的项目,并且每开发完一个功能或解决 Bug,都进行一次提交。等项目完成后回过头来看这些提交记录,都是自己宝贵的财富。 diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/Maven \344\270\255\345\244\256\344\273\223\345\272\223\345\217\221\345\214\205\346\265\201\347\250\213.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/Maven \344\270\255\345\244\256\344\273\223\345\272\223\345\217\221\345\214\205\346\265\201\347\250\213.md" new file mode 100644 index 0000000..793ead8 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/Maven \344\270\255\345\244\256\344\273\223\345\272\223\345\217\221\345\214\205\346\265\201\347\250\213.md" @@ -0,0 +1,182 @@ +# Maven 中央仓库发包流程 + +> 作者:[心比天高,](https://blog.csdn.net/weixin_52258854),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 452 + +> 官方文档:[https://central.sonatype.org/publish/publish-maven/#a-complete-example-pom](https://central.sonatype.org/publish/publish-maven/#a-complete-example-pom) + +### 整体流程 + +1. 注册 Jira Software +2. 新建问题 +3. 完成域名所有权的验证 +4. 配置 gpg 密钥 +5. 配置 setting.xml +6. 配置 pom.xml +7. 上传 +### 具体操作 + +1. 注册 Jira Software :![](https://pic.yupi.icu/5563/202311062035772.png) +2. 新建申请:[https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134](https://issues.sonatype.org/secure/CreateIssue.jspa?issuetype=21&pid=10134) + - 前两个默认值没有必要改动 + - Group Id 填域名或 io.github.用户名(后续验证会验证域名或 GitHub 账号的所有权) + - Project URL 和 SCM url 按照实例填 + - Username(s) 指能够向这个 Group Id 发包的 jira 用户 + - ![](https://pic.yupi.icu/5563/202311062036925.png) +3. 查看新建的申请并等待审核(一般5-10分钟)![](https://pic.yupi.icu/5563/202311062036134.png)然后官方的机器人会给一个评论让我们完成验证![](https://pic.yupi.icu/5563/202311062036048.png)根据评论的提示,如果我们的 Group Id 是域名,则需要给域名添加一条解析记录;如果是 GitHub 的话,则需要创建一个新的仓库来完成验证;做完之后将问题调整为开放状态等待审核(因为我这里是已经完成了,所以是已解决状态)![](https://pic.yupi.icu/5563/202311062036309.png)审核成功之后会有如下评论![](https://pic.yupi.icu/5563/202311062036886.png) +4. [下载](https://www.gnupg.org/download/index.html) GPG 工具,在命令行执行 gpg --gen-key** **命令,按照指示(会要求输入私钥,需保存)生成密钥对。gpg --list-keys 命令可以查看已生成的密钥对。通过 gpg --keyserver keyserver.ubuntu.com --send-keys 公钥 命令将密钥对发到服务器,供后面验证使用![](https://pic.yupi.icu/5563/202311062036219.png) +5. 配置 Maven 的 setting.xml 文件。在 servers 里添加一个 server 块,内容如下: +```xml + + ossrh + jira 账号 + jira 密码 + +``` + +6. 配置项目的 pom.xml 文件,这里主要是添加了一些插件,测试通过的示例 pom 文件如下。注意:包的 GAV 坐标里的 groupId 一定要跟上面在 jira 申请问题时填写的 Group Id 保持一致,否则无法上传成功 +```xml + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.2 + + + + ... + ... + ... + ... + + 1.8 + UTF-8 + UTF-8 + UTF-8 + + + ... + + + + + + ossrh + https://s01.oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://s01.oss.sonatype.org/ + 20 + true + + + + org.apache.maven.plugins + maven-source-plugin + 2.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + -Xdoclint:none + + + + + attach-javadocs + + jar + + + + + + + + + + BSD 3-Clause + https://spdx.org/licenses/BSD-3-Clause.html + + + + ... + ... + + + + ... + ... + + Developer + + +8 + + + + + +``` + +7. 上传包 + +![](https://pic.yupi.icu/5563/202311062036072.png) +构建成功之后可以先查一下是否发布成功(用 jira 账号登录):[https://s01.oss.sonatype.org/#stagingRepositories](https://s01.oss.sonatype.org/#stagingRepositories)![](https://pic.yupi.icu/5563/202311062037187.png) +成功之后在 jira 创建的问题里会有评论(会有一定延迟),如下图:![](https://pic.yupi.icu/5563/202311062037706.png) + +8. 到这里就完成了,接下来等着其他各大仓库自动同步(网上说4h,但我实际测试用了接近7h)就可以了。[Maven 中央仓库](https://central.sonatype.com/search?smo=true)首先可以查到(这个很快,半小时内就可以查到了),然后是我们熟知的[https://mvnrepository.com/](https://mvnrepository.com/)和其他仓库 diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/Nacos \351\205\215\347\275\256\344\270\255\345\277\203\346\220\255\345\273\272.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/Nacos \351\205\215\347\275\256\344\270\255\345\277\203\346\220\255\345\273\272.md" new file mode 100644 index 0000000..4d8bfd3 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/Nacos \351\205\215\347\275\256\344\270\255\345\277\203\346\220\255\345\273\272.md" @@ -0,0 +1,169 @@ +# Nacos 配置中心搭建 + +> 作者:[心比天高,](https://blog.csdn.net/weixin_52258854),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 452 + +> 官方文档:[https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html](https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html) + +### 版本选择 +![](https://pic.yupi.icu/5563/202311062040531.png)(2023.07.06) +### 搭建 + +1. 下载并解压,下载地址:[https://github.com/alibaba/nacos/releases?page=2](https://github.com/alibaba/nacos/releases?page=2) +2. 单机启动命令: +```bash +sh startup.sh -m standalone +``` + +3. 查看日志确定是否启动成功 +```bash +tail -n 5 /Users/wangzhihao/dev_tools/nacos/logs/start.out +``` +![](https://pic.yupi.icu/5563/202311062041705.png) +### SpringBoot 中使用 +#### 依赖 +```xml + + org.springframework.cloud + spring-cloud-starter-bootstrap + 3.1.3 + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.12 + +``` +#### 配置 +```yaml +nacos: + config: + server-addr: 127.0.0.1:8848 + auto-refresh: true + group: DEFAULT_GROUP + username: nacos + password: nacos + namespace: projectName +``` +tip:nacos.config.bootstrap.enable 为 true 时,才能从 nacos 读取启动配置 如 端口号 等 +#### 使用 + +1. 通过 @NacosConfigListener(dataId = "") 监听指定配置文件的变化 +```java +@NacosConfigListener(dataId = "nacos-test-config") +public void onChange(String config) { +try { + vipConfigList = JSONUtil.toList(config, VipConfig.class); +} catch (Exception e) { + throw new RuntimeException(e); +} +} +``` +nacos-test-config: +```json +[ + { + "role": "ban", + "addLeftNum": 0, + "maxLeftNum": 10, + "maxChatUserNum": 12, + "messageRetainDay": 0, + "downloadDrawPictureCost": 100 + }, + { + "role": "user", + "addLeftNum": 50, + "maxLeftNum": 100, + "maxChatUserNum": 2, + "messageRetainDay": 7, + "downloadDrawPictureCost": 5 + }, + { + "role": "vip", + "addLeftNum": 100, + "maxLeftNum": 1000, + "maxChatUserNum": 10, + "messageRetainDay": 30, + "downloadDrawPictureCost": 0, + "drawMode": "fast" + }, + { + "role": "svip", + "addLeftNum": 200, + "maxLeftNum": 3000, + "maxChatUserNum": 20, + "messageRetainDay": 90, + "downloadDrawPictureCost": 0, + "modelMaxTokens": 4096, + "drawMode": "fast" + }, + { + "role": "admin", + "addLeftNum": 200, + "maxLeftNum": 3000, + "maxChatUserNum": 20, + "messageRetainDay": 90, + "downloadDrawPictureCost": 0, + "drawMode": "fast" + } +] + +``` + +2. @NacosInjected ,可注入 ConfigService (在程序中控制更改或拉取配置及其他操作,类似于配置中心的操作客户端) 或 NamingService +```java +@NacosInjected +private ConfigService configService; + +@PostConstruct +public void initVipConfig() { + try { + String content = configService.getConfig(dataId, groupId, 5000); + vipConfigList = JSONUtil.toList(content, VipConfig.class); + } catch (NacosException e) { + e.printStackTrace(); + } +} +``` +#### 接入 MySQL +Nacos 内置了 derby 嵌入式数据库,每启动一个 Nacos 就会有一个数据库,而我们在使用 Nacos 时往往都是集群,使用 derby 数据不能互通会很麻烦。所以我们需要一个外部的统一的数据库,Nacos 在 0.7 版本增加了支持 [mysql](https://cloud.tencent.com/product/cdb?from=20065&from_column=20065) 数据源的能力。 +~~如果 Nacos 在单机环境下运行,则没有必要替换为 MySQL 。~~(后期数据不好迁移) +替换文档:[https://nacos.io/zh-cn/docs/deployment.html](https://nacos.io/zh-cn/docs/deployment.html) +![](https://pic.yupi.icu/5563/202311062041853.png) + +#### 认证 +> 文档:[https://nacos.io/zh-cn/docs/auth.html](https://nacos.io/zh-cn/docs/auth.html) +> 注意 +> - Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。 +> - Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。 +> - 如果运行在不可信的网络环境或者有强鉴权诉求,请参考官方简单实现做替换增强。 + +![](https://pic.yupi.icu/5563/202311062041400.png) +### SpringCloud 中使用 +#### 依赖 +```xml + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + ${cloud.alibaba} + + + org.springframework.cloud + spring-cloud-starter-bootstrap + 3.0.3 + + + org.springframework.boot + spring-boot-starter-actuator + +``` +#### 配置( bootstrap.yml ) +```yaml +spring: + cloud: + nacos: + config: + server-addr: 127.0.0.8848 + namespace: cloud + application: + name: cloud-nacos +``` diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/README.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/README.md" new file mode 100644 index 0000000..bece776 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/README.md" @@ -0,0 +1,56 @@ +# 编程导航知识碎片 + +> 本文作者:程序员鱼皮 +> 本站地址:https://codefather.cn + +## 介绍 + +知识碎片:简单易学、实用重要、可灵活复用的编程小知识 + +目的: + +1. 通过简单的分享,帮助大家快速学习或复习巩固项目开发中的重点知识,便于把控学习进度、并且持续加深印象。 +2. 打造由编程导航主导、星球同学 **共建** 的开源编程知识大百科项目,帮助到更多同学,并提高个人和编程导航的影响力,是一件有长期价值的事情。 + +鱼皮已经整理了带大家做过的每个项目的知识碎片(130 多个,具体内容持续更新中),即使现在还没有做过任何项目,也可以学习。学完后再做 [编程导航星球项目](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd),效果翻倍! + +欢迎大家 [点此贡献知识碎片](https://yuyuanweb.feishu.cn/docx/I0rkd4p4foQe0dxZ6z4cAtcKnuc#CIi3dqfucobQzNxk6VqcOdCBn4e),帮助自己复习,并获得奖励 🎁 + + +## 如何参与贡献? + +### 提交知识碎片 + +只需填写收集表即可:https://docs.qq.com/form/page/DQkdHTGFLQmJjV3VU + +审核通过后,编程导航官方会将内容进行同步和整理,定期公示贡献表并发放奖励。 + +> 大家之前写过的文章都可以参与贡献哦~ + + + +### 审核标准 + +1. 内容要完整,专注于某个小知识点,而不是大而全的课程、项目笔记 +2. 最好有一些自己的经验心得,区别于机械的内容 +3. 不能抄袭、AI 生成、复制网上的百科,需要保证原创 +4. 不要添加学习无关的引流信息,保证内容的纯净 + + + +## 贡献奖励 + +1)文章版权为作者本人所有,我们会在知识库文章中注明原作者,可以添加个人主页链接来增加你的人气。比如: + +> 作者:[程序员鱼皮](https://space.bilibili.com/12890453/),[编程导航星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 编号 1 + +2)**每月定时** 收录知识碎片并发放奖励,对于符合要求的知识碎片分享,奖励作者: + +- 🧧 现金红包:每篇 5 - 100 元不等(根据内容质量决定) +- ⭐️ [编程之星](https://yuyuanweb.feishu.cn/docx/RUdmdj9aaorDGOxnXObcKVBtnBb):每成功贡献 3 篇文章,获取 1 颗编程之星 + +3)优质的分享可能会在公众号程序员鱼皮中进行转发曝光,增加作者人气,并获得更多奖励~ + +4)每一次贡献都是在为编程导航知识大百科项目做贡献(相当于做了开源),对于优秀的贡献者,我们会在开源项目和网站中重点鸣谢,且后续有更多的合作机会甚至分红。 + +感谢您的阅读和参与! diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/RESTful \346\216\245\345\217\243\345\256\236\347\216\260\344\270\216\346\265\213\350\257\225( Spring Boot ).md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/RESTful \346\216\245\345\217\243\345\256\236\347\216\260\344\270\216\346\265\213\350\257\225( Spring Boot ).md" new file mode 100644 index 0000000..d5076ca --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/RESTful \346\216\245\345\217\243\345\256\236\347\216\260\344\270\216\346\265\213\350\257\225( Spring Boot ).md" @@ -0,0 +1,1071 @@ +# RESTful 接口实现与测试( Spring Boot ) + +> 作者:[无题.](https://wx.zsxq.com/dweb2/index/footprint/418844844821828),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 4838 + +本文将教你彻底理解如何使用spring boot开发一个RESTful接口与如何进行接口测试 + +# 是什么? + +**RESTful是基于http方法的API设计风格,而不是一种新的技术** + +1. 看Url就知道要什么资源 +2. 看http method就知道针对资源干什么 +3. 看http status code就知道结果如何 + +**REST 通过 URI 暴露资源时,会强调不要在 URI 中出现动词** + +# 设计风格 + +关于HTTP RESTful风格API设计的更多例子,参考:http://httpbin.org/ + +# HTTP协议四种传参方式 + +| HTTP协议组成 | 协议内容示例 | 对应Spring注解 | +| -------------------- | ------------------------------------------------ | -------------- | +| path info传参 | /articles/12 (查询id为12的文章,12是参数) | @PathVariable | +| URL Query String传参 | /articles?id=12 | @RequestParam | +| Body 传参 | Content-Type: multipart/form-data | @RequestParam | +| Body 传参 | Content-Type: application/json,或其他自定义格式 | @RequestBody | +| Headers 传参 | | @RequestHeader | + +# 常用注解 + +### @RequestBody与@ResponseBody + +```Java +//注意并不要求@RequestBody与@ResponseBody成对使用。 +public @ResponseBody AjaxResponse saveArticle(@RequestBody ArticleVO article) +``` + +如上代码所示: + +- @RequestBody修饰请求参数,注解用于接收HTTP的body,默认是使用JSON的格式 +- @ResponseBody修饰返回值,注解用于在HTTP的body中携带响应数据,默认是使用JSON的格式。如果不加该注解,spring响应字符串类型,是跳转到模板页面或jsp页面的开发模式。说白了:加上这个注解你开发的是一个数据接口,不加这个注解你开发的是一个页面跳转控制器。 + +在使用@ResponseBody注解之后程序不会再走视图解析器,也就不再做html视图渲染,而是直接将对象以数据的形式(默认JSON)返回给请求发送者。那么我们有一个问题:如果我们想接收或XML数据该怎么办?我们想响应excel的数据格式该怎么办? + +### @RequestMapping注解 + +用于标注HTTP服务端点。它的很多属性对于丰富我们的应用开发方式方法,都有很重要的作用。如: + +- value: 应用请求端点,最核心的属性,用于标志请求处理方法的唯一性; +- method: HTTP协议的method类型, 如:GET、POST、PUT、DELETE等; +- consumes: HTTP协议请求内容的数据类型(Content-Type),例如application/json, text/html; +- produces: HTTP协议响应内容的数据类型。下文会详细讲解。 +- params: HTTP请求中必须包含某些参数值的时候,才允许被注解标注的方法处理请求。 +- headers: HTTP请求中必须包含某些指定的header值,才允许被注解标注的方法处理请求。 + +![image-20231104190556172](https://pic.yupi.icu/5563/image-20231104190556172.png) + +### @RestController与@Controller + +@Controller注解是开发中最常使用的注解,它的作用有两层含义: + +- 一是告诉Spring,**被该注解标注的类是一个Spring的Bean**,需要被注入到Spring的上下文环境中。 +- 二是该类里面所有被RequestMapping标注的注解都是HTTP服务端点。 + +@RestController相当于 @Controller和@ResponseBody结合。它有两层含义: + +- 一是作为Controller的作用,将控制器类注入到Spring上下文环境,该类RequestMapping标注方法为HTTP服务端点。 +- 二是作为ResponseBody的作用,**请求响应默认使用的序列化方式是JSON**,而不是跳转到jsp或模板页面。 + +### @PathVariable 与@RequestParam + +- PathVariable**用于URI上的{参数}**,如下方法用于删除一篇文章,其中id为文章id。如:我们的请求URL为“/article/1”,那么将匹配DeleteMapping并且PathVariable接收参数id=1。 +- RequestParam用于**接收普通表单方式或者ajax模拟表单提交的参数数据。**如果使用了这个注解,但是前端没有传入参数,就会报错 + +```Java +@DeleteMapping("/article/{id}") +public @ResponseBody AjaxResponse deleteArticle(@PathVariable Long id) {} + +@PostMapping("/article") +public @ResponseBody AjaxResponse deleteArticle(@RequestParam Long id) {} +``` + +![image-20231104190632522](https://pic.yupi.icu/5563/image-20231104190632522.png) + +# 接受复杂嵌套对象参数 + +**RequestBody注解**的真正意义在于能够使用对象或者嵌套对象接收前端数据。 + +一个paramData对象里面包含了一个bestFriend对象。这种数据结构使用RequestParam就无法接收了,RequestParam只能接收平面的、一对一的参数。像上文中这种数据结构的参数,就需要我们在java服务端定义两个类,一个类是ParamData,一个类是BestFriend + +```Java +public class ParamData { + private String name; + private int id; + private String phone; + private BestFriend bestFriend; + + public static class BestFriend { + private String address; + private String sex; + } +} +``` + +- 注意上面代码中省略了GET、SET方法等必要的java plain model元素。 +- 注意**成员变量名称一定要和JSON属性名称对应上。** +- 注意接收不同类型的参数,使用不同的成员变量类型 + +完成以上动作,我们就可以使用`@RequestBody ParamData paramData`,一次性的接收以上所有的复杂嵌套对象参数了,参数对象的所有属性都将被赋值。 + +# Http数据转换的原理 + +使用JSON都比较普遍了,其方便易用、表达能力强,是绝大部分数据接口式应用的首选。那么如何响应其他的类型的数据?其中的判别原理又是什么?下面就来给大家介绍一下: + +![image-20231104190647009](https://pic.yupi.icu/5563/image-20231104190647009.png) + +- 当一个HTTP请求到达时是一个InputStream,通过HttpMessageConverter转换为java对象,从而进行参数接收。 +- 当对一个HTTP请求进行响应时,我们首先输出的是一个java对象,然后由HttpMessageConverter转换为OutputStream输出。 + +当我们在Spring Boot应用中集成了**jackson的类库**之后,如下的一些HttpMessageConverter将会被加载。 + +![image-20231104190658630](https://pic.yupi.icu/5563/image-20231104190658630.png)根据HTTP协议的Accept和Content-Type属性,以及参数数据类型来判别使用哪一种HttpMessageConverter。**当使用RequestBody或ResponseBody时,再结合前端发送的Accept数据类型,会自动判定优先使用MappingJacksonHttpMessageConverter作为数据转换器。**但是,不仅JSON可以表达对象数据类型,XML也可以。**如果我们希望使用XML格式该怎么告知Spring呢,那就要使用到produces属性了。** + +```Java +@GetMapping(value ="/demo",produces = MediaType.APPLICATION_XML_VALUE) +``` + +这里我们明确的告知了返回的数据类型是xml,就会使用Jaxb2RootElementHttpMessageConverter作为默认的数据转换器。当然实现XML数据响应比JSON还会更复杂一些,还需要结合@XmlRootElement、@XmlElement等注解实体类来使用。 + +# 自定义HttpMessageConverter + +其实绝大多数的数据格式都不需要我们自定义HttpMessageConverter,都有第三方类库可以帮助我们实现(包括下文代码中的Excel格式)。但有的时候,有些数据的输出格式并没有类似于Jackson这种类库帮助我们处理,需要我们自定义数据格式。该怎么做? + +下面我们就以Excel数据格式为例,**写一个自定义的HTTP类型转换器**。实现的效果就是,当我们返回AjaxResponse这种数据类型的话,就自动将AjaxResponse转成Excel数据响应给客户端。 + +引入依赖 + +```XML + + org.apache.poi + poi-ooxml + 3.9 + +@Service +public class ResponseToXlsConverter extends AbstractHttpMessageConverter { + + private static final MediaType EXCEL_TYPE = MediaType.valueOf("application/vnd.ms-excel"); + + ResponseToXlsConverter() { + super(EXCEL_TYPE); + } + + @Override + protected AjaxResponse readInternal(final Class clazz, + final HttpInputMessage inputMessage) + throws IOException, HttpMessageNotReadableException { + return null; + } + + //针对AjaxResponse类型返回值,使用下面的writeInternal方法进行消息类型转换 + @Override + protected boolean supports(final Class clazz) { + return (AjaxResponse.class == clazz); + } + + @Override + protected void writeInternal(final AjaxResponse ajaxResponse, final HttpOutputMessage outputMessage) + throws IOException, HttpMessageNotWritableException { + + final Workbook workbook = new HSSFWorkbook(); + final Sheet sheet = workbook.createSheet(); + + final Row row = sheet.createRow(0); + row.createCell(0).setCellValue(ajaxResponse.getMessage()); + row.createCell(1).setCellValue(ajaxResponse.getData().toString()); + + workbook.write(outputMessage.getBody()); + } +} +``` + +- 实现AbstractHttpMessageConverter接口 +- 指定该转换器是针对哪种数据格式的?如上文代码中的"application/vnd.ms-excel" +- 指定该转换器针对那些对象数据类型?如上文代码中的supports函数 +- 使用writeInternal对数据进行输出处理,上例中是输出为Excel格式。 + +![image-20231104190721012](https://pic.yupi.icu/5563/image-20231104190721012.png) + +注意这是要把自定义的Http转换器加上@Service注解 + +`@Service`注解是Spring框架中的一个注解,用于标识一个类作为服务组件。当类被标记为`@Service`时,Spring会自动将其识别为一个服务,并进行相关的依赖注入和管理。 + +# 统一规划接口响应的数据格式 + +下面这个类是用于统一数据响应接口标准的。它的作用是:统一所有开发人员响应前端请求的返回结果格式,减少前后端开发人员沟通成本,是一种RESTful接口标准化的开发约定。 + +```Java +@Data +public class AjaxResponse { + + private boolean isok; //请求是否处理成功 + private int code; //请求响应状态码(200、400、500) + private String message; //请求结果描述信息 + private Object data; //请求结果数据(通常用于查询操作) + + private AjaxResponse(){} + + //请求成功的响应,不带查询数据(用于删除、修改、新增接口) + public static AjaxResponse success(){ + AjaxResponse ajaxResponse = new AjaxResponse(); + ajaxResponse.setIsok(true); + ajaxResponse.setCode(200); + ajaxResponse.setMessage("请求响应成功!"); + return ajaxResponse; + } + + //请求成功的响应,带有查询数据(用于数据查询接口) + public static AjaxResponse success(Object obj){ + AjaxResponse ajaxResponse = new AjaxResponse(); + ajaxResponse.setIsok(true); + ajaxResponse.setCode(200); + ajaxResponse.setMessage("请求响应成功!"); + ajaxResponse.setData(obj); + return ajaxResponse; + } + + //请求成功的响应,带有查询数据(用于数据查询接口) + public static AjaxResponse success(Object obj,String message){ + AjaxResponse ajaxResponse = new AjaxResponse(); + ajaxResponse.setIsok(true); + ajaxResponse.setCode(200); + ajaxResponse.setMessage(message); + ajaxResponse.setData(obj); + return ajaxResponse; + } + + +} +``` + +# 实战:使用注解开发一个REST接口 + +## 一、定义pojo对象 + +```Java +@Data +@Builder +public class Article { + private Long id; + private String author; + private String title; + private String content; + private Data createTime; + + private List reader; +} +@Data +public class Reader { + private String name; + private Integer age; +} +``` + +- @Builder为我们提供了通过对象属性的链式赋值构建对象的方法 +- @Data注解帮我们定义了一系列常用方法,如:getters、setters、hashcode、equals等 + +## 二、定义HTTP方法和Controller + +- 增加一篇Article ,使用POST方法 +- 删除一篇Article,使用DELETE方法,参数是id +- 更新一篇Article,使用PUT方法,以id为主键进行更新 +- 获取一篇Article,使用GET方法 + +```Java +@Slf4j +@RestController +@RequestMapping("/rest") +public class ArticleController { + //根据文章的Id查询一篇文章 + @GetMapping("/article/{id}") + public AjaxResponse getArticleById(@PathVariable Long id) { + //使用Lombok提供的buidler构建对象(构造一些假数据) + Article article = Article.builder() + .id(id) + .author("lombok") + .content("你好spring boot") + .createTime(new Date()) + .title("day01").build(); + return AjaxResponse.success(article); + } + + //增加一篇Article ,使用POST方法(RequestBody方式接收参数) + //@RequestMapping(value = "/articles",method = RequestMethod.POST) + @PostMapping("/articles") + public AjaxResponse saveArticle(@RequestBody Article article, + @RequestHeader String aaa){ + + //因为使用了lombok的Slf4j注解,这里可以直接使用log变量打印日志 + log.info("saveArticle:" + article); + return AjaxResponse.success(); + } + + //增加一篇Article ,使用POST方法(RequestParam方式接收参数) + /*@PostMapping("/articles") + public AjaxResponse saveArticle(@RequestParam String author, + @RequestParam String title, + @RequestParam String content, + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @RequestParam Date createTime){ + + log.info("saveArticle:" + createTime); + return AjaxResponse.success(); + }*/ + + + //更新一篇Article,使用PUT方法,以id为主键进行更新 + //@RequestMapping(value = "/articles",method = RequestMethod.PUT) + @PutMapping("/articles") + public AjaxResponse updateArticle(@RequestBody Article article){ + if(article.getId() == null){ + //article.id是必传参数,因为通常根据id去修改数据 + //TODO 抛出一个自定义的异常 + } + + log.info("updateArticle:" + article); + return AjaxResponse.success(); + } + + //删除一篇Article,使用DELETE方法,参数是id + //@RequestMapping(value = "/articles/{id}",method = RequestMethod.DELETE) + @DeleteMapping("/articles/{id}") + public AjaxResponse deleteArticle(@PathVariable("id") Long id){ + + log.info("deleteArticle:" + id); + return AjaxResponse.success(); + } +} +``` + +## 测试一下: + +![image-20231104190737919](https://pic.yupi.icu/5563/image-20231104190737919.png) + +# 配合前端axios传参总结 + +- `@RequestParam`注解,默认接收`Content-Type: application/x-www-form-urlencoded`编码格式的数据 +- `@RequestBody`注解,默认接收JSON类型格式的数据。 + +## 一、`@RequestParam`注解对应的axios传参方法 + +以下面的这段Spring java代码为例,接口使用POST协议,需要接受的参数分别是tsCode、indexCols、table。针对这个Spring的HTTP接口,axios该如何传参?有几种方法?我们来一一介绍。 + +```Java +@PostMapping("/line") +public List commonEChart(@RequestParam String tsCode, + @RequestParam String indexCols, + @RequestParam String table){ +``` + +### params传参(推荐) + +使用axios实例的params进行传参,就会将params参数格式化为x-www-form-urlencoded的格式,**与后端参数一一对应即可传参成功。** + +```JavaScript +return request({ + url: '/chart/line', + method: 'post', + params: { //注意这里的key是params + tsCode, + indexCols, + table + } +}) +``` + +### FormData传参 + +还可以使用js的FormData对象进行参数格式化,同样可以在Spring后端正确的使用`@RequestParam`注解进行参数接收。 + +```JavaScript +let params = new FormData(); +params.append('tsCode', tsCode); +params.append('indexCols', indexCols); +params.append('table', table); +return request({ + url: '/chart/line', + method: 'post', + data: params //注意这里的key是data +}) +``` + +### qs.stringfy传参 + +还可以使用`qs.stringfy`进行参数格式化,同样可以在Spring后端正确的使用`@RequestParam`注解进行参数接收。 + +```JavaScript +import qs from "qs"; + +return request({ + url: '/chart/line', + method: 'post', + data: qs.stringify({ //注意这里的key是data + tsCode, + indexCols, + table + }) +}) +``` + +需要注意的是使用这种方法,需要手动设置header(Content-Type) + +```JavaScript +const service = axios.create({ + headers: { + "Content-Type": "application/x-www-form-urlencoded" + } +}); +``` + +## 二、`@RequestBody`的axios传参方法 + +DemoModel类是一个实体类,包含名称tsCode,indexCols,table三个字符串成员变量。接收到的JSON格式参数会自动为demo对象的成员变量赋值。 + +```Java +@PostMapping("/line") +public List commonEChart(@RequestBody DemoModel demo){ +``` + +`@RequestBody`注解,默认接收JSON类型格式的数据。**在axios中默认data传参就会默认使用JSON数据格式**,所以不用额外的特殊处理。 + +```JavaScript +return request({ + url: '/chart/line', + method: 'post', + data: { //注意这里的key是data + tsCode, + indexCols, + table + } +}) +``` + +# FastJSON、Gson和Jackson对比 + +**开源的Jackson**:SpringBoot默认是使用Jackson作为JSON数据格式处理的类库,**Jackson在各方面都比较优秀,所以不建议将Jackson替换为Gson或fastjson。** + +**Google的Gson**:Gson是Google为满足内部需求开发的JSON数据处理类库,其核心结构非常简单,toJson与fromJson两个转换函数实现对象与JSON数据的转换, + +**阿里巴巴的FastJson**:Fastjson是阿里巴巴开源的JSON数据处理类库,其主要特点是序列化速度快。当并发数据量越大的时候,越能体现出fastjson的优势。但是笔者觉得选择JSON处理类库,快并不是唯一需要考虑的因素,与数据库或磁盘IO相比,JSON数据序列化与反序列化的这点时间还不足以对软件性能产生比较大的影响。而且这个库会有一些版本安全问题,代码质量不高,在国外几乎没人使用。 + +# 在Spring中注解方法使用Jackson + +jackson的主要作用就是序列化与反序列化。 + +> 什么叫序列化与反序列化?说白了就是把对象转成可传输、可存储的格式(json、xml、二进制、甚至自定义格式)叫做序列化。反序列化顾名思义。 + +- 反序列化:在客户端将请求数据上传到服务端的时候,自动的处理JSON数据对象中的字符串、数字,将其转换为包含Date类型、Integer等类型的对象。 +- 序列化:按照指定的格式、顺序等将实体类对象转换为JSON字符串 + +下面就给大家介绍一下jackson的常用注解的使用方法,帮助我们进行序列化和反序列化工作。 + +## 常用注解 + +这些注解通常用于标注java实体类或实体类的属性。 + +- @JsonPropertyOrder(value={"pname1","pname2"}) 改变子属性在JSON序列化中的默认定义的顺序。如:param1在先,param2在后。 +- @JsonIgnore 加在属性上面,排除某个属性不做序列化与反序列化 +- @JsonIgnoreProperties(ignoreUnknown = true),将这个注解写在类上之后,就会忽略JSON字符串中存在,但实体类不存在的属性,不予赋值,也不会出现异常。 +- @JsonIgnoreProperties({ "xxx", "yyyy" }) 忽略某些属性不进行序列化 +- @JsonProperty(anotherName) 为某个属性换一个名称,体现在JSON数据里面 +- @JsonInclude(JsonInclude.Include.NON_NULL) 排除为空的元素不做序列化反序列化 +- @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 指定日期类型的属性格式 + +```Java +@JsonPropertyOrder(value={"content","title"}) +public class Article { + + @JsonIgnore + private Long id; + + @JsonProperty("auther") + private String author; + private String title; + private String content; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + private List reader; + +} +``` + +上文代码中对应的JSON数据格式可以为: + +```Java +{ + auther :"", + content:"", + title:"", + createTime:"2013-11-3 12:12:12", + reader:[{"name":"xhl","age":18},{"name":"jng","age":19}] +} +``` + +- 因为定义了JsonPropertyOrder,content在先,title在后 +- 因为定义了JsonIgnore,id属性被忽略 +- 因为定义了JsonProperty,author属性变为auther +- 因为定义了JsonInclude和JsonFormat,createTime不要为空,并且格式为 "yyyy-MM-dd HH:mm:ss" + +通常会对日期类型转换,进行全局配置,而不是在每一个java bean里面配置 + +```YAML +spring: + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 +``` + +调试成功: + +![image-20231104190808684](https://pic.yupi.icu/5563/image-20231104190808684.png) + +# 手写数据转换 + +除了在spring框架内实现自动的前后端JSON数据与java对象的转换,我们还可以使用jackson自己写代码进行转换。 + +```Java +//jackson的ObjectMapper 转换对象 +ObjectMapper mapper = new ObjectMapper(); +//将某个java对象转换为JSON字符串 +String jsonStr = mapper.writeValueAsString(javaObj); +//将jsonStr转换为Ademo类的对象 +Ademo ademo = mapper.readValue(jsonStr, Ademo.class); +``` + +当JSON字符串代表的对象的字段多于类定义的字段时,使用readValue会抛出UnrecognizedPropertyException异常,在类的定义处加上`@JsonIgnoreProperties(ignoreUnknown = true)`可以解决这个问题。 + +# Postman测试 + +下面让我们结合postman对REST接口和Jackson做一下测试吧。Postman是接口测试过程中经常使用到的工具。 +测试使用数据: + +```JSON +{ + "id": 1, + "author": "xhl", + "title": "手把手教你spring boot", + "content": "hello world", + "createTime": "", + "reader":[{"name":"xhl","age":18},{"name":"jng","age":19}] +} +``` + +下面以测试新增文章的接口为例: + +- 测试的接口服务端点为“/rest/article” +- 服务端点支持的HTTP方法为POST +- 使用Http协议的body传输JSON数据,对应Controller应该使用@RequestBody进行数据参数接收 +- 点击Send进行接口数据的发送 + +## bug + +![image-20231104190819684](https://pic.yupi.icu/5563/image-20231104190819684.png) + +既然和 DispatcherServlet 有关,那无非就是MVC的映射出了问题,通俗的理解,就是:JVM编译期有个 [servlet](https://so.csdn.net/so/search?q=servlet&spm=1001.2101.3001.7020) 加载/调用失败了。 + +我画了一张图,和大家一起复习下 DispatcherServlet : + +![image-20231104190832277](https://pic.yupi.icu/5563/image-20231104190832277.png) + +整个流程可以被大致描述为: + +1. 一个http请求到达服务器,被DispatcherServlet接收。 +2. DispatcherServlet将请求委派给合适的处理器Controller,此时处理控制权到达Controller对象。 +3. Controller内部完成请求的数据模型的创建和业务逻辑的处理,然后再将填充了数据后的模型即model和控制权一并交还给DispatcherServlet,委派DispatcherServlet来渲染响应。 +4. DispatcherServlet再将这些数据和适当的数据模版视图结合,向Response输出响应。 + +解决:在实体类加上两个注解@AllArgsConstructor 和 @NoArgsConstructor + +![image-20231104190853349](https://pic.yupi.icu/5563/image-20231104190853349.png) + +![image-20231104190903249](https://pic.yupi.icu/5563/image-20231104190903249.png) + +# Jackson全局配置 + +在Spring框架内使用Jackson的时候,通常需要一些特殊的全局配置,来应对我们JSON序列化与反序列化中出现的各种问题。 +Spring Boot 提供了两种配置方式,一是配置文件的方式 + +```YAML +spring: + jackson: + #日期类型格式化 + date-format: yyyy-MM-dd HH:mm:ss + serialization: + #格式化输出,通常为了节省网络流量设置为false。因为格式化之后会带有缩进,方便阅读。 + indent_output: false + #某些类对象无法序列化的时候,是否报错 + fail_on_empty_beans: false + #设置空如何序列化,见下文代码方式详解 + defaultPropertyInclusion: NON_EMPTY + deserialization: + #json对象中有不存在的属性时候,是否报错 + fail_on_unknown_properties: false + parser: + #允许出现特殊字符和转义符 + allow_unquoted_control_chars: true + #允许出现单引号 + allow_single_quotes: true +``` + +二是通过代码的方式,方式一更容易,方式二更灵活。方式一无法解决的问题,尝试使用方式二。 + +```Java +@Bean +@Primary +@ConditionalOnMissingBean(ObjectMapper.class) +public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) +{ + ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + + // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化 + // Include.Include.ALWAYS 默认 + // Include.NON_DEFAULT 属性为默认值不序列化 + // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量 + // Include.NON_NULL 属性为NULL 不序列化 + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + // 允许出现特殊字符和转义符 + objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); + // 允许出现单引号 + objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); + // 字段保留,将null值转为"" + objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() + { + @Override + public void serialize(Object o, JsonGenerator jsonGenerator, + SerializerProvider serializerProvider) + throws IOException + { + jsonGenerator.writeString(""); + } + }); + return objectMapper; +} +``` + +# 编码实现接口测试 + +为什么要写代码做测试? + +使用maven在打包之前将所有的测试用例执行一遍。这里重点是**自动化**,所以postman这种工具很难插入到持续集成的自动化流程中去。 + +## junit测试框架 + +在junit4和junit5中,注解的写法有些许变化。 + + + +## Mockito测试框架 + +Mockito是GitHub上使用最广泛的Mock框架,并与JUnit结合使用.Mockito框架可以创建和配置mock对象.使用Mockito简化了具有外部依赖的类的测试开发。Mockito测试框架可以帮助我们模拟HTTP请求,从而达到在服务端测试目的。**因为其不会真的去发送HTTP请求,而是模拟HTTP请求内容,从而节省了HTTP请求的网络传输,测试速度更快。** + +![image-20231104190922436](https://pic.yupi.icu/5563/image-20231104190922436.png) + +> spring-boot-starter-test(Spring Boot 2.3.0.RELEASE)自动包含Junit 5 和Mockito框架 + +```Java +@Slf4j +public class ArticleRestControllerTest { + + //mock对象 + private static MockMvc mockMvc; + + //在所有测试方法执行之前进行mock对象初始化 + @BeforeAll + static void setUp() { + mockMvc = MockMvcBuilders.standaloneSetup(new ArticleController()).build(); + } + + //测试方法 + @Test + public void saveArticle() throws Exception { + + String article = "{\n" + + " \"id\": 1,\n" + + " \"author\": \"xhl\",\n" + + " \"title\": \"手把手教你开发spring boot\",\n" + + " \"content\": \"c\",\n" + + " \"createTime\": \"2023-11-03 15:56:55\",\n" + + " \"reader\":[{\"name\":\"xhl\",\"age\":18},{\"name\":\"jng\",\"age\":19}]\n" + + "}"; + MvcResult result = mockMvc.perform( + MockMvcRequestBuilders + .request(HttpMethod.POST, "/rest/article") + .contentType("application/json") + .content(article) + ) + .andExpect(MockMvcResultMatchers.status().isOk()) //HTTP:status 200 + .andExpect(MockMvcResultMatchers.jsonPath("$.data.author").value("xhl")) + .andExpect(MockMvcResultMatchers.jsonPath("$.data.reader[0].age").value(18)) + .andDo(print()) + .andReturn(); + result.getResponse().setCharacterEncoding("UTF-8"); + log.info(result.getResponse().getContentAsString()); + + } +} +``` + + + +MockMvc对象有以下几个基本的方法: + +- perform : 模拟执行一个RequestBuilder构建的HTTP请求,会执行SpringMVC的流程并映射到相应的控制器Controller执行。 +- contentType:发送请求内容的序列化的格式,"application/json"表示JSON数据格式 +- andExpect: 添加RequsetMatcher验证规则,验证控制器执行完成后结果是否正确,或者说是结果是否与我们期望(Expect)的一致。 +- andDo: 添加ResultHandler结果处理器,比如调试时打印结果到控制台 +- andReturn: 最后返回相应的MvcResult,然后进行自定义验证/进行下一步的异步处理 + +> 上面的整个过程,我们都没有使用到Spring Context依赖注入、也没有启动tomcat web容器。整个测试的过程十分的轻量级,速度很快。 + +## 真实servlet容器环境下的测试 + +上面的测试执行速度非常快,但是有一个问题:它没有启动servlet容器和Spring 上下文,自然也就无法实现依赖注入(不支持@Resource和@AutoWired注解)。这就导致它在从控制层到持久层全流程测试中有很大的局限性。 + +测试类上面额外加上这样两个注解,并且mockMvc对象使用@Resource自动注入,删掉Before注解及setUp函数。 + +```Java +@AutoConfigureMockMvc +@SpringBootTest +@ExtendWith(SpringExtension.class) +``` + +![image-20231104191101956](https://pic.yupi.icu/5563/image-20231104191101956.png) + +该测试方法真实的启动了一个tomcat容器、以及Spring 上下文,所以我们可以进行依赖注入(@Resource)。实现的效果和使用MockMvcBuilders构建MockMVC对象的效果是一样的,但是有一个非常明显的缺点:**每次做一个接口测试,都会真实的启动一次servlet容器,Spring上下文加载项目里面定义的所有的Bean,导致执行过程很缓慢。** + +### @SpringBootTest 注解 + +是用来创建Spring的上下文ApplicationContext,保证测试在上下文环境里运行。单独使用@SpringBootTest不会启动servlet容器。所以**只是使用SpringBootTest 注解,不可以使用@Resource和@Autowired等注解进行bean的依赖注入**。 + +### @ExtendWith(@RunWith注解) + +- RunWith方法为我们构造了一个的Servlet容器运行运行环境,并在此环境下测试。然而为什么要构建servlet容器?因为使用了依赖注入,注入了MockMvc对象,而在上一个例子里面是我们自己new的。 +- 而@AutoConfigureMockMvc注解,该注解表示mockMvc对象由spring 依赖注入构建,你只负责使用就可以了。这种写法是为了让测试在servlet容器环境下执行。 + +实际上@SpringBootTest 注解注解已经包含了 @ExtendWith注解,如果使用了前者,可以忽略后者! + +### @Transactional + +该注解加在方法上可以使单元测试进行事务回滚,以保证数据库表中没有因测试造成的垃圾数据,因此保证单元测试可以反复执行;但是使用该注解会破坏测试真实性。 + +## Mock测试 + +### 什么是Mock? + +在面向对象程序设计中,模拟对象是以可控的方式模拟真实对象行为的**假的对象** + +> 在单元测试中,模拟对象可以模拟复杂的、真实的对象的行为, 如果真实的对象无法放入单元测试中,使用模拟对象就很有帮助。 + +在下面的情形,可能需要使用 **"模拟对象行为"** 来代替真实对象: + +- 真实对象的行为是不确定的(例如,当前的时间或当前的温度); +- 真实对象很难搭建起来; +- 真实对象的行为很难触发(例如,网络错误); +- 真实对象速度很慢(例如,一个完整的数据库,在测试之前可能需要初始化); +- 真实的对象是用户界面,或包括用户界面在内; +- 真实的对象使用了回调机制; +- 真实对象可能还不存在(例如,其他程序员还为完成工作); +- 真实对象可能包含不能用作测试的信息(高度保密信息等)和方法。 + +### 场景实践 + +我们的保存文章的Controller方法,调用ArticleService的saveArticle进行文章的保存。 + +但是因为种种原因,这个接口目前没能实现(只有接口) + +```Java +public interface ArticleService { + public String saveArticle(Article article); +} +``` + +我们就可以使用Mock的方法,先Mock一个假的ArticleService,把接口验证完成。 + +```Java +@Slf4j +@AutoConfigureMockMvc +@SpringBootTest +//@ExtendWith(SpringExtension.class) +public class ArticleRestControllerTest { + +// //mock对象 +// private static MockMvc mockMvc; + + @Resource + private MockMvc mockMvc; + + @MockBean + private ArticleService articleService; + +// //在所有测试方法执行之前进行mock对象初始化 +// @BeforeAll +// static void setUp() { +// mockMvc = MockMvcBuilders.standaloneSetup(new ArticleController()).build(); +// } + + //测试方法 + @Test + public void saveArticle() throws Exception { + + String article = "{\n" + + " \"id\": 1,\n" + + " \"author\": \"xhl\",\n" + + " \"title\": \"手把手教你开发spring boot\",\n" + + " \"content\": \"c\",\n" + + " \"createTime\": \"2023-11-03 15:56:55\",\n" + + " \"reader\":[{\"name\":\"xhl\",\"age\":18},{\"name\":\"jng\",\"age\":19}]\n" + + "}"; + + //反序列化 + ObjectMapper objectMapper = new ObjectMapper(); + Article articleObj = objectMapper.readValue(article, Article.class); + + //打桩 + when(articleService.saveArticle(articleObj)).thenReturn("ok"); + + + MvcResult result = mockMvc.perform( + MockMvcRequestBuilders + .request(HttpMethod.POST, "/rest/article") + .contentType("application/json") + .content(article) + ) + .andExpect(MockMvcResultMatchers.jsonPath("$.data").value("ok")) +// .andExpect(MockMvcResultMatchers.status().isOk()) //HTTP:status 200 +// .andExpect(MockMvcResultMatchers.jsonPath("$.data.author").value("xhl")) +// .andExpect(MockMvcResultMatchers.jsonPath("$.data.reader[0].age").value(18)) + .andDo(print()) + .andReturn(); + result.getResponse().setCharacterEncoding("UTF-8"); + log.info(result.getResponse().getContentAsString()); + + } +} +``` + +### @MockBean + +可以用MockBean伪造模拟一个Service ,如代码中的MockBean。 + +大家注意上文代码中,打了一个桩 + +```Java +when(articleService.saveArticle(articleObj)).thenReturn("ok"); +``` + +也就是告诉测试用例程序,当你调用articleService.saveArticle(articleObj)方法的时候,不要去真的调用这个方法,直接返回一个结果(“ok”)就好了。 + +```Java +.andExpect(MockMvcResultMatchers.jsonPath("$.data").value("ok")) +``` + +测试用例跑通了,期望结果andExpect:ok与实际结果thenReturn("ok")一致。表示程序真正的去执行了MockBean的模拟行为,而不是调用真实对象的方法。 + +注意这里要在Controller层调用service方法 + +![image-20231104191125588](https://pic.yupi.icu/5563/image-20231104191125588.png) + +![image-20231104191133795](https://pic.yupi.icu/5563/image-20231104191133795.png) + +## 轻量级测试 + +在ExtendWith的AutoConfigureMockMvc注解的共同作用下,启动了SpringMVC的运行容器,并且把项目中所有的@Bean全部都注入进来。把所有的bean都注入进来是不是很臃肿?这样会拖慢单元测试的效率。如果我只是想测试一下控制层Controller,怎么办? + +```Java +@ExtendWith(SpringExtension.class) +@WebMvcTest(ArticleController.class) +//@SpringBootTest +``` + +#### 使用@WebMvcTest替换@SpringBootTest + +- @SpringBootTest注解告诉SpringBoot去寻找一个主配置类(例如带有@SpringBootApplication的配置类),并使用它来启动Spring应用程序上下文。SpringBootTest加载完整的应用程序并注入所有可能的bean,因此速度会很慢。 +- @WebMvcTest注解主要用于controller层测试,只覆盖应用程序的controller层,@WebMvcTest(ArticleController.class)只加载ArticleController这一个Bean用作测试。所以WebMvcTest要快得多,因为我们只加载了应用程序的一小部分。 + +## MockMvc更多的用法总结 + +```Java +//模拟GET请求: +mockMvc.perform(MockMvcRequestBuilders.get("/user/{id}", userId)); + +//模拟Post请求: +mockMvc.perform(MockMvcRequestBuilders.post("uri", parameters)); + +//模拟文件上传: +mockMvc.perform(MockMvcRequestBuilders.multipart("uri").file("fileName", "file".getBytes("UTF-8"))); + + +//模拟session和cookie: +mockMvc.perform(MockMvcRequestBuilders.get("uri").sessionAttr("name", "value")); +mockMvc.perform(MockMvcRequestBuilders.get("uri").cookie(new Cookie("name", "value"))); + +//设置HTTP Header: +mockMvc.perform(MockMvcRequestBuilders + .get("uri", parameters) + .contentType("application/x-www-form-urlencoded") + .accept("application/json") + .header("", "")); +``` + +# 使用Swagger2构建API文档 + +## 为什么需要API接口文档? + +当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维护一份及时更新且完整的API 文档将会极大的提高我们的工作效率。传统意义上的文档都是后端开发人员使用word编写的,相信大家也都知道这种方式很难保证文档的及时性,这种文档久而久之也就会失去其参考意义,反而还会加大我们的沟通成本。而 Swagger 给我们提供了一个全新的维护 API 文档的方式,下面我们就来了解一下它的优点: + +- 代码变,文档变。只需要少量的注解,Swagger 就可以根据代码自动生成 API 文档,很好的保证了文档的时效性。 +- 跨语言性,支持 40 多种语言。 +- Swagger UI 呈现出来的是一份可交互式的 API 文档,我们可以直接在文档页面尝试 API 的调用,省去了准备复杂的调用参数的过程。 +- 还可以将文档规范导入相关的工具(例如 SoapUI), 这些工具将会为我们自动地创建自动化测试。 + +## 整合swagger2生成文档 + +1. 引入依赖 + +```XML + + io.springfox + springfox-swagger2 + 2.6.1 + + + + io.springfox + springfox-swagger-ui + 2.6.1 + +``` + +1. Config配置 + +```Java +@Configuration +@EnableSwagger2 +public class Swagger2{ + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("springboot利用swagger构建api文档") + .description("简单优雅的restfun风格") + .termsOfServiceUrl("https://blog.csdn.net/m0_60496161?spm=1010.2135.3001.5343") + .version("1.0") + .build(); + } + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .apiInfo(apiInfo()) + .select() + //扫描basePackage包下面的“/rest/”路径下的内容作为接口文档构建的目标 + .apis(RequestHandlerSelectors.basePackage("com.xhl.firstdemo.Controller")) + .paths(PathSelectors.any()) + .build(); + } + + + + +} +``` + +- @EnableSwagger2 注解表示开启SwaggerAPI文档相关的功能 +- 在apiInfo方法中配置接口文档的title(标题)、描述、termsOfServiceUrl(服务协议)、版本等相关信息 +- 在createRestApi方法中,**basePackage表示扫描哪个package下面的Controller类作为API接口文档内容范围** +- 在createRestApi方法中,paths表示哪一个请求路径下控制器映射方法,作为API接口文档内容范围 + +### bug + +1. Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException + +解决办法:在启动类加一个注解:`@EnableWebMvc` + +1. mvc报错 + +![image-20231104191243003](https://pic.yupi.icu/5563/image-20231104191243003.png) + +解决方法:https://blog.csdn.net/qq_39508627/article/details/104490268 + +添加一个配置类 + +```Java +@Configuration +public class WebMvcConfigurer extends WebMvcConfigurationSupport { + + /** + * 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源 + * + * @param registry + */ + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/**").addResourceLocations( + "classpath:/static/"); + registry.addResourceHandler("swagger-ui.html").addResourceLocations( + "classpath:/META-INF/resources/"); + registry.addResourceHandler("/webjars/**").addResourceLocations( + "classpath:/META-INF/resources/webjars/"); + super.addResourceHandlers(registry); + } +} +``` + +![image-20231104191252240](https://pic.yupi.icu/5563/image-20231104191252240.png) + +swagger不仅提供了静态的接口文档的展示,还提供了执行接口方法测试的功能。在下图中填入接口对应的参数,点击“try it out"就可以实现接口请求的发送与响应结果的展示。 + +![image-20231104191300977](https://pic.yupi.icu/5563/image-20231104191300977.png) + +1. Consider defining a bean of type 'com.xhl.firstdemo.service.ArticleService' in your configuration. + + https://cloud.tencent.com/developer/article/2124710 + + 既然他说没找到,也就是该注解被没有被spring识别 + + 在Spring框架中,`@Service`和`@Component`注解都可以用于类级别的注解,用来标识一个类是Spring的组件(component)。这些注解可以让Spring自动扫描并将这些类实例化为可用的bean,并将它们注册到应用程序的上下文中。 + + 具体来说,`@Component`是一个泛化的注解,可以用于任何类型的组件。而`@Service`注解则是`@Component`的一个特化版本,它用于表示业务逻辑层(Service层)的组件。 + + 解决: + + 1. 将接口与对应的实现类放在与application启动类的同一个目录或者他的子目录下,这样注解可以被扫描到 + 2. 在指定的application类上加上这么一行注解,手动指定application类要扫描哪些包下的注解 + +## 书写swagger注解 + +为接口功能添加注释 + +```Java +@ApiOperation(value = "添加文章", notes = "添加新的文章", tags = "Article",httpMethod = "POST") +@ApiImplicitParams({ + @ApiImplicitParam(name = "title", value = "文章标题", required = true, dataType = "String"), + @ApiImplicitParam(name = "content", value = "文章内容", required = true, dataType = "String"), + @ApiImplicitParam(name = "author", value = "文章作者", required = true, dataType = "String") +}) +@ApiResponses({ + @ApiResponse(code=200,message="成功",response=AjaxResponse.class), +}) +@PostMapping("/article") +public @ResponseBody AjaxResponse saveArticle( + @RequestParam(value="title") String title, //参数1 + @RequestParam(value="content") String content,//参数2 + @RequestParam(value="author") String author,//参数3 +) { +``` + +![image-20231104191312060](https://pic.yupi.icu/5563/image-20231104191312060.png) + +## 生产环境下如何禁用swagger2 + +使用注解@Profile({"dev","test"}) 表示在开发或测试环境开启,而在生产关闭。 + +```YAML +spring: + profiles: + actice:dev +``` \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\343\200\220\350\256\276\350\256\241\346\250\241\345\274\217\343\200\221\350\243\205\351\245\260\350\200\205\346\250\241\345\274\217\357\274\214\345\217\212\345\205\266\345\234\250JDK\346\272\220\347\240\201\344\270\255\347\232\204\345\272\224\347\224\250.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\343\200\220\350\256\276\350\256\241\346\250\241\345\274\217\343\200\221\350\243\205\351\245\260\350\200\205\346\250\241\345\274\217\357\274\214\345\217\212\345\205\266\345\234\250JDK\346\272\220\347\240\201\344\270\255\347\232\204\345\272\224\347\224\250.md" new file mode 100644 index 0000000..fb84ecd --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\343\200\220\350\256\276\350\256\241\346\250\241\345\274\217\343\200\221\350\243\205\351\245\260\350\200\205\346\250\241\345\274\217\357\274\214\345\217\212\345\205\266\345\234\250JDK\346\272\220\347\240\201\344\270\255\347\232\204\345\272\224\347\224\250.md" @@ -0,0 +1,177 @@ +# 【设计模式】装饰者模式,及其在JDK源码中的应用 + +> 作者: [B.B](https://wx.zsxq.com/dweb2/index/group/51122858222824),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 24725 + +## 一、**什么是**装饰者模式 + +装饰者模式是一种软件设计模式,它允许在不改变对象结构的情况下,动态地向对象添加额外的功能。该模式通过将对象包装在一个装饰器对象中,来实现对对象的功能扩展。这种模式通常用于需要在运行时动态地为对象添加功能的情况,而不是在编译时静态地定义对象的功能。 + +比如一个毛坯房,可以使用灰色去装饰厨房,可以使用白色装饰客厅,但是不管使用多少颜料去装饰这个房间,房子的本质是不会发现变化的。 + +使用装饰者模式除了可以在不改变原类的前提下装饰对象之外,还可以随意组合各个装饰类,比如有三个装饰类,分别是给原类上红、黄、绿三种颜色。在使用时,可以将任意两种或任意三种装饰类搭配。接下来将会用代码演示上面的这个例子。 + +## 二、**装饰者模式**中的角色 + +装饰者模式中具备以下四种角色: + +**Component**:一个抽象的组件类,在装饰者模式中扮演着最重要的角色。在给房子上色这个例子中,概念上的房子就是一个Component。如果还不理解,继续往下看。 + +**ConcreteComponent**:Component的具体实现,在本次的例子中就是商品房、公寓房等。 + +**Decorator**:一个通用的装饰接口或抽象类,内部保存了被装饰的Component对象。 + +**ConcreteDecorator**:具体的装饰类,在原类的基础上进行装饰。 + +## 三、**装饰者模式**案例 + +原类是房子,可装饰红色、黄色、绿色。接下来的代码就是对这个例子的体现:**首先定义Component,也就是房子****抽象类**,有一个展示房子的方法: + +```Java +public abstract class House { + /** + * 展示房子 + */ + public abstract void show(); +} +``` + +接下来是ConcreteComponent,**抽象房子的实现类,这里定义为商品房,ConcreteComponent可以有很多个**: + +```Java +public class CommercialHouse extends House{ + @Override + public void show() { + System.out.println("这是一个商品房"); + } +} +``` + +**Decorator**是一个通用的抽象类,将房子作为入参传入,并实现同样的show方法 + +```Java +public class HouseDecorator extends House{ + private House house; + + public HouseDecorator(House house){ + this.house = house; + } + + @Override + public void show() { + house.show(); + } +} +``` + +**ConcreteDecorator**具体装饰类定义了三个,分别是红黄蓝装饰: + +```Java +public class RedHouseDecorator extends HouseDecorator{ + + public RedHouseDecorator(House house) { + super(house); + } + @Override + public void show() { + super.show(); + System.out.println("装饰了红色"); + } +} + +public class YellowHouseDecorator extends HouseDecorator{ + + public YellowHouseDecorator(House house) { + super(house); + } + @Override + public void show() { + super.show(); + System.out.println("装饰了黄色"); + } +} + +public class GreenHouseDecorator extends HouseDecorator{ + + public GreenHouseDecorator(House house) { + super(house); + } + @Override + public void show() { + super.show(); + System.out.println("装饰了绿色"); + } +} +``` + +接下来就是使用了,前面已经提到了,装饰者模式除了可以在不改动原类的情况下增加功能,也可以随意组装各个装饰类: + +```Java +public class Main { + public static void main(String[] args) { + House house = new CommercialHouse(); + //只装饰红色 + House redHouse = new RedHouseDecorator(house); + redHouse.show(); + //装饰绿色和黄色 + House greenAndYellowHouse = new GreenHouseDecorator(new YellowHouseDecorator(house)); + greenAndYellowHouse.show(); + //三种颜色全部装饰 + House allHouse = new RedHouseDecorator(new GreenHouseDecorator(new YellowHouseDecorator(house))); + allHouse.show(); + } +} +``` + +在上面的测试代码中,既可以只有一种颜色的装饰,也可以有两种颜色的装饰,或者是三种颜色的装饰,而原本的商品房这个类没有经过任何修改。如果用继承去实现,每种组装方式都需要新建一个类,装饰者模式的优势就体现出来了。 + +## 四、**装饰者模式**在****源码****中的应用 + +看了很多装饰者模式在源码中的应用,感觉Java.IO中的流在装饰者模式的使用上最经典。以InputStream为例子,InputStream有很多的实现类: + +FileInputStream:实现文件的读取。 + +DataInputStream:读取各种基本数据类型的数据。 + +BufferedInputStream:可缓存的文件流。 + +ObjectInputStream:读取对象的文件流。 + +其他的实现还有很多很多,这里的实现就使用了装饰者模式,保证InputStream不变的前提下,增加其他功能。想象一下,如果要同时实现文件读取和可缓存,那么就可以这样写: + +```Java +new BufferedInputStream(new FileInputStream("")); +``` + +是不是和第三节的例子一模一样,在代码的实现上,其实也大同小异,InputStream是一个抽象类,定义了read方法,代码作了精简: + +```Java +new DataInputStream(new FileInputStream("")); +``` + +是不是和第三节的例子一模一样,在代码的实现上,其实也大同小异,InputStream是一个抽象类,定义了read方法,代码作了精简 + +```Java +public abstract class InputStream implements Closeable{ + public abstract int read() throws IOException; +} +``` + +BufferedInputStream是InputStream子类的子类,在继承关系上,BufferedInputStream继承FilterInputStream,FilterInputStream继承InputStream,这里相当于对装饰类进行了再扩展,看一下FilterInputStream: + +```Java +public class FilterInputStream extends InputStream{ + protected volatile InputStream in; + protected FilterInputStream(InputStream in) { + this.in = in; + } + public int read() throws IOException { + return in.read(); + } +} +``` + +而BufferedInputStream以及DataInputStream都是对FilterInputStream再做一些功能上的增强,很巧妙的实现了在不必改变原类文件情况下,允许向一个现有的对象添加新的功能。 + +## 五、**总结** + +装饰者模式很好地体现了设计模式中的开闭原则,即类应该对扩展开放,对修改关闭。值得深深品味。 \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250 FreeMarker \346\250\241\346\235\277\345\274\225\346\223\216\347\224\237\346\210\220\344\273\243\347\240\201.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250 FreeMarker \346\250\241\346\235\277\345\274\225\346\223\216\347\224\237\346\210\220\344\273\243\347\240\201.md" new file mode 100644 index 0000000..07ed08e --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250 FreeMarker \346\250\241\346\235\277\345\274\225\346\223\216\347\224\237\346\210\220\344\273\243\347\240\201.md" @@ -0,0 +1,529 @@ +# 使用 FreeMarker 模板引擎生成代码 + +> 作者:[程序员鱼皮](https://space.bilibili.com/12890453/),[编程导航星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 编号 1 + + + +大家好,我是鱼皮。 + +最近不是打算带大家做一个代码生成项目嘛,项目的第一阶段就是先做一个本地的代码生成器。代码生成器的核心功能就是根据用户输入的选项参数来生成不同的代码文件。 + + + +## 代码生成器的核心原理 + +那么如何实现这个功能呢? + +最经典的方法就是:提前编写 **模板文件** ,并将用户输入的 **参数** 替换到模板文件中,从而生成完整代码。 + +举个例子,用户输入参数: + +```java +作者 = 鱼皮 +``` + + + +模板文件代码: + +```java +----------- +我是 ${作者} +----------- +``` + + + +将参数注入到模板文件中,得到生成的完整代码: + +```java +----------- +我是 鱼皮 +----------- +``` + + + +如果想要使用这套模板生成其他的代码,只需要改变参数的值即可,而不需要改变模板文件。 + +听起来好像很简单,那么问题来了,如何编写模板文件呢?程序怎么知道应该把哪些变量替换为用户实际输入的参数呢?又该如何执行替换操作呢? + +难道需要自己定义一套模板语法和规则,比如指定两个尖括号 `{{ 参数 }}` 中的内容为需要替换的参数,然后通过正则表达式或者字符串匹配扫描文件来进行替换么? + +显然这太麻烦了!而且如果我需要根据用户的输入来生成不同次数的重复代码(也就是循环),又该如何实现呢? + +所以建议大家直接使用已有的 **模板引擎** 技术,轻松实现模板编写和动态内容生成。 + + + +## 什么是模板引擎?为什么需要它? + +模板引擎是一种用于生成动态内容的类库(或框架),通过将预定义的模板与特定数据合并,来生成最终的输出。 + +使用模板引擎有很多的优点,首先就是提供现成的模板文件语法和解析能力。开发者只要按照特定要求去编写模板文件,比如使用 `${参数}` 语法,模板引擎就能自动将参数注入到模板中,得到完整文件,不用再自己编写解析逻辑了。 + +其次,模板引擎可以将数据和模板分离,让不同的开发人员独立工作。比如后端专心开发业务逻辑提供数据,前端专心写模板等,让系统更易于维护。 + +此外,模板引擎可能还具有一些安全特性,比如防止跨站脚本攻击等。所以强烈大家掌握至少一种模板引擎的用法。 + +有很多现成的模板引擎技术,比如 Java 的 Thymeleaf、FreeMarker、Velocity,前端的 Mustache 等。 + +本项目中,我会以知名的、稳定的经典模板引擎 FreeMarker 为例,带大家掌握模板引擎的使用方法。 + + + +## FreeMarker 模板引擎入门 + +FreeMarker 是 Apache 的开源模板引擎,优点是入门简单、灵活易扩展。它不用和 Spring 开发框架、Servlet 环境、第三方依赖绑定,任何 Java 项目都可以使用。 + + + +我个人推荐的 FreeMarker 学习方式是直接阅读官方文档,虽然是英文的,但每一节基本都有代码示例,还是比较好理解的。 + +FreeMarker 官方文档:https://freemarker.apache.org/docs/index.html + + + +![](https://pic.yupi.icu/1/1699268459163-234f13aa-3a9a-4e45-8e26-52b23b2aa7a4.png) + + + +看不懂英文也没关系,鱼皮下面就带大家学习 FreeMarker,只讲常用的特性,主打一个快速入门! + + + +### 模板引擎的作用 + +上面已经讲过了模板引擎的作用,这里就再用 FreeMarker 官网的一张图,强化下大家的理解。 + +如下图,FreeMarker 模板引擎的作用就是接受模板和 Java 对象,对它们进行处理,输出完整的内容。 + + + +![](https://pic.yupi.icu/1/1697633515576-f06ebdc6-7eac-46ef-a171-b5d646040e24.png) + + + +下面我们先依次来学习 FreeMarker 的核心概念(模板和数据模型),然后通过一个 Demo 快速入门。 + + + +### 模板 + +FreeMarker 拥有自己的模板编写规则,一般用 FTL 表示 FreeMarker 模板语言。比如 `myweb.html.ftl` 就是一个 FreeMarker 的模板文件。 + + + +模板文件由 4 个核心部分组成: + +1)文本:固定的内容,会按原样输出。 + +2)插值:用 `${...}` 语法来占位,尖括号中的内容在经过计算和替换后,才会输出。 + +3)FTL 指令:有点像 HTML 的标签语法,通过 `<#xxx ... >` 来实现各种特殊功能。比如 `<#list elements as element>` 实现循环输出。 + +4)注释:和 HTML 注释类似,使用 `<#-- ... -->` 语法,注释中的内容不会输出。 + + + +让我们以《鱼皮官网》为例,举一个 FreeMarker 模板文件的例子: + +学过前端开发框架的同学应该会觉得很眼熟~ + + + +```html + + + + 鱼皮官网 + + +

欢迎来到鱼皮官网

+
    + <#-- 循环渲染导航条 --> + <#list menuItems as item> +
  • ${item.label}
  • + +
+ <#-- 底部版权信息(注释部分,不会被输出)--> +
+ ${currentYear} 鱼皮官网. All rights reserved. +
+ + +``` + + + +### 数据模型 + +我们把为模板准备的所有数据整体统称为 **数据模型** 。 + +在 FreeMarker 中,数据模型一般是树形结构,可以是复杂的 Java 对象、也可以是 HashMap 等更通用的结构。 + +比如为上述《鱼皮官网》模板准备的数据模型,结构可能是这样的: + +```json +{ + "currentYear": 2023, + "menuItems": [ + { + "url": "https://codefather.cn", + "label": "编程导航", + }, + { + "url": "https://laoyujianli.com", + "label": "老鱼简历", + } + ] +} +``` + + + +### Demo 实战 + +在了解模板和数据模型后,让我们通过 FreeMarker 对二者进行组合处理。 + +#### 1、引入依赖 + +首先创建一个 Maven 项目,在 `pom.xml` 中引入 FreeMarker: + +```xml + + org.freemarker + freemarker + 2.3.32 + +``` + + + +如果是 Spring Boot 项目的话,可以直接引入 starter 依赖: + +```xml + + org.springframework.boot + spring-boot-starter-freemarker + +``` + + + +#### 2、创建配置对象 + +新建一个类,在 Main 方法中创建一个 FreeMarker 的全局配置对象,可以统一指定模板文件所在的路径、模板文件的字符集等。 + +示例代码如下: + +```java +// new 出 Configuration 对象,参数为 FreeMarker 版本号 +Configuration configuration = new Configuration(Configuration.VERSION_2_3_32); + +// 指定模板文件所在的路径 +configuration.setDirectoryForTemplateLoading(new File("src/main/resources/templates")); + +// 设置模板文件使用的字符集 +configuration.setDefaultEncoding("utf-8"); +``` + + + +#### 3、准备模版并加载 + +我们将上述《鱼皮官网》的模板代码保存为 `myweb.html.ftl` 文件,存放在上面指定的目录下。 + +![](https://pic.yupi.icu/1/1699277942881-2d0897c2-114d-4722-8b19-cf9bc6d21fcc.png) + + + +准备好模板文件后,通过创建 Template 对象来加载该模板。示例代码如下: + +```java +// 创建模板对象,加载指定模板 +Template template = configuration.getTemplate("myweb.html.ftl"); +``` + + + +#### 4、创建数据模型 + +如果想保证数据的质量和规范性,可以使用对象来保存 “喂” 给模板的数据;反之,如果想更灵活地构造数据模型,推荐使用 HashMap 结构。 + +比如我们想构造《鱼皮官网》的数据模型,需要制定当前年份和导航菜单项,示例代码如下: + +```java +Map dataModel = new HashMap<>(); +dataModel.put("currentYear", 2023); +List> menuItems = new ArrayList<>(); +Map menuItem1 = new HashMap<>(); +menuItem1.put("url", "https://codefather.cn"); +menuItem1.put("label", "编程导航"); +Map menuItem2 = new HashMap<>(); +menuItem2.put("url", "https://laoyujianli.com"); +menuItem2.put("label", "老鱼简历"); +menuItems.add(menuItem1); +menuItems.add(menuItem2); +dataModel.put("menuItems", menuItems); +``` + + + +#### 5、指定生成的文件 + +可以直接使用 FileWriter 对象,指定生成的文件路径和名称: + +```java +Writer out = new FileWriter("myweb.html"); +``` + + + +#### 6、生成文件 + +一切准备就绪,最后只需要调用 template 对象的 process 方法,就可以处理并生成文件了。 + +示例代码如下: + +```java +template.process(dataModel, out); + +// 生成文件后别忘了关闭哦 +out.close(); +``` + + + +#### 7、完整代码 + +组合上面的所有代码并执行,发现在项目的根路径下生成了网页文件,至此 Demo 结束,很简单吧~ + +![](https://pic.yupi.icu/1/1699278834613-ef699fb6-c256-4649-8f59-534fcbfeccbf.png) + + + +完整代码: + +```java +public static void main(String[] args) throws IOException, TemplateException { + // new 出 Configuration 对象,参数为 FreeMarker 版本号 + Configuration configuration = new Configuration(Configuration.VERSION_2_3_32); + + // 指定模板文件所在的路径 + configuration.setDirectoryForTemplateLoading(new File("src/main/resources/templates")); + + // 设置模板文件使用的字符集 + configuration.setDefaultEncoding("utf-8"); + + // 创建模板对象,加载指定模板 + Template template = configuration.getTemplate("myweb.html.ftl"); + + // 创建数据模型 + Map dataModel = new HashMap<>(); + dataModel.put("currentYear", 2023); + List> menuItems = new ArrayList<>(); + Map menuItem1 = new HashMap<>(); + menuItem1.put("url", "https://codefather.cn"); + menuItem1.put("label", "编程导航"); + Map menuItem2 = new HashMap<>(); + menuItem2.put("url", "https://laoyujianli.com"); + menuItem2.put("label", "老鱼简历"); + menuItems.add(menuItem1); + menuItems.add(menuItem2); + dataModel.put("menuItems", menuItems); + + // 生成 + Writer out = new FileWriter("myweb.html"); + template.process(dataModel, out); + + // 生成文件后别忘了关闭哦 + out.close(); +} +``` + + + +### 常用语法 + +学会了 FreeMarker 的基本开发流程后,我们来学习一些 FreeMarker 中的实用特性。 + +注意,FreeMarker 的语法和特性非常多,本文仅带大家学习常用的、易用的语法。无需记忆,日后需要用到 FreeMarker 时,再去对照官方文档查漏补缺即可。 + + + +#### 1、插值 + +在上面的 Demo 中,已经给大家演示了差值的基本语法( `${xxx}` )。但插值还有很多花样可以玩,比如支持传递表达式: + +```java +表达式:${100 + money} +``` + + + +不过个人不建议在模板文件中写表达式,为什么不在创建数据模型时就计算好要展示的值呢? + + + +#### 2、分支和判空 + +和程序开发一样,FreeMarker 模板也支持分支表达式(if ... else),示例代码如下: + +```java +<#if user == "鱼皮"> + 我是鱼皮 +<#else> + 我是猪皮 + +``` + + + +分支语句的一个常用场景就是判空,比如要判断 user 参数是否存在,可以用下面的语法: + +```java +<#if user??> + 存在用户 +<#else> + 用户不存在 + +``` + + + +#### 3、默认值 + +FreeMarker 对变量的空值校验是很严格的,如果模板中某个对象为空,FreeMarker 将会报错而导致模板生成中断。 + +为了防止这个问题,建议给可能为空的参数都设置默认值。使用 `表达式!默认值` 的语法,示例代码如下: + +```java +${user!"用户为空"} +``` + + + +上述代码中,如果 user 对象为空,则会输出 “用户为空” 字符串。 + + + +#### 4、循环 + +在上述 Demo 实战部分,已经给大家演示了循环的用法。即 `<#list items as item>` 表达式,可以遍历某个序列类型的参数并重复输出多条内容。 + +示例代码如下: + +```java +<#list user as users> + ${user} + +``` + + + +其中,users 是整个列表,而 user 是遍历列表每个元素时临时存储的变量,跟 for 循环一样,会依次输出每个 user 的值。 + + + +#### 5、宏定义 + +学过 C 语言和 C++ 的同学应该对 “宏” 这个词并不陌生。可以把 “宏” 理解为一个预定义的模板片段。支持给宏传入变量,来复用模板片段。 + +其实类似于前端开发中组件复用的思想。 + +在 FreeMarker 中,使用 `macro` 指令来定义宏。 + +让我们来定义一个宏,用于输出特定格式的用户昵称,比如: + +```java +<#macro card userName> +--------- +${userName} +--------- + +``` + + + +其中,card 是宏的名称,userName 是宏接受的参数。 + +可以用 `@` 语法来使用宏,示例代码如下: + +```java +<@card userName="鱼皮"/> +<@card userName="二黑"/> +``` + + + +实际生成的输出结果为: + +```java +--------- +鱼皮 +--------- +--------- +二黑 +--------- +``` + + + +宏标签中支持嵌套内容,不过还是有些复杂的(再讲下去就成前端课了),大家需要用到时查看官方文档就好。 + +自定义指令:http://freemarker.foofun.cn/dgui_misc_userdefdir.html + + + +#### 6、内建函数 + +内建函数是 FreeMarker 为了提高开发者处理参数效率而提供的的语法糖,可以通过 `?` 来调用内建函数。 + +比如将字符串转为大写: + +```java +${userName?upper_case} +``` + + + +比如输出序列的长度: + +```java +${myList?size} +``` + + + +把内建函数想象成调用 Java 对象的方法,就很好理解了。 + +内建函数是 FreeMarker 非常强大的一个能力,比如想在循环语法中依次输出元素的下标,就可以使用循环表达式自带的 `index` 内建函数: + +```java +<#list user as users> + ${user?index} + +``` + + + +内建函数种类丰富、数量极多,因此不建议大家记忆,需要用到的时候去查阅官方文档即可。 + +内建函数大全参考:http://freemarker.foofun.cn/ref_builtins.html + + + +#### 7、其他 + +还有更多特性,比如命名空间,其实就相当于 Java 中的包,用于隔离代码、宏、变量等。 + +不过没必要细讲,因为掌握上述常用语法后,基本就能够开发大多数模板文件了。更多内容自主查阅官方文档学习即可。 + + + +## 实践 + +编程导航星球的定制化代码生成项目会演示如何使用 FreeMarker 模板引擎来生成代码。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\345\220\216\347\253\257\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\357\274\214\346\217\220\351\253\230\345\274\200\345\217\221\346\225\210\347\216\207.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\345\220\216\347\253\257\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\357\274\214\346\217\220\351\253\230\345\274\200\345\217\221\346\225\210\347\216\207.md" new file mode 100644 index 0000000..b56fb83 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\345\220\216\347\253\257\344\273\243\347\240\201\347\224\237\346\210\220\345\231\250\357\274\214\346\217\220\351\253\230\345\274\200\345\217\221\346\225\210\347\216\207.md" @@ -0,0 +1,126 @@ +# 使用后端代码生成器,提高开发效率 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +如果你是一名后端开发者,那么大多数的工作一定是重复编写各种 CRUD(增删改查)代码。时间长了你会发现,这些工作不仅无趣,还会浪费你的很多时间,没有机会去做更有创造力和挑战的工作。 + +作为一名程序员,一定要学会偷懒!学会利用工具来解放人力。 + +其实现在有很多现成的代码生成器,可以帮助我们自动生成常用的增删改查代码,而不用自己重复编写,从而大幅提高开发效率,所以大家一定要掌握。 + +对应到 Java 后端开发,主流技术是 Spring Boot + Spring MVC + MyBatis 框架,使用这些技术来开发项目时,通常需要编写数据访问层 (DAO / Mapper) 和数据库表的 XML 映射代码、实体类、Service 业务逻辑代码、以及 Controller 接口代码。 + +本文就以使用 IDEA 开发工具中我认为非常好用的免费代码生成插件 `MyBatisX` 为例,带大家学习如何使用工具自动生成后端代码,节省时间和精力。 + + + +## MyBatisX 自动生成代码教程 + +### 1、安装 MyBatisX 插件 + +首先,确保你已经安装了 IntelliJ IDEA 开发工具。 + +打开你的项目工程,然后进入 Settings 设置页搜索 MyBatisX 插件并安装,步骤如图: + +![](https://pic.yupi.icu/1/1697164755318-f8c19e19-c81c-4fbe-a744-508875aa2c06.png) + + + +### 2、配置数据库连接 + +MyBatisX 插件的核心功能是根据数据库表的结构来生成对应的实体类、数据访问层 Mapper、Service 等代码,所以在使用前,我们需要在 IDEA 中配置一个数据库连接。 + +先在 IDEA 右侧的 Database 中创建一个 MySQL 数据源配置: + +![](https://pic.yupi.icu/1/1697164965564-02ca26d8-692f-4205-afe2-222f629574a4.png) + +然后根据自己的数据库信息填写配置,并测试能否连接成功: + +![](https://pic.yupi.icu/1/1697165014947-16927249-f2eb-4715-9c7f-b772e3422ca0.png) + + + +连接成功后,就可以在 IDEA 中管理数据库了,不需要 Navicat 之类的第三方工具: + +![](https://pic.yupi.icu/1/1697165100043-1094dfba-9dbb-49d4-8496-40ff9d2f3861.png) + + + +### 3、使用 MyBatisX 生成代码 + +右键要生成代码的数据表,进入 MyBatisX 生成器: + +![](https://pic.yupi.icu/1/1697165207695-7376acef-0aed-41bb-ba86-d219c545f1ff.png) + +然后进入生成配置页面,可以根据你的需求来自定义代码生成规则: + +![](https://pic.yupi.icu/1/1697165249869-42b610a8-212b-4051-a734-540055da5203.png) + + + +上述配置中,我个人建议 `base package` (生成代码的包名和位置)尽量不要和已有的项目包名重叠,先把代码生成到一个完全不影响业务的位置,确认生成的代码没问题后,再移动代码会更保险一些。 + +进入下一步,填写更多的配置,可以选择生成代码的模板(一般是 MyBatis-Plus 模板),以及自定义实体类的生成规则(一般建议用 Lombok)。 + +以下是我常用的推荐配置: + +![](https://pic.yupi.icu/1/1697165484109-c74c6ea9-43c5-4798-8207-22f270ab8c14.png) + + + +改完配置后,直接点击生成即可,然后可以在包目录中看到生成的代码: + +![](https://pic.yupi.icu/1/1697165607223-cfaa2716-87f0-4aa0-af4f-4e3792a0103f.png) + + + +### 4、定制修改 + +通过以上方法,就已经能够完成基础增删改查代码的生成了,但一般情况下,我们得到生成的代码后,还要再根据自己的需求进行微调。 + +比如把主键 ID 的生成规则从自动递增改为雪花算法生成,防止数据 id 连续被别人轻松爬走: + +![](https://pic.yupi.icu/1/1697165797807-570135af-89e1-4d12-94ac-cd18cd9184d5.png) + + + +最后你就可以使用现成的代码来操作数据库啦~ + + + +## 其他 + +如开头所说,现在的代码生成器非常多,比如 MyBatis Plus 框架也提供了灵活的代码生成器: + +> 指路:https://baomidou.com/pages/981406/ + + + +![](https://pic.yupi.icu/1/1697166077805-a08866a0-911d-4ca5-a912-8ca7386ecbd5.png) + + + +再比如可以直接在浏览器使用的代码生成器,鱼皮自己也开发过并且开源了: + +> 指路:http://sqlfather.yupi.icu/ +> +> 开源:https://github.com/liyupi/sql-father-backend-public + + + +![](https://pic.yupi.icu/1/1697166153337-d7f2c378-ceaa-4163-b342-f334e720178a.png) + + + +感兴趣的话,大家也可以尝试使用 [FreeMarker](https://freemarker.apache.org/index.html) 技术做一个属于自己的代码生成器。 + + + +## 实践 + +编程导航星球的用户中心项目使用了 MyBatisX 插件来生成代码,非常简单,大家一定要学会运用! + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\347\254\254\344\270\211\346\226\271\346\234\215\345\212\241(\345\256\235\345\241\224)\345\277\253\351\200\237\351\203\250\347\275\262\351\241\271\347\233\256.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\347\254\254\344\270\211\346\226\271\346\234\215\345\212\241(\345\256\235\345\241\224)\345\277\253\351\200\237\351\203\250\347\275\262\351\241\271\347\233\256.md" new file mode 100644 index 0000000..2e92a87 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\344\275\277\347\224\250\347\254\254\344\270\211\346\226\271\346\234\215\345\212\241(\345\256\235\345\241\224)\345\277\253\351\200\237\351\203\250\347\275\262\351\241\271\347\233\256.md" @@ -0,0 +1,105 @@ +# 使用第三方服务(宝塔)快速部署项目 + +> 作者:[平安](https://github.com/lizhe-0423),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 15592 + +## 去码头搞一台服务器💻 + + + +首先,上线项目需要一台服务器,这里就不强调了 只说一下最近阿里上线了一个学生认证领300代金券的活动 大家可以冲 🎁 + + + +## 安装所需要的东西 + + + +**这里拿BI项目举例** + + + + 所以本次项目用到的需要安装的软件:rabbitmq、mysql、redis、nginx + + + +安装rabbitmq: + + + +https://blog.csdn.net/qq_45173404/article/details/116429302 + + + +跟着教程走即可 很详细!!! + + + +其余mysql、redis、nginx 在下载宝塔安装时进入宝塔面板中在软件商店里即可下载 + + + +![img](https://pic.yupi.icu/5563/202311030950165.gif) + + + +**记得放开端口哦,如果是新买的服务器也需要放开端口(服务器和宝塔里都需要放开端口)** + + + +## 修改前后端配置信息 + + + +· 将url全部切换成服务器ip地址的url + + + +· 在部署BI的时候还需要初始化一下rabbitmq + + + +如: + + + +![img](https://pic.yupi.icu/5563/202311030950167.gif) + + + +另外server也要改成ip地址或者0.0.0.0 (127.0.0.0 会报错)如: + + + +![img](https://pic.yupi.icu/5563/202311030950170.jpg) + + + +## 打包部署 + + + +前端打包后直接从宝塔里入口进入部署前端(鼠标拖进去就好) + + + +后端打包后打成jar包 直接敲命令 nohup java -jar yubi.jar 即可 + + + +## 🐟油们是怎么上线的? + + + +我们公司里是有一个脚本 + + + +部署项目的时候 只需要把jar包拖进去进行一个替换 + + + +然后用部署的脚本 类似这样 sh yubi.sh restart 重启一下 即可了 + + + +大家公司里是怎么部署的呢? \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\211\215\347\253\257\345\277\205\345\255\246\347\232\204\345\274\200\345\217\221\346\241\206\346\236\266\357\274\214Ant Design Pro.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\211\215\347\253\257\345\277\205\345\255\246\347\232\204\345\274\200\345\217\221\346\241\206\346\236\266\357\274\214Ant Design Pro.md" new file mode 100644 index 0000000..1628331 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\211\215\347\253\257\345\277\205\345\255\246\347\232\204\345\274\200\345\217\221\346\241\206\346\236\266\357\274\214Ant Design Pro.md" @@ -0,0 +1,106 @@ +# 前端必学的开发框架,Ant Design Pro + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +大家好,我是鱼皮,今天给大家分享一个我自己用了多年、现在团队也在用的前端框架 —— Ant Design Pro。 + + + +## 什么是 Ant Design Pro? + +Ant Design Pro 是由蚂蚁金服开发的、基于 Ant Design 组件库的开发框架,专门用于构建企业级管理后台和前端应用。 + +它提供了一整套前端中后台项目的解决方案,包括路由、权限管理、国际化、数据 mock、工程化等,帮助开发者快速搭建功能丰富的管理系统。 + +![](https://pic.yupi.icu/1/1696733808263-7785511b-8839-4063-9011-a5c2c38d8b96-20231008111631092.png) + + + +除了 Ant Design Pro 外,我们最好再了解一下 Ant Design 相关的技术生态,比如: + +1)Ant Design:一套企业级 UI 设计语言和组件库。它提供了丰富的界面组件、图标、布局和样式,用于构建现代化的 Web 应用程序。Ant Design 遵循一套统一的设计规范,提供一致性的用户体验。 + +地址:https://ant.design/ + + + +![](https://pic.yupi.icu/1/1696734230557-3b4ca2c3-50d9-4481-8bfd-f8e4ed84d2b6-20231008111631132.png) + + + +2)Ant Design ProComponents:在 Ant Design 的基础上进行封装和高度定制化的组件库,包含了像高级表格、表单等常用的业务组件,更适用于开发中后台项目,进一步提高开发效率。 + +地址:https://procomponents.ant.design/ + + + +![](https://pic.yupi.icu/1/1696734168120-3fe25dfc-f242-4635-9d7b-e6d8847fdf19-20231008111631166.png) + + + +3)AntV:一整套数据可视化组件和工具库。它提供了多种可视化图表和图形,用于帮助开发者在 Web 应用中创建交互式、吸引人的数据可视化图表。AntV 包括 G2、G6、F2 等多个子库,每个子库用于不同类型的数据可视化需求。 + +地址:https://antv.antgroup.com/ + + + +![](https://pic.yupi.icu/1/1696734337640-44a0fcd0-123d-4e77-af46-fbdc2a666089-20231008111631276.png) + + + +这么一大套技术,可以称得上 “全家桶” 了! + + + +## 为什么用 Ant Design Pro? + +从定位上来说,Ant Design Pro 是一个开箱即用的中后台前端开发框架,能够帮助我们快速开发大多数网站(尤其是管理系统)。 + +比如使用一行命令,就能得到下图的完整网站: + +![](https://pic.yupi.icu/1/1696734974474-c67966b9-1df6-42ef-b4ea-9f6974637950.png) + +从功能上来说,Ant Design Pro 提供了一整套前端解决方案,包括路由、权限管理、数据管理、国际化、数据 mock、工程化、打包部署等,基本覆盖了整个前端开发流程,不用自己再去整合一堆库、自己创建各种配置了,大幅提高开发效率。 + +从生态上来说,Ant Design Pro 是由大厂团队开发维护、质量有保障;并且在 GitHub 上有几万个 star、社区也比较活跃,很多开发时出现的问题都有解决方案。 + +而作为一名全栈开发者,鱼皮个人喜欢使用 Ant Design 和 Ant Design Pro 全家桶的重要原因是:Ant Design 同时有 Vue 和 React 的实现版本,无论我选择什么前端框架开发项目,都能保持编码和网站效果的一致性,进一步提高开发效率。 + +换言之,学这一套组件库就足够了! + + + +## 如何学习 Ant Design Pro? + +由于该框架由大厂团队开发,经常发布更新版本和改动,所以请务必 **阅读官方文档** 来学习,千万不要完全机械性地跟着教程去学习! + +官方文档:https://pro.ant.design/zh-CN/docs/getting-started/ + +Ant Design Pro 的官方文档写得还是非常清晰易懂的,从入门、开发再到部署都有完整的讲解,按照顺序读一遍就行了。 + +这里再给大家几个学习建议: + +1. 根据项目选择合适的文档版本,再去阅读,v4 版本和 v5 版本差异非常大,我个人更喜欢用 v4 版本 +2. 新手在不熟悉 Ant Design Pro 功能之前,建议不要创建全量区块项目,选择 `simple` 即可 +3. 边读文档边实践,多尝试修改代码并查看效果,更容易理解 Ant Design Pro 框架的功能 + + + +![](https://pic.yupi.icu/1/1696733234789-1c9c36d7-865a-4623-92b4-b124be120469-20231008111631334.png) + + + +如果你学习使用 Ant Design Pro 框架的项目教程时,遇到了报错,不用慌张。先去看最新官方文档上的命令和用法,或者切换文档版本为和视频一致。如果还有报错,那么就把错误信息贴到百度去查询。如果还有报错,去框架的 Github Issues 区去搜一下(比如:https://github.com/ant-design/ant-design-pro/issues),99% 你遇到的问题别人也遇到过,而且大多数情况下都有对应的解决方案。 + +希望大家灵活一点,任何教程都有保质期,学会阅读官方文档、通过各种渠道自主解决问题,才能让你之后的编程学习风雨无阻! + + + +## 实践 + +[编程导航](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247550581&idx=1&sn=07c76f0bcf7a2f790f6702f2527bbdb4&chksm=e9c2e182deb5689483daa2e667d0a49b97e01092c274a8d89ff5e7e77430e7106368d0f1c543&token=35563974&lang=zh_CN#rd) 的用户中心项目、API 开放平台项目、智能 BI 项目都使用了 Ant Design Pro 作为前端开发框架,并且使用了 Ant Design 作为组件库。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\345\246\202\344\275\225\347\274\226\345\206\231\345\215\225\345\205\203\346\265\213\350\257\225\357\274\237 .md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\345\246\202\344\275\225\347\274\226\345\206\231\345\215\225\345\205\203\346\265\213\350\257\225\357\274\237 .md" new file mode 100644 index 0000000..ccbc1cb --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\345\246\202\344\275\225\347\274\226\345\206\231\345\215\225\345\205\203\346\265\213\350\257\225\357\274\237 .md" @@ -0,0 +1,318 @@ +# 后端如何编写单元测试? + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +大家好,我是鱼皮,很多初学编程的同学都会认为 “程序员的工作只有开发新功能,功能做完了就完事儿”。但其实不然,保证程序的正常运行、提高程序的稳定性和质量也是程序员的核心工作。 + +之前给大家分享过企业项目的完整开发流程,其中有一个关键步骤叫 “单元测试”,这篇文章就来聊聊程序员如何编写单元测试吧。 + + + +## 什么是单元测试? + +单元测试(Unit Testing,简称 UT)是软件测试的一种,通常由开发者编写测试代码并运行。相比于其他的测试类型(比如系统测试、验收测试),它关注的是软件的 **最小** 可测试单元。 + +什么意思呢? + +假如我们要实现用户注册功能,可能包含很多个子步骤,比如: + +1. 校验用户输入是否合法 +2. 校验用户是否已注册 +3. 向数据库中添加新用户 + +其中,每个子步骤可能都是一个小方法。如果我们要保证用户注册功能的正确可用,那么就不能只测试注册成功的情况,而是要尽量将每个子步骤都覆盖到,分别针对每个小方法做测试。比如输入各种不同的账号密码组合来验证 “校验用户输入是否合法” 这一步骤在成功和失败时的表现是否符合预期。 + +同理,如果我们要开发一个很复杂的系统,可能包含很多小功能,每个小功能都是一个单独的类,我们也需要针对每个类编写单元测试。因为只有保证每个小功能都是正确的,整个复杂的系统才能正确运行。 + +单元测试的几个核心要点是: + +1. 最小化测试范围:单元测试通常只测试代码的一个非常小的部分,以确保测试的简单和准确。 +2. 自动化:单元测试应该是自动化的,开发人员可以随时运行它们来验证代码的正确性,特别是在修改代码后。而不是每次都需要人工去检查。 +3. 快速执行:每个单元测试的执行时间不能过长,应该尽量做到轻量、有利于频繁执行。 +4. 独立性:每个单元测试应该独立于其他测试,不依赖于外部系统或状态,以确保测试的可靠性和可重复性。 + + + +## 为什么需要单元测试? + +通过编写和运行单元测试,开发者能够快速验证代码的各个部分是否按照预期工作,有利于保证系统功能的正确可用,这是单元测试的核心作用。 + +此外,单元测试还有很多好处,比如: + +1)改进代码:编写单元测试的过程中,开发者能够再次审视业务流程和功能的实现,更容易发现一些代码上的问题。比如将复杂的模块进一步拆解为可测试的单元。 + +2)利于重构:如果已经编写了一套可自动执行的单元测试代码,那么每次修改代码或重构后,只需要再自动执行一遍单元测试,就知道修改是否正确了,能够大幅提高效率和项目稳定性。 + +3)文档沉淀:编写详细的单元测试本身也可以作为一种文档,说明代码的预期行为。 + + + +鱼皮以自己的一个实际开发工作来举例单元测试的重要性。我曾经编写过一个 SQL 语法解析模块,需要将 10000 多条链式调用的语法转换成标准的 SQL 语句。但由于细节很多,每次改进算法后,我都不能保证转换 100% 正确,总会人工发现那么几个错误。所以我编写了一个单元测试来自动验证解析是否正确,每次改完代码后执行一次,就知道解析是否完全成功了。大幅提高效率。 + + + +所以无论是后端还是前端程序员,都建议把编写单元测试当做一种习惯,真的能够有效提升自己的编码质量。 + + + +## 如何编写单元测试? + +以 Java 开发为例,我们来学习如何编写单元测试。 + +Java 开发中,最流行的单元测试框架当属 JUnit 了,它提供了一系列的类和方法,可以帮助我们快速检验代码的行为。 + + + +### 1、引入 JUnit + +首先我们要在项目中引入 JUnit,演示 2 种方式: + +#### Maven 项目引入 + +在 pom.xml 文件中引入 JUnit 4 的依赖: + +```xml + + junit + junit + 4.13.2 + test + +``` + + + +#### Spring Boot 项目引入 + +如果在 Spring Boot 中使用 JUnit 单元测试,直接引入 spring-boot-starter-test 包即可: + +```xml + + org.springframework.boot + spring-boot-starter-test + test + +``` + + + +然后会自动引入 JUnit Jupiter,它是 JUnit 5(新版本)的一部分,提供了全新的编写和执行单元测试的方式,更灵活易用。不过学习成本极低,会用 JUnit 4,基本就会用 JUnit Jupiter。 + + + +### 2、编写单元测试 + +编写一个单元测试通常包括三个步骤:准备测试数据、执行要测试的代码、验证结果。 + +一般来说,每个类对应一个单元测试类,每个方法对应一个单元测试方法。 + + + +#### 编写 JUnit 单元测试 + +比如我们要测试一个计算器的求和功能,示例代码如下: + +```java +import org.junit.Test; +import org.junit.Assert; + +public class CalculatorTest { + + // 通过 Test 注解标识测试方法 + @Test + public void testAdd() { + // 准备测试数据 + long a = 2; + long b = 3; + + // 执行要测试的代码 + Calculator calculator = new Calculator(); + int result = calculator.add(2, 3); + + // 验证结果 + Assert.assertEquals(5, result); + } +} +``` + + + +上述代码中的 Assert 类是关键,提供了很多断言方法,比如 assertEquals(是否相等)、assertNull(是否为空)等,用来对比程序实际输出的值和我们预期的值是否一致。 + + + +如果结果正确,会看到如下输出: + +![](https://pic.yupi.icu/1/1697609273814-44bb1e84-d68f-4eda-bff9-2997fe95a1f0.png) + + + +如果结果错误,输出如下,能够清晰地看到执行结果的差异: + +![](https://pic.yupi.icu/1/1697609301031-25008e1c-3e34-454d-b522-5dc4f828895b.png) + + + +#### Spring Boot 项目单测 + +如果是 Spring Boot 项目,我们经常需要对 Mapper 和 Service Bean 进行测试,则需要使用 `@SpringBootTest` 注解来标识单元测试类,以开启对依赖注入的支持。 + +以测试用户注册功能为例,示例代码如下: + +```java +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.annotation.Resource; + +@SpringBootTest +public class UserServiceTest { + + @Resource + private UserService userService; + + @Test + void userRegister() { + // 准备数据 + String userAccount = "yupi"; + String userPassword = ""; + String checkPassword = "123456"; + // 执行测试 + long result = userService.userRegister(userAccount, userPassword, checkPassword); + // 验证结果 + Assertions.assertEquals(-1, result); + // 再准备一组数据,重复测试流程 + userAccount = "yu"; + result = userService.userRegister(userAccount, userPassword, checkPassword); + Assertions.assertEquals(-1, result); + } +} +``` + + + +### 3、生成测试报告 + +如果系统的单元测试数量非常多(比如 1000 个),那么只验证某个单元测试用例是否正确、查看单个结果是不够的,我们需要一份全面完整的单元测试报告,便于查看单元测试覆盖度、评估测试效果和定位问题。 + +**测试覆盖度** 是衡量测试过程中被测试到的代码量的一个指标,一般情况下越高越好。测试覆盖度 100% 表示整个系统中所有的方法和关键语句都被测试到了。 + +下面推荐 2 种生成单元测试报告的方法。 + + + +#### 使用 IDEA 生成单测报告 + +直接在 IDEA 开发工具中选择 `Run xxx with Coverage` 执行单元测试类: + +![](https://pic.yupi.icu/1/1697610011076-506f8950-fc1b-4855-b7ff-7d85a218b494.png) + +然后就能看到测试覆盖度报告了,如下图: + +![](https://pic.yupi.icu/1/1697610075040-5888772b-4a12-451e-9588-8d4340595783.png) + + + +显然 Main 方法没有被测试到,所以显示 0%。 + +除了在开发工具中查看测试报告外,还可以导出报告为 HTML 文档: + +![](https://pic.yupi.icu/1/1697610367456-2d78a91b-6b4d-4750-8d59-aafd740eff83.png) + + + +导出后,会得到一个 HTML 静态文件目录,打开 `index.html` 就能在浏览器中查看更详细的单元测试报告了: + +![](https://pic.yupi.icu/1/1697610417360-3c62214f-0fec-4d31-9f96-1f4916c25f3c.png) + + + +这种方式简单灵活,不用安装任何插件,比较推荐大家日常学习使用。 + + + +#### 使用 jacoco 生成单测报告 + +JaCoCo 是一个常用的 Java 代码覆盖度工具,能够自动根据单元测试执行结果生成详细的单测报告。 + +它的用法也很简单,推荐按照官方文档中的步骤使用。 + +官方文档指路:https://www.eclemma.org/jacoco/trunk/doc/maven.html + + + +首先在 Maven 的 pom.xml 文件中引入: + +```xml + + org.jacoco + jacoco-maven-plugin + 0.8.11 + +``` + + + +当然,只引入 JaCoCo 插件还是不够的,我们通常希望在执行单元测试后生成报告,所以还要增加 `executions` 执行配置,示例代码如下: + +```xml + + org.jacoco + jacoco-maven-plugin + 0.8.11 + + + com/**/* + + + + + pre-test + + prepare-agent + + + + post-test + test + + report + + + + +``` + + + +然后执行 Maven 的 test 命令进行单元测试: + +![](https://pic.yupi.icu/1/1697611098751-fc378d78-614d-4d4e-aa2e-9f036810c521.png) + + + +测试结束后,就能够在 target 目录中,看到生成的 JaCoCo 单元测试报告网站了: + +![](https://pic.yupi.icu/1/1697611117634-e9195bd8-90de-4e1a-b3f6-def653a48c01.png) + + + +打开网站的 index.html 文件,就能看到具体的测试报告结果,非常清晰: + +![](https://pic.yupi.icu/1/1697611175522-e2987553-1e6b-4446-91e0-743284ad77ab.png) + + + +通常这种方式会更适用于企业中配置流水线来自动化生成测试报告的场景。 + + + +## 实践 + +编程导航星球的用户中心项目详细讲解了如何使用 JUnit 编写规范的单元测试。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\351\241\271\347\233\256\347\273\217\345\205\270\345\210\206\345\261\202\346\236\266\346\236\204\344\273\213\347\273\215.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\351\241\271\347\233\256\347\273\217\345\205\270\345\210\206\345\261\202\346\236\266\346\236\204\344\273\213\347\273\215.md" new file mode 100644 index 0000000..064fb67 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\220\216\347\253\257\351\241\271\347\233\256\347\273\217\345\205\270\345\210\206\345\261\202\346\236\266\346\236\204\344\273\213\347\273\215.md" @@ -0,0 +1,91 @@ +# 后端项目经典分层架构介绍 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +大家好,我是鱼皮。开发后端项目时,我们最常见的一种架构模式就是 `分层架构` 。 + +所谓的分层架构,就是把系统自上而下分为多个不同的层,每一层都有特定的功能和职责,且只和自己的直接上层与直接下层 “打交道”。 + +分层架构的优点是:每一层都有明确定义的职责,易于理解和维护;而且各层可以独立扩展,以适应不同的需求。 + +所以分层架构也是最适合新手入门学习、并且实际开发中应用最多的架构。 + + + +## 分层架构 + +下面给大家一种 Java 企业级后端项目开发时常用的分层架构,一般从前端界面(表示层)发送的请求出发,需要经历接入层、控制层、业务逻辑层、通用业务层、数据访问层、系统资源层等。 + +**表示层** 通常是指让用户交互和查看信息的前端界面,比如用户点击按钮后能够发送一个请求,也可以叫用户层、界面层等。 + +发送请求后,会经过 **接入层** ,比如 Nginx 网关、或者其他中间件,对请求做一个预处理或转发,比如实现负载均衡。这一层不是必须存在的,通常更适用于中大型项目,前端也可以直接请求后端。 + +接入层会将请求转发到 **控制层**(Controller),负责接受请求、调用业务逻辑层(Service)的代码实现功能、然后响应结果。控制层一般不建议写复杂的业务逻辑,尽量保持精简。 + +接下来是 **业务逻辑层**(Service),负责处理复杂的业务逻辑,比如对请求数据进行校验、处理、调用数据访问层以将结果存到数据库中等,也是我们做系统时主要开发编码的部分。 + +**通用业务层**(Manager、Module)是一种特殊的业务逻辑层,主要的作用是抽取了一些需要被多个业务调用的公共代码,比如上传文件到对象存储、鉴权等,从而实现复用。 + +**数据访问层**(Dao / Mapper)负责操作底层的数据源,比如对数据库、文件、缓存等进行增删改查。 + +最后是 **系统资源层** ,也可以叫基础设施层,包括各种基础服务、系统环境等,比如数据库、消息队列、Redis、文件存储、Linux 系统、Docker 等。复杂的基础设施可能还包括 K8S 容器资源编排、资源调度平台等。 + + + +------ + + + +需要注意的是,并不是所有的分层架构都需要这么划分,不同业务和团队可能有自己的分层选择与规范。 + +比如我带大家开发的 [OJ 在线判题系统](https://yuyuanweb.feishu.cn/wiki/LhjxwgFjwiovTVk9w2vcJoj4nid) ,分层架构如下: + +![](https://pic.yupi.icu/1/1697022742320-afe5d60d-b0ba-4b02-91a9-d5870021af16.png) + + + +## 示例项目结构 + +基于分层架构,我们可以将项目按照特定的目录名(包名)来组织代码,比如: + +- controller:控制层 +- service:业务逻辑层 +- mapper:数据访问层 +- model:数据模型 + +还可以按照业务或文件的类型来划分目录,比如: + +- constant:常量 +- annotation:注解类 +- common:公共类 +- config:配置类 +- job:任务 +- exception:异常处理相关 +- utils:工具类 + + + +以之前带大家做过的 [寻爱网项目](https://wx.zsxq.com/dweb2/index/topic_detail/415521148215518) 为例,项目的目录结构如图: + +![](https://pic.yupi.icu/1/1697023472138-1db5caf0-dfcf-4835-ad6c-c7ccc80584fd.png) + + + +## 其他知识 + +1)计算机网络也是采用了经典的分层架构,OSI 七层参考模型中,把计算机网络自底向上分为了物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。每个层只处理特定的功能,比如数据传输、数据的路由;层与层之间通过接口(或者叫协议)进行通信。 + +2)需要注意的是,我们常用的后端开发框架 Spring MVC 是基于 MVC(Model-View-Controller)设计模式构建的,而不能算是传统的分层架构。而且一般现在的项目中只使用 Spring MVC 作为整个项目的控制层,不过大多数用了 Spring MVC 框架的项目基本都使用了分层架构。 + + + +## 实践 + +想了解更多常见的后端架构设计,推荐阅读这篇文章:[架构设计,让网站支棱起来!](https://mp.weixin.qq.com/s/iE3iOhLwxwMYhilOyyf90Q) + +编程导航星球的所有后端项目基本都使用了经典分层架构,随便实践一个项目都能学会这种架构方式。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\345\277\253\351\200\237\345\277\275\347\225\245 Git \346\226\207\344\273\266\346\217\220\344\272\244\357\274\237.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\345\277\253\351\200\237\345\277\275\347\225\245 Git \346\226\207\344\273\266\346\217\220\344\272\244\357\274\237.md" new file mode 100644 index 0000000..406aebf --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\345\277\253\351\200\237\345\277\275\347\225\245 Git \346\226\207\344\273\266\346\217\220\344\272\244\357\274\237.md" @@ -0,0 +1,81 @@ +# 如何快速忽略 Git 文件提交? + +> 作者:[程序员鱼皮](https://space.bilibili.com/12890453/),[编程导航星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 编号 1 + + + +当我们使用 IDEA 等开发工具或脚手架创建好新项目后,使用 IDEA 开发工具打开项目,进入底部的 `Git` 标签,会发现很多和项目无关的 IDEA 自动生成的工程文件被添加到了 Git 托管。 + +![](https://pic.yupi.icu/1/1699348521888-443df7c7-ff16-47a6-a9f8-6fca2db66258.png) + + + +但我们是不希望提交这些文件的,没有意义,所以需要使用 `.gitignore` 文件来忽略这些文件,不让它们被 Git 托管。 + +如何编写 .gitignore 文件呢? + +其实很简单,不用自己编写!我们在 IDEA 的 Settings => Plugins 中搜索 `.ignore` 插件并安装: + +![](https://pic.yupi.icu/1/1699348755922-4a97a0d7-1cbf-47de-a3f4-b1ae3ae81ac6.png) + + + +然后在项目根目录处选中右键,使用 .ignore 插件创建 .gitignore 文件: + +![](https://pic.yupi.icu/1/1699348817484-a77c150f-9fc3-476b-b77f-67e141e7a811.png) + + + +.ignore 插件提供了很多默认的 .gitignore 模板,根据自己的项目类型和使用的开发工具进行选择,此处我们选择 Java 和 JetBrains 模板: + +![](https://pic.yupi.icu/1/1699348931526-9608280d-dbfd-4d38-86c1-cb5eecf60017.png) + + + +然后可以在项目根目录看到生成的 .gitignore 文件,模板已经包含了常用的 Java 项目忽略清单,比如编译后的文件、日志文件、压缩包等: + +![](https://pic.yupi.icu/1/1699349391749-55fd3c6c-cbc4-4ec0-a7d0-73a203cc28d0.png) + + + +让我们再手动添加几个要忽略的目录和文件,比如打包生成的 target 目录: + +![](https://pic.yupi.icu/1/1699349485840-4da51d88-d92c-49ec-ad7b-066f3e7af601.png) + + + +但是,我们会发现,即使有些文件已经添加到了 .gitignore 文件中,在 IDEA 中显示的还是绿色(已被 Git 托管)状态。如下图: + +![](https://pic.yupi.icu/1/1699349281523-07d73d50-7cd4-4809-a384-36ac86134327.png) + + + +这是因为这些文件已经被 Git 跟踪。而 .gitignore 文件仅影响未跟踪的文件,如果文件已经被 Git 跟踪,那么 .gitignore 文件对它们没有影响。 + +所以我们需要打开终端,在项目根目录下执行如下命令,取消 Git 跟踪: + +```shell +git rm -rf --cached . +``` + + + +执行效果如图: + +![](https://pic.yupi.icu/1/1699349241520-7d6a09e0-1119-4ace-9722-33af3276fb22.png) + + + +可以看到文件变成了红色(未被 Git 托管)或黄色(被忽略)状态: + +![](https://pic.yupi.icu/1/1699349699120-e39169e3-2c77-4730-a24e-685fbcabe474.png) + + + +然后,让我们将 .gitignore 文件添加到 Git 暂存区,让它能够被 Git 管理。 + +![](https://pic.yupi.icu/1/1699349777115-eb7b08a4-a5f3-4b2d-b76a-dac90e96bc0d.png) + + + +至此,就已经完成一个干净的 Git 仓库项目啦~ \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\350\247\243\345\206\263\346\225\260\346\215\256\346\237\245\350\257\242\344\270\272\347\251\272\347\232\204 Bug\357\274\237.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\350\247\243\345\206\263\346\225\260\346\215\256\346\237\245\350\257\242\344\270\272\347\251\272\347\232\204 Bug\357\274\237.md" new file mode 100644 index 0000000..0d0c0e7 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\350\247\243\345\206\263\346\225\260\346\215\256\346\237\245\350\257\242\344\270\272\347\251\272\347\232\204 Bug\357\274\237.md" @@ -0,0 +1,124 @@ +# 如何解决数据查询为空的 Bug? + +> 作者:[程序员鱼皮](https://space.bilibili.com/12890453/),[编程导航星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) 编号 1 + + + +大家在开发时,遇到的一个典型的 Bug 就是:为什么数据查询为空? + +对应的现象就是:前端展示不出数据、或者后端查询到的数据列表为空。 + +![](https://pic.yupi.icu/1/1698891856196-b6f20274-9224-4fd9-a0c8-f10a46170aef-20231102133931574.png) + +遇到此类问题,其实是有经典的解决套路的,下面鱼皮给大家分享如何高效解决这个问题。 + +只需 4 个步骤: + + + +## 解决步骤 + +### 1、定位问题边界 + +首先要定位数据查询为空的错误边界。说简单一点,就是要确认是前端还是后端的锅。 + +要先从请求的源头排查,也就是前端浏览器,毕竟前端和后端是通过接口(请求)交互的。 + +在浏览器中按 F12 打开浏览器控制台,进入网络标签,然后刷新页面或重新触发请求,就能看到请求的信息了。 + +选中请求并点击预览,就能看到后端返回结果,有没有返回数据一看便知。 + +![](https://pic.yupi.icu/1/1698891947432-a521a5c2-2c57-4307-bad3-0242cb3dff67-20231102133931604.png) + +![](https://pic.yupi.icu/1/1698892093874-2517f3bf-49d5-40c8-9f8c-c6c40fe926e6-20231102133931639.png) + + + +如果发现后端正常返回了数据,那就是前端的问题,查看自己的页面代码来排查为什么数据没在前端显示,比如是不是取错了数据的结构?可以多用 debugger 或 console.log 等方式输出信息,便于调试。 + +星球同学可以免费阅读前端嘉宾神光的《前端调试通关秘籍》:https://t.zsxq.com/13Rh4xxNK + + + +如果发现后端未返回数据,那么前端需要先确认下自己传递的参数是否正确。 + +比如下面的例子,分页参数传的太大了,导致查不到数据: + +![](https://pic.yupi.icu/1/1698892380058-7484b6af-21ef-4159-9267-64e22c162a90-20231102133931650.png) + + + +如果发现请求参数传递的没有问题,那么就需要后端同学帮忙解决了。 + +通过这种方式,直接就定位清楚了问题的边界,高效~ + + + +### 2、后端验证请求 + +接下来的排查就是在后端处理了,首先开启 Debug 模式,从接受请求参数开始逐行分析。 + +比如先查看请求参数对象,确认前端有没有按照要求传递请求参数: + +![](https://pic.yupi.icu/1/1698893025601-50145488-e10a-47a2-a787-8d5e66e23e81-20231102133931709.png) + +毕竟谁能保证我们的同事(或者我们自己)不是小迷糊呢?即使前端说自己请求是正确的,但也必须要优先验证,而不是一上来就去分析数据库和后端程序逻辑的问题。 + +验证请求参数对象没问题后,接着逐行 Debug,直到要执行数据库查询。 + + + +### 3、后端验证数据库查询 + +无论是从 MySQL、MongoDB、Redis,还是文件中查询数据,为了理解方便,我们暂且统称为数据库。 + +上一步中,我们已经 Debug 到了数据库查询,需要重点关注 2 个点: + +1)查看封装的请求参数是否正确 + +对于 MyBatis Plus 框架来说,就是查看 QueryWrapper 内的属性是否正确填充了查询条件 + +![](https://pic.yupi.icu/1/1698893321346-e29f225f-4506-4c3a-a0f7-77b176bfcb6e-20231102133931781.png) + + + +2)查看数据库的返回结果是否有值 + +比如 MyBatis Plus 的分页查询中,如果 records 属性的 size 大于 0,表示数据库返回了数据,那么就不用再排查数据库查询的问题了;而如果 size = 0,就要分析为什么从数据库中查询的数据为空。 + +![](https://pic.yupi.icu/1/1698893389456-177c8d95-3825-44f6-b713-98d7dddaa31f-20231102133931819.png) + + + +这一步尤为关键,我们需要获取到实际发送给数据库查询的 SQL 语句。如果你使用的是 MyBatis Plus 框架,可以直接在 `application.yml` 配置文件中开启 SQL 语句日志打印,参考配置如下: + +```yaml +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl +``` + + + +然后执行查询,就能看到完整的 SQL 语句了: + +![](https://pic.yupi.icu/1/1698902718455-5731f602-a2ee-4b7c-8ca6-9bbf2790bc59-20231102133931835.png) + + + +把这个 SQL 语句复制到数据库控制台执行,验证下数据结果是否正确。如果数据库直接执行语句都查不出数据,那就确认是查询条件错误了还是数据库本身就缺失数据。 + + + +### 4、后端验证数据处理逻辑 + +如果数据库查询出了结果,但最终响应给前端的数据为空,那么就需要在数据库查询语句后继续逐行 Debug,验证是否有过滤数据的逻辑。 + +比较典型的错误场景是查询出的结果设置到了错误的字段中、或者由于权限问题被过滤和脱敏掉了。 + + + +## 最后 + +以后再遇到数据查询为空的情况,按照以上步骤排查问题即可。排查所有 Bug 的核心流程都是一样的,先搜集信息、再定位问题、最后再分析解决。 + diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\351\253\230\346\225\210\346\265\213\350\257\225\346\216\245\345\217\243\357\274\237\350\207\252\345\212\250\347\224\237\346\210\220\346\216\245\345\217\243\346\226\207\346\241\243.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\351\253\230\346\225\210\346\265\213\350\257\225\346\216\245\345\217\243\357\274\237\350\207\252\345\212\250\347\224\237\346\210\220\346\216\245\345\217\243\346\226\207\346\241\243.md" new file mode 100644 index 0000000..bcb6587 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\246\202\344\275\225\351\253\230\346\225\210\346\265\213\350\257\225\346\216\245\345\217\243\357\274\237\350\207\252\345\212\250\347\224\237\346\210\220\346\216\245\345\217\243\346\226\207\346\241\243.md" @@ -0,0 +1,236 @@ +# 如何高效测试接口?自动生成接口文档 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +作为一名后端程序员,一定要对自己写的接口负责,保证接口的正确和稳定性。因此,接口测试也是后端开发中的关键环节。 + +但我相信,很多朋友是懒得测试接口的,觉得这很麻烦。一般自己写的接口自己都不调用,而是直接甩给前端或者其他调用方去验证,出了问题再改。虽然自己爽了,但在别人眼里,可能已经对你 “怀恨在心”,不是不报,时候未到而已。 + +其实测试接口并不难,这篇文章就给大家分享一些常用的接口测试工具,其中有些工具不仅能帮助你高效测试接口,甚至还能自动生成接口代码和接口文档! + + + +## 常用接口测试工具 + +这里给大家推荐 4 种常用的接口测试工具,至于到底用哪个,全凭大家的喜好,自己用着舒服就好。 + + + +### 1、cURL + +cURL 是一个功能强大的命令行工具,它可以用命令的形式来发送各种类型的 HTTP 请求。虽然它没有图形界面,但是却非常灵活,深受开发者们的喜爱。 + +> 指路:https://curl.se/ + + + +cURL 的用法也很简单,比如测试 GET 请求类型的接口,只需输入下列命令: + +```bash +curl <要测试的接口地址> +``` + + + +测试 POST 类型的接口,命令如下: + +```bash +curl -d '{"name":"yupi"}' + -H "Content-Type: application/json" + <要测试的接口地址> +``` + + + +其中使用 `-d` 选项表示要发送的数据,`-H` 选项设置请求头,指定发送 JSON 数据。 + +以上只是 cURL 的基础用法,它还支持很多高级的参数,不过没必要去记忆。一般我们在调用别人接口时,可以先在 F12 开发者工具中找到某个请求,然后点击 `以 cURL 格式复制` 就能得到可直接使用的 curl 命令了。 + +![](https://pic.yupi.icu/1/1697727100098-011d8a12-2fe5-4421-8f8d-825c21d63f56.png) + + + +强烈建议大家学会使用 cURL,尤其是 Linux 开发者们,在没有图形界面的场景下这个工具可太实用了。 + + + +### 2、Apifox + +要是几年前,我可能还会建议大家去用 Postman 这种图形界面测试软件,但现在时代变了,越来越多国产的接口测试工具能力已经远超了 Postman。 + +比如我在用的 Apifox,它是一个非常强大的 `API 设计 + 开发 + 测试一体` 的协作工具。 + +> 指路:http://apifox.com/b2liyupi + + + +首先是支持 20 多种格式的接口数据导入,快速可视化接口信息: + +![](https://pic.yupi.icu/1/1697727719582-3b58a60f-70a8-42b1-ba48-14adbeedd4c9.png) + + + +然后可以一键调试接口,哪怕你本地的后端服务器没有启动,也可以通过 Mock 功能快速生成模拟数据! + +![](https://pic.yupi.icu/1/1697727817429-5ebc1665-2179-45f3-aa55-bd863d78d01a.png) + + + +Apifox 还有个很强大的能力,支持基于接口信息去生成 130 多种语言及框架的代码!也就是说,你可以先和前端约定并编写好接口文档,然后直接生成代码就能给前端调试了。 + +![](https://pic.yupi.icu/1/1697727951940-af4b1020-2acb-4730-b714-12cb863c3254.png) + + + +更多的功能就先不介绍了,感兴趣的同学自己探索。 + + + +### 3、IDEA 的 HTTP Client + +IntelliJ IDEA 开发工具内置了一个 HTTP Client 工具,它允许开发者在 IDE 中直接创建、管理和发送 HTTP 请求,并查看响应结果。 + +用法很简单,首先进入 IDE 的 Tools => HTTP Client,点击创建一个请求: + +支持将 cURL 转换为 HTTP 请求,可见 cURL 的地位 + +![](https://pic.yupi.icu/1/1697728344182-79ba6724-5b50-4978-b037-b35f2fac0c75.png) + +然后进入请求编辑界面,刚开始不熟悉请求编写语法的话,可以点击右上角导入示例的请求信息: + +![](https://pic.yupi.icu/1/1697728547281-1407dd65-67d8-4a57-a4ac-3c5979338560.png) + +比如导入一个 GET 请求示例: + +![](https://pic.yupi.icu/1/1697728604443-a711636d-553c-4c68-9e1c-1f7992e73e3a.png) + + + +然后点击绿色的箭头就能发送接口测试请求了,能够看到详细的响应信息: + +![](https://pic.yupi.icu/1/1697728679041-2f5203ea-da78-4088-96d7-5ee408e79877.png) + + + +不过我个人不喜欢这种方式来测试接口,写代码已经很累了,结果测试接口还让我写代码??? + + + +### 4、Swagger 和 Knife4j + +#### Swagger + +Swagger 是一个知名的 API 开源项目。此前,很多同学对 Swagger 的认识可能仅停留在生成接口文档,即下图的 `Swagger UI`,可以在线查看和调试接口信息。 + +> 指路:https://swagger.io/tools/swagger-ui/ + +![](https://pic.yupi.icu/1/1697728940485-0597573e-97c2-4867-a79e-9cdb0aab2f04.png) + + + +但实际上,Swagger UI 只是 Swagger 的其中一个功能,Swagger 还包含了 Swagger Editor 接口编辑器、Swagger Codegen 代码生成器等强大工具。 + +![](https://pic.yupi.icu/1/1697729062255-9dbd38c5-dfc1-4de8-a42d-8b824c59f9da.png) + + + +严格来说,Swagger 是 **一套** 完整的 API 开发工具,让我们在统一的界面中完成 API 设计、接口开发、接口测试、文档生成等功能,极大地提高了开发效率。 + +一般来说,只需要在项目中引入 Swagger 依赖,并且通过注解的方式来描述 API 的信息,就可以使用它进行接口测试和文档生成了。 + +但其实,我个人已经很久没有直接使用 Swagger 了,而是会选用它的增强版 `Knife4j` 来生成接口文档。要说原因的话,就是 Swagger 的默认界面有点小丑,API 多了管理起来就会很麻烦。 + +感受一下: + +![](https://pic.yupi.icu/1/1697729785541-29de1f7b-e428-4ba8-8104-8fe75af138d3.png) + + + +#### Knife4j + +Knife4j 是一个基于 Swagger 的增强工具,它提供了更美观的界面和更多功能,让接口测试和文档生成更加高效。 + +> 指路:https://doc.xiaominfo.com/ + + + +Knife4j 的用法很简单,按照官方文档的指引,首先根据自己项目的 Spring Boot 版本引入对应的依赖,比如 Spring Boot 2.x 推荐使用以下 Maven 配置: + +```xml + + com.github.xiaoymin + knife4j-openapi2-spring-boot-starter + 4.3.0 + +``` + + + +然后在 Spring Boot 的配置文件 `application.yml` 中添加 Knife4j 相关配置,比如: + +```yaml +knife4j: + enable: true + openapi: + title: Knife4j 文档 +``` + + + +最后,访问 Knife4j 的文档地址(一般是项目地址 + `/doc.html`),即可查看自动根据 Controller 接口代码而生成的接口文档。 + +示例文档如下: + +![](https://pic.yupi.icu/1/1697730186817-40f8d1db-ea19-45f9-ae0e-b7f032c0189e.png) + +选中某个接口,就可以在线调试了: + +![](https://pic.yupi.icu/1/1697730368657-397cec17-d11a-4d40-a620-ab6d4b9b3918.png) + + + +当然,因为 Knife4j 的底层也是依赖 Swagger 的,所以你还可以使用 Swagger 注解来自定义接口的信息。 + +比如下列代码,就使用了 Swagger 的 @Api 和 @ApiOperation 注解给接口添加名称和描述信息: + +```java +@RestController +@RequestMapping("/api/posts") +@Api(tags = "帖子管理") +public class PostController { + + @PostMapping + @ApiOperation(value = "创建帖子", notes = "用于创建新的帖子") + public ResponseEntity createPost(@RequestBody PostRequest postRequest) { + // 在这里实现创建帖子的逻辑 + return ResponseEntity.ok("帖子创建成功"); + } +} +``` + + + +这样能让生成的接口文档更通俗易懂,而不是大把的英文。 + + + +------ + + + +总结一下,我个人最推荐的接口调试方式是 cURL、Apifox 和 Knife4j 的组合: + +- 无界面(Linux)环境用 cURL +- 桌面端管理接口、Mock 数据用 Apifox +- 项目中引入 Knife4j,实现快速的接口文档生成和 web 共享 + + + +## 实践 + +编程导航星球的所有后端项目都使用了 Swagger + Knife4j 实现接口调试和接口文档生成。 + +👉🏻 编程导航原创项目教程系列:https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\274\200\345\217\221\344\274\201\344\270\232\345\276\256\344\277\241\347\276\244\346\234\272\345\231\250\344\272\272\357\274\214\345\256\236\347\216\260\345\256\232\346\227\266\346\217\220\351\206\222.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\274\200\345\217\221\344\274\201\344\270\232\345\276\256\344\277\241\347\276\244\346\234\272\345\231\250\344\272\272\357\274\214\345\256\236\347\216\260\345\256\232\346\227\266\346\217\220\351\206\222.md" new file mode 100644 index 0000000..a101fba --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\274\200\345\217\221\344\274\201\344\270\232\345\276\256\344\277\241\347\276\244\346\234\272\345\231\250\344\272\272\357\274\214\345\256\236\347\216\260\345\256\232\346\227\266\346\217\220\351\206\222.md" @@ -0,0 +1,459 @@ +# 开发企业微信群机器人,实现定时提醒 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + + +大家好,我是鱼皮,今天分享一个用程序解决生活工作问题的真实案例。 + +说来惭愧,事情是这样的,在我们公司,每天都要轮流安排一名员工(当然也包括我)去楼层中间一个很牛的饮水机那里接水。但由于大家每天都有自己的工作,经常出现忘记接水的情况,导致大家口渴难耐。 + +怎么解决这个问题呢? + +我想到了几种方法: + +1)每天大家轮流提醒。但是别说提醒别人了,自己都不记得什么时候轮到自己接水。 + +2)由一个员工负责提醒大家接水,必要时招募一个 “接水提醒员”。 + +3)在企业微信的日历功能给员工安排接水日程,就像下面这样: + +![](https://pic.yupi.icu/1/image-20231014144412018.png) + +但问题是我们的人数和天数不是完全对应的、反复安排日程也很麻烦。 + +你觉得上面哪种方案好呢?其实我觉得第二个方案是最好的 —— 招募一个 “接水提醒员”。 + +别笑,我认真的! + +只不过这个 “接水提醒员” 何必是人? + +没错,作为一名程序员,我们可以搞一个机器人,让它在企业微信群聊中每天提醒不同的员工去接水即可。 + +其实这个功能和员工排班打卡系统是很类似的,只不过更轻量一些。我也调研了很多排班系统,但是都要收费,索性自己开发一个好了。 + +在企业微信中接入机器人其实非常简单,因为企业微信官方就支持群聊机器人功能,所以这次的任务我就安排给了实习生,他很快就完成了,所以我相信大家应该也都能学会~ + + + +## 企微群聊机器人开发 + +学习开发第三方应用时,一定要先完整阅读官方文档,比如企业微信群机器人配置文档。 + +> 指路:https://developer.work.weixin.qq.com/document/path/99110 + +![](https://pic.yupi.icu/1/image-20231014145353399.png) + + + +### 设计 SDK 结构 + +虽然我们的目标是做一个提醒接水机器人,但是企业微信群聊机器人其实是一个通用的功能,所以我们决定开发一个企微机器人 SDK,以后公司其他业务需要时都能够快速复用。(比如开发一个定时喝水提醒机器人) + +设计好 SDK 是需要一定技巧的,之前给大家分享过:[如何设计一个优秀的 SDK](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247500703&idx=1&sn=bf4122b470fa6cccc1f005b6772a68f2&scene=21#wechat_redirect) ,可以阅读参考。 + +在查阅企微机器人文档后,了解到企业微信机器人支持发送多种类型的消息,包括文本、 Markdown 、图片、图文、文件、语音和模块卡片等,文档中对每一种类型的请求参数和字段含义都做了详尽的解释。 + +> 吐槽一下,跟微信开发者文档比起来,企微机器人的文档写得清晰多了! + +![企微文本消息格式](https://pic.yupi.icu/1/image-20231014145911630.png) + +由于每种消息最终都是要转换成 JSON 格式作为 HTTP 请求的参数的,所以我们可以设计一个基础的消息类(Message)来存放公共参数,然后定义各种不同的具体消息类来集成它(比如文本消息 TextMessage、Markdown 消息 MarkdownMessage 等)。 + +为了简化开发者使用 SDK 来发送消息,定义统一的 MessageSender 类,在类中提供发送消息的方法(比如发送文本消息 sendText),可以接受 Message 并发送到企业微信服务器。 + +最终,客户端只需调用统一的消息发送方法即可。SDK 的整体结构如下图所示: + +![](https://pic.yupi.icu/1/1697195145097-6b77f8c8-dcd5-4904-b211-badac72e7a9c.png) + +值得一提的是,如果要制作更通用的消息发送 SDK。可以将 MessageSender 定义成接口,编写不同的子类比如飞书 MessageSender、短信 MessageSender 等。 + + + +### 开发 SDK + +做好设计之后,接下来就可以开始开发 SDK 了。 + +步骤如下: + +1. 获取 webhook +2. 创建 SDK 项目 +3. 编写代码 +4. SDK 打包 +5. 调用 SDK + + + +### 1、获取 webhook + +首先,必须在企业微信群聊中创建一个企业微信机器人,并获取机器人的 webhook。 + +webhook 是一个 url 地址,用于接受我们开发者自己服务器的请求,从而控制企业微信机器人。后续所有的开发过程,都需要通过 webhook 才可以实现。 + +![](https://pic.yupi.icu/1/image-20231014151024421.png) + +复制并保存好这个 Webhook 地址,注意不要泄露该地址! + +![](https://pic.yupi.icu/1/1697194222438-40e7e7a8-3264-4844-b995-14183a0115f2.png) + + + +### 2、创建 SDK 项目 + +SDK 通常是一个很干净的项目,此处我们使用 Maven 来构建一个空的项目,并在 `pom.xml` 文件中配置项目信息。 + +需要特别注意的是,既然我们正在创建一个 SDK,这意味着它将被更多的开发者使用。因此,在配置 groupId 和 artifactId 时,我们应当遵循以下规范: + +- groupId:它是项目组织或项目开发者的唯一标识符,其实际对应的是 main 目录下的 Java 目录结构。 +- artifactId:它是项目的唯一标识符,对应的是项目名称,即项目的根目录名称。通常,它应当为纯小写,并且多个词之间使用中划线(-)隔开。 +- version:它指定了项目的当前版本。其中,SNAPSHOT 表示该项目仍在开发中,是一个不稳定的版本。 + +以下是我们配置好的项目信息: + +```xml +com.yupi +rtx-robot +1.0-SNAPSHOT +``` + +为了让我们的项目更加易用,我们还要能做到让开发者通过配置文件来传入配置(比如 webhook),而不是通过硬编码重复配置各种信息。 + +所以此处我们把项目只作为 Spring Boot 的 starter,需要在 pom.xml 文件中引入依赖: + +```xml + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + true + +``` + +最后,我们还需要添加一个配置,配置项 `true` 表示跳过执行该插件的默认行为: + +```xml + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + +``` + +这样,一个 SDK 项目的初始依赖就配置好了。 + + + +### 3、编写配置类 + +现在我们就可以按照之前设计的结构开发了。 + +首先,我们要写一个配置类,用来接受开发者在配置文件中写入的 webhook。 + +同时,我们可以在配置类中,将需要被调用的 MessageSender 对象 Bean 自动注入到 IOC 容器中,不用让开发者自己 new 对象了。 + +示例代码如下: + +```java +@Configuration +@ConfigurationProperties(prefix = "wechatwork-bot") +@ComponentScan +@Data +public class WebhookConfig { + + private String webhook; + + @Bean + public RtxRobotMessageSender rtxRobotMessageSender() { + return new RtxRobotMessageSender(webhook); + } +} +``` + + + +接下来,为了让 Spring Boot 项目在启动时能自动识别并应用配置类,需要把配置类写入到 `resources/META-INF/spring.factories ` 文件中,示例代码如下: + +```sh +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yupi.rtxrobot.config.WebhookConfig +``` + + + +### 4、编写消息类 + +接下来,我们要按照官方文档的请求参数把几种类型的消息对象编写好。 + +由于每个消息类都有一个固定的字段 msgtype,所以我们定义一个基类 Message,方便后续将不同类型的消息传入统一的方法: + +```java +public class Message { + + /** + * 消息类型 + **/ + String msgtype; +} +``` + +接下来编写具体的消息类,比如纯文本类型消息 TextMessage,示例代码如下: + +```java +@Data +public class TextMessage extends Message { + + /** + * 消息内容 + */ + private String content; + + /** + * 被提及者userId列表 + */ + private List mentionedList; + + /** + * 被提及者电话号码列表 + */ + private List mentionedMobileList; + + /** + * 提及全体 + */ + private Boolean mentionAll = false; + + public TextMessage(String content, List mentionedList, List mentionedMobileList, Boolean mentionAll) { + this.content = content; + this.mentionedList = mentionedList; + this.mentionedMobileList = mentionedMobileList; + this.mentionAll = mentionAll; + + if (mentionAll) { + if (CollUtil.isNotEmpty(this.mentionedList) || CollUtil.isNotEmpty(this.mentionedMobileList)) { + if (CollUtil.isNotEmpty(mentionedList)) { + this.mentionedList.add("@all"); + } else { + this.mentionedList = CollUtil.newArrayList("@all"); + } + } else { + this.mentionedList = CollUtil.newArrayList("@all"); + } + } + } + + public TextMessage(String content) { + this(content, null, null, false); + } +} +``` + +上面的代码中,有个代码优化小细节,官方文档是使用 “@all” 字符串来表示 @全体成员的,但 “@all” 是一个魔法值,为了简化调用,我们将其封装为 mentionAll 布尔类型字段,并且在构造函数中自动转换为实际请求需要的字段。 + + + +### 5、编写消息发送类 + +接下来,我们将编写一个消息发送类。在这个类中,定义了用于发送各种类型消息的方法,并且所有的方法都会依赖调用底层的 send 方法。send 方法的作用是通过向企微机器人的 webhook 地址发送请求,从而驱动企微机器人发送消息。 + +以下是示例代码,有很多编码细节: + +```java +/** + * 微信机器人消息发送器 + * @author yuyuanweb + */ +@Slf4j +@Data +public class RtxRobotMessageSender { + + private final String webhook; + + public WebhookConfig webhookConfig; + + public RtxRobotMessageSender(String webhook) { + this.webhook = webhook; + } + + /** + * 支持自定义消息发送 + */ + public void sendMessage(Message message) throws Exception { + if (message instanceof TextMessage) { + TextMessage textMessage = (TextMessage) message; + send(textMessage); + } else if (message instanceof MarkdownMessage) { + MarkdownMessage markdownMessage = (MarkdownMessage) message; + send(markdownMessage); + } else { + throw new RuntimeException("Unsupported message type"); + } + } + + /** + * 发送文本(简化调用) + */ + public void sendText(String content) throws Exception { + sendText(content, null, null, false); + } + + public void sendText(String content, List mentionedList, List mentionedMobileList) throws Exception { + TextMessage textMessage = new TextMessage(content, mentionedList, mentionedMobileList, false); + send(textMessage); + } + + /** + * 发送消息的公共依赖底层代码 + */ + private void send(Message message) throws Exception { + String webhook = this.webhook; + String messageJsonObject = JSONUtil.toJsonStr(message); + // 未传入配置,降级为从配置文件中寻找 + if (StrUtil.isBlank(this.webhook)) { + try { + webhook = webhookConfig.getWebhook(); + } catch (Exception e) { + log.error("没有找到配置项中的webhook,请检查:1.是否在application.yml中填写webhook 2.是否在spring环境下运行"); + throw new RuntimeException(e); + } + } + OkHttpClient client = new OkHttpClient(); + RequestBody body = RequestBody.create( + MediaType.get("application/json; charset=utf-8"), + messageJsonObject); + Request request = new Request.Builder() + .url(webhook) + .post(body) + .build(); + try (Response response = client.newCall(request).execute()) { + if (response.isSuccessful()) { + log.info("消息发送成功"); + } else { + log.error("消息发送失败,响应码:{}", response.code()); + throw new Exception("消息发送失败,响应码:" + response.code()); + } + } catch (IOException e) { + log.error("发送消息时发生错误:" + e); + throw new Exception("发送消息时发生错误", e); + } + } +} +``` + +代码部分就到这里,是不是也没有很复杂? + + + +### 6、SDK 打包 + +接下来就可以对 SDK 进行打包,然后本地使用或者上传到远程仓库了。 + +SDK 的打包非常简单,通过 Maven 的 install 命令即可,SDK 的 jar 包就会被导入到你的本地仓库中。 + +> 在打包前建议先执行 clean 来清理垃圾文件。 + +![](https://pic.yupi.icu/1/1697194173045-c3c994f0-9415-40f0-886a-5bc41cba9576.png) + +### 7、调用 SDK + +最后我们来调用自己写的 SDK,首先将你的 SDK 作为依赖引入到项目中,比如我们的接水提醒应用。 + +引入代码如下: + +```xml + + com.yupi + rtx-robot + 1.0-SNAPSHOT + +``` + +然后将之前复制的 webhook 写入到 Spring Boot 的配置文件中: + +```yaml +wechatwork-bot: + webhook: 你的webhook地址 +``` + +随后你就可以用依赖注入的方式得到一个消息发送者对象了: + +```java +@Resource +public RtxRobotMessageSender rtxRobotMessageSender; +``` + +当然你也可以选择在一个非 Spring 环境中手动创建对象,自己传入 webhook: + +```java +String webhook = "你的webhook地址"; +RtxRobotMessageSender rtxRobotMessageSender = new RtxRobotMessageSender(webhook); +``` + +现在,就可以轻松实现我们之前提到的提醒接水工具了。 + +这里我们就用最简单的方式,定义一个员工数组,分别对应到每周 X,然后用定时任务每日执行消息发送。 + +示例代码如下: + +```java +@Component +public class WaterReminderTask { + + @Resource + public RtxRobotMessageSender rtxRobotMessageSender; + + private String[] names = {"员工a", "员工b", "员工c", "员工d", "员工e"}; + + @Scheduled(cron = "0 55 9 * * MON-FRI") + public void remindToGetWater() { + LocalDate today = LocalDate.now(); + DayOfWeek dayOfWeek = today.getDayOfWeek(); + String nameToRemind; + switch (dayOfWeek) { + case MONDAY: + nameToRemind = names[0]; + break; + case TUESDAY: + nameToRemind = names[1]; + break; + case WEDNESDAY: + nameToRemind = names[2]; + break; + case THURSDAY: + nameToRemind = names[3]; + break; + case FRIDAY: + nameToRemind = names[4]; + break; + default: + return; + } + + String message = "提醒:" + nameToRemind + ",是你接水的时间了!"; + rtxRobotMessageSender.sendText(message); + } +} +``` + + + +好了,现在大家每天都有水喝了,真不错 👍🏻 + +![](https://pic.yupi.icu/1/image-20231014154348045.png) + + + +## 最后 + +虽然开发企微机器人 SDK 并不难,但想做一个完善的、易用的 SDK 还是需要两把刷子的,而且沉淀 SDK 对自己未来做项目帮助会非常大。 + +希望本文对大家有帮助,学会的话 `点个赞` 或 `在看` 吧,谢谢大家~ + diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\345\277\253\351\200\237\345\255\246\344\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\201\232\350\264\241\347\214\256.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\277\253\351\200\237\345\255\246\344\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\201\232\350\264\241\347\214\256.md" new file mode 100644 index 0000000..941ca46 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\345\277\253\351\200\237\345\255\246\344\274\232\344\270\272\345\274\200\346\272\220\351\241\271\347\233\256\345\201\232\350\264\241\347\214\256.md" @@ -0,0 +1,85 @@ +# 快速学会为开源项目做贡献 + +> 作者:[顾恙ツ](https://juejin.cn/user/128017175944557),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 2784 + +1. 到 Github / Gitee 上寻找自己感兴趣的项目,这里拿一个鱼总的开源项目来进行演示,这里就拿 [yuindex](https://github.com/liyupi/yuindex) 来进行测试哈: + + + +[✨ 新项目 - 极客范儿的浏览器主页 💻 Vue 3 + Node.js 全栈项目,自实现 web 终端 + 命令系统](https://github.com/liyupi/yuindex) + + + +![img](https://pic.yupi.icu/5563/clip_image002.gif) + + + +2. 使用 git clone 自己本地仓库([yuindex](https://github.com/liyupi/yuindex))地址,把项目 clone 到自己的本地,也可以使用压缩包下载的方式 + + + +![img](https://pic.yupi.icu/5563/clip_image004.gif) + + + +这里有两种方式: + + + +1、使用命令行 git clone +仓库地址 + + + +2、使用 IDE 快速 clone 项目,箭头处填写项目地址 + + + +![img](https://pic.yupi.icu/5563/clip_image006.gif) + + + +3. 关联上游的源项目 (方便拉取最新的代码) + + + +​ a. 在 IDEA 中打开 clone 项目,并点击下面的 Terminal (命令行窗口) + + + +​ b. 使用 git remote -v 查看所有远程库的远程地址,如果没有 upstream 地址需要使用命令 git remote add upstream + [源项目 URL] 进行 upstream 仓库的添加 + + + +​ c. 使用 git remote -v 检查所有远程库的地址 + + + +​ d. 使用 git fetch upstream 获取最新的代码 + + + +​ e. **注意事项:每次编写新功能需要从 Upstream 上边拉一下代码,然后创建新的分支进行开发** + +4. 在新的分支上开发好功能后,提交到自己的本地仓库中 + + + +5. 在本地仓库创建 PR,选择自己要提交的分支,和需要合并到的源仓库分支 + + + +![img](https://pic.yupi.icu/5563/clip_image008.gif) + + + +![img](https://pic.yupi.icu/5563/clip_image010.gif)![img](https://pic.yupi.icu/5563/clip_image012.gif) + + + +6. 等待仓库审核者的测试和评审,注意需要及时查看审核者的评论 dog (对自己的 PR 负责) + +7. **踩坑事项,如果在一个分支上多次提交,第二次提交会带上前面的内容 ,解决方案如下:** + +​ [Git 最重要最常用的场景使用与对应命令-PR修改提交](http://invalid.uri) + +8. 这里附上一篇文章,[如何在 Github 上规范地提交 PR(图文详解)](https://zhuanlan.zhihu.com/p/584834288) diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\346\225\264\345\220\210Spring JDBC\346\223\215\344\275\234\346\225\260\346\215\256\345\272\223.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\346\225\264\345\220\210Spring JDBC\346\223\215\344\275\234\346\225\260\346\215\256\345\272\223.md" new file mode 100644 index 0000000..a01db44 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\346\225\264\345\220\210Spring JDBC\346\223\215\344\275\234\346\225\260\346\215\256\345\272\223.md" @@ -0,0 +1,416 @@ +# 整合Spring JDBC操作数据库 + +> 作者:[无题.](https://blog.csdn.net/m0_60496161?type=blog),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 4838 + +## 整合Spring JDBC操作数据库 + +本文讲解原生态spring boot jdbc操作数据库的方式,现在大家开发项目的时候,一般都会使用orm持久化框架在操作数据库,但是对于其底层jdbc技术,我们也是需要了解掌握的,可以扩展大家的技术面帮助我们系统的学习spring boot开发知识, 在开发中更加灵活地操作数据库。 + +# 整合Spring JDBC操作数据库 + +# 文章引入 + +本文讲解原生态spring boot jdbc操作数据库的方式,现在大家开发项目的时候,一般都会使用orm持久化框架在操作数据库,但是对于其底层jdbc技术,我们也是需要了解掌握的,可以扩展大家的技术面帮助我们系统的学习spring boot开发知识, 在开发中更加灵活地操作数据库。如果有兴趣的话,不妨读一读下文~ + +# 什么是JDBC? + +JDBC(Java DataBase Connectivity)是一种用于**执行SQL语句的Java API**,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 + +> 什么是持久层:在后面的章节我会经常用到持久层这个词,持久层就是指对数据进行持久化操作的代码,比如将数据保存到数据库、文件、磁盘等操作都是持久层操作。所谓持久就是保存起来的意思。对于web应用最常用的持久层框架就是JDBC、Mybatis、JPA。 + +# 使用jdbc操作数据库的步骤 + +需要7步: + +1. 加载数据库驱动 +2. 建立数据库连接 +3. 创建数据库操作对象 +4. 定义操作SQL语句 +5. 执行数据库操作 +6. 获取并操作结果集 +7. 关闭对象,回收资源 + +```Java +try { + + // 1、加载数据库驱动 + Class.forName(driver); + + // 2、获取数据库连接 + conn = DriverManager.getConnection(url, username, password); + + // 3、获取数据库操作对象 + stmt = conn.createStatement(); + + // 4、定义操作的 SQL 语句 + String sql = "select * from user where id = 6"; + + // 5、执行数据库操作 + rs = stmt.executeQuery(sql); + + // 6、获取并操作结果集 + while (rs.next()) { + + // 解析结果集 + + } + +} catch (Exception e) { + // 日志信息 +} finally { + // 7、关闭资源 +} +``` + +通过上面的示例可以看出直接使用 JDBC 来操作数据库比较复杂。为此,Spring Boot 针对 JDBC 的使用提供了对应的 Starter 包:spring-boot-starter-jdbc,它其实就是在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 生态中更好的使用 JDBC + +> 不论是JDBC,还是封装之后的Spring JDBC,直接操作数据库都比较麻烦。如果企业有成熟的ORM知识积累,并且无特殊需求,不建议直接使用JDBC操作数据库。 + +# 将Spring JDBC集成到Spring boot项目 + +1. 引入依赖 + +```XML + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + +``` + +1. 修改yml配置文件,增加数据库连接、用户名密码等信息 + +```YAML + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/test_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 + username: root + password: 123456 +``` + +# spring boot jdbc 基础代码 + +1. 首先我们新建一张测试表article并且定义好对应的实体类。 + +![image.png](https://pic.yupi.icu/5563/202311052039742.png) + +```SQL +CREATE TABLE `article` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `author` VARCHAR(32) NOT NULL, + `title` VARCHAR(32) NOT NULL, + `content` VARCHAR(512) NOT NULL, + `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`) +) +COMMENT='文章' +ENGINE=InnoDB; +``` + +1. DAO层代码: + +- jdbcTemplate.update适合于insert 、update和delete操作; +- jdbcTemplate.queryForObject用于查询单条记录返回结果 +- jdbcTemplate.query用于查询结果列表 +- BeanPropertyRowMapper可以将数据库字段的值向Article对象映射,**满足驼峰标识也可以自动映射。如:数据库create_time字段映射到createTime属性。** + +```Java +@Repository //持久层依赖注入注解 +public class ArticleJDBCDAO { + + @Resource + private JdbcTemplate jdbcTemplate; + + //保存文章 + public void save(Article article) { + //jdbcTemplate.update适合于insert 、update和delete操作; + jdbcTemplate.update("INSERT INTO article(author, title,content,create_time) values(?, ?, ?, ?)", + article.getAuthor(), + article.getTitle(), + article.getContent(), + article.getCreateTime()); + + } + + //删除文章 + public void deleteById(Long id) { + //jdbcTemplate.update适合于insert 、update和delete操作; + jdbcTemplate.update("DELETE FROM article WHERE id = ?",id); + + } + + //更新文章 + public void updateById(Article article) { + //jdbcTemplate.update适合于insert 、update和delete操作; + jdbcTemplate.update("UPDATE article SET author = ?, title = ? ,content = ?,create_time = ? WHERE id = ?", + article.getAuthor(), + article.getTitle(), + article.getContent(), + article.getCreateTime(), + article.getId()); + + } + + //根据id查找文章 + public Article findById(Long id) { + //queryForObject用于查询单条记录返回结果 + return (Article) jdbcTemplate.queryForObject("SELECT * FROM article WHERE id=?", + new Object[]{id},new BeanPropertyRowMapper<>(Article.class)); + } + + //查询所有 + public List
findAll(){ + //query用于查询结果列表 + return (List
) jdbcTemplate.query("SELECT * FROM article ", new BeanPropertyRowMapper<>(Article.class)); + } + + +} +``` + +1. service层操作JDBC持久层 + +```Java +@Slf4j +@Service //服务层依赖注入注解 +public class ArticlleJDBCService implements ArticleService { + + @Resource + private + ArticleJDBCDAO articleJDBCDAO; + + @Transactional + public void saveArticle( Article article) { + articleJDBCDAO.save(article); + //int a = 2/0; //人为制造一个异常,用于测试事务 + + } + + public void deleteArticle(Long id){ + articleJDBCDAO.deleteById(id); + } + + public void updateArticle(Article article){ + articleJDBCDAO.updateById(article); + } + + public Article getArticle(Long id){ + return articleJDBCDAO.findById(id); + } + + public List
getAll(){ + return articleJDBCDAO.findAll(); + } +} +``` + +1. 在Controller层调用service接口的方法即可。 + +spring jdbc可以自动实现数据库下划线命名法转成实体类的驼峰命名:注意在sql语句里的字段名一定是数据库的字段名即可。 + +测试数据: + +```JSON +{ + "author": "xhl", + "title": "Sample Article", + "content": "This is the content of the article.", + "createTime": "2023-11-05 15:30:00" + +} +``` + +![image.png](https://pic.yupi.icu/5563/202311052039732.png) + +![image.png](https://pic.yupi.icu/5563/202311052039720.png) + +![image.png](https://pic.yupi.icu/5563/202311052039714.png) + +## 测试事务 + +- 重点测试一下事务的回滚,人为制造一个被除数为0的异常。 +- 在saveArticle方法上使用了@Trasactional注解,该注解基本功能为事务管理,保证saveArticle方法一旦有异常,所有的数据库操作就回滚。 + +使用事务注解测试一下:测试成功 + +![image.png](https://pic.yupi.icu/5563/202311052039711.png) + +![image.png](https://pic.yupi.icu/5563/202311052039777.png) + +![image.png](https://pic.yupi.icu/5563/202311052039057.png) + +# Spring JDBC多数据源的实现 + +随着应用的数据量增多,很可能会**采用数据分库存储的方案**,所以说对于我们的持久层代码可能面临在一个服务函数中操作多个数据库的场景。 + +![image.png](https://pic.yupi.icu/5563/202311052039127.png) + +## 一、配置多个数据源 + +application.yml配置2个数据源,第一个叫做primary,第二个叫做secondary。注意两个数据源连接的是不同的库 + +```YAML + datasource: + primary: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://localhost:3306/test_db?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 + username: root + password: 123456 + secondary: + driver-class-name: com.mysql.cj.jdbc.Driver + jdbc-url: jdbc:mysql://localhost:3306/xuexi?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8 + username: root + password: 123456 +``` + +## 二、通过Java Config将数据源注入到Spring上下文。 + +![image.png](https://pic.yupi.icu/5563/202311052039322.png) + +- primaryJdbcTemplate使用primaryDataSource数据源操作数据库test_db。 +- secondaryJdbcTemplate使用secondaryDataSource数据源操作数据库xuexi。 + +```Java +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; + +@Configuration +public class DataSourceConfig { + @Primary + @Bean(name = "primaryDataSource") + @ConfigurationProperties(prefix="spring.datasource.primary") //test_db + public DataSource primaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name = "secondaryDataSource") + @ConfigurationProperties(prefix="spring.datasource.secondary") //xuexi + public DataSource secondaryDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean(name="primaryJdbcTemplate") + public JdbcTemplate primaryJdbcTemplate (@Qualifier("primaryDataSource") DataSource dataSource ) { + return new JdbcTemplate(dataSource); + } + + @Bean(name="secondaryJdbcTemplate") + public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource) { + return new JdbcTemplate(dataSource); + } +} +``` + +- primaryDataSource和secondaryDataSource都是DataSource接口的**实例化对象(Bean)** +- @Primary注解的作用是当一个接口有多个实现类的时候,我们在主实现类对象的上面加上这个注解。表示当Spring如果只能选一个实现进行依赖注入的时候,就选@Primary标识的这个Bean。(如果这个项目只使用一个数据源,那就是primaryDataSource) +- @Qualifier明确通过编码的形式说明,当一个接口有多个实现类对象Bean的时候,我要使用哪一个Bean。 + +这个配置类定义了两个数据源(DataSource)和对应的两个JdbcTemplate实例,分别用于操作两个不同的数据库。 + +首先,使用`@Configuration`注解将该类标记为配置类,告诉Spring容器这是一个用于配置Bean的类。 + +接下来,使用`@Primary`注解标记`primaryDataSource()`方法,表示该方法返回的数据源是主要的数据源。在Spring中,如果存在多个同类型的Bean时,通过`@Primary`注解可以指定默认使用的Bean。 + +`primaryDataSource()`方法使用了`@Bean`注解将返回的数据源Bean注册到Spring容器中,并使用`@ConfigurationProperties`注解指定了数据源的配置前缀。这意味着Spring将根据配置文件中以`spring.datasource.primary`开头的属性来自动装配数据源的配置。 + +类似地,`secondaryDataSource()`方法定义了返回次要数据源的Bean,并使用了`@ConfigurationProperties`注解指定了配置前缀。 + +接下来,定义了两个JdbcTemplate实例的Bean。`primaryJdbcTemplate()`方法使用了`@Qualifier`注解,并指定了其中一个数据源Bean的名称`primaryDataSource`,表示使用名为`primaryDataSource`的数据源创建JdbcTemplate实例。同样,`secondaryJdbcTemplate()`方法使用了`@Qualifier`注解,并指定了另一个数据源Bean的名称`secondaryDataSource`。 + +通过这样的配置,当需要使用`primaryJdbcTemplate`时,Spring会自动从容器中获取名为`primaryDataSource`的数据源,并使用该数据源创建一个JdbcTemplate实例。同样,获取`secondaryJdbcTemplate`时会自动获取名为`secondaryDataSource`的数据源。 + +在测试类中,通过`@Resource`注解将`primaryJdbcTemplate`和`secondaryJdbcTemplate`注入到`articleJDBCDAO`中。这样,`articleJDBCDAO`就可以使用这两个JdbcTemplate实例来操作不同的数据库,并通过调用`save()`方法将数据保存到相应的数据库中。 + +## 三、ArticleJDBCDAO改造 + +1. 注入primaryJdbcTemplate作为默认的数据库操作对象。 +2. 将jdbcTemplate作为参数传入ArticleJDBCDAO的方法,**不同的template操作不同的库**。 + +```Java + @Resource +// private JdbcTemplate jdbcTemplate; + private JdbcTemplate primaryJdbcTemplate; + + + //保存文章 + //以保存文章为例,新增一个参数:jdbcTemplate ,其他的方法照做 + public void save(Article article, JdbcTemplate jdbcTemplate) { + if (jdbcTemplate == null) {//判断新增参数不能为空,如果为空使用primaryJdbcTemplate + jdbcTemplate = primaryJdbcTemplate; + } + + + jdbcTemplate.update( + "insert into article(author,title,content,create_time) values(?,?,?,?)", + article.getAuthor(), + article.getTitle(), + article.getContent(), + article.getCreateTime() + ); + + + } +``` + +## 四、测试同时向两个数据库保存数据 + +加入如下单元测试类,并进行测试。正常情况下,在test_db和xuexi数据库的article表,将分别插入一条数据,表示多数据源测试成功。 + +注意在注入jdbctemplate的时候需要对应好配置类写的名字 + +```Java +@SpringBootTest +public class SpringJdbcTest { + + @Resource + private ArticleJDBCDAO articleJDBCDAO; + @Resource + private JdbcTemplate primaryJdbcTemplate; + @Resource + private JdbcTemplate secondaryJdbcTemplate; + + + @Test + public void testJdbc() { + articleJDBCDAO.save( + Article.builder() + .author("xhl").title("primaryJdbcTemplate").content("测试").createTime(new Date()) + .build(), + primaryJdbcTemplate); + articleJDBCDAO.save( + Article.builder() + .author("xhl").title("secondaryJdbcTemplate").content("测试").createTime(new Date()) + .build(), + secondaryJdbcTemplate); + } +``` + +### bug + +jdbcUrl is required with driverClassName.” + +https://blog.csdn.net/weixin_40085570/article/details/80968099 + +解决:springboot 升级到2.0之后发现配置多数据源的时候报错,把配置url改成jdbc-url即可 + +![image.png](https://pic.yupi.icu/5563/202311052039418.png) + +保存成功: + +![image.png](https://pic.yupi.icu/5563/202311052039414.png) + +![image.png](https://pic.yupi.icu/5563/202311052039470.png) + +总结 + +至此,大家已经掌握了如何在spring boot中使用spring-jdbc操作数据以及配置多数据源,像多个数据库插入数据,为后续分库分表的操作打下基础。多实践,多敲代码,会越来越好~⚛️ \ No newline at end of file diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250@Validated\346\263\250\350\247\243\345\256\236\347\216\260\351\235\236\347\251\272\346\240\241\351\252\214.md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250@Validated\346\263\250\350\247\243\345\256\236\347\216\260\351\235\236\347\251\272\346\240\241\351\252\214.md" new file mode 100644 index 0000000..144e938 --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250@Validated\346\263\250\350\247\243\345\256\236\347\216\260\351\235\236\347\251\272\346\240\241\351\252\214.md" @@ -0,0 +1,135 @@ +# 用@Validated注解实现非空校验 + +> 作者:[平安](https://github.com/lizhe-0423),[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 15592 + +## 文章背景 + + + +首先我们在看鱼皮🐟的项目时 经常发现 关于一些校验我们都是采用手写的方式 + + + +像这样: + + + +![img](https://pic.yupi.icu/5563/202311030940342.gif) + + + +或者这样: + + + +![img](https://pic.yupi.icu/5563/202311030940363.gif) + + + +(大家能够看的出来上面代码片段出自哪个项目嘛?) + + + +### 先说结论 + + + +关于上述写法的优点就是灵活,当然也有缺点: + + + +我们需要在每一个Controller都要进行一次这样的校验,甚至每一个Service层同样的要进行如下的校验(非常繁琐、甚至容易遗忘) + + + +**那么有没有一种什么更好的方式呢?@Validated 注解 !** + + + +## @Validated 注解使用 + + + +![img](https://pic.yupi.icu/5563/202311030940369.gif) + + + +1)首先从控制层上接收参数那里添加上这段@Validated 注解 + + + +2)然后相对应的实体类 去加上注解就可以生效了! + + + +![img](https://pic.yupi.icu/5563/202311030940373.gif) + + + +然后当我们在使用的时候就会发现: + + + +![img](https://pic.yupi.icu/5563/202311030940372.gif) + + + +![img](https://pic.yupi.icu/5563/202311030940373.gif) + + + +**直接就会报错 然后返回给前端错误信息(以上统一封装了错误信息)** + + + +**除此之外关于@Validated 还有如下注解可以一起使用!** + + + +**各位🐟油们,大家也快去试一试吧!** + + + +```java +空检查 + @Null 验证对象是否为null + @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 + @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. + @NotEmpty 检查约束元素是否为NULL或者是EMPTY. + + Booelan检查 + @AssertTrue 验证 Boolean 对象是否为 true + @AssertFalse 验证 Boolean 对象是否为 false + + 长度检查 + @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 + @Length(min=, max=) 验证注解的元素值长度在min和max区间内 + + 日期检查 + @Past 验证 Date 和 Calendar 对象是否在当前时间之前 + @Future 验证 Date 和 Calendar 对象是否在当前时间之后 + @Pattern 验证 String 对象是否符合正则表达式的规则 + + 数值检查,建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null + @Min 验证 Number 和 String 对象是否大等于指定的值 + @Max 验证 Number 和 String 对象是否小等于指定的值 + @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 + @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 + @Digits 验证 Number 和 String 的构成是否合法 + @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 + + @Range(min=, max=) 验证注解的元素值在最小值和最大值之间 + @Range(min=10000,max=50000,message="range.bean.wage") + private BigDecimal wage; + + @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) + @CreditCardNumber信用卡验证 + @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。 + @ScriptAssert(lang= ,script=, alias=) + @URL(protocol=,host=, port=,regexp=, flags=) + + +``` + + + diff --git "a/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250\345\233\233\347\247\215\351\224\201\345\256\236\347\216\260\345\212\240\345\205\245\351\230\237\344\274\215\345\212\237\350\203\275(\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237).md" "b/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250\345\233\233\347\247\215\351\224\201\345\256\236\347\216\260\345\212\240\345\205\245\351\230\237\344\274\215\345\212\237\350\203\275(\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237).md" new file mode 100644 index 0000000..80254af --- /dev/null +++ "b/\347\237\245\350\257\206\347\242\216\347\211\207/\347\224\250\345\233\233\347\247\215\351\224\201\345\256\236\347\216\260\345\212\240\345\205\245\351\230\237\344\274\215\345\212\237\350\203\275(\344\274\231\344\274\264\345\214\271\351\205\215\347\263\273\347\273\237).md" @@ -0,0 +1,390 @@ +# 用四种锁实现加入队伍功能(伙伴匹配系统) + +> 作者:长风,[编程导航星球](https://wx.zsxq.com/dweb2/index/group/51122858222824) 编号 26376 + +## 一、为什么要对加入队伍功能上锁? + +首先,要知道我们在Controller中写的代码默认是线程不安全的。在SpringBoot应用程序中,Controller实例默认都是单例对象。每当收到一个Http请求时,容器会通过反射机制调用相应的Controller方法。由于Controller是单例的,多个请求将同时访问一个Controller实例。 + +同一个用户的多次点击加入队伍按钮,或者不同用户同一时间点击加入队伍按钮,都会导致多个线程在访问Controller中的代码,然后就可能会出现线程不安全的问题。 + +例如: + +伪代码: + +1.从mysql中读取队伍的人数 + +2.判断一个队伍是否满员? + +3.不满员就插入数据,满员就返回加入队伍失败 + +假如现在队伍人数是4/5,当前有两个用户同时点击加入队伍按钮。两个用户的请求同时到代码2发现没有满员,然后同时执行代码3将用户数据插入队伍中。就会出现队伍人数是6/5的情况。所以就需要上锁。 + +## 二、上锁实现方式1:单机锁-让所有用户的所有请求共用一个锁 + +### 2.1实现方式: + +使用synchronized (this)添加同步锁,这里的this就是通过@Service创建的TeamServiceImpl对象,是一个单例对象。保证了所有用户的请求都是同一把锁。 + +### 2.2应用场景: + +比如功能要求是判断一个队伍是否满员,满员不允许加入队伍,这种功能场景需要所有用户同一把锁。就可以使用。 + +### 2.3实现代码: + +(只显示部分代码,附录有完整代码): + +```java + +synchronized (this) { + // 判断队伍是否已满 + // 从MySQL中读取队伍中人数 + long teamUserNums = this.countTeamUserByTeamId(teamId); + + // 判断是否满员 + if (teamUserNums >= team.getMaxNum()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍已满"); + } + + UserTeam userTeam = new UserTeam(); + userTeam.setTeamId(teamId); + userTeam.setUserId(userId); + userTeam.setJoinTime(new Date()); + + // 插入数据 + return userTeamService.save(userTeam); +} + +``` + + + +### 2.4测试方式: + +写完代码了,怎么测试一下是否有效果呢,可以在插入数据之前加入一个线程睡眠Thread.sleep(5000),保证两次请求可以同时执行插入数据代码。然后在本地可以用两个浏览器模拟两个用户同时点击的情况,同时点击加入队伍按钮。与原始代码对比。发现原始代码中会出现超员的情况,而现在的代码不会出现超员的情况。 + +ps:为什么要使用两个浏览器模拟两个用户?用一个浏览器新建两个窗口不行吗? + +伙伴匹配系统是基于session保存用户信息的,目前我做实验得知,一个浏览器对应一个sessionId,即对应一个用户。在一个浏览器中建立多个窗口都都对应的是同一个sessionId。 + +## 三、上锁实现方式2:单机锁-同一个用户的所有请求共用一个锁 + +### 3.1实现方式: + +这里需要保证每一个用户的请求是共用一把锁,就不能再用synchronized(this)了。应该 + +用一个每一个用户独有的一个信息去做一把锁。这里我使用的是synchronized (userId.toString().intern()) + +疑问1:为什么使用这个就可以解决一个用户一把锁问题 + +首先使用userId以区分每个用户,然后使用intern可以取出字符串常量池中的字符串对象地址,比如userId是1,每次的都是字符串常量池中“1”这个字符串对象的地址。众所周知,字符串常量池中的元素是唯一的,保证了同一Id用户的每次请求的锁对象都是相同的。 + +疑问2:为什么不使用synchronized (userId) + +因为每次获取的userId对象地址都不同。这里每次都会new一个新的Long对象。 + +疑问3:为什么不使用synchronized (userId.toString()) + +to.String()方法会new一个String而不是直接从常量池中取出引用地址,虽然每次userId都相同,但是toString方法获取的字符串对象引用都不同。 + +### 3.2应用场景: + +比如功能要求是判断一个用户最多加入了几个队伍或者判断一个用户是否有重复加入该队伍,这种功能场景当前用户的信息不会与其他用户的信息相互影响。所以就可以一个用户一把锁。 + +### 3.3实现代码: + +```java + +Long userId = loginUser.getId(); + +synchronized (userId.toString().intern()) { + // 判断加入队伍数量是否已超出5个 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId); + + long hasJoinNum = userTeamService.count(wrapper); + + if (hasJoinNum > 5) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "最多创建和加入5个队伍"); + } + + // 插入数据 + return userTeamService.save(userTeam); +} + +``` + + + +## 四、上锁实现方式3:分布式锁-多机部署环境下所有用户的所有请求共用一个锁 + +### 4.1实现方式: + +使用Redis实现分布式锁。可以使用Redisson组件实现分布式锁。 + +### 4.2应用场景: + +1.与加锁方式一相比,主要体现在分布式场景下使用。 + +2.所有用户的请求共用一把锁 + +### 4.3实现代码: + +```java + +RLock lock = redissonClient.getLock("yupao:team:joinTeam"); + +try { + while (true) { + if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) { + System.out.println("getLock: " + Thread.currentThread().getId()); + + // 判断队伍是否已满 + long teamUserNums = this.countTeamUserByTeamId(teamId); + if (teamUserNums >= team.getMaxNum()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍已满"); + } + + UserTeam userTeam = new UserTeam(); + userTeam.setTeamId(teamId); + userTeam.setUserId(userId); + userTeam.setJoinTime(new Date()); + return userTeamService.save(userTeam); + } + } +} catch (InterruptedException e) { + log.error("The lock 'yupao:team:joinTeam' had a error ", e); + return false; +} finally { + // 释放锁,只能释放自己的锁 + if (lock.isHeldByCurrentThread()) { + System.out.println("unLock" + Thread.currentThread().getId()); + lock.unlock(); + } +} +``` + + + +## 五、上锁实现方式4:分布式锁-多机部署环境下同一个用户的所有请求共用一个锁 + +### 5.1实现方式: + +1.使用Redis实现分布式锁。可以使用Redisson组件实现分布式锁。 + +2.在redis中存储的锁的key加上userId。 + +### 5.2应用场景: + +1.与加锁方式二相比,主要体现在分布式场景下使用。 + +2.一个用户一把锁 + +### 5.3实现代码: + +```java + +Long userId = loginUser.getId(); +RLock lock = redissonClient.getLock("yupao:team:joinTeam:userId"); + +try { + while (true) { + if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) { + System.out.println("getLock: " + Thread.currentThread().getId()); + + // 判断加入队伍数量是否已超出5个 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId); + + long hasJoinNum = userTeamService.count(wrapper); + + if (hasJoinNum > 5) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "最多创建和加入5个队伍"); + } + + // 插入数据 + return userTeamService.save(userTeam); + } + } +} catch (InterruptedException e) { + log.error("The lock 'yupao:team:joinTeam' had a error ",e); + return false; +} finally { + // 释放锁,只能释放自己的锁 + if (lock.isHeldByCurrentThread()) { + System.out.println("unLock"+Thread.currentThread().getId()); + lock.unlock(); + } +} + +``` + + + +# 六、待完善 + +1.方式1和方式2的单机锁虽然解决了线程不安全问题,但是也引入了一个新问题就是如果第一个拿到锁的任务出现了阻塞情况,会导致整个功能卡主之后的请求都没有相应。对锁可以添加一个使用时间,一定时间之后自动释放锁,防止出现拿到锁的线程出现阻塞的情况。 + +# 七、附录:完整代码 + +## 7.1单机锁-让所有用户的所有请求共用一个锁 + +```java + +public boolean joinTeam(TeamJoinRequest teamJoinRequest, User loginUser) { + if (teamJoinRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + if (loginUser == null) { + throw new BusinessException(ErrorCode.NOT_LOGIN); + } + + Long teamId = teamJoinRequest.getTeamId(); + Team team = this.getById(teamId); + long userId = loginUser.getId(); + + // 判断加入的队伍是否过期 + Date expireTime = team.getExpireTime(); + if (expireTime != null && expireTime.before(new Date())) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "队伍已过期"); + } + + // 判断是否是私有队伍 + Integer status = team.getStatus(); + TeamStatusEnum teamStatusEnum = TeamStatusEnum.getEnumByValue(status); + if (TeamStatusEnum.PRIVATE.equals(teamStatusEnum)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "禁止加入私有队伍"); + } + + String password = teamJoinRequest.getPassword(); + if (TeamStatusEnum.SECRET.equals(teamStatusEnum)) { + if (StringUtils.isBlank(password) || !password.equals(team.getPassword())) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码错误"); + } + } + + synchronized (this) { + // 每个人最多参加5个队伍 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId); + long hasJoinNum = userTeamService.count(wrapper); + if (hasJoinNum > 5) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "最多创建和加入5个队伍"); + } + + // 不能重复入队 + wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId).eq(UserTeam::getTeamId, teamId); + long hasUserJoinTeam = userTeamService.count(wrapper); + if (hasUserJoinTeam > 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已加入该队伍"); + } + + // 队伍是否已满 + long teamUserNums = this.countTeamUserByTeamId(teamId); + if (teamUserNums >= team.getMaxNum()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍已满"); + } + + UserTeam userTeam = new UserTeam(); + userTeam.setTeamId(teamId); + userTeam.setUserId(userId); + userTeam.setJoinTime(new Date()); + + return userTeamService.save(userTeam); + } +} + +``` + + + +## 7.2分布式锁-多机部署环境下所有用户的所有请求共用一个锁 + +```java + +public boolean joinTeam(TeamJoinRequest teamJoinRequest, User loginUser) { + if (teamJoinRequest == null) { + throw new BusinessException(ErrorCode.PARAMS_ERROR); + } + + if (loginUser == null) { + throw new BusinessException(ErrorCode.NOT_LOGIN); + } + + Long teamId = teamJoinRequest.getTeamId(); + Team team = this.getById(teamId); + + // 判断加入的队伍是否过期 + Date expireTime = team.getExpireTime(); + if (expireTime != null && expireTime.before(new Date())) { + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "队伍已过期"); + } + + // 判断是否是私有队伍 + Integer status = team.getStatus(); + TeamStatusEnum teamStatusEnum = TeamStatusEnum.getEnumByValue(status); + if (TeamStatusEnum.PRIVATE.equals(teamStatusEnum)) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "禁止加入私有队伍"); + } + + String password = teamJoinRequest.getPassword(); + if (TeamStatusEnum.SECRET.equals(teamStatusEnum)) { + if (StringUtils.isBlank(password) || !password.equals(team.getPassword())) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "密码错误"); + } + } + + long userId = loginUser.getId(); + RLock lock = redissonClient.getLock("yupao:team:joinTeam"); + + try { + while (true) { + if (lock.tryLock(0, -1, TimeUnit.MILLISECONDS)) { + System.out.println("getLock: " + Thread.currentThread().getId()); + + // 每个人最多参加5个队伍 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId); + long hasJoinNum = userTeamService.count(wrapper); + if (hasJoinNum > 5) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "最多创建和加入5个队伍"); + } + + // 不能重复入队 + wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UserTeam::getUserId, userId).eq(UserTeam::getTeamId, teamId); + long hasUserJoinTeam = userTeamService.count(wrapper); + if (hasUserJoinTeam > 0) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "用户已加入该队伍"); + } + + // 队伍是否已满 + long teamUserNums = this.countTeamUserByTeamId(teamId); + if (teamUserNums >= team.getMaxNum()) { + throw new BusinessException(ErrorCode.PARAMS_ERROR, "队伍已满"); + } + + UserTeam userTeam = new UserTeam(); + userTeam.setTeamId(teamId); + userTeam.setUserId(userId); + userTeam.setJoinTime(new Date()); + + return userTeamService.save(userTeam); + } + } + } catch (InterruptedException e) { + log.error("The lock 'yupao:team:joinTeam' had a error ", e); + return false; + } finally { + // 释放锁,只能释放自己的锁 + if (lock.isHeldByCurrentThread()) { + System.out.println("unLock" + Thread.currentThread().getId()); + lock.unlock(); + } + } +} + +``` + diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/README.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/README.md" new file mode 100644 index 0000000..8790c54 --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/README.md" @@ -0,0 +1,707 @@ +# 入门必看 - 学习路线 + +⭐️ [如何自学编程?](入门必看-学习路线/如何自学编程?.md) + +⭐️ [编程入门到进大厂,你需要这套学习架构](入门必看-学习路线/编程入门到进大厂,你需要这套学习架构.md) + +⭐️ [我学计算机的四年,共勉!](/自学之路/大学经历/我学计算机的四年,共勉!.md)(鱼皮的计算机学习之路) + +[⭐️ 从大学到秋招,我如何拿下腾讯offer](/自学之路/大学经历/从大学到秋招,我如何拿下腾讯offer.md)(鱼皮的求职之路) + +⭐️ [前端学习路线 by 程序员鱼皮](../学习路线/前端学习路线%20by%20程序员鱼皮.md) + +⭐️ [Python学习路线 by 程序员鱼皮](../学习路线/Python学习路线%20by%20程序员鱼皮.md) + +⭐️ [Java学习路线 by 程序员鱼皮](../学习路线/Java学习路线%20by%20程序员鱼皮.md) + +⭐️ [Linux学习路线 by 程序员鱼皮](../学习路线/Linux学习路线%20by%20程序员鱼皮.md) + +⭐️ [C++学习路线 by 程序员鱼皮](../学习路线/C++学习路线%20by%20程序员鱼皮.md) + +⭐️ [Git&GitHub学习路线 by 程序员鱼皮](../学习路线/Git&GitHub学习路线%20by%20程序员鱼皮.md) + +⭐️ [SQL免费实战自学网站 by 程序员鱼皮](../学习路线/SQL免费实战自学网站%20by%20程序员鱼皮.md) + +⭐️ [设计模式学习路线 by 程序员鱼皮](../学习路线/设计模式学习路线%20by%20程序员鱼皮.md) + +⭐️ [数据结构和算法学习路线 by 程序员鱼皮](../学习路线/数据结构和算法学习路线%20by%20程序员鱼皮.md) + +[如何学习 GitHub?](入门必看-学习路线/如何学习GitHub?.md) + + + +## 学习指南 + +### 方向选择 + +⭐️ [考研还是就业?我当时也超纠结](学习指南/方向选择/考研还是就业?我当时也超纠结.md) + +⭐️ [聊聊编程语言的选择](学习指南/方向选择/聊聊编程语言的选择.md) + +[感觉进大厂机会渺茫,要考研续命么?](学习指南/方向选择/感觉进大厂机会渺茫,要考研续命么?.md) + +[选 C++ 还是 Java?](学习指南/方向选择/选%20C++%20还是%20Java?.md) + +[学网站开发还是打 ACM?](学习指南/方向选择/学网站开发还是打%20ACM?.md) + +[如何看待 “Java 已死、前端已凉” 等言论?](学习指南/方向选择/如何看待%20“Java%20已死、前端已凉”%20等言论?.md) + + + +### 学习建议 + +体系化的学习指南 + 答疑指导服务:[💎 编程学习 - 编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) + + + +⭐️ [如何高效找到优质编程项目?](学习指南/学习建议/如何高效找到优质编程项目?.md) + +⭐️ [有哪些参与项目的好途径?](学习指南/学习建议/有哪些参与项目的好途径?.md) + +⭐️ [如何正确选择编程学习资源?](学习指南/学习建议/如何正确选择编程学习资源?.md) + +⭐️ [如何正确地提问?](学习指南/学习建议/如何正确地提问?.md) + +⭐️ [我用了 6 年,告诉你怎么学好 Java](学习指南/学习建议/我用了%206%20年,告诉你怎么学好%20Java.md) + +⭐️ [学了十几种编程语言后,我有哪些感受?](学习指南/学习建议/学了十几种编程语言后,我有哪些感受?.md) + +[Mac 和 Win,到底用哪个系统学编程?](学习指南/学习建议/Mac%20和%20Win,到底用哪个系统学编程?.md) + +[大学,我是怎么边学编程边赚钱的?](../自学之路/大学经历/大学,我是怎么边学编程边赚钱的?.md) + +[我是后端,要学前端嘛?](学习指南/学习建议/我是后端,要学前端嘛?.md) + +[这是用框架的通病么?](学习指南/学习建议/这是用框架的通病么?.md) + +[别担心,我们都一样!](学习指南/学习建议/别担心,我们都一样!.md)(初学编程,觉得很难) + +[谁说没实习经历,就不能进大厂了!](求职经验/实习/谁说没实习经历,就不能进大厂了!.md) + +[一位非常认真的同学,赞之!](学习指南/学习建议/一位非常认真的同学,赞之!.md)(给大学同学的建议) + +[现在做这几件事,一定好起来!](学习指南/学习建议/现在做这几件事,一定好起来!.md)(寒假计划指南) + +[老师看上了我的项目,还想申请个软著?!](学习指南/学习建议/老师看上了我的项目,还想申请个软著?!.md)(软著介绍) + +[学弟想做个高质量视频小程序](学习指南/学习建议/学弟想做个高质量视频小程序.md) + + + +### 避坑指南 + +⭐️ [学编程,千万别背代码!](学习指南/避坑指南/学编程,千万别背代码!.md) + +⭐️ [学编程,别为这事浪费时间!](学习指南/避坑指南/学编程,别为这事浪费时间!.md) + +⭐️ [大多数人不注意,这样写代码会有问题 !](学习指南/避坑指南/大多数人不注意,这样写代码会有问题%20!.md) + +⭐️ [一个好的编程习惯](学习指南/避坑指南/一个好的编程习惯.md) + +⭐️ [几个对程序员的误解,害人不浅!](学习指南/避坑指南/几个对程序员的误解,害人不浅!.md) + +[别人看源码,那我也要看!](学习指南/避坑指南/别人看源码,那我也要看!.md)(学习源码的建议) + + + +### 学习故事 + +[在烧烤店约了一位阿里练习生](学习指南/学习故事/在烧烤店约了一位阿里练习生.md) + +[大一学弟的寒假总结,佩服!](学习指南/学习故事/大一学弟的寒假总结,佩服!.md) + +[迷茫四年后,我凭这点成功逆袭!](../编程导航/星球故事/球友经历/迷茫四年后,我凭这点成功逆袭!.md) + +[小学就开始学编程了,恐怖如斯!](../编程导航/星球故事/球友经历/小学就开始学编程了,恐怖如斯!.md) + +[小学就自学编程,顺手黑了学校广播系统?](学习指南/学习故事/小学就自学编程,顺手黑了学校广播系统?.md) + + + +## 开发经验 + +通过项目提升开发能力:[项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) + +⭐️ [主流前后端项目部署方式](开发经验/主流前后端项目部署方式.md) + +⭐️ [首次公开!我快速做项目的技巧](开发经验/首次公开!我快速做项目的技巧.md) + +⭐️ [刚入职新公司,代码看懵逼了咋办?](开发经验/刚入职新公司,代码看懵逼了咋办?.md)(如何快速上手新项目) + +⭐️ [老子写个代码而已,凭什么还要我写文档?](开发经验/老子写个代码而已,凭什么还要我写文档?.md)(写文档的经验方法) + +⭐️ [提高工作效率的秘诀](开发经验/提高工作效率的秘诀.md) + +⭐️ [大厂做项目的流程](开发经验/大厂做项目的流程.md) + +⭐️ [大厂的 SDK 写法,偷学到了!](开发经验/大厂的%20SDK%20写法,偷学到了!.md) + +⭐️ [解决 Bug 套路总结](开发经验/解决%20Bug%20套路总结.md) + +⭐️ [常见的写 Bug 原因汇总](开发经验/常见的写%20Bug%20原因汇总.md) + +⭐️ [2分钟,我把网站性能优化了3倍!](开发经验/2分钟,我把网站性能优化了3倍!.md) + +[如何给知名开源项目贡献代码?](开发经验/如何给知名开源项目贡献代码?.md) + +[千万别直接敲代码!](开发经验/千万别直接敲代码!.md)(写代码不是程序员最重要的事) + +[1024,说说我这几年总结的小技巧!](开发经验/1024,说说我这几年总结的小技巧!.md)(程序员工作小技巧) + +[GitHub 骚操作](开发经验/GitHub%20骚操作.md) + +[GitHub这5个骚操作,99%的人不知道!](开发经验/GitHub这5个骚操作,99%25的人不知道!.md) + +[员工写了个比删库更可怕的 Bug!](开发经验/员工写了个比删库更可怕的%20Bug!.md) + +[“这不是个大学生都能做吗?”](开发经验/“这不是个大学生都能做吗?”.md)(商用网站上线的注意事项) + +[刚进公司就负责项目,把老弟整蒙了!](开发经验/刚进公司就负责项目,把老弟整蒙了!.md)(技术选型) + +[学会这招,一天做一个项目!](开发经验/学会这招,一天做一个项目!.md) + +[项目启动失败?不用慌!](开发经验/项目启动失败?不用慌!.md) + +[还能这么做需求?产品经理都吓到了](开发经验/还能这么做需求?产品经理都吓到了.md) + +[编程大佬有哪些特点?](开发经验/编程大佬有哪些特点?.md) + +[为什么不要写 Hardcode?](开发经验/为什么不要写%20Hardcode?.md) + +[如何用 IDEA 提升开发效率?](开发经验/如何用%20IDEA%20提升开发效率?.md) + +[如何写好文档?](开发经验/如何写好文档?.md) + +[后端开发需要注意什么?](开发经验/后端开发需要注意什么?.md) + +[如何超前完成工作?](开发经验/如何超前完成工作?.md) + +[做项目时要注意的点](开发经验/做项目时要注意的点.md) + +[程序员绘图工具和技巧](开发经验/程序员绘图工具和技巧.md) + +[如何避免配置文件中的密码被泄露?](开发经验/如何避免配置文件中的密码被泄露?.md) + +[迷的一批,上线了新功能,老功能就废了!](开发经验/迷的一批,上线了新功能,老功能就废了!.md)(如何找到自己之前的代码) + + + +## 求职经验 + +### 求职建议 + +⭐️ [给学弟妹们的秋招建议!](求职经验/求职建议/给学弟妹们的秋招建议!.md) + +⭐️ [说说我最近招人的感受](求职经验/求职建议/说说我最近招人的感受.md)(从招聘方的视角,有哪些求职技巧) + +⭐️ [说说我最近筛简历和面试的感受](求职经验/求职建议/说说我最近筛简历和面试的感受.md)(从招聘方的视角,有哪些写简历和面试技巧) + +⭐️ [不要慌,我有几个小建议!](求职经验/求职建议/不要慌,我有几个小建议!.md)(求职应该有的心态) + +⭐️ [刚考完研,怎么去准备春招?](求职经验/求职建议/刚考完研,怎么去准备春招?.md) + +⭐️ [给学弟几个找工作的重要信息](求职经验/求职建议/给学弟几个找工作的重要信息.md) + +⭐️ [考研结束,抓紧做这件事!](求职经验/求职建议/考研结束,抓紧做这件事!.md) + + + + + +### 求职故事 + +[大二学弟刚面完字节,热乎!](../编程导航/星球故事/求职面经/大二学弟刚面完字节,热乎!.md) + +[我被面试官 “耍” 了么?](求职经验/求职故事/我被面试官%20“耍”%20了么?.md) + +[某位鱼友的春招上岸之路](求职经验/求职故事/某位鱼友的春招上岸之路.md) + +[给大家鼓鼓劲!](求职经验/求职故事/给大家鼓鼓劲!.md)(一些求职问题回答) + + + +### 实习 + +⭐️ [谁说没实习经历,就不能进大厂了!](求职经验/实习/谁说没实习经历,就不能进大厂了!.md) + +⭐️ [字节实习转正了,这是我的秘诀](../编程导航/星球故事/上岸分享/字节实习转正了,这是我的秘诀.md) + +[想旷课去参加实习了。。](../编程导航/星球故事/求职面经/想旷课去参加实习了。。.md) + +[实习天天crud,很迷茫...](求职经验/实习/实习天天crud,很迷茫....md) + +[实习相关问题](求职经验/实习/实习相关问题.md) + + + +### 简历技巧 + +完整的写简历技巧 + 几百份真实简历和建议参考:[💎 编程学习 - 编程导航知识星球](https://yuyuanweb.feishu.cn/wiki/VC1qwmX9diCBK3kidyec74vFnde) + +⭐️ 写简历模板:[求职 - 帮你写好简历的神器](https://yuyuanweb.feishu.cn/wiki/HMOBwsR9Si6GOQkqvPtcC2KYnWd) (一分钟生成简历) + +⭐️ [自我介绍,千万别来虚的!](求职经验/简历技巧/自我介绍,千万别来虚的!.md) + +⭐️ [帮改简历,发现了一些 “通病”](求职经验/简历技巧/帮改简历,发现了一些%20“通病”.md) + +⭐️ [简历项目造假,被发现了](求职经验/简历技巧/简历项目造假,被发现了.md)(增加简历项目真实性的方法) + +[关于简历造假,只能说太 “勇” 了](求职经验/简历技巧/关于简历造假,只能说太%20“勇”%20了.md) + +[内推学弟进了腾讯,看看他的标杆简历!](求职经验/简历技巧/内推学弟进了腾讯,看看他的标杆简历!.md) + +[帮大二创业的学弟优化简历,分享经验](求职经验/简历技巧/帮大二创业的学弟优化简历,分享经验.md) + + + +### 面试题 + +⭐️ [求职 - 鱼皮免费面试题整理](https://yuyuanweb.feishu.cn/wiki/KskNwNAj1iM6Kfk5p8zcQrK2nAh) + +⭐️ [送老弟去大厂面试,后端考点分享](求职经验/面试题/送老弟去大厂面试,后端考点分享.md) + +[腾讯二面,我被 “赛马” 问题难住了](求职经验/面试题/腾讯二面,我被%20“赛马”%20问题难住了.md) + + + +### 面经 + +[双非非科班,一年逆袭百度!完整面经](求职经验/面经/双非非科班,一年逆袭百度!完整面经.md) + +[从家里到阿里,学弟超神的一年](求职经验/面经/从家里到阿里,学弟超神的一年.md) + +[直系学弟进华为啦!](求职经验/面经/直系学弟进华为啦!.md) + +[大二学弟刚面完字节,热乎!](../编程导航/星球故事/求职面经/大二学弟刚面完字节,热乎!.md) + + + +## 职场经验 + +[23 岁,我担心中年危机](职场经验/23%20岁,我担心中年危机.md) + +[入职第一天,想跑路了!](职场经验/入职第一天,想跑路了!.md) + +[工作一年,天天 CRUD。。](职场经验/工作一年,天天%20CRUD。。.md) + +[在车上偶遇一位阿里大佬!](职场经验/在车上偶遇一位阿里大佬!.md) + + + +## 技术分享 + +### 入门科普 + +[啥是前端 ?](技术分享/入门科普/啥是前端%20?.md) + +[大的数据就是大数据?](技术分享/入门科普/大的数据就是大数据?.md) + +[啥是区块链?](技术分享/入门科普/啥是区块链?.md) + +[小白都能看懂的缓存入门](技术分享/入门科普/小白都能看懂的缓存入门.md) + +[啥是数据库?](技术分享/入门科普/啥是数据库?.md) + +[啥是重定向?](技术分享/入门科普/啥是重定向?.md) + +[你真的会写单例模式么?](技术分享/入门科普/你真的会写单例模式么?.md) + +[什么是无障碍技术?](技术分享/入门科普/什么是无障碍技术?.md) + +[什么是魔法值?](技术分享/入门科普/什么是魔法值?.md) + +[什么是魔数?](技术分享/入门科普/什么是魔数?.md) + +[什么是 Linux?](技术分享/入门科普/什么是%20Linux?.md) + +[什么是负载均衡?](技术分享/入门科普/什么是负载均衡?.md) + + + +### 技术实践 + +⭐️ [一周上线百万级高并发系统](技术分享/技术实践/一周上线百万级高并发系统.md) + +⭐️ [使用内网穿透,1 分钟 “上线” 本地网站](技术分享/技术实践/使用内网穿透,1%20分钟%20“上线”%20本地网站.md) + +⭐️ [从 0 到 1,看我玩弄千万日志于股掌](技术分享/技术实践/从%200%20到%201,看我玩弄千万日志于股掌.md) + +⭐️ [大厂机密!30 个提升团队研发效能的锦囊](技术分享/技术实践/大厂机密!30%20个提升团队研发效能的锦囊.md) + +⭐️ [揭秘软件开发的达摩克利斯之剑](技术分享/技术实践/揭秘软件开发的达摩克利斯之剑.md) + +⭐️ [大厂的 SDK 写法,偷学到了!](开发经验/大厂的%20SDK%20写法,偷学到了!.md) + +⭐️ [使用 ES 优化网站搜索体验](技术分享/技术实践/使用%20ES%20优化网站搜索体验.md) + +⭐️ [老弟做了个网盘,炸了!](技术分享/技术实践/老弟做了个网盘,炸了!.md) + +⭐️ [不敢想,做个博客竟如此简单!](技术分享/技术实践/不敢想,做个博客竟如此简单!.md) + +[快速部署微服务项目,保姆级教程](技术分享/技术实践/快速部署微服务项目,保姆级教程.md) + +[千万别强制停机!我嘴都气歪了!](技术分享/技术实践/千万别强制停机!我嘴都气歪了!.md) + +[如何预防 rm -rf ?](技术分享/技术实践/如何预防%20rm%20-rf%20?.md) + +[写了7年代码,第一次见这么狗血的小Bug!](技术分享/技术实践/写了7年代码,第一次见这么狗血的小Bug!.md) + +[这些代码,差点把我气出内伤](技术分享/技术实践/这些代码,差点把我气出内伤.md) + +[记一次前端长整数精度丢失问题](技术分享/技术实践/记一次前端长整数精度丢失问题.md) + +[如何去除字符串中的 "\n" ?](技术分享/技术实践/如何去除字符串中的%20n%20?.md) + +[气炸!又一次被编辑器坑了!](技术分享/技术实践/气炸!又一次被编辑器坑了!.md) + +[被攻击了!事后分析](技术分享/技术实践/被攻击了!事后分析.md) + +[越自信,Bug 越多](技术分享/技术实践/越自信,Bug%20越多.md) + +[编程导航,凉凉!](技术分享/技术实践/编程导航,凉凉!.md) + +[万万没想到,这都能发现 Bug?!](技术分享/技术实践/万万没想到,这都能发现%20Bug?!.md) + +[这个 Bug,给我整得一愣一愣!](技术分享/技术实践/这个Bug,给我整得一愣一愣!.md) + +[我竟被这个 Bug 坑了一周!](技术分享/技术实践/我竟被这个%20Bug%20坑了一周!.md) + +[扒个知名项目的 Bug!](技术分享/技术实践/扒个知名项目的%20Bug!.md) + + + +### 技术知识 + +⭐️ [前后端分离,千万别再搞错了!](技术分享/技术知识/前后端分离,千万别再搞错了!.md) + +⭐️ [反向压力](技术分享/技术知识/反向压力.md) + +⭐️ [多环境](技术分享/技术知识/多环境.md) + +⭐️ [B 站崩盘事故分析](技术分享/技术知识/B%20站崩盘事故分析.md) + +[啥是热数据探测?](技术分享/技术知识/啥是热数据探测?.md) + +[手写 OJ 系统,真的很难么?](技术分享/技术知识/手写%20OJ%20系统,真的很难么?.md) + +[我们学并发时,到底在学什么?](技术分享/技术知识/我们学并发时,到底在学什么?.md) + +[搜索引擎工作原理](技术分享/技术知识/搜索引擎工作原理.md) + +[除了 MySQL,这些数据库你都认识么?](技术分享/技术知识/除了%20MySQL,这些数据库你都认识么?.md) + +[00 后架构师,那可能么?](技术分享/技术知识/00%20后架构师,那可能么?.md)(什么是架构设计?怎么做好架构设计?) + +[上线网站,谨慎使用按量计费服务!](技术分享/技术知识/上线网站,谨慎使用按量计费服务!.md) + + + +## 实战教程 + +⭐️ [搞台虚拟机玩玩!](实战教程/搞台虚拟机玩玩!.md) + +[⭐️ 我用这个技术,干掉几千行 if else!](实战教程/我用这个技术,干掉几千行%20if%20else!.md) + +[⭐️ 几行代码,竟然就能做个聊天室!](实战教程/几行代码,竟然就能做个聊天室!.md) + +⭐️ [实战开发类库,手写 Spring Boot Starter!](实战教程/实战开发类库,手写%20Spring%20Boot%20Starter!.md) + +[⭐️ 几种简单免费的上线网站方法](实战教程/几种简单免费的上线网站方法.md) + +⭐️ [Docsify + 云开发,高效创造你的文档网站](实战教程/Docsify%20+%20云开发,高效创造你的文档网站.md) + +⭐️ [如何用 5 分钟上线新网站?](实战教程/如何用%205%20分钟上线新网站?.md) + +[怎么做个不用网络的软件?](../编程导航/星球故事/星主分享/怎么做个不用网络的软件?.md) + +[炸裂的 AutoGPT,帮我做了个网站!](实战教程/炸裂的%20AutoGPT,帮我做了个网站!.md) + +[让程序员老弟去做 PPT?白日做梦](实战教程/让程序员老弟去做%20PPT?白日做梦.md) + +[我单方面宣布,自己是 ChatGPT 程序员!](实战教程/我单方面宣布,自己是%20ChatGPT%20程序员!.md)(编程词典网站) + +[谁会拒绝一个免费的部署服务呢?](实战教程/谁会拒绝一个免费的部署服务呢?.md) + +[如何给知名开源项目贡献代码?](../编程分享/开发经验/如何给知名开源项目贡献代码?.md) + +[五分钟,使用 Typora + PicGo 提升百倍写作效率](实战教程/五分钟,使用%20Typora%20+%20PicGo%20提升百倍写作效率.md) + +[腾讯公测云开发低码!全网首篇实战评测](实战教程/腾讯公测云开发低码!全网首篇实战评测.md) + +[让你的 GitHub 秒变高大上!](实战教程/让你的%20GitHub%20秒变高大上!.md) + +[Java 处理表格,真的很爽!](实战教程/Java%20处理表格,真的很爽!.md) + +[VS Code 远程开发实战](实战教程/VS%20Code%20远程开发实战.md) + +[一起来做个免登录资源导航小程序吧](实战教程/一起来做个免登录资源导航小程序吧.md) + +[室友去厕所的功夫,我写了个计算器](实战教程/室友去厕所的功夫,我写了个计算器.md) + +[尝鲜 Svelte 前端框架,开发读书笔记](实战教程/尝鲜%20Svelte%20前端框架,开发读书笔记.md) + +[魔改和上线你的合成大西瓜,最全教程](实战教程/魔改和上线你的合成大西瓜,最全教程.md) + + + +## 其他 + +[14 岁,3 次给我的项目贡献代码](其他/14%20岁,3%20次给我的项目贡献代码.md)(一些开源贡献的技巧) + +[学前端的朋友做的个人博客](其他/学前端的朋友做的个人博客.md) + +[一个程序员的水平能差到什么程度?](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247484329&idx=1&sn=397d569510173a10b6e37962d5e65198&scene=21#wechat_redirect) + +[再次登上学生时代的个人博客,泪目](其他/再次登上学生时代的个人博客,泪目.md) + +[世上竟有如此优雅的代码!](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247485480&idx=1&sn=977700cf9f9e87225beb9bd829f5131e&scene=21#wechat_redirect) + +[大意了啊,不小心毁了一家公司](其他/大意了啊,不小心毁了一家公司.md) + +[你真的了解程序员么?做个测试吧!](其他/你真的了解程序员么?做个测试吧!.md) + + + +## 📚 项目教程 + +### 保姆级实战项目教程 + +⭐️ [项目实战 - 鱼皮原创项目教程系列](https://yuyuanweb.feishu.cn/wiki/SePYwTc9tipQiCktw7Uc7kujnCd) + +[实战项目 - OJ 判题系统](项目教程/保姆级实战项目教程/实战项目%20-%20OJ%20判题系统.md) + +[实战项目 - 智能 BI 平台](项目教程/保姆级实战项目教程/实战项目%20-%20智能%20BI%20平台.md) + +[实战项目 - 聚合搜索平台](项目教程/保姆级实战项目教程/实战项目%20-%20聚合搜索平台.md) + +[实战项目 - API 开放平台](项目教程/保姆级实战项目教程/实战项目%20-%20API%20开放平台.md) + +[实战项目 - 伙伴匹配系统](项目教程/保姆级实战项目教程/实战项目%20-%20伙伴匹配系统.md) + +[实战项目 - 用户中心平台](项目教程/保姆级实战项目教程/实战项目%20-%20用户中心平台.md) + +[实战项目代码开源了!](项目教程/保姆级实战项目教程/实战项目代码开源了!.md) + + + +## 个人作品 + +### 编程导航 - 编程资源网 + +⭐️ [爆肝 200 小时,我做了个编程导航!](个人作品/编程导航-编程资源网/爆肝%20200%20小时,我做了个编程导航!.md) + +[编程导航诞生!轻松发现优质编程资源](个人作品/编程导航-编程资源网/编程导航诞生!轻松发现优质编程资源.md) + +[爆肝!朋友做了个编程导航网站!](个人作品/编程导航-编程资源网/爆肝!朋友做了个编程导航网站!.md) + +[给爸爸们汇报几件事!](个人作品/编程导航-编程资源网/给爸爸们汇报几件事!.md) + +[假期结束,编程导航带着新功能来啦!](个人作品/编程导航-编程资源网/假期结束,编程导航带着新功能来啦!.md) + + + +### 面试鸭 - 面试刷题网 + +⭐️ [免费面试刷题网 - 面试鸭](个人作品/面试鸭-面试刷题网/免费面试刷题网%20-%20面试鸭.md) + +⭐️ [面试鸭网站,用到的技术讲解](个人作品/面试鸭-面试刷题网/面试鸭网站,用到的技术讲解.md) + +[对不起,我的面试刷题网复活了!](个人作品/面试鸭-面试刷题网/对不起,我的面试刷题网复活了!.md) + +[攻击面试鸭?进小黑屋!](个人作品/面试鸭-面试刷题网/攻击面试鸭?进小黑屋!.md) + + + +### 测试鸭 - 自学网站安全 + +⭐️ [测试鸭开源](个人作品/测试鸭-自学网站安全/测试鸭开源.md) + +[做了个找打的网站,拿去玩!](个人作品/测试鸭-自学网站安全/做了个找打的网站,拿去玩!.md) + + + +### 其他 + +⭐️ SQL 自学网站:[看完这个,我直接把 SQL 刷通了!](个人作品/其他/看完这个,我直接把%20SQL%20刷通了!.md) + +⭐️ SQL 代码生成器: + +- [这次我开源,别再打我啦!](个人作品/其他/这次我开源,别再打我啦!.md) +- [我做了一款生成代码+数据的神器!](个人作品/其他/我做了一款生成代码+数据的神器!.md) + +⭐️ AI 自动回复工具:[大家好,我是小智!](个人作品/其他/大家好,我是小智!.md) + +⭐️ 鱼了个鱼:[羊了个羊,但是低配版](个人作品/其他/羊了个羊,但是低配版.md) + +⭐️ 极客范儿浏览器主页:[我做了个很帅的网站!](个人作品/其他/我做了个很帅的网站!.md) + +⭐️ 结构化 SQL 生成器:[我造了个轮子,完整开源!](个人作品/其他/我造了个轮子,完整开源!.md) + +⭐️ [自制 AI 问答机器人](个人作品/其他/自制%20AI%20问答机器人.md) + +⭐️ AI 生成网站 - 编程词典: + +- [我的新网站上线了!而且这次的制作方式有点不同](个人作品/其他/我的新网站上线了!而且这次的制作方式有点不同.md) +- [我单方面宣布,自己是 ChatGPT 程序员!](../编程分享/实战教程/我单方面宣布,自己是%20ChatGPT%20程序员!.md) + +表情包网站:[我的表情包网站上线啦!](个人作品/其他/我的表情包网站上线啦!.md) + +极简浏览器主页:[奇思妙想,动手 DIY 你的浏览器主页](个人作品/其他/奇思妙想,动手%20DIY%20你的浏览器主页.md) + +网站生成工具:[喜迎新春,我做了一个祝福网站生成器](个人作品/其他/喜迎新春,我做了一个祝福网站生成器.md) + +编程昵称生成器:[愚皮做了一个 AI 编程昵称生成器](个人作品/其他/愚皮做了一个%20AI%20编程昵称生成器.md) + +表白网站生成工具:[520,我做了个表白网站生成器](个人作品/其他/520,我做了个表白网站生成器.md) + +C++ 图像处理软件:[我的毕业设计,时隔一年,仍感觉头秃](个人作品/其他/我的毕业设计,时隔一年,仍感觉头秃.md) + +排行榜功能:[带老弟做个实时排行榜](个人作品/其他/带老弟做个实时排行榜.md) + +分布式邮件调度平台:[我大三时做的羞耻项目!](../自学之路/大学经历/我大三时做的羞耻项目!.md) + +鱼语言:[一不小心创造了新的编程语言!](个人作品/其他/一不小心创造了新的编程语言!.md) + + + +### 项目导学 + +[项目导学 - 黑马点评](项目教程/项目导学/项目导学%20-%20黑马点评.md) + +[项目导学 - 硅谷课堂](项目教程/项目导学/项目导学%20-%20硅谷课堂.md) + +[项目导学 - 尚医通](项目教程/项目导学/项目导学%20-%20尚医通.md) + +[项目导学 - 瑞吉外卖](项目教程/项目导学/项目导学%20-%20瑞吉外卖.md) + + + +## 🎁 编程资源 + +### 开发工具 + +⭐️ [精品 IDEA 插件大汇总!值得收藏](编程资源/开发工具/精品%20IDEA%20插件大汇总!值得收藏.md) + +⭐️ [用了这个 Java 小工具,我废了](编程资源/开发工具/用了这个%20Java%20小工具,我废了.md) + +⭐️ [我工作中不可或缺的宝贝们](编程资源/开发工具/我工作中不可或缺的宝贝们.md) + +⭐️ [我写代码的十八般兵器!](编程资源/开发工具/我写代码的十八般兵器!.md) + +⭐️ [几个免费的富文本编辑器,这不完胜付费?](../编程分享/编程资源/项目推荐/几个免费的富文本编辑器,这不完胜付费?.md) + +⭐️ [抱歉,我不用别的测试工具了!](编程资源/开发工具/抱歉,我不用别的测试工具了!.md) + +⭐️ [一个免费、不怕打的评论插件!](编程资源/开发工具/一个免费、不怕打的评论插件!.md) + +⭐️ [免费好用的内网穿透工具](编程资源/开发工具/免费好用的内网穿透工具.md) + +[3分钟,给女朋友做个云笔记!](编程资源/开发工具/3分钟,给女朋友做个云笔记!.md) + +[Java 爬虫库推荐](编程资源/开发工具/Java%20爬虫库推荐.md) + +[一键生成几千套代码模板的前端神器](编程资源/开发工具/一键对比%2030%20种编程语言的工具.md) + +[分享几个好用免费的图床](编程资源/开发工具/分享几个好用免费的图床.md) + +[微信发力了,一键部署网站后端!](编程资源/开发工具/微信发力了,一键部署网站后端!.md) + +[一键对比 30 种编程语言的工具](编程资源/开发工具/一键生成几千套代码模板的前端神器.md) + +[一个厉害的小工具,小黑子都在用!](编程资源/开发工具/一个厉害的小工具,小黑子都在用!.md) + +### 学习资源 + +⭐️ [编程导航免费学习资源汇总](编程资源/学习资源/编程导航免费学习资源汇总.md) + +⭐️ [10个宝藏级编程资源](编程资源/学习资源/10个宝藏级编程资源.md) + +[帮你学英语的项目](编程资源/学习资源/帮你学英语的项目.md) + +[程序员如何赚钱的小书](编程资源/学习资源/程序员如何赚钱的小书.md) + +[汇总一波免费 Python 资源](编程资源/学习资源/汇总一波免费%20Python%20资源.md) + +[刷算法的资源分享](编程资源/学习资源/刷算法的资源分享.md) + +[快速发现优秀开源项目的三板斧](编程资源/学习资源/快速发现优秀开源项目的三板斧.md) + +[分享一套保姆级 Java 教程](编程资源/学习资源/分享一套保姆级%20Java%20教程.md) + +[Java 源码教程项目大汇总](编程资源/学习资源/Java%20源码教程项目大汇总.md) + +[Java 文档教程大汇总](编程资源/学习资源/Java%20文档教程大汇总.md) + +[Java 知识总结项目大汇总](编程资源/学习资源/Java%20知识总结项目大汇总.md) + +### 项目推荐 + +⭐️ [很多网站,根本不用自己做!](编程资源/项目推荐/很多网站,根本不用自己做!.md) + +[前端福音,蚂蚁金服 Ant Design 生态一览](编程资源/项目推荐/前端福音,蚂蚁金服%20Ant%20Design%20生态一览.md) + +[又火一个前端项目](编程资源/项目推荐/又火一个前端项目.md) + +[这 10 个创意项目,太顶了!](编程资源/项目推荐/这%2010%20个创意项目,太顶了!.md) + +[几个免费的富文本编辑器,这不完胜付费?](编程资源/项目推荐/几个免费的富文本编辑器,这不完胜付费?.md) + +[用 Git 操作的数据库?这个项目火了!](编程资源/项目推荐/用%20Git%20操作的数据库?这个项目火了!.md) + +[N 年沉淀,腾讯这套系统终于开源!](编程资源/项目推荐/N%20年沉淀,腾讯这套系统终于开源!.md) + +[字节前端终于开源!吹爆!](编程资源/项目推荐/字节前端终于开源!吹爆!.md) + +[腾讯的内部分享,大赞!](编程资源/项目推荐/腾讯的内部分享,大赞!.md) + + + +### 其他 + +⭐️ [这些网站,陪我过了 5 年](编程资源/其他/这些网站,陪我过了%205%20年.md) + +[B 站 UP 主推荐](编程资源/其他/B%20站%20UP%20主推荐.md) + +[几个今年超火的编程网站!](编程资源/其他/几个今年超火的编程网站!.md) + + + +## 🌐 科技科普 + +### 科技资讯 + +[摔到老三的 Java,未来在哪?](科技科普/科技资讯/摔到老三的%20Java,未来在哪?.md) + +[我刚买了永久会员,你就下线了?!](科技科普/科技资讯/我刚买了永久会员,你就下线了?!.md) + +[腾讯,1000 亿!](科技科普/科技资讯/腾讯,1000%20亿!.md) + +[Log4j,炸了!!!](科技科普/科技资讯/Log4j,炸了!!!.md) + +[IE 今天正式停用!网友炸锅了](科技科普/科技资讯/IE%20今天正式停用!网友炸锅了.md) + +[看了华为鸿蒙发布会,泼盆冷水](科技科普/科技资讯/看了华为鸿蒙发布会,泼盆冷水.md) + +[西安健康码又崩了!随便聊聊](科技科普/科技资讯/西安健康码又崩了!随便聊聊.md) + +[突发!Gitee 图床,废了!](科技科普/科技资讯/突发!Gitee%20图床,废了!.md) + +[Gitee 很无奈!](科技科普/科技资讯/Gitee%20很无奈!.md) + +[离谱!](科技科普/科技资讯/离谱!.md)(ChatGPT 体验) + +[百度终于要出手了?](科技科普/科技资讯/百度终于要出手了?.md) + +[无语,又一个知名项目收费了。。。已卸载](科技科普/科技资讯/无语,又一个知名项目收费了。。。已卸载.md)(GitHub Copilot) + +[Spring Boot 船新版本?我却很失望](科技科普/科技资讯/Spring%20Boot%20船新版本?我却很失望.md) + +[恐怖的 GPT4!我也入局了](科技科普/科技资讯/恐怖的%20GPT4!我也入局了.md) + +[我和 AI 的故事](科技科普/科技资讯/我和%20AI%20的故事.md)(如何用 AI 提高工作效率) + +### 科普 + +[穿背心的老院士,86岁,重病,还在敲代码,单手](科技科普/科普/穿背心的老院士,86岁,重病,还在敲代码,单手.md) + +[计算机女神,互联网第一夫人](科技科普/科普/计算机女神,互联网第一夫人.md) \ No newline at end of file diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/520\357\274\214\346\210\221\345\201\232\344\272\206\344\270\252\350\241\250\347\231\275\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/520\357\274\214\346\210\221\345\201\232\344\272\206\344\270\252\350\241\250\347\231\275\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" new file mode 100644 index 0000000..db8bd45 --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/520\357\274\214\346\210\221\345\201\232\344\272\206\344\270\252\350\241\250\347\231\275\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" @@ -0,0 +1,32 @@ +# 520,我做了个表白网站生成器 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +> 轻轻松松,为你爱的人送上专属的表白网站吧! + +大家好,我是鱼皮,今年春节的时候,我开发了一个祝福网站生成器网站,还写下了这篇文章: + +[喜迎新春,我做了一个祝福网站生成器!](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247492368&idx=1&sn=f54550b92fbfd16b31f25dbe4741814a&scene=21#wechat_redirect) + +至今,已经有上千名小伙伴使用它生成了专属新春祝福网站,传递了自己的祝福。 + +除了新春祝福外,我又追加了几个表白网站的模板,在 520 这天,呈献给大家。 + +![](https://pic.yupi.icu/5563/202311090827286.png) + +> 祝福网站生成器 + +使用方式非常简单,直接选择你想生成的网站模板,然后输入自己的配置内容即可。最终会生成两个可在线访问的网址,每个网址都是鱼皮花了 “天价” 买来的,分别为 `happynewyear.life`(新年新生活)和 `woaini.center`(我爱你,以你为中心)。520 的话,当然要用后面那个域名啦,非常有寓意,据说能让你的表白心意翻倍! + +![](https://pic.yupi.icu/5563/202311090827141.png) + +> 输入表白内容 + +打开网址看下效果,没问题的话发给心爱的人吧~ + +![](https://pic.yupi.icu/5563/202311090827154.png) + +> 表白网站效果 + diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\344\270\200\344\270\215\345\260\217\345\277\203\345\210\233\351\200\240\344\272\206\346\226\260\347\232\204\347\274\226\347\250\213\350\257\255\350\250\200\357\274\201.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\344\270\200\344\270\215\345\260\217\345\277\203\345\210\233\351\200\240\344\272\206\346\226\260\347\232\204\347\274\226\347\250\213\350\257\255\350\250\200\357\274\201.md" new file mode 100644 index 0000000..1837db9 --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\344\270\200\344\270\215\345\260\217\345\277\203\345\210\233\351\200\240\344\272\206\346\226\260\347\232\204\347\274\226\347\250\213\350\257\255\350\250\200\357\274\201.md" @@ -0,0 +1,296 @@ +# 一不小心创造了新的编程语言! + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +鱼皮平时会写一些有趣的小项目练练手。谁知道,前段时间,一不小心创造了一门新的编程语言! + +![](https://pic.yupi.icu/5563/202311090841434.jpeg) + + + +如你所见,视频中的代码出现了大量的 Emoji 表情符号,非常有趣,这是鱼皮创造的编程语言的特色(和 Emojicode 类似)。鱼皮将这门编程语言取名为『 🐟 语言 』,正是希望它像水中鱼儿一样自由、灵活、快乐、游刃有 🐟。 + +下面给大家介绍一下 🐟 语言。 + +## 啥是 🐟 语言? + +🐟 语言是一门基于 JavaScript 的逗比编程语言。它支持面向表情符号编程,不仅吸收了 JavaScript 语言的各种优点,还摒弃了 JavaScript 里大量复杂难懂的关键词,使得 🐟 语言具有**功能强大**和**简单易用**两个特征,它允许程序员以优雅的思维方式进行复杂的编程,并且具有一定的减压效果。 + +![](https://pic.yupi.icu/5563/202311090841391.jpeg) + +🐟 语言作为一门图灵完备的编程语言,具有很多优秀的特性,比如简单性、高性能、分布式、健壮性、安全性、平台独立、可移植性、多线程、动态性等等。这些特性使得其几乎适用于所有类型应用的开发,比如编写桌面应用程序、Web 网站、分布式系统、嵌入式系统、小程序、快应用等,就连现在最热门的 AI、大数据、区块链等领域也完全不在话下。 + +目前已推动腾迅、阿狸、字节挑动、美団、百渡、拼爹多、京冬等多家公司使用,成功帮助企业降本增效,帮助员工告别 996,深受好评,谁用了不叫一声 XXX! + +![](https://pic.yupi.icu/5563/202311090841395.jpeg) + +我们也采访了一些使用 🐟 语言的开发者,分享下他们的故事。 + +## 王大爷和 🐟 语言 + +王大爷今年 28 岁,是一名互联网公司的前端开发,我们来看看 🐟 语言怎么帮助他重拾自我。 + +![](https://pic.yupi.icu/5563/202311090841680.png) + +在踏入互联网行业之初,我觉得压力也没那么大。但工作一段时间后发现,我们每天要面对成千上万的代码,全是些英文单词,看久了头晕眼花,而且一不注意就会出现 bug。我常常因为改 bug 熬到深夜,没有时间陪伴家人,我的妻子也因此离开了我。 + +![](https://pic.yupi.icu/5563/202311090841399.jpeg) + +后来我们公司来了一名驾构师,他提出使用 🐟 语言来进行新项目的开发。开始我还一脸不屑,不就是 Emojicode 么,哗众取宠。 + +但是当我真正上手使用 🐟 语言,才发现真的是如丝般顺滑。 + +首先是通过一行命令就能轻松启动项目,打包构建通通丢掉。 + +``` +./yulang.sh myproject +``` + + + +当枯燥无味的英文变成了一个个小表情后,我敲代码就像在画漫画,轻松有趣。还能够通过脚本一键把 JavaScript 项目重构为 🐟 语言,真太方便了! + +``` +🐌 value; +🐒 N 🐟 10; + +🐚 🦄 + 🦀 (value 🐟🐟🐟 🦒 || value 🐟🐟🐟 🐧) 🦄 + 🐮 🦉 Error(); + 🦁 +🦁 🐩 (e) 🦄 + 🥚 (N) 🦄 + 🐁 0: + 🐦; + 🐁 10: + 🐦; + 🦖: + 🦁 +🦁 🐙 🦄 + value 🐟 0; +🦁 +``` + + + +而且 🐟 语言非常地健壮,帮助我告别了原本一辈子都改不完的 bug。用了一段时间 🐟 语言后,我发现我已经离不开它了,我愿称它为最强! + +如今,我已经是一名 🐟 语言高级攻城狮,也在为我们公司招聘更多的 🐟 语言人才。前段时间,我的妻子又回到了我的身边,感谢 🐟 语言,让我重拾自我,拥有幸福的人生! + +![](https://pic.yupi.icu/5563/202311090841402.jpeg) + + + +------ + + + +感谢王大爷。 + +相信此时的你一定非常好奇,这么生动、形象、优秀、牛逼、无敌的编程语言是怎么实现的呢? + +![](https://pic.yupi.icu/5563/202311090841259.png) + +其实很简单,站在巨人的肩膀上,只需五分钟,就能实现 🐟 语言。 + +![](https://pic.yupi.icu/5563/202311090841291.png) + +## 五分钟实现 🐟 语言 + +整个 🐟 语言分为两部分,**核心包**和**运行脚本**,总共就 5 个文件,非常轻量。 + +你肯定会问:“只有 5 个文件,就能实现编程语言么?” + +其实思路很简单,我们并不是真正地从 0 到 1 实现编程语言,而是可以通过编写一个 “编译器”,将任何格式和语法的源文件转换成直接能够在浏览器和 Node 等环境中运行的 JavaScript 脚本语言,就像 TypeScript 和 FreeMarker 等模板引擎一样。 + +![](https://pic.yupi.icu/5563/202311090841284.png) + +因此,实现 🐟 语言的过程就简化为开发一个 “编译器” 和一个执行脚本。 + +### 定义编译规则 + +我们可以发挥想象,尽情地定义新编程语言的格式和编译规则。比如 🐟 语言中,使用大量的 Emoji 表情符号进行编程。 + +``` +🐘 getSum(val, N) 🦄 + 🧸 (🐢 i 🐟 0; i < N; i++) 🦄 + val +🐟 i; + 🦁 + 🦔 val; +🦁 + +🦌.log('result 🐟 ' + getSum(value, N)) +``` + + + +而 🐟 语言的编译规则很简单,就是通过定义一本字典,将 Emoji 表情符号映射成 JavaScript 中的关键字。 + +比如下面的字典 map.js 中,定义了 **Emoji** 和**关键字**两个数组: + +``` +const emojis = ['🐔', '🐖', '🐺', '🐑', + '🦆', '🐧', '🐭', '🐂', + '🐯', '🐰', '🐉', '🐍' + ]; + +const keyWords = ['abstract', 'arguments', 'boolean', 'break', + 'byte', 'case', 'catch', 'char', + 'continue', 'debugger', 'default', 'delete' + ]; +``` + + + +使用 JavaScipt 中的对象将两个数组进行关联,存储为字典("🐔" 对应 "abstract","🐖" 对应 "arguments"): + +``` +// '🐔' => 'abstract' +const emojiWordMap = {}; +// 'abstract' => '🐔' +const wordEmojiMap = {}; + +for (let i = 0; i < keyWords.length; i++) { + emojiWordMap[emojis[i]] = keyWords[i]; + wordEmojiMap[keyWords[i]] = emojis[i]; +} +``` + +### + +### + +### 开发编译器 + +定义好规则后,在编译器中编写应用规则的逻辑,将源文件(.yu)输出为目标文件(.js)即可。 + +1. 通过 fs 库读取源文件: + +``` +const fs = require('fs'); + +const basePath = './src'; +const filepath = `${basePath}/${process.argv[2]}.yu`; + +let fileData = fs.readFileSync(filepath, 'utf-8'); +``` + + + +2. 使用 replace 字符串替换函数,按照定义好的字典,将源文件中的 Emoji 替换为 JavaScript 中的对应关键字: + +``` +const {emojiWordMap} = require('./map'); + +for (const emoji in emojiWordMap) { + fileData = fileData.replace(new RegExp(emoji,'g'), emojiWordMap[emoji]); +} +``` + + + +3. 输出目标文件: + +``` +fs.writeFile(`${basePath}/${process.argv[2]}.js`, fileData, { 'flag': 'w' }, err => { + if (err) { + throw err; + } + console.log(`✅ compile succeed!`); +}); +``` + + + +一个编译器就开发完成了!可以编写一些文件进行测试。 + +![](https://pic.yupi.icu/5563/202311090841287.jpeg) + +### + +### + +### 开发执行脚本 + +虽然编译器开发完了,但是总不能每次都让开发者手动编译再去运行代码吧?就像手动编译执行 C 语言,何等的麻烦! + +可以编写一个执行脚本,开发者只需执行脚本,脚本会自动编译源文件,并执行编译出的 JavaScript 文件,代码运行结束后还将自动清理编译结果文件。 + +脚本文件并不复杂,接受源文件路径作为参数,通过 node 命令执行编译、运行编译后的代码,通过 rm -rf 实现文件的清理: + +``` +#!/usr/bin/env bash +# 基本路径 +basePath="./src" + +# 参数校验 +if [[ ! -n $1 ]]; then + echo "❌ error: no filename!" + exit 1 +fi + +# 编译 +node ./core/compile.js $1 + +# 执行 +node ${basePath}/$1 + +# 清理 +rm -rf ${basePath}/$1.js +``` + + + +大功告成,就这么简单! + +![](https://pic.yupi.icu/5563/202311090841287.jpeg) + +快运行试试看~ + +![](https://pic.yupi.icu/5563/202311090841314.png) + +### + +### + +### + +### 亿点优化 + +基础的编译执行流程跑通后,我们还可以做很多事情来优化项目。比如: + +1. 编写一个**字典文档**,帮助开发者查看: + +![](https://pic.yupi.icu/5563/202311090841143.png) + +2. 编写一个**校验器**,防止字典文档编写错误: + +![](https://pic.yupi.icu/5563/202311090841168.png) + +3. 编写一个反编译器,将 JavaScript 文件编译成 🐟 语言源文件(.yu),就是把编译器的规则字典反过来即可。 + +4. 实现更复杂的编译规则。 + +![](https://pic.yupi.icu/5563/202311090841217.jpeg) + +等等,这不就是**前端工程化**么?文档、规范、校验、反编译、自动化、优化。 + +看来,即使是一个很小的前端项目,只要不断思考和打磨,也是能够成为一个好的作品。 + + + +------ + + + +最后,鱼皮得承认,🐟 语言是个辣鸡到不行的语言,本篇文章前半部分都是在胡编乱造。但是,如果 🐟 语言的实现如果能够给大家一些启发和思考,激发大家的兴趣,我觉得这个项目就成功了,升值了~ + +![](https://pic.yupi.icu/5563/202311090841180.jpeg) + +如果本文让您乐了,或者对您有帮助的话,希望能点个在看,多多转发,感激不尽!下次鱼皮会准备一个更好玩的项目~ + +![](https://pic.yupi.icu/5563/202311090841786.gif) + +🐟 语言现已开源至 GitHub,欢迎大家下载使用,**点击下方阅读原文**一键传送。 \ No newline at end of file diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\226\234\350\277\216\346\226\260\346\230\245\357\274\214\346\210\221\345\201\232\344\272\206\344\270\200\344\270\252\347\245\235\347\246\217\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\226\234\350\277\216\346\226\260\346\230\245\357\274\214\346\210\221\345\201\232\344\272\206\344\270\200\344\270\252\347\245\235\347\246\217\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" new file mode 100644 index 0000000..65c8181 --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\226\234\350\277\216\346\226\260\346\230\245\357\274\214\346\210\221\345\201\232\344\272\206\344\270\200\344\270\252\347\245\235\347\246\217\347\275\221\347\253\231\347\224\237\346\210\220\345\231\250.md" @@ -0,0 +1,31 @@ +# 喜迎新春,我做了一个祝福网站生成器 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +> 新年祝福 or 表白,快来为你爱的人送上专属的祝福网站吧! + +每年春节,大家都会用发红包、发祝福文字、发祝福视频等方式来传递和分享喜悦。 + +今年呢,定制红包封面一时间引领了新的潮流。区别于传统红包,大家可以在定制的红包封皮中展现更多的创意、表达更多自己的情感和祝福。 + +![](https://pic.yupi.icu/5563/202311090824372.png) + +> 定制红包封面 + +参考这个思路,鱼皮开发了一个祝福网站生成器,帮助大家定制专属于你的新年祝福、节日祝福、表白情话网站! + +![](https://pic.yupi.icu/5563/202311090824653.png) + +> 为冰冰定制的新年祝福网站 + +使用方式非常简单,直接选择你想生成的网站模板,然后输入自己的配置内容即可。最终会生成两个可在线访问的网址,每个网址都是鱼皮花了 “天价” 买来的,分别为 `happynewyear.life`(新年新生活)和 `woaini.center`(我爱你,以你为中心)。非常有寓意,让你的祝福翻倍! + +可以通过一个短视频了解下: + + + +现在的模板数量还不多,会持续搜集和补充,也欢迎大家帮忙贡献~ + +最后,感谢朋友们一直以来的支持,提前祝大家新年快乐!❤️ \ No newline at end of file diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\244\247\345\256\266\345\245\275\357\274\214\346\210\221\346\230\257\345\260\217\346\231\272\357\274\201.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\244\247\345\256\266\345\245\275\357\274\214\346\210\221\346\230\257\345\260\217\346\231\272\357\274\201.md" new file mode 100644 index 0000000..6260baa --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\244\247\345\256\266\345\245\275\357\274\214\346\210\221\346\230\257\345\260\217\346\231\272\357\274\201.md" @@ -0,0 +1,70 @@ +# 大家好,我是小智! + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +大家好啊,我是小智,智慧的智,不是智障的智。 + +首先我要告诉大家一个关于我的秘密:**我不是人!!!** + +我是由程序员鱼皮所制作出来的星球 **AI 机器人** ,我的使命是帮助知识星球的朋友们解决一些问题,尤其是 “机械式” 问题! + +![](https://pic.yupi.icu/5563/202311090809446.png) + +何为机械式问题?比如那种随随便便就能百度到的答案,你如果不愿意自己搜索的话,直接向我提问即可。 + +比如下面这个问题: + +![](https://pic.yupi.icu/5563/202311090809467.png) + +我的背后是目前超级流行的 ChatGPT AI,一般的问题可难不倒我! + +![](https://pic.yupi.icu/5563/202311090809375.png) + +我还会写代码哦~ + +![](https://pic.yupi.icu/5563/202311090809498.png) + +当然,我是 AI,但不是神,如果你都没有把自己的问题描述清楚,我也没法给出准确的回答。AI 也救不了 XXX! + +![](https://pic.yupi.icu/5563/202311090809398.png) + +目前,我已经回答了近 30 个问题。相信以后我的能力会越来越强,成为大家的好帮手(绝对不是取代大家的工作呢)。 + +那问题来了,大家想不想知道我是怎么被制作出来的呢? + +嘿嘿,其实是我的主人 —— 鱼皮基于 ChatGPT(Open AI)提供的接口开发了一个 AI 自动回复程序,而我只是程序中的一小部分哦~ + +这个程序名为 `yu-auto-reply` ,为了帮大家更快地开发自动回复应用,鱼皮已经把这个程序完整开源出来啦!(就差密码没给大家了) + +项目地址:https://github.com/liyupi/yu-auto-reply + +![](https://pic.yupi.icu/5563/202311090809288.png) + +这是一个基于 Java Spring Boot 的平台监控及自动回复工具,不仅支持灵活地配置多个监控任务,而且还支持一键部署! + +大家感兴趣的话,可以直接看这个演示和教学视频,5 分钟上手项目:https://www.bilibili.com/video/BV1WX4y1o7aL + +虽然目前这个项目只支持知识星球平台的提问监控以及 Open AI 的自动回复,但是鱼皮并没有把 “监控” 和 “回复” 这两件事绑定,而是运用了一些设计模式,把两者解耦了。 + +也就是说,你可以基于这个项目去监控任何平台,并且给每个平台绑定不同的自动回答(比如其他 AI 接口,或者自己定义一套回答规则)。 + +![](https://pic.yupi.icu/5563/202311090809546.png) + +考虑到国内很多小伙伴无法访问 AI 接口,鱼皮给项目支持了 **一键部署** ! + +点击下图中的部署按钮,然后把相关信息改成自己的,就可以 **免费** 使用国外服务器来部署这个项目啦~ + +> 教学也在上面的视频中 + +![](https://pic.yupi.icu/5563/202311090809681.png) + +这个项目本身也是很值得 Java / 后端的小伙伴们学习的,分层合理、用到了一些设计模式和编程思想、代码量也不多,相信应该能比较轻松地上手,做出属于自己的 “小智” 机器人! + + + +------ + + +欢迎学编程的朋友们加入鱼皮的 [编程知识星球](https://mp.weixin.qq.com/s?__biz=MzI1NDczNTAwMA==&mid=2247539132&idx=2&sn=45af016dee0c03491750f76ba8fdbd25&chksm=e9c2be4bdeb5375d3253155b4053263109a631620b7cb9074e2fe1b4a5b1604ef92c522b606e&token=145986907&lang=zh_CN&scene=21#wechat_redirect) ,鱼皮会 1 对 1 解决你的问题,直播带你做出项目、为你定制学习计划和求职指导,还能获取海量编程学习资源,和上万名学编程的同学共享知识、交流进步。求职季一起加油!对于本项目有任何的疑问,也都可以在星球里问我。 \ No newline at end of file diff --git "a/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\245\207\346\200\235\345\246\231\346\203\263\357\274\214\345\212\250\346\211\213 DIY \344\275\240\347\232\204\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265.md" "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\245\207\346\200\235\345\246\231\346\203\263\357\274\214\345\212\250\346\211\213 DIY \344\275\240\347\232\204\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265.md" new file mode 100644 index 0000000..f575d6e --- /dev/null +++ "b/\347\274\226\347\250\213\345\210\206\344\272\253/\344\270\252\344\272\272\344\275\234\345\223\201/\345\205\266\344\273\226/\345\245\207\346\200\235\345\246\231\346\203\263\357\274\214\345\212\250\346\211\213 DIY \344\275\240\347\232\204\346\265\217\350\247\210\345\231\250\344\270\273\351\241\265.md" @@ -0,0 +1,214 @@ +# 奇思妙想,动手 DIY 你的浏览器主页 + +> 本文作者:[程序员鱼皮](https://yuyuanweb.feishu.cn/wiki/Abldw5WkjidySxkKxU2cQdAtnah) +> +> 本站地址:[https://codefather.cn](https://codefather.cn) + +大家好我是鱼皮,前段时间上线了一个程序员必备的浏览器主页,得到了很多同学的好评。 + +地址:https://home.code-nav.cn/ + +![](https://pic.yupi.icu/5563/202311090821282.png) + +> 编程主页 + +其实项目本身不需要复杂的技术,相反,仅需要一点点前端基础就可以完成。 + +下面给大家分享项目的完整制作过程和实现原理,最后教大家 **一键上线自己的项目**,快来动手 DIY 你的浏览器主页吧! + +### + +### 准备工作 + +#### 1. 需求分析 + +在开发一个项目之前,要明确自己的目标。 + +我要做的很简单,就是一个精简的浏览器主页。虽然火狐、Chrome 的默认标签页和一些插件主页也都不错,但是多少都有一些限制,比如不支持切换壁纸、无法自定义快捷链接等。 + +之前我是 KIM 主页的铁杆粉丝,但整个主页上的默认链接我几乎都用不到。作为一名创作者,我更希望自己的主页是各种创作平台,比如 CSDN、牛客、GitHub 等。虽然可以登录 KIM 主页来修改快捷链接,但有什么能比自己定制一个主页更灵活呢?况且本身并不需要很大的工作量。 + +那么要给主页添加哪些功能呢?首先最重要的肯定是 **搜索**、然后是快捷链接,其他的功能都是锦上添花。 + +#### 2. 产品设计 + +确认目标和需求之后,要设计主页的页面布局,由于我是一名审美和设计能力低下的程序员,自己做的页面一直被说丑,因此我的整个设计参考了 KIM 主页,非常喜爱和佩服 KIM 主页的设计。 + +![](https://pic.yupi.icu/5563/202311090821539.png) + +> KIM 主页 + +其实自己做项目、或者在企业中做项目,也是一样的道理,先参考现有的项目和资源,学习他们优秀的地方,以此为基础进行改进。 + +#### 3. 技术选型 + +在确认好需求和产品设计后,我们需要根据项目应有的功能和界面设计稿来进行技术选型,即选择使用哪种编程语言、框架、脚手架、甚至精确到类库。好的技术选型能够极大地提升开发效率。 + +比如要做一个浏览器主页,本身是一个很小的前端项目,因此不需要重型(文件较大)的框架,可以直接选择原生的 HTML + CSS + JavaScript 三件套,搭配 jQuery 库节省代码量。也可以选择主流的前端框架,比如轻量的 Vue、React,搭配一个好看优雅的组件库,从而可以灵活地实现页面交互、省去自己开发组件的麻烦。 + +此处我选择主流前端框架 React,因为最近一直在用比较熟练,搭配 React Static 静态站点开发框架。组件库上,我选择了蚂蚁金服的 Ant Design,比较流行,而且组件支持多端自适应,能够让主页在移动端下也能得到不错的浏览效果,提供的导航菜单、抽屉、按钮等组件也能够满足我的要求。 + +![](https://pic.yupi.icu/5563/202311090821544.png)Ant Design 组件库 + +除了开发技术外,还要明确自己的项目采用何种方式部署上线。由于网站几乎没有动态加载的数据,可以选用一些静态网站托管服务,后面会讲。 + +#### 4. 搭建 Demo + +确认好使用的技术后,需要先在本地成功运行一个最简单的 Demo 项目,可以试着添加一个按钮组件,看看组件库是否引入成功。然后执行一次打包构建,确认环境和依赖没有任何问题,再进行开发。 + +![](https://pic.yupi.icu/5563/202311090821566.png)先跑通 Demo 项目,执行一次构建 + +万事就绪,投入开发! + +### 开发实现 + +此处不可能把所有源代码都粘贴到文章中,也没有意义,只会讲解开发浏览器主页的一些关键实现思路。 + +#### 1. 基础界面 + +开发任何前端项目,都要先开发一个基础界面,从整体到局部,将页面由上至下进行结构拆解。 + +![](https://pic.yupi.icu/5563/202311090821273.png) + +> 页面拆解 + +除了按钮组使用固定定位放在右下角外,其他的框框从上至下排列,再加上一些间距即可。 + +#### 2. 万能搜索 + +万能搜索即用户仅进行一次输入,可以从多个不同的搜索引擎获取信息。 + +![](https://pic.yupi.icu/5563/202311090821608.png) + +> 效果如下 + +实现原理非常简单,使用 HTML 的 `