commit 321dc4c3c580b8e3f8c43f6bd02c3a73dad7c4ca Author: primakov Date: Tue Aug 1 13:14:02 2023 +0300 init from origin + update diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..9fb5f01 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,45 @@ +module.exports = { + env: { + browser: true, + commonjs: true, + es2021: true, + }, + extends: [ + 'airbnb-base', + ], + parserOptions: { + ecmaVersion: 12, + }, + rules: { + indent: ['error', 4], + semi: ['warn', 'never'], + 'object-curly-newline': ['warn', { + ObjectExpression: 'always', + ObjectPattern: { + multiline: true, + }, + ImportDeclaration: 'never', + ExportDeclaration: { + multiline: true, minProperties: 3, + }, + }], + 'consistent-return': [0], + 'prefer-const': [0], + 'no-unused-vars': [0], + 'no-console': [0], + 'global-require': [0], + 'no-plusplus': [0], + 'no-underscore-dangle': [0], + 'import/no-dynamic-require': [0], + 'no-shadow': ['warn'], + 'no-restricted-syntax': ['warn'], + 'max-len': ['warn'], + 'linebreak-style': [0], + 'prefer-destructuring': [0], + 'imoprt-order': [0], + 'no-param-reassign': [1], + 'no-await-in-loop': [1], + 'no-return-assign': [1], + 'spaced-comment': [1], + }, +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a90bea0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +.env +.idea \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..cafe685 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=true diff --git a/.serverrc.js b/.serverrc.js new file mode 100644 index 0000000..16e5b53 --- /dev/null +++ b/.serverrc.js @@ -0,0 +1,5 @@ +module.exports = { + port: 8044, + mongoAddr: process.env.MONGO_ADDR || 'localhost', + mongoPort: 27017, +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..60cc5a1 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "pwa-node", + "request": "launch", + "name": "Launch Program", + "skipFiles": [ + "/**" + ], + "program": "${workspaceFolder}/server/index.js" + }, + { + "name": "attach", + "type": "pwa-node", + "request": "attach", + "skipFiles": [ + "/**" + ], + "processId": "${command:PickProcess}" + } + ] +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..733d86a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM 'node:18' + +RUN mkdir -p /usr/src/app/server/ +WORKDIR /usr/src/app/ + +COPY ./server /usr/src/app/server +COPY ./package.json /usr/src/app/package.json +COPY ./.serverrc.js /usr/src/app/.serverrc.js +# COPY ./.env /usr/src/app/.env + +RUN npm ci --only=prod +EXPOSE 8044 + +CMD ["npm", "run", "up:prod"] diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..6e46f25 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,37 @@ +pipeline { + agent { + docker { + image 'node:16' + } + } + + stages { + stage('install') { + steps { + sh 'node -v' + sh 'npm -v' + sh 'npm install' + } + } + + stage('eslint') { + steps { + sh 'npm run eslint' + } + } + + stage('test') { + steps { + sh 'npm run test:start' + } + } + + stage('clean-all') { + steps { + sh 'rm -rf .[!.]*' + sh 'rm -rf ./*' + sh 'ls -a' + } + } + } +} \ No newline at end of file diff --git a/d-scripts/rerun.sh b/d-scripts/rerun.sh new file mode 100644 index 0000000..b001f65 --- /dev/null +++ b/d-scripts/rerun.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +docker stop ms-mongo +docker volume remove ms_volume +docker volume create ms_volume +docker run --rm -v ms_volume:/data/db --name ms-mongo -p 27017:27017 -d mongo:4.4.13 diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..7219d7a --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,21 @@ +version: "3" + +volumes: + ms_volume: + +services: + mongoDb: + image: mongo:4.4.13 + volumes: + - ms_volume:/data/db + restart: always + # ports: + # - 27017:27017 + multy-stubs: + build: . + restart: always + ports: + - 8044:8044 + environment: + - TZ=Europe/Moscow + - MONGO_ADDR=mongodb \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..231cd2b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4670 @@ +{ + "name": "multi-stub", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "multi-stub", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "bcrypt": "^5.1.0", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.5", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "crypto-js": "^4.1.1", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-jwt": "^8.4.1", + "express-session": "^1.17.3", + "jsonwebtoken": "^8.5.1", + "mongodb": "^3.6.8", + "mysql": "^2.18.1", + "pbkdf2-password": "^1.2.1", + "socket.io": "^4.7.1", + "start-server-and-test": "^1.13.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/node": "18.17.1", + "eslint": "8.46.0", + "eslint-config-airbnb-base": "15.0.0", + "eslint-plugin-import": "2.28.0", + "nodemon": "3.0.1" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", + "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", + "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/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 + }, + "node_modules/@eslint/js": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", + "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/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, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/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 + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", + "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-drE6uz7QBKq1fYqqoFKTDRdFCPHd5TCub75BM+D+cMx7NU9hUz7SESLfC2fSCXVFMO5Yj8sOWHuGqPgjc+fz0Q==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + }, + "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==" + }, + "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==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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==" + }, + "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, + "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/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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, + "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==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", + "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "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/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", + "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.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==" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/bcrypt": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.0.tgz", + "integrity": "sha512-RHBS7HI5N5tEnGTmtR/pppX0mmDSBpQ4aCBsj7CEQfYXDcO74A8sIBYcJMuCsis2E81zDxeENYhv66oZwLiA+Q==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.10", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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, + "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/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "engines": { + "node": ">= 0.8.0" + } + }, + "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/" + } + ], + "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/chokidar/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, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "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, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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 + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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==", + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.1.tgz", + "integrity": "sha512-mGqhI+D7YxS9KJMppR6Iuo37Ed3abhU8NdfgSvJSDUafQutrN+sPTncJYTyM9+tkhSmWodKtVYGPPHyXJEwEQA==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.1.0", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.1.0.tgz", + "integrity": "sha512-enySgNiK5tyZFynt3z7iqBR+Bto9EVVVvDFuTT0ioHCGbzirZVGDGiQjZzEp8hWl6hd5FSVytJGuScX1C1C35w==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/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==" + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "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.5", + "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.10", + "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.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "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.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "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, + "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/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==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", + "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.1", + "@eslint/js": "^8.46.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.2", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "peerDependencies": { + "eslint": "^7.32.0 || ^8.2.0", + "eslint-plugin-import": "^2.25.2" + } + }, + "node_modules/eslint-config-airbnb-base/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-node/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 + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils/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 + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", + "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.12.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "resolve": "^1.22.3", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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 + }, + "node_modules/eslint-plugin-import/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, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", + "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/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 + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "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, + "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, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==", + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "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/express-jwt": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-8.4.1.tgz", + "integrity": "sha512-IZoZiDv2yZJAb3QrbaSATVtTCYT11OcqgFGoTN4iKVyN6NBkBkhtVIixww5fmakF0Upt5HfOxJuS6ZmJVeOtTQ==", + "dependencies": { + "@types/jsonwebtoken": "^9", + "express-unless": "^2.1.3", + "jsonwebtoken": "^9.0.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/express-jwt/node_modules/jsonwebtoken": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "dependencies": { + "jws": "^3.2.2", + "lodash": "^4.17.21", + "ms": "^2.1.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/express-jwt/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==" + }, + "node_modules/express-session": { + "version": "1.17.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz", + "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==", + "dependencies": { + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express-unless": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/express-unless/-/express-unless-2.1.3.tgz", + "integrity": "sha512-wj4tLMyCVYuIIKHGt0FhCtIViBcwzWejX0EjNxveAa6dG+0XBCQhMbx+PnkLkFCxLC69qoFrxds4pIyL88inaQ==" + }, + "node_modules/express/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==", + "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/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/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==", + "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/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 + }, + "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 + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastfall": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz", + "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==", + "dependencies": { + "reusify": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "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-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "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, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=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==", + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "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, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "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==", + "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==", + "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, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "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==", + "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/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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==" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "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==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "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==" + }, + "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, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.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==", + "engines": { + "node": ">= 0.10" + } + }, + "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, + "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "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-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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "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, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=0.12.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, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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, + "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-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, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "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, + "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, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/joi": { + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", + "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.3", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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 + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "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, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/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==" + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "engines": { + "node": "> 0.8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==" + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "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==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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/mysql/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==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/nodemon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz", + "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/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 + }, + "node_modules/nodemon/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "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, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "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.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", + "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "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 + }, + "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==" + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pbkdf2-password": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pbkdf2-password/-/pbkdf2-password-1.2.1.tgz", + "integrity": "sha512-I6ZiUi82uhYN47lOzi8P7O69e70LRopgS4TIkq0ecDAPHrlxABWOHxLEsTzCuogkxTofFJDj0eEbOALgrrxhKg==", + "dependencies": { + "fastfall": "^1.2.3" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.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==" + }, + "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==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, + "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, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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" + } + ] + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "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==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve": { + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", + "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.12.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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "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 + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "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, + "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==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "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==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==" + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/socket.io": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.1.tgz", + "integrity": "sha512-W+utHys2w//dhFjy7iQQu9sGd3eokCjGbl2r59tyLqNiJJBdIebn3GAKEXBr3osqHTObJi2die/25bCx2zsaaw==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/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==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/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==" + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/start-server-and-test": { + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.15.4.tgz", + "integrity": "sha512-ucQtp5+UCr0m4aHlY+aEV2JSYNTiMZKdSKK/bsIr6AlmwAWDYDnV7uGlWWEtWa7T4XvRI5cPYcPcQgeLqpz+Tg==", + "dependencies": { + "arg": "^5.0.2", + "bluebird": "3.7.2", + "check-more-types": "2.24.0", + "debug": "4.3.4", + "execa": "5.1.1", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "7.0.1" + }, + "bin": { + "server-test": "src/bin/start.js", + "start-server-and-test": "src/bin/start.js", + "start-test": "src/bin/start.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/start-server-and-test/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/start-server-and-test/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==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==", + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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==" + }, + "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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "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, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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 + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "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, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/touch/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, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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, + "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, + "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, + "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, + "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/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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, + "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/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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==" + }, + "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==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/wait-on": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.0.1.tgz", + "integrity": "sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==", + "dependencies": { + "axios": "^0.27.2", + "joi": "^17.7.0", + "lodash": "^4.17.21", + "minimist": "^1.2.7", + "rxjs": "^7.8.0" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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, + "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-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "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/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "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==" + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..bc9f0bc --- /dev/null +++ b/package.json @@ -0,0 +1,52 @@ +{ + "name": "multi-stub", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "npx nodemon ./server", + "up:prod": "cross-env NODE_ENV=\"production\" node ./server", + "deploy:d:stop": "docker-compose down", + "deploy:d:build": "docker-compose build", + "deploy:d:up": "docker-compose up -d", + "redeploy": "npm run deploy:d:stop && npm run deploy:d:build && npm run deploy:d:up", + "eslint": "npx eslint ./server", + "eslint:fix": "npx eslint ./server --fix", + "test": "echo \"test complete\"", + "test:start": "start-server-and-test up:prod 8043 test" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@bitbucket.org/online-mentor/multi-stub.git" + }, + "keywords": [], + "author": "", + "license": "MIT", + "homepage": "https://bitbucket.org/online-mentor/multi-stub#readme", + "dependencies": { + "bcrypt": "^5.1.0", + "body-parser": "^1.19.0", + "cookie-parser": "^1.4.5", + "cors": "^2.8.5", + "cross-env": "^7.0.3", + "crypto-js": "^4.1.1", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-jwt": "^8.4.1", + "express-session": "^1.17.3", + "jsonwebtoken": "^8.5.1", + "mongodb": "^3.6.8", + "mysql": "^2.18.1", + "pbkdf2-password": "^1.2.1", + "socket.io": "^4.7.1", + "start-server-and-test": "^1.13.1", + "uuid": "^9.0.0" + }, + "devDependencies": { + "@types/node": "18.17.1", + "eslint": "8.46.0", + "eslint-config-airbnb-base": "15.0.0", + "eslint-plugin-import": "2.28.0", + "nodemon": "3.0.1" + } +} diff --git a/server/error.js b/server/error.js new file mode 100644 index 0000000..c68abfd --- /dev/null +++ b/server/error.js @@ -0,0 +1,12 @@ +const noToken = 'No authorization token was found' + +module.exports = (err, req, res, next) => { + if (err.message === noToken) { + res.status(400).send({ + success: false, error: 'Токен авторизации не найден', + }) + } + res.status(400).send({ + success: false, error: err.message || 'Что-то пошло не так', + }) +} diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..96f61f7 --- /dev/null +++ b/server/index.js @@ -0,0 +1,64 @@ +const express = require('express') +const bodyParser = require('body-parser') +const cookieParser = require('cookie-parser') +const session = require('express-session') + +const app = express() +const cors = require('cors') +require('dotenv').config() + +const config = require('../.serverrc') +const { setIo } = require('./io') + +app.use(cookieParser()) +app.options('*', cors()) +app.use(cors()) +const server = setIo(app) + +const sess = { + secret: 'super-secret-key', + resave: true, + saveUninitialized: true, + cookie: { + }, +} +if (app.get('env') === 'production') { + app.set('trust proxy', 1) + sess.cookie.secure = true +} +app.use(session(sess)) + +app.use(bodyParser.json({ + limit: '50mb', +})) +app.use(bodyParser.urlencoded({ + limit: '50mb', + extended: true, +})) +app.use(require('./root')) + +/** + * Добавляйте сюда свои routers. + */ +app.use('/example', require('./routers/example')) +// app.use('/coder', require('./routers/coder')) +app.use('/stc-21-03', require('./routers/stc-21-03')) +app.use('/stc-21', require('./routers/stc')) +app.use('/stc-22-24', require('./routers/stc-22-24')) +// app.use('/bushou-api', require('./routers/bushou')) + +// app.use('/uryndyklar-api', require('./routers/uryndyklar')) +// app.use('/neptunium', require('./routers/neptunium')) +// app.use('/music-learn', require('./routers/music-learn')) +// app.use('/publicium', require('./routers/publicium')) +// app.use('/task-boss', require('./routers/task-boss')) +// app.use('/car-wash', require('./routers/car-wash')) +app.use('/zoom-bar', require('./routers/zoom-bar')) +app.use('/basket', require('./routers/basket')) +app.use('/easy-project', require('./routers/easy-project')) +app.use('/sugarbun', require('./routers/sugarbun')) +require('./routers/hub-video') + +app.use(require('./error')) + +server.listen(config.port, () => console.log(`Listening on http://localhost:${config.port}`)) diff --git a/server/io.js b/server/io.js new file mode 100644 index 0000000..8df2c10 --- /dev/null +++ b/server/io.js @@ -0,0 +1,13 @@ +const { Server } = require('socket.io') +const { createServer } = require('http') + +let io = null + +module.exports.setIo = (app) => { + const server = createServer(app) + io = new Server(server, {}) + + return server +} + +module.exports.getIo = () => io diff --git a/server/root.js b/server/root.js new file mode 100644 index 0000000..9330a66 --- /dev/null +++ b/server/root.js @@ -0,0 +1,17 @@ +const router = require('express').Router() +const fs = require('fs') +const path = require('path') + +const folderPath = path.resolve(__dirname, './routers') +const folders = fs.readdirSync(folderPath) + +router.get('/', (req, res) => { + res.send(` +

multy stub is working

+
    + ${folders.map((f) => `
  • ${f}
  • `).join('')} +
+ `) +}) + +module.exports = router diff --git a/server/routers/basket/auth.js b/server/routers/basket/auth.js new file mode 100644 index 0000000..5459c12 --- /dev/null +++ b/server/routers/basket/auth.js @@ -0,0 +1,34 @@ +const router = require('express').Router() +const checkPwd = require('pbkdf2-password')() +const jwt = require('jsonwebtoken') +const { BASKET_JWT_TOKEN } = require('./key') + +const { getResponse, signUp, getUser, _idToId, requiredFields } = require('./controller') + +router.post('/sign-in', requiredFields(['email', 'password']), async (req, res) => { + try { + const user = await getUser(req.body) + // eslint-disable-next-line max-len + checkPwd({ password: req.body.password, salt: user.salt }, async (err, pass, salt, hash) => { + if (err) throw new Error(err) + + if (user.pwd === hash) { + const { pwd, salt: _salt, ...rest } = user + const token = jwt.sign(_idToId(rest), BASKET_JWT_TOKEN) + res.send(getResponse(null, { token, user: _idToId(rest) })) + } else { + res.status(400).send(getResponse('Неправильный email или пароль')) + } + }) + } catch (e) { + res.status(400).send(getResponse(e.message)) + } +}) + +router.post('/sign-up', requiredFields(['email', 'login', 'password']), async (req, res) => { + let error = null + const data = await signUp(req.body).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, data)) +}) + +module.exports = router diff --git a/server/routers/basket/categories.js b/server/routers/basket/categories.js new file mode 100644 index 0000000..3b61e47 --- /dev/null +++ b/server/routers/basket/categories.js @@ -0,0 +1,25 @@ +const router = require('express').Router() +const { expressjwt } = require('express-jwt') +const ObjectId = require('mongodb').ObjectID + +const { BASKET_JWT_TOKEN } = require('./key') + +const { getResponse, getCategory, postCategory } = require('./controller') + +router.use(expressjwt({ secret: BASKET_JWT_TOKEN, algorithms: ['HS256'] })) + +router.get('/', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + const categoryData = await getCategory({ userId }).catch((e) => error = e.message) + res.send(getResponse(error, categoryData)) +}) + +router.post('/', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + const categoryData = await postCategory({ userId, ...req.body }).catch((e) => error = e.message) + res.send(getResponse(error, categoryData)) +}) + +module.exports = router diff --git a/server/routers/basket/controller.js b/server/routers/basket/controller.js new file mode 100644 index 0000000..e98424d --- /dev/null +++ b/server/routers/basket/controller.js @@ -0,0 +1,510 @@ +const ObjectId = require('mongodb').ObjectID +const getHash = require('pbkdf2-password')() + +const { getDB } = require('../../utils/mongo') + +const USERS_COLLECTION = 'users' +const LISTS_COLLECTION = 'lists' +const CATEGORY_COLLECTION = 'default_categories' +const USER_CATEGROY_COLLECTION = 'user_categories' +const ITEM_COLLECTION = 'items' +const fakeUserId = 'fakeUserId' + +let db = null + +const connect = async () => { + db = await getDB('basket') +} + +const init = async () => { + await connect() + const categoriesCollection = db.collection(CATEGORY_COLLECTION) + const findData = await categoriesCollection.find({ + }).toArray() + if (findData.length === 0) { + await categoriesCollection.insertMany([ + { + name: 'Продукты', + color: '#08AE0F', + }, + { + name: 'Одежда', + color: '#9D79B9', + }, + { + name: 'Бытовая химия', + color: '#B11F1F', + }, + { + name: 'Лекарства', + color: '#3414F5', + }, + ]) + } +} + +init() + +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, + ...rest, + } +} + +const _idToIdArray = (data) => { + const _idToIdMap = data.map((item) => _idToId(item)) + + return _idToIdMap +} + +const getResponse = (error, data, success = true) => { + if (error) { + return { + success: false, + error, + } + } + + return { + success, + data, + } +} + +const signUp = async ({ email, login, password }) => { + if (db === null) throw new Error('no db connection') + + try { + const usersCollection = db.collection(USERS_COLLECTION) + const userData = await usersCollection.findOne({ + $or: [{ + login, + }, { + email, + }], + }) + + if (userData?.login === login) { + throw new Error('Логин занят') + } + if (userData?.email === email) { + throw new Error('Email занят') + } + + getHash({ password }, async (err, pass, salt, hash) => { + if (err) throw new Error(err) + // eslint-disable-next-line max-len + const { insertedCount } = await usersCollection.insertOne({ email, login, pwd: hash, salt }) + if (!insertedCount) throw new Error('insert error') + }) + + return {} + } catch (e) { + throw new Error(e) + } +} + +const getUser = async ({ email }) => { + if (db === null) throw new Error('no db connection') + + try { + const usersCollection = db.collection(USERS_COLLECTION) + const userData = await usersCollection.findOne( + { + email, + }, + ) + if (userData) return userData + throw new Error('Неправильный email или пароль') + } catch (e) { + throw new Error(e) + } +} + +const addList = async ({ userId = fakeUserId, ...data }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(LISTS_COLLECTION) + const insertData = await listsCollection.insertOne({ + userId, + timeStamp: Date.now(), + ...data, + }) + + const { insertedCount, ops } = insertData + if (insertedCount) { return _idToId(ops[0]) } + throw new Error('insert error') + } catch (e) { + throw new Error(e) + } +} + +const getLists = async ({ userId = fakeUserId }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(LISTS_COLLECTION) + const itemsCollection = db.collection(ITEM_COLLECTION) + let newLists = [] + + const data = await listsCollection.find({ + userId, + }).toArray() + + await Promise.all(data.map(async (element) => { + const total = await itemsCollection.countDocuments({ + parentId: element._id, + }) + const purchased = await itemsCollection.countDocuments({ + parentId: element._id, + bought: true, + }) + + newLists.push({ + ...element, total, purchased, + }) + })) + + newLists.sort((a, b) => (b.timeStamp - a.timeStamp)) + + return _idToIdArray(newLists) + } catch (e) { + throw new Error(e) + } +} + +/* добавил логику рекурсивного удаления дочерних документов */ +const deleteDoc = async ({ id, tag = false }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(LISTS_COLLECTION) + const itemsCollection = db.collection(ITEM_COLLECTION) + + const findData = await itemsCollection.find({ + parentId: new ObjectId(id), + }).toArray() + + findData.forEach(async (element) => { + await deleteDoc({ + id: element._id, + tag: true, + }) + }) + + let delData = null + if (tag) { + delData = await itemsCollection.deleteOne({ + _id: new ObjectId(id), + }) + } else { + delData = await listsCollection.deleteOne({ + _id: new ObjectId(id), + }) + } + + const { deletedCount } = delData + if (deletedCount) { + return { + } + } throw new Error('no data to delete') + } catch (e) { + throw new Error(e) + } +} + +const renameList = async ({ id, listName }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(LISTS_COLLECTION) + const data = await listsCollection.updateOne({ + _id: new ObjectId(id), + }, + { + $set: { + listName, + }, + }) + + const { matchedCount } = data + if (matchedCount) { + const findData = await listsCollection.findOne({ + _id: new ObjectId(id), + }) + return _idToId(findData) + } throw new Error('no data to rename') + } catch (e) { + throw new Error(e) + } +} + +const duplicateList = async ({ id, parentId = null }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(LISTS_COLLECTION) + const itemsCollection = db.collection(ITEM_COLLECTION) + + let addListData = null + let newId = null + + if (parentId) { + const findData = await itemsCollection.findOne( + { + _id: new ObjectId(id), + }, + ) + + const { _id, ...item } = findData + item.parentId = parentId + const insertData = await itemsCollection.insertOne({ + ...item, + }) + const { insertedCount } = insertData + if (!insertedCount) throw new Error('insert new item error') + } else { + const findData = await listsCollection.findOne( + { + _id: new ObjectId(id), + }, + ) + + const { _id, timeStamp, ...item } = findData + item.listName = `(КОПИЯ) ${item.listName}` + addListData = await addList({ + ...item, + }) + newId = addListData.id + } + + const childData = await itemsCollection.find({ + parentId: new ObjectId(id), + }).toArray() + + childData.forEach(async (element) => { + await duplicateList({ + id: element._id, parentId: newId, + }) + }) + + if (addListData) return _idToId(addListData) + } catch (e) { + throw new Error(e) + } +} + +const getCategory = async ({ userId }) => { + if (db === null) throw new Error('no db connection') + + try { + const categoriesCollection = db.collection(CATEGORY_COLLECTION) + const defaultCategories = await categoriesCollection.find({ + }).toArray() + const defaultCategoriesData = _idToIdArray(defaultCategories).map((dc) => ({ + ...dc, userId, + })) + + const userCollection = db.collection(USER_CATEGROY_COLLECTION) + const userCategoriesFilter = {} + + if (userId) { + userCategoriesFilter.userId = userId + } + const userFindData = await userCollection.find(userCategoriesFilter).toArray() + + return [...defaultCategoriesData, ..._idToIdArray(userFindData)] + } catch (e) { + throw new Error(e) + } +} + +const postCategory = async ({ userId = fakeUserId, ...categoryData }) => { + if (db === null) throw new Error('no db connection') + + try { + const userCollection = db.collection(USER_CATEGROY_COLLECTION) + const insertData = await userCollection.insertOne({ + userId, ...categoryData, + }) + + // const {insertedCount, ops} = insertData + // if (insertedCount) + // _idToId(ops[0]) + // else + // throw new Error('insert error') + const userFindData = await userCollection.find({ + userId, + }).toArray() + return _idToIdArray(userFindData) + } catch (e) { + throw new Error(e) + } +} + +const getShoppingList = async ({ userId = fakeUserId, id }) => { + if (db === null) throw new Error('no db connection') + + try { + const listsCollection = db.collection(ITEM_COLLECTION) + const itemsList = await listsCollection.find({ + parentId: new ObjectId(id), + }).toArray() + const categoryList = await getCategory({ }) + const coloredItemsList = itemsList.map((item) => ({ + ...item, + // eslint-disable-next-line max-len + color: categoryList.find((category) => String(category.id) === String(item.categoryId))?.color, + })) + + return _idToIdArray(coloredItemsList) + } catch (e) { + throw new Error(e) + } +} + +const addListItem = async ({ userId = fakeUserId, listId, categoryId, text }) => { + if (db === null) throw new Error('no db connection') + + try { + const dataToInsert = { + parentId: new ObjectId(listId), + categoryId: new ObjectId(categoryId), + text, + count: 1, + bought: false, + createdBy: userId, + createdDt: Date.now(), + modifiedBy: userId, + modifiedDt: Date.now(), + } + const itemCollection = db.collection(ITEM_COLLECTION) + await itemCollection.insertOne(dataToInsert) + + return _idToId(dataToInsert) + } catch (e) { + throw new Error(e) + } +} + +const boughtItem = async ({ userId = fakeUserId, itemId, bought }) => { + if (db === null) throw new Error('no db connection') + try { + const itemCollection = db.collection(ITEM_COLLECTION) + const chengedData = await itemCollection.findOneAndUpdate({ + _id: new ObjectId(itemId), + }, + [{ + $set: { + bought: { $eq: [false, '$bought'] }, + modifiedBy: userId, + modifiedDt: Date.now(), + }, + }]) + return _idToId(chengedData) + } catch (e) { + throw new Error(e) + } +} + +const incCountItem = async ({ userId = fakeUserId, itemId, count }) => { + if (db === null) throw new Error('no db connection') + + try { + const itemCollection = db.collection(ITEM_COLLECTION) + const chengedData = await itemCollection.findOneAndUpdate({ + _id: new ObjectId(itemId), + }, + { + $inc: { + count, + }, + }, + { + $set: { + modifiedBy: userId, + modifiedDt: Date.now(), + }, + }) + const chengeData = await itemCollection.findOneAndUpdate({ + _id: new ObjectId(itemId), + count: { + $lt: 1, + }, + }, + { + $set: { + count: 1, + modifiedBy: userId, + modifiedDt: Date.now(), + }, + }) + return _idToId(chengedData || chengeData) + } catch (e) { + throw new Error(e) + } +} + +const deleteItem = async ({ itemId }) => { + if (db === null) throw new Error('no db connection') + + try { + const itemCollection = db.collection(ITEM_COLLECTION) + const findItemData = await itemCollection.find({ + _id: new ObjectId(itemId), + }) + + findItemData.forEach((item) => { + deleteItem({ + id: item._id, + }) + }) + + const deleteItemData = await itemCollection.deleteOne({ + _id: new ObjectId(itemId), + }) + + const { deletedButton } = deleteItemData + if (deletedButton) { + return { + } + } + } catch (e) { + throw new Error(e) + } +} + +const requiredFields = (fields) => (req, res, next) => { + // eslint-disable-next-line no-restricted-syntax + for (const fieldName of fields) { + if (!req.body[fieldName]) { + throw new Error(`Параметр ${fieldName} не установлен`) + } + } + + next() +} + +module.exports = { + getResponse, + addList, + getLists, + deleteDoc, + renameList, + duplicateList, + getCategory, + postCategory, + getShoppingList, + addListItem, + boughtItem, + deleteItem, + incCountItem, + signUp, + getUser, + _idToId, + requiredFields, +} diff --git a/server/routers/basket/dashboard.js b/server/routers/basket/dashboard.js new file mode 100644 index 0000000..cfcdee7 --- /dev/null +++ b/server/routers/basket/dashboard.js @@ -0,0 +1,54 @@ +const router = require('express').Router() +const { expressjwt } = require('express-jwt') +const ObjectId = require('mongodb').ObjectID + +const { BASKET_JWT_TOKEN } = require('./key') + +const { + getResponse, addList, + getLists, deleteDoc, renameList, duplicateList, +} = require('./controller') + +const wait = (req, res, next) => setTimeout(next, 0) + +router.use(expressjwt({ secret: BASKET_JWT_TOKEN, algorithms: ['HS256'] })) + +/* получить списки покупок*/ +router.get('/list', wait, async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + const listData = await getLists({ userId }).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, listData)) +}) + +/* удалить список*/ +router.delete('/list', wait, async (req, res) => { + let error = null + const listData = await deleteDoc(req.body).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, listData)) +}) + +/* добавить новый список*/ +router.post('/list', wait, async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + // eslint-disable-next-line max-len + const listData = await addList({ userId, ...req.body }).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, listData)) +}) + +/* переименовать список*/ +router.put('/list', wait, async (req, res) => { + let error = null + const listData = await renameList(req.body).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, listData)) +}) + +/* дублировать список*/ +router.post('/list/duplicate', wait, async (req, res) => { + let error = null + const listData = await duplicateList(req.body).catch((e) => error = e.message) + res.status(error ? 400 : 200).send(getResponse(error, listData)) +}) + +module.exports = router diff --git a/server/routers/basket/index.js b/server/routers/basket/index.js new file mode 100644 index 0000000..c729f2c --- /dev/null +++ b/server/routers/basket/index.js @@ -0,0 +1,9 @@ +const router = require('express').Router() + +router.use('/dashboard', require('./dashboard')) +router.use('/landing', require('./landing')) +router.use('/categories', require('./categories')) +router.use('/shoppingList', require('./listItem')) +router.use('/auth', require('./auth')) + +module.exports = router diff --git a/server/routers/basket/json/auth/sign-in.json b/server/routers/basket/json/auth/sign-in.json new file mode 100644 index 0000000..2959ae3 --- /dev/null +++ b/server/routers/basket/json/auth/sign-in.json @@ -0,0 +1,10 @@ +{ + "data": { + "token": "qwert", + "user": { + "id": "1234", + "login": "eldar", + "email": "www@www.ru" + } + } +} \ No newline at end of file diff --git a/server/routers/basket/json/categories/add/success.json b/server/routers/basket/json/categories/add/success.json new file mode 100644 index 0000000..c51722a --- /dev/null +++ b/server/routers/basket/json/categories/add/success.json @@ -0,0 +1,23 @@ +{ + "success": true, + "data": + { + "category":[ + { + "id":1, + "name": "Продукты", + "color": "#08AE0F" + }, + { + "id":2, + "name": "Бытовая химия", + "color": "#3414F5" + }, + { + "id":3, + "name": "Одежда", + "color": "#FA8803" + } + ] + } +} \ No newline at end of file diff --git a/server/routers/basket/json/categories/current/success.json b/server/routers/basket/json/categories/current/success.json new file mode 100644 index 0000000..e36f420 --- /dev/null +++ b/server/routers/basket/json/categories/current/success.json @@ -0,0 +1,18 @@ +{ + "success": true, + "data": + { + "category":[ + { + "id":1, + "name": "Продукты", + "color": "#08AE0F" + }, + { + "id":2, + "name": "Бытовая химия", + "color": "#3414F5" + } + ] + } +} \ No newline at end of file diff --git a/server/routers/basket/json/dashboard/common/error.json b/server/routers/basket/json/dashboard/common/error.json new file mode 100644 index 0000000..b3b32b2 --- /dev/null +++ b/server/routers/basket/json/dashboard/common/error.json @@ -0,0 +1,3 @@ +{ + "error": "Не получилось..." +} \ No newline at end of file diff --git a/server/routers/basket/json/dashboard/common/success.json b/server/routers/basket/json/dashboard/common/success.json new file mode 100644 index 0000000..181c5af --- /dev/null +++ b/server/routers/basket/json/dashboard/common/success.json @@ -0,0 +1,8 @@ +{ + "data": { + "id": "vrgbtrgbtrbryn", + "listName": "2 список", + "purchased": 1, + "total": 5 + } +} \ No newline at end of file diff --git a/server/routers/basket/json/dashboard/list/empty.json b/server/routers/basket/json/dashboard/list/empty.json new file mode 100644 index 0000000..a965512 --- /dev/null +++ b/server/routers/basket/json/dashboard/list/empty.json @@ -0,0 +1,4 @@ +{ + "success": true, + "data": [] +} diff --git a/server/routers/basket/json/dashboard/list/error.json b/server/routers/basket/json/dashboard/list/error.json new file mode 100644 index 0000000..f8182d7 --- /dev/null +++ b/server/routers/basket/json/dashboard/list/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "error": "Список не загрузился" +} \ No newline at end of file diff --git a/server/routers/basket/json/dashboard/list/success.json b/server/routers/basket/json/dashboard/list/success.json new file mode 100644 index 0000000..56dc90e --- /dev/null +++ b/server/routers/basket/json/dashboard/list/success.json @@ -0,0 +1,23 @@ +{ + "success": true, + "data": [ + { + "id": "uuid1", + "listName": "Состоялась 94-я церемония вручения премии «Оскар»: награда за лучший фильм присуждена картине...", + "purchased": 0, + "total": 5 + }, + { + "id": "uuid2", + "listName": "Второй список", + "purchased": 1, + "total": 5 + }, + { + "id": "uuid3", + "listName": "Первый список", + "purchased": 5, + "total": 5 + } + ] +} diff --git a/server/routers/basket/json/landing/error.json b/server/routers/basket/json/landing/error.json new file mode 100644 index 0000000..33b19f1 --- /dev/null +++ b/server/routers/basket/json/landing/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "error": "Ошибка получения данных для Landing" +} \ No newline at end of file diff --git a/server/routers/basket/json/landing/success.json b/server/routers/basket/json/landing/success.json new file mode 100644 index 0000000..319f74a --- /dev/null +++ b/server/routers/basket/json/landing/success.json @@ -0,0 +1,80 @@ +{ + "success": true, + "data": [ + { + "features": [ + { + "id": "1", + "nameImg": "image-shopping-list.png", + "altImg": "image-shopping-list", + "title": "Список покупок", + "text": "Отличный интерфейс, удобно и понятно для использования. Удобно! Если нет нужного в списке, можно добавить и оно сохраниться." + }, + { + "id": "2", + "nameImg": "image-shared-access.png", + "altImg": "image-shared-access", + "title": "Общий доступ", + "text": "Делитесь списками покупок, чтобы планировать вместе с другими. Синхронизация для нескольких покупателей — это вещь!" + }, + { + "id": "3", + "nameImg": "image-messaging.png", + "altImg": "image-messaging", + "title": "Обмен сообщениями", + "text": "Хотите что-то обсудить при составление списка покупок, то есть возможность обмениваться сообщениями в режиме реального времени." + }, + { + "id": "4", + "nameImg": "image-share-photos.png", + "altImg": "mage-share-photos", + "title": "Делитесь фотографиями", + "text": "Не перепутайте товар при покупки — загружайте фотографии и обменивайтесь ими с другими пользователями. Это очень удобно!" + }, + { + "id": "5", + "nameImg": "image-prices.png", + "altImg": "image-prices", + "title": "Цены", + "text": "Расходы под контролем — вводите цены в спиок покупок. Приложение оценит стоимость и будет известно, чего ожидать на кассе." + }, + { + "id": "6", + "nameImg": "image-ecology.png", + "altImg": "image-ecology", + "title": "Экология", + "text": "Бумажные списки покупок — это деревья, которые могли бы еще расти. Вместо тысяч слов — возьми с собой приложение!" + }, + { + "id": "7", + "nameImg": "image-buy.png", + "altImg": "image-buy", + "title": "Покупайте", + "text": "97% пользователей поробывали приложение и теперь совершают меньше лишних и ненужных покупок. Покупайте нужное!" + } + ], + "helps": [ + { + "id": "1", + "title": "Как работает вМагазин?", + "text": "Задача организации, в особенности же консультация с широким активом обеспечивает широкому кругу специалистов новых принципов формирования материально-технической и кадровой базы." + }, + { + "id": "2", + "title": "Условия оплаты", + "text": "Задача организации, в особенности же консультация с широким активом обеспечивает широкому кругу специалистов новых принципов формирования материально-технической и кадровой базы." + }, + { + "id": "3", + "title": "Как с нами связаться", + "text": "Задача организации, в особенности же консультация с широким активом обеспечивает широкому кругу специалистов новых принципов формирования материально-технической и кадровой базы." + }, + { + "id": "4", + "title": "Текст", + "text": "Задача организации, в особенности же консультация с широким активом обеспечивает широкому кругу специалистов новых принципов формирования материально-технической и кадровой базы." + } + ] + } + ] +} \ No newline at end of file diff --git a/server/routers/basket/json/listItem/item/error.json b/server/routers/basket/json/listItem/item/error.json new file mode 100644 index 0000000..f7ffa40 --- /dev/null +++ b/server/routers/basket/json/listItem/item/error.json @@ -0,0 +1,3 @@ +{ + "error": "Не удалось изменить..." +} \ No newline at end of file diff --git a/server/routers/basket/json/listItem/item/success.json b/server/routers/basket/json/listItem/item/success.json new file mode 100644 index 0000000..d92dc66 --- /dev/null +++ b/server/routers/basket/json/listItem/item/success.json @@ -0,0 +1,15 @@ +{ + "success": true, + "data": + { + "id": 23, + "categoryId": 1, + "text": "Курица", + "count": 17, + "bought": false, + "createdBy": "", + "createdDt": "", + "modifiedBy": "", + "modifiedDt": "" + } +} \ No newline at end of file diff --git a/server/routers/basket/json/listItem/shoppingList/error.json b/server/routers/basket/json/listItem/shoppingList/error.json new file mode 100644 index 0000000..0341070 --- /dev/null +++ b/server/routers/basket/json/listItem/shoppingList/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "error": "Ошибка получения данных" +} \ No newline at end of file diff --git a/server/routers/basket/json/listItem/shoppingList/success.json b/server/routers/basket/json/listItem/shoppingList/success.json new file mode 100644 index 0000000..0d79924 --- /dev/null +++ b/server/routers/basket/json/listItem/shoppingList/success.json @@ -0,0 +1,34 @@ +{ + "success": true, + "data": + { + "id": 8, + "listName":"Мой список", + "data":[ + { + "id": 1, + "categoryId": 1, + "text": "Курица", + "count": 2, + "bought": true, + "delete":false + }, + { + "id": 2, + "categoryId":1, + "text": "Хлеб", + "count": 1, + "bought":false, + "delete":true + }, + { + "id": 3, + "categoryId": "3", + "text": "Шампунь", + "count": 1, + "bought":true, + "delete":false + } + ] + } +} \ No newline at end of file diff --git a/server/routers/basket/key.js b/server/routers/basket/key.js new file mode 100644 index 0000000..2b4e080 --- /dev/null +++ b/server/routers/basket/key.js @@ -0,0 +1,5 @@ +const BASKET_JWT_TOKEN = 'super super secret key' + +module.exports = { + BASKET_JWT_TOKEN, +} diff --git a/server/routers/basket/landing.js b/server/routers/basket/landing.js new file mode 100644 index 0000000..c0f3fe3 --- /dev/null +++ b/server/routers/basket/landing.js @@ -0,0 +1,7 @@ +const router = require('express').Router() + +router.get('/', (req, res) => { + res.send(require('./json/landing/success.json')) +}) + +module.exports = router diff --git a/server/routers/basket/listItem.js b/server/routers/basket/listItem.js new file mode 100644 index 0000000..4d7ee05 --- /dev/null +++ b/server/routers/basket/listItem.js @@ -0,0 +1,67 @@ +const router = require('express').Router() +const { expressjwt } = require('express-jwt') +const ObjectId = require('mongodb').ObjectID + +const { BASKET_JWT_TOKEN } = require('./key') + +const { getShoppingList, deleteItem, boughtItem, incCountItem, getResponse, addListItem } = require('./controller') + +router.use(expressjwt({ secret: BASKET_JWT_TOKEN, algorithms: ['HS256'] })) + +router.get('/:id', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + // eslint-disable-next-line no-return-assign + const { id } = req.params + // eslint-disable-next-line no-return-assign + const listData = await getShoppingList({ userId, id }).catch((e) => error = e.message) + res.send(getResponse(error, listData)) +}) + +router.post('/item/:id', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + // eslint-disable-next-line no-return-assign + const { id } = req.params + const { categoryId, text } = req.body + const shoppingListData = await addListItem({ + userId, listId: id, categoryId, text, + // eslint-disable-next-line no-return-assign + }).catch((e) => error = e.message) + res.send(getResponse(error, shoppingListData)) +}) + +router.patch('/item/:id', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + // eslint-disable-next-line no-return-assign + const { id } = req.params + const { bought } = req.body.item + // eslint-disable-next-line no-return-assign + // eslint-disable-next-line max-len + const itemData = await boughtItem({ userId, itemId: id, bought }).catch((e) => error = e.message) + res.send(getResponse(error, itemData)) +}) + +router.put('/item/:id', async (req, res) => { + const userId = new ObjectId(req.auth.id) + let error = null + // eslint-disable-next-line no-return-assign + const { id } = req.params + const { count } = req.body + // eslint-disable-next-line no-return-assign + // eslint-disable-next-line max-len + const itemData = await incCountItem({ userId, itemId: id, count }).catch((e) => error = e.message) + res.send(getResponse(error, itemData)) +}) + +router.delete('/item/:id', async (req, res) => { + let error = null + // eslint-disable-next-line no-return-assign + const { id } = req.params + // eslint-disable-next-line no-return-assign + const itemData = await deleteItem({ itemId: id }).catch((e) => error = e.message) + res.send(getResponse(error, itemData)) +}) + +module.exports = router diff --git a/server/routers/bushou/episodes/success.json b/server/routers/bushou/episodes/success.json new file mode 100644 index 0000000..a1e78d0 --- /dev/null +++ b/server/routers/bushou/episodes/success.json @@ -0,0 +1,162 @@ +[ + { + "id": "6d6883d86aa44db784436894a0b30881", + "title": "听新闻学汉语 2021年03月31日", + "description": "中国-世卫组织新冠病毒溯源联合研究报告正式发布\n世界卫生组织30日在日内瓦正式发布中国-世卫组织新冠病毒溯源联合研究报告。报告认为,新冠病毒“极不可能”通过实验室传人。今年1月14日至2月10日,17名中方专家和17名外方专家组成联合专家组,分为流行病学、分子溯源、动物与环境3个小组,在武汉开展了为期28天的全球溯源研究中国部分工作,在此基础上撰写了研究报告。联合专家组评估了关于病毒引入人类的4个路径,认为新冠病毒“比较可能至非常可能”经中间宿主传人,“可能至比较可能”直接传人,“可能”通过冷链食品传人,“极不可能”通过实验室传人。报告提出了联合专家组下步研究的建议,包括建立全球统一的数据库,在全球更广范围内继续寻找可能的早期病例,由全球科学家在多国多地寻找可能成为病毒宿主的动物物种,进一步了解冷链和冷冻食品在病毒传播过程中的作用等。\n\n货轮搁浅6天终于脱困 苏伊士运河恢复通航\n苏伊士运河因“长赐”号货轮搁浅被堵多日,货轮解困进展牵动全球目光。经过了长达一周的救援,当地时间3月29日搁浅货轮已经完全脱困,苏伊士运河恢复通航。当地时间3月29日,救援队成功让搁浅在苏伊士运河长达一周的巨型货轮脱困。过去7天这艘搁浅货轮阻止了价值数十亿美元的货物通过苏伊士运河。苏伊士运河是世界上最繁忙的海运通道之一。受雇参与救援的荷兰宝斯卡利斯公司的总监皮特•伯尔道斯基表示,为了让货轮脱困,挖掘机挖走了3万立方米的泥沙,并动用了13艘拖船。\n\n威廉王子获评“世界最性感光头男人”\n上周六(3月27日),英国《太阳报》发布报道称威廉王子是“世界最性感的秃顶男人”,该报道基于提供植发服务的整容公司的一项调查。据《太阳报》报道,该调查是通过分析“博客、报道和谷歌搜索页面”中“性感”一词的出现频率来得出结果的。《太阳报》写道,调查发现,威廉王子的名字被提及1760万次。这篇文章还提到了调查结果中入选前十位的其他名人。迈克•泰森仅次于威廉王子,排在第二位,紧随其后的是《速度与激情》主演杰森•斯坦森、说唱歌手皮普保罗、迈克尔•乔丹、拳击手弗洛伊德•梅威瑟、约翰•特拉沃尔塔、布鲁斯•威利斯、“巨石”强森和范•迪塞尔。", + "pub_date_ms": 1617163200000, + "audio": "https://www.listennotes.com/e/p/6d6883d86aa44db784436894a0b30881/", + "audio_length_sec": 553, + "listennotes_url": "https://www.listennotes.com/e/6d6883d86aa44db784436894a0b30881/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/6d6883d86aa44db784436894a0b30881/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "b82bf190efbc59a11323fba954a88939" + }, + { + "id": "e8f2f82ac8b645c18ba3cc401cc3b9e0", + "title": "中国人的问候方式", + "description": "问候是交际中最常用的日常礼节,人与人之间的交际都是从互致问候开始的。由于习俗不同,各个国家,各个民族的问候方式差异很大。\n首先,在问候类别上,中国人的问候方式包括问好型、询问型、也有评论型。问好型最常用的是早、你早。中国人现在也越来越多用“你好”来打招呼。这种问候方式比较正式。汉语中还有“干吗去啊”“吃了吗”等询问型问候语,以表示对别人的关心,并不是打探隐私。\n其次,问候语涉及的话题也不同。汉语的问候语大多由包含信息的问句组成,并且大多涉及别人的起居寒暖,给人亲切关心的感觉。中国人往往会互相问起对方的年龄、收入、婚姻和健康等非常大众化的话题,并且问得越详细,越能体现出对别人的关心。\n除了语言问候方式,中国人的非语言问候方式也有自己的特点。中国人尤其是年轻人之间通常会点头或挥手表示问候,而在旧时,人们见面还要鞠躬以示问候。中国人的问候方式一般比较含蓄,即使是久别重逢,也仅仅是握握手,绝不会亲吻,一般男女之间连拥抱都很少有,最多握握手。", + "pub_date_ms": 1617076800000, + "audio": "https://www.listennotes.com/e/p/e8f2f82ac8b645c18ba3cc401cc3b9e0/", + "audio_length_sec": 945, + "listennotes_url": "https://www.listennotes.com/e/e8f2f82ac8b645c18ba3cc401cc3b9e0/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/e8f2f82ac8b645c18ba3cc401cc3b9e0/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "e0b0bedbc76befceae54d01abdfb4742" + }, + { + "id": "a7fa065d4f3e43f4af68b642f2ae7331", + "title": "不求有功,但求无过", + "description": "张路:大家好,我是张路。\n珺慧:大家好,我是珺慧。欢迎大家按时收听我们的节目。\n张路:珺慧,今天你给大家带来的俗语是哪一个呢?\n珺慧:今天我想给大家讲讲“不求有功,但求无过”这个俗语。\n张路:好啊,那么你先来说说它的意思吧。\n珺慧:“功”在这里是功绩、立功的意思,“过”是指错误、过错的意思,“求”是指要求、希望。所以“不求有功,但求无过”这个俗语的表面意思就是不要求立功,只希望没有错误。\n张路:我觉得这个俗语其实也反映了一些人对待事情的态度。\n珺慧:什么态度呢?\n张路:比如说我吧,我就非常希望成功,做事情的时候即使要冒险,我也不怕,只要能成功就行。可是我姐姐跟我就不一样,她就是那种“不求有功,但求无过”的人,她做事特别小心谨慎,不太追求成功,只要没有大的错误就行。\n珺慧:没错,所以这个俗语有时也比喻不求上进或安分守己的态度或做法。\n张路:好,下面我们就来听三段对话,一起来学习一下这个俗语的意思和用法。", + "pub_date_ms": 1616817600000, + "audio": "https://www.listennotes.com/e/p/a7fa065d4f3e43f4af68b642f2ae7331/", + "audio_length_sec": 404, + "listennotes_url": "https://www.listennotes.com/e/a7fa065d4f3e43f4af68b642f2ae7331/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/a7fa065d4f3e43f4af68b642f2ae7331/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "722cdf994f21362230a5081106b82a3a" + }, + { + "id": "94f99709224a4cd98f92ae4399ee1327", + "title": "听新闻学汉语 2021年03月26日", + "description": "83天!200亿件!快递业务量增长再提速\n国家邮政局实时监测数据显示,截至3月24日,今年我国快递业务量已突破200亿件,日均业务量超过2.4亿件,日均服务用户接近5亿人次,服务民生作用更加凸显。今年以来,邮政快递业继续保持高速增长态势,预计全年快递业务量将超过950亿件。值得注意的是,今年快递业务量突破200亿件用时仅83天,比2020年提前了45天,又一次刷新了我国快递业发展纪录。今年邮政快递业更贴近民生七件实事提出,要提高建制村快递服务通达率,东部地区基本实现快递服务直投到村,中、西部地区分别达到80%和60%。\n\n欧盟正式实施健康欧盟计划\n欧盟委员会26日宣布,2021年至2027年健康欧盟计划即日起正式实施,旨在增强欧盟有效应对未来卫生危机的能力。欧委会当天在一份声明中说,欧盟将为该计划拨付51亿欧元的财政预算,有助于新冠疫情后健全卫生系统,增强有效应对跨境健康威胁及未来卫生危机的能力,促进人口健康。根据声明,健康欧盟计划指导小组将与欧盟成员国协商后推出2021年第一个工作方案。健康欧盟计划将由新成立的健康和数字执行机构负责实施,该机构将于4月1日开始运行。欧盟委员会负责卫生和食品安全事务的委员基里亚基季斯表示,健康欧盟计划为欧盟在公共卫生领域进行长期性变革提供了手段,可以通过规模空前的财政预算进行有针对性的投资,以加强危机准备,建立更强大、更有韧性和更易获得的卫生系统。欧委会于去年5月提出2021年至2027年健康欧盟计划,旨在向欧盟成员国、卫生组织和非政府组织等提供资金支持,提高应对卫生领域各种威胁的能力。该计划于本月9日经欧洲议会表决通过,17日获欧洲理事会批准。\n\n研究:不爱运动的人更容易失眠\n日前,中国睡眠研究会发布了《2021年运动与睡眠白皮书》。数据显示,当下中国有超3亿人存在睡眠障碍,而运动人群失眠困扰比例仅为10%。运动人群中以广东运动人数最多,并且睡眠充足比例位列各省份第一。研究报告指出,新冠疫情期间,不运动人群和定期运动人群睡眠状态两极分化,旅行限制令使得久坐人群减少锻炼,作息更不规律。中国睡眠研究会理事、北京朝阳医院呼吸睡眠中心主任郭兮恒称,随着国内疫情得到控制,回归常规生活的重要一步就是多出门走走,定期锻炼,以解决日益普遍的睡眠问题。", + "pub_date_ms": 1616731200000, + "audio": "https://www.listennotes.com/e/p/94f99709224a4cd98f92ae4399ee1327/", + "audio_length_sec": 617, + "listennotes_url": "https://www.listennotes.com/e/94f99709224a4cd98f92ae4399ee1327/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/94f99709224a4cd98f92ae4399ee1327/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "7ed62a5606b169765dcc29d339b6e2d2" + }, + { + "id": "244fe98dbb8d47cdb090041db48db674", + "title": "我对摇滚乐不感兴趣", + "description": "林娜:音乐声太吵了,赶快关掉。\n表妹:这首歌多好听啊,听完再关吧。\n林娜:这有什么好听的?我真不明白你为什么这么喜欢摇滚乐。\n表妹:这有什么不明白的?原因很简单啊,我一听摇滚乐就特别兴奋。\n林娜:我对摇滚乐不感兴趣,完全没办法欣赏。拜托你下次听摇滚乐的时候,小声一点儿,不要影响别人。\n表妹:好吧好吧,我戴上耳机听,绝对不会影响到你,你放心吧。", + "pub_date_ms": 1616644800001, + "audio": "https://www.listennotes.com/e/p/244fe98dbb8d47cdb090041db48db674/", + "audio_length_sec": 910, + "listennotes_url": "https://www.listennotes.com/e/244fe98dbb8d47cdb090041db48db674/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/244fe98dbb8d47cdb090041db48db674/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "7bda2555f80feee77ea3c2f0b48d3034" + }, + { + "id": "38cef39a6f64477488fa0ff88bed6e17", + "title": "听新闻学汉语 2021年03月24日", + "description": "教育部印发《职业教育专业目录(2021年)》 共设置1349个专业\n记者22日从教育部获悉,其近日印发的《职业教育专业目录(2021年)》,专业设置对接现代产业体系,服务产业基础高级化、产业链现代化,共包含1349个专业。此次新版目录,面向集成电路技术、生物信息技术、新能源材料应用技术等9大重点领域,服务国家战略性新兴产业发展;此外回应社会民生关切,加强紧缺领域人才培养,如设置婴幼儿托育服务与管理、智慧健康养老服务与管理等专业。\n\n澳大利亚东部遭遇罕见暴雨洪灾\n澳大利亚官员21日说,东部沿海地带最近几天连降暴雨,部分区域遭遇50年来最严重洪灾,数以千计居民紧急疏散,数以百计房屋损毁。新南威尔士州有800万人口,是澳大利亚人口最多的州。州长格拉迪丝•贝雷吉克利安21日在一场新闻发布会上说,全州范围遭遇暴雨,情形比先前预期得更糟糕,州首府悉尼西北部地势低洼地区洪灾尤其严重。“我们昨天预期,将迎来20年一遇的洪灾,”她说,“但如今看来,这是50年一遇的洪灾。”贝雷吉克利安说,由于暴雨洪水摧毁房屋,不少居民20日夜间至21日凌晨紧急疏散,另有1000人21日晚些时候接到疏散令,今后几天可能还将有大约4000人接到疏散令。气象部门预测,澳大利亚东部地区暴雨还将持续数日。据法新社报道,自18日开始降雨以来,澳大利亚紧急情况应对部门已经接到7000多个求助电话。\n\n日本孩子长大后最想干啥?男孩:公司职员 女孩:糕点师\n据日本《朝日新闻》中文网报道,日本“第一生命保险”不久前公布了对小学3至6年级儿童询问“长大后最想成为什么?”的调查结果,发现男生首选“公司职员”,女生选择最多的是“糕点师”。根据调查结果,男生选择的第1位是“公司职员”,“油管主播”(YouTuber)以微弱之差位居其后。女生选择的第1位是“糕点师”,第2位是“教师”。该调查以日本全国的约1100人为对象,于2020年12月实施。此次是第32次。男生选择的第1位从上次的“足球选手”转为了“公司职员”。“第一生命保险”的负责人对这一结果解释称,“在因疫情而引入远程工作的情况下,或许是因为看到父母在家里工作的样子,而产生了一种亲近感吧”。", + "pub_date_ms": 1616558400002, + "audio": "https://www.listennotes.com/e/p/38cef39a6f64477488fa0ff88bed6e17/", + "audio_length_sec": 536, + "listennotes_url": "https://www.listennotes.com/e/38cef39a6f64477488fa0ff88bed6e17/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/38cef39a6f64477488fa0ff88bed6e17/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "f28e8823de7317903c9a994e562f02a6" + }, + { + "id": "5b8527abc26a47aea5d79849c1577bbe", + "title": "寒食节的传说(二)", + "description": "晋文公多次请介子推出来做官,可介子推每次都不愿意。晋文公很想念他,最后就想了一个办法:他想,介子推藏在山里,我怎么也找不到他。如果我在山里放火,他怕被火烧死,一定会跑出来,这样我就一定能见到他了。可是他没想到,介子推宁愿烧死也不愿意出来做官,晋文公放了火,介子推最后被大火烧死了。晋文公万万没想到他得到的是这样一个悲剧的结果。他因为想念自己的朋友而杀死了自己的朋友,又难过又后悔,生了一场大病,自己也差一点儿死了。\n晋文公为了纪念自己的好朋友介子推,下了一个命令:在每年的农历三月初三这一天,全国的老百姓都不能用火,甚至不能做饭,只能吃做好的食品。因为这一天是他放火烧死自己朋友的日子,他永远后悔这一天。因为法律不准用火,人们只能吃凉的东西,所以历史上这一天就被称作“寒食节”。", + "pub_date_ms": 1616472000003, + "audio": "https://www.listennotes.com/e/p/5b8527abc26a47aea5d79849c1577bbe/", + "audio_length_sec": 913, + "listennotes_url": "https://www.listennotes.com/e/5b8527abc26a47aea5d79849c1577bbe/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/5b8527abc26a47aea5d79849c1577bbe/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "f57e66faffeff030727d85932435c52e" + }, + { + "id": "8fdae88892734896b79395817c061221", + "title": "寒食节的传说(一)", + "description": "传说在中国古代有一个晋国。这个国家遇到了危险,国家的王子逃了出去。在王子的身边有一些很好的朋友和忠诚的读书人陪着他,这些人爱自己的国家,他们支持王子,希望他能努力奋斗,回去救自己的国家。他们在外边受了很多苦,一直逃亡了十九年。这就是历史上的晋文公。\n在国外逃亡期间,晋文公有一个最忠诚的朋友叫介子推。他是一个优秀的读书人,为了自己热爱的祖国,为了帮助晋文公重新回国做国王做了很多努力。他们成功以后,晋文公让伴随他逃亡的人都做了大官。可是没想到,他最好的朋友介子推却坚决拒绝他的邀请,这让晋文公感到很苦恼。无论他怎么劝说,介子推就是不肯出来做官。为了表示自己不愿意出来做官的决心,介子推背着自己的母亲到了山上去隐居。", + "pub_date_ms": 1616212800004, + "audio": "https://www.listennotes.com/e/p/8fdae88892734896b79395817c061221/", + "audio_length_sec": 863, + "listennotes_url": "https://www.listennotes.com/e/8fdae88892734896b79395817c061221/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/8fdae88892734896b79395817c061221/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "a2df1174ce43a2f18a71d288ecc646f7" + }, + { + "id": "0932fa791c6243f3a03ba42da3397369", + "title": "听新闻学汉语 2021年03月19日", + "description": "外交部:疫苗好不好要看是否安全可靠 反对搞疫苗民族主义\n3月15日,外交部发言人赵立坚主持外交部例行记者会。有记者提问:新加坡总理李显龙接受媒体采访时,针对日益政治化的新冠病毒疫苗问题,他表示疫苗不分国籍,没有任何依据可以凭生产国就断言中国疫苗必定好或者不好。他还表示,中国有非常优秀的科学家、生物医药和疫苗研究人员,相信他们有能力生产好的疫苗。中方有何回应?赵立坚表示,疫苗是抗击病毒的利器,是拯救生命的希望,应当服务全世界、造福全人类。无论是哪个国家的疫苗,只要安全可靠,就是好疫苗。中方将继续同各方一道,反对搞疫苗民族主义,不接受制造“免疫鸿沟”,努力推进疫苗在全球范围内的公平分配,携手各国共同战胜疫情。\n\n朝鲜宣布与马来西亚断交\n据朝中社19日报道,朝鲜外务省当天发表声明正式宣布完全断绝与马来西亚的外交关系。声明表示,马来西亚当局17日以涉嫌“非法洗钱”为由将一名无辜的朝鲜公民强行引渡至美国,彻底破坏了两国关系中相互尊重主权的基础,鉴于当前的严重事态,朝方因此决定断绝与“屈服美国强权而对朝鲜做出特大敌对行为”的马来西亚的外交关系。声明称,该朝鲜公民多年在新加坡从事合法对外贸易活动,其涉嫌洗钱是荒唐无稽的捏造和阴谋,马来西亚方面也从未提出过任何确凿证据。声明指出,马来西亚当局盲目追随美国不当的压力,甚至无视公认的国际法,把朝鲜公民当作美国敌视政策的牺牲品。从现在起,马来西亚将要对双方之间可能发生的任何后果负全部责任。声明还警告美国作为这起事件的幕后操纵者也将付出应有的代价。据悉,朝鲜和马来西亚1973年正式建交。\n\n20天逾4万次地震,冰岛人被震到失眠\n据外媒报道,自2月24日冰岛西南部的雷克雅内斯半岛发生5.6级地震以来,该地区余震不断。过去20天,已记录下4万多次地震活动。据路透社16日报道,自2月24日以来,雷克雅内斯半岛发生了40000多次地震,超过了2020年在那里记录的地震总数。冰岛气象局(IMO)火山灾害协调员萨拉•巴索蒂表示:“我们从未见过如此多的地震活动。”如此频繁的地震活动,严重影响了当地居民的睡眠。“这里的每个人都很累,”当地一位名叫古德蒙兹多蒂尔的教师说。“当我晚上上床睡觉的时候,我想的都是:我今晚能睡得着吗?”", + "pub_date_ms": 1616126400000, + "audio": "https://www.listennotes.com/e/p/0932fa791c6243f3a03ba42da3397369/", + "audio_length_sec": 580, + "listennotes_url": "https://www.listennotes.com/e/0932fa791c6243f3a03ba42da3397369/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/0932fa791c6243f3a03ba42da3397369/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "9563923aacc3c0ced1bde1af9c578a14" + }, + { + "id": "7ea1b07350204827a31c9b0995d9ce22", + "title": "我想预订一个双人间", + "description": "服务员:早上好。这里是假日酒店,很高兴为您服务。\n林 娜:早上好。我想预订一个双人间,你们有下周的空房吗?\n服务员:请稍等。让我查一下房间的预订情况。是的,我们有剩余的双人间。请问您要什么样的房间?\n林 娜:我想要一个能看到漂亮风景的房间。\n服务员:我们有一个带漂亮花园风景的房间,可以吗?\n林 娜:棒极了,我就要这间。多少钱?\n服务员:每晚880元,包含早餐。\n林 娜:好的,我们下周一下午两点左右入住,周四早上离开。\n服务员:知道了。请留下您的名字和电话号码。\n林 娜:林娜,一三九五八一六二五一二。", + "pub_date_ms": 1616040000000, + "audio": "https://www.listennotes.com/e/p/7ea1b07350204827a31c9b0995d9ce22/", + "audio_length_sec": 971, + "listennotes_url": "https://www.listennotes.com/e/7ea1b07350204827a31c9b0995d9ce22/", + "image": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "thumbnail": "https://cdn-images-1.listennotes.com/podcasts/learn-chinese-culture-imandarinpodcom-Ac3CZvRgnzL.300x300.jpg", + "maybe_audio_invalid": false, + "listennotes_edit_url": "https://www.listennotes.com/e/7ea1b07350204827a31c9b0995d9ce22/#edit", + "explicit_content": false, + "link": "http://www.imandarinpod.com?utm_source=listennotes.com&utm_campaign=Listen+Notes&utm_medium=website", + "guid_from_rss": "9a3124609346ebf3c52cafbe8d0d1b4a" + } +] diff --git a/server/routers/bushou/images/60px-%E4%B8%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-bigseal.svg.png new file mode 100644 index 0000000..9b97ed7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-bronze.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-bronze.svg.png new file mode 100644 index 0000000..864407e Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-clerical.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-clerical.svg.png new file mode 100644 index 0000000..0629d72 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-oracle.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-oracle.svg.png new file mode 100644 index 0000000..21000e2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-seal.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-seal.svg.png new file mode 100644 index 0000000..4eec8e9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-silk.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-silk.svg.png new file mode 100644 index 0000000..1372af1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%80-slip.svg.png b/server/routers/bushou/images/60px-%E4%B8%80-slip.svg.png new file mode 100644 index 0000000..0e9d91b Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%80-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%B8%A8-bigseal.svg.png new file mode 100644 index 0000000..716b244 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%A8-seal.svg.png b/server/routers/bushou/images/60px-%E4%B8%A8-seal.svg.png new file mode 100644 index 0000000..cc553ef Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%B6-bronze.svg.png b/server/routers/bushou/images/60px-%E4%B8%B6-bronze.svg.png new file mode 100644 index 0000000..ada5be4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%B6-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%B6-seal.svg.png b/server/routers/bushou/images/60px-%E4%B8%B6-seal.svg.png new file mode 100644 index 0000000..eec0011 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%B8%BF-bigseal.svg.png new file mode 100644 index 0000000..2f42ace Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B8%BF-seal.svg.png b/server/routers/bushou/images/60px-%E4%B8%BF-seal.svg.png new file mode 100644 index 0000000..91427b9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B8%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B9%99-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%B9%99-bigseal.svg.png new file mode 100644 index 0000000..09c5129 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B9%99-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B9%99-bronze.svg.png b/server/routers/bushou/images/60px-%E4%B9%99-bronze.svg.png new file mode 100644 index 0000000..8c1f55f Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B9%99-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B9%99-oracle.svg.png b/server/routers/bushou/images/60px-%E4%B9%99-oracle.svg.png new file mode 100644 index 0000000..29a8bb5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B9%99-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B9%99-seal.svg.png b/server/routers/bushou/images/60px-%E4%B9%99-seal.svg.png new file mode 100644 index 0000000..c02fe34 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B9%99-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%B9%99-silk.svg.png b/server/routers/bushou/images/60px-%E4%B9%99-silk.svg.png new file mode 100644 index 0000000..2fd0cc4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%B9%99-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%85-seal.svg.png b/server/routers/bushou/images/60px-%E4%BA%85-seal.svg.png new file mode 100644 index 0000000..d0f2b93 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%85-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-bigseal.svg.png new file mode 100644 index 0000000..1be2beb Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-bronze.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-bronze.svg.png new file mode 100644 index 0000000..f65fe2c Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-oracle.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-oracle.svg.png new file mode 100644 index 0000000..e349350 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-seal.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-seal.svg.png new file mode 100644 index 0000000..8fdc9fc Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-silk.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-silk.svg.png new file mode 100644 index 0000000..261d6ba Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%8C-slip.svg.png b/server/routers/bushou/images/60px-%E4%BA%8C-slip.svg.png new file mode 100644 index 0000000..d1d3567 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%8C-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%A0-seal.svg.png b/server/routers/bushou/images/60px-%E4%BA%A0-seal.svg.png new file mode 100644 index 0000000..0ef1186 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%A0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-bigseal.svg.png new file mode 100644 index 0000000..16b3440 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-shang.svg.png new file mode 100644 index 0000000..f257df9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-spring.svg.png new file mode 100644 index 0000000..6cd555e Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-warring.svg.png new file mode 100644 index 0000000..8ee63cc Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-bronze.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-bronze.svg.png new file mode 100644 index 0000000..0a0cd58 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-oracle.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-oracle.svg.png new file mode 100644 index 0000000..ef59889 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-seal.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-seal.svg.png new file mode 100644 index 0000000..b96e758 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-silk.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-silk.svg.png new file mode 100644 index 0000000..c21edea Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BA%BA-slip.svg.png b/server/routers/bushou/images/60px-%E4%BA%BA-slip.svg.png new file mode 100644 index 0000000..57673b3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BA%BA-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BB%8C-bigseal.svg.png b/server/routers/bushou/images/60px-%E4%BB%8C-bigseal.svg.png new file mode 100644 index 0000000..411ebab Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BB%8C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BB%8C-bronze.svg.png b/server/routers/bushou/images/60px-%E4%BB%8C-bronze.svg.png new file mode 100644 index 0000000..b1d9a61 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BB%8C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BB%8C-oracle.svg.png b/server/routers/bushou/images/60px-%E4%BB%8C-oracle.svg.png new file mode 100644 index 0000000..88d2512 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BB%8C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E4%BB%8C-seal.svg.png b/server/routers/bushou/images/60px-%E4%BB%8C-seal.svg.png new file mode 100644 index 0000000..2ae52b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E4%BB%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%84%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%84%BF-bigseal.svg.png new file mode 100644 index 0000000..238c361 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%84%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%84%BF-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%84%BF-bronze-shang.svg.png new file mode 100644 index 0000000..5905d41 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%84%BF-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%84%BF-bronze.svg.png b/server/routers/bushou/images/60px-%E5%84%BF-bronze.svg.png new file mode 100644 index 0000000..6d05ed2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%84%BF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%84%BF-oracle.svg.png b/server/routers/bushou/images/60px-%E5%84%BF-oracle.svg.png new file mode 100644 index 0000000..c1eea73 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%84%BF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%84%BF-seal.svg.png b/server/routers/bushou/images/60px-%E5%84%BF-seal.svg.png new file mode 100644 index 0000000..e5daf2c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%84%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%A5-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%85%A5-bigseal.svg.png new file mode 100644 index 0000000..3b7057a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%A5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%A5-bronze.svg.png b/server/routers/bushou/images/60px-%E5%85%A5-bronze.svg.png new file mode 100644 index 0000000..edd5f0c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%A5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E5%85%A5-oracle.svg.png new file mode 100644 index 0000000..d01645f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%A5-seal.svg.png b/server/routers/bushou/images/60px-%E5%85%A5-seal.svg.png new file mode 100644 index 0000000..69de46b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%A5-silk.svg.png b/server/routers/bushou/images/60px-%E5%85%A5-silk.svg.png new file mode 100644 index 0000000..bc0efd6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%A5-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-bigseal.svg.png new file mode 100644 index 0000000..b93071e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-bronze.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-bronze.svg.png new file mode 100644 index 0000000..4f77919 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-oracle.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-oracle.svg.png new file mode 100644 index 0000000..b8da8ac Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-seal.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-seal.svg.png new file mode 100644 index 0000000..64cbac1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-silk.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-silk.svg.png new file mode 100644 index 0000000..e4314b2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%85%AB-slip.svg.png b/server/routers/bushou/images/60px-%E5%85%AB-slip.svg.png new file mode 100644 index 0000000..056ec3c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%85%AB-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%82-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%86%82-bigseal.svg.png new file mode 100644 index 0000000..bd672d9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%82-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%82-bronze.svg.png b/server/routers/bushou/images/60px-%E5%86%82-bronze.svg.png new file mode 100644 index 0000000..4c4cf7c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%82-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%82-seal.svg.png b/server/routers/bushou/images/60px-%E5%86%82-seal.svg.png new file mode 100644 index 0000000..956d863 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%82-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%88-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%86%88-bronze-shang.svg.png new file mode 100644 index 0000000..ca80ce3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%88-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%88-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E5%86%88-bronze-spring.svg.png new file mode 100644 index 0000000..b6eaab6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%88-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%88-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%86%88-bronze-warring.svg.png new file mode 100644 index 0000000..45bf70f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%88-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%88-bronze.svg.png b/server/routers/bushou/images/60px-%E5%86%88-bronze.svg.png new file mode 100644 index 0000000..6c34764 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%88-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%8E-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%86%8E-bronze-shang.svg.png new file mode 100644 index 0000000..d8ddd6f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%8E-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%8E-oracle.svg.png b/server/routers/bushou/images/60px-%E5%86%8E-oracle.svg.png new file mode 100644 index 0000000..4d954e1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%8E-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%96-bronze.svg.png b/server/routers/bushou/images/60px-%E5%86%96-bronze.svg.png new file mode 100644 index 0000000..e787f78 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%96-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%96-oracle.svg.png b/server/routers/bushou/images/60px-%E5%86%96-oracle.svg.png new file mode 100644 index 0000000..070f4ae Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%96-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%86%96-seal.svg.png b/server/routers/bushou/images/60px-%E5%86%96-seal.svg.png new file mode 100644 index 0000000..a319248 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%86%96-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%A0-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%87%A0-bigseal.svg.png new file mode 100644 index 0000000..d099af5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%A0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%A0-seal.svg.png b/server/routers/bushou/images/60px-%E5%87%A0-seal.svg.png new file mode 100644 index 0000000..885955b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%A0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%A0-silk.svg.png b/server/routers/bushou/images/60px-%E5%87%A0-silk.svg.png new file mode 100644 index 0000000..dd17740 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%A0-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%B5-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%87%B5-bigseal.svg.png new file mode 100644 index 0000000..c7b0f8e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%B5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%B5-oracle.svg.png b/server/routers/bushou/images/60px-%E5%87%B5-oracle.svg.png new file mode 100644 index 0000000..d7a9316 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%B5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%B5-seal.svg.png b/server/routers/bushou/images/60px-%E5%87%B5-seal.svg.png new file mode 100644 index 0000000..9e8c8f2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%B5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%87%B5-silk.svg.png b/server/routers/bushou/images/60px-%E5%87%B5-silk.svg.png new file mode 100644 index 0000000..75a9a75 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%87%B5-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%88%80-bigseal.svg.png new file mode 100644 index 0000000..025bb96 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%88%80-bronze-shang.svg.png new file mode 100644 index 0000000..d5471ac Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-bronze.svg.png b/server/routers/bushou/images/60px-%E5%88%80-bronze.svg.png new file mode 100644 index 0000000..0cfabb3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-oracle.svg.png b/server/routers/bushou/images/60px-%E5%88%80-oracle.svg.png new file mode 100644 index 0000000..393b283 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-seal.svg.png b/server/routers/bushou/images/60px-%E5%88%80-seal.svg.png new file mode 100644 index 0000000..7ae7ce5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%88%80-silk.svg.png b/server/routers/bushou/images/60px-%E5%88%80-silk.svg.png new file mode 100644 index 0000000..e6ed3d9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%88%80-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-bigseal.svg.png new file mode 100644 index 0000000..b3af98e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-bronze-spring.svg.png new file mode 100644 index 0000000..d6ce1f7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-bronze-warring.svg.png new file mode 100644 index 0000000..0dd3a8f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-bronze.svg.png new file mode 100644 index 0000000..deae37c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-oracle.svg.png new file mode 100644 index 0000000..09e1998 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-seal.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-seal.svg.png new file mode 100644 index 0000000..773201e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-silk.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-silk.svg.png new file mode 100644 index 0000000..eda8a7a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8A%9B-slip.svg.png b/server/routers/bushou/images/60px-%E5%8A%9B-slip.svg.png new file mode 100644 index 0000000..570a247 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8A%9B-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8B%B9-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8B%B9-bronze.svg.png new file mode 100644 index 0000000..3468058 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8B%B9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8B%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8B%B9-oracle.svg.png new file mode 100644 index 0000000..21b45f9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8B%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8B%B9-seal.svg.png b/server/routers/bushou/images/60px-%E5%8B%B9-seal.svg.png new file mode 100644 index 0000000..2dd7d1d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8B%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-bigseal.svg.png new file mode 100644 index 0000000..826a64e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-bronze-shang.svg.png new file mode 100644 index 0000000..2f5f590 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-bronze.svg.png new file mode 100644 index 0000000..8733de2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-oracle.svg.png new file mode 100644 index 0000000..84e4a9d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-seal.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-seal.svg.png new file mode 100644 index 0000000..4a78516 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%95-silk.svg.png b/server/routers/bushou/images/60px-%E5%8C%95-silk.svg.png new file mode 100644 index 0000000..c25b8a2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%95-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%9A-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8C%9A-bigseal.svg.png new file mode 100644 index 0000000..7f18c0d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%9A-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%9A-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8C%9A-bronze.svg.png new file mode 100644 index 0000000..10ad47a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%9A-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%9A-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8C%9A-oracle.svg.png new file mode 100644 index 0000000..4464f54 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%9A-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%9A-seal.svg.png b/server/routers/bushou/images/60px-%E5%8C%9A-seal.svg.png new file mode 100644 index 0000000..c636709 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%9A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%B8-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8C%B8-bigseal.svg.png new file mode 100644 index 0000000..b13b47b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%B8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%B8-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8C%B8-bronze.svg.png new file mode 100644 index 0000000..f47720f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%B8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%B8-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8C%B8-oracle.svg.png new file mode 100644 index 0000000..40b7bba Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%B8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%B8-seal.svg.png b/server/routers/bushou/images/60px-%E5%8C%B8-seal.svg.png new file mode 100644 index 0000000..37930a9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8C%B8-silk.svg.png b/server/routers/bushou/images/60px-%E5%8C%B8-silk.svg.png new file mode 100644 index 0000000..39e645a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8C%B8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-bigseal.svg.png new file mode 100644 index 0000000..e772268 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-bronze-shang.svg.png new file mode 100644 index 0000000..9f38c6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-bronze-spring.svg.png new file mode 100644 index 0000000..8c03ada Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-bronze-warring.svg.png new file mode 100644 index 0000000..13f054d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-bronze.svg.png new file mode 100644 index 0000000..9ee9444 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-oracle.svg.png new file mode 100644 index 0000000..1992e35 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-seal.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-seal.svg.png new file mode 100644 index 0000000..a2bdc5a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-silk.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-silk.svg.png new file mode 100644 index 0000000..b5c05b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%81-slip.svg.png b/server/routers/bushou/images/60px-%E5%8D%81-slip.svg.png new file mode 100644 index 0000000..3e5d904 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%81-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-bigseal.svg.png new file mode 100644 index 0000000..95b69ae Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-bronze.svg.png new file mode 100644 index 0000000..ecedae0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-oracle.svg.png new file mode 100644 index 0000000..06fae5f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-seal.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-seal.svg.png new file mode 100644 index 0000000..0cf0f4b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-silk.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-silk.svg.png new file mode 100644 index 0000000..f382408 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%9C-slip.svg.png b/server/routers/bushou/images/60px-%E5%8D%9C-slip.svg.png new file mode 100644 index 0000000..696f779 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%9C-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%A9-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8D%A9-bronze.svg.png new file mode 100644 index 0000000..4cd1795 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%A9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%A9-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8D%A9-oracle.svg.png new file mode 100644 index 0000000..fa81e68 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%A9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8D%A9-seal.svg.png b/server/routers/bushou/images/60px-%E5%8D%A9-seal.svg.png new file mode 100644 index 0000000..95cb3e9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8D%A9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%82-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8E%82-bigseal.svg.png new file mode 100644 index 0000000..5475a06 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%82-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%82-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8E%82-bronze.svg.png new file mode 100644 index 0000000..8456ad5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%82-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%82-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8E%82-oracle.svg.png new file mode 100644 index 0000000..b08f3eb Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%82-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%82-seal.svg.png b/server/routers/bushou/images/60px-%E5%8E%82-seal.svg.png new file mode 100644 index 0000000..09a1177 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%82-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%B6-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8E%B6-bigseal.svg.png new file mode 100644 index 0000000..4bfa256 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%B6-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%B6-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%8E%B6-bronze-warring.svg.png new file mode 100644 index 0000000..a1dd0ca Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%B6-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%B6-seal.svg.png b/server/routers/bushou/images/60px-%E5%8E%B6-seal.svg.png new file mode 100644 index 0000000..70f570b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8E%B6-silk.svg.png b/server/routers/bushou/images/60px-%E5%8E%B6-silk.svg.png new file mode 100644 index 0000000..6770108 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8E%B6-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%88-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8F%88-bigseal.svg.png new file mode 100644 index 0000000..403ef6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%88-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%88-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8F%88-bronze.svg.png new file mode 100644 index 0000000..27ca01f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%88-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%88-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8F%88-oracle.svg.png new file mode 100644 index 0000000..e898875 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%88-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%88-seal.svg.png b/server/routers/bushou/images/60px-%E5%8F%88-seal.svg.png new file mode 100644 index 0000000..426c509 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%88-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%88-silk.svg.png b/server/routers/bushou/images/60px-%E5%8F%88-silk.svg.png new file mode 100644 index 0000000..8657002 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%88-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-bigseal.svg.png new file mode 100644 index 0000000..335a47c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-bronze-shang.svg.png new file mode 100644 index 0000000..09bed19 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-bronze.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-bronze.svg.png new file mode 100644 index 0000000..732f8d4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-oracle.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-oracle.svg.png new file mode 100644 index 0000000..fd78ca5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-seal.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-seal.svg.png new file mode 100644 index 0000000..9952ac5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%8F%A3-silk.svg.png b/server/routers/bushou/images/60px-%E5%8F%A3-silk.svg.png new file mode 100644 index 0000000..550b2ff Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%8F%A3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9B%97-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%9B%97-bigseal.svg.png new file mode 100644 index 0000000..1688702 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9B%97-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9B%97-bronze.svg.png b/server/routers/bushou/images/60px-%E5%9B%97-bronze.svg.png new file mode 100644 index 0000000..855215a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9B%97-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9B%97-oracle.svg.png b/server/routers/bushou/images/60px-%E5%9B%97-oracle.svg.png new file mode 100644 index 0000000..3ed43e7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9B%97-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9B%97-seal.svg.png b/server/routers/bushou/images/60px-%E5%9B%97-seal.svg.png new file mode 100644 index 0000000..aaf5dae Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9B%97-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-bigseal.svg.png new file mode 100644 index 0000000..ee9f9f0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-bronze-spring.svg.png new file mode 100644 index 0000000..3e7ade3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-bronze.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-bronze.svg.png new file mode 100644 index 0000000..b24c79e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-oracle.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-oracle.svg.png new file mode 100644 index 0000000..b408fd1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-seal.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-seal.svg.png new file mode 100644 index 0000000..c9f0688 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-silk.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-silk.svg.png new file mode 100644 index 0000000..7575b78 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%9C%9F-slip.svg.png b/server/routers/bushou/images/60px-%E5%9C%9F-slip.svg.png new file mode 100644 index 0000000..c397c07 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%9C%9F-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A3%AB-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%A3%AB-bigseal.svg.png new file mode 100644 index 0000000..23bbafe Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A3%AB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A3%AB-bronze.svg.png b/server/routers/bushou/images/60px-%E5%A3%AB-bronze.svg.png new file mode 100644 index 0000000..68ab294 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A3%AB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A3%AB-seal.svg.png b/server/routers/bushou/images/60px-%E5%A3%AB-seal.svg.png new file mode 100644 index 0000000..fbb0854 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A3%AB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A3%AB-silk.svg.png b/server/routers/bushou/images/60px-%E5%A3%AB-silk.svg.png new file mode 100644 index 0000000..bf5c9c0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A3%AB-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A3%AB-slip.svg.png b/server/routers/bushou/images/60px-%E5%A3%AB-slip.svg.png new file mode 100644 index 0000000..d4a55ed Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A3%AB-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%82-seal.svg.png b/server/routers/bushou/images/60px-%E5%A4%82-seal.svg.png new file mode 100644 index 0000000..d6cc44a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%82-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%8A-oracle.svg.png b/server/routers/bushou/images/60px-%E5%A4%8A-oracle.svg.png new file mode 100644 index 0000000..92e917c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%8A-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%8A-seal.svg.png b/server/routers/bushou/images/60px-%E5%A4%8A-seal.svg.png new file mode 100644 index 0000000..f7588a4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%8A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%95-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%A4%95-bigseal.svg.png new file mode 100644 index 0000000..3d9809e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%95-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%95-bronze.svg.png b/server/routers/bushou/images/60px-%E5%A4%95-bronze.svg.png new file mode 100644 index 0000000..b72d677 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%95-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%95-oracle.svg.png b/server/routers/bushou/images/60px-%E5%A4%95-oracle.svg.png new file mode 100644 index 0000000..6006c56 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%95-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%95-seal.svg.png b/server/routers/bushou/images/60px-%E5%A4%95-seal.svg.png new file mode 100644 index 0000000..37eab1d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%95-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%95-silk.svg.png b/server/routers/bushou/images/60px-%E5%A4%95-silk.svg.png new file mode 100644 index 0000000..b71175f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%95-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-bigseal.svg.png new file mode 100644 index 0000000..8e02ade Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-bronze-shang.svg.png new file mode 100644 index 0000000..0817b6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-bronze-warring.svg.png new file mode 100644 index 0000000..80fcfdd Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-bronze.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-bronze.svg.png new file mode 100644 index 0000000..b8f9092 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-oracle.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-oracle.svg.png new file mode 100644 index 0000000..799195c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-seal.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-seal.svg.png new file mode 100644 index 0000000..b297379 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-silk.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-silk.svg.png new file mode 100644 index 0000000..f7e8909 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-slip.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-slip.svg.png new file mode 100644 index 0000000..d11c0ed Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%A7-zhou.svg.png b/server/routers/bushou/images/60px-%E5%A4%A7-zhou.svg.png new file mode 100644 index 0000000..473fe7f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%A7-zhou.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A4%B6-ancient.svg.png b/server/routers/bushou/images/60px-%E5%A4%B6-ancient.svg.png new file mode 100644 index 0000000..917371c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A4%B6-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A5%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%A5%B3-bigseal.svg.png new file mode 100644 index 0000000..57a4d71 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A5%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A5%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E5%A5%B3-bronze.svg.png new file mode 100644 index 0000000..6ccae35 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A5%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A5%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E5%A5%B3-oracle.svg.png new file mode 100644 index 0000000..a6f898a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A5%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A5%B3-seal.svg.png b/server/routers/bushou/images/60px-%E5%A5%B3-seal.svg.png new file mode 100644 index 0000000..0f8f506 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A5%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%A5%B3-silk.svg.png b/server/routers/bushou/images/60px-%E5%A5%B3-silk.svg.png new file mode 100644 index 0000000..c4f72e0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%A5%B3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AD%90-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%AD%90-bigseal.svg.png new file mode 100644 index 0000000..905c86e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AD%90-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AD%90-bronze.svg.png b/server/routers/bushou/images/60px-%E5%AD%90-bronze.svg.png new file mode 100644 index 0000000..728034d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AD%90-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AD%90-oracle.svg.png b/server/routers/bushou/images/60px-%E5%AD%90-oracle.svg.png new file mode 100644 index 0000000..5298eb0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AD%90-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AD%90-seal.svg.png b/server/routers/bushou/images/60px-%E5%AD%90-seal.svg.png new file mode 100644 index 0000000..c6a15f1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AD%90-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AD%90-silk.svg.png b/server/routers/bushou/images/60px-%E5%AD%90-silk.svg.png new file mode 100644 index 0000000..1cddb7d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AD%90-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AE%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%AE%80-bigseal.svg.png new file mode 100644 index 0000000..f92c9ab Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AE%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AE%80-bronze.svg.png b/server/routers/bushou/images/60px-%E5%AE%80-bronze.svg.png new file mode 100644 index 0000000..600a549 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AE%80-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AE%80-oracle.svg.png b/server/routers/bushou/images/60px-%E5%AE%80-oracle.svg.png new file mode 100644 index 0000000..cbec423 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AE%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AE%80-seal.svg.png b/server/routers/bushou/images/60px-%E5%AE%80-seal.svg.png new file mode 100644 index 0000000..b0b1814 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AE%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AF%B8-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%AF%B8-bigseal.svg.png new file mode 100644 index 0000000..ad41069 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AF%B8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AF%B8-bronze.svg.png b/server/routers/bushou/images/60px-%E5%AF%B8-bronze.svg.png new file mode 100644 index 0000000..397061a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AF%B8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AF%B8-seal.svg.png b/server/routers/bushou/images/60px-%E5%AF%B8-seal.svg.png new file mode 100644 index 0000000..7c69b38 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AF%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%AF%B8-slip.svg.png b/server/routers/bushou/images/60px-%E5%AF%B8-slip.svg.png new file mode 100644 index 0000000..512a48e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%AF%B8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%8F-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B0%8F-bigseal.svg.png new file mode 100644 index 0000000..9e1a89c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%8F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%8F-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B0%8F-bronze.svg.png new file mode 100644 index 0000000..cae2761 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%8F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%8F-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B0%8F-oracle.svg.png new file mode 100644 index 0000000..9fc1be3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%8F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%8F-seal.svg.png b/server/routers/bushou/images/60px-%E5%B0%8F-seal.svg.png new file mode 100644 index 0000000..4f62ad2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%8F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%8F-slip.svg.png b/server/routers/bushou/images/60px-%E5%B0%8F-slip.svg.png new file mode 100644 index 0000000..436a627 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%8F-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%A2-ancient.svg.png b/server/routers/bushou/images/60px-%E5%B0%A2-ancient.svg.png new file mode 100644 index 0000000..c5c1445 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%A2-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%A2-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B0%A2-bronze.svg.png new file mode 100644 index 0000000..409bb41 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%A2-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%A2-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B0%A2-oracle.svg.png new file mode 100644 index 0000000..e961f1a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%A2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%A2-seal.svg.png b/server/routers/bushou/images/60px-%E5%B0%A2-seal.svg.png new file mode 100644 index 0000000..4cef27e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%A2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-bigseal.svg.png new file mode 100644 index 0000000..ba07a61 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-bronze-shang.svg.png new file mode 100644 index 0000000..f8fd0a1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-bronze.svg.png new file mode 100644 index 0000000..b8dcff2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-oracle.svg.png new file mode 100644 index 0000000..aaf5a5e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-seal.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-seal.svg.png new file mode 100644 index 0000000..f81915e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B0%B8-slip.svg.png b/server/routers/bushou/images/60px-%E5%B0%B8-slip.svg.png new file mode 100644 index 0000000..cae811e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B0%B8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%AE-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B1%AE-bigseal.svg.png new file mode 100644 index 0000000..86a77f4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%AE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%AE-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B1%AE-bronze.svg.png new file mode 100644 index 0000000..7856e4e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%AE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%AE-seal.svg.png b/server/routers/bushou/images/60px-%E5%B1%AE-seal.svg.png new file mode 100644 index 0000000..4080cd2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%AE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%AE-silk.svg.png b/server/routers/bushou/images/60px-%E5%B1%AE-silk.svg.png new file mode 100644 index 0000000..4e61fda Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%AE-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%B1-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B1%B1-bigseal.svg.png new file mode 100644 index 0000000..13daa9a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%B1-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%B1-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B1%B1-bronze.svg.png new file mode 100644 index 0000000..3145f1f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%B1-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%B1-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B1%B1-oracle.svg.png new file mode 100644 index 0000000..38e0425 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%B1-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%B1-seal.svg.png b/server/routers/bushou/images/60px-%E5%B1%B1-seal.svg.png new file mode 100644 index 0000000..0cc33f6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%B1-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B1%B1-silk.svg.png b/server/routers/bushou/images/60px-%E5%B1%B1-silk.svg.png new file mode 100644 index 0000000..c613834 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B1%B1-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%9D-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E5%B7%9D-bronze-warring.svg.png new file mode 100644 index 0000000..2fe5e62 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%9D-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%9D-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B7%9D-bronze.svg.png new file mode 100644 index 0000000..04be5f9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%9D-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%9D-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B7%9D-oracle.svg.png new file mode 100644 index 0000000..9d69735 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%9D-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%9D-seal.svg.png b/server/routers/bushou/images/60px-%E5%B7%9D-seal.svg.png new file mode 100644 index 0000000..da778db Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%9D-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%9D-silk.svg.png b/server/routers/bushou/images/60px-%E5%B7%9D-silk.svg.png new file mode 100644 index 0000000..8edfccc Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%9D-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-ancient.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-ancient.svg.png new file mode 100644 index 0000000..f31ca0f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-bigseal.svg.png new file mode 100644 index 0000000..5e1a462 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-bronze.svg.png new file mode 100644 index 0000000..9a427da Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-oracle.svg.png new file mode 100644 index 0000000..0f39fba Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-seal.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-seal.svg.png new file mode 100644 index 0000000..e89c504 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%A5-silk.svg.png b/server/routers/bushou/images/60px-%E5%B7%A5-silk.svg.png new file mode 100644 index 0000000..baf6b5f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%A5-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%B1-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B7%B1-bigseal.svg.png new file mode 100644 index 0000000..de143f8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%B1-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%B1-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B7%B1-bronze.svg.png new file mode 100644 index 0000000..c2137ee Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%B1-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%B1-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B7%B1-oracle.svg.png new file mode 100644 index 0000000..17a057d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%B1-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%B1-seal.svg.png b/server/routers/bushou/images/60px-%E5%B7%B1-seal.svg.png new file mode 100644 index 0000000..62e154d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%B1-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%B1-silk.svg.png b/server/routers/bushou/images/60px-%E5%B7%B1-silk.svg.png new file mode 100644 index 0000000..52e468b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%B1-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%BE-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B7%BE-bigseal.svg.png new file mode 100644 index 0000000..8f5f909 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%BE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%BE-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B7%BE-bronze.svg.png new file mode 100644 index 0000000..d052e5f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%BE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%BE-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B7%BE-oracle.svg.png new file mode 100644 index 0000000..8f1922c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%BE-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B7%BE-seal.svg.png b/server/routers/bushou/images/60px-%E5%B7%BE-seal.svg.png new file mode 100644 index 0000000..74c1a80 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B7%BE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%B2-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B9%B2-bigseal.svg.png new file mode 100644 index 0000000..4341f40 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%B2-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%B2-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B9%B2-bronze.svg.png new file mode 100644 index 0000000..cc12247 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%B2-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%B2-oracle.svg.png b/server/routers/bushou/images/60px-%E5%B9%B2-oracle.svg.png new file mode 100644 index 0000000..3141fc6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%B2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%B2-seal.svg.png b/server/routers/bushou/images/60px-%E5%B9%B2-seal.svg.png new file mode 100644 index 0000000..c1e4a28 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%B2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%B2-silk.svg.png b/server/routers/bushou/images/60px-%E5%B9%B2-silk.svg.png new file mode 100644 index 0000000..c4a303c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%B2-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%BA-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B9%BA-bronze.svg.png new file mode 100644 index 0000000..0fb42b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%BA-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%BA-seal.svg.png b/server/routers/bushou/images/60px-%E5%B9%BA-seal.svg.png new file mode 100644 index 0000000..5b9999f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%BA-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%B9%BF-bigseal.svg.png new file mode 100644 index 0000000..f4c04c5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%BF-bronze.svg.png b/server/routers/bushou/images/60px-%E5%B9%BF-bronze.svg.png new file mode 100644 index 0000000..dad9129 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%BF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%B9%BF-seal.svg.png b/server/routers/bushou/images/60px-%E5%B9%BF-seal.svg.png new file mode 100644 index 0000000..f205ee8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%B9%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%B4-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BB%B4-bigseal.svg.png new file mode 100644 index 0000000..d3fc7e1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%B4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%B4-seal.svg.png b/server/routers/bushou/images/60px-%E5%BB%B4-seal.svg.png new file mode 100644 index 0000000..32b2b2a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%B4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%BE-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BB%BE-bigseal.svg.png new file mode 100644 index 0000000..6eb66cf Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%BE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%BE-bronze.svg.png b/server/routers/bushou/images/60px-%E5%BB%BE-bronze.svg.png new file mode 100644 index 0000000..8511fa5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%BE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%BE-oracle.svg.png b/server/routers/bushou/images/60px-%E5%BB%BE-oracle.svg.png new file mode 100644 index 0000000..5b87e82 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%BE-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BB%BE-seal.svg.png b/server/routers/bushou/images/60px-%E5%BB%BE-seal.svg.png new file mode 100644 index 0000000..117e8d2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BB%BE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BC%8B-bigseal.svg.png new file mode 100644 index 0000000..6bc7449 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E5%BC%8B-bronze.svg.png new file mode 100644 index 0000000..27e76a7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8B-oracle.svg.png b/server/routers/bushou/images/60px-%E5%BC%8B-oracle.svg.png new file mode 100644 index 0000000..56ba761 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8B-seal.svg.png b/server/routers/bushou/images/60px-%E5%BC%8B-seal.svg.png new file mode 100644 index 0000000..1e850c3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8B-silk.svg.png b/server/routers/bushou/images/60px-%E5%BC%8B-silk.svg.png new file mode 100644 index 0000000..f0dee2b Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8C-ancient.svg.png b/server/routers/bushou/images/60px-%E5%BC%8C-ancient.svg.png new file mode 100644 index 0000000..a3300f5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8C-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%8D-ancient.svg.png b/server/routers/bushou/images/60px-%E5%BC%8D-ancient.svg.png new file mode 100644 index 0000000..ddd9074 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%8D-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%93-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BC%93-bigseal.svg.png new file mode 100644 index 0000000..467eb1a Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%93-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%93-bronze.svg.png b/server/routers/bushou/images/60px-%E5%BC%93-bronze.svg.png new file mode 100644 index 0000000..69782e9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%93-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%93-oracle.svg.png b/server/routers/bushou/images/60px-%E5%BC%93-oracle.svg.png new file mode 100644 index 0000000..5846e0f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%93-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%93-seal.svg.png b/server/routers/bushou/images/60px-%E5%BC%93-seal.svg.png new file mode 100644 index 0000000..20177e4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%93-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BC%93-silk.svg.png b/server/routers/bushou/images/60px-%E5%BC%93-silk.svg.png new file mode 100644 index 0000000..04b873e Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BC%93-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%90-seal.svg.png b/server/routers/bushou/images/60px-%E5%BD%90-seal.svg.png new file mode 100644 index 0000000..13df4ac Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%90-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%A1-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BD%A1-bigseal.svg.png new file mode 100644 index 0000000..09461d5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%A1-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%A1-seal.svg.png b/server/routers/bushou/images/60px-%E5%BD%A1-seal.svg.png new file mode 100644 index 0000000..602715f Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%A1-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BD%B3-bigseal.svg.png new file mode 100644 index 0000000..070c89d Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E5%BD%B3-bronze.svg.png new file mode 100644 index 0000000..5a5ebf7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BD%B3-seal.svg.png b/server/routers/bushou/images/60px-%E5%BD%B3-seal.svg.png new file mode 100644 index 0000000..a9e4fd5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BD%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-bigseal.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-bigseal.svg.png new file mode 100644 index 0000000..92c36b0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-bronze-shang.svg.png new file mode 100644 index 0000000..f861cd3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-bronze.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-bronze.svg.png new file mode 100644 index 0000000..676745c Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-oracle.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-oracle.svg.png new file mode 100644 index 0000000..dfd48a3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-seal.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-seal.svg.png new file mode 100644 index 0000000..3b2a1b1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E5%BF%83-silk.svg.png b/server/routers/bushou/images/60px-%E5%BF%83-silk.svg.png new file mode 100644 index 0000000..f53b5db Binary files /dev/null and b/server/routers/bushou/images/60px-%E5%BF%83-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%88-bronze.svg.png b/server/routers/bushou/images/60px-%E6%88%88-bronze.svg.png new file mode 100644 index 0000000..605751c Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%88-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%88-oracle.svg.png b/server/routers/bushou/images/60px-%E6%88%88-oracle.svg.png new file mode 100644 index 0000000..2862fde Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%88-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%88-seal.svg.png b/server/routers/bushou/images/60px-%E6%88%88-seal.svg.png new file mode 100644 index 0000000..f80b6aa Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%88-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%88-silk.svg.png b/server/routers/bushou/images/60px-%E6%88%88-silk.svg.png new file mode 100644 index 0000000..1fc1ec7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%88-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%B6-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%88%B6-bigseal.svg.png new file mode 100644 index 0000000..3439ad4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%B6-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%B6-bronze.svg.png b/server/routers/bushou/images/60px-%E6%88%B6-bronze.svg.png new file mode 100644 index 0000000..ebd9373 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%B6-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%B6-oracle.svg.png b/server/routers/bushou/images/60px-%E6%88%B6-oracle.svg.png new file mode 100644 index 0000000..83f20fb Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%B6-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%B6-seal.svg.png b/server/routers/bushou/images/60px-%E6%88%B6-seal.svg.png new file mode 100644 index 0000000..d6776ef Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%88%B6-silk.svg.png b/server/routers/bushou/images/60px-%E6%88%B6-silk.svg.png new file mode 100644 index 0000000..4bd1373 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%88%B6-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-ancient.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-ancient.svg.png new file mode 100644 index 0000000..0d24587 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-bigseal.svg.png new file mode 100644 index 0000000..a0ecda3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-bronze.svg.png new file mode 100644 index 0000000..88e3fe7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-seal.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-seal.svg.png new file mode 100644 index 0000000..a10adfc Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-silk.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-silk.svg.png new file mode 100644 index 0000000..7b4d357 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%89%8B-slip.svg.png b/server/routers/bushou/images/60px-%E6%89%8B-slip.svg.png new file mode 100644 index 0000000..9961241 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%89%8B-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%AF-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%94%AF-bigseal.svg.png new file mode 100644 index 0000000..e098288 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%AF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%AF-seal.svg.png b/server/routers/bushou/images/60px-%E6%94%AF-seal.svg.png new file mode 100644 index 0000000..27cc9a1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%AF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%AF-silk.svg.png b/server/routers/bushou/images/60px-%E6%94%AF-silk.svg.png new file mode 100644 index 0000000..fb631d5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%AF-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%B4-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%94%B4-bigseal.svg.png new file mode 100644 index 0000000..8cfbec8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%B4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%B4-oracle.svg.png b/server/routers/bushou/images/60px-%E6%94%B4-oracle.svg.png new file mode 100644 index 0000000..743429e Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%B4-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%94%B4-seal.svg.png b/server/routers/bushou/images/60px-%E6%94%B4-seal.svg.png new file mode 100644 index 0000000..ad2157f Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%94%B4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%87-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%96%87-bigseal.svg.png new file mode 100644 index 0000000..75e8115 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%87-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%87-bronze.svg.png b/server/routers/bushou/images/60px-%E6%96%87-bronze.svg.png new file mode 100644 index 0000000..95bed28 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%87-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%87-oracle.svg.png b/server/routers/bushou/images/60px-%E6%96%87-oracle.svg.png new file mode 100644 index 0000000..d750541 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%87-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%87-seal.svg.png b/server/routers/bushou/images/60px-%E6%96%87-seal.svg.png new file mode 100644 index 0000000..ca9537f Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%87-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%87-silk.svg.png b/server/routers/bushou/images/60px-%E6%96%87-silk.svg.png new file mode 100644 index 0000000..8abe4fc Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%87-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%96%97-bigseal.svg.png new file mode 100644 index 0000000..074d48c Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E6%96%97-bronze-spring.svg.png new file mode 100644 index 0000000..d61bbd1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E6%96%97-bronze-warring.svg.png new file mode 100644 index 0000000..6afd690 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-oracle.svg.png b/server/routers/bushou/images/60px-%E6%96%97-oracle.svg.png new file mode 100644 index 0000000..8f03a29 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-seal.svg.png b/server/routers/bushou/images/60px-%E6%96%97-seal.svg.png new file mode 100644 index 0000000..91faabf Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%97-slip.svg.png b/server/routers/bushou/images/60px-%E6%96%97-slip.svg.png new file mode 100644 index 0000000..f4aa1ab Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%97-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%A4-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%96%A4-bigseal.svg.png new file mode 100644 index 0000000..d61639b Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%A4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%A4-bronze.svg.png b/server/routers/bushou/images/60px-%E6%96%A4-bronze.svg.png new file mode 100644 index 0000000..524fb31 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%A4-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%A4-oracle.svg.png b/server/routers/bushou/images/60px-%E6%96%A4-oracle.svg.png new file mode 100644 index 0000000..c6e4f1a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%A4-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%A4-seal.svg.png b/server/routers/bushou/images/60px-%E6%96%A4-seal.svg.png new file mode 100644 index 0000000..5380809 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%A4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%A4-silk.svg.png b/server/routers/bushou/images/60px-%E6%96%A4-silk.svg.png new file mode 100644 index 0000000..d127a6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%A4-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%B9-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%96%B9-bigseal.svg.png new file mode 100644 index 0000000..e6c7e82 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%B9-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%B9-bronze.svg.png b/server/routers/bushou/images/60px-%E6%96%B9-bronze.svg.png new file mode 100644 index 0000000..b625353 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%B9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E6%96%B9-oracle.svg.png new file mode 100644 index 0000000..e0d4095 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%B9-seal.svg.png b/server/routers/bushou/images/60px-%E6%96%B9-seal.svg.png new file mode 100644 index 0000000..aee98c3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%96%B9-silk.svg.png b/server/routers/bushou/images/60px-%E6%96%B9-silk.svg.png new file mode 100644 index 0000000..62a1e3c Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%96%B9-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A0-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%97%A0-bigseal.svg.png new file mode 100644 index 0000000..4cb210e Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A0-bronze.svg.png b/server/routers/bushou/images/60px-%E6%97%A0-bronze.svg.png new file mode 100644 index 0000000..d87549a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A5-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%97%A5-bigseal.svg.png new file mode 100644 index 0000000..0d3376d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A5-bronze.svg.png b/server/routers/bushou/images/60px-%E6%97%A5-bronze.svg.png new file mode 100644 index 0000000..54c3973 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E6%97%A5-oracle.svg.png new file mode 100644 index 0000000..cff8982 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A5-seal.svg.png b/server/routers/bushou/images/60px-%E6%97%A5-seal.svg.png new file mode 100644 index 0000000..eadaaa9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%97%A5-silk.svg.png b/server/routers/bushou/images/60px-%E6%97%A5-silk.svg.png new file mode 100644 index 0000000..f35cbee Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%97%A5-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-bigseal.svg.png new file mode 100644 index 0000000..b174712 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-bronze.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-bronze.svg.png new file mode 100644 index 0000000..4f0bf9f Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-clerical.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-clerical.svg.png new file mode 100644 index 0000000..1582b25 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-oracle.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-oracle.svg.png new file mode 100644 index 0000000..eef6d0d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-seal.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-seal.svg.png new file mode 100644 index 0000000..84f70a8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9B%B0-silk.svg.png b/server/routers/bushou/images/60px-%E6%9B%B0-silk.svg.png new file mode 100644 index 0000000..1e64ab1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9B%B0-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%88-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%9C%88-bigseal.svg.png new file mode 100644 index 0000000..890046a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%88-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%88-bronze.svg.png b/server/routers/bushou/images/60px-%E6%9C%88-bronze.svg.png new file mode 100644 index 0000000..b80867a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%88-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%88-oracle.svg.png b/server/routers/bushou/images/60px-%E6%9C%88-oracle.svg.png new file mode 100644 index 0000000..f79e3db Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%88-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%88-seal.svg.png b/server/routers/bushou/images/60px-%E6%9C%88-seal.svg.png new file mode 100644 index 0000000..2ed4dd3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%88-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%88-silk.svg.png b/server/routers/bushou/images/60px-%E6%9C%88-silk.svg.png new file mode 100644 index 0000000..9b508d7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%88-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%9C%A8-bigseal.svg.png new file mode 100644 index 0000000..adaef95 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%A8-bronze.svg.png b/server/routers/bushou/images/60px-%E6%9C%A8-bronze.svg.png new file mode 100644 index 0000000..4f7ac1b Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%A8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%A8-oracle.svg.png b/server/routers/bushou/images/60px-%E6%9C%A8-oracle.svg.png new file mode 100644 index 0000000..6f19611 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%A8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%A8-seal.svg.png b/server/routers/bushou/images/60px-%E6%9C%A8-seal.svg.png new file mode 100644 index 0000000..af8be56 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9C%A8-silk.svg.png b/server/routers/bushou/images/60px-%E6%9C%A8-silk.svg.png new file mode 100644 index 0000000..5d630e5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9C%A8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%9D%B8-silk.svg.png b/server/routers/bushou/images/60px-%E6%9D%B8-silk.svg.png new file mode 100644 index 0000000..b515c8f Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%9D%B8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AC%A0-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AC%A0-bigseal.svg.png new file mode 100644 index 0000000..f0b2f87 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AC%A0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AC%A0-seal.svg.png b/server/routers/bushou/images/60px-%E6%AC%A0-seal.svg.png new file mode 100644 index 0000000..a641e79 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AC%A0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-bigseal.svg.png new file mode 100644 index 0000000..1bd6521 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-bronze-shang.svg.png new file mode 100644 index 0000000..7e801ae Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-bronze.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-bronze.svg.png new file mode 100644 index 0000000..634ce62 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-oracle.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-oracle.svg.png new file mode 100644 index 0000000..bf7a4ec Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-seal.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-seal.svg.png new file mode 100644 index 0000000..1bcaeb8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-silk.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-silk.svg.png new file mode 100644 index 0000000..b678d94 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%A2-slip.svg.png b/server/routers/bushou/images/60px-%E6%AD%A2-slip.svg.png new file mode 100644 index 0000000..bef2898 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%A2-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%B9-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AD%B9-bigseal.svg.png new file mode 100644 index 0000000..2d4c294 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%B9-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E6%AD%B9-oracle.svg.png new file mode 100644 index 0000000..63610d4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AD%B9-seal.svg.png b/server/routers/bushou/images/60px-%E6%AD%B9-seal.svg.png new file mode 100644 index 0000000..4826cd8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AD%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AE%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AE%B3-bigseal.svg.png new file mode 100644 index 0000000..f3ee9f5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AE%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AE%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E6%AE%B3-bronze.svg.png new file mode 100644 index 0000000..c551598 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AE%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AE%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E6%AE%B3-oracle.svg.png new file mode 100644 index 0000000..19124d7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AE%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AE%B3-seal.svg.png b/server/routers/bushou/images/60px-%E6%AE%B3-seal.svg.png new file mode 100644 index 0000000..9c7bbc3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AE%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AE%B3-slip.svg.png b/server/routers/bushou/images/60px-%E6%AE%B3-slip.svg.png new file mode 100644 index 0000000..70b9825 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AE%B3-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AF%8B-bigseal.svg.png new file mode 100644 index 0000000..1ae39cd Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E6%AF%8B-bronze.svg.png new file mode 100644 index 0000000..3a0d7e1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%8B-seal.svg.png b/server/routers/bushou/images/60px-%E6%AF%8B-seal.svg.png new file mode 100644 index 0000000..a603f02 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%94-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AF%94-bigseal.svg.png new file mode 100644 index 0000000..e3af9af Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%94-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%94-bronze.svg.png b/server/routers/bushou/images/60px-%E6%AF%94-bronze.svg.png new file mode 100644 index 0000000..46095a5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%94-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%94-oracle.svg.png b/server/routers/bushou/images/60px-%E6%AF%94-oracle.svg.png new file mode 100644 index 0000000..16acf68 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%94-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%94-seal.svg.png b/server/routers/bushou/images/60px-%E6%AF%94-seal.svg.png new file mode 100644 index 0000000..fe1c57a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%94-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%94-silk.svg.png b/server/routers/bushou/images/60px-%E6%AF%94-silk.svg.png new file mode 100644 index 0000000..a4ef4be Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%94-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%AF%9B-bigseal.svg.png new file mode 100644 index 0000000..d25e912 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%9B-bronze.svg.png b/server/routers/bushou/images/60px-%E6%AF%9B-bronze.svg.png new file mode 100644 index 0000000..196a6a1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%9B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%9B-seal.svg.png b/server/routers/bushou/images/60px-%E6%AF%9B-seal.svg.png new file mode 100644 index 0000000..e0a7a3d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%AF%9B-silk.svg.png b/server/routers/bushou/images/60px-%E6%AF%9B-silk.svg.png new file mode 100644 index 0000000..f4c724a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%AF%9B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%8F-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%B0%8F-bigseal.svg.png new file mode 100644 index 0000000..d9e4ee2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%8F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%8F-bronze.svg.png b/server/routers/bushou/images/60px-%E6%B0%8F-bronze.svg.png new file mode 100644 index 0000000..210023f Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%8F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%8F-oracle.svg.png b/server/routers/bushou/images/60px-%E6%B0%8F-oracle.svg.png new file mode 100644 index 0000000..10ad161 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%8F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%8F-seal.svg.png b/server/routers/bushou/images/60px-%E6%B0%8F-seal.svg.png new file mode 100644 index 0000000..775cb41 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%8F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%8F-silk.svg.png b/server/routers/bushou/images/60px-%E6%B0%8F-silk.svg.png new file mode 100644 index 0000000..c8988a4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%8F-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-bigseal.svg.png new file mode 100644 index 0000000..d68921d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-bronze-spring.svg.png new file mode 100644 index 0000000..90ae32b Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-bronze.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-bronze.svg.png new file mode 100644 index 0000000..d7c29c3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-oracle.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-oracle.svg.png new file mode 100644 index 0000000..d5dfd31 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-seal.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-seal.svg.png new file mode 100644 index 0000000..4f7a84a Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-silk.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-silk.svg.png new file mode 100644 index 0000000..9561233 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%94-slip.svg.png b/server/routers/bushou/images/60px-%E6%B0%94-slip.svg.png new file mode 100644 index 0000000..5a043e8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%94-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-bigseal.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-bigseal.svg.png new file mode 100644 index 0000000..0dc2f8d Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-bronze-warring.svg.png new file mode 100644 index 0000000..936d2eb Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-bronze.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-bronze.svg.png new file mode 100644 index 0000000..d1ab959 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-oracle.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-oracle.svg.png new file mode 100644 index 0000000..f275afc Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-seal.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-seal.svg.png new file mode 100644 index 0000000..35083e2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-silk.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-silk.svg.png new file mode 100644 index 0000000..3af8d0e Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E6%B0%B4-slip.svg.png b/server/routers/bushou/images/60px-%E6%B0%B4-slip.svg.png new file mode 100644 index 0000000..55a0669 Binary files /dev/null and b/server/routers/bushou/images/60px-%E6%B0%B4-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-bigseal.svg.png new file mode 100644 index 0000000..792f45e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-bronze-spring.svg.png new file mode 100644 index 0000000..9aaa5a3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-bronze.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-bronze.svg.png new file mode 100644 index 0000000..1d2c950 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-oracle.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-oracle.svg.png new file mode 100644 index 0000000..1e9ec25 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-seal.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-seal.svg.png new file mode 100644 index 0000000..663bb85 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-silk.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-silk.svg.png new file mode 100644 index 0000000..49384b0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%81%AB-slip.svg.png b/server/routers/bushou/images/60px-%E7%81%AB-slip.svg.png new file mode 100644 index 0000000..569b542 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%81%AB-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%84%A1-seal.svg.png b/server/routers/bushou/images/60px-%E7%84%A1-seal.svg.png new file mode 100644 index 0000000..569230f Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%84%A1-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%AA-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%88%AA-bigseal.svg.png new file mode 100644 index 0000000..96323df Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%AA-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%AA-bronze.svg.png b/server/routers/bushou/images/60px-%E7%88%AA-bronze.svg.png new file mode 100644 index 0000000..05be574 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%AA-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%AA-oracle.svg.png b/server/routers/bushou/images/60px-%E7%88%AA-oracle.svg.png new file mode 100644 index 0000000..ea671be Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%AA-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%AA-seal.svg.png b/server/routers/bushou/images/60px-%E7%88%AA-seal.svg.png new file mode 100644 index 0000000..fef52be Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%AA-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%B6-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%88%B6-bigseal.svg.png new file mode 100644 index 0000000..81ee3b8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%B6-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%B6-bronze.svg.png b/server/routers/bushou/images/60px-%E7%88%B6-bronze.svg.png new file mode 100644 index 0000000..ee29f69 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%B6-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%B6-oracle.svg.png b/server/routers/bushou/images/60px-%E7%88%B6-oracle.svg.png new file mode 100644 index 0000000..74106ca Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%B6-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%B6-seal.svg.png b/server/routers/bushou/images/60px-%E7%88%B6-seal.svg.png new file mode 100644 index 0000000..4655f8b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%B6-silk.svg.png b/server/routers/bushou/images/60px-%E7%88%B6-silk.svg.png new file mode 100644 index 0000000..8f3d2df Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%B6-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BB-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%88%BB-bigseal.svg.png new file mode 100644 index 0000000..290020d Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BB-bronze.svg.png b/server/routers/bushou/images/60px-%E7%88%BB-bronze.svg.png new file mode 100644 index 0000000..0ddd1cb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BB-oracle.svg.png b/server/routers/bushou/images/60px-%E7%88%BB-oracle.svg.png new file mode 100644 index 0000000..caa09aa Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BB-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BB-seal.svg.png b/server/routers/bushou/images/60px-%E7%88%BB-seal.svg.png new file mode 100644 index 0000000..ac2a64b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BF-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%88%BF-bronze-shang.svg.png new file mode 100644 index 0000000..416ce29 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BF-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%88%BF-oracle.svg.png b/server/routers/bushou/images/60px-%E7%88%BF-oracle.svg.png new file mode 100644 index 0000000..9757ad2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%88%BF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%80-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E7%89%80-bronze-warring.svg.png new file mode 100644 index 0000000..354035e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%80-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%80-silk.svg.png b/server/routers/bushou/images/60px-%E7%89%80-silk.svg.png new file mode 100644 index 0000000..2566ef3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%80-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%80-slip.svg.png b/server/routers/bushou/images/60px-%E7%89%80-slip.svg.png new file mode 100644 index 0000000..14da129 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%80-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%87-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%89%87-bigseal.svg.png new file mode 100644 index 0000000..2d1446a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%87-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%87-seal.svg.png b/server/routers/bushou/images/60px-%E7%89%87-seal.svg.png new file mode 100644 index 0000000..e01f1e3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%87-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%99-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%89%99-bigseal.svg.png new file mode 100644 index 0000000..4475997 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%99-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%99-bronze.svg.png b/server/routers/bushou/images/60px-%E7%89%99-bronze.svg.png new file mode 100644 index 0000000..986e597 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%99-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%99-seal.svg.png b/server/routers/bushou/images/60px-%E7%89%99-seal.svg.png new file mode 100644 index 0000000..5e726ad Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%99-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%89%9B-bigseal.svg.png new file mode 100644 index 0000000..4013506 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%9B-bronze.svg.png b/server/routers/bushou/images/60px-%E7%89%9B-bronze.svg.png new file mode 100644 index 0000000..0d7b2e1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%9B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%9B-oracle.svg.png b/server/routers/bushou/images/60px-%E7%89%9B-oracle.svg.png new file mode 100644 index 0000000..1f68f0c Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%9B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%9B-seal.svg.png b/server/routers/bushou/images/60px-%E7%89%9B-seal.svg.png new file mode 100644 index 0000000..6531b37 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%89%9B-silk.svg.png b/server/routers/bushou/images/60px-%E7%89%9B-silk.svg.png new file mode 100644 index 0000000..280b6fa Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%89%9B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-bigseal.svg.png new file mode 100644 index 0000000..5e22ee9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-bronze-shang.svg.png new file mode 100644 index 0000000..5936619 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-bronze.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-bronze.svg.png new file mode 100644 index 0000000..331284e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-oracle.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-oracle.svg.png new file mode 100644 index 0000000..7ed6c0f Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-seal.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-seal.svg.png new file mode 100644 index 0000000..6cf2b1a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8A%AC-silk.svg.png b/server/routers/bushou/images/60px-%E7%8A%AC-silk.svg.png new file mode 100644 index 0000000..f760f9a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8A%AC-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%84-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%8E%84-bigseal.svg.png new file mode 100644 index 0000000..0ecff12 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%84-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%84-bronze.svg.png b/server/routers/bushou/images/60px-%E7%8E%84-bronze.svg.png new file mode 100644 index 0000000..8a5d6cd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%84-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%84-seal.svg.png b/server/routers/bushou/images/60px-%E7%8E%84-seal.svg.png new file mode 100644 index 0000000..3b5e4e3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%84-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-ancient.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-ancient.svg.png new file mode 100644 index 0000000..44d7b91 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-bigseal.svg.png new file mode 100644 index 0000000..7f00a39 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-bronze-shang.svg.png new file mode 100644 index 0000000..c09b75a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-bronze-spring.svg.png new file mode 100644 index 0000000..fd08565 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-bronze-warring.svg.png new file mode 100644 index 0000000..883b4e7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-bronze.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-bronze.svg.png new file mode 100644 index 0000000..88f4a6a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-clerical.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-clerical.svg.png new file mode 100644 index 0000000..9a7919b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-oracle.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-oracle.svg.png new file mode 100644 index 0000000..2c47350 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-seal.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-seal.svg.png new file mode 100644 index 0000000..f30726a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-silk.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-silk.svg.png new file mode 100644 index 0000000..fd112fd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%8E%89-slip.svg.png b/server/routers/bushou/images/60px-%E7%8E%89-slip.svg.png new file mode 100644 index 0000000..6090319 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%8E%89-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%9C-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%93%9C-bigseal.svg.png new file mode 100644 index 0000000..f54786e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%9C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%9C-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E7%93%9C-bronze-warring.svg.png new file mode 100644 index 0000000..32e811c Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%9C-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%9C-seal.svg.png b/server/routers/bushou/images/60px-%E7%93%9C-seal.svg.png new file mode 100644 index 0000000..1587112 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%9C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%A6-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%93%A6-bigseal.svg.png new file mode 100644 index 0000000..091fbff Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%A6-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%A6-seal.svg.png b/server/routers/bushou/images/60px-%E7%93%A6-seal.svg.png new file mode 100644 index 0000000..7a5e020 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%A6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%93%A6-silk.svg.png b/server/routers/bushou/images/60px-%E7%93%A6-silk.svg.png new file mode 100644 index 0000000..5b5476a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%93%A6-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%98-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%94%98-bigseal.svg.png new file mode 100644 index 0000000..376c2fb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%98-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%98-bronze.svg.png b/server/routers/bushou/images/60px-%E7%94%98-bronze.svg.png new file mode 100644 index 0000000..97807ed Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%98-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%98-oracle.svg.png b/server/routers/bushou/images/60px-%E7%94%98-oracle.svg.png new file mode 100644 index 0000000..8d8c833 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%98-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%98-seal.svg.png b/server/routers/bushou/images/60px-%E7%94%98-seal.svg.png new file mode 100644 index 0000000..c32aa67 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%98-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%9F-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%94%9F-bigseal.svg.png new file mode 100644 index 0000000..ae8db62 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%9F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%9F-bronze.svg.png b/server/routers/bushou/images/60px-%E7%94%9F-bronze.svg.png new file mode 100644 index 0000000..7b83f53 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%9F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%9F-oracle.svg.png b/server/routers/bushou/images/60px-%E7%94%9F-oracle.svg.png new file mode 100644 index 0000000..b55cdfe Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%9F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%9F-seal.svg.png b/server/routers/bushou/images/60px-%E7%94%9F-seal.svg.png new file mode 100644 index 0000000..8f947e3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%9F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-ancient.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-ancient.svg.png new file mode 100644 index 0000000..f6f3c6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-bigseal.svg.png new file mode 100644 index 0000000..74d53dd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-bronze-spring.svg.png new file mode 100644 index 0000000..0410a96 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-bronze-warring.svg.png new file mode 100644 index 0000000..fd7e520 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-bronze.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-bronze.svg.png new file mode 100644 index 0000000..1cab519 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-oracle.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-oracle.svg.png new file mode 100644 index 0000000..aaabfeb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-seal.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-seal.svg.png new file mode 100644 index 0000000..03977e9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-silk.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-silk.svg.png new file mode 100644 index 0000000..856f5bd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%A8-slip.svg.png b/server/routers/bushou/images/60px-%E7%94%A8-slip.svg.png new file mode 100644 index 0000000..fba0701 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%A8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-bigseal.svg.png new file mode 100644 index 0000000..3760d82 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-bronze-shang.svg.png new file mode 100644 index 0000000..9a617aa Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-bronze.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-bronze.svg.png new file mode 100644 index 0000000..3358385 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-oracle.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-oracle.svg.png new file mode 100644 index 0000000..13fcd87 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-seal.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-seal.svg.png new file mode 100644 index 0000000..376a4d7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%94%B0-silk.svg.png b/server/routers/bushou/images/60px-%E7%94%B0-silk.svg.png new file mode 100644 index 0000000..2afe6d3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%94%B0-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%96%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%96%8B-bigseal.svg.png new file mode 100644 index 0000000..31ec00f Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%96%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%96%8B-seal.svg.png b/server/routers/bushou/images/60px-%E7%96%8B-seal.svg.png new file mode 100644 index 0000000..d587d72 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%96%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%96%92-bronze.svg.png b/server/routers/bushou/images/60px-%E7%96%92-bronze.svg.png new file mode 100644 index 0000000..5a8c4ac Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%96%92-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%96%92-oracle.svg.png b/server/routers/bushou/images/60px-%E7%96%92-oracle.svg.png new file mode 100644 index 0000000..62c58f6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%96%92-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%96%92-seal.svg.png b/server/routers/bushou/images/60px-%E7%96%92-seal.svg.png new file mode 100644 index 0000000..fdf82b0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%96%92-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%99%B6-seal.svg.png b/server/routers/bushou/images/60px-%E7%99%B6-seal.svg.png new file mode 100644 index 0000000..791f0bb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%99%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%99%BD-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%99%BD-bigseal.svg.png new file mode 100644 index 0000000..3531b11 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%99%BD-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%99%BD-bronze.svg.png b/server/routers/bushou/images/60px-%E7%99%BD-bronze.svg.png new file mode 100644 index 0000000..5d28d0b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%99%BD-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%99%BD-oracle.svg.png b/server/routers/bushou/images/60px-%E7%99%BD-oracle.svg.png new file mode 100644 index 0000000..6e8bc33 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%99%BD-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%99%BD-seal.svg.png b/server/routers/bushou/images/60px-%E7%99%BD-seal.svg.png new file mode 100644 index 0000000..1d63b6a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%99%BD-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%AE-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9A%AE-bigseal.svg.png new file mode 100644 index 0000000..355433f Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%AE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%AE-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9A%AE-bronze.svg.png new file mode 100644 index 0000000..7ec4b6a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%AE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%AE-seal.svg.png b/server/routers/bushou/images/60px-%E7%9A%AE-seal.svg.png new file mode 100644 index 0000000..93a1dde Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%AE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9A%BF-bigseal.svg.png new file mode 100644 index 0000000..3dc8e14 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%BF-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9A%BF-bronze.svg.png new file mode 100644 index 0000000..b643a34 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%BF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%BF-oracle.svg.png b/server/routers/bushou/images/60px-%E7%9A%BF-oracle.svg.png new file mode 100644 index 0000000..381a22b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%BF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9A%BF-seal.svg.png b/server/routers/bushou/images/60px-%E7%9A%BF-seal.svg.png new file mode 100644 index 0000000..b579497 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9A%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-ancient.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-ancient.svg.png new file mode 100644 index 0000000..1b72988 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-bigseal.svg.png new file mode 100644 index 0000000..cf697db Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-bronze.svg.png new file mode 100644 index 0000000..2ee729e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-oracle.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-oracle.svg.png new file mode 100644 index 0000000..73fa55b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-seal.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-seal.svg.png new file mode 100644 index 0000000..b1653d6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9B%AE-slip.svg.png b/server/routers/bushou/images/60px-%E7%9B%AE-slip.svg.png new file mode 100644 index 0000000..63c6840 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9B%AE-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9F%9B-bigseal.svg.png new file mode 100644 index 0000000..6217df8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%9B-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9F%9B-bronze.svg.png new file mode 100644 index 0000000..ff1fb0b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%9B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%9B-seal.svg.png b/server/routers/bushou/images/60px-%E7%9F%9B-seal.svg.png new file mode 100644 index 0000000..fb548f2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%A2-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9F%A2-bigseal.svg.png new file mode 100644 index 0000000..1221b29 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%A2-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%A2-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9F%A2-bronze.svg.png new file mode 100644 index 0000000..4a7b158 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%A2-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%A2-oracle.svg.png b/server/routers/bushou/images/60px-%E7%9F%A2-oracle.svg.png new file mode 100644 index 0000000..e976acd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%A2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%A2-seal.svg.png b/server/routers/bushou/images/60px-%E7%9F%A2-seal.svg.png new file mode 100644 index 0000000..6dd2367 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%A2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%9F%B3-bigseal.svg.png new file mode 100644 index 0000000..a6d0c06 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E7%9F%B3-bronze.svg.png new file mode 100644 index 0000000..8928a08 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E7%9F%B3-oracle.svg.png new file mode 100644 index 0000000..12b29dd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%B3-seal.svg.png b/server/routers/bushou/images/60px-%E7%9F%B3-seal.svg.png new file mode 100644 index 0000000..efbc5e4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%9F%B3-silk.svg.png b/server/routers/bushou/images/60px-%E7%9F%B3-silk.svg.png new file mode 100644 index 0000000..ff514ba Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%9F%B3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-ancient.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-ancient.svg.png new file mode 100644 index 0000000..b317519 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-bigseal.svg.png new file mode 100644 index 0000000..6d0add0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-bronze-shang.svg.png new file mode 100644 index 0000000..4aaf08a Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-oracle.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-oracle.svg.png new file mode 100644 index 0000000..6fc40b5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-seal.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-seal.svg.png new file mode 100644 index 0000000..648dad5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A4%BA-silk.svg.png b/server/routers/bushou/images/60px-%E7%A4%BA-silk.svg.png new file mode 100644 index 0000000..79e90aa Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A4%BA-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A6%B8-seal.svg.png b/server/routers/bushou/images/60px-%E7%A6%B8-seal.svg.png new file mode 100644 index 0000000..c888da9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A6%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A6%BE-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%A6%BE-bigseal.svg.png new file mode 100644 index 0000000..c7e29a0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A6%BE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A6%BE-bronze.svg.png b/server/routers/bushou/images/60px-%E7%A6%BE-bronze.svg.png new file mode 100644 index 0000000..b9e46c8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A6%BE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A6%BE-oracle.svg.png b/server/routers/bushou/images/60px-%E7%A6%BE-oracle.svg.png new file mode 100644 index 0000000..77b35f1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A6%BE-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A6%BE-seal.svg.png b/server/routers/bushou/images/60px-%E7%A6%BE-seal.svg.png new file mode 100644 index 0000000..e3ed39f Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A6%BE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A9%B4-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%A9%B4-bigseal.svg.png new file mode 100644 index 0000000..7203f7b Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A9%B4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%A9%B4-seal.svg.png b/server/routers/bushou/images/60px-%E7%A9%B4-seal.svg.png new file mode 100644 index 0000000..08c0416 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%A9%B4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E7%AB%8B-bronze.svg.png new file mode 100644 index 0000000..8a0cd09 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%8B-oracle.svg.png b/server/routers/bushou/images/60px-%E7%AB%8B-oracle.svg.png new file mode 100644 index 0000000..b81ced1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%8B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%8B-seal.svg.png b/server/routers/bushou/images/60px-%E7%AB%8B-seal.svg.png new file mode 100644 index 0000000..054bc4e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-bigseal.svg.png new file mode 100644 index 0000000..d2c691c Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-bronze-shang.svg.png new file mode 100644 index 0000000..e4abadb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-bronze-warring.svg.png new file mode 100644 index 0000000..75cc2bc Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-bronze.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-bronze.svg.png new file mode 100644 index 0000000..3b2f4cf Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-oracle.svg.png new file mode 100644 index 0000000..aca422c Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-seal.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-seal.svg.png new file mode 100644 index 0000000..8353acd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-silk.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-silk.svg.png new file mode 100644 index 0000000..3984da1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%AB%B9-slip.svg.png b/server/routers/bushou/images/60px-%E7%AB%B9-slip.svg.png new file mode 100644 index 0000000..029cbf3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%AB%B9-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-bigseal.svg.png new file mode 100644 index 0000000..0afbd68 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-bronze.svg.png new file mode 100644 index 0000000..1dda7d3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-oracle.svg.png new file mode 100644 index 0000000..4ec6233 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-seal.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-seal.svg.png new file mode 100644 index 0000000..857ef95 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-silk.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-silk.svg.png new file mode 100644 index 0000000..5e42335 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B1%B3-slip.svg.png b/server/routers/bushou/images/60px-%E7%B1%B3-slip.svg.png new file mode 100644 index 0000000..ac43f10 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B1%B3-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B3%B8-ancient.svg.png b/server/routers/bushou/images/60px-%E7%B3%B8-ancient.svg.png new file mode 100644 index 0000000..8e71605 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B3%B8-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B3%B8-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E7%B3%B8-bronze-shang.svg.png new file mode 100644 index 0000000..19af2e7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B3%B8-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B3%B8-bronze.svg.png b/server/routers/bushou/images/60px-%E7%B3%B8-bronze.svg.png new file mode 100644 index 0000000..60dbde8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B3%B8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B3%B8-oracle.svg.png b/server/routers/bushou/images/60px-%E7%B3%B8-oracle.svg.png new file mode 100644 index 0000000..8465736 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B3%B8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%B3%B8-seal.svg.png b/server/routers/bushou/images/60px-%E7%B3%B8-seal.svg.png new file mode 100644 index 0000000..abd1f33 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%B3%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BC%B6-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%BC%B6-bigseal.svg.png new file mode 100644 index 0000000..4d060e6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BC%B6-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BC%B6-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E7%BC%B6-bronze-spring.svg.png new file mode 100644 index 0000000..745f228 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BC%B6-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BC%B6-oracle.svg.png b/server/routers/bushou/images/60px-%E7%BC%B6-oracle.svg.png new file mode 100644 index 0000000..521eb18 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BC%B6-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BC%B6-seal.svg.png b/server/routers/bushou/images/60px-%E7%BC%B6-seal.svg.png new file mode 100644 index 0000000..2379bbe Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BC%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%91-oracle.svg.png b/server/routers/bushou/images/60px-%E7%BD%91-oracle.svg.png new file mode 100644 index 0000000..6f09ab5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%91-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%91-seal.svg.png b/server/routers/bushou/images/60px-%E7%BD%91-seal.svg.png new file mode 100644 index 0000000..ac5a344 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%91-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%91-zhou.svg.png b/server/routers/bushou/images/60px-%E7%BD%91-zhou.svg.png new file mode 100644 index 0000000..050b9bc Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%91-zhou.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%94-ancient.svg.png b/server/routers/bushou/images/60px-%E7%BD%94-ancient.svg.png new file mode 100644 index 0000000..b195c2e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%94-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%94-silk.svg.png b/server/routers/bushou/images/60px-%E7%BD%94-silk.svg.png new file mode 100644 index 0000000..d315efb Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%94-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BD%94-slip.svg.png b/server/routers/bushou/images/60px-%E7%BD%94-slip.svg.png new file mode 100644 index 0000000..24a305e Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BD%94-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%8A-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%BE%8A-bigseal.svg.png new file mode 100644 index 0000000..032d351 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%8A-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%8A-bronze.svg.png b/server/routers/bushou/images/60px-%E7%BE%8A-bronze.svg.png new file mode 100644 index 0000000..e649776 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%8A-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%8A-oracle.svg.png b/server/routers/bushou/images/60px-%E7%BE%8A-oracle.svg.png new file mode 100644 index 0000000..3b906b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%8A-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%8A-seal.svg.png b/server/routers/bushou/images/60px-%E7%BE%8A-seal.svg.png new file mode 100644 index 0000000..347cb59 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%8A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%BD-bigseal.svg.png b/server/routers/bushou/images/60px-%E7%BE%BD-bigseal.svg.png new file mode 100644 index 0000000..9b181a0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%BD-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%BD-bronze.svg.png b/server/routers/bushou/images/60px-%E7%BE%BD-bronze.svg.png new file mode 100644 index 0000000..3b5978c Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%BD-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%BD-oracle.svg.png b/server/routers/bushou/images/60px-%E7%BE%BD-oracle.svg.png new file mode 100644 index 0000000..7801cf5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%BD-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E7%BE%BD-seal.svg.png b/server/routers/bushou/images/60px-%E7%BE%BD-seal.svg.png new file mode 100644 index 0000000..9ce1cbd Binary files /dev/null and b/server/routers/bushou/images/60px-%E7%BE%BD-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%81-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%80%81-bigseal.svg.png new file mode 100644 index 0000000..8c9a0c5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%81-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%81-bronze.svg.png b/server/routers/bushou/images/60px-%E8%80%81-bronze.svg.png new file mode 100644 index 0000000..b99072c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%81-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%81-oracle.svg.png b/server/routers/bushou/images/60px-%E8%80%81-oracle.svg.png new file mode 100644 index 0000000..5e48e18 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%81-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%81-seal.svg.png b/server/routers/bushou/images/60px-%E8%80%81-seal.svg.png new file mode 100644 index 0000000..6894951 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%81-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%81-silk.svg.png b/server/routers/bushou/images/60px-%E8%80%81-silk.svg.png new file mode 100644 index 0000000..be1ea33 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%81-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%8C-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%80%8C-bigseal.svg.png new file mode 100644 index 0000000..24b4913 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%8C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%8C-bronze.svg.png b/server/routers/bushou/images/60px-%E8%80%8C-bronze.svg.png new file mode 100644 index 0000000..931f695 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%8C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%8C-oracle.svg.png b/server/routers/bushou/images/60px-%E8%80%8C-oracle.svg.png new file mode 100644 index 0000000..dfe3dd2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%8C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%8C-seal.svg.png b/server/routers/bushou/images/60px-%E8%80%8C-seal.svg.png new file mode 100644 index 0000000..6ca76e6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%92-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%80%92-bigseal.svg.png new file mode 100644 index 0000000..06ff900 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%92-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%92-seal.svg.png b/server/routers/bushou/images/60px-%E8%80%92-seal.svg.png new file mode 100644 index 0000000..a58f9ea Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%92-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-bigseal.svg.png new file mode 100644 index 0000000..0d5322b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-bronze-shang.svg.png new file mode 100644 index 0000000..2349caa Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-bronze.svg.png new file mode 100644 index 0000000..9b97d87 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-oracle.svg.png new file mode 100644 index 0000000..938c9e8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-seal.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-seal.svg.png new file mode 100644 index 0000000..c4f8f87 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-silk.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-silk.svg.png new file mode 100644 index 0000000..8267008 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%80%B3-slip.svg.png b/server/routers/bushou/images/60px-%E8%80%B3-slip.svg.png new file mode 100644 index 0000000..b677fa6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%80%B3-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%81%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%81%BF-bigseal.svg.png new file mode 100644 index 0000000..6662273 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%81%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%81%BF-bronze.svg.png b/server/routers/bushou/images/60px-%E8%81%BF-bronze.svg.png new file mode 100644 index 0000000..52861a5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%81%BF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%81%BF-oracle.svg.png b/server/routers/bushou/images/60px-%E8%81%BF-oracle.svg.png new file mode 100644 index 0000000..eef4ea2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%81%BF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%81%BF-seal.svg.png b/server/routers/bushou/images/60px-%E8%81%BF-seal.svg.png new file mode 100644 index 0000000..43933ae Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%81%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%82%89-bigseal.svg.png new file mode 100644 index 0000000..e13292a Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-bronze.svg.png b/server/routers/bushou/images/60px-%E8%82%89-bronze.svg.png new file mode 100644 index 0000000..e139087 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-clerical.svg.png b/server/routers/bushou/images/60px-%E8%82%89-clerical.svg.png new file mode 100644 index 0000000..499b01d Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-oracle.svg.png b/server/routers/bushou/images/60px-%E8%82%89-oracle.svg.png new file mode 100644 index 0000000..5cb8cb4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-seal.svg.png b/server/routers/bushou/images/60px-%E8%82%89-seal.svg.png new file mode 100644 index 0000000..6576ac4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-silk.svg.png b/server/routers/bushou/images/60px-%E8%82%89-silk.svg.png new file mode 100644 index 0000000..a3df651 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%82%89-slip.svg.png b/server/routers/bushou/images/60px-%E8%82%89-slip.svg.png new file mode 100644 index 0000000..f8974e5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%82%89-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%A3-bronze.svg.png b/server/routers/bushou/images/60px-%E8%87%A3-bronze.svg.png new file mode 100644 index 0000000..2fed30b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%A3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%A3-oracle.svg.png b/server/routers/bushou/images/60px-%E8%87%A3-oracle.svg.png new file mode 100644 index 0000000..ac51608 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%A3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%A3-seal.svg.png b/server/routers/bushou/images/60px-%E8%87%A3-seal.svg.png new file mode 100644 index 0000000..1f4d738 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%A3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%A3-silk.svg.png b/server/routers/bushou/images/60px-%E8%87%A3-silk.svg.png new file mode 100644 index 0000000..c701c06 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%A3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-ancient.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-ancient.svg.png new file mode 100644 index 0000000..ea08cba Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-bigseal.svg.png new file mode 100644 index 0000000..33b3de3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-bronze.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-bronze.svg.png new file mode 100644 index 0000000..f9e3446 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-oracle.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-oracle.svg.png new file mode 100644 index 0000000..0ca50d6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-seal.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-seal.svg.png new file mode 100644 index 0000000..0665164 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%AA-silk.svg.png b/server/routers/bushou/images/60px-%E8%87%AA-silk.svg.png new file mode 100644 index 0000000..e36b196 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%AA-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%87%B3-bigseal.svg.png new file mode 100644 index 0000000..9be4b7c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E8%87%B3-bronze.svg.png new file mode 100644 index 0000000..e137380 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E8%87%B3-oracle.svg.png new file mode 100644 index 0000000..b0385b3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%B3-seal.svg.png b/server/routers/bushou/images/60px-%E8%87%B3-seal.svg.png new file mode 100644 index 0000000..018a9dc Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%87%BC-seal.svg.png b/server/routers/bushou/images/60px-%E8%87%BC-seal.svg.png new file mode 100644 index 0000000..d7e96a2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%87%BC-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%8C-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%88%8C-bigseal.svg.png new file mode 100644 index 0000000..a44e9af Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%8C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%8C-oracle.svg.png b/server/routers/bushou/images/60px-%E8%88%8C-oracle.svg.png new file mode 100644 index 0000000..647f94d Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%8C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%8C-seal.svg.png b/server/routers/bushou/images/60px-%E8%88%8C-seal.svg.png new file mode 100644 index 0000000..f63bd69 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%88%9B-bigseal.svg.png new file mode 100644 index 0000000..f69eab6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9B-seal.svg.png b/server/routers/bushou/images/60px-%E8%88%9B-seal.svg.png new file mode 100644 index 0000000..ac9cd30 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9F-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%88%9F-bigseal.svg.png new file mode 100644 index 0000000..56bb69f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9F-bronze.svg.png b/server/routers/bushou/images/60px-%E8%88%9F-bronze.svg.png new file mode 100644 index 0000000..909412c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9F-oracle.svg.png b/server/routers/bushou/images/60px-%E8%88%9F-oracle.svg.png new file mode 100644 index 0000000..71dc69c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%88%9F-seal.svg.png b/server/routers/bushou/images/60px-%E8%88%9F-seal.svg.png new file mode 100644 index 0000000..63340d6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%88%9F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%AE-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%89%AE-bigseal.svg.png new file mode 100644 index 0000000..79561d6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%AE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%AE-bronze.svg.png b/server/routers/bushou/images/60px-%E8%89%AE-bronze.svg.png new file mode 100644 index 0000000..e7a7b1b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%AE-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%AE-seal.svg.png b/server/routers/bushou/images/60px-%E8%89%AE-seal.svg.png new file mode 100644 index 0000000..695bde7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%AE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-ancient.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-ancient.svg.png new file mode 100644 index 0000000..5b47bcb Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-bigseal.svg.png new file mode 100644 index 0000000..36931cb Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-bronze-spring.svg.png new file mode 100644 index 0000000..e747c01 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-seal.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-seal.svg.png new file mode 100644 index 0000000..04cce4f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-silk.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-silk.svg.png new file mode 100644 index 0000000..0f12bf2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B2-slip.svg.png b/server/routers/bushou/images/60px-%E8%89%B2-slip.svg.png new file mode 100644 index 0000000..3533b45 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B2-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%89%B8-seal.svg.png b/server/routers/bushou/images/60px-%E8%89%B8-seal.svg.png new file mode 100644 index 0000000..df6edd5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%89%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%8D-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%99%8D-bigseal.svg.png new file mode 100644 index 0000000..8a40b44 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%8D-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%8D-bronze.svg.png b/server/routers/bushou/images/60px-%E8%99%8D-bronze.svg.png new file mode 100644 index 0000000..83f5047 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%8D-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%8D-oracle.svg.png b/server/routers/bushou/images/60px-%E8%99%8D-oracle.svg.png new file mode 100644 index 0000000..94c4de3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%8D-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%8D-seal.svg.png b/server/routers/bushou/images/60px-%E8%99%8D-seal.svg.png new file mode 100644 index 0000000..f56f5bd Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%8D-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%AB-bronze.svg.png b/server/routers/bushou/images/60px-%E8%99%AB-bronze.svg.png new file mode 100644 index 0000000..33540b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%AB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%AB-oracle.svg.png b/server/routers/bushou/images/60px-%E8%99%AB-oracle.svg.png new file mode 100644 index 0000000..0a4c8e5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%AB-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%99%AB-seal.svg.png b/server/routers/bushou/images/60px-%E8%99%AB-seal.svg.png new file mode 100644 index 0000000..27d13b6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%99%AB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A1%80-bigseal.svg.png new file mode 100644 index 0000000..3b7c93f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%80-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A1%80-oracle.svg.png new file mode 100644 index 0000000..7c0546e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%80-seal.svg.png b/server/routers/bushou/images/60px-%E8%A1%80-seal.svg.png new file mode 100644 index 0000000..61bc86c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%80-silk.svg.png b/server/routers/bushou/images/60px-%E8%A1%80-silk.svg.png new file mode 100644 index 0000000..de228d9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%80-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%80-slip.svg.png b/server/routers/bushou/images/60px-%E8%A1%80-slip.svg.png new file mode 100644 index 0000000..976ac14 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%80-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-bigseal.svg.png new file mode 100644 index 0000000..6a47d2e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-bronze-spring.svg.png new file mode 100644 index 0000000..96a292a Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-bronze-warring.svg.png new file mode 100644 index 0000000..6bd936e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-bronze.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-bronze.svg.png new file mode 100644 index 0000000..5a138c6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-clerical.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-clerical.svg.png new file mode 100644 index 0000000..0a81bb9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-oracle.svg.png new file mode 100644 index 0000000..9ec0c8f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-seal.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-seal.svg.png new file mode 100644 index 0000000..5063f9f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-silk.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-silk.svg.png new file mode 100644 index 0000000..a199ad6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%8C-slip.svg.png b/server/routers/bushou/images/60px-%E8%A1%8C-slip.svg.png new file mode 100644 index 0000000..3a1267b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%8C-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%A3-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A1%A3-bigseal.svg.png new file mode 100644 index 0000000..2ed2ea2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%A3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%A3-bronze.svg.png b/server/routers/bushou/images/60px-%E8%A1%A3-bronze.svg.png new file mode 100644 index 0000000..1d39463 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%A3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%A3-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A1%A3-oracle.svg.png new file mode 100644 index 0000000..e1ef8f9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%A3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A1%A3-seal.svg.png b/server/routers/bushou/images/60px-%E8%A1%A3-seal.svg.png new file mode 100644 index 0000000..085e40f Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A1%A3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A5%BE-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A5%BE-bigseal.svg.png new file mode 100644 index 0000000..1bc885e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A5%BE-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A5%BE-seal.svg.png b/server/routers/bushou/images/60px-%E8%A5%BE-seal.svg.png new file mode 100644 index 0000000..d904cb1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A5%BE-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A6%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A6%8B-bigseal.svg.png new file mode 100644 index 0000000..383f6b0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A6%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A6%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E8%A6%8B-bronze.svg.png new file mode 100644 index 0000000..e6938bd Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A6%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A6%8B-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A6%8B-oracle.svg.png new file mode 100644 index 0000000..f9936fb Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A6%8B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A6%8B-seal.svg.png b/server/routers/bushou/images/60px-%E8%A6%8B-seal.svg.png new file mode 100644 index 0000000..5ec7b58 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A6%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A6%8B-silk.svg.png b/server/routers/bushou/images/60px-%E8%A6%8B-silk.svg.png new file mode 100644 index 0000000..7c9ca9d Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A6%8B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A7%92-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A7%92-bigseal.svg.png new file mode 100644 index 0000000..a256809 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A7%92-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A7%92-bronze.svg.png b/server/routers/bushou/images/60px-%E8%A7%92-bronze.svg.png new file mode 100644 index 0000000..f5ecdd6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A7%92-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A7%92-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A7%92-oracle.svg.png new file mode 100644 index 0000000..fdeddab Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A7%92-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A7%92-seal.svg.png b/server/routers/bushou/images/60px-%E8%A7%92-seal.svg.png new file mode 100644 index 0000000..9f6751b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A7%92-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A8%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%A8%80-bigseal.svg.png new file mode 100644 index 0000000..9ad9cd3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A8%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A8%80-bronze.svg.png b/server/routers/bushou/images/60px-%E8%A8%80-bronze.svg.png new file mode 100644 index 0000000..fecbc77 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A8%80-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A8%80-oracle.svg.png b/server/routers/bushou/images/60px-%E8%A8%80-oracle.svg.png new file mode 100644 index 0000000..6dec558 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A8%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%A8%80-seal.svg.png b/server/routers/bushou/images/60px-%E8%A8%80-seal.svg.png new file mode 100644 index 0000000..be957bf Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%A8%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B0%B7-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B0%B7-bigseal.svg.png new file mode 100644 index 0000000..d88e7ac Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B0%B7-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B0%B7-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B0%B7-bronze.svg.png new file mode 100644 index 0000000..0e48a50 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B0%B7-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B0%B7-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B0%B7-oracle.svg.png new file mode 100644 index 0000000..46af0ef Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B0%B7-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B0%B7-seal.svg.png b/server/routers/bushou/images/60px-%E8%B0%B7-seal.svg.png new file mode 100644 index 0000000..03d5787 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B0%B7-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%86-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B1%86-bigseal.svg.png new file mode 100644 index 0000000..12e478b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%86-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%86-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B1%86-bronze.svg.png new file mode 100644 index 0000000..9382b85 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%86-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%86-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B1%86-oracle.svg.png new file mode 100644 index 0000000..b16e41b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%86-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%86-seal.svg.png b/server/routers/bushou/images/60px-%E8%B1%86-seal.svg.png new file mode 100644 index 0000000..55607a5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%86-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%95-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B1%95-bigseal.svg.png new file mode 100644 index 0000000..b1ea05e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%95-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%95-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B1%95-bronze.svg.png new file mode 100644 index 0000000..8569229 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%95-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%95-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B1%95-oracle.svg.png new file mode 100644 index 0000000..4132708 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%95-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%95-seal.svg.png b/server/routers/bushou/images/60px-%E8%B1%95-seal.svg.png new file mode 100644 index 0000000..51a025b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%95-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%B8-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B1%B8-bigseal.svg.png new file mode 100644 index 0000000..5beffde Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%B8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%B8-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B1%B8-bronze.svg.png new file mode 100644 index 0000000..b8a6d18 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%B8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%B8-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B1%B8-oracle.svg.png new file mode 100644 index 0000000..7dcf033 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%B8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%B8-seal.svg.png b/server/routers/bushou/images/60px-%E8%B1%B8-seal.svg.png new file mode 100644 index 0000000..cea8c14 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%B8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B1%B8-slip.svg.png b/server/routers/bushou/images/60px-%E8%B1%B8-slip.svg.png new file mode 100644 index 0000000..85718fc Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B1%B8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B2%9D-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B2%9D-bigseal.svg.png new file mode 100644 index 0000000..117a0fc Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B2%9D-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B2%9D-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B2%9D-bronze.svg.png new file mode 100644 index 0000000..f817525 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B2%9D-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B2%9D-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B2%9D-oracle.svg.png new file mode 100644 index 0000000..8e6d7a4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B2%9D-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B2%9D-seal.svg.png b/server/routers/bushou/images/60px-%E8%B2%9D-seal.svg.png new file mode 100644 index 0000000..b5d0309 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B2%9D-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B2%9D-silk.svg.png b/server/routers/bushou/images/60px-%E8%B2%9D-silk.svg.png new file mode 100644 index 0000000..7c7ce2a Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B2%9D-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-ancient.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-ancient.svg.png new file mode 100644 index 0000000..265c10c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-bigseal.svg.png new file mode 100644 index 0000000..23ac7ea Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-bronze-spring.svg.png new file mode 100644 index 0000000..105aa5d Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-bronze.svg.png new file mode 100644 index 0000000..2ce70c7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-oracle.svg.png new file mode 100644 index 0000000..07c815c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-seal.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-seal.svg.png new file mode 100644 index 0000000..a01c625 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-silk.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-silk.svg.png new file mode 100644 index 0000000..795560b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%A4-slip.svg.png b/server/routers/bushou/images/60px-%E8%B5%A4-slip.svg.png new file mode 100644 index 0000000..06332f6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%A4-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-bigseal.svg.png new file mode 100644 index 0000000..8d39f99 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-bronze-spring.svg.png new file mode 100644 index 0000000..bf15f74 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-bronze-warring.svg.png new file mode 100644 index 0000000..5895db6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-bronze.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-bronze.svg.png new file mode 100644 index 0000000..e181ead Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-oracle.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-oracle.svg.png new file mode 100644 index 0000000..3e5e250 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-seal.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-seal.svg.png new file mode 100644 index 0000000..c74694a Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-silk.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-silk.svg.png new file mode 100644 index 0000000..a948597 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B5%B0-slip.svg.png b/server/routers/bushou/images/60px-%E8%B5%B0-slip.svg.png new file mode 100644 index 0000000..72275eb Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B5%B0-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%B6%B3-seal.svg.png b/server/routers/bushou/images/60px-%E8%B6%B3-seal.svg.png new file mode 100644 index 0000000..e0062b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%B6%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BA%AB-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%BA%AB-bigseal.svg.png new file mode 100644 index 0000000..f58166c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BA%AB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BA%AB-bronze.svg.png b/server/routers/bushou/images/60px-%E8%BA%AB-bronze.svg.png new file mode 100644 index 0000000..0c6885e Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BA%AB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BA%AB-seal.svg.png b/server/routers/bushou/images/60px-%E8%BA%AB-seal.svg.png new file mode 100644 index 0000000..e89afd6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BA%AB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-bigseal.svg.png new file mode 100644 index 0000000..6bca2b6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-shang.svg.png new file mode 100644 index 0000000..54498df Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-spring.svg.png new file mode 100644 index 0000000..b13396b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-warring.svg.png new file mode 100644 index 0000000..342fa98 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-bronze.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-bronze.svg.png new file mode 100644 index 0000000..84e6e04 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-oracle.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-oracle.svg.png new file mode 100644 index 0000000..75c3945 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-seal.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-seal.svg.png new file mode 100644 index 0000000..a3e4922 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-silk.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-silk.svg.png new file mode 100644 index 0000000..cd2f664 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-slip.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-slip.svg.png new file mode 100644 index 0000000..0bbd6d0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BB%8A-zhou.svg.png b/server/routers/bushou/images/60px-%E8%BB%8A-zhou.svg.png new file mode 100644 index 0000000..d62328c Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BB%8A-zhou.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%9B-seal.svg.png b/server/routers/bushou/images/60px-%E8%BE%9B-seal.svg.png new file mode 100644 index 0000000..8a4e808 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%B0-bigseal.svg.png b/server/routers/bushou/images/60px-%E8%BE%B0-bigseal.svg.png new file mode 100644 index 0000000..7edaf1a Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%B0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%B0-bronze.svg.png b/server/routers/bushou/images/60px-%E8%BE%B0-bronze.svg.png new file mode 100644 index 0000000..13822f4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%B0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%B0-oracle.svg.png b/server/routers/bushou/images/60px-%E8%BE%B0-oracle.svg.png new file mode 100644 index 0000000..562737b Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%B0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%B0-seal.svg.png b/server/routers/bushou/images/60px-%E8%BE%B0-seal.svg.png new file mode 100644 index 0000000..5e5b1f3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%B0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E8%BE%B5-seal.svg.png b/server/routers/bushou/images/60px-%E8%BE%B5-seal.svg.png new file mode 100644 index 0000000..d155657 Binary files /dev/null and b/server/routers/bushou/images/60px-%E8%BE%B5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%82%91-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%82%91-bigseal.svg.png new file mode 100644 index 0000000..a2e5ca6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%82%91-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%82%91-bronze.svg.png b/server/routers/bushou/images/60px-%E9%82%91-bronze.svg.png new file mode 100644 index 0000000..a577843 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%82%91-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%82%91-oracle.svg.png b/server/routers/bushou/images/60px-%E9%82%91-oracle.svg.png new file mode 100644 index 0000000..21302fb Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%82%91-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%82%91-seal.svg.png b/server/routers/bushou/images/60px-%E9%82%91-seal.svg.png new file mode 100644 index 0000000..cf36be1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%82%91-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-ancient.svg.png b/server/routers/bushou/images/60px-%E9%85%89-ancient.svg.png new file mode 100644 index 0000000..e8d9388 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%85%89-bigseal.svg.png new file mode 100644 index 0000000..cb5f13c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%85%89-bronze-shang.svg.png new file mode 100644 index 0000000..ae0f720 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%85%89-bronze-spring.svg.png new file mode 100644 index 0000000..d5f5af2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E9%85%89-bronze-warring.svg.png new file mode 100644 index 0000000..faa0029 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-bronze.svg.png b/server/routers/bushou/images/60px-%E9%85%89-bronze.svg.png new file mode 100644 index 0000000..389a558 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-oracle.svg.png b/server/routers/bushou/images/60px-%E9%85%89-oracle.svg.png new file mode 100644 index 0000000..f038df5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-seal.svg.png b/server/routers/bushou/images/60px-%E9%85%89-seal.svg.png new file mode 100644 index 0000000..5ef1e25 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-silk.svg.png b/server/routers/bushou/images/60px-%E9%85%89-silk.svg.png new file mode 100644 index 0000000..85fe89e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%85%89-slip.svg.png b/server/routers/bushou/images/60px-%E9%85%89-slip.svg.png new file mode 100644 index 0000000..76d19b6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%85%89-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%86-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%87%86-bigseal.svg.png new file mode 100644 index 0000000..3e5f378 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%86-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%86-bronze.svg.png b/server/routers/bushou/images/60px-%E9%87%86-bronze.svg.png new file mode 100644 index 0000000..94649ee Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%86-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%86-oracle.svg.png b/server/routers/bushou/images/60px-%E9%87%86-oracle.svg.png new file mode 100644 index 0000000..84af0ee Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%86-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%86-seal.svg.png b/server/routers/bushou/images/60px-%E9%87%86-seal.svg.png new file mode 100644 index 0000000..1f076af Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%86-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%8C-seal.svg.png b/server/routers/bushou/images/60px-%E9%87%8C-seal.svg.png new file mode 100644 index 0000000..3222d11 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%8C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%91-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%87%91-bigseal.svg.png new file mode 100644 index 0000000..4dd2bb4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%91-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%91-bronze.svg.png b/server/routers/bushou/images/60px-%E9%87%91-bronze.svg.png new file mode 100644 index 0000000..03a5fd5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%91-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%87%91-seal.svg.png b/server/routers/bushou/images/60px-%E9%87%91-seal.svg.png new file mode 100644 index 0000000..7272db4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%87%91-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%95%B7-seal.svg.png b/server/routers/bushou/images/60px-%E9%95%B7-seal.svg.png new file mode 100644 index 0000000..fc76637 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%95%B7-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%96%80-bigseal.svg.png new file mode 100644 index 0000000..cab7e3f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%96%80-bronze-shang.svg.png new file mode 100644 index 0000000..5a78686 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-bronze.svg.png b/server/routers/bushou/images/60px-%E9%96%80-bronze.svg.png new file mode 100644 index 0000000..fdd947d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-oracle.svg.png b/server/routers/bushou/images/60px-%E9%96%80-oracle.svg.png new file mode 100644 index 0000000..a379e6e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-seal.svg.png b/server/routers/bushou/images/60px-%E9%96%80-seal.svg.png new file mode 100644 index 0000000..3319280 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-silk.svg.png b/server/routers/bushou/images/60px-%E9%96%80-silk.svg.png new file mode 100644 index 0000000..41d49e0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%96%80-slip.svg.png b/server/routers/bushou/images/60px-%E9%96%80-slip.svg.png new file mode 100644 index 0000000..9cf1974 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%96%80-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%98%9C-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%98%9C-bigseal.svg.png new file mode 100644 index 0000000..fa3971d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%98%9C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%98%9C-oracle.svg.png b/server/routers/bushou/images/60px-%E9%98%9C-oracle.svg.png new file mode 100644 index 0000000..84adf08 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%98%9C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%98%9C-seal.svg.png b/server/routers/bushou/images/60px-%E9%98%9C-seal.svg.png new file mode 100644 index 0000000..e08a56e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%98%9C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9A%B6-seal.svg.png b/server/routers/bushou/images/60px-%E9%9A%B6-seal.svg.png new file mode 100644 index 0000000..2b4ed90 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9A%B6-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9A%B9-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%9A%B9-bigseal.svg.png new file mode 100644 index 0000000..23862a6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9A%B9-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9A%B9-bronze.svg.png b/server/routers/bushou/images/60px-%E9%9A%B9-bronze.svg.png new file mode 100644 index 0000000..f2768c6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9A%B9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9A%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E9%9A%B9-oracle.svg.png new file mode 100644 index 0000000..afae1ef Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9A%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9A%B9-seal.svg.png b/server/routers/bushou/images/60px-%E9%9A%B9-seal.svg.png new file mode 100644 index 0000000..837eb44 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9A%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-ancient.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-ancient.svg.png new file mode 100644 index 0000000..e441973 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-bigseal.svg.png new file mode 100644 index 0000000..b78aa7b Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-bronze.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-bronze.svg.png new file mode 100644 index 0000000..4d36f72 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-oracle.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-oracle.svg.png new file mode 100644 index 0000000..ceb8b0f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-seal.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-seal.svg.png new file mode 100644 index 0000000..dade1f0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-silk.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-silk.svg.png new file mode 100644 index 0000000..7d10d61 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9B%A8-slip.svg.png b/server/routers/bushou/images/60px-%E9%9B%A8-slip.svg.png new file mode 100644 index 0000000..12300c9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9B%A8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9D%9E-seal.svg.png b/server/routers/bushou/images/60px-%E9%9D%9E-seal.svg.png new file mode 100644 index 0000000..bdad991 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9D%9E-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9D%A2-oracle.svg.png b/server/routers/bushou/images/60px-%E9%9D%A2-oracle.svg.png new file mode 100644 index 0000000..d1c4ea9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9D%A2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9D%A2-seal.svg.png b/server/routers/bushou/images/60px-%E9%9D%A2-seal.svg.png new file mode 100644 index 0000000..6bc3ba1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9D%A2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9D%A9-seal.svg.png b/server/routers/bushou/images/60px-%E9%9D%A9-seal.svg.png new file mode 100644 index 0000000..99c58b1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9D%A9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-bigseal.svg.png new file mode 100644 index 0000000..4b4019a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-bronze-shang.svg.png new file mode 100644 index 0000000..6ca3463 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-bronze-spring.svg.png new file mode 100644 index 0000000..e9979dc Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-bronze.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-bronze.svg.png new file mode 100644 index 0000000..9926663 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-oracle.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-oracle.svg.png new file mode 100644 index 0000000..3739f20 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-seal.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-seal.svg.png new file mode 100644 index 0000000..186ed5a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-silk.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-silk.svg.png new file mode 100644 index 0000000..44614d5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%8B-slip.svg.png b/server/routers/bushou/images/60px-%E9%9F%8B-slip.svg.png new file mode 100644 index 0000000..6cb3713 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%8B-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%AD-seal.svg.png b/server/routers/bushou/images/60px-%E9%9F%AD-seal.svg.png new file mode 100644 index 0000000..a61366e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%AD-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%B3-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%9F%B3-bigseal.svg.png new file mode 100644 index 0000000..2cf9e5c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%B3-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E9%9F%B3-bronze.svg.png new file mode 100644 index 0000000..8025dfa Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%B3-seal.svg.png b/server/routers/bushou/images/60px-%E9%9F%B3-seal.svg.png new file mode 100644 index 0000000..d1e18f7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%B3-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%9F%B3-silk.svg.png b/server/routers/bushou/images/60px-%E9%9F%B3-silk.svg.png new file mode 100644 index 0000000..015bc8d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%9F%B3-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A0%81-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A0%81-bigseal.svg.png new file mode 100644 index 0000000..5807b77 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A0%81-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A0%81-bronze.svg.png b/server/routers/bushou/images/60px-%E9%A0%81-bronze.svg.png new file mode 100644 index 0000000..0777a5f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A0%81-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A0%81-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A0%81-oracle.svg.png new file mode 100644 index 0000000..2bbb97e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A0%81-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A0%81-seal.svg.png b/server/routers/bushou/images/60px-%E9%A0%81-seal.svg.png new file mode 100644 index 0000000..bd29e2a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A0%81-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A0%81-silk.svg.png b/server/routers/bushou/images/60px-%E9%A0%81-silk.svg.png new file mode 100644 index 0000000..cd606f8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A0%81-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A2%A8-ancient.svg.png b/server/routers/bushou/images/60px-%E9%A2%A8-ancient.svg.png new file mode 100644 index 0000000..79305b4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A2%A8-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A2%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A2%A8-bigseal.svg.png new file mode 100644 index 0000000..f87c692 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A2%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A2%A8-seal.svg.png b/server/routers/bushou/images/60px-%E9%A2%A8-seal.svg.png new file mode 100644 index 0000000..cf29b44 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A2%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A2%A8-silk.svg.png b/server/routers/bushou/images/60px-%E9%A2%A8-silk.svg.png new file mode 100644 index 0000000..80b127e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A2%A8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A2%A8-slip.svg.png b/server/routers/bushou/images/60px-%E9%A2%A8-slip.svg.png new file mode 100644 index 0000000..6678528 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A2%A8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9B-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A3%9B-bigseal.svg.png new file mode 100644 index 0000000..62b53a9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9B-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9B-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A3%9B-oracle.svg.png new file mode 100644 index 0000000..414860e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9B-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9B-seal.svg.png b/server/routers/bushou/images/60px-%E9%A3%9B-seal.svg.png new file mode 100644 index 0000000..b82a20f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9B-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9B-silk.svg.png b/server/routers/bushou/images/60px-%E9%A3%9B-silk.svg.png new file mode 100644 index 0000000..e61960c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9B-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-bigseal.svg.png new file mode 100644 index 0000000..21075b6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-bronze-spring.svg.png new file mode 100644 index 0000000..07236e6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-bronze-warring.svg.png new file mode 100644 index 0000000..e4d4f57 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-bronze.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-bronze.svg.png new file mode 100644 index 0000000..cfc0ec3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-oracle.svg.png new file mode 100644 index 0000000..dd32ce7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-seal.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-seal.svg.png new file mode 100644 index 0000000..dea297c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-silk.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-silk.svg.png new file mode 100644 index 0000000..0f992ab Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A3%9F-slip.svg.png b/server/routers/bushou/images/60px-%E9%A3%9F-slip.svg.png new file mode 100644 index 0000000..60dd983 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A3%9F-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%96-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A6%96-bigseal.svg.png new file mode 100644 index 0000000..c97a514 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%96-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%96-bronze.svg.png b/server/routers/bushou/images/60px-%E9%A6%96-bronze.svg.png new file mode 100644 index 0000000..37dab81 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%96-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%96-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A6%96-oracle.svg.png new file mode 100644 index 0000000..e6f4b6d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%96-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%96-seal.svg.png b/server/routers/bushou/images/60px-%E9%A6%96-seal.svg.png new file mode 100644 index 0000000..4adc4b2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%96-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%99-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A6%99-bigseal.svg.png new file mode 100644 index 0000000..a1e8c5f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%99-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%99-bronze.svg.png b/server/routers/bushou/images/60px-%E9%A6%99-bronze.svg.png new file mode 100644 index 0000000..889a2db Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%99-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%99-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A6%99-oracle.svg.png new file mode 100644 index 0000000..2dbaf03 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%99-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%99-seal.svg.png b/server/routers/bushou/images/60px-%E9%A6%99-seal.svg.png new file mode 100644 index 0000000..380fa51 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%99-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-ancient.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-ancient.svg.png new file mode 100644 index 0000000..3d8bdc5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-ancient.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-bigseal.svg.png new file mode 100644 index 0000000..e99e665 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-shang.svg.png new file mode 100644 index 0000000..a542720 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-spring.svg.png new file mode 100644 index 0000000..abc9d0d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-warring.svg.png new file mode 100644 index 0000000..0d9e98f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-bronze.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-bronze.svg.png new file mode 100644 index 0000000..c9e974c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-clerical.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-clerical.svg.png new file mode 100644 index 0000000..bd5d8ce Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-clerical.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-oracle.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-oracle.svg.png new file mode 100644 index 0000000..1b7bec5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-seal.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-seal.svg.png new file mode 100644 index 0000000..bcb330a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-silk.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-silk.svg.png new file mode 100644 index 0000000..98990d6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-slip.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-slip.svg.png new file mode 100644 index 0000000..c27606d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%A6%AC-zhou.svg.png b/server/routers/bushou/images/60px-%E9%A6%AC-zhou.svg.png new file mode 100644 index 0000000..12e4df3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%A6%AC-zhou.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AA%A8-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AA%A8-bigseal.svg.png new file mode 100644 index 0000000..872edfe Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AA%A8-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AA%A8-seal.svg.png b/server/routers/bushou/images/60px-%E9%AA%A8-seal.svg.png new file mode 100644 index 0000000..f415ec5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AA%A8-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AA%A8-silk.svg.png b/server/routers/bushou/images/60px-%E9%AA%A8-silk.svg.png new file mode 100644 index 0000000..19de0e6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AA%A8-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AA%A8-slip.svg.png b/server/routers/bushou/images/60px-%E9%AA%A8-slip.svg.png new file mode 100644 index 0000000..781452a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AA%A8-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-bigseal.svg.png new file mode 100644 index 0000000..74c7560 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-bronze-shang.svg.png new file mode 100644 index 0000000..248e1dd Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-bronze-spring.svg.png new file mode 100644 index 0000000..5eb88f9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-bronze-warring.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-bronze-warring.svg.png new file mode 100644 index 0000000..905f72c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-bronze-warring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-bronze.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-bronze.svg.png new file mode 100644 index 0000000..df9ce71 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-oracle.svg.png new file mode 100644 index 0000000..d9b9dc8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-seal.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-seal.svg.png new file mode 100644 index 0000000..62fc6fe Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-silk.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-silk.svg.png new file mode 100644 index 0000000..f3d79b5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%98-slip.svg.png b/server/routers/bushou/images/60px-%E9%AB%98-slip.svg.png new file mode 100644 index 0000000..c8e62d8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%98-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%9F-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%AB%9F-bronze-shang.svg.png new file mode 100644 index 0000000..021e074 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%9F-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%9F-seal.svg.png b/server/routers/bushou/images/60px-%E9%AB%9F-seal.svg.png new file mode 100644 index 0000000..7a54eb3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%9F-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AB%9F-silk.svg.png b/server/routers/bushou/images/60px-%E9%AB%9F-silk.svg.png new file mode 100644 index 0000000..f40ae0e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AB%9F-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%A5-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AC%A5-bigseal.svg.png new file mode 100644 index 0000000..026be08 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%A5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AC%A5-oracle.svg.png new file mode 100644 index 0000000..4922e32 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%A5-seal.svg.png b/server/routers/bushou/images/60px-%E9%AC%A5-seal.svg.png new file mode 100644 index 0000000..8a7ef4b Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%AF-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AC%AF-bigseal.svg.png new file mode 100644 index 0000000..93b4e3f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%AF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%AF-bronze.svg.png b/server/routers/bushou/images/60px-%E9%AC%AF-bronze.svg.png new file mode 100644 index 0000000..938daf8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%AF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%AF-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AC%AF-oracle.svg.png new file mode 100644 index 0000000..101ed14 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%AF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%AF-seal.svg.png b/server/routers/bushou/images/60px-%E9%AC%AF-seal.svg.png new file mode 100644 index 0000000..b5bbd67 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%AF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%B2-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AC%B2-bigseal.svg.png new file mode 100644 index 0000000..12d7e9a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%B2-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%B2-bronze.svg.png b/server/routers/bushou/images/60px-%E9%AC%B2-bronze.svg.png new file mode 100644 index 0000000..3bfc875 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%B2-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%B2-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AC%B2-oracle.svg.png new file mode 100644 index 0000000..8136877 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%B2-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%B2-seal.svg.png b/server/routers/bushou/images/60px-%E9%AC%B2-seal.svg.png new file mode 100644 index 0000000..e7ff461 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%B2-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%BC-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AC%BC-bigseal.svg.png new file mode 100644 index 0000000..cf135de Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%BC-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%BC-bronze.svg.png b/server/routers/bushou/images/60px-%E9%AC%BC-bronze.svg.png new file mode 100644 index 0000000..4d6685f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%BC-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%BC-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AC%BC-oracle.svg.png new file mode 100644 index 0000000..a5867e6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%BC-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AC%BC-seal.svg.png b/server/routers/bushou/images/60px-%E9%AC%BC-seal.svg.png new file mode 100644 index 0000000..d7f70d0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AC%BC-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AD%9A-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%AD%9A-bigseal.svg.png new file mode 100644 index 0000000..ff93852 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AD%9A-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AD%9A-bronze.svg.png b/server/routers/bushou/images/60px-%E9%AD%9A-bronze.svg.png new file mode 100644 index 0000000..c910aa2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AD%9A-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AD%9A-oracle.svg.png b/server/routers/bushou/images/60px-%E9%AD%9A-oracle.svg.png new file mode 100644 index 0000000..ce4b0d7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AD%9A-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%AD%9A-seal.svg.png b/server/routers/bushou/images/60px-%E9%AD%9A-seal.svg.png new file mode 100644 index 0000000..26d6709 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%AD%9A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B3%A5-bronze.svg.png b/server/routers/bushou/images/60px-%E9%B3%A5-bronze.svg.png new file mode 100644 index 0000000..847264c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B3%A5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B3%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E9%B3%A5-oracle.svg.png new file mode 100644 index 0000000..3ab5e94 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B3%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B3%A5-seal.svg.png b/server/routers/bushou/images/60px-%E9%B3%A5-seal.svg.png new file mode 100644 index 0000000..1f215b8 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B3%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B3%B3-bronze.svg.png b/server/routers/bushou/images/60px-%E9%B3%B3-bronze.svg.png new file mode 100644 index 0000000..b7b9a8c Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B3%B3-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B3%B3-oracle.svg.png b/server/routers/bushou/images/60px-%E9%B3%B3-oracle.svg.png new file mode 100644 index 0000000..60d8975 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B3%B3-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%B5-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%B9%B5-bigseal.svg.png new file mode 100644 index 0000000..c30446a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%B5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%B5-bronze.svg.png b/server/routers/bushou/images/60px-%E9%B9%B5-bronze.svg.png new file mode 100644 index 0000000..8f7ee08 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%B5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%B5-oracle.svg.png b/server/routers/bushou/images/60px-%E9%B9%B5-oracle.svg.png new file mode 100644 index 0000000..091be85 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%B5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%B5-seal.svg.png b/server/routers/bushou/images/60px-%E9%B9%B5-seal.svg.png new file mode 100644 index 0000000..3258d6a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%B5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%BF-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%B9%BF-bigseal.svg.png new file mode 100644 index 0000000..f8238af Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%BF-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%BF-bronze.svg.png b/server/routers/bushou/images/60px-%E9%B9%BF-bronze.svg.png new file mode 100644 index 0000000..e40cdce Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%BF-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%BF-oracle.svg.png b/server/routers/bushou/images/60px-%E9%B9%BF-oracle.svg.png new file mode 100644 index 0000000..a5d94b5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%BF-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%B9%BF-seal.svg.png b/server/routers/bushou/images/60px-%E9%B9%BF-seal.svg.png new file mode 100644 index 0000000..2473146 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%B9%BF-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%A5-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BA%A5-bigseal.svg.png new file mode 100644 index 0000000..e78389f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%A5-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%A5-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BA%A5-bronze.svg.png new file mode 100644 index 0000000..e2502c5 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%A5-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%A5-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BA%A5-oracle.svg.png new file mode 100644 index 0000000..965acec Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%A5-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%A5-seal.svg.png b/server/routers/bushou/images/60px-%E9%BA%A5-seal.svg.png new file mode 100644 index 0000000..63a8e8e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%A5-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%BB-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BA%BB-bigseal.svg.png new file mode 100644 index 0000000..c4b2f84 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%BB-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%BB-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BA%BB-bronze.svg.png new file mode 100644 index 0000000..b6ec3a6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%BB-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BA%BB-seal.svg.png b/server/routers/bushou/images/60px-%E9%BA%BB-seal.svg.png new file mode 100644 index 0000000..bac8880 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BA%BB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%83-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BB%83-bigseal.svg.png new file mode 100644 index 0000000..13670c0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%83-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%83-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BB%83-bronze.svg.png new file mode 100644 index 0000000..fd595c4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%83-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%83-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BB%83-oracle.svg.png new file mode 100644 index 0000000..db58c85 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%83-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%83-seal.svg.png b/server/routers/bushou/images/60px-%E9%BB%83-seal.svg.png new file mode 100644 index 0000000..7f1596b Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%83-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%8D-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BB%8D-bigseal.svg.png new file mode 100644 index 0000000..49be13b Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%8D-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%8D-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BB%8D-bronze.svg.png new file mode 100644 index 0000000..b8b08db Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%8D-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%8D-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BB%8D-oracle.svg.png new file mode 100644 index 0000000..c46fda4 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%8D-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%8D-seal.svg.png b/server/routers/bushou/images/60px-%E9%BB%8D-seal.svg.png new file mode 100644 index 0000000..8f39630 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%8D-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%91-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%BB%91-bronze-spring.svg.png new file mode 100644 index 0000000..ddfbab0 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%91-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%91-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BB%91-bronze.svg.png new file mode 100644 index 0000000..095aaef Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%91-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%91-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BB%91-oracle.svg.png new file mode 100644 index 0000000..7d35be3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%91-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%91-seal.svg.png b/server/routers/bushou/images/60px-%E9%BB%91-seal.svg.png new file mode 100644 index 0000000..bc68775 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%91-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%91-slip.svg.png b/server/routers/bushou/images/60px-%E9%BB%91-slip.svg.png new file mode 100644 index 0000000..063e01e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%91-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%92-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BB%92-bigseal.svg.png new file mode 100644 index 0000000..4a893c7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%92-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%92-silk.svg.png b/server/routers/bushou/images/60px-%E9%BB%92-silk.svg.png new file mode 100644 index 0000000..d3cb7ed Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%92-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%B9-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BB%B9-bigseal.svg.png new file mode 100644 index 0000000..f5379cd Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%B9-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%B9-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BB%B9-bronze.svg.png new file mode 100644 index 0000000..8df4763 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%B9-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%B9-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BB%B9-oracle.svg.png new file mode 100644 index 0000000..25d1d8f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%B9-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%B9-seal.svg.png b/server/routers/bushou/images/60px-%E9%BB%B9-seal.svg.png new file mode 100644 index 0000000..4e9ba13 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%B9-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BB%BD-seal.svg.png b/server/routers/bushou/images/60px-%E9%BB%BD-seal.svg.png new file mode 100644 index 0000000..2d1663a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BB%BD-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%8E-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BC%8E-bigseal.svg.png new file mode 100644 index 0000000..ad2af9d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%8E-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%8E-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BC%8E-bronze.svg.png new file mode 100644 index 0000000..408d4ee Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%8E-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%8E-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BC%8E-oracle.svg.png new file mode 100644 index 0000000..f192d02 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%8E-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%8E-seal.svg.png b/server/routers/bushou/images/60px-%E9%BC%8E-seal.svg.png new file mode 100644 index 0000000..d67d1cf Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%8E-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%93-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BC%93-bigseal.svg.png new file mode 100644 index 0000000..0392692 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%93-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%93-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BC%93-bronze.svg.png new file mode 100644 index 0000000..a27df26 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%93-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%93-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BC%93-oracle.svg.png new file mode 100644 index 0000000..ef89ba3 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%93-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%93-seal.svg.png b/server/routers/bushou/images/60px-%E9%BC%93-seal.svg.png new file mode 100644 index 0000000..6c3ab1e Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%93-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%A0-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BC%A0-bigseal.svg.png new file mode 100644 index 0000000..7766eb2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%A0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%A0-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BC%A0-oracle.svg.png new file mode 100644 index 0000000..49e90f9 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%A0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%A0-seal.svg.png b/server/routers/bushou/images/60px-%E9%BC%A0-seal.svg.png new file mode 100644 index 0000000..8e4f2ff Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%A0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BC%BB-seal.svg.png b/server/routers/bushou/images/60px-%E9%BC%BB-seal.svg.png new file mode 100644 index 0000000..0a2e5d1 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BC%BB-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BD%8A-seal.svg.png b/server/routers/bushou/images/60px-%E9%BD%8A-seal.svg.png new file mode 100644 index 0000000..29dcea7 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BD%8A-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BD%92-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BD%92-bigseal.svg.png new file mode 100644 index 0000000..cfaa638 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BD%92-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BD%92-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BD%92-bronze.svg.png new file mode 100644 index 0000000..d516f7b Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BD%92-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BD%92-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BD%92-oracle.svg.png new file mode 100644 index 0000000..8175b02 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BD%92-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-bigseal.svg.png new file mode 100644 index 0000000..2222868 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-bronze-shang.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-bronze-shang.svg.png new file mode 100644 index 0000000..6a8b0d2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-bronze-shang.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-bronze-spring.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-bronze-spring.svg.png new file mode 100644 index 0000000..7b3fbe6 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-bronze-spring.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-bronze.svg.png new file mode 100644 index 0000000..e89af78 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-oracle.svg.png new file mode 100644 index 0000000..ab973c2 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-seal.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-seal.svg.png new file mode 100644 index 0000000..c5e8127 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-silk.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-silk.svg.png new file mode 100644 index 0000000..0b54426 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%8D-slip.svg.png b/server/routers/bushou/images/60px-%E9%BE%8D-slip.svg.png new file mode 100644 index 0000000..5aaff14 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%8D-slip.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%9C-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BE%9C-bigseal.svg.png new file mode 100644 index 0000000..9252931 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%9C-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%9C-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BE%9C-bronze.svg.png new file mode 100644 index 0000000..8af6a3f Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%9C-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%9C-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BE%9C-oracle.svg.png new file mode 100644 index 0000000..67bc58a Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%9C-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%9C-seal.svg.png b/server/routers/bushou/images/60px-%E9%BE%9C-seal.svg.png new file mode 100644 index 0000000..381ad5d Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%9C-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%A0-bigseal.svg.png b/server/routers/bushou/images/60px-%E9%BE%A0-bigseal.svg.png new file mode 100644 index 0000000..9bc7416 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%A0-bigseal.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%A0-bronze.svg.png b/server/routers/bushou/images/60px-%E9%BE%A0-bronze.svg.png new file mode 100644 index 0000000..301d678 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%A0-bronze.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%A0-oracle.svg.png b/server/routers/bushou/images/60px-%E9%BE%A0-oracle.svg.png new file mode 100644 index 0000000..f4dd9ed Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%A0-oracle.svg.png differ diff --git a/server/routers/bushou/images/60px-%E9%BE%A0-seal.svg.png b/server/routers/bushou/images/60px-%E9%BE%A0-seal.svg.png new file mode 100644 index 0000000..8e1e082 Binary files /dev/null and b/server/routers/bushou/images/60px-%E9%BE%A0-seal.svg.png differ diff --git a/server/routers/bushou/images/60px-%F0%A5%83%A9-silk.svg.png b/server/routers/bushou/images/60px-%F0%A5%83%A9-silk.svg.png new file mode 100644 index 0000000..2dcab21 Binary files /dev/null and b/server/routers/bushou/images/60px-%F0%A5%83%A9-silk.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-B00002.svg.png b/server/routers/bushou/images/60px-ACC-B00002.svg.png new file mode 100644 index 0000000..54d01c5 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-B00002.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-B00014.svg.png b/server/routers/bushou/images/60px-ACC-B00014.svg.png new file mode 100644 index 0000000..54522c9 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-B00014.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-B00015.svg.png b/server/routers/bushou/images/60px-ACC-B00015.svg.png new file mode 100644 index 0000000..5959f57 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-B00015.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-b00945.svg.png b/server/routers/bushou/images/60px-ACC-b00945.svg.png new file mode 100644 index 0000000..47c32b5 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-b00945.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-b18623.svg.png b/server/routers/bushou/images/60px-ACC-b18623.svg.png new file mode 100644 index 0000000..c1785b5 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-b18623.svg.png differ diff --git a/server/routers/bushou/images/60px-ACC-b18626.svg.png b/server/routers/bushou/images/60px-ACC-b18626.svg.png new file mode 100644 index 0000000..ee3ee40 Binary files /dev/null and b/server/routers/bushou/images/60px-ACC-b18626.svg.png differ diff --git a/server/routers/bushou/images/60px-Shuowen_Seal_Radical_038.svg.png b/server/routers/bushou/images/60px-Shuowen_Seal_Radical_038.svg.png new file mode 100644 index 0000000..cec0d34 Binary files /dev/null and b/server/routers/bushou/images/60px-Shuowen_Seal_Radical_038.svg.png differ diff --git a/server/routers/bushou/index.js b/server/routers/bushou/index.js new file mode 100644 index 0000000..1465db4 --- /dev/null +++ b/server/routers/bushou/index.js @@ -0,0 +1,13 @@ +const router = require('express').Router() + +router.get('/radicals', (req, res) => res.send(require('./radicals/success.json'))) + +router.get('/episodes', (req, res) => res.send(require('./episodes/success.json'))) + +router.get('/tokenize', (req, res) => res.send(require('./tokenize/success.json'))) + +router.get('/images/:name', (req, res) => { + res.sendFile(`${__dirname}/images/${encodeURIComponent(req.params.name)}`) +}) + +module.exports = router diff --git a/server/routers/bushou/radicals/success.json b/server/routers/bushou/radicals/success.json new file mode 100644 index 0000000..8849c88 --- /dev/null +++ b/server/routers/bushou/radicals/success.json @@ -0,0 +1,3941 @@ +[ + { + "no": 1, + "radical": ["一"], + "strokeCount": 1, + "meaning": "one", + "pinyin": "yī", + "hanViet": "nhất", + "frequency": 42, + "examples": ["王", "丁", "七", "三"], + "order": "%E4%B8%80-order.gif", + "glyphOrigin": [ + "60px-ACC-B00002.svg.png", + "60px-%E4%B8%80-oracle.svg.png", + "60px-%E4%B8%80-bronze.svg.png", + "60px-ACC-B00014.svg.png", + "60px-ACC-B00015.svg.png", + "60px-%E4%B8%80-silk.svg.png", + "60px-%E4%B8%80-slip.svg.png", + "60px-%E5%BC%8C-ancient.svg.png", + "60px-%E4%B8%80-seal.svg.png", + "60px-%E4%B8%80-bigseal.svg.png", + "60px-%E4%B8%80-clerical.svg.png" + ], + "note": "Ideogram (指事): a horizontal stroke, indicating the number “one”." + }, + { + "no": 2, + "radical": ["丨"], + "strokeCount": 1, + "meaning": "line", + "pinyin": "gǔn", + "hanViet": "cổn", + "frequency": 21, + "examples": ["十", "中", "串", "丰"], + "order": "%E4%B8%A8-order.gif", + "glyphOrigin": [ + "60px-%E4%B8%A8-seal.svg.png", + "60px-%E4%B8%A8-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 3, + "radical": ["丶"], + "strokeCount": 1, + "meaning": "dot", + "pinyin": "zhǔ", + "hanViet": "chủ", + "frequency": 10, + "examples": ["丸", "凡", "丹", "户"], + "order": "%E4%B8%B6-order.gif", + "glyphOrigin": [ + "60px-%E4%B8%B6-bronze.svg.png", + "60px-%E4%B8%B6-seal.svg.png" + ], + "note": "" + }, + { + "no": 4, + "radical": ["丿", "乀", "⺄"], + "strokeCount": 1, + "meaning": "slash", + "pinyin": "piě", + "hanViet": "phiệt", + "frequency": 33, + "examples": ["乂", "乃", "久", "八"], + "order": "%E4%B8%BF-order.gif", + "glyphOrigin": [ + "60px-%E4%B8%BF-seal.svg.png", + "60px-%E4%B8%BF-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 5, + "radical": ["乙", "乚", "乛"], + "strokeCount": 1, + "meaning": "second", + "pinyin": "yǐ", + "hanViet": "ất", + "frequency": 42, + "examples": ["九", "乞", "也"], + "order": "%E4%B9%99-order.gif", + "glyphOrigin": [ + "60px-%E4%B9%99-oracle.svg.png", + "60px-%E4%B9%99-bronze.svg.png", + "60px-%E4%B9%99-silk.svg.png", + "60px-%E4%B9%99-seal.svg.png", + "60px-%E4%B9%99-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 6, + "radical": ["亅"], + "strokeCount": 1, + "meaning": "hook", + "pinyin": "jué", + "hanViet": "quyết", + "frequency": 19, + "examples": ["了", "矛", "事"], + "order": "%E4%BA%85-order.gif", + "glyphOrigin": ["60px-%E4%BA%85-seal.svg.png"], + "note": "" + }, + { + "no": 7, + "radical": ["二"], + "strokeCount": 2, + "meaning": "two", + "pinyin": "èr", + "hanViet": "nhị", + "frequency": 29, + "examples": ["貳", "于", "云", "些"], + "order": "%E4%BA%8C-order.gif", + "glyphOrigin": [ + "60px-%E4%BA%8C-oracle.svg.png", + "60px-%E4%BA%8C-bronze.svg.png", + "60px-ACC-b18623.svg.png", + "60px-ACC-b18626.svg.png", + "60px-%E4%BA%8C-silk.svg.png", + "60px-%E4%BA%8C-slip.svg.png", + "60px-%E5%BC%8D-ancient.svg.png", + "60px-%E4%BA%8C-seal.svg.png", + "60px-%E4%BA%8C-bigseal.svg.png" + ], + "note": "Ideogram (指事) - two parallel lines. Compare with 一, one line meaning one, 三, three lines meaning three, and 亖, four lines meaning four. Duplication of 一 (“one”)." + }, + { + "no": 8, + "radical": ["亠"], + "strokeCount": 2, + "meaning": "lid", + "pinyin": "tóu", + "hanViet": "đầu", + "frequency": 38, + "examples": ["方", "亡", "亢", "交"], + "order": "%E4%BA%A0-order.gif", + "glyphOrigin": ["60px-%E4%BA%A0-seal.svg.png"], + "note": "" + }, + { + "no": 9, + "radical": ["人", "亻"], + "strokeCount": 2, + "meaning": "man", + "pinyin": "rén", + "hanViet": "nhân (đứng, nón)", + "frequency": 794, + "examples": ["你", "什", "仁", "仇"], + "order": "%E4%BA%BA-order.gif", + "glyphOrigin": [ + "60px-%E4%BA%BA-bronze-shang.svg.png", + "60px-%E4%BA%BA-oracle.svg.png", + "60px-%E4%BA%BA-bronze.svg.png", + "60px-%E4%BA%BA-bronze-spring.svg.png", + "60px-%E4%BA%BA-bronze-warring.svg.png", + "60px-%E4%BA%BA-silk.svg.png", + "60px-%E4%BA%BA-slip.svg.png", + "60px-%E5%84%BF-seal.svg.png", + "60px-%E4%BA%BA-seal.svg.png", + "60px-%E4%BA%BA-bigseal.svg.png" + ], + "note": "Pictogram (象形) – side view of a standing man, highlighting the arms and legs. Compare 大." + }, + { + "no": 10, + "radical": ["儿"], + "strokeCount": 2, + "meaning": "son, legs", + "pinyin": "ér", + "hanViet": "nhi/nhân (đi)", + "frequency": 52, + "simplified": "(pr. 兒)", + "examples": ["兒", "兀", "允", "元"], + "order": "%E5%84%BF-order.gif", + "glyphOrigin": [ + "60px-%E5%84%BF-bronze-shang.svg.png", + "60px-%E5%84%BF-oracle.svg.png", + "60px-%E5%84%BF-bronze.svg.png", + "60px-%E5%84%BF-seal.svg.png", + "60px-%E5%84%BF-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a standing person. A radical form of 人. Also simplified from 兒 (elimination of 臼)." + }, + { + "no": 11, + "radical": ["入"], + "strokeCount": 2, + "meaning": "enter", + "pinyin": "rù", + "hanViet": "nhập", + "frequency": 28, + "examples": ["內", "全", "兩", "汆"], + "order": "%E5%85%A5-order.gif", + "glyphOrigin": [ + "60px-%E5%85%A5-oracle.svg.png", + "60px-%E5%85%A5-bronze.svg.png", + "60px-%E5%85%A5-silk.svg.png", + "60px-%E5%85%A5-seal.svg.png", + "60px-%E5%85%A5-bigseal.svg.png" + ], + "note": "Ideogram (指事) - an arrowhead indicating \"to enter\". Compare 人 (rén)." + }, + { + "no": 12, + "radical": ["八", "丷"], + "strokeCount": 2, + "meaning": "eight", + "pinyin": "bā", + "hanViet": "bát", + "frequency": 44, + "examples": ["公", "六", "兮", "穴"], + "order": "%E5%85%AB-order.gif", + "glyphOrigin": [ + "60px-%E5%85%AB-oracle.svg.png", + "60px-%E5%85%AB-bronze.svg.png", + "60px-ACC-b00945.svg.png", + "60px-%E5%85%AB-silk.svg.png", + "60px-%E5%85%AB-slip.svg.png", + "60px-%E5%85%AB-seal.svg.png", + "60px-%E5%85%AB-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 八 is two bent lines indicating the original meaning of \"to divide\". This character is later borrowed to mean \"eight\" because of homonymy, making the original meaning obsolete (now represented by 別)." + }, + { + "no": 13, + "radical": ["冂"], + "strokeCount": 2, + "meaning": "wide", + "pinyin": "jiōng", + "hanViet": "quynhkhuynh", + "frequency": 50, + "examples": ["冇", "冊", "冉", "肉"], + "order": "%E5%86%82-order.gif", + "glyphOrigin": [ + "60px-%E5%86%82-bronze.svg.png", + "60px-%E5%86%82-seal.svg.png", + "60px-%E5%86%82-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 14, + "radical": ["冖"], + "strokeCount": 2, + "meaning": "cloth cover", + "pinyin": "mì", + "hanViet": "mịch", + "frequency": 30, + "examples": ["冗", "冠", "冥", "運"], + "order": "%E5%86%96-order.gif", + "glyphOrigin": [ + "60px-%E5%86%96-oracle.svg.png", + "60px-%E5%86%96-bronze.svg.png", + "60px-%E5%86%96-seal.svg.png" + ], + "note": "" + }, + { + "no": 15, + "radical": ["冫"], + "strokeCount": 2, + "meaning": "ice", + "pinyin": "bīng", + "hanViet": "băng", + "frequency": 115, + "examples": ["冬", "冰", "冶", "凉"], + "order": "%E5%86%AB-order.gif", + "glyphOrigin": [ + "60px-%E4%BB%8C-oracle.svg.png", + "60px-%E4%BB%8C-bronze.svg.png", + "60px-%E4%BB%8C-seal.svg.png", + "60px-%E4%BB%8C-bigseal.svg.png" + ], + "note": "Radical form of 仌." + }, + { + "no": 16, + "radical": ["几"], + "strokeCount": 2, + "meaning": "table", + "pinyin": "jī", + "hanViet": "kỷ", + "frequency": 38, + "examples": ["風", "殳", "凡", "凱"], + "order": "%E5%87%A0-order.gif", + "glyphOrigin": [ + "60px-%E5%87%A0-silk.svg.png", + "60px-%E5%87%A0-seal.svg.png", + "60px-%E5%87%A0-bigseal.svg.png" + ], + "note": "Pictogram (象形) – stool (viewed from the side)." + }, + { + "no": 17, + "radical": ["凵"], + "strokeCount": 2, + "meaning": "receptacle", + "pinyin": "kǎn", + "hanViet": "khảm", + "frequency": 23, + "examples": ["凶", "凸", "凹", "齒"], + "order": "%E5%87%B5-order.gif", + "glyphOrigin": [ + "60px-%E5%87%B5-oracle.svg.png", + "60px-%E5%87%B5-silk.svg.png", + "60px-%E5%87%B5-seal.svg.png", + "60px-%E5%87%B5-bigseal.svg.png" + ], + "note": "Pictogram (象形): a cave" + }, + { + "no": 18, + "radical": ["刀", "刂", "⺈"], + "strokeCount": 2, + "meaning": "knife", + "pinyin": "dāo", + "hanViet": "đao", + "frequency": 377, + "examples": ["刁", "解", "分", "劍"], + "order": "%E5%88%80-order.gif", + "glyphOrigin": [ + "60px-%E5%88%80-bronze-shang.svg.png", + "60px-%E5%88%80-oracle.svg.png", + "60px-%E5%88%80-bronze.svg.png", + "60px-%E5%88%80-silk.svg.png", + "60px-%E5%88%80-seal.svg.png", + "60px-%E5%88%80-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 19, + "radical": ["力"], + "strokeCount": 2, + "meaning": "power", + "pinyin": "lì", + "hanViet": "lực", + "frequency": 163, + "examples": ["加", "功", "劣", "男"], + "order": "%E5%8A%9B-order.gif", + "glyphOrigin": [ + "60px-%E5%8A%9B-oracle.svg.png", + "60px-%E5%8A%9B-bronze.svg.png", + "60px-%E5%8A%9B-bronze-spring.svg.png", + "60px-%E5%8A%9B-bronze-warring.svg.png", + "60px-%E5%8A%9B-silk.svg.png", + "60px-%E5%8A%9B-slip.svg.png", + "60px-%E5%8A%9B-seal.svg.png", + "60px-%E5%8A%9B-bigseal.svg.png" + ], + "note": "Pictogram (象形) – alternative interpretation, either an arm bending out from the side of the body, or a plough." + }, + { + "no": 20, + "radical": ["勹"], + "strokeCount": 2, + "meaning": "wrap", + "pinyin": "bāo", + "hanViet": "bao", + "frequency": 64, + "examples": ["包", "勺", "勻", "勾"], + "order": "%E5%8B%B9-order.gif", + "glyphOrigin": [ + "60px-%E5%8B%B9-oracle.svg.png", + "60px-%E5%8B%B9-bronze.svg.png", + "60px-%E5%8B%B9-seal.svg.png" + ], + "note": "" + }, + { + "no": 21, + "radical": ["匕"], + "strokeCount": 2, + "meaning": "spoon", + "pinyin": "bǐ", + "hanViet": "chủy", + "frequency": 19, + "examples": ["化", "北", "匙", "比"], + "order": "%E5%8C%95-order.gif", + "glyphOrigin": [ + "60px-%E5%8C%95-bronze-shang.svg.png", + "60px-%E5%8C%95-oracle.svg.png", + "60px-%E5%8C%95-bronze.svg.png", + "60px-%E5%8C%95-silk.svg.png", + "60px-%E5%8C%95-seal.svg.png", + "60px-%E5%8C%95-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 22, + "radical": ["匚"], + "strokeCount": 2, + "meaning": "box", + "pinyin": "fāng", + "hanViet": "phương", + "frequency": 64, + "examples": ["匿", "區", "巨", "匠"], + "order": "%E5%8C%9A-order.gif", + "glyphOrigin": [ + "60px-%E5%8C%9A-oracle.svg.png", + "60px-%E5%8C%9A-bronze.svg.png", + "60px-%E5%8C%9A-seal.svg.png", + "60px-%E5%8C%9A-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 23, + "radical": ["匸"], + "strokeCount": 2, + "meaning": "hiding enclosure", + "pinyin": "xǐ/xì", + "hanViet": "hệ", + "frequency": 17, + "examples": ["亡", "匹", "匼", "匽"], + "order": "%E5%8C%B8-order.gif", + "glyphOrigin": [ + "60px-%E5%8C%B8-oracle.svg.png", + "60px-%E5%8C%B8-bronze.svg.png", + "60px-%E5%8C%B8-silk.svg.png", + "60px-%E5%8C%B8-seal.svg.png", + "60px-%E5%8C%B8-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 24, + "radical": ["十"], + "strokeCount": 2, + "meaning": "ten", + "pinyin": "shí", + "hanViet": "thập", + "frequency": 55, + "examples": ["千", "木", "卅", "升"], + "order": "%E5%8D%81-order.gif", + "glyphOrigin": [ + "60px-%E5%8D%81-bronze-shang.svg.png", + "60px-%E5%8D%81-oracle.svg.png", + "60px-%E5%8D%81-bronze.svg.png", + "60px-%E5%8D%81-bronze-spring.svg.png", + "60px-%E5%8D%81-bronze-warring.svg.png", + "60px-%E5%8D%81-silk.svg.png", + "60px-%E5%8D%81-slip.svg.png", + "60px-%E5%8D%81-seal.svg.png", + "60px-%E5%8D%81-bigseal.svg.png" + ], + "note": "Unlike 一, which was one horizontal stroke meaning one, 十 was originally simply a vertical stroke. In later forms 一 was added, forming a cross." + }, + { + "no": 25, + "radical": ["卜"], + "strokeCount": 2, + "meaning": "divination", + "pinyin": "bǔ", + "hanViet": "bốc", + "frequency": 45, + "examples": ["下", "上", "卡", "占"], + "order": "%E5%8D%9C-order.gif", + "glyphOrigin": [ + "60px-%E5%8D%9C-oracle.svg.png", + "60px-%E5%8D%9C-bronze.svg.png", + "60px-%E5%8D%9C-silk.svg.png", + "60px-%E5%8D%9C-slip.svg.png", + "60px-%E5%8D%9C-seal.svg.png", + "60px-%E5%8D%9C-bigseal.svg.png" + ], + "note": "Perhaps a pictogram (象形) of a crack in an oracle bone, used for divination in ancient China. Officially adopted as the simplified form of 蔔 in the Chinese Character Simplification Scheme (《漢字簡化方案》) in 1956." + }, + { + "no": 26, + "radical": ["卩", "㔾"], + "strokeCount": 2, + "meaning": "seal (device)", + "pinyin": "jié", + "hanViet": "tiết", + "frequency": 40, + "examples": ["即", "卬", "卷", "夗"], + "order": "%E5%8D%A9-order.gif", + "glyphOrigin": [ + "60px-%E5%8D%A9-oracle.svg.png", + "60px-%E5%8D%A9-bronze.svg.png", + "60px-%E5%8D%A9-seal.svg.png" + ], + "note": "Pictogram (象形): a kneeling person." + }, + { + "no": 27, + "radical": ["厂"], + "strokeCount": 2, + "meaning": "cliff", + "pinyin": "hǎn[1]", + "hanViet": "hán", + "frequency": 129, + "simplified": "(pr. 廠)", + "examples": ["厄", "原", "厚", "厰"], + "order": "%E5%8E%82-order.gif", + "glyphOrigin": [ + "60px-%E5%8E%82-oracle.svg.png", + "60px-%E5%8E%82-bronze.svg.png", + "60px-%E5%8E%82-seal.svg.png", + "60px-%E5%8E%82-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 28, + "radical": ["厶"], + "strokeCount": 2, + "meaning": "private", + "pinyin": "sī", + "hanViet": "khư", + "frequency": 40, + "examples": ["台", "公", "去", "參"], + "order": "%E5%8E%B6-order.gif", + "glyphOrigin": [ + "60px-%E5%8E%B6-bronze-warring.svg.png", + "60px-%E5%8E%B6-silk.svg.png", + "60px-%E5%8E%B6-seal.svg.png", + "60px-%E5%8E%B6-bigseal.svg.png" + ], + "note": "Ideogram (指事) – revolving around oneself – original character for 私 (“selfish; private”). According to Han Feizi, which was referenced in Shuowen: Compare 公 (“public”)." + }, + { + "no": 29, + "radical": ["又"], + "strokeCount": 2, + "meaning": "again", + "pinyin": "yòu", + "hanViet": "hựu", + "frequency": 91, + "examples": ["叉", "及", "友", "取"], + "order": "%E5%8F%88-order.gif", + "glyphOrigin": [ + "60px-%E5%8F%88-oracle.svg.png", + "60px-%E5%8F%88-bronze.svg.png", + "60px-%E5%8F%88-silk.svg.png", + "60px-%E5%8F%88-seal.svg.png", + "60px-%E5%8F%88-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a right hand. Original form of 右 (OC *ɢʷɯʔ, *ɢʷɯs, “right”)." + }, + { + "no": 30, + "radical": ["口"], + "strokeCount": 3, + "meaning": "mouth", + "pinyin": "kǒu", + "hanViet": "khẩu", + "frequency": 1146, + "examples": ["哎", "古", "只", "品"], + "order": "%E5%8F%A3-order.gif", + "glyphOrigin": [ + "60px-%E5%8F%A3-bronze-shang.svg.png", + "60px-%E5%8F%A3-oracle.svg.png", + "60px-%E5%8F%A3-bronze.svg.png", + "60px-%E5%8F%A3-silk.svg.png", + "60px-%E5%8F%A3-seal.svg.png", + "60px-%E5%8F%A3-bigseal.svg.png" + ], + "note": "Pictogram (象形) – resembles an open mouth. In the oracle bone script, radical 口 is used for characters having abstract meanings. Such a character can have a figurative meaning derived from the phonetic part, e.g. 右 (OC *ɢʷɯʔ, *ɢʷɯs, “right”) = 又 (OC *ɢʷɯs, “right hand”) + 口 and 𪪺 (“strong; powerful”) = 弓 (OC *kʷɯŋ, “bow”) + 口, or be an unrelated borrowing, e.g. 否 (OC *brɯʔ, *pɯʔ, “no”) = 不 (OC *pɯ, *pɯʔ, *pɯ', “calyx”) + 口." + }, + { + "no": 31, + "radical": ["囗"], + "strokeCount": 3, + "meaning": "enclosure", + "pinyin": "wéi", + "hanViet": "vi", + "frequency": 118, + "examples": ["囚", "四", "國", "圍"], + "order": "%E5%9B%97-order.gif", + "glyphOrigin": [ + "60px-%E5%9B%97-oracle.svg.png", + "60px-%E5%9B%97-bronze.svg.png", + "60px-%E5%9B%97-seal.svg.png", + "60px-%E5%9B%97-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 32, + "radical": ["土"], + "strokeCount": 3, + "meaning": "earth", + "pinyin": "tǔ", + "hanViet": "thổ", + "frequency": 580, + "examples": ["地", "圣", "圭", "堯"], + "order": "%E5%9C%9F-order.gif", + "glyphOrigin": [ + "60px-%E5%9C%9F-oracle.svg.png", + "60px-%E5%9C%9F-bronze.svg.png", + "60px-%E5%9C%9F-bronze-spring.svg.png", + "60px-%E5%9C%9F-silk.svg.png", + "60px-%E5%9C%9F-slip.svg.png", + "60px-%E5%9C%9F-seal.svg.png", + "60px-%E5%9C%9F-bigseal.svg.png" + ], + "note": "Pictogram (象形): a lump of clay on a potter’s wheel." + }, + { + "no": 33, + "radical": ["士"], + "strokeCount": 3, + "meaning": "scholar", + "pinyin": "shì", + "hanViet": "sĩ", + "frequency": 24, + "examples": ["壬", "喜", "時", "壽"], + "order": "%E5%A3%AB-order.gif", + "glyphOrigin": [ + "60px-%E5%A3%AB-bronze.svg.png", + "60px-%E5%A3%AB-silk.svg.png", + "60px-%E5%A3%AB-slip.svg.png", + "60px-%E5%A3%AB-seal.svg.png", + "60px-%E5%A3%AB-bigseal.svg.png" + ], + "note": "Pictogram (象形) – axe-like tool; soldier." + }, + { + "no": 34, + "radical": ["夂"], + "strokeCount": 3, + "meaning": "go", + "pinyin": "zhǐ", + "hanViet": "truy/trĩ", + "frequency": 11, + "examples": ["各", "冬", "夆", "愛"], + "order": "%E5%A4%82-order.gif", + "glyphOrigin": ["60px-%E5%A4%82-seal.svg.png"], + "note": "" + }, + { + "no": 35, + "radical": ["夊"], + "strokeCount": 3, + "meaning": "go slowly", + "pinyin": "suī", + "hanViet": "truy/tuy", + "frequency": 23, + "examples": ["夌", "复", "夏"], + "order": "%E5%A4%8A-order.gif", + "glyphOrigin": [ + "60px-%E5%A4%8A-oracle.svg.png", + "60px-%E5%A4%8A-seal.svg.png" + ], + "note": "Pictogram (象形) – footprint (pointing down), variant of 夂. Compare 止, which has similar form in oracle script, but has leg pointing up, and 𡕒 (as in right side of 舛, roughly ヰ), which also has leg pointing down, but toe pointing left, hence different evolutions." + }, + { + "no": 36, + "radical": ["夕"], + "strokeCount": 3, + "meaning": "evening", + "pinyin": "xī", + "hanViet": "tịch", + "frequency": 34, + "examples": ["外", "夗", "多", "岁"], + "order": "%E5%A4%95-order.gif", + "glyphOrigin": [ + "60px-%E5%A4%95-oracle.svg.png", + "60px-%E5%A4%95-bronze.svg.png", + "60px-%E5%A4%95-silk.svg.png", + "60px-%E5%A4%95-seal.svg.png", + "60px-%E5%A4%95-bigseal.svg.png" + ], + "note": "Pictogram (象形) — moon crescent. Compare 月." + }, + { + "no": 37, + "radical": ["大"], + "strokeCount": 3, + "meaning": "big", + "pinyin": "dà", + "hanViet": "đại", + "frequency": 132, + "examples": ["太", "天", "夭", "夯"], + "order": "%E5%A4%A7-order.gif", + "glyphOrigin": [ + "60px-%E5%A4%A7-bronze-shang.svg.png", + "60px-%E5%A4%A7-oracle.svg.png", + "60px-%E5%A4%A7-bronze.svg.png", + "60px-%E5%A4%A7-bronze-warring.svg.png", + "60px-%E5%A4%A7-silk.svg.png", + "60px-%E5%A4%A7-slip.svg.png", + "60px-%E5%A4%A7-zhou.svg.png", + "60px-%E5%A4%A7-seal.svg.png", + "60px-%E5%A4%A7-bigseal.svg.png" + ], + "note": "Ideogram (指事): a person 人 with arms stretched out as far as possible, implying the meaning of big/great/large. Compare with 尢, which is a man with bent legs. Compare also 文, which is a man with arms outstretched and a crest or tattoo on his chest, and to 夭, which is a man with arms outstretched and leaning to side (running)." + }, + { + "no": 38, + "radical": ["女"], + "strokeCount": 3, + "meaning": "woman", + "pinyin": "nǚ", + "hanViet": "nữ", + "frequency": 681, + "examples": ["妳", "婆", "奶", "如"], + "order": "%E5%A5%B3-order.gif", + "glyphOrigin": [ + "60px-%E5%A5%B3-oracle.svg.png", + "60px-%E5%A5%B3-bronze.svg.png", + "60px-%E5%A5%B3-silk.svg.png", + "60px-%E5%A5%B3-seal.svg.png", + "60px-%E5%A5%B3-bigseal.svg.png" + ], + "note": "Pictogram (象形): a woman with breasts kneeling or standing. In modern form turned on left side: enclosed area is remnant of left breast (character's left, depicted woman's right), while right breast has disappeared. Graphically cognate to 母 (mǔ, “mother”), which has developed similarly, but also includes dots for nipples and has retained both breasts." + }, + { + "no": 39, + "radical": ["子"], + "strokeCount": 3, + "meaning": "child", + "pinyin": "zǐ", + "hanViet": "tử", + "frequency": 83, + "examples": ["孩", "學", "孔", "仔"], + "order": "%E5%AD%90-order.gif", + "glyphOrigin": [ + "60px-%E5%AD%90-oracle.svg.png", + "60px-%E5%AD%90-bronze.svg.png", + "60px-%E5%AD%90-silk.svg.png", + "60px-%E5%AD%90-seal.svg.png", + "60px-%E5%AD%90-bigseal.svg.png" + ], + "note": "Pictogram (象形) – an image of a baby, with a large head and spread arms. The legs are wrapped in a blanket. Compare with 了, where the arms are wrapped. The big seal script form is much more elaborate, showing a baby with hair on a head (囟) and arms on the two sides of the body, sitting on a stool (几)." + }, + { + "no": 40, + "radical": ["宀"], + "strokeCount": 3, + "meaning": "roof", + "pinyin": "mián", + "hanViet": "miên", + "frequency": 246, + "examples": ["家", "安", "寧", "它"], + "order": "%E5%AE%80-order.gif", + "glyphOrigin": [ + "60px-%E5%AE%80-oracle.svg.png", + "60px-%E5%AE%80-bronze.svg.png", + "60px-%E5%AE%80-seal.svg.png", + "60px-%E5%AE%80-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 41, + "radical": ["寸"], + "strokeCount": 3, + "meaning": "inch", + "pinyin": "cùn", + "hanViet": "thốn", + "frequency": 40, + "examples": ["村", "寺", "封", "射"], + "order": "%E5%AF%B8-order.gif", + "glyphOrigin": [ + "60px-%E5%AF%B8-bronze.svg.png", + "60px-%E5%AF%B8-slip.svg.png", + "60px-%E5%AF%B8-seal.svg.png", + "60px-%E5%AF%B8-bigseal.svg.png" + ], + "note": "Ideogram (指事) – a position on the forearm where the pulse can be palpated by compressing the radial artery. It is called 寸口 in modern Chinese, and the meaning of a unit of measurement is derived from the distance between the wrist and this position. Compare 又, 手, 九, 爪." + }, + { + "no": 42, + "radical": ["小", "⺌", "⺍"], + "strokeCount": 3, + "meaning": "small", + "pinyin": "xiǎo", + "hanViet": "tiểu", + "frequency": 41, + "examples": ["少", "尖", "當", "栄"], + "order": "%E5%B0%8F-order.gif", + "glyphOrigin": [ + "60px-%E5%B0%8F-oracle.svg.png", + "60px-%E5%B0%8F-bronze.svg.png", + "60px-%E5%B0%8F-slip.svg.png", + "60px-%E5%B0%8F-seal.svg.png", + "60px-%E5%B0%8F-bigseal.svg.png" + ], + "note": "Two possible interpretations: Starting from some bronze inscriptions, the dots have become elongated. Based on this form, Shuowen erroneously considers it to be an ideogrammic compound (會意): 八 (“to divide; to separate”) + 丨 (“small object”). Compare with 少 (OC *hmjewʔ, *hmjews), represented by four dots in its oracle bone script form." + }, + { + "no": 43, + "radical": ["尢", "尣"], + "strokeCount": 3, + "meaning": "lame", + "pinyin": "wāng", + "hanViet": "uông", + "frequency": 66, + "examples": ["尤", "尷", "尬", "尩"], + "order": "%E5%B0%A2-order.gif", + "glyphOrigin": [ + "60px-%E5%B0%A2-oracle.svg.png", + "60px-%E5%B0%A2-bronze.svg.png", + "60px-%E5%B0%A2-ancient.svg.png", + "60px-%E5%B0%A2-seal.svg.png" + ], + "note": "Ideogram (指事), a man with bent legs (jumping or collapsing). Compare with 大, which derives from a man with straight legs, and in present form has slightly different strokes." + }, + { + "no": 44, + "radical": ["尸"], + "strokeCount": 3, + "meaning": "corpse", + "pinyin": "shī", + "hanViet": "thi", + "frequency": 148, + "simplified": "(pr. 屍)", + "examples": ["屍", "尺", "尼", "尻"], + "order": "%E5%B0%B8-order.gif", + "glyphOrigin": [ + "60px-%E5%B0%B8-bronze-shang.svg.png", + "60px-%E5%B0%B8-oracle.svg.png", + "60px-%E5%B0%B8-bronze.svg.png", + "60px-%E5%B0%B8-slip.svg.png", + "60px-%E5%B0%B8-seal.svg.png", + "60px-%E5%B0%B8-bigseal.svg.png" + ], + "note": "Pictogram (象形) - A man with his legs bending, and a side to the front. The picture is variously interpreted as either sitting or lying. When used as a radical, 尸 is usually derived from a variation of 人 or 亻, as in 尾." + }, + { + "no": 45, + "radical": ["屮"], + "strokeCount": 3, + "meaning": "sprout", + "pinyin": "chè", + "hanViet": "triệt", + "frequency": 38, + "examples": ["艸", "屯", "屰", "頓"], + "order": "%E5%B1%AE-order.gif", + "glyphOrigin": [ + "60px-%E5%B1%AE-bronze.svg.png", + "60px-%E5%B1%AE-silk.svg.png", + "60px-%E5%B1%AE-seal.svg.png", + "60px-%E5%B1%AE-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 46, + "radical": ["山"], + "strokeCount": 3, + "meaning": "mountain", + "pinyin": "shān", + "hanViet": "sơn", + "frequency": 636, + "examples": ["嵗", "密", "峰", "幽"], + "order": "%E5%B1%B1-order.gif", + "glyphOrigin": [ + "60px-%E5%B1%B1-oracle.svg.png", + "60px-%E5%B1%B1-bronze.svg.png", + "60px-%E5%B1%B1-silk.svg.png", + "60px-%E5%B1%B1-seal.svg.png", + "60px-%E5%B1%B1-bigseal.svg.png" + ], + "note": "Pictogram (象形) – three mountain peaks. In the Oracle Bone Script, they were represented by triangles rather than vertical strokes. Compare 丘 (qiū), particularly earlier forms." + }, + { + "no": 47, + "radical": ["巛", "川"], + "strokeCount": 3, + "meaning": "river", + "pinyin": "chuān", + "hanViet": "xuyên", + "frequency": 26, + "examples": ["川", "州", "順", "災"], + "order": "%E5%B7%9B-order.gif", + "glyphOrigin": [ + "60px-%E5%B7%9D-oracle.svg.png", + "60px-%E5%B7%9D-bronze.svg.png", + "60px-%E5%B7%9D-bronze-warring.svg.png", + "60px-%E5%B7%9D-silk.svg.png", + "60px-%E5%B7%9D-seal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 48, + "radical": ["工"], + "strokeCount": 3, + "meaning": "work", + "pinyin": "gōng", + "hanViet": "công", + "frequency": 17, + "examples": ["左", "巧", "功", "式"], + "order": "%E5%B7%A5-order.gif", + "glyphOrigin": [ + "60px-%E5%B7%A5-oracle.svg.png", + "60px-%E5%B7%A5-bronze.svg.png", + "60px-%E5%B7%A5-silk.svg.png", + "60px-%E5%B7%A5-ancient.svg.png", + "60px-%E5%B7%A5-seal.svg.png", + "60px-%E5%B7%A5-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a bladed tool." + }, + { + "no": 49, + "radical": ["己"], + "strokeCount": 3, + "meaning": "oneself", + "pinyin": "jǐ", + "hanViet": "kỷ", + "frequency": 20, + "examples": ["記", "改", "忌", "龍"], + "order": "%E5%B7%B1-order.gif", + "glyphOrigin": [ + "60px-%E5%B7%B1-oracle.svg.png", + "60px-%E5%B7%B1-bronze.svg.png", + "60px-%E5%B7%B1-silk.svg.png", + "60px-%E5%B7%B1-seal.svg.png", + "60px-%E5%B7%B1-bigseal.svg.png" + ], + "note": "Pictogram (象形) – silk rope for binding objects. Original form of 紀 (OC *kɯʔ)." + }, + { + "no": 50, + "radical": ["巾"], + "strokeCount": 3, + "meaning": "turban", + "pinyin": "jīn", + "hanViet": "cân", + "frequency": 295, + "examples": ["市", "帥", "刷", "砸"], + "order": "%E5%B7%BE-order.gif", + "glyphOrigin": [ + "60px-%E5%B7%BE-oracle.svg.png", + "60px-%E5%B7%BE-bronze.svg.png", + "60px-%E5%B7%BE-seal.svg.png", + "60px-%E5%B7%BE-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 51, + "radical": ["干"], + "strokeCount": 3, + "meaning": "dry", + "pinyin": "gān", + "hanViet": "can", + "frequency": 9, + "simplified": "(pr. 乾、幹)", + "examples": ["旱", "开", "平", "年"], + "order": "%E5%B9%B2-order.gif", + "glyphOrigin": [ + "60px-%E5%B9%B2-oracle.svg.png", + "60px-%E5%B9%B2-bronze.svg.png", + "60px-%E5%B9%B2-silk.svg.png", + "60px-%E5%B9%B2-seal.svg.png", + "60px-%E5%B9%B2-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a pestle. Also borrowed phonetically as a simplification of 乾 and 幹." + }, + { + "no": 52, + "radical": ["幺", "么"], + "strokeCount": 3, + "meaning": "short thread", + "pinyin": "yāo", + "hanViet": "yêu", + "frequency": 50, + "examples": ["幻", "麼", "幽", "幾"], + "order": "%E5%B9%BA-order.gif", + "glyphOrigin": [ + "60px-%E5%B9%BA-bronze.svg.png", + "60px-%E5%B9%BA-seal.svg.png" + ], + "note": "" + }, + { + "no": 53, + "radical": ["广"], + "strokeCount": 3, + "meaning": "dotted cliff", + "pinyin": "guǎng", + "hanViet": "nghiễm", + "frequency": 15, + "simplified": "(pr. 廣)", + "examples": ["庀", "庂", "庄"], + "order": "%E5%B9%BF-order.gif", + "glyphOrigin": [ + "60px-%E5%B9%BF-bronze.svg.png", + "60px-%E5%B9%BF-seal.svg.png", + "60px-%E5%B9%BF-bigseal.svg.png" + ], + "note": "Pictogram (象形): A house that is built to depend on a cliff." + }, + { + "no": 54, + "radical": ["廴"], + "strokeCount": 3, + "meaning": "long stride", + "pinyin": "yǐn", + "hanViet": "dẫn", + "frequency": 9, + "examples": ["廵", "廷", "延"], + "order": "%E5%BB%B4-order.gif", + "glyphOrigin": [ + "60px-%E5%BB%B4-seal.svg.png", + "60px-%E5%BB%B4-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a man with one leg behind him, implying a stride." + }, + { + "no": 55, + "radical": ["廾"], + "strokeCount": 3, + "meaning": "arch", + "pinyin": "gǒng", + "hanViet": "củng", + "frequency": 50, + "examples": ["廿", "弁", "弄"], + "order": "%E5%BB%BE-order.gif", + "glyphOrigin": [ + "60px-%E5%BB%BE-oracle.svg.png", + "60px-%E5%BB%BE-bronze.svg.png", + "60px-%E5%BB%BE-seal.svg.png", + "60px-%E5%BB%BE-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 𠂇 (“left hand”) + 又 (“right hand”), hence both hands. Variant of 廿." + }, + { + "no": 56, + "radical": ["弋"], + "strokeCount": 3, + "meaning": "shoot", + "pinyin": "yì", + "hanViet": "dặc", + "frequency": 15, + "examples": ["弌", "弍", "弎"], + "order": "%E5%BC%8B-order.gif", + "glyphOrigin": [ + "60px-%E5%BC%8B-oracle.svg.png", + "60px-%E5%BC%8B-bronze.svg.png", + "60px-%E5%BC%8B-silk.svg.png", + "60px-%E5%BC%8B-seal.svg.png", + "60px-%E5%BC%8B-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 57, + "radical": ["弓"], + "strokeCount": 3, + "meaning": "bow", + "pinyin": "gōng", + "hanViet": "cung", + "frequency": 165, + "examples": ["弔", "引", "弗"], + "order": "%E5%BC%93-order.gif", + "glyphOrigin": [ + "60px-%E5%BC%93-oracle.svg.png", + "60px-%E5%BC%93-bronze.svg.png", + "60px-%E5%BC%93-silk.svg.png", + "60px-%E5%BC%93-seal.svg.png", + "60px-%E5%BC%93-bigseal.svg.png" + ], + "note": "Pictogram (象形) - pictographic representation of a bow." + }, + { + "no": 58, + "radical": ["彐", "彑"], + "strokeCount": 3, + "meaning": "snout", + "pinyin": "jì", + "hanViet": "ký/kệ", + "frequency": 25, + "examples": ["彔", "彖", "彗"], + "order": "%E5%BD%90-order.gif", + "glyphOrigin": ["60px-%E5%BD%90-seal.svg.png"], + "note": "彐" + }, + { + "no": 59, + "radical": ["彡"], + "strokeCount": 3, + "meaning": "bristle", + "pinyin": "shān", + "hanViet": "sam", + "frequency": 62, + "examples": ["形", "彤", "彥"], + "order": "%E5%BD%A1-order.gif", + "glyphOrigin": [ + "60px-%E5%BD%A1-seal.svg.png", + "60px-%E5%BD%A1-bigseal.svg.png" + ], + "note": "Pictogram (象形): 3 strands of hair." + }, + { + "no": 60, + "radical": ["彳"], + "strokeCount": 3, + "meaning": "step", + "pinyin": "chì", + "hanViet": "sách", + "frequency": 215, + "examples": ["㣔", "彴", "彷"], + "order": "%E5%BD%B3-order.gif", + "glyphOrigin": [ + "60px-%E5%BD%B3-bronze.svg.png", + "60px-%E5%BD%B3-seal.svg.png", + "60px-%E5%BD%B3-bigseal.svg.png" + ], + "note": "Simplified from 行 – the left side of the character." + }, + { + "no": 61, + "radical": ["心", "忄", "⺗"], + "strokeCount": 4, + "meaning": "heart", + "pinyin": "xīn", + "hanViet": "tâm", + "frequency": 1115, + "examples": ["必", "忉", "忌"], + "order": "%E5%BF%83-order.gif", + "glyphOrigin": [ + "60px-%E5%BF%83-bronze-shang.svg.png", + "60px-%E5%BF%83-oracle.svg.png", + "60px-%E5%BF%83-bronze.svg.png", + "60px-%E5%BF%83-silk.svg.png", + "60px-%E5%BF%83-seal.svg.png", + "60px-%E5%BF%83-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a heart, now highly stylized." + }, + { + "no": 62, + "radical": ["戈"], + "strokeCount": 4, + "meaning": "halberd", + "pinyin": "gē", + "hanViet": "qua", + "frequency": 116, + "examples": ["戊", "戉", "戌"], + "order": "%E6%88%88-order.gif", + "glyphOrigin": [ + "60px-%E6%88%88-oracle.svg.png", + "60px-%E6%88%88-bronze.svg.png", + "60px-%E6%88%88-silk.svg.png", + "60px-%E6%88%88-seal.svg.png" + ], + "note": "Pictogram (象形) ― a tool or weapon on a pole, the pole having developed into the long upper-left to lower-right diagonal stroke." + }, + { + "no": 63, + "radical": ["戶", "户", "戸"], + "strokeCount": 4, + "meaning": "door", + "pinyin": "hù", + "hanViet": "hộ", + "frequency": 44, + "simplified": "户", + "examples": ["戹", "戼", "戽"], + "order": "%E6%88%B6-order.gif", + "glyphOrigin": [ + "60px-%E6%88%B6-oracle.svg.png", + "60px-%E6%88%B6-bronze.svg.png", + "60px-%E6%88%B6-silk.svg.png", + "60px-%E6%88%B6-seal.svg.png", + "60px-%E6%88%B6-bigseal.svg.png" + ], + "note": "Pictogram (象形): half of 門 (“door”)." + }, + { + "no": 64, + "radical": ["手", "扌", "龵"], + "strokeCount": 4, + "meaning": "hand", + "pinyin": "shǒu", + "hanViet": "thủ", + "frequency": 1203, + "examples": ["才", "扎", "扐"], + "order": "%E6%89%8B-order.gif", + "glyphOrigin": [ + "60px-%E6%89%8B-bronze.svg.png", + "60px-%E6%89%8B-silk.svg.png", + "60px-%E6%89%8B-slip.svg.png", + "60px-%E6%89%8B-ancient.svg.png", + "60px-%E6%89%8B-seal.svg.png", + "60px-%E6%89%8B-bigseal.svg.png" + ], + "note": "Pictogram (象形) – hand and fingers. The top stroke is the bent over middle finger, while the horizontal strokes are each two fingers. Compare 爪, 寸, 九. Note that unlike the other hand/claw characters, 手 has consistently had five fingers: a mammalian/human hand, as opposed to the three digits often found in the others. Compare also 止 (“foot”), derived from a footprint, originally composed of 3 toes and a sole." + }, + { + "no": 65, + "radical": ["支"], + "strokeCount": 4, + "meaning": "branch", + "pinyin": "zhī", + "hanViet": "chi", + "frequency": 26, + "examples": ["攰", "攱", "攲"], + "order": "%E6%94%AF-order.gif", + "glyphOrigin": [ + "60px-%E6%94%AF-silk.svg.png", + "60px-%E6%94%AF-seal.svg.png", + "60px-%E6%94%AF-bigseal.svg.png" + ], + "note": "Shuowen: Half of 竹 + 又." + }, + { + "no": 66, + "radical": ["攴", "攵"], + "strokeCount": 4, + "meaning": "rap, tap", + "pinyin": "pū", + "hanViet": "phộc", + "frequency": 296, + "examples": ["收", "攷", "攸"], + "order": "%E6%94%B4-order.gif", + "glyphOrigin": [ + "60px-%E6%94%B4-oracle.svg.png", + "60px-%E6%94%B4-seal.svg.png", + "60px-%E6%94%B4-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *pʰoːɡ, *pʰroːɡ): phonetic 卜 (OC *poːɡ) + semantic 又 (“hand”)." + }, + { + "no": 67, + "radical": ["文"], + "strokeCount": 4, + "meaning": "script", + "pinyin": "wén", + "hanViet": "văn", + "frequency": 26, + "examples": ["斉", "斌", "斐"], + "order": "%E6%96%87-order.gif", + "glyphOrigin": [ + "60px-%E6%96%87-oracle.svg.png", + "60px-%E6%96%87-bronze.svg.png", + "60px-%E6%96%87-silk.svg.png", + "60px-%E6%96%87-seal.svg.png", + "60px-%E6%96%87-bigseal.svg.png" + ], + "note": "Ideogram (指事): a man with a painted or tattooed chest – original form of 紋. In current form, tattoo has vanished, so simply an outline of a man (head, outstretched arms, legs, chest). Compare 大, which has no chest." + }, + { + "no": 68, + "radical": ["斗"], + "strokeCount": 4, + "meaning": "dipper", + "pinyin": "dǒu", + "hanViet": "đẩu", + "frequency": 32, + "examples": ["料", "斚", "斛"], + "order": "%E6%96%97-order.gif", + "glyphOrigin": [ + "60px-%E6%96%97-oracle.svg.png", + "60px-%E6%96%97-bronze-spring.svg.png", + "60px-%E6%96%97-bronze-warring.svg.png", + "60px-%E6%96%97-slip.svg.png", + "60px-%E6%96%97-seal.svg.png", + "60px-%E6%96%97-bigseal.svg.png" + ], + "note": "Pictogram (象形) (Shuowen), indicating a ladle-shaped dou (see below) held by hand." + }, + { + "no": 69, + "radical": ["斤"], + "strokeCount": 4, + "meaning": "axe", + "pinyin": "jīn", + "hanViet": "cân", + "frequency": 55, + "examples": ["斥", "斧", "斨"], + "order": "%E6%96%A4-order.gif", + "glyphOrigin": [ + "60px-%E6%96%A4-oracle.svg.png", + "60px-%E6%96%A4-bronze.svg.png", + "60px-%E6%96%A4-silk.svg.png", + "60px-%E6%96%A4-seal.svg.png", + "60px-%E6%96%A4-bigseal.svg.png" + ], + "note": "Pictogram (象形) - an axe." + }, + { + "no": 70, + "radical": ["方"], + "strokeCount": 4, + "meaning": "square", + "pinyin": "fāng", + "hanViet": "phương", + "frequency": 92, + "examples": ["㫃", "於", "㫄"], + "order": "%E6%96%B9-order.gif", + "glyphOrigin": [ + "60px-%E6%96%B9-oracle.svg.png", + "60px-%E6%96%B9-bronze.svg.png", + "60px-%E6%96%B9-silk.svg.png", + "60px-%E6%96%B9-seal.svg.png", + "60px-%E6%96%B9-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 一 + 刀 (“sword”) – blade; tip of a blade. Original form of 芒 (OC *maːŋ, *maŋ, “awn (of cereal); tip (of blade)”); later borrowed to mean “side”. Other theories regarding the origin of this character also exist. It is unrelated to 㫃 (“fluttering flag”), from which characters like 旗 (OC *ɡɯ, “flag”) and 旅 (OC *ɡ·raʔ, “troops”) are derived." + }, + { + "no": 71, + "radical": ["无", "旡"], + "strokeCount": 4, + "meaning": "not", + "pinyin": "wú", + "hanViet": "vô", + "frequency": 12, + "examples": ["既", "旣", "旤"], + "order": "%E6%97%A0-order.gif", + "glyphOrigin": [ + "60px-%E6%97%A0-bronze.svg.png", + "60px-%E7%84%A1-seal.svg.png", + "60px-%E6%97%A0-bigseal.svg.png" + ], + "note": "One of the three characters (無, 无, 亡) that have historically been used to represent the word \"no, not any\". First attested in the Warring States period; used interchangeably with 無 until the Tang dynasty. Readopted by the PRC in 1956. The origin of this character is unknown. Probably an ancient variant form of either 元, 天 or 堯." + }, + { + "no": 72, + "radical": ["日"], + "strokeCount": 4, + "meaning": "sun", + "pinyin": "rì", + "hanViet": "nhật", + "frequency": 453, + "examples": ["旦", "旨", "早"], + "order": "%E6%97%A5-order.gif", + "glyphOrigin": [ + "60px-%E6%97%A5-oracle.svg.png", + "60px-%E6%97%A5-bronze.svg.png", + "60px-%E6%97%A5-silk.svg.png", + "60px-%E6%97%A5-seal.svg.png", + "60px-%E6%97%A5-bigseal.svg.png" + ], + "note": "Pictogram (象形) – the Sun. A dot or line was added in the centre to distinguish it from visually similar characters, e.g. 囗 (early form of 丁). Compare earlier forms of the character with the astronomical and astrological symbol for the Sun (☉) and the Egyptian hieroglyph 𓇳." + }, + { + "no": 73, + "radical": ["曰"], + "strokeCount": 4, + "meaning": "say", + "pinyin": "yuē", + "hanViet": "viết", + "frequency": 37, + "examples": ["曲", "曳", "更"], + "order": "%E6%9B%B0-order.gif", + "glyphOrigin": [ + "60px-%E6%9B%B0-oracle.svg.png", + "60px-%E6%9B%B0-bronze.svg.png", + "60px-%E6%9B%B0-silk.svg.png", + "60px-%E6%9B%B0-seal.svg.png", + "60px-%E6%9B%B0-bigseal.svg.png", + "60px-%E6%9B%B0-clerical.svg.png" + ], + "note": "Ideogram (指事): a mouth (口) with word or breath (一) coming out. Compare 今 and 言, where a small stroke is also used to represent words." + }, + { + "no": 74, + "radical": ["月"], + "strokeCount": 4, + "meaning": "moon", + "pinyin": "yuè", + "hanViet": "nguyệt", + "frequency": 69, + "examples": ["有", "朋", "服"], + "order": "%E6%9C%88-order.gif", + "glyphOrigin": [ + "60px-%E6%9C%88-oracle.svg.png", + "60px-%E6%9C%88-bronze.svg.png", + "60px-%E6%9C%88-silk.svg.png", + "60px-%E6%9C%88-seal.svg.png", + "60px-%E6%9C%88-bigseal.svg.png" + ], + "note": "Pictogram (象形) – pictographic representation of a crescent moon. Compare 夕." + }, + { + "no": 75, + "radical": ["木"], + "strokeCount": 4, + "meaning": "tree", + "pinyin": "mù", + "hanViet": "mộc", + "frequency": 1369, + "examples": ["未", "末", "本"], + "order": "%E6%9C%A8-order.gif", + "glyphOrigin": [ + "60px-%E6%9C%A8-oracle.svg.png", + "60px-%E6%9C%A8-bronze.svg.png", + "60px-%E6%9C%A8-silk.svg.png", + "60px-%E6%9C%A8-seal.svg.png", + "60px-%E6%9C%A8-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a tree: branches on top, roots on the bottom (more visible in earlier forms)." + }, + { + "no": 76, + "radical": ["欠"], + "strokeCount": 4, + "meaning": "lack", + "pinyin": "qiàn", + "hanViet": "khiếm", + "frequency": 235, + "examples": ["次", "欣", "欥"], + "order": "%E6%AC%A0-order.gif", + "glyphOrigin": [ + "60px-%E6%AC%A0-seal.svg.png", + "60px-%E6%AC%A0-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 77, + "radical": ["止"], + "strokeCount": 4, + "meaning": "stop", + "pinyin": "zhǐ", + "hanViet": "chỉ", + "frequency": 99, + "examples": ["正", "此", "步"], + "order": "%E6%AD%A2-order.gif", + "glyphOrigin": [ + "60px-%E6%AD%A2-bronze-shang.svg.png", + "60px-%E6%AD%A2-oracle.svg.png", + "60px-%E6%AD%A2-bronze.svg.png", + "60px-%E6%AD%A2-silk.svg.png", + "60px-%E6%AD%A2-slip.svg.png", + "60px-%E6%AD%A2-seal.svg.png", + "60px-%E6%AD%A2-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a footprint, originally meaning \"foot\". The derivative 趾 (OC *kjɯʔ) refers to the original meaning. Compare 手 (“hand”). Note that in oracle script, composed of 3 toes and a sole. Compare to 夊, 夂, which have similar shape in oracle script, but pointing down (toe pointing right), and 𡕒 (as in right side of 舛, roughly ヰ, toe pointing left), hence different evolution." + }, + { + "no": 78, + "radical": ["歹", "歺"], + "strokeCount": 4, + "meaning": "death", + "pinyin": "dǎi", + "hanViet": "ngạt/đãi", + "frequency": 231, + "examples": ["歺", "死", "歿"], + "order": "%E6%AD%B9-order.gif", + "glyphOrigin": [ + "60px-%E6%AD%B9-oracle.svg.png", + "60px-%E6%AD%B9-seal.svg.png", + "60px-%E6%AD%B9-bigseal.svg.png" + ], + "note": "Pictogram (象形) - human remains." + }, + { + "no": 79, + "radical": ["殳"], + "strokeCount": 4, + "meaning": "weapon", + "pinyin": "shū", + "hanViet": "thù", + "frequency": 93, + "examples": ["段", "殷", "殺"], + "order": "%E6%AE%B3-order.gif", + "glyphOrigin": [ + "60px-%E6%AE%B3-oracle.svg.png", + "60px-%E6%AE%B3-bronze.svg.png", + "60px-%E6%9D%B8-silk.svg.png", + "60px-%E6%AE%B3-slip.svg.png", + "60px-%E6%AE%B3-seal.svg.png", + "60px-%E6%AE%B3-bigseal.svg.png" + ], + "note": "Pictogram (象形) or Ideogrammic compound (會意): 几 + 又 – a hand holding a tool, hence activity." + }, + { + "no": 80, + "radical": ["毋", "母"], + "strokeCount": 4, + "meaning": "do not", + "pinyin": "wú", + "hanViet": "vô", + "frequency": 16, + "examples": ["母", "每", "毐"], + "order": "%E6%AF%8B-order.gif", + "glyphOrigin": [ + "60px-%E6%AF%8B-bronze.svg.png", + "60px-%E6%AF%8B-seal.svg.png", + "60px-%E6%AF%8B-bigseal.svg.png" + ], + "note": "In the oracle bone script, 母 (“mother”) was borrowed to represent this character. It was later specialized to distinguish it from “mother”, replacing the two dots with one stroke." + }, + { + "no": 81, + "radical": ["比"], + "strokeCount": 4, + "meaning": "compare", + "pinyin": "bǐ", + "hanViet": "tỷ", + "frequency": 21, + "examples": ["毖", "毗", "毘"], + "order": "%E6%AF%94-order.gif", + "glyphOrigin": [ + "60px-%E6%AF%94-oracle.svg.png", + "60px-%E6%AF%94-bronze.svg.png", + "60px-%E6%AF%94-silk.svg.png", + "60px-%E5%A4%B6-ancient.svg.png", + "60px-%E6%AF%94-seal.svg.png", + "60px-%E6%AF%94-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 人 (“man”) + 人 – to juxtapose." + }, + { + "no": 82, + "radical": ["毛"], + "strokeCount": 4, + "meaning": "fur", + "pinyin": "máo", + "hanViet": "mao", + "frequency": 211, + "examples": ["毡", "毣", "毧"], + "order": "%E6%AF%9B-order.gif", + "glyphOrigin": [ + "60px-%E6%AF%9B-bronze.svg.png", + "60px-%E6%AF%9B-silk.svg.png", + "60px-%E6%AF%9B-seal.svg.png", + "60px-%E6%AF%9B-bigseal.svg.png" + ], + "note": "Pictogram (象形) – feather or hair." + }, + { + "no": 83, + "radical": ["氏"], + "strokeCount": 4, + "meaning": "clan", + "pinyin": "shì", + "hanViet": "thị", + "frequency": 10, + "examples": ["氐", "民", "氓"], + "order": "%E6%B0%8F-order.gif", + "glyphOrigin": [ + "60px-%E6%B0%8F-oracle.svg.png", + "60px-%E6%B0%8F-bronze.svg.png", + "60px-%E6%B0%8F-silk.svg.png", + "60px-%E6%B0%8F-seal.svg.png", + "60px-%E6%B0%8F-bigseal.svg.png" + ], + "note": "Pictogram (象形) – There are various interpretations: a man bending over to sow the field,[1] the root of a tree,[2] a man bowing over to the right, etc." + }, + { + "no": 84, + "radical": ["气"], + "strokeCount": 4, + "meaning": "steam", + "pinyin": "qì", + "hanViet": "khí", + "frequency": 17, + "simplified": "(pr. 氣)", + "examples": ["氕", "氘", "氚"], + "order": "%E6%B0%94-order.gif", + "glyphOrigin": [ + "60px-%E6%B0%94-oracle.svg.png", + "60px-%E6%B0%94-bronze.svg.png", + "60px-%E6%B0%94-bronze-spring.svg.png", + "60px-%E6%B0%94-silk.svg.png", + "60px-%E6%B0%94-slip.svg.png", + "60px-%E6%B0%94-seal.svg.png", + "60px-%E6%B0%94-bigseal.svg.png" + ], + "note": "气 (OC *kʰɯds) is a pictogram (象形) of clouds flowing through the sky. In the oracle bone script, it was represented by three horizontal strokes, expressing the \"feeling\" of the sky. However, in order to avoid confusion with the number 三 (OC *suːm, *suːms), the current 气 (OC *kʰɯds) was changed to draw a small stroke from top to bottom. The glyph of 氣 (OC *kʰɯds, *qʰɯds) and 乞 (OC *kʰɯds, *kʰɯd) comes from the same ancient form." + }, + { + "no": 85, + "radical": ["水", "氵", "氺"], + "strokeCount": 4, + "meaning": "water", + "pinyin": "shuǐ", + "hanViet": "thủy", + "frequency": 1595, + "examples": ["永", "氷", "氾"], + "order": "%E6%B0%B4-order.gif", + "glyphOrigin": [ + "60px-%E6%B0%B4-oracle.svg.png", + "60px-%E6%B0%B4-bronze.svg.png", + "60px-%E6%B0%B4-bronze-warring.svg.png", + "60px-%E6%B0%B4-silk.svg.png", + "60px-%E6%B0%B4-slip.svg.png", + "60px-%E6%B0%B4-seal.svg.png", + "60px-%E6%B0%B4-bigseal.svg.png" + ], + "note": "Pictogram (象形) – compare 川 (chuān)." + }, + { + "no": 86, + "radical": ["火", "灬"], + "strokeCount": 4, + "meaning": "fire", + "pinyin": "huǒ", + "hanViet": "hỏa", + "frequency": 639, + "examples": ["灰", "灯", "灶"], + "order": "%E7%81%AB-order.gif", + "glyphOrigin": [ + "60px-%E7%81%AB-oracle.svg.png", + "60px-%E7%81%AB-bronze.svg.png", + "60px-%E7%81%AB-bronze-spring.svg.png", + "60px-%E7%81%AB-silk.svg.png", + "60px-%E7%81%AB-slip.svg.png", + "60px-%E7%81%AB-seal.svg.png", + "60px-%E7%81%AB-bigseal.svg.png" + ], + "note": "Pictogram (象形) – pictographic representation of a fire." + }, + { + "no": 87, + "radical": ["爪", "爫"], + "strokeCount": 4, + "meaning": "claw", + "pinyin": "zhǎo", + "hanViet": "trảo", + "frequency": 36, + "examples": ["爬", "爭", "爰"], + "order": "%E7%88%AA-order.gif", + "glyphOrigin": [ + "60px-%E7%88%AA-oracle.svg.png", + "60px-%E7%88%AA-bronze.svg.png", + "60px-%E7%88%AA-seal.svg.png", + "60px-%E7%88%AA-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a hand grabbing from above (in earlier forms from side); compare 手, 寸, 九." + }, + { + "no": 88, + "radical": ["父"], + "strokeCount": 4, + "meaning": "father", + "pinyin": "fù", + "hanViet": "phụ", + "frequency": 10, + "examples": ["爸", "爹", "爺"], + "order": "%E7%88%B6-order.gif", + "glyphOrigin": [ + "60px-%E7%88%B6-oracle.svg.png", + "60px-%E7%88%B6-bronze.svg.png", + "60px-%E7%88%B6-silk.svg.png", + "60px-%E7%88%B6-seal.svg.png", + "60px-%E7%88%B6-bigseal.svg.png" + ], + "note": "Pictogram (象形) – A hand holding a stone, referring to a man working with a stone axe." + }, + { + "no": 89, + "radical": ["爻"], + "strokeCount": 4, + "meaning": "Trigrams", + "pinyin": "yáo", + "hanViet": "hào", + "frequency": 16, + "examples": ["爼", "爽", "爾"], + "order": "%E7%88%BB-order.gif", + "glyphOrigin": [ + "60px-%E7%88%BB-oracle.svg.png", + "60px-%E7%88%BB-bronze.svg.png", + "60px-%E7%88%BB-seal.svg.png", + "60px-%E7%88%BB-bigseal.svg.png" + ], + "note": "Pictogram (象形): 乂 + 乂 – 2 stacked ‘X’ marks, indicating cuts or marks." + }, + { + "no": 90, + "radical": ["爿", "丬"], + "strokeCount": 4, + "meaning": "split wood", + "pinyin": "qiáng", + "hanViet": "tường", + "frequency": 48, + "examples": ["牀", "牁", "牂"], + "order": "%E7%88%BF-order.gif", + "glyphOrigin": [ + "60px-%E7%88%BF-bronze-shang.svg.png", + "60px-%E7%88%BF-oracle.svg.png", + "60px-%E7%89%80-bronze-warring.svg.png", + "60px-%E7%89%80-silk.svg.png", + "60px-%E7%89%80-slip.svg.png" + ], + "note": "Pictogram (象形) - a bed. The original form of 牀 (OC *zraŋ)." + }, + { + "no": 91, + "radical": ["片"], + "strokeCount": 4, + "meaning": "slice", + "pinyin": "piàn", + "hanViet": "phiến", + "frequency": 77, + "examples": ["版", "牉", "牌"], + "order": "%E7%89%87-order.gif", + "glyphOrigin": [ + "60px-%E7%89%87-seal.svg.png", + "60px-%E7%89%87-bigseal.svg.png" + ], + "note": "Mirror image of 爿 (OC *braːn, “piece”). Shuowen: Half of 木 (“wood; tree”) to denote “to pare; to slice”." + }, + { + "no": 92, + "radical": ["牙"], + "strokeCount": 4, + "meaning": "fang", + "pinyin": "yá", + "hanViet": "nha", + "frequency": 9, + "examples": ["㸦", "㸧", "牚"], + "order": "%E7%89%99-order.gif", + "glyphOrigin": [ + "60px-%E7%89%99-bronze.svg.png", + "60px-%E7%89%99-seal.svg.png", + "60px-%E7%89%99-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 93, + "radical": ["牛", "牜", "⺧"], + "strokeCount": 4, + "meaning": "cow", + "pinyin": "niú", + "hanViet": "ngưu", + "frequency": 233, + "examples": ["牝", "牟", "牠"], + "order": "%E7%89%9B-order.gif", + "glyphOrigin": [ + "60px-%E7%89%9B-oracle.svg.png", + "60px-%E7%89%9B-bronze.svg.png", + "60px-%E7%89%9B-silk.svg.png", + "60px-%E7%89%9B-seal.svg.png", + "60px-%E7%89%9B-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 94, + "radical": ["犬", "犭"], + "strokeCount": 4, + "meaning": "dog", + "pinyin": "quǎn", + "hanViet": "khuyển", + "frequency": 444, + "examples": ["犮", "犯", "犰"], + "order": "%E7%8A%AC-order.gif", + "glyphOrigin": [ + "60px-%E7%8A%AC-bronze-shang.svg.png", + "60px-%E7%8A%AC-oracle.svg.png", + "60px-%E7%8A%AC-bronze.svg.png", + "60px-%E7%8A%AC-silk.svg.png", + "60px-%E7%8A%AC-seal.svg.png", + "60px-%E7%8A%AC-bigseal.svg.png" + ], + "note": "Pictogram (象形) The side view of a dog." + }, + { + "no": 95, + "radical": ["玄"], + "strokeCount": 5, + "meaning": "profound", + "pinyin": "xuán", + "hanViet": "huyền", + "frequency": 6, + "examples": ["玅", "率", "玈"], + "order": "%E7%8E%84-order.gif", + "glyphOrigin": [ + "60px-%E7%8E%84-bronze.svg.png", + "60px-%E7%8E%84-seal.svg.png", + "60px-%E7%8E%84-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 96, + "radical": ["玉", "王", "玊"], + "strokeCount": 5, + "meaning": "jade", + "pinyin": "yù", + "hanViet": "ngọc", + "frequency": 473, + "examples": ["玻", "瑪", "璧"], + "order": "%E7%8E%89-order.gif", + "glyphOrigin": [ + "60px-%E7%8E%89-bronze-shang.svg.png", + "60px-%E7%8E%89-oracle.svg.png", + "60px-%E7%8E%89-bronze.svg.png", + "60px-%E7%8E%89-bronze-spring.svg.png", + "60px-%E7%8E%89-bronze-warring.svg.png", + "60px-%E7%8E%89-silk.svg.png", + "60px-%E7%8E%89-slip.svg.png", + "60px-%E7%8E%89-ancient.svg.png", + "60px-%E7%8E%89-seal.svg.png", + "60px-%E7%8E%89-bigseal.svg.png", + "60px-%E7%8E%89-clerical.svg.png" + ], + "note": "The character's shape was historically very similar to 王; a dot was introduced to differentiate the two. Pictogram (象形): a picture of a cong (琮), a sort of ritual jade totem. It is also interpreted as three pieces of jade strung together on a string." + }, + { + "no": 97, + "radical": ["瓜"], + "strokeCount": 5, + "meaning": "melon", + "pinyin": "guā", + "hanViet": "qua", + "frequency": 55, + "examples": ["瓝", "瓞", "瓟"], + "order": "%E7%93%9C-order.gif", + "glyphOrigin": [ + "60px-%E7%93%9C-bronze-warring.svg.png", + "60px-%E7%93%9C-seal.svg.png", + "60px-%E7%93%9C-bigseal.svg.png" + ], + "note": "Pictogram (象形) - a pictograph of a melon suspended by its vines." + }, + { + "no": 98, + "radical": ["瓦"], + "strokeCount": 5, + "meaning": "tile", + "pinyin": "wǎ", + "hanViet": "ngõa", + "frequency": 174, + "examples": ["㼚", "瓮", "瓫"], + "order": "%E7%93%A6-order.gif", + "glyphOrigin": [ + "60px-%E7%93%A6-silk.svg.png", + "60px-%E7%93%A6-seal.svg.png", + "60px-%E7%93%A6-bigseal.svg.png" + ], + "note": "Pictogram (象形) – fired earthenware pottery, or a tile." + }, + { + "no": 99, + "radical": ["甘"], + "strokeCount": 5, + "meaning": "sweet", + "pinyin": "gān", + "hanViet": "cam", + "frequency": 22, + "examples": ["甚", "甜", "甛"], + "order": "%E7%94%98-order.gif", + "glyphOrigin": [ + "60px-%E7%94%98-oracle.svg.png", + "60px-%E7%94%98-bronze.svg.png", + "60px-%E7%94%98-seal.svg.png", + "60px-%E7%94%98-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 100, + "radical": ["生"], + "strokeCount": 5, + "meaning": "life", + "pinyin": "shēng", + "hanViet": "sinh", + "frequency": 22, + "examples": ["甡", "產", "甥"], + "order": "%E7%94%9F-order.gif", + "glyphOrigin": [ + "60px-%E7%94%9F-oracle.svg.png", + "60px-%E7%94%9F-bronze.svg.png", + "60px-%E7%94%9F-seal.svg.png", + "60px-%E7%94%9F-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 屮 (“bud”) + 一 (“ground”) – sprouting from the ground." + }, + { + "no": 101, + "radical": ["用"], + "strokeCount": 5, + "meaning": "use", + "pinyin": "yòng (shuǎi)", + "hanViet": "dụng", + "frequency": 10, + "examples": ["甩", "甫", "甬"], + "order": "%E7%94%A8-order.gif", + "glyphOrigin": [ + "60px-%E7%94%A8-oracle.svg.png", + "60px-%E7%94%A8-bronze.svg.png", + "60px-%E7%94%A8-bronze-spring.svg.png", + "60px-%E7%94%A8-bronze-warring.svg.png", + "60px-%E7%94%A8-silk.svg.png", + "60px-%E7%94%A8-slip.svg.png", + "60px-%E7%94%A8-ancient.svg.png", + "60px-%E7%94%A8-seal.svg.png", + "60px-%E7%94%A8-bigseal.svg.png" + ], + "note": "Pictogram (象形): a water bucket. Compare 桶." + }, + { + "no": 102, + "radical": ["田"], + "strokeCount": 5, + "meaning": "field", + "pinyin": "tián", + "hanViet": "điền", + "frequency": 192, + "examples": ["由", "甲", "申"], + "order": "%E7%94%B0-order.gif", + "glyphOrigin": [ + "60px-%E7%94%B0-bronze-shang.svg.png", + "60px-%E7%94%B0-oracle.svg.png", + "60px-%E7%94%B0-bronze.svg.png", + "60px-%E7%94%B0-silk.svg.png", + "60px-%E7%94%B0-seal.svg.png", + "60px-%E7%94%B0-bigseal.svg.png" + ], + "note": "Pictogram (象形) – pictographic representation of a field." + }, + { + "no": 103, + "radical": ["疋", "⺪"], + "strokeCount": 5, + "meaning": "bolt of cloth", + "pinyin": "pǐ", + "hanViet": "thất/sơ", + "frequency": 15, + "examples": ["疌", "疏", "疎"], + "order": "%E7%96%8B-order.gif", + "glyphOrigin": [ + "60px-%E7%96%8B-seal.svg.png", + "60px-%E7%96%8B-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a foot 止 with a leg/thigh on top." + }, + { + "no": 104, + "radical": ["疒"], + "strokeCount": 5, + "meaning": "sickness", + "pinyin": "nè", + "hanViet": "nạch", + "frequency": 526, + "examples": ["疔", "疚", "疝"], + "order": "%E7%96%92-order.gif", + "glyphOrigin": [ + "60px-%E7%96%92-oracle.svg.png", + "60px-%E7%96%92-bronze.svg.png", + "60px-%E7%96%92-seal.svg.png" + ], + "note": "Pictogram (象形) – a bed or stretcher for the sick." + }, + { + "no": 105, + "radical": ["癶"], + "strokeCount": 5, + "meaning": "footsteps", + "pinyin": "bō", + "hanViet": "bát", + "frequency": 15, + "examples": ["癸", "癹", "発"], + "order": "%E7%99%B6-order.gif", + "glyphOrigin": ["60px-%E7%99%B6-seal.svg.png"], + "note": "A right and a left foot (止)" + }, + { + "no": 106, + "radical": ["白"], + "strokeCount": 5, + "meaning": "white", + "pinyin": "bái", + "hanViet": "bạch", + "frequency": 109, + "examples": ["百", "皀", "皁"], + "order": "%E7%99%BD-order.gif", + "glyphOrigin": [ + "60px-%E7%99%BD-oracle.svg.png", + "60px-%E7%99%BD-bronze.svg.png", + "60px-%E7%99%BD-seal.svg.png", + "60px-%E7%99%BD-bigseal.svg.png" + ], + "note": "Unclear; probably a pictogram (象形). Guo (1954) suggests that it represents a thumb and is original form of 拇 (OC *mɯʔ) or, more probably, 擘 (OC *preːɡ). Alternatively, Unger (apud Schuessler, 2007) suggests that it represents an acorn, noting its use in 樂 (“oak”) (= 櫟) and 皂 (“acorn”)." + }, + { + "no": 107, + "radical": ["皮"], + "strokeCount": 5, + "meaning": "skin", + "pinyin": "pí", + "hanViet": "bì", + "frequency": 94, + "examples": ["皯", "皰", "皴"], + "order": "%E7%9A%AE-order.gif", + "glyphOrigin": [ + "60px-%E7%9A%AE-bronze.svg.png", + "60px-%E7%9A%AE-seal.svg.png", + "60px-%E7%9A%AE-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a hand (又) stripping the fur from an animal pelt (similar to 革). The pelt moved to the top left and became abstracted." + }, + { + "no": 108, + "radical": ["皿"], + "strokeCount": 5, + "meaning": "dish", + "pinyin": "mǐn", + "hanViet": "mãnh", + "frequency": 129, + "examples": ["盂", "盃", "盅"], + "order": "%E7%9A%BF-order.gif", + "glyphOrigin": [ + "60px-%E7%9A%BF-oracle.svg.png", + "60px-%E7%9A%BF-bronze.svg.png", + "60px-%E7%9A%BF-seal.svg.png", + "60px-%E7%9A%BF-bigseal.svg.png" + ], + "note": "Pictogram (象形) A pictograph of an empty container, such as a chalice. The handles are conjoined in the modern form." + }, + { + "no": 109, + "radical": ["目", "⺫"], + "strokeCount": 5, + "meaning": "eye", + "pinyin": "mù", + "hanViet": "mục", + "frequency": 647, + "examples": ["盯", "盱", "盲"], + "order": "%E7%9B%AE-order.gif", + "glyphOrigin": [ + "60px-%E7%9B%AE-oracle.svg.png", + "60px-%E7%9B%AE-bronze.svg.png", + "60px-%E7%9B%AE-slip.svg.png", + "60px-%E7%9B%AE-ancient.svg.png", + "60px-%E7%9B%AE-seal.svg.png", + "60px-%E7%9B%AE-bigseal.svg.png" + ], + "note": "Pictogram (象形) – human eye, now rotated 90 degrees. Compare the Egyptian hieroglyph 𓁹." + }, + { + "no": 110, + "radical": ["矛"], + "strokeCount": 5, + "meaning": "spear", + "pinyin": "máo", + "hanViet": "mâu", + "frequency": 65, + "examples": ["矜", "矞", "矟"], + "order": "%E7%9F%9B-order.gif", + "glyphOrigin": [ + "60px-%E7%9F%9B-bronze.svg.png", + "60px-%E7%9F%9B-seal.svg.png", + "60px-%E7%9F%9B-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 111, + "radical": ["矢"], + "strokeCount": 5, + "meaning": "arrow", + "pinyin": "shǐ", + "hanViet": "thỉ", + "frequency": 64, + "examples": ["矣", "知", "矧"], + "order": "%E7%9F%A2-order.gif", + "glyphOrigin": [ + "60px-%E7%9F%A2-oracle.svg.png", + "60px-%E7%9F%A2-bronze.svg.png", + "60px-%E7%9F%A2-seal.svg.png", + "60px-%E7%9F%A2-bigseal.svg.png" + ], + "note": "Pictogram (象形) - pictographic representation of an arrow. More recognizable in older forms." + }, + { + "no": 112, + "radical": ["石"], + "strokeCount": 5, + "meaning": "stone", + "pinyin": "shí", + "hanViet": "thạch", + "frequency": 499, + "examples": ["矸", "矻", "矼"], + "order": "%E7%9F%B3-order.gif", + "glyphOrigin": [ + "60px-%E7%9F%B3-oracle.svg.png", + "60px-%E7%9F%B3-bronze.svg.png", + "60px-%E7%9F%B3-silk.svg.png", + "60px-%E7%9F%B3-seal.svg.png", + "60px-%E7%9F%B3-bigseal.svg.png" + ], + "note": "Pictogram (象形): a stone beneath a cliff (厂). The cliff was subsequently distorted into 丆. Alternatively, a cave set into the side of a cliff or mountain." + }, + { + "no": 113, + "radical": ["示", "礻"], + "strokeCount": 5, + "meaning": "spirit", + "pinyin": "shì", + "hanViet": "thị/kỳ", + "frequency": 213, + "examples": ["礼", "礽", "社"], + "order": "%E7%A4%BA-order.gif", + "glyphOrigin": [ + "60px-%E7%A4%BA-bronze-shang.svg.png", + "60px-%E7%A4%BA-oracle.svg.png", + "60px-%E7%A4%BA-silk.svg.png", + "60px-%E7%A4%BA-ancient.svg.png", + "60px-%E7%A4%BA-seal.svg.png", + "60px-%E7%A4%BA-bigseal.svg.png" + ], + "note": "Pictogram (象形) – an altar. The original form is similar to unrelated character 丅, and additional strokes are added to prevent confusion." + }, + { + "no": 114, + "radical": ["禸"], + "strokeCount": 5, + "meaning": "track", + "pinyin": "róu", + "hanViet": "nhựu", + "frequency": 12, + "examples": ["禹", "禺", "离"], + "order": "%E7%A6%B8-order.gif", + "glyphOrigin": ["60px-%E7%A6%B8-seal.svg.png"], + "note": "" + }, + { + "no": 115, + "radical": ["禾"], + "strokeCount": 5, + "meaning": "grain", + "pinyin": "hé", + "hanViet": "hòa", + "frequency": 431, + "examples": ["禿", "秀", "私"], + "order": "%E7%A6%BE-order.gif", + "glyphOrigin": [ + "60px-%E7%A6%BE-oracle.svg.png", + "60px-%E7%A6%BE-bronze.svg.png", + "60px-%E7%A6%BE-seal.svg.png", + "60px-%E7%A6%BE-bigseal.svg.png" + ], + "note": "Pictogram (象形) – picture of a plant stalk. The stalk is more recognizable in older form." + }, + { + "no": 116, + "radical": ["穴"], + "strokeCount": 5, + "meaning": "cave", + "pinyin": "xué", + "hanViet": "huyệt", + "frequency": 298, + "examples": ["究", "穸", "空"], + "order": "%E7%A9%B4-order.gif", + "glyphOrigin": [ + "60px-%E7%A9%B4-seal.svg.png", + "60px-%E7%A9%B4-bigseal.svg.png" + ], + "note": "Pictogram (象形)—possibly an entrance to a cave or a door flap." + }, + { + "no": 117, + "radical": ["立"], + "strokeCount": 5, + "meaning": "stand", + "pinyin": "lì", + "hanViet": "lập", + "frequency": 101, + "examples": ["竑", "竒", "竘"], + "order": "%E7%AB%8B-order.gif", + "glyphOrigin": [ + "60px-%E7%AB%8B-oracle.svg.png", + "60px-%E7%AB%8B-bronze.svg.png", + "60px-%E7%AB%8B-seal.svg.png" + ], + "note": "Pictogram (象形) – a person standing on the ground; compare 大." + }, + { + "no": 118, + "radical": ["竹", "⺮"], + "strokeCount": 6, + "meaning": "bamboo", + "pinyin": "zhú", + "hanViet": "trúc", + "frequency": 953, + "examples": ["竺", "竽", "竿"], + "order": "%E7%AB%B9-order.gif", + "glyphOrigin": [ + "60px-%E7%AB%B9-bronze-shang.svg.png", + "60px-%E7%AB%B9-oracle.svg.png", + "60px-%E7%AB%B9-bronze.svg.png", + "60px-%E7%AB%B9-bronze-warring.svg.png", + "60px-%E7%AB%B9-silk.svg.png", + "60px-%E7%AB%B9-slip.svg.png", + "60px-%E7%AB%B9-seal.svg.png", + "60px-%E7%AB%B9-bigseal.svg.png" + ], + "note": "Pictogram (象形) – two bamboo stalks, with leaves. Earlier forms resembled 个 + 个, current form resembles rather ケ + ケ." + }, + { + "no": 119, + "radical": ["米"], + "strokeCount": 6, + "meaning": "rice", + "pinyin": "mǐ", + "hanViet": "mễ", + "frequency": 318, + "examples": ["籸", "籹", "籽"], + "order": "%E7%B1%B3-order.gif", + "glyphOrigin": [ + "60px-%E7%B1%B3-oracle.svg.png", + "60px-%E7%B1%B3-bronze.svg.png", + "60px-%E7%B1%B3-silk.svg.png", + "60px-%E7%B1%B3-slip.svg.png", + "60px-%E7%B1%B3-seal.svg.png", + "60px-%E7%B1%B3-bigseal.svg.png" + ], + "note": "Pictogram (象形) – rice kernels." + }, + { + "no": 120, + "radical": ["糸", "糹"], + "strokeCount": 6, + "meaning": "silk", + "pinyin": "mì", + "hanViet": "mịch/ty", + "frequency": 823, + "simplified": "纟", + "examples": ["系", "糾", "紀"], + "order": "%E7%B3%B8-order.gif", + "glyphOrigin": [ + "60px-%E7%B3%B8-bronze-shang.svg.png", + "60px-%E7%B3%B8-oracle.svg.png", + "60px-%E7%B3%B8-bronze.svg.png", + "60px-%E7%B3%B8-ancient.svg.png", + "60px-%E7%B3%B8-seal.svg.png" + ], + "note": "Pictogram (象形): a skein of silk." + }, + { + "no": 121, + "radical": ["缶"], + "strokeCount": 6, + "meaning": "jar", + "pinyin": "fǒu", + "hanViet": "phẫu", + "frequency": 77, + "examples": ["缸", "缺", "缽"], + "order": "%E7%BC%B6-order.gif", + "glyphOrigin": [ + "60px-%E7%BC%B6-oracle.svg.png", + "60px-%E7%BC%B6-bronze-spring.svg.png", + "60px-%E7%BC%B6-seal.svg.png", + "60px-%E7%BC%B6-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a pot with a lid." + }, + { + "no": 122, + "radical": ["网", "⺲", "罓", "⺳"], + "strokeCount": 6, + "meaning": "net", + "pinyin": "wǎng", + "hanViet": "võng", + "frequency": 163, + "examples": ["罔", "罕", "罘"], + "order": "%E7%BD%91-order.gif", + "glyphOrigin": [ + "60px-%E5%86%88-bronze-shang.svg.png", + "60px-%E7%BD%91-oracle.svg.png", + "60px-%E5%86%88-bronze.svg.png", + "60px-%E5%86%88-bronze-spring.svg.png", + "60px-%E5%86%88-bronze-warring.svg.png", + "60px-%E7%BD%94-silk.svg.png", + "60px-%E7%BD%94-slip.svg.png", + "60px-%E7%BD%91-zhou.svg.png", + "60px-%E7%BD%94-ancient.svg.png", + "60px-%E7%BD%91-seal.svg.png" + ], + "note": "Pictogram (象形) – a net." + }, + { + "no": 123, + "radical": ["羊", "⺶", "⺷"], + "strokeCount": 6, + "meaning": "sheep", + "pinyin": "yáng", + "hanViet": "dương", + "frequency": 156, + "examples": ["羋", "羌", "美"], + "order": "%E7%BE%8A-order.gif", + "glyphOrigin": [ + "60px-%E7%BE%8A-oracle.svg.png", + "60px-%E7%BE%8A-bronze.svg.png", + "60px-%E7%BE%8A-seal.svg.png", + "60px-%E7%BE%8A-bigseal.svg.png" + ], + "note": "Pictogram (象形) – picture of a ram's head." + }, + { + "no": 124, + "radical": ["羽"], + "strokeCount": 6, + "meaning": "feather", + "pinyin": "yǔ", + "hanViet": "vũ", + "frequency": 220, + "examples": ["羿", "翀", "翁"], + "order": "%E7%BE%BD-order.gif", + "glyphOrigin": [ + "60px-%E7%BE%BD-oracle.svg.png", + "60px-%E7%BE%BD-bronze.svg.png", + "60px-%E7%BE%BD-seal.svg.png", + "60px-%E7%BE%BD-bigseal.svg.png" + ], + "note": "Pictogram (象形): wings or feathers." + }, + { + "no": 125, + "radical": ["老", "耂"], + "strokeCount": 6, + "meaning": "old", + "pinyin": "lǎo", + "hanViet": "lão", + "frequency": 22, + "examples": ["考", "者", "耆"], + "order": "%E8%80%81-order.gif", + "glyphOrigin": [ + "60px-%E8%80%81-oracle.svg.png", + "60px-%E8%80%81-bronze.svg.png", + "60px-%E8%80%81-silk.svg.png", + "60px-%E8%80%81-seal.svg.png", + "60px-%E8%80%81-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 人 (“man”) + 毛 (“hair”) + 匕 (“cane”) – a man with long hair (an old man), leaning on a cane. Compare top component to 孝 (OC *qʰruːs). Cognate to 考 (OC *kʰluːʔ); the most commonly cited example of 轉注 (“reciprocal meaning”)." + }, + { + "no": 126, + "radical": ["而"], + "strokeCount": 6, + "meaning": "and", + "pinyin": "ér", + "hanViet": "nhi", + "frequency": 22, + "examples": ["耍", "耎", "耏"], + "order": "%E8%80%8C-order.gif", + "glyphOrigin": [ + "60px-%E8%80%8C-oracle.svg.png", + "60px-%E8%80%8C-bronze.svg.png", + "60px-%E8%80%8C-seal.svg.png", + "60px-%E8%80%8C-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a beard. Original form of 耏 (OC *nɯːs, *njɯ) or 髵 (OC *njɯ)." + }, + { + "no": 127, + "radical": ["耒"], + "strokeCount": 6, + "meaning": "plow", + "pinyin": "lěi", + "hanViet": "lỗi", + "frequency": 84, + "examples": ["耔", "耕", "耖"], + "order": "%E8%80%92-order.gif", + "glyphOrigin": [ + "60px-%E8%80%92-seal.svg.png", + "60px-%E8%80%92-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a wooden (木) plow with originally three cross lines (彡) for the furrows of the plow, later simplified to two. 耒" + }, + { + "no": 128, + "radical": ["耳"], + "strokeCount": 6, + "meaning": "ear", + "pinyin": "ěr", + "hanViet": "nhĩ", + "frequency": 172, + "examples": ["耴", "耵", "耷"], + "order": "%E8%80%B3-order.gif", + "glyphOrigin": [ + "60px-%E8%80%B3-bronze-shang.svg.png", + "60px-%E8%80%B3-oracle.svg.png", + "60px-%E8%80%B3-bronze.svg.png", + "60px-%E8%80%B3-silk.svg.png", + "60px-%E8%80%B3-slip.svg.png", + "60px-%E8%80%B3-seal.svg.png", + "60px-%E8%80%B3-bigseal.svg.png" + ], + "note": "Pictogram (象形) – an ear." + }, + { + "no": 129, + "radical": ["聿", "⺺", "⺻"], + "strokeCount": 6, + "meaning": "brush", + "pinyin": "yù", + "hanViet": "duật", + "frequency": 19, + "examples": ["肄", "肆", "肅"], + "order": "%E8%81%BF-order.gif", + "glyphOrigin": [ + "60px-%E8%81%BF-oracle.svg.png", + "60px-%E8%81%BF-bronze.svg.png", + "60px-%E8%81%BF-seal.svg.png", + "60px-%E8%81%BF-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *b·lud): semantic 𦘒 + phonetic 一 (OC *qliɡ)." + }, + { + "no": 130, + "radical": ["肉", "⺼"], + "strokeCount": 6, + "meaning": "meat", + "pinyin": "ròu", + "hanViet": "nhục", + "frequency": 674, + "simplified": "月", + "examples": ["肊", "肋", "然"], + "order": "%E8%82%89-order.gif", + "glyphOrigin": [ + "60px-%E8%82%89-oracle.svg.png", + "60px-%E8%82%89-bronze.svg.png", + "60px-%E8%82%89-silk.svg.png", + "60px-%E8%82%89-slip.svg.png", + "60px-%E8%82%89-seal.svg.png", + "60px-%E8%82%89-bigseal.svg.png", + "60px-%E8%82%89-clerical.svg.png" + ], + "note": "Pictogram (象形) – ribs of an animal’s torso or simply a physical representation of a slice of meat. For more images, please refer to this link: http://humanum.arts.cuhk.edu.hk/Lexis/lexi-mf/search.php?word=肉" + }, + { + "no": 131, + "radical": ["臣"], + "strokeCount": 6, + "meaning": "minister", + "pinyin": "chén", + "hanViet": "thần", + "frequency": 16, + "examples": ["臤", "臥", "臧"], + "order": "%E8%87%A3-order.gif", + "glyphOrigin": [ + "60px-%E8%87%A3-oracle.svg.png", + "60px-%E8%87%A3-bronze.svg.png", + "60px-%E8%87%A3-silk.svg.png", + "60px-%E8%87%A3-seal.svg.png" + ], + "note": "Pictogram (象形) – A vertical eye of a man looking downwards. As the individual character it is used as a metaphor meaning “to surrender”, while the meaning relating to eyes appears when used as a radical, such as in 臨 (“to look down at”)." + }, + { + "no": 132, + "radical": ["自"], + "strokeCount": 6, + "meaning": "self", + "pinyin": "zì", + "hanViet": "tự", + "frequency": 34, + "examples": ["臬", "臭", "臯"], + "order": "%E8%87%AA-order.gif", + "glyphOrigin": [ + "60px-%E8%87%AA-oracle.svg.png", + "60px-%E8%87%AA-bronze.svg.png", + "60px-%E8%87%AA-silk.svg.png", + "60px-%E8%87%AA-ancient.svg.png", + "60px-%E8%87%AA-seal.svg.png", + "60px-%E8%87%AA-bigseal.svg.png" + ], + "note": "Originally a pictogram (象形) of a nose; in China (and East Asia) one points at one’s nose to indicate oneself, hence an ideogram (指事) of “self”. The original meaning of “nose” has been replaced by 鼻." + }, + { + "no": 133, + "radical": ["至"], + "strokeCount": 6, + "meaning": "arrive", + "pinyin": "zhì", + "hanViet": "chí", + "frequency": 24, + "examples": ["致", "臷", "臺"], + "order": "%E8%87%B3-order.gif", + "glyphOrigin": [ + "60px-%E8%87%B3-oracle.svg.png", + "60px-%E8%87%B3-bronze.svg.png", + "60px-%E8%87%B3-seal.svg.png", + "60px-%E8%87%B3-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 134, + "radical": ["臼"], + "strokeCount": 6, + "meaning": "mortar", + "pinyin": "jiù", + "hanViet": "cữu", + "frequency": 71, + "examples": ["臾", "臿", "舁"], + "order": "%E8%87%BC-order.gif", + "glyphOrigin": ["60px-%E8%87%BC-seal.svg.png"], + "note": "Pictogram (象形): a mortar" + }, + { + "no": 135, + "radical": ["舌"], + "strokeCount": 6, + "meaning": "tongue", + "pinyin": "shé", + "hanViet": "thiệt", + "frequency": 31, + "examples": ["舍", "舐", "舑"], + "order": "%E8%88%8C-order.gif", + "glyphOrigin": [ + "60px-%E8%88%8C-oracle.svg.png", + "60px-%E8%88%8C-seal.svg.png", + "60px-%E8%88%8C-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a forked tongue emerging upwards from a mouth (口)." + }, + { + "no": 136, + "radical": ["舛"], + "strokeCount": 6, + "meaning": "oppose", + "pinyin": "chuǎn", + "hanViet": "suyễn", + "frequency": 10, + "examples": ["舜", "舝", "舞"], + "order": "%E8%88%9B-order.gif", + "glyphOrigin": [ + "60px-%E8%88%9B-seal.svg.png", + "60px-%E8%88%9B-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 夊 + 𡕒 (second character roughly ヰ) – two feet facing each other (toe-to-toe). Compare 夅, with feet pointing down. Compare also foot in 夂, 夊, 𡕒. Note that the left foot has changed shape rather more than the right foot, which still resembles the form in earlier script." + }, + { + "no": 137, + "radical": ["舟"], + "strokeCount": 6, + "meaning": "boat", + "pinyin": "zhōu", + "hanViet": "chu", + "frequency": 197, + "examples": ["舠", "舡", "舢"], + "order": "%E8%88%9F-order.gif", + "glyphOrigin": [ + "60px-%E8%88%9F-oracle.svg.png", + "60px-%E8%88%9F-bronze.svg.png", + "60px-%E8%88%9F-seal.svg.png", + "60px-%E8%88%9F-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a boat." + }, + { + "no": 138, + "radical": ["艮"], + "strokeCount": 6, + "meaning": "stopping", + "pinyin": "gèn", + "hanViet": "cấn", + "frequency": 5, + "examples": ["良", "艱"], + "order": "%E8%89%AE-order.gif", + "glyphOrigin": [ + "60px-%E8%89%AE-bronze.svg.png", + "60px-%F0%A5%83%A9-silk.svg.png", + "60px-%E8%89%AE-seal.svg.png", + "60px-%E8%89%AE-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *kɯːns): 目 (“eye”) + 匕." + }, + { + "no": 139, + "radical": ["色"], + "strokeCount": 6, + "meaning": "color", + "pinyin": "sè", + "hanViet": "sắc", + "frequency": 21, + "examples": ["艳", "艴", "艵"], + "order": "%E8%89%B2-order.gif", + "glyphOrigin": [ + "60px-%E8%89%B2-bronze-spring.svg.png", + "60px-%E8%89%B2-silk.svg.png", + "60px-%E8%89%B2-slip.svg.png", + "60px-%E8%89%B2-ancient.svg.png", + "60px-%E8%89%B2-seal.svg.png", + "60px-%E8%89%B2-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 爪 (“claw; hand”) + 卩 (“kneeling person”) – complexion. Shuowen interprets this character as an ideogrammic compound (會意): 人 (“person; human”) + 卩 (“etiquette”) – complexion. Compare 印, 抑." + }, + { + "no": 140, + "radical": ["艸", "⺿"], + "strokeCount": 6, + "meaning": "grass", + "pinyin": "cǎo", + "hanViet": "thảo", + "frequency": 1902, + "simplified": "⺾", + "examples": ["艽", "艾", "芃"], + "order": "%E8%89%B8-order.gif", + "glyphOrigin": ["60px-%E8%89%B8-seal.svg.png"], + "note": "Pictogram (象形) – grass." + }, + { + "no": 141, + "radical": ["虍"], + "strokeCount": 6, + "meaning": "tiger", + "pinyin": "hū", + "hanViet": "hô", + "frequency": 114, + "examples": ["虎", "虐", "虒"], + "order": "%E8%99%8D-order.gif", + "glyphOrigin": [ + "60px-%E8%99%8D-oracle.svg.png", + "60px-%E8%99%8D-bronze.svg.png", + "60px-%E8%99%8D-seal.svg.png", + "60px-%E8%99%8D-bigseal.svg.png" + ], + "note": "Pictogram (象形) – tiger's head." + }, + { + "no": 142, + "radical": ["虫"], + "strokeCount": 6, + "meaning": "insect", + "pinyin": "chóng", + "hanViet": "trùng", + "frequency": 1067, + "simplified": "(pr. 蟲)", + "examples": ["虬", "虯", "虱"], + "order": "%E8%99%AB-order.gif", + "glyphOrigin": [ + "60px-%E8%99%AB-oracle.svg.png", + "60px-%E8%99%AB-bronze.svg.png", + "60px-%E8%99%AB-seal.svg.png" + ], + "note": "Pictogram (象形): a snake. The character originally represented a type of venomous snake, while the derivative 蟲 represented worms and insects (or insect-like things). 虫 was later borrowed for 蟲 (possibly via simplification), and the character 虺 was created to represent the original meaning." + }, + { + "no": 143, + "radical": ["血"], + "strokeCount": 6, + "meaning": "blood", + "pinyin": "xuè", + "hanViet": "huyết", + "frequency": 60, + "examples": ["衁", "衂", "衃"], + "order": "%E8%A1%80-order.gif", + "glyphOrigin": [ + "60px-%E8%A1%80-oracle.svg.png", + "60px-%E8%A1%80-silk.svg.png", + "60px-%E8%A1%80-slip.svg.png", + "60px-%E8%A1%80-seal.svg.png", + "60px-%E8%A1%80-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 一 (“drop of blood”) + 皿 (“container”) - a drop of blood inside a chalice for sacrificial uses." + }, + { + "no": 144, + "radical": ["行"], + "strokeCount": 6, + "meaning": "walk enclosure", + "pinyin": "xíng", + "hanViet": "hành", + "frequency": 53, + "examples": ["衍", "衎", "衒"], + "order": "%E8%A1%8C-order.gif", + "glyphOrigin": [ + "60px-%E8%A1%8C-oracle.svg.png", + "60px-%E8%A1%8C-bronze.svg.png", + "60px-%E8%A1%8C-bronze-spring.svg.png", + "60px-%E8%A1%8C-bronze-warring.svg.png", + "60px-%E8%A1%8C-silk.svg.png", + "60px-%E8%A1%8C-slip.svg.png", + "60px-%E8%A1%8C-seal.svg.png", + "60px-%E8%A1%8C-bigseal.svg.png", + "60px-%E8%A1%8C-clerical.svg.png" + ], + "note": "Pictogram (象形) – a street intersection. Originally symmetric, it has been simplified asymmetrically; the left half 彳 is widely used as a radical, while the right half 亍 finds occasional use, and the character can be broken up as 彳 + 亍, though originally it was not a compound." + }, + { + "no": 145, + "radical": ["衣", "⻂"], + "strokeCount": 6, + "meaning": "clothes", + "pinyin": "yī", + "hanViet": "y", + "frequency": 607, + "examples": ["初", "表", "衫"], + "order": "%E8%A1%A3-order.gif", + "glyphOrigin": [ + "60px-%E8%A1%A3-oracle.svg.png", + "60px-%E8%A1%A3-bronze.svg.png", + "60px-%E8%A1%A3-seal.svg.png", + "60px-%E8%A1%A3-bigseal.svg.png" + ], + "note": "Pictogram (象形) Outline of the chest, upper clothing. compare to 文 with limbs and a head." + }, + { + "no": 146, + "radical": ["襾", "西", "覀"], + "strokeCount": 6, + "meaning": "cover", + "pinyin": "yà", + "hanViet": "che", + "frequency": 29, + "examples": ["西", "要", "覂"], + "order": "%E8%A5%BE-order.gif", + "glyphOrigin": [ + "60px-%E8%A5%BE-seal.svg.png", + "60px-%E8%A5%BE-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 147, + "radical": ["見"], + "strokeCount": 7, + "meaning": "see", + "pinyin": "jiàn", + "hanViet": "kiến", + "frequency": 161, + "simplified": "见", + "examples": ["規", "覓", "視"], + "order": "%E8%A6%8B-order.gif", + "glyphOrigin": [ + "60px-%E8%A6%8B-oracle.svg.png", + "60px-%E8%A6%8B-bronze.svg.png", + "60px-%E8%A6%8B-silk.svg.png", + "60px-%E8%A6%8B-seal.svg.png", + "60px-%E8%A6%8B-bigseal.svg.png" + ], + "note": "目 (“eye”) + 儿 (“human”) – an eye on a pair of legs. Originally a human figure with a large eye for a head." + }, + { + "no": 148, + "radical": ["角", "⻇"], + "strokeCount": 7, + "meaning": "horn", + "pinyin": "jiǎo", + "hanViet": "giác", + "frequency": 158, + "simplified": "⻆", + "examples": ["觓", "觔", "觕"], + "order": "%E8%A7%92-order.gif", + "glyphOrigin": [ + "60px-%E8%A7%92-oracle.svg.png", + "60px-%E8%A7%92-bronze.svg.png", + "60px-%E8%A7%92-seal.svg.png", + "60px-%E8%A7%92-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a horn." + }, + { + "no": 149, + "radical": ["言", "訁"], + "strokeCount": 7, + "meaning": "speech", + "pinyin": "yán", + "hanViet": "ngôn", + "frequency": 861, + "simplified": "讠", + "examples": ["訂", "訃", "計"], + "order": "%E8%A8%80-order.gif", + "glyphOrigin": [ + "60px-%E8%A8%80-oracle.svg.png", + "60px-%E8%A8%80-bronze.svg.png", + "60px-%E8%A8%80-seal.svg.png", + "60px-%E8%A8%80-bigseal.svg.png" + ], + "note": "Ideogram (指事): 言 was created by adding a mark to 舌 to indicate movement of the tongue.[1] This indicates speech where 舌 is a mouth (口) with a tongue sticking out. Shuowen erroneously analyzes the glyph as a phono-semantic compound (形聲): phonetic 䇂 + semantic 口 (“mouth”)." + }, + { + "no": 150, + "radical": ["谷"], + "strokeCount": 7, + "meaning": "valley", + "pinyin": "gǔ", + "hanViet": "cốc", + "frequency": 54, + "examples": ["谹", "谽", "谿"], + "order": "%E8%B0%B7-order.gif", + "glyphOrigin": [ + "60px-%E8%B0%B7-oracle.svg.png", + "60px-%E8%B0%B7-bronze.svg.png", + "60px-%E8%B0%B7-seal.svg.png", + "60px-%E8%B0%B7-bigseal.svg.png" + ], + "note": "Pictogram (象形) — valley (口) in between two mountains." + }, + { + "no": 151, + "radical": ["豆"], + "strokeCount": 7, + "meaning": "bean", + "pinyin": "dòu", + "hanViet": "đậu", + "frequency": 68, + "examples": ["豇", "豈", "豉"], + "order": "%E8%B1%86-order.gif", + "glyphOrigin": [ + "60px-%E8%B1%86-oracle.svg.png", + "60px-%E8%B1%86-bronze.svg.png", + "60px-%E8%B1%86-seal.svg.png", + "60px-%E8%B1%86-bigseal.svg.png" + ], + "note": "Pictogram (象形) – some kind of container. Borrowed phonetically for the plant name. Displaced Old Chinese 菽 (shū)." + }, + { + "no": 152, + "radical": ["豕"], + "strokeCount": 7, + "meaning": "pig", + "pinyin": "shǐ", + "hanViet": "thỉ", + "frequency": 148, + "examples": ["豗", "豚", "豜"], + "order": "%E8%B1%95-order.gif", + "glyphOrigin": [ + "60px-%E8%B1%95-oracle.svg.png", + "60px-%E8%B1%95-bronze.svg.png", + "60px-%E8%B1%95-seal.svg.png", + "60px-%E8%B1%95-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a pig. Compare 亥." + }, + { + "no": 153, + "radical": ["豸"], + "strokeCount": 7, + "meaning": "badger", + "pinyin": "zhì", + "hanViet": "trãi", + "frequency": 140, + "examples": ["豺", "豻", "豹"], + "order": "%E8%B1%B8-order.gif", + "glyphOrigin": [ + "60px-%E8%B1%B8-oracle.svg.png", + "60px-%E8%B1%B8-bronze.svg.png", + "60px-%E8%B1%B8-slip.svg.png", + "60px-%E8%B1%B8-seal.svg.png", + "60px-%E8%B1%B8-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 154, + "radical": ["貝"], + "strokeCount": 7, + "meaning": "shell", + "pinyin": "bèi", + "hanViet": "bối", + "frequency": 277, + "simplified": "贝", + "examples": ["貞", "負", "財"], + "order": "%E8%B2%9D-order.gif", + "glyphOrigin": [ + "60px-%E8%B2%9D-oracle.svg.png", + "60px-%E8%B2%9D-bronze.svg.png", + "60px-%E8%B2%9D-silk.svg.png", + "60px-%E8%B2%9D-seal.svg.png", + "60px-%E8%B2%9D-bigseal.svg.png" + ], + "note": "Pictogram (象形) – cowry." + }, + { + "no": 155, + "radical": ["赤"], + "strokeCount": 7, + "meaning": "red", + "pinyin": "chì", + "hanViet": "xích", + "frequency": 31, + "examples": ["赦", "赧", "赨"], + "order": "%E8%B5%A4-order.gif", + "glyphOrigin": [ + "60px-%E8%B5%A4-oracle.svg.png", + "60px-%E8%B5%A4-bronze.svg.png", + "60px-%E8%B5%A4-bronze-spring.svg.png", + "60px-%E8%B5%A4-silk.svg.png", + "60px-%E8%B5%A4-slip.svg.png", + "60px-%E8%B5%A4-ancient.svg.png", + "60px-%E8%B5%A4-seal.svg.png", + "60px-%E8%B5%A4-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 大 (“person, big”) + 火 (“fire”) – the color of fire (a person by a fire)." + }, + { + "no": 156, + "radical": ["走"], + "strokeCount": 7, + "meaning": "run", + "pinyin": "zǒu", + "hanViet": "tẩu", + "frequency": 285, + "examples": ["赳", "赴", "赶"], + "order": "%E8%B5%B0-order.gif", + "glyphOrigin": [ + "60px-%E8%B5%B0-oracle.svg.png", + "60px-%E8%B5%B0-bronze.svg.png", + "60px-%E8%B5%B0-bronze-spring.svg.png", + "60px-%E8%B5%B0-bronze-warring.svg.png", + "60px-%E8%B5%B0-silk.svg.png", + "60px-%E8%B5%B0-slip.svg.png", + "60px-%E8%B5%B0-seal.svg.png", + "60px-%E8%B5%B0-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 夭 (“young, running man”) + 止 (“foot”) – a running man. The top component (夭) simplified to the unrelated 土. As with 圭, there are two separate vertical strokes, not a single one." + }, + { + "no": 157, + "radical": ["足", "⻊"], + "strokeCount": 7, + "meaning": "foot", + "pinyin": "zú", + "hanViet": "túc", + "frequency": 580, + "examples": ["趴", "趵", "趷"], + "order": "%E8%B6%B3-order.gif", + "glyphOrigin": ["60px-%E8%B6%B3-seal.svg.png"], + "note": "" + }, + { + "no": 158, + "radical": ["身"], + "strokeCount": 7, + "meaning": "body", + "pinyin": "shēn", + "hanViet": "thân", + "frequency": 97, + "examples": ["躬", "躭", "躰"], + "order": "%E8%BA%AB-order.gif", + "glyphOrigin": [ + "60px-%E8%BA%AB-bronze.svg.png", + "60px-%E8%BA%AB-seal.svg.png", + "60px-%E8%BA%AB-bigseal.svg.png" + ], + "note": "Pictogram (象形): from a pictograph of a pregnant woman." + }, + { + "no": 159, + "radical": ["車"], + "strokeCount": 7, + "meaning": "cart", + "pinyin": "chē", + "hanViet": "xa", + "frequency": 361, + "simplified": "车", + "examples": ["軋", "軌", "軍"], + "order": "%E8%BB%8A-order.gif", + "glyphOrigin": [ + "60px-%E8%BB%8A-bronze-shang.svg.png", + "60px-%E8%BB%8A-oracle.svg.png", + "60px-%E8%BB%8A-bronze.svg.png", + "60px-%E8%BB%8A-bronze-spring.svg.png", + "60px-%E8%BB%8A-bronze-warring.svg.png", + "60px-%E8%BB%8A-silk.svg.png", + "60px-%E8%BB%8A-slip.svg.png", + "60px-%E8%BB%8A-zhou.svg.png", + "60px-%E8%BB%8A-seal.svg.png", + "60px-%E8%BB%8A-bigseal.svg.png" + ], + "note": "Ideogram (指事): It is derived from a pictogram of a carriage seen from above. In the oracle bone script, there were large wheels on both sides and a sun shade on the top. Later, when Chinese characters were written vertically, the wheels on both sides were simply drawn in strokes and the loading area was marked with a 田 (OC *l'iːŋ). Therefore, it is important to understand that the current character, 車 (OC *kʰlja, *kla) is a vertical depiction of a carriage. Note that 倝 (OC *kaːns) (as in left part of 朝 (OC *ʔr'ew, *r'ew)) is not derived from 車 (OC *kʰlja, *kla)." + }, + { + "no": 160, + "radical": ["辛"], + "strokeCount": 7, + "meaning": "bitter", + "pinyin": "xīn", + "hanViet": "tân", + "frequency": 36, + "examples": ["辜", "辝", "辟"], + "order": "%E8%BE%9B-order.gif", + "glyphOrigin": ["60px-%E8%BE%9B-seal.svg.png"], + "note": "Pictogram (象形) – Picture of a tool - a carving knife or a chisel - used to mark slaves and criminals." + }, + { + "no": 161, + "radical": ["辰"], + "strokeCount": 7, + "meaning": "morning", + "pinyin": "chén", + "hanViet": "thần/thìn", + "frequency": 15, + "examples": ["辱", "農", "辴"], + "order": "%E8%BE%B0-order.gif", + "glyphOrigin": [ + "60px-%E8%BE%B0-oracle.svg.png", + "60px-%E8%BE%B0-bronze.svg.png", + "60px-%E8%BE%B0-seal.svg.png", + "60px-%E8%BE%B0-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a kind of agricultural tool used for tilling the fields and removing weeds (Guo, 1931; Qiu, 1992), possibly made of a kind of large clam 蜃 (OC *djɯns, *djɯnʔ, *djins) (Guo, 1931). Alternatively, it could be a pictogram (象形) of a person holding onto a cliff – original character of 振 (OC *tjɯn, *tjɯns, “to hold up”) (Shang, 1983)." + }, + { + "no": 162, + "radical": ["辵", "⻌", "⻍", "⻎"], + "strokeCount": 7, + "meaning": "walk", + "pinyin": "chuò", + "hanViet": "sước", + "frequency": 381, + "examples": ["边", "巡", "迂"], + "order": "%E8%BE%B5-order.gif", + "glyphOrigin": ["60px-%E8%BE%B5-seal.svg.png"], + "note": "Ideogrammic compound (會意): 彳 (“walk”) + 止 (“\"foot\" or \"to stop\"”)." + }, + { + "no": 163, + "radical": ["邑", "⻏"], + "strokeCount": 7, + "meaning": "city", + "pinyin": "yì", + "hanViet": "ấp", + "frequency": 350, + "examples": ["邕", "邗", "邘"], + "order": "%E9%82%91-order.gif", + "glyphOrigin": [ + "60px-%E9%82%91-oracle.svg.png", + "60px-%E9%82%91-bronze.svg.png", + "60px-%E9%82%91-seal.svg.png", + "60px-%E9%82%91-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 囗 + 卪." + }, + { + "no": 164, + "radical": ["酉"], + "strokeCount": 7, + "meaning": "wine", + "pinyin": "yǒu", + "hanViet": "dậu", + "frequency": 290, + "examples": ["酊", "酋", "酌"], + "order": "%E9%85%89-order.gif", + "glyphOrigin": [ + "60px-%E9%85%89-bronze-shang.svg.png", + "60px-%E9%85%89-oracle.svg.png", + "60px-%E9%85%89-bronze.svg.png", + "60px-%E9%85%89-bronze-spring.svg.png", + "60px-%E9%85%89-bronze-warring.svg.png", + "60px-%E9%85%89-silk.svg.png", + "60px-%E9%85%89-slip.svg.png", + "60px-%E9%85%89-ancient.svg.png", + "60px-%E9%85%89-seal.svg.png", + "60px-%E9%85%89-bigseal.svg.png" + ], + "note": "Pictogram (象形) — an ancient vase used in making and storing fermented millet alcoholic drink. See 酒." + }, + { + "no": 165, + "radical": ["釆"], + "strokeCount": 7, + "meaning": "distinguish", + "pinyin": "biàn", + "hanViet": "biện", + "frequency": 14, + "examples": ["采", "釉", "釋"], + "order": "%E9%87%86-order.gif", + "glyphOrigin": [ + "60px-%E9%87%86-oracle.svg.png", + "60px-%E9%87%86-bronze.svg.png", + "60px-%E9%87%86-seal.svg.png", + "60px-%E9%87%86-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 166, + "radical": ["里"], + "strokeCount": 7, + "meaning": "village", + "pinyin": "lǐ", + "hanViet": "lý", + "frequency": 14, + "examples": ["重", "野", "量"], + "order": "%E9%87%8C-order.gif", + "glyphOrigin": ["60px-%E9%87%8C-seal.svg.png"], + "note": "Ideogrammic compound (會意): 田 (“field”) + 土 (“soil; earth”) – a measure of land and fields; mile; place." + }, + { + "no": 167, + "radical": ["金", "釒"], + "strokeCount": 8, + "meaning": "gold", + "pinyin": "jīn", + "hanViet": "kim", + "frequency": 806, + "simplified": "钅", + "examples": ["釓", "釔", "釕"], + "order": "%E9%87%91-order.gif", + "glyphOrigin": [ + "60px-%E9%87%91-bronze.svg.png", + "60px-%E9%87%91-seal.svg.png", + "60px-%E9%87%91-bigseal.svg.png" + ], + "note": "Originally referred to copper. Later, the meaning was extended to metal as a whole, and then to gold. Phono-semantic compound (形聲, OC *krɯm): semantic 王 (“upside-down axe”) + semantic 呂 (“two blocks of metal”) + phonetic 亼. 亼 is the ancient form for 今 (OC *krɯm)." + }, + { + "no": 168, + "radical": ["長", "镸"], + "strokeCount": 8, + "meaning": "long", + "pinyin": "cháng", + "hanViet": "trường", + "frequency": 55, + "simplified": "长", + "examples": ["镺", "镻", "镼"], + "order": "%E9%95%B7-order.gif", + "glyphOrigin": ["60px-%E9%95%B7-seal.svg.png"], + "note": "Pictogram (象形) – originally long hair; compare 彡." + }, + { + "no": 169, + "radical": ["門"], + "strokeCount": 8, + "meaning": "gate", + "pinyin": "mén", + "hanViet": "môn", + "frequency": 246, + "simplified": "门", + "examples": ["閂", "閃", "閆"], + "order": "%E9%96%80-order.gif", + "glyphOrigin": [ + "60px-%E9%96%80-bronze-shang.svg.png", + "60px-%E9%96%80-oracle.svg.png", + "60px-%E9%96%80-bronze.svg.png", + "60px-%E9%96%80-silk.svg.png", + "60px-%E9%96%80-slip.svg.png", + "60px-%E9%96%80-seal.svg.png", + "60px-%E9%96%80-bigseal.svg.png" + ], + "note": "Pictogram (象形): a gate. Compare 戶 (OC *ɡʷaːʔ, “(one) door”), which is half of this character." + }, + { + "no": 170, + "radical": ["阜", "⻖"], + "strokeCount": 8, + "meaning": "mound", + "pinyin": "fù", + "hanViet": "phụ", + "frequency": 348, + "examples": ["阞", "阡", "阢"], + "order": "%E9%98%9C-order.gif", + "glyphOrigin": [ + "60px-%E9%98%9C-oracle.svg.png", + "60px-%E9%98%9C-seal.svg.png", + "60px-%E9%98%9C-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 171, + "radical": ["隶"], + "strokeCount": 8, + "meaning": "slave", + "pinyin": "lì", + "hanViet": "lệ", + "frequency": 12, + "examples": ["𨽻", "隷", "隸"], + "order": "%E9%9A%B6-order.gif", + "glyphOrigin": ["60px-%E9%9A%B6-seal.svg.png"], + "note": "Pictogram (象形): 又 + abbreviated 尾." + }, + { + "no": 172, + "radical": ["隹"], + "strokeCount": 8, + "meaning": "short-tailed bird", + "pinyin": "zhuī", + "hanViet": "chuy", + "frequency": 233, + "examples": ["隻", "隼", "隽"], + "order": "%E9%9A%B9-order.gif", + "glyphOrigin": [ + "60px-%E9%9A%B9-oracle.svg.png", + "60px-%E9%9A%B9-bronze.svg.png", + "60px-%E9%9A%B9-seal.svg.png", + "60px-%E9%9A%B9-bigseal.svg.png" + ], + "note": "Pictogram (象形): a short‐tailed bird (e.g. a sparrow). Compare 鳥." + }, + { + "no": 173, + "radical": ["雨"], + "strokeCount": 8, + "meaning": "rain", + "pinyin": "yǔ", + "hanViet": "vũ", + "frequency": 298, + "examples": ["雩", "雪", "雯"], + "order": "%E9%9B%A8-order.gif", + "glyphOrigin": [ + "60px-%E9%9B%A8-oracle.svg.png", + "60px-%E9%9B%A8-bronze.svg.png", + "60px-%E9%9B%A8-silk.svg.png", + "60px-%E9%9B%A8-slip.svg.png", + "60px-%E9%9B%A8-ancient.svg.png", + "60px-%E9%9B%A8-seal.svg.png", + "60px-%E9%9B%A8-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a cloud with drops of rain falling from it." + }, + { + "no": 174, + "radical": ["靑", "青"], + "strokeCount": 8, + "meaning": "blue", + "pinyin": "qīng", + "hanViet": "thanh", + "frequency": 17, + "examples": ["靖", "静", "靚"], + "order": "%E9%9D%91-order.gif", + "glyphOrigin": [], + "note": "" + }, + { + "no": 175, + "radical": ["非"], + "strokeCount": 8, + "meaning": "wrong", + "pinyin": "fēi", + "hanViet": "phi", + "frequency": 25, + "examples": ["靟", "靠", "靡"], + "order": "%E9%9D%9E-order.gif", + "glyphOrigin": ["60px-%E9%9D%9E-seal.svg.png"], + "note": "" + }, + { + "no": 176, + "radical": ["面", "靣"], + "strokeCount": 9, + "meaning": "face", + "pinyin": "miàn", + "hanViet": "diện", + "frequency": 66, + "examples": ["靤", "靦", "靧"], + "order": "%E9%9D%A2-order.gif", + "glyphOrigin": [ + "60px-%E9%9D%A2-oracle.svg.png", + "60px-%E9%9D%A2-seal.svg.png" + ], + "note": "Pictogram (象形), A mans face, with an eye exaggerated, derived from 𦣻." + }, + { + "no": 177, + "radical": ["革"], + "strokeCount": 9, + "meaning": "leather", + "pinyin": "gé", + "hanViet": "cách", + "frequency": 305, + "examples": ["靭", "靮", "靳"], + "order": "%E9%9D%A9-order.gif", + "glyphOrigin": ["60px-%E9%9D%A9-seal.svg.png"], + "note": "Pictogram (象形) – a stretched animal hide: the upper is head, the bottom is the tail and legs. Compare 皮, which also features a hide." + }, + { + "no": 178, + "radical": ["韋"], + "strokeCount": 9, + "meaning": "tanned leather", + "pinyin": "wéi", + "hanViet": "vi", + "frequency": 100, + "simplified": "韦", + "examples": ["韌", "韍", "韎"], + "order": "%E9%9F%8B-order.gif", + "glyphOrigin": [ + "60px-%E9%9F%8B-bronze-shang.svg.png", + "60px-%E9%9F%8B-oracle.svg.png", + "60px-%E9%9F%8B-bronze.svg.png", + "60px-%E9%9F%8B-bronze-spring.svg.png", + "60px-%E9%9F%8B-silk.svg.png", + "60px-%E9%9F%8B-slip.svg.png", + "60px-%E9%9F%8B-seal.svg.png", + "60px-%E9%9F%8B-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *ɢʷɯl): 舛 + 囗 – footsteps around an enclosure. Possibly the original character for 衛 'guard; protect'." + }, + { + "no": 179, + "radical": ["韭"], + "strokeCount": 9, + "meaning": "leek", + "pinyin": "jiǔ", + "hanViet": "cửu", + "frequency": 20, + "examples": ["韰", "韲", "䪢"], + "order": "%E9%9F%AD-order.gif", + "glyphOrigin": ["60px-%E9%9F%AD-seal.svg.png"], + "note": "Pictogram (象形) – leek in the ground (一)." + }, + { + "no": 180, + "radical": ["音"], + "strokeCount": 9, + "meaning": "sound", + "pinyin": "yīn", + "hanViet": "âm", + "frequency": 43, + "examples": ["竟", "章", "韵"], + "order": "%E9%9F%B3-order.gif", + "glyphOrigin": [ + "60px-%E9%9F%B3-bronze.svg.png", + "60px-%E9%9F%B3-silk.svg.png", + "60px-%E9%9F%B3-seal.svg.png", + "60px-%E9%9F%B3-bigseal.svg.png" + ], + "note": "Ideogram (指事): 言 (“word”) with something in 口 (“mouth”) – sound comes from the mouth." + }, + { + "no": 181, + "radical": ["頁"], + "strokeCount": 9, + "meaning": "leaf", + "pinyin": "yè", + "hanViet": "hiệt", + "frequency": 372, + "simplified": "页", + "examples": ["頂", "頃", "頄"], + "order": "%E9%A0%81-order.gif", + "glyphOrigin": [ + "60px-%E9%A0%81-oracle.svg.png", + "60px-%E9%A0%81-bronze.svg.png", + "60px-%E9%A0%81-silk.svg.png", + "60px-%E9%A0%81-seal.svg.png", + "60px-%E9%A0%81-bigseal.svg.png" + ], + "note": "Pictogram (象形): 首 + 卩 – head of a kneeling person, emphasising “head”. 頁 and 首 (OC *hljuʔ, *hljus) were originally the same pictographic character with the same meaning of “head”, and the graphical difference was that 頁 also included the body in addition to the head of the person. 頁 was later used as an alternative popular form of 葉 (“leaf; page”) to mean “sheet; page (of paper)”, which is its main meaning today. The original sense of “head” is preserved in the radical 頁, which is used in characters such as 頭 (“head”) and 頸 (“neck”)." + }, + { + "no": 182, + "radical": ["風"], + "strokeCount": 9, + "meaning": "wind", + "pinyin": "fēng", + "hanViet": "phong", + "frequency": 182, + "simplified": "风", + "examples": ["颩", "颭", "颮"], + "order": "%E9%A2%A8-order.gif", + "glyphOrigin": [ + "60px-%E9%B3%B3-oracle.svg.png", + "60px-%E9%B3%B3-bronze.svg.png", + "60px-%E9%A2%A8-silk.svg.png", + "60px-%E9%A2%A8-slip.svg.png", + "60px-%E9%A2%A8-ancient.svg.png", + "60px-%E9%A2%A8-seal.svg.png", + "60px-%E9%A2%A8-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *plum, *plums): phonetic 凡 (OC *bom) + semantic 虫 (“insects”). Ancient Chinese thought insects appear with wind. (Insects refer to any kind of animal, such as tigers (大蟲)). In the oracle bone script, the character 鳳 (OC *bums, “male fenghuang”) was phonetically borrowed to represent 風 (OC *plum, *plums). The right part of the bronze inscription of the character consists of phonetic 凡 (OC *bom) at the top, and three parts depicting the fur on the tail of the male fenghuang at the bottom. Subsequent forms of 風 are based on the right part of its bronze inscription, with two of the three threads of \"fur\" removed for simplification. The 虫 in the Chu script and Qin script of 風 was likely a result of further simplification of the \"fur\". Shuowen misinterpreted the character 風 by associating it with insects. (Li, 2012)" + }, + { + "no": 183, + "radical": ["飛"], + "strokeCount": 9, + "meaning": "fly", + "pinyin": "fēi", + "hanViet": "phi", + "frequency": 92, + "simplified": "飞", + "examples": ["䬡", "飜", "飝"], + "order": "%E9%A3%9B-order.gif", + "glyphOrigin": [ + "60px-%E9%A3%9B-oracle.svg.png", + "60px-%E9%A3%9B-silk.svg.png", + "60px-%E9%A3%9B-seal.svg.png", + "60px-%E9%A3%9B-bigseal.svg.png" + ], + "note": "Pictogram (象形): looks like a bird flying upwards. In modern form, resembles a tasseled 升 (shēng)." + }, + { + "no": 184, + "radical": ["食", "飠"], + "strokeCount": 9, + "meaning": "eat", + "pinyin": "shí", + "hanViet": "thực", + "frequency": 403, + "simplified": "饣", + "examples": ["飡", "飢", "飣"], + "order": "%E9%A3%9F-order.gif", + "glyphOrigin": [ + "60px-%E9%A3%9F-oracle.svg.png", + "60px-%E9%A3%9F-bronze.svg.png", + "60px-%E9%A3%9F-bronze-spring.svg.png", + "60px-%E9%A3%9F-bronze-warring.svg.png", + "60px-%E9%A3%9F-silk.svg.png", + "60px-%E9%A3%9F-slip.svg.png", + "60px-%E9%A3%9F-seal.svg.png", + "60px-%E9%A3%9F-bigseal.svg.png" + ], + "note": "Pictogram (象形): a mouth over a bowl of rice on a stand. While the current form is 人+良, the lower part (bowl of rice on a stand) is cognate to 皀, not to 良 or 艮. This is more visible in the form 𠊊. Shuowen: Phono-semantic compound (形聲, OC *lɯɡs, *ɦljɯɡ): phonetic 亼 (OC *zub) + semantic 皀; see 𠊊." + }, + { + "no": 185, + "radical": ["首"], + "strokeCount": 9, + "meaning": "head", + "pinyin": "shǒu", + "hanViet": "thủ", + "frequency": 20, + "examples": ["馗", "䭫", "馘"], + "order": "%E9%A6%96-order.gif", + "glyphOrigin": [ + "60px-%E9%A6%96-oracle.svg.png", + "60px-%E9%A6%96-bronze.svg.png", + "60px-%E9%A6%96-seal.svg.png", + "60px-%E9%A6%96-bigseal.svg.png" + ], + "note": "Simplified from 𩠐 (巛 → 丷). Originally pictographic (象形) of an animal with a long mouth and horns. In the oracle bone script, it appeared with or without hair (巛), but 𩠐, the form with hair, was the form that was perpetuated." + }, + { + "no": 186, + "radical": ["香"], + "strokeCount": 9, + "meaning": "fragrant", + "pinyin": "xiāng", + "hanViet": "hương", + "frequency": 37, + "examples": ["馝", "馞", "馡"], + "order": "%E9%A6%99-order.gif", + "glyphOrigin": [ + "60px-%E9%A6%99-oracle.svg.png", + "60px-%E9%A6%99-bronze.svg.png", + "60px-%E9%A6%99-seal.svg.png", + "60px-%E9%A6%99-bigseal.svg.png" + ], + "note": "In the oracle bone script, it was ideogrammic compound (會意): 黍 (“glutinous millet”) + 口 (“mouth”). In the seal script, the 口 was replaced with the related 甘 (“sweet”). Currently, the 黍 has simplified into 禾, and the form of the bottom component 甘 has become akin to the unrelated 曰 or 日." + }, + { + "no": 187, + "radical": ["馬"], + "strokeCount": 10, + "meaning": "horse", + "pinyin": "mǎ", + "hanViet": "mã", + "frequency": 472, + "simplified": "马", + "examples": ["馭", "馮", "馯"], + "order": "%E9%A6%AC-order.gif", + "glyphOrigin": [ + "60px-%E9%A6%AC-bronze-shang.svg.png", + "60px-%E9%A6%AC-oracle.svg.png", + "60px-%E9%A6%AC-bronze.svg.png", + "60px-%E9%A6%AC-bronze-spring.svg.png", + "60px-%E9%A6%AC-bronze-warring.svg.png", + "60px-%E9%A6%AC-silk.svg.png", + "60px-%E9%A6%AC-slip.svg.png", + "60px-%E9%A6%AC-zhou.svg.png", + "60px-%E9%A6%AC-ancient.svg.png", + "60px-%E9%A6%AC-seal.svg.png", + "60px-%E9%A6%AC-bigseal.svg.png", + "60px-%E9%A6%AC-clerical.svg.png" + ], + "note": "Pictogram (象形) – a horse with its head facing the left, showing a flowing mane in the wind. In the bronze inscriptions, the head was often simplified into an eye (目). The legs eventually evolved into four dots (灬, unrelated to 火). Contrast with 鹿 (“deer”), which saw a very different development, and 𢊁 (as in 薦), which is a hybrid: it has the legs of 馬 (灬) but the head of 鹿." + }, + { + "no": 188, + "radical": ["骨"], + "strokeCount": 10, + "meaning": "bone", + "pinyin": "gǔ", + "hanViet": "cốt", + "frequency": 185, + "simplified": "⻣", + "examples": ["骫", "骭", "骯"], + "order": "%E9%AA%A8-order.gif", + "glyphOrigin": [ + "60px-%E5%86%8E-bronze-shang.svg.png", + "60px-%E5%86%8E-oracle.svg.png", + "60px-%E9%AA%A8-silk.svg.png", + "60px-%E9%AA%A8-slip.svg.png", + "60px-%E9%AA%A8-seal.svg.png", + "60px-%E9%AA%A8-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 冎 (“skull”) + ⺼ (“body”)." + }, + { + "no": 189, + "radical": ["高", "髙"], + "strokeCount": 10, + "meaning": "tall", + "pinyin": "gāo", + "hanViet": "cao", + "frequency": 34, + "examples": ["髚", "髛", "𩫛"], + "order": "%E9%AB%98-order.gif", + "glyphOrigin": [ + "60px-%E9%AB%98-bronze-shang.svg.png", + "60px-%E9%AB%98-oracle.svg.png", + "60px-%E9%AB%98-bronze.svg.png", + "60px-%E9%AB%98-bronze-spring.svg.png", + "60px-%E9%AB%98-bronze-warring.svg.png", + "60px-%E9%AB%98-silk.svg.png", + "60px-%E9%AB%98-slip.svg.png", + "60px-%E9%AB%98-seal.svg.png", + "60px-%E9%AB%98-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a picture of a building. compare to 京." + }, + { + "no": 190, + "radical": ["髟"], + "strokeCount": 10, + "meaning": "hair", + "pinyin": "biāo", + "hanViet": "bưu/tiêu", + "frequency": 243, + "examples": ["髠", "髡", "髢"], + "order": "%E9%AB%9F-order.gif", + "glyphOrigin": [ + "60px-%E9%AB%9F-bronze-shang.svg.png", + "60px-%E9%AB%9F-silk.svg.png", + "60px-%E9%AB%9F-seal.svg.png" + ], + "note": "Ideogrammic compound (會意): 镸 (“long”) + 彡 (“hair”)." + }, + { + "no": 191, + "radical": ["鬥"], + "strokeCount": 10, + "meaning": "fight", + "pinyin": "dòu", + "hanViet": "đấu", + "frequency": 23, + "simplified": "门", + "examples": ["鬦", "鬧", "鬨"], + "order": "%E2%BE%BE-order.gif", + "glyphOrigin": [ + "60px-%E9%AC%A5-oracle.svg.png", + "60px-%E9%AC%A5-seal.svg.png", + "60px-%E9%AC%A5-bigseal.svg.png" + ], + "note": "Pictogram (象形) — two figures face-to-face, fighting with bare hands. Some oracle script characters of 鬥 show that both of their hair are bristled. The character shape resembles 𠨭 and 丮 opposite each other. 鬥 and 鬭 are original characters of this form; forms with the similar-looking radical 門 (\"door\") were non-standard variants. Simplified form 斗 was derived via the variant form 鬦." + }, + { + "no": 192, + "radical": ["鬯"], + "strokeCount": 10, + "meaning": "sacrificial wine", + "pinyin": "chàng", + "hanViet": "sưởng", + "frequency": 8, + "examples": ["鬰", "鬱"], + "order": "%E9%AC%AF-order.gif", + "glyphOrigin": [ + "60px-%E9%AC%AF-oracle.svg.png", + "60px-%E9%AC%AF-bronze.svg.png", + "60px-%E9%AC%AF-seal.svg.png", + "60px-%E9%AC%AF-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 193, + "radical": ["鬲"], + "strokeCount": 10, + "meaning": "cauldron", + "pinyin": "lì", + "hanViet": "cách", + "frequency": 73, + "examples": ["鬳", "鬴", "鬵"], + "order": "%E9%AC%B2-order.gif", + "glyphOrigin": [ + "60px-%E9%AC%B2-oracle.svg.png", + "60px-%E9%AC%B2-bronze.svg.png", + "60px-%E9%AC%B2-seal.svg.png", + "60px-%E9%AC%B2-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 194, + "radical": ["鬼"], + "strokeCount": 10, + "meaning": "ghost", + "pinyin": "guǐ", + "hanViet": "quỷ", + "frequency": 141, + "examples": ["鬾", "魁", "魂"], + "order": "%E9%AC%BC-order.gif", + "glyphOrigin": [ + "60px-%E9%AC%BC-oracle.svg.png", + "60px-%E9%AC%BC-bronze.svg.png", + "60px-%E9%AC%BC-seal.svg.png", + "60px-%E9%AC%BC-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a man or figure with an ugly face and tail. Compare 異 (“different, strange”), where the 田 also derives from a face. It may not be clear from the character, but the lower right “dot” is a small 厶; it is a residual tail – compare 离." + }, + { + "no": 195, + "radical": ["魚"], + "strokeCount": 11, + "meaning": "fish", + "pinyin": "yú", + "hanViet": "ngư", + "frequency": 571, + "simplified": "鱼", + "examples": ["魟", "魠", "魦"], + "order": "%E9%AD%9A-order.gif", + "glyphOrigin": [ + "60px-%E9%AD%9A-oracle.svg.png", + "60px-%E9%AD%9A-bronze.svg.png", + "60px-%E9%AD%9A-seal.svg.png", + "60px-%E9%AD%9A-bigseal.svg.png" + ], + "note": "Pictogram (象形) – pictographic representation of a fish." + }, + { + "no": 196, + "radical": ["鳥"], + "strokeCount": 11, + "meaning": "bird", + "pinyin": "niǎo", + "hanViet": "điểu", + "frequency": 750, + "simplified": "鸟", + "examples": ["鳦", "鳧", "鳩"], + "order": "%E9%B3%A5-order.gif", + "glyphOrigin": [ + "60px-%E9%B3%A5-oracle.svg.png", + "60px-%E9%B3%A5-bronze.svg.png", + "60px-%E9%B3%A5-seal.svg.png" + ], + "note": "Pictogram (象形): a bird with a dangling tail. Compare 烏, which is very similar, of similar origin, and 隹, which originated from a similar image of a bird, but is today rather more abstract and less recognizable." + }, + { + "no": 197, + "radical": ["鹵"], + "strokeCount": 11, + "meaning": "salt", + "pinyin": "lǔ", + "hanViet": "lỗ", + "frequency": 44, + "simplified": "卤", + "examples": ["鹹", "鹺", "鹼"], + "order": "%E9%B9%B5-order.gif", + "glyphOrigin": [ + "60px-%E9%B9%B5-oracle.svg.png", + "60px-%E9%B9%B5-bronze.svg.png", + "60px-%E9%B9%B5-seal.svg.png", + "60px-%E9%B9%B5-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a bag of salt. Compare 西." + }, + { + "no": 198, + "radical": ["鹿"], + "strokeCount": 11, + "meaning": "deer", + "pinyin": "lù", + "hanViet": "lộc", + "frequency": 104, + "examples": ["麀", "麁", "麂"], + "order": "%E9%B9%BF-order.gif", + "glyphOrigin": [ + "60px-%E9%B9%BF-oracle.svg.png", + "60px-%E9%B9%BF-bronze.svg.png", + "60px-%E9%B9%BF-seal.svg.png", + "60px-%E9%B9%BF-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a deer. Current form is highly abstracted – legs have transformed to 比 – note grouping of front and rear legs, which are bent – head has transformed to middle component (similar to 凸/曲), while antlers on top and extended lip/mouth on left transformed into 广. This transformation occurred during seal characters. Contrast the very different development of 馬 (“horse”), and the transformation in 𢊁 (as in 薦), which has the head of 鹿 but the legs of 馬 (灬)." + }, + { + "no": 199, + "radical": ["麥"], + "strokeCount": 11, + "meaning": "wheat", + "pinyin": "mài", + "hanViet": "mạch", + "frequency": 131, + "simplified": "麦", + "examples": ["麨", "麩", "麪"], + "order": "%E9%BA%A5-order.gif", + "glyphOrigin": [ + "60px-%E9%BA%A5-oracle.svg.png", + "60px-%E9%BA%A5-bronze.svg.png", + "60px-%E9%BA%A5-seal.svg.png", + "60px-%E9%BA%A5-bigseal.svg.png" + ], + "note": "Phono-semantic compound (形聲, OC *mrɯːɡ): phonetic 來 (OC *m·rɯːɡ) + semantic 夊 (“foot; to walk slowly”). 來 was the original character for “wheat”. Several possible interpretations:" + }, + { + "no": 200, + "radical": ["麻"], + "strokeCount": 11, + "meaning": "hemp", + "pinyin": "má", + "hanViet": "ma", + "frequency": 34, + "examples": ["麼", "麾", "黁"], + "order": "%E9%BA%BB-order.gif", + "glyphOrigin": [ + "60px-%E9%BA%BB-bronze.svg.png", + "60px-%E9%BA%BB-seal.svg.png", + "60px-%E9%BA%BB-bigseal.svg.png" + ], + "note": "Ideogrammic compound (會意): 厂 + 𣏟: a representation of hemp leaves." + }, + { + "no": 201, + "radical": ["黃"], + "strokeCount": 12, + "meaning": "yellow", + "pinyin": "huáng", + "hanViet": "hoàng", + "frequency": 42, + "simplified": "黄", + "examples": ["黈", "䵍", "黌"], + "order": "%E9%BB%83-order.gif", + "glyphOrigin": [ + "60px-%E9%BB%83-oracle.svg.png", + "60px-%E9%BB%83-bronze.svg.png", + "60px-%E9%BB%83-seal.svg.png", + "60px-%E9%BB%83-bigseal.svg.png" + ], + "note": "According to Shuowen, it is both a phono-semantic compound (形聲, OC *ɡʷaːŋ) and ideogrammic compound (會意): phonetic 炗 (“light”) + semantic 田 (“field”) – the color of earth, with 炗 being the ancient form of 光 (OC *kʷaːŋ, *kʷaːŋs, “light”). However, this interpretation is likely erroneous as 廿 at the top was formed as a result of corruption of 口 in the bronze inscription. Chi (2010) proposes that 黃 was originally a pictogram (象形) and the original character of 尪 (OC *qʷaːŋ, “a disabled person with a protruding chest or abdomen”). It has been phonetically borrowed for \"yellow\" since the era of the oracle bone script. He (1998) noted the possible ritual of burning disabled people with a protruding chest or abdomen to pray for rain as mentioned in Zuozhuan. The 口 in the upper part of the bronze inscription of 黃 might be depicting the disabled person's face facing upwards. Li (2012), on the other hand, proposes that 黃 was originally a pictogram (象形) and the original character of 璜 (OC *ɡʷaːŋ, “semicircular jade”) as the 口 in the oracle bone script resembles a ring of jade, so the character would carry the meaning of \"a man wearing a ring of jade on his chest\". The meaning \"yellow\" is the result of rebus." + }, + { + "no": 202, + "radical": ["黍"], + "strokeCount": 12, + "meaning": "millet", + "pinyin": "shǔ", + "hanViet": "thử", + "frequency": 46, + "examples": ["黎", "黏", "黐"], + "order": "%E9%BB%8D-order.gif", + "glyphOrigin": [ + "60px-%E9%BB%8D-oracle.svg.png", + "60px-%E9%BB%8D-bronze.svg.png", + "60px-%E9%BB%8D-seal.svg.png", + "60px-%E9%BB%8D-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 203, + "radical": ["黑"], + "strokeCount": 12, + "meaning": "black", + "pinyin": "hēi", + "hanViet": "hắc", + "frequency": 172, + "examples": ["墨", "黓", "黔"], + "order": "%E9%BB%91-order.gif", + "glyphOrigin": [ + "60px-%E9%BB%91-oracle.svg.png", + "60px-%E9%BB%91-bronze.svg.png", + "60px-%E9%BB%91-bronze-spring.svg.png", + "60px-%E9%BB%92-silk.svg.png", + "60px-%E9%BB%91-slip.svg.png", + "60px-%E9%BB%91-seal.svg.png", + "60px-%E9%BB%92-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a person (大) with a tattooed face, depicting penal tattooing (墨), one of the five punishments of ancient China. In the bronze inscriptions from the Spring and Autumn and Warring States periods, dots were sometimes added around 大, leading Shuowen to erroneously interpret the character as an ideogrammic compound (會意): 𡆧 (“chimney”) + 炎 (“fire; flame”) — fire burning under a chimney, causing it to become black from the smoke." + }, + { + "no": 204, + "radical": ["黹"], + "strokeCount": 12, + "meaning": "embroidery", + "pinyin": "zhǐ", + "hanViet": "chỉ", + "frequency": 8, + "examples": ["黺", "黻", "黼"], + "order": "%E9%BB%B9-order.gif", + "glyphOrigin": [ + "60px-%E9%BB%B9-oracle.svg.png", + "60px-%E9%BB%B9-bronze.svg.png", + "60px-%E9%BB%B9-seal.svg.png", + "60px-%E9%BB%B9-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 205, + "radical": ["黽"], + "strokeCount": 13, + "meaning": "frog", + "pinyin": "mǐn", + "hanViet": "mãnh", + "frequency": 40, + "simplified": "黾", + "examples": ["黿", "鼀", "鼁"], + "order": "%E9%BB%BD-order.gif", + "glyphOrigin": ["60px-%E9%BB%BD-seal.svg.png"], + "note": "Pictogram (象形)." + }, + { + "no": 206, + "radical": ["鼎"], + "strokeCount": 13, + "meaning": "tripod", + "pinyin": "dǐng", + "hanViet": "đỉnh", + "frequency": 14, + "examples": ["鼏", "鼐", "鼒"], + "order": "%E9%BC%8E-order.gif", + "glyphOrigin": [ + "60px-%E9%BC%8E-oracle.svg.png", + "60px-%E9%BC%8E-bronze.svg.png", + "60px-%E9%BC%8E-seal.svg.png", + "60px-%E9%BC%8E-bigseal.svg.png" + ], + "note": "Pictogram (象形)." + }, + { + "no": 207, + "radical": ["鼓"], + "strokeCount": 13, + "meaning": "drum", + "pinyin": "gǔ", + "hanViet": "cổ", + "frequency": 46, + "examples": ["鼕", "鼖", "鼗"], + "order": "%E9%BC%93-order.gif", + "glyphOrigin": [ + "60px-%E9%BC%93-oracle.svg.png", + "60px-%E9%BC%93-bronze.svg.png", + "60px-%E9%BC%93-seal.svg.png", + "60px-%E9%BC%93-bigseal.svg.png" + ], + "note": "" + }, + { + "no": 208, + "radical": ["鼠"], + "strokeCount": 13, + "meaning": "rat", + "pinyin": "shǔ", + "hanViet": "thử", + "frequency": 92, + "examples": ["鼢", "鼥", "鼩"], + "order": "%E9%BC%A0-order.gif", + "glyphOrigin": [ + "60px-%E9%BC%A0-oracle.svg.png", + "60px-%E9%BC%A0-seal.svg.png", + "60px-%E9%BC%A0-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a mouse or rat. In the seal script form, which is inherited in the regular script, the upper component resembling 臼 represents the open mouth of a rat with teeth displayed, and the lower component represents the two feet of a rat on the left and a tail on the right." + }, + { + "no": 209, + "radical": ["鼻"], + "strokeCount": 14, + "meaning": "nose", + "pinyin": "bí", + "hanViet": "tị", + "frequency": 49, + "examples": ["鼽", "鼾", "齁"], + "order": "%E9%BC%BB-order.gif", + "glyphOrigin": ["60px-%E9%BC%BB-seal.svg.png"], + "note": "Phono-semantic compound (形聲, OC *blids): semantic 自 (“nose”) + phonetic 畀 (OC *pids). 自 (OC *ɦljids) originally meant 'nose', but replaced by 鼻 (OC *blids) to represent the sense of “self”. Some scholars interpret 鼻 (OC *blids) as a combination of a nose (自 (OC *ɦljids)) and two lungs (畀 (OC *pids))." + }, + { + "no": 210, + "radical": ["齊", "斉"], + "strokeCount": 14, + "meaning": "even", + "pinyin": "qí", + "hanViet": "tề", + "frequency": 18, + "simplified": "齐", + "examples": ["齋", "齌", "齍"], + "order": "%E9%BD%8A-order.gif", + "glyphOrigin": ["60px-%E9%BD%8A-seal.svg.png"], + "note": "Ideogram (指事): a field of grain, hence of uniform height." + }, + { + "no": 211, + "radical": ["齒"], + "strokeCount": 15, + "meaning": "tooth", + "pinyin": "chǐ", + "hanViet": "xỉ/sỉ", + "frequency": 162, + "simplified": "齿", + "examples": ["齔", "齕", "齖"], + "order": "%E9%BD%92-order.gif", + "glyphOrigin": [ + "60px-%E9%BD%92-oracle.svg.png", + "60px-%E9%BD%92-bronze.svg.png", + "60px-Shuowen_Seal_Radical_038.svg.png", + "60px-%E9%BD%92-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a mouth full of teeth. 之 (zhī) or 止 (zhǐ) was later added on top as a phonetic component." + }, + { + "no": 212, + "radical": ["龍"], + "strokeCount": 16, + "meaning": "dragon", + "pinyin": "lóng", + "hanViet": "long", + "frequency": 14, + "simplified": "龙", + "examples": ["龏", "龑", "龔"], + "order": "%E9%BE%8D-order.gif", + "glyphOrigin": [ + "60px-%E9%BE%8D-bronze-shang.svg.png", + "60px-%E9%BE%8D-oracle.svg.png", + "60px-%E9%BE%8D-bronze.svg.png", + "60px-%E9%BE%8D-bronze-spring.svg.png", + "60px-%E9%BE%8D-silk.svg.png", + "60px-%E9%BE%8D-slip.svg.png", + "60px-%E9%BE%8D-seal.svg.png", + "60px-%E9%BE%8D-bigseal.svg.png" + ], + "note": "Pictogram (象形) – originally a serpent with prominent whiskered mouth and eyes. Current form developed in large seal script, with serpent’s body on right (tail at upper right, legs on right), whiskered/fanged mouth at lower left, and eyes/crown at upper left. Left side was subsequently simplified and abstracted, with some influence of 立 and ⺼/月. Note that 竜 existed as a traditional variant dating back to large seal script, and figures a dragon seen face-on, rather than curled around." + }, + { + "no": 213, + "radical": ["龜"], + "strokeCount": 16, + "meaning": "turtle", + "pinyin": "guī", + "hanViet": "quy", + "frequency": 24, + "simplified": "龟", + "examples": ["䶰", "龝", "龞"], + "order": "%E9%BE%9C-order.gif", + "glyphOrigin": [ + "60px-%E9%BE%9C-oracle.svg.png", + "60px-%E9%BE%9C-bronze.svg.png", + "60px-%E9%BE%9C-seal.svg.png", + "60px-%E9%BE%9C-bigseal.svg.png" + ], + "note": "Pictogram (象形): A drawing of a turtle seen from the side and from above (Bronze inscriptions)." + }, + { + "no": 214, + "radical": ["龠"], + "strokeCount": 17, + "meaning": "flute", + "pinyin": "yuè", + "hanViet": "dược", + "frequency": 19, + "examples": ["龡", "龢", "龤"], + "order": "%E9%BE%A0-order.gif", + "glyphOrigin": [ + "60px-%E9%BE%A0-oracle.svg.png", + "60px-%E9%BE%A0-bronze.svg.png", + "60px-%E9%BE%A0-seal.svg.png", + "60px-%E9%BE%A0-bigseal.svg.png" + ], + "note": "Pictogram (象形) – a woodwind instrument. In the bronze inscriptions, 亼 (a flipped 口) was added to show a mouth playing the instrument. Shuowen interprets it as an ideogrammic compound (會意): 品 + 侖." + } +] diff --git a/server/routers/bushou/tokenize/success.json b/server/routers/bushou/tokenize/success.json new file mode 100644 index 0000000..a536fa7 --- /dev/null +++ b/server/routers/bushou/tokenize/success.json @@ -0,0 +1 @@ +[{"term":"中国","dict":[{"traditional":"中國","simplified":"中国","pinyin":"zhong1 guo2","meaning":["China"]}]},{"term":"-"},{"term":"世卫","dict":[{"traditional":"世衛","simplified":"世卫","pinyin":"shi4 wei4","meaning":["World Health Organization (WHO)","abbr. for 世界衛生組織|世界卫生组织[Shi4 jie4 Wei4 sheng1 Zu3 zhi1]"]}]},{"term":"组织","dict":[{"traditional":"組織","simplified":"组织","pinyin":"zu3 zhi1","meaning":["to organize","organization","(biology) tissue","(textiles) weave","CL:個|个[ge4]"]}]},{"term":"新冠","dict":[{"traditional":"新冠","simplified":"新冠","pinyin":"xin1 guan1","meaning":["novel coronavirus (abbr. for 新型冠狀病毒|新型冠状病毒[xin1 xing2 guan1 zhuang4 bing4 du2]) (esp. SARS-CoV-2, the virus causing COVID-19)"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"溯源","dict":[{"traditional":"溯源","simplified":"溯源","pinyin":"su4 yuan2","meaning":["to investigate the origin of sth","to trace a river upstream back to its source"]}]},{"term":"联合","dict":[{"traditional":"聯合","simplified":"联合","pinyin":"lian2 he2","meaning":["to combine","to join","unite","alliance"]}]},{"term":"研究","dict":[{"traditional":"研究","simplified":"研究","pinyin":"yan2 jiu1","meaning":["research","a study","CL:項|项[xiang4]","to research","to look into"]}]},{"term":"报告","dict":[{"traditional":"報告","simplified":"报告","pinyin":"bao4 gao4","meaning":["to inform","to report","to make known","report","speech","talk","lecture","CL:篇[pian1],份[fen4],個|个[ge4],通[tong4]"]}]},{"term":"正式","dict":[{"traditional":"正式","simplified":"正式","pinyin":"zheng4 shi4","meaning":["formal","official"]}]},{"term":"发布","dict":[{"traditional":"發佈","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute","also written 發布|发布[fa1 bu4]"]},{"traditional":"發布","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute"]}]},{"term":"\n"},{"term":"世界","dict":[{"traditional":"世界","simplified":"世界","pinyin":"shi4 jie4","meaning":["world","CL:個|个[ge4]"]}]},{"term":"卫生","dict":[{"traditional":"衛生","simplified":"卫生","pinyin":"wei4 sheng1","meaning":["health","hygiene","sanitation"]}]},{"term":"组织","dict":[{"traditional":"組織","simplified":"组织","pinyin":"zu3 zhi1","meaning":["to organize","organization","(biology) tissue","(textiles) weave","CL:個|个[ge4]"]}]},{"term":"3"},{"term":"0"},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"日内瓦","dict":[{"traditional":"日內瓦","simplified":"日内瓦","pinyin":"ri4 nei4 wa3","meaning":["Geneva, Switzerland"]}]},{"term":"正式","dict":[{"traditional":"正式","simplified":"正式","pinyin":"zheng4 shi4","meaning":["formal","official"]}]},{"term":"发布","dict":[{"traditional":"發佈","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute","also written 發布|发布[fa1 bu4]"]},{"traditional":"發布","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute"]}]},{"term":"中国","dict":[{"traditional":"中國","simplified":"中国","pinyin":"zhong1 guo2","meaning":["China"]}]},{"term":"-"},{"term":"世卫","dict":[{"traditional":"世衛","simplified":"世卫","pinyin":"shi4 wei4","meaning":["World Health Organization (WHO)","abbr. for 世界衛生組織|世界卫生组织[Shi4 jie4 Wei4 sheng1 Zu3 zhi1]"]}]},{"term":"组织","dict":[{"traditional":"組織","simplified":"组织","pinyin":"zu3 zhi1","meaning":["to organize","organization","(biology) tissue","(textiles) weave","CL:個|个[ge4]"]}]},{"term":"新冠","dict":[{"traditional":"新冠","simplified":"新冠","pinyin":"xin1 guan1","meaning":["novel coronavirus (abbr. for 新型冠狀病毒|新型冠状病毒[xin1 xing2 guan1 zhuang4 bing4 du2]) (esp. SARS-CoV-2, the virus causing COVID-19)"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"溯源","dict":[{"traditional":"溯源","simplified":"溯源","pinyin":"su4 yuan2","meaning":["to investigate the origin of sth","to trace a river upstream back to its source"]}]},{"term":"联合","dict":[{"traditional":"聯合","simplified":"联合","pinyin":"lian2 he2","meaning":["to combine","to join","unite","alliance"]}]},{"term":"研究","dict":[{"traditional":"研究","simplified":"研究","pinyin":"yan2 jiu1","meaning":["research","a study","CL:項|项[xiang4]","to research","to look into"]}]},{"term":"报告","dict":[{"traditional":"報告","simplified":"报告","pinyin":"bao4 gao4","meaning":["to inform","to report","to make known","report","speech","talk","lecture","CL:篇[pian1],份[fen4],個|个[ge4],通[tong4]"]}]},{"term":"。"},{"term":"报告","dict":[{"traditional":"報告","simplified":"报告","pinyin":"bao4 gao4","meaning":["to inform","to report","to make known","report","speech","talk","lecture","CL:篇[pian1],份[fen4],個|个[ge4],通[tong4]"]}]},{"term":"认为","dict":[{"traditional":"認為","simplified":"认为","pinyin":"ren4 wei2","meaning":["to believe","to think","to consider","to feel"]}]},{"term":","},{"term":"新冠","dict":[{"traditional":"新冠","simplified":"新冠","pinyin":"xin1 guan1","meaning":["novel coronavirus (abbr. for 新型冠狀病毒|新型冠状病毒[xin1 xing2 guan1 zhuang4 bing4 du2]) (esp. SARS-CoV-2, the virus causing COVID-19)"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"“"},{"term":"极","dict":[{"traditional":"極","simplified":"极","pinyin":"ji2","meaning":["extremely","pole (geography, physics)","utmost","top"]}]},{"term":"不可能","dict":[{"traditional":"不可能","simplified":"不可能","pinyin":"bu4 ke3 neng2","meaning":["impossible","cannot","not able"]}]},{"term":"”"},{"term":"通过","dict":[{"traditional":"通過","simplified":"通过","pinyin":"tong1 guo4","meaning":["by means of","through","via","to pass through","to get through","to adopt","to pass (a bill or inspection etc)","to switch over"]}]},{"term":"实验室","dict":[{"traditional":"實驗室","simplified":"实验室","pinyin":"shi2 yan4 shi4","meaning":["laboratory","CL:間|间[jian1]"]}]},{"term":"传人","dict":[{"traditional":"傳人","simplified":"传人","pinyin":"chuan2 ren2","meaning":["to teach","to impart","a disciple","descendant"]}]},{"term":"。"},{"term":"今年","dict":[{"traditional":"今年","simplified":"今年","pinyin":"jin1 nian2","meaning":["this year"]}]},{"term":"1"},{"term":"月","dict":[{"traditional":"月","simplified":"月","pinyin":"yue4","meaning":["moon","month","monthly","CL:個|个[ge4],輪|轮[lun2]"]}]},{"term":"1"},{"term":"4"},{"term":"日至","dict":[{"traditional":"日至","simplified":"日至","pinyin":"ri4 zhi4","meaning":["solstice","the winter solstice 冬至 and summer solstice 夏至"]}]},{"term":"2"},{"term":"月","dict":[{"traditional":"月","simplified":"月","pinyin":"yue4","meaning":["moon","month","monthly","CL:個|个[ge4],輪|轮[lun2]"]}]},{"term":"1"},{"term":"0"},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":","},{"term":"1"},{"term":"7"},{"term":"名","dict":[{"traditional":"名","simplified":"名","pinyin":"ming2","meaning":["name","noun (part of speech)","place (e.g. among winners)","famous","classifier for people"]}]},{"term":"中方","dict":[{"traditional":"中方","simplified":"中方","pinyin":"zhong1 fang1","meaning":["the Chinese side (in an international venture)"]}]},{"term":"专家","dict":[{"traditional":"專家","simplified":"专家","pinyin":"zhuan1 jia1","meaning":["expert","specialist","CL:個|个[ge4]"]}]},{"term":"和","dict":[{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["surname He","Japanese (food, clothes etc)"]},{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["and","together with","with","sum","union","peace","harmony","Taiwan pr. [han4] when it means \"and\" or \"with\""]},{"traditional":"和","simplified":"和","pinyin":"he4","meaning":["to compose a poem in reply (to sb's poem) using the same rhyme sequence","to join in the singing","to chime in with others"]},{"traditional":"和","simplified":"和","pinyin":"hu2","meaning":["to complete a set in mahjong or playing cards"]},{"traditional":"和","simplified":"和","pinyin":"huo2","meaning":["to combine a powdery substance (flour, plaster etc) with water","Taiwan pr. [huo4]"]},{"traditional":"和","simplified":"和","pinyin":"huo4","meaning":["to mix (ingredients) together","to blend","classifier for rinses of clothes","classifier for boilings of medicinal herbs"]}]},{"term":"1"},{"term":"7"},{"term":"名","dict":[{"traditional":"名","simplified":"名","pinyin":"ming2","meaning":["name","noun (part of speech)","place (e.g. among winners)","famous","classifier for people"]}]},{"term":"外","dict":[{"traditional":"外","simplified":"外","pinyin":"wai4","meaning":["outside","in addition","foreign","external"]}]},{"term":"方","dict":[{"traditional":"方","simplified":"方","pinyin":"fang1","meaning":["surname Fang"]},{"traditional":"方","simplified":"方","pinyin":"fang1","meaning":["square","power or involution (math.)","upright","honest","fair and square","direction","side","party (to a contract, dispute etc)","place","method","prescription (medicine)","just when","only or just","classifier for square things","abbr. for square or cubic meter"]}]},{"term":"专家","dict":[{"traditional":"專家","simplified":"专家","pinyin":"zhuan1 jia1","meaning":["expert","specialist","CL:個|个[ge4]"]}]},{"term":"组成","dict":[{"traditional":"組成","simplified":"组成","pinyin":"zu3 cheng2","meaning":["to form","to make up","to constitute"]}]},{"term":"联合","dict":[{"traditional":"聯合","simplified":"联合","pinyin":"lian2 he2","meaning":["to combine","to join","unite","alliance"]}]},{"term":"专家","dict":[{"traditional":"專家","simplified":"专家","pinyin":"zhuan1 jia1","meaning":["expert","specialist","CL:個|个[ge4]"]}]},{"term":"组","dict":[{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["surname Zu"]},{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["to form","to organize","group","team","classifier for sets, series, groups of people, batteries"]}]},{"term":","},{"term":"分为","dict":[{"traditional":"分為","simplified":"分为","pinyin":"fen1 wei2","meaning":["to divide sth into (parts)","to subdivide"]}]},{"term":"流行病学","dict":[{"traditional":"流行病學","simplified":"流行病学","pinyin":"liu2 xing2 bing4 xue2","meaning":["epidemiology"]}]},{"term":"、"},{"term":"分子","dict":[{"traditional":"分子","simplified":"分子","pinyin":"fen1 zi3","meaning":["molecule","(math) numerator of a fraction"]},{"traditional":"分子","simplified":"分子","pinyin":"fen4 zi3","meaning":["members of a class or group","political elements (such as intellectuals or extremists)","part"]}]},{"term":"溯源","dict":[{"traditional":"溯源","simplified":"溯源","pinyin":"su4 yuan2","meaning":["to investigate the origin of sth","to trace a river upstream back to its source"]}]},{"term":"、"},{"term":"动物","dict":[{"traditional":"動物","simplified":"动物","pinyin":"dong4 wu4","meaning":["animal","CL:隻|只[zhi1],群[qun2],個|个[ge4]"]}]},{"term":"与","dict":[{"traditional":"與","simplified":"与","pinyin":"yu2","meaning":["variant of 歟|欤[yu2]"]},{"traditional":"與","simplified":"与","pinyin":"yu3","meaning":["and","to give","together with"]},{"traditional":"與","simplified":"与","pinyin":"yu4","meaning":["to take part in"]}]},{"term":"环境","dict":[{"traditional":"環境","simplified":"环境","pinyin":"huan2 jing4","meaning":["environment","circumstances","surroundings","CL:個|个[ge4]","ambient"]}]},{"term":"3"},{"term":"个","dict":[{"traditional":"個","simplified":"个","pinyin":"ge4","meaning":["individual","this","that","size","classifier for people or objects in general"]},{"traditional":"箇","simplified":"个","pinyin":"ge4","meaning":["variant of 個|个[ge4]"]}]},{"term":"小组","dict":[{"traditional":"小組","simplified":"小组","pinyin":"xiao3 zu3","meaning":["group"]}]},{"term":","},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"武汉","dict":[{"traditional":"武漢","simplified":"武汉","pinyin":"wu3 han4","meaning":["Wuhan city on Changjiang, subprovincial city and capital of Hubei province"]}]},{"term":"开展","dict":[{"traditional":"開展","simplified":"开展","pinyin":"kai1 zhan3","meaning":["to launch","to develop","to unfold","(of an exhibition etc) to open"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"为期","dict":[{"traditional":"為期","simplified":"为期","pinyin":"wei2 qi1","meaning":["(to be done) by (a certain date)","lasting (a certain time)"]}]},{"term":"2"},{"term":"8"},{"term":"天","dict":[{"traditional":"天","simplified":"天","pinyin":"tian1","meaning":["day","sky","heaven"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"全球","dict":[{"traditional":"全球","simplified":"全球","pinyin":"quan2 qiu2","meaning":["entire","total","global","the (whole) world","worldwide"]}]},{"term":"溯源","dict":[{"traditional":"溯源","simplified":"溯源","pinyin":"su4 yuan2","meaning":["to investigate the origin of sth","to trace a river upstream back to its source"]}]},{"term":"研究","dict":[{"traditional":"研究","simplified":"研究","pinyin":"yan2 jiu1","meaning":["research","a study","CL:項|项[xiang4]","to research","to look into"]}]},{"term":"中国","dict":[{"traditional":"中國","simplified":"中国","pinyin":"zhong1 guo2","meaning":["China"]}]},{"term":"部分","dict":[{"traditional":"部分","simplified":"部分","pinyin":"bu4 fen5","meaning":["part","share","section","piece","CL:個|个[ge4]"]}]},{"term":"工作","dict":[{"traditional":"工作","simplified":"工作","pinyin":"gong1 zuo4","meaning":["to work","(of a machine) to operate","job","work","task","CL:個|个[ge4],份[fen4],項|项[xiang4]"]}]},{"term":","},{"term":"在此","dict":[{"traditional":"在此","simplified":"在此","pinyin":"zai4 ci3","meaning":["hereto","here"]}]},{"term":"基础","dict":[{"traditional":"基礎","simplified":"基础","pinyin":"ji1 chu3","meaning":["base","foundation","basis","underlying","CL:個|个[ge4]"]}]},{"term":"上","dict":[{"traditional":"上","simplified":"上","pinyin":"shang3","meaning":["see 上聲|上声[shang3 sheng1]"]},{"traditional":"上","simplified":"上","pinyin":"shang4","meaning":["on top","upon","above","upper","previous","first (of multiple parts)","to climb","to get onto","to go up","to attend (class or university)"]}]},{"term":"撰写","dict":[{"traditional":"撰寫","simplified":"撰写","pinyin":"zhuan4 xie3","meaning":["to write","to compose"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"研究","dict":[{"traditional":"研究","simplified":"研究","pinyin":"yan2 jiu1","meaning":["research","a study","CL:項|项[xiang4]","to research","to look into"]}]},{"term":"报告","dict":[{"traditional":"報告","simplified":"报告","pinyin":"bao4 gao4","meaning":["to inform","to report","to make known","report","speech","talk","lecture","CL:篇[pian1],份[fen4],個|个[ge4],通[tong4]"]}]},{"term":"。"},{"term":"联合","dict":[{"traditional":"聯合","simplified":"联合","pinyin":"lian2 he2","meaning":["to combine","to join","unite","alliance"]}]},{"term":"专家","dict":[{"traditional":"專家","simplified":"专家","pinyin":"zhuan1 jia1","meaning":["expert","specialist","CL:個|个[ge4]"]}]},{"term":"组","dict":[{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["surname Zu"]},{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["to form","to organize","group","team","classifier for sets, series, groups of people, batteries"]}]},{"term":"评估","dict":[{"traditional":"評估","simplified":"评估","pinyin":"ping2 gu1","meaning":["to evaluate","to assess","assessment","evaluation"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"关于","dict":[{"traditional":"關於","simplified":"关于","pinyin":"guan1 yu2","meaning":["pertaining to","concerning","with regard to","about","a matter of"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"引入","dict":[{"traditional":"引入","simplified":"引入","pinyin":"yin3 ru4","meaning":["to draw into","to pull into","to introduce"]}]},{"term":"人类","dict":[{"traditional":"人類","simplified":"人类","pinyin":"ren2 lei4","meaning":["humanity","human race","mankind"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"4"},{"term":"个","dict":[{"traditional":"個","simplified":"个","pinyin":"ge4","meaning":["individual","this","that","size","classifier for people or objects in general"]},{"traditional":"箇","simplified":"个","pinyin":"ge4","meaning":["variant of 個|个[ge4]"]}]},{"term":"路径","dict":[{"traditional":"路徑","simplified":"路径","pinyin":"lu4 jing4","meaning":["path","route","method","ways and means"]}]},{"term":","},{"term":"认为","dict":[{"traditional":"認為","simplified":"认为","pinyin":"ren4 wei2","meaning":["to believe","to think","to consider","to feel"]}]},{"term":"新冠","dict":[{"traditional":"新冠","simplified":"新冠","pinyin":"xin1 guan1","meaning":["novel coronavirus (abbr. for 新型冠狀病毒|新型冠状病毒[xin1 xing2 guan1 zhuang4 bing4 du2]) (esp. SARS-CoV-2, the virus causing COVID-19)"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"“"},{"term":"比较","dict":[{"traditional":"比較","simplified":"比较","pinyin":"bi3 jiao4","meaning":["to compare","to contrast","comparatively","relatively","quite","comparison"]}]},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"至","dict":[{"traditional":"至","simplified":"至","pinyin":"zhi4","meaning":["to arrive","most","to","until"]}]},{"term":"非常","dict":[{"traditional":"非常","simplified":"非常","pinyin":"fei1 chang2","meaning":["very","very much","unusual","extraordinary"]}]},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"”"},{"term":"经","dict":[{"traditional":"經","simplified":"经","pinyin":"jing1","meaning":["surname Jing"]},{"traditional":"經","simplified":"经","pinyin":"jing1","meaning":["classics","sacred book","scripture","to pass through","to undergo","to bear","to endure","warp (textile)","longitude","menstruation","channel (TCM)","abbr. for economics 經濟|经济[jing1 ji4]"]}]},{"term":"中间","dict":[{"traditional":"中間","simplified":"中间","pinyin":"zhong1 jian1","meaning":["between","intermediate","mid","middle"]}]},{"term":"宿主","dict":[{"traditional":"宿主","simplified":"宿主","pinyin":"su4 zhu3","meaning":["host"]}]},{"term":"传人","dict":[{"traditional":"傳人","simplified":"传人","pinyin":"chuan2 ren2","meaning":["to teach","to impart","a disciple","descendant"]}]},{"term":","},{"term":"“"},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"至","dict":[{"traditional":"至","simplified":"至","pinyin":"zhi4","meaning":["to arrive","most","to","until"]}]},{"term":"比较","dict":[{"traditional":"比較","simplified":"比较","pinyin":"bi3 jiao4","meaning":["to compare","to contrast","comparatively","relatively","quite","comparison"]}]},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"”"},{"term":"直接","dict":[{"traditional":"直接","simplified":"直接","pinyin":"zhi2 jie1","meaning":["direct (opposite: indirect 間接|间接[jian4 jie1])","immediate","straightforward"]}]},{"term":"传人","dict":[{"traditional":"傳人","simplified":"传人","pinyin":"chuan2 ren2","meaning":["to teach","to impart","a disciple","descendant"]}]},{"term":","},{"term":"“"},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"”"},{"term":"通过","dict":[{"traditional":"通過","simplified":"通过","pinyin":"tong1 guo4","meaning":["by means of","through","via","to pass through","to get through","to adopt","to pass (a bill or inspection etc)","to switch over"]}]},{"term":"冷","dict":[{"traditional":"冷","simplified":"冷","pinyin":"leng3","meaning":["surname Leng"]},{"traditional":"冷","simplified":"冷","pinyin":"leng3","meaning":["cold"]}]},{"term":"链","dict":[{"traditional":"鏈","simplified":"链","pinyin":"lian4","meaning":["chain","cable (unit of length: 100 fathoms, about 185 m)","chain (unit of length: 66 feet, about 20 m)","to chain","to enchain"]}]},{"term":"食品","dict":[{"traditional":"食品","simplified":"食品","pinyin":"shi2 pin3","meaning":["foodstuff","food","provisions","CL:種|种[zhong3]"]}]},{"term":"传人","dict":[{"traditional":"傳人","simplified":"传人","pinyin":"chuan2 ren2","meaning":["to teach","to impart","a disciple","descendant"]}]},{"term":","},{"term":"“"},{"term":"极","dict":[{"traditional":"極","simplified":"极","pinyin":"ji2","meaning":["extremely","pole (geography, physics)","utmost","top"]}]},{"term":"不可能","dict":[{"traditional":"不可能","simplified":"不可能","pinyin":"bu4 ke3 neng2","meaning":["impossible","cannot","not able"]}]},{"term":"”"},{"term":"通过","dict":[{"traditional":"通過","simplified":"通过","pinyin":"tong1 guo4","meaning":["by means of","through","via","to pass through","to get through","to adopt","to pass (a bill or inspection etc)","to switch over"]}]},{"term":"实验室","dict":[{"traditional":"實驗室","simplified":"实验室","pinyin":"shi2 yan4 shi4","meaning":["laboratory","CL:間|间[jian1]"]}]},{"term":"传人","dict":[{"traditional":"傳人","simplified":"传人","pinyin":"chuan2 ren2","meaning":["to teach","to impart","a disciple","descendant"]}]},{"term":"。"},{"term":"报告","dict":[{"traditional":"報告","simplified":"报告","pinyin":"bao4 gao4","meaning":["to inform","to report","to make known","report","speech","talk","lecture","CL:篇[pian1],份[fen4],個|个[ge4],通[tong4]"]}]},{"term":"提出","dict":[{"traditional":"提出","simplified":"提出","pinyin":"ti2 chu1","meaning":["to raise (an issue)","to propose","to put forward","to suggest","to post (on a website)","to withdraw (cash)"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"联合","dict":[{"traditional":"聯合","simplified":"联合","pinyin":"lian2 he2","meaning":["to combine","to join","unite","alliance"]}]},{"term":"专家","dict":[{"traditional":"專家","simplified":"专家","pinyin":"zhuan1 jia1","meaning":["expert","specialist","CL:個|个[ge4]"]}]},{"term":"组","dict":[{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["surname Zu"]},{"traditional":"組","simplified":"组","pinyin":"zu3","meaning":["to form","to organize","group","team","classifier for sets, series, groups of people, batteries"]}]},{"term":"下","dict":[{"traditional":"下","simplified":"下","pinyin":"xia4","meaning":["down","downwards","below","lower","later","next (week etc)","second (of two parts)","to decline","to go down","to arrive at (a decision, conclusion etc)","measure word to show the frequency of an action"]}]},{"term":"步","dict":[{"traditional":"步","simplified":"步","pinyin":"bu4","meaning":["surname Bu"]},{"traditional":"步","simplified":"步","pinyin":"bu4","meaning":["a step","a pace","walk","march","stages in a process","situation"]}]},{"term":"研究","dict":[{"traditional":"研究","simplified":"研究","pinyin":"yan2 jiu1","meaning":["research","a study","CL:項|项[xiang4]","to research","to look into"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"建议","dict":[{"traditional":"建議","simplified":"建议","pinyin":"jian4 yi4","meaning":["to propose","to suggest","to recommend","proposal","suggestion","recommendation","CL:個|个[ge4],點|点[dian3]"]}]},{"term":","},{"term":"包括","dict":[{"traditional":"包括","simplified":"包括","pinyin":"bao1 kuo4","meaning":["to comprise","to include","to involve","to incorporate","to consist of"]}]},{"term":"建立","dict":[{"traditional":"建立","simplified":"建立","pinyin":"jian4 li4","meaning":["to establish","to set up","to found"]}]},{"term":"全球","dict":[{"traditional":"全球","simplified":"全球","pinyin":"quan2 qiu2","meaning":["entire","total","global","the (whole) world","worldwide"]}]},{"term":"统一","dict":[{"traditional":"統一","simplified":"统一","pinyin":"tong3 yi1","meaning":["to unify","to unite","to integrate"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"数据库","dict":[{"traditional":"數據庫","simplified":"数据库","pinyin":"shu4 ju4 ku4","meaning":["database"]}]},{"term":","},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"全球","dict":[{"traditional":"全球","simplified":"全球","pinyin":"quan2 qiu2","meaning":["entire","total","global","the (whole) world","worldwide"]}]},{"term":"更","dict":[{"traditional":"更","simplified":"更","pinyin":"geng1","meaning":["to change or replace","to experience","one of the five two-hour periods into which the night was formerly divided","watch (e.g. of a sentry or guard)"]},{"traditional":"更","simplified":"更","pinyin":"geng4","meaning":["more","even more","further","still","still more"]}]},{"term":"广","dict":[{"traditional":"广","simplified":"广","pinyin":"yan3","meaning":["\"house on a cliff\" radical in Chinese characters (Kangxi radical 53), occurring in 店, 序, 底 etc"]}]},{"term":"范围","dict":[{"traditional":"範圍","simplified":"范围","pinyin":"fan4 wei2","meaning":["range","scope","limit","extent","CL:個|个[ge4]"]}]},{"term":"内","dict":[{"traditional":"內","simplified":"内","pinyin":"nei4","meaning":["inside","inner","internal","within","interior"]}]},{"term":"继续","dict":[{"traditional":"繼續","simplified":"继续","pinyin":"ji4 xu4","meaning":["to continue","to proceed with","to go on with"]}]},{"term":"寻找","dict":[{"traditional":"尋找","simplified":"寻找","pinyin":"xun2 zhao3","meaning":["to seek","to look for"]}]},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"早期","dict":[{"traditional":"早期","simplified":"早期","pinyin":"zao3 qi1","meaning":["early period","early phase","early stage"]}]},{"term":"病例","dict":[{"traditional":"病例","simplified":"病例","pinyin":"bing4 li4","meaning":["(medical) case","occurrence of illness"]}]},{"term":","},{"term":"由","dict":[{"traditional":"由","simplified":"由","pinyin":"you2","meaning":["to follow","from","because of","due to","by","via","through","(before a noun and a verb) it is for ... to ..."]}]},{"term":"全球","dict":[{"traditional":"全球","simplified":"全球","pinyin":"quan2 qiu2","meaning":["entire","total","global","the (whole) world","worldwide"]}]},{"term":"科学家","dict":[{"traditional":"科學家","simplified":"科学家","pinyin":"ke1 xue2 jia1","meaning":["scientist","CL:個|个[ge4]"]}]},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"多国","dict":[{"traditional":"多國","simplified":"多国","pinyin":"duo1 guo2","meaning":["multinational"]}]},{"term":"多","dict":[{"traditional":"多","simplified":"多","pinyin":"duo1","meaning":["many","much","often","a lot of","numerous","more","in excess","how (to what extent)","multi-","Taiwan pr. [duo2] when it means \"how\""]}]},{"term":"地","dict":[{"traditional":"地","simplified":"地","pinyin":"de5","meaning":["-ly","structural particle: used before a verb or adjective, linking it to preceding modifying adverbial adjunct"]},{"traditional":"地","simplified":"地","pinyin":"di4","meaning":["earth","ground","field","place","land","CL:片[pian4]"]}]},{"term":"寻找","dict":[{"traditional":"尋找","simplified":"寻找","pinyin":"xun2 zhao3","meaning":["to seek","to look for"]}]},{"term":"可能","dict":[{"traditional":"可能","simplified":"可能","pinyin":"ke3 neng2","meaning":["might (happen)","possible","probable","possibility","probability","maybe","perhaps","CL:個|个[ge4]"]}]},{"term":"成为","dict":[{"traditional":"成為","simplified":"成为","pinyin":"cheng2 wei2","meaning":["to become","to turn into"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"宿主","dict":[{"traditional":"宿主","simplified":"宿主","pinyin":"su4 zhu3","meaning":["host"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"动物","dict":[{"traditional":"動物","simplified":"动物","pinyin":"dong4 wu4","meaning":["animal","CL:隻|只[zhi1],群[qun2],個|个[ge4]"]}]},{"term":"物种","dict":[{"traditional":"物種","simplified":"物种","pinyin":"wu4 zhong3","meaning":["species"]}]},{"term":","},{"term":"进","dict":[{"traditional":"進","simplified":"进","pinyin":"jin4","meaning":["to go forward","to advance","to go in","to enter","to put in","to submit","to take in","to admit","(math.) base of a number system","classifier for sections in a building or residential compound"]}]},{"term":"一","dict":[{"traditional":"一","simplified":"一","pinyin":"yi1","meaning":["one","1","single","a (article)","as soon as","entire","whole","all","throughout","\"one\" radical in Chinese characters (Kangxi radical 1)","also pr. [yao1] for greater clarity when spelling out numbers digit by digit"]}]},{"term":"步","dict":[{"traditional":"步","simplified":"步","pinyin":"bu4","meaning":["surname Bu"]},{"traditional":"步","simplified":"步","pinyin":"bu4","meaning":["a step","a pace","walk","march","stages in a process","situation"]}]},{"term":"了解","dict":[{"traditional":"了解","simplified":"了解","pinyin":"liao3 jie3","meaning":["to understand","to realize","to find out"]}]},{"term":"冷","dict":[{"traditional":"冷","simplified":"冷","pinyin":"leng3","meaning":["surname Leng"]},{"traditional":"冷","simplified":"冷","pinyin":"leng3","meaning":["cold"]}]},{"term":"链","dict":[{"traditional":"鏈","simplified":"链","pinyin":"lian4","meaning":["chain","cable (unit of length: 100 fathoms, about 185 m)","chain (unit of length: 66 feet, about 20 m)","to chain","to enchain"]}]},{"term":"和","dict":[{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["surname He","Japanese (food, clothes etc)"]},{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["and","together with","with","sum","union","peace","harmony","Taiwan pr. [han4] when it means \"and\" or \"with\""]},{"traditional":"和","simplified":"和","pinyin":"he4","meaning":["to compose a poem in reply (to sb's poem) using the same rhyme sequence","to join in the singing","to chime in with others"]},{"traditional":"和","simplified":"和","pinyin":"hu2","meaning":["to complete a set in mahjong or playing cards"]},{"traditional":"和","simplified":"和","pinyin":"huo2","meaning":["to combine a powdery substance (flour, plaster etc) with water","Taiwan pr. [huo4]"]},{"traditional":"和","simplified":"和","pinyin":"huo4","meaning":["to mix (ingredients) together","to blend","classifier for rinses of clothes","classifier for boilings of medicinal herbs"]}]},{"term":"冷冻","dict":[{"traditional":"冷凍","simplified":"冷冻","pinyin":"leng3 dong4","meaning":["to freeze","to deep-freeze"]}]},{"term":"食品","dict":[{"traditional":"食品","simplified":"食品","pinyin":"shi2 pin3","meaning":["foodstuff","food","provisions","CL:種|种[zhong3]"]}]},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"病毒","dict":[{"traditional":"病毒","simplified":"病毒","pinyin":"bing4 du2","meaning":["virus"]}]},{"term":"传播","dict":[{"traditional":"傳播","simplified":"传播","pinyin":"chuan2 bo1","meaning":["to disseminate","to propagate","to spread"]}]},{"term":"过程","dict":[{"traditional":"過程","simplified":"过程","pinyin":"guo4 cheng2","meaning":["course of events","process","CL:個|个[ge4]"]}]},{"term":"中的","dict":[{"traditional":"中的","simplified":"中的","pinyin":"zhong4 di4","meaning":["to hit the target","to hit the nail on the head"]}]},{"term":"作用","dict":[{"traditional":"作用","simplified":"作用","pinyin":"zuo4 yong4","meaning":["to act on","to affect","action","function","activity","impact","result","effect","purpose","intent","to play a role","corresponds to English -ity, -ism, -ization","CL:個|个[ge4]"]}]},{"term":"等","dict":[{"traditional":"等","simplified":"等","pinyin":"deng3","meaning":["class","rank","grade","equal to","same as","to wait for","to await","et cetera","and so on","et al. (and other authors)","after","as soon as","once"]}]},{"term":"。"},{"term":"\n"},{"term":"\n"},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"搁浅","dict":[{"traditional":"擱淺","simplified":"搁浅","pinyin":"ge1 qian3","meaning":["to be stranded (of ship)","to run aground","fig. to run into difficulties and stop"]}]},{"term":"6"},{"term":"天","dict":[{"traditional":"天","simplified":"天","pinyin":"tian1","meaning":["day","sky","heaven"]}]},{"term":"终于","dict":[{"traditional":"終於","simplified":"终于","pinyin":"zhong1 yu2","meaning":["at last","in the end","finally","eventually"]}]},{"term":"脱","dict":[{"traditional":"脫","simplified":"脱","pinyin":"tuo1","meaning":["to shed","to take off","to escape","to get away from"]}]},{"term":"困","dict":[{"traditional":"困","simplified":"困","pinyin":"kun4","meaning":["to trap","to surround","hard-pressed","stranded","destitute"]}]},{"term":" "},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"恢复","dict":[{"traditional":"恢復","simplified":"恢复","pinyin":"hui1 fu4","meaning":["to reinstate","to resume","to restore","to recover","to regain","to rehabilitate"]}]},{"term":"通航","dict":[{"traditional":"通航","simplified":"通航","pinyin":"tong1 hang2","meaning":["connected by air, sea traffic or service"]}]},{"term":"\n"},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"因","dict":[{"traditional":"因","simplified":"因","pinyin":"yin1","meaning":["cause","reason","because"]}]},{"term":"“"},{"term":"长","dict":[{"traditional":"長","simplified":"长","pinyin":"chang2","meaning":["length","long","forever","always","constantly"]},{"traditional":"長","simplified":"长","pinyin":"zhang3","meaning":["chief","head","elder","to grow","to develop","to increase","to enhance"]}]},{"term":"赐","dict":[{"traditional":"賜","simplified":"赐","pinyin":"ci4","meaning":["to confer","to bestow","to grant"]}]},{"term":"”"},{"term":"号","dict":[{"traditional":"號","simplified":"号","pinyin":"hao2","meaning":["roar","cry","CL:個|个[ge4]"]},{"traditional":"號","simplified":"号","pinyin":"hao4","meaning":["ordinal number","day of a month","mark","sign","business establishment","size","ship suffix","horn (wind instrument)","bugle call","assumed name","to take a pulse","classifier used to indicate number of people"]}]},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"搁浅","dict":[{"traditional":"擱淺","simplified":"搁浅","pinyin":"ge1 qian3","meaning":["to be stranded (of ship)","to run aground","fig. to run into difficulties and stop"]}]},{"term":"被","dict":[{"traditional":"被","simplified":"被","pinyin":"bei4","meaning":["quilt","by","(indicates passive-voice clauses)","(literary) to cover","to meet with","(coll.) (since c. 2009) used before a verb that does not accurately represent what actually happened, to describe with black humor how sb or sth was dealt with by the authorities (as in 被自殺|被自杀[bei4 zi4 sha1])"]}]},{"term":"堵","dict":[{"traditional":"堵","simplified":"堵","pinyin":"du3","meaning":["to block up (a road, pipe etc)","to stop up (a hole)","(fig.) (of a person) choked up with anxiety or stress","wall (literary)","(classifier for walls)"]}]},{"term":"多","dict":[{"traditional":"多","simplified":"多","pinyin":"duo1","meaning":["many","much","often","a lot of","numerous","more","in excess","how (to what extent)","multi-","Taiwan pr. [duo2] when it means \"how\""]}]},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":","},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"解","dict":[{"traditional":"解","simplified":"解","pinyin":"xie4","meaning":["surname Xie"]},{"traditional":"解","simplified":"解","pinyin":"jie3","meaning":["to divide","to break up","to split","to separate","to dissolve","to solve","to melt","to remove","to untie","to loosen","to open","to emancipate","to explain","to understand","to know","a solution","a dissection"]},{"traditional":"解","simplified":"解","pinyin":"jie4","meaning":["to transport under guard"]},{"traditional":"解","simplified":"解","pinyin":"xie4","meaning":["acrobatic display (esp. on horseback) (old)","variant of 懈[xie4] and 邂[xie4] (old)"]}]},{"term":"困","dict":[{"traditional":"困","simplified":"困","pinyin":"kun4","meaning":["to trap","to surround","hard-pressed","stranded","destitute"]}]},{"term":"进展","dict":[{"traditional":"進展","simplified":"进展","pinyin":"jin4 zhan3","meaning":["to make headway","to make progress"]}]},{"term":"牵动","dict":[{"traditional":"牽動","simplified":"牵动","pinyin":"qian1 dong4","meaning":["to affect","to produce a change in sth"]}]},{"term":"全球","dict":[{"traditional":"全球","simplified":"全球","pinyin":"quan2 qiu2","meaning":["entire","total","global","the (whole) world","worldwide"]}]},{"term":"目光","dict":[{"traditional":"目光","simplified":"目光","pinyin":"mu4 guang1","meaning":["sight","vision","view","gaze","look"]}]},{"term":"。"},{"term":"经过","dict":[{"traditional":"經過","simplified":"经过","pinyin":"jing1 guo4","meaning":["to pass","to go through","process","course","CL:個|个[ge4]"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"长达","dict":[{"traditional":"長達","simplified":"长达","pinyin":"chang2 da2","meaning":["to extend as long as","to lengthen out to"]}]},{"term":"一周","dict":[{"traditional":"一周","simplified":"一周","pinyin":"yi1 zhou1","meaning":["one week","all the way around","a whole cycle"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"救援","dict":[{"traditional":"救援","simplified":"救援","pinyin":"jiu4 yuan2","meaning":["to save","to support","to help","to assist"]}]},{"term":","},{"term":"当地","dict":[{"traditional":"當地","simplified":"当地","pinyin":"dang1 di4","meaning":["local"]}]},{"term":"时间","dict":[{"traditional":"時間","simplified":"时间","pinyin":"shi2 jian1","meaning":["time","period","CL:段[duan4]"]}]},{"term":"3"},{"term":"月","dict":[{"traditional":"月","simplified":"月","pinyin":"yue4","meaning":["moon","month","monthly","CL:個|个[ge4],輪|轮[lun2]"]}]},{"term":"2"},{"term":"9"},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":"搁浅","dict":[{"traditional":"擱淺","simplified":"搁浅","pinyin":"ge1 qian3","meaning":["to be stranded (of ship)","to run aground","fig. to run into difficulties and stop"]}]},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"已经","dict":[{"traditional":"已經","simplified":"已经","pinyin":"yi3 jing1","meaning":["already"]}]},{"term":"完全","dict":[{"traditional":"完全","simplified":"完全","pinyin":"wan2 quan2","meaning":["complete","whole","totally","entirely"]}]},{"term":"脱","dict":[{"traditional":"脫","simplified":"脱","pinyin":"tuo1","meaning":["to shed","to take off","to escape","to get away from"]}]},{"term":"困","dict":[{"traditional":"困","simplified":"困","pinyin":"kun4","meaning":["to trap","to surround","hard-pressed","stranded","destitute"]}]},{"term":","},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"恢复","dict":[{"traditional":"恢復","simplified":"恢复","pinyin":"hui1 fu4","meaning":["to reinstate","to resume","to restore","to recover","to regain","to rehabilitate"]}]},{"term":"通航","dict":[{"traditional":"通航","simplified":"通航","pinyin":"tong1 hang2","meaning":["connected by air, sea traffic or service"]}]},{"term":"。"},{"term":"当地","dict":[{"traditional":"當地","simplified":"当地","pinyin":"dang1 di4","meaning":["local"]}]},{"term":"时间","dict":[{"traditional":"時間","simplified":"时间","pinyin":"shi2 jian1","meaning":["time","period","CL:段[duan4]"]}]},{"term":"3"},{"term":"月","dict":[{"traditional":"月","simplified":"月","pinyin":"yue4","meaning":["moon","month","monthly","CL:個|个[ge4],輪|轮[lun2]"]}]},{"term":"2"},{"term":"9"},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":","},{"term":"救援队","dict":[{"traditional":"救援隊","simplified":"救援队","pinyin":"jiu4 yuan2 dui4","meaning":["rescue team"]}]},{"term":"成功","dict":[{"traditional":"成功","simplified":"成功","pinyin":"cheng2 gong1","meaning":["Chenggong or Chengkung town in Taitung County 臺東縣|台东县[Tai2 dong1 Xian4], southeast Taiwan"]},{"traditional":"成功","simplified":"成功","pinyin":"cheng2 gong1","meaning":["success","to succeed","CL:次[ci4],個|个[ge4]"]}]},{"term":"让","dict":[{"traditional":"讓","simplified":"让","pinyin":"rang4","meaning":["to yield","to permit","to let sb do sth","to have sb do sth","to make sb (feel sad etc)","by (indicates the agent in a passive clause, like 被[bei4])"]}]},{"term":"搁浅","dict":[{"traditional":"擱淺","simplified":"搁浅","pinyin":"ge1 qian3","meaning":["to be stranded (of ship)","to run aground","fig. to run into difficulties and stop"]}]},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"长达","dict":[{"traditional":"長達","simplified":"长达","pinyin":"chang2 da2","meaning":["to extend as long as","to lengthen out to"]}]},{"term":"一周","dict":[{"traditional":"一周","simplified":"一周","pinyin":"yi1 zhou1","meaning":["one week","all the way around","a whole cycle"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"巨型","dict":[{"traditional":"巨型","simplified":"巨型","pinyin":"ju4 xing2","meaning":["giant","enormous"]}]},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"脱","dict":[{"traditional":"脫","simplified":"脱","pinyin":"tuo1","meaning":["to shed","to take off","to escape","to get away from"]}]},{"term":"困","dict":[{"traditional":"困","simplified":"困","pinyin":"kun4","meaning":["to trap","to surround","hard-pressed","stranded","destitute"]}]},{"term":"。"},{"term":"过去","dict":[{"traditional":"過去","simplified":"过去","pinyin":"guo4 qu4","meaning":["(in the) past","former","previous","to go over","to pass by"]},{"traditional":"過去","simplified":"过去","pinyin":"guo4 qu5","meaning":["(verb suffix)"]}]},{"term":"7"},{"term":"天","dict":[{"traditional":"天","simplified":"天","pinyin":"tian1","meaning":["day","sky","heaven"]}]},{"term":"这","dict":[{"traditional":"這","simplified":"这","pinyin":"zhe4","meaning":["this","these","(commonly pr. [zhei4] before a classifier, esp. in Beijing)"]}]},{"term":"艘","dict":[{"traditional":"艘","simplified":"艘","pinyin":"sou1","meaning":["classifier for ships","Taiwan pr. [sao1]"]}]},{"term":"搁浅","dict":[{"traditional":"擱淺","simplified":"搁浅","pinyin":"ge1 qian3","meaning":["to be stranded (of ship)","to run aground","fig. to run into difficulties and stop"]}]},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"阻止","dict":[{"traditional":"阻止","simplified":"阻止","pinyin":"zu3 zhi3","meaning":["to prevent","to block"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"价值","dict":[{"traditional":"價值","simplified":"价值","pinyin":"jia4 zhi2","meaning":["value","worth","fig. values (ethical, cultural etc)","CL:個|个[ge4]"]}]},{"term":"数","dict":[{"traditional":"數","simplified":"数","pinyin":"shu3","meaning":["to count","to count as","to regard as","to enumerate (sb's shortcomings)"]},{"traditional":"數","simplified":"数","pinyin":"shu4","meaning":["number","figure","several","CL:個|个[ge4]"]},{"traditional":"數","simplified":"数","pinyin":"shuo4","meaning":["frequently","repeatedly"]}]},{"term":"十亿","dict":[{"traditional":"十億","simplified":"十亿","pinyin":"shi2 yi4","meaning":["one billion","giga-"]}]},{"term":"美元","dict":[{"traditional":"美元","simplified":"美元","pinyin":"mei3 yuan2","meaning":["American dollar","US dollar"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"货物","dict":[{"traditional":"貨物","simplified":"货物","pinyin":"huo4 wu4","meaning":["goods","commodity","merchandise","CL:宗[zong1]"]}]},{"term":"通过","dict":[{"traditional":"通過","simplified":"通过","pinyin":"tong1 guo4","meaning":["by means of","through","via","to pass through","to get through","to adopt","to pass (a bill or inspection etc)","to switch over"]}]},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"。"},{"term":"苏","dict":[{"traditional":"囌","simplified":"苏","pinyin":"su1","meaning":["see 囉囌|啰苏[luo1 su1]"]},{"traditional":"甦","simplified":"苏","pinyin":"su1","meaning":["variant of 蘇|苏[su1]","to revive"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["surname Su","abbr. for Soviet Union 蘇維埃|苏维埃 or 蘇聯|苏联","abbr. for Jiangsu province 江蘇|江苏","abbr. for Suzhou city 蘇州|苏州"]},{"traditional":"蘇","simplified":"苏","pinyin":"su1","meaning":["Perilla frutescens (Chinese basil or wild red basil)","place name","to revive","used as phonetic in transliteration"]},{"traditional":"蘓","simplified":"苏","pinyin":"su1","meaning":["old variant of 蘇|苏[su1]"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"士","dict":[{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["surname Shi"]},{"traditional":"士","simplified":"士","pinyin":"shi4","meaning":["member of the senior ministerial class (old)","scholar (old)","bachelor","honorific","soldier","noncommissioned officer","specialist worker"]}]},{"term":"运河","dict":[{"traditional":"運河","simplified":"运河","pinyin":"yun4 he2","meaning":["canal"]}]},{"term":"是","dict":[{"traditional":"是","simplified":"是","pinyin":"shi4","meaning":["is","are","am","yes","to be"]}]},{"term":"世界","dict":[{"traditional":"世界","simplified":"世界","pinyin":"shi4 jie4","meaning":["world","CL:個|个[ge4]"]}]},{"term":"上","dict":[{"traditional":"上","simplified":"上","pinyin":"shang3","meaning":["see 上聲|上声[shang3 sheng1]"]},{"traditional":"上","simplified":"上","pinyin":"shang4","meaning":["on top","upon","above","upper","previous","first (of multiple parts)","to climb","to get onto","to go up","to attend (class or university)"]}]},{"term":"最","dict":[{"traditional":"最","simplified":"最","pinyin":"zui4","meaning":["most","the most","-est (superlative suffix)"]}]},{"term":"繁忙","dict":[{"traditional":"繁忙","simplified":"繁忙","pinyin":"fan2 mang2","meaning":["busy","bustling"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"海运","dict":[{"traditional":"海運","simplified":"海运","pinyin":"hai3 yun4","meaning":["shipping by sea"]}]},{"term":"通道","dict":[{"traditional":"通道","simplified":"通道","pinyin":"tong1 dao4","meaning":["Tongdao Dong autonomous county in Huaihua 懷化|怀化[Huai2 hua4], Hunan"]},{"traditional":"通道","simplified":"通道","pinyin":"tong1 dao4","meaning":["(communications) channel","thoroughfare","passage"]}]},{"term":"之一","dict":[{"traditional":"之一","simplified":"之一","pinyin":"zhi1 yi1","meaning":["one of (sth)","one out of a multitude","one (third, quarter, percent etc)"]}]},{"term":"。"},{"term":"受雇","dict":[{"traditional":"受僱","simplified":"受雇","pinyin":"shou4 gu4","meaning":["to be employed","to be hired","hired","paid"]}]},{"term":"参与","dict":[{"traditional":"參與","simplified":"参与","pinyin":"can1 yu4","meaning":["to participate (in sth)"]}]},{"term":"救援","dict":[{"traditional":"救援","simplified":"救援","pinyin":"jiu4 yuan2","meaning":["to save","to support","to help","to assist"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"荷兰","dict":[{"traditional":"荷蘭","simplified":"荷兰","pinyin":"he2 lan2","meaning":["Holland","the Netherlands"]}]},{"term":"宝","dict":[{"traditional":"寳","simplified":"宝","pinyin":"bao3","meaning":["variant of 寶|宝[bao3]"]},{"traditional":"寶","simplified":"宝","pinyin":"bao3","meaning":["jewel","gem","treasure","precious"]}]},{"term":"斯","dict":[{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["Slovakia","Slovak","abbr. for 斯洛伐克[Si1 luo4 fa2 ke4]"]},{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["(phonetic)","this"]}]},{"term":"卡","dict":[{"traditional":"卡","simplified":"卡","pinyin":"ka3","meaning":["to stop","to block","(computing) (coll.) slow","(loanword) card","CL:張|张[zhang1],片[pian4]","truck (from \"car\")","calorie (abbr. for 卡路里[ka3 lu4 li3])","cassette"]},{"traditional":"卡","simplified":"卡","pinyin":"qia3","meaning":["to block","to be stuck","to be wedged","customs station","a clip","a fastener","a checkpost","Taiwan pr. [ka3]"]}]},{"term":"利","dict":[{"traditional":"利","simplified":"利","pinyin":"li4","meaning":["surname Li"]},{"traditional":"利","simplified":"利","pinyin":"li4","meaning":["sharp","favorable","advantage","benefit","profit","interest","to do good to","to benefit"]}]},{"term":"斯","dict":[{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["Slovakia","Slovak","abbr. for 斯洛伐克[Si1 luo4 fa2 ke4]"]},{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["(phonetic)","this"]}]},{"term":"公司","dict":[{"traditional":"公司","simplified":"公司","pinyin":"gong1 si1","meaning":["(business) company","company","firm","corporation","incorporated","CL:家[jia1]"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"总监","dict":[{"traditional":"總監","simplified":"总监","pinyin":"zong3 jian1","meaning":["head","director (of an organizational unit)","(police) commissioner","inspector-general","rank of local governor in Tang dynasty administration"]}]},{"term":"皮","dict":[{"traditional":"皮","simplified":"皮","pinyin":"pi2","meaning":["surname Pi"]},{"traditional":"皮","simplified":"皮","pinyin":"pi2","meaning":["leather","skin","fur","CL:張|张[zhang1]","pico- (one trillionth)","naughty"]}]},{"term":"特","dict":[{"traditional":"特","simplified":"特","pinyin":"te4","meaning":["special","unique","distinguished","especially","unusual","very","abbr. for 特克斯[te4 ke4 si1], tex"]}]},{"term":"•"},{"term":"伯","dict":[{"traditional":"伯","simplified":"伯","pinyin":"ba4","meaning":["variant of 霸[ba4]"]},{"traditional":"伯","simplified":"伯","pinyin":"bai3","meaning":["one hundred (old)"]},{"traditional":"伯","simplified":"伯","pinyin":"bo2","meaning":["father's elder brother","senior","paternal elder uncle","eldest of brothers","respectful form of address","Count, third of five orders of nobility 五等爵位[wu3 deng3 jue2 wei4]"]}]},{"term":"尔","dict":[{"traditional":"尒","simplified":"尔","pinyin":"er3","meaning":["variant of 爾|尔[er3]"]},{"traditional":"爾","simplified":"尔","pinyin":"er3","meaning":["thus","so","like that","you","thou"]}]},{"term":"道","dict":[{"traditional":"道","simplified":"道","pinyin":"dao4","meaning":["road","path","CL:條|条[tiao2],股[gu3]","principle","truth","morality","reason","skill","method","Dao (of Daoism)","to say","to speak","to talk","classifier for long thin things (rivers, cracks etc), barriers (walls, doors etc), questions (in an exam etc), commands, courses in a meal, steps in a process","(old) circuit (administrative division)"]}]},{"term":"斯","dict":[{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["Slovakia","Slovak","abbr. for 斯洛伐克[Si1 luo4 fa2 ke4]"]},{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["(phonetic)","this"]}]},{"term":"基","dict":[{"traditional":"基","simplified":"基","pinyin":"ji1","meaning":["base","foundation","basic","radical (chemistry)","(slang) gay"]}]},{"term":"表示","dict":[{"traditional":"表示","simplified":"表示","pinyin":"biao3 shi4","meaning":["to express","to show","to say","to state","to indicate","to mean"]}]},{"term":","},{"term":"为了","dict":[{"traditional":"為了","simplified":"为了","pinyin":"wei4 le5","meaning":["in order to","for the purpose of","so as to"]}]},{"term":"让","dict":[{"traditional":"讓","simplified":"让","pinyin":"rang4","meaning":["to yield","to permit","to let sb do sth","to have sb do sth","to make sb (feel sad etc)","by (indicates the agent in a passive clause, like 被[bei4])"]}]},{"term":"货轮","dict":[{"traditional":"貨輪","simplified":"货轮","pinyin":"huo4 lun2","meaning":["freighter","cargo ship","CL:艘[sou1]"]}]},{"term":"脱","dict":[{"traditional":"脫","simplified":"脱","pinyin":"tuo1","meaning":["to shed","to take off","to escape","to get away from"]}]},{"term":"困","dict":[{"traditional":"困","simplified":"困","pinyin":"kun4","meaning":["to trap","to surround","hard-pressed","stranded","destitute"]}]},{"term":","},{"term":"挖掘机","dict":[{"traditional":"挖掘機","simplified":"挖掘机","pinyin":"wa1 jue2 ji1","meaning":["excavator"]}]},{"term":"挖","dict":[{"traditional":"挖","simplified":"挖","pinyin":"wa1","meaning":["to dig","to excavate","to scoop out"]}]},{"term":"走","dict":[{"traditional":"走","simplified":"走","pinyin":"zou3","meaning":["to walk","to go","to run","to move (of vehicle)","to visit","to leave","to go away","to die (euph.)","from","through","away (in compound verbs, such as 撤走[che4 zou3])","to change (shape, form, meaning)"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"3"},{"term":"万","dict":[{"traditional":"万","simplified":"万","pinyin":"mo4","meaning":["see 万俟[Mo4 qi2]"]}]},{"term":"立方米","dict":[{"traditional":"立方米","simplified":"立方米","pinyin":"li4 fang1 mi3","meaning":["cubic meter (unit of volume)"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"泥沙","dict":[{"traditional":"泥沙","simplified":"泥沙","pinyin":"ni2 sha1","meaning":["silt"]}]},{"term":","},{"term":"并","dict":[{"traditional":"並","simplified":"并","pinyin":"bing4","meaning":["and","furthermore","also","together with","(not) at all","simultaneously","to combine","to join","to merge"]},{"traditional":"併","simplified":"并","pinyin":"bing4","meaning":["to combine","to amalgamate"]},{"traditional":"竝","simplified":"并","pinyin":"bing4","meaning":["variant of 並|并[bing4]"]}]},{"term":"动用","dict":[{"traditional":"動用","simplified":"动用","pinyin":"dong4 yong4","meaning":["to utilize","to put sth to use"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"1"},{"term":"3"},{"term":"艘","dict":[{"traditional":"艘","simplified":"艘","pinyin":"sou1","meaning":["classifier for ships","Taiwan pr. [sao1]"]}]},{"term":"拖船","dict":[{"traditional":"拖船","simplified":"拖船","pinyin":"tuo1 chuan2","meaning":["tugboat","boat towed by a tugboat","to tow a boat"]}]},{"term":"。"},{"term":"\n"},{"term":"\n"},{"term":"威廉","dict":[{"traditional":"威廉","simplified":"威廉","pinyin":"wei1 lian2","meaning":["William or Wilhelm (name)"]}]},{"term":"王子","dict":[{"traditional":"王子","simplified":"王子","pinyin":"wang2 zi3","meaning":["prince","son of a king"]}]},{"term":"获","dict":[{"traditional":"獲","simplified":"获","pinyin":"huo4","meaning":["to catch","to obtain","to capture"]},{"traditional":"穫","simplified":"获","pinyin":"huo4","meaning":["to reap","to harvest"]}]},{"term":"评","dict":[{"traditional":"評","simplified":"评","pinyin":"ping2","meaning":["to discuss","to comment","to criticize","to judge","to choose (by public appraisal)"]}]},{"term":"“"},{"term":"世界","dict":[{"traditional":"世界","simplified":"世界","pinyin":"shi4 jie4","meaning":["world","CL:個|个[ge4]"]}]},{"term":"最","dict":[{"traditional":"最","simplified":"最","pinyin":"zui4","meaning":["most","the most","-est (superlative suffix)"]}]},{"term":"性感","dict":[{"traditional":"性感","simplified":"性感","pinyin":"xing4 gan3","meaning":["sex appeal","eroticism","sexuality","sexy"]}]},{"term":"光头","dict":[{"traditional":"光頭","simplified":"光头","pinyin":"guang1 tou2","meaning":["shaven head","bald head","to go bareheaded","hatless"]}]},{"term":"男人","dict":[{"traditional":"男人","simplified":"男人","pinyin":"nan2 ren2","meaning":["a man","a male","men","CL:個|个[ge4]"]}]},{"term":"”"},{"term":"\n"},{"term":"上周","dict":[{"traditional":"上周","simplified":"上周","pinyin":"shang4 zhou1","meaning":["last week"]}]},{"term":"六","dict":[{"traditional":"六","simplified":"六","pinyin":"liu4","meaning":["six","6"]}]},{"term":"("},{"term":"3"},{"term":"月","dict":[{"traditional":"月","simplified":"月","pinyin":"yue4","meaning":["moon","month","monthly","CL:個|个[ge4],輪|轮[lun2]"]}]},{"term":"2"},{"term":"7"},{"term":"日","dict":[{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["abbr. for 日本[Ri4 ben3], Japan"]},{"traditional":"日","simplified":"日","pinyin":"ri4","meaning":["sun","day","date, day of the month"]}]},{"term":")"},{"term":","},{"term":"英国","dict":[{"traditional":"英國","simplified":"英国","pinyin":"ying1 guo2","meaning":["United Kingdom 聯合王國|联合王国[Lian2 he2 wang2 guo2]","United Kingdom of Great Britain and Northern Ireland","abbr. for England 英格蘭|英格兰[Ying1 ge2 lan2]"]}]},{"term":"《"},{"term":"太阳报","dict":[{"traditional":"太陽報","simplified":"太阳报","pinyin":"tai4 yang2 bao4","meaning":["The Sun (the name of various newspapers, notably in the UK and in Hong Kong)"]}]},{"term":"》"},{"term":"发布","dict":[{"traditional":"發佈","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute","also written 發布|发布[fa1 bu4]"]},{"traditional":"發布","simplified":"发布","pinyin":"fa1 bu4","meaning":["to release","to issue","to announce","to distribute"]}]},{"term":"报道","dict":[{"traditional":"報道","simplified":"报道","pinyin":"bao4 dao4","meaning":["to report (news)","report","CL:篇[pian1],份[fen4]"]}]},{"term":"称","dict":[{"traditional":"稱","simplified":"称","pinyin":"chen4","meaning":["to fit","balanced","suitable"]},{"traditional":"稱","simplified":"称","pinyin":"cheng1","meaning":["to weigh","to state","to name","name","appellation","to praise"]},{"traditional":"稱","simplified":"称","pinyin":"cheng4","meaning":["variant of 秤[cheng4]","steelyard"]}]},{"term":"威廉","dict":[{"traditional":"威廉","simplified":"威廉","pinyin":"wei1 lian2","meaning":["William or Wilhelm (name)"]}]},{"term":"王子","dict":[{"traditional":"王子","simplified":"王子","pinyin":"wang2 zi3","meaning":["prince","son of a king"]}]},{"term":"是","dict":[{"traditional":"是","simplified":"是","pinyin":"shi4","meaning":["is","are","am","yes","to be"]}]},{"term":"“"},{"term":"世界","dict":[{"traditional":"世界","simplified":"世界","pinyin":"shi4 jie4","meaning":["world","CL:個|个[ge4]"]}]},{"term":"最","dict":[{"traditional":"最","simplified":"最","pinyin":"zui4","meaning":["most","the most","-est (superlative suffix)"]}]},{"term":"性感","dict":[{"traditional":"性感","simplified":"性感","pinyin":"xing4 gan3","meaning":["sex appeal","eroticism","sexuality","sexy"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"秃顶","dict":[{"traditional":"禿頂","simplified":"秃顶","pinyin":"tu1 ding3","meaning":["bald head"]}]},{"term":"男人","dict":[{"traditional":"男人","simplified":"男人","pinyin":"nan2 ren2","meaning":["a man","a male","men","CL:個|个[ge4]"]}]},{"term":"”"},{"term":","},{"term":"该","dict":[{"traditional":"該","simplified":"该","pinyin":"gai1","meaning":["should","ought to","probably","must be","to deserve","to owe","to be sb's turn to do sth","that","the above-mentioned"]}]},{"term":"报道","dict":[{"traditional":"報道","simplified":"报道","pinyin":"bao4 dao4","meaning":["to report (news)","report","CL:篇[pian1],份[fen4]"]}]},{"term":"基于","dict":[{"traditional":"基於","simplified":"基于","pinyin":"ji1 yu2","meaning":["because of","on the basis of","in view of","on account of"]}]},{"term":"提供","dict":[{"traditional":"提供","simplified":"提供","pinyin":"ti2 gong1","meaning":["to offer","to supply","to provide","to furnish"]}]},{"term":"植","dict":[{"traditional":"植","simplified":"植","pinyin":"zhi2","meaning":["to plant"]}]},{"term":"发","dict":[{"traditional":"發","simplified":"发","pinyin":"fa1","meaning":["to send out","to show (one's feeling)","to issue","to develop","to make a bundle of money","classifier for gunshots (rounds)"]},{"traditional":"髮","simplified":"发","pinyin":"fa4","meaning":["hair","Taiwan pr. [fa3]"]}]},{"term":"服务","dict":[{"traditional":"服務","simplified":"服务","pinyin":"fu2 wu4","meaning":["to serve","service","CL:項|项[xiang4]"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"整容","dict":[{"traditional":"整容","simplified":"整容","pinyin":"zheng3 rong2","meaning":["plastic surgery"]}]},{"term":"公司","dict":[{"traditional":"公司","simplified":"公司","pinyin":"gong1 si1","meaning":["(business) company","company","firm","corporation","incorporated","CL:家[jia1]"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"一","dict":[{"traditional":"一","simplified":"一","pinyin":"yi1","meaning":["one","1","single","a (article)","as soon as","entire","whole","all","throughout","\"one\" radical in Chinese characters (Kangxi radical 1)","also pr. [yao1] for greater clarity when spelling out numbers digit by digit"]}]},{"term":"项","dict":[{"traditional":"項","simplified":"项","pinyin":"xiang4","meaning":["surname Xiang"]},{"traditional":"項","simplified":"项","pinyin":"xiang4","meaning":["back of neck","item","thing","term (in a mathematical formula)","sum (of money)","classifier for principles, items, clauses, tasks, research projects etc"]}]},{"term":"调查","dict":[{"traditional":"調查","simplified":"调查","pinyin":"diao4 cha2","meaning":["investigation","inquiry","to investigate","to survey","survey","(opinion) poll","CL:項|项[xiang4],個|个[ge4]"]}]},{"term":"。"},{"term":"据","dict":[{"traditional":"据","simplified":"据","pinyin":"ju1","meaning":["see 拮据[jie2 ju1]"]},{"traditional":"据","simplified":"据","pinyin":"ju4","meaning":["variant of 據|据[ju4]"]}]},{"term":"《"},{"term":"太阳报","dict":[{"traditional":"太陽報","simplified":"太阳报","pinyin":"tai4 yang2 bao4","meaning":["The Sun (the name of various newspapers, notably in the UK and in Hong Kong)"]}]},{"term":"》"},{"term":"报道","dict":[{"traditional":"報道","simplified":"报道","pinyin":"bao4 dao4","meaning":["to report (news)","report","CL:篇[pian1],份[fen4]"]}]},{"term":","},{"term":"该","dict":[{"traditional":"該","simplified":"该","pinyin":"gai1","meaning":["should","ought to","probably","must be","to deserve","to owe","to be sb's turn to do sth","that","the above-mentioned"]}]},{"term":"调查","dict":[{"traditional":"調查","simplified":"调查","pinyin":"diao4 cha2","meaning":["investigation","inquiry","to investigate","to survey","survey","(opinion) poll","CL:項|项[xiang4],個|个[ge4]"]}]},{"term":"是","dict":[{"traditional":"是","simplified":"是","pinyin":"shi4","meaning":["is","are","am","yes","to be"]}]},{"term":"通过","dict":[{"traditional":"通過","simplified":"通过","pinyin":"tong1 guo4","meaning":["by means of","through","via","to pass through","to get through","to adopt","to pass (a bill or inspection etc)","to switch over"]}]},{"term":"分析","dict":[{"traditional":"分析","simplified":"分析","pinyin":"fen1 xi1","meaning":["to analyze","analysis","CL:個|个[ge4]"]}]},{"term":"“"},{"term":"博客","dict":[{"traditional":"博客","simplified":"博客","pinyin":"bo2 ke4","meaning":["blog (loanword)","weblog","blogger"]}]},{"term":"、"},{"term":"报道","dict":[{"traditional":"報道","simplified":"报道","pinyin":"bao4 dao4","meaning":["to report (news)","report","CL:篇[pian1],份[fen4]"]}]},{"term":"和","dict":[{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["surname He","Japanese (food, clothes etc)"]},{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["and","together with","with","sum","union","peace","harmony","Taiwan pr. [han4] when it means \"and\" or \"with\""]},{"traditional":"和","simplified":"和","pinyin":"he4","meaning":["to compose a poem in reply (to sb's poem) using the same rhyme sequence","to join in the singing","to chime in with others"]},{"traditional":"和","simplified":"和","pinyin":"hu2","meaning":["to complete a set in mahjong or playing cards"]},{"traditional":"和","simplified":"和","pinyin":"huo2","meaning":["to combine a powdery substance (flour, plaster etc) with water","Taiwan pr. [huo4]"]},{"traditional":"和","simplified":"和","pinyin":"huo4","meaning":["to mix (ingredients) together","to blend","classifier for rinses of clothes","classifier for boilings of medicinal herbs"]}]},{"term":"谷歌","dict":[{"traditional":"谷歌","simplified":"谷歌","pinyin":"gu3 ge1","meaning":["Google, Internet company and search engine"]}]},{"term":"搜索","dict":[{"traditional":"搜索","simplified":"搜索","pinyin":"sou1 suo3","meaning":["to search (a place)","to search (a database)","to search for (sth)"]}]},{"term":"页面","dict":[{"traditional":"頁面","simplified":"页面","pinyin":"ye4 mian4","meaning":["page","web page"]}]},{"term":"”"},{"term":"中","dict":[{"traditional":"中","simplified":"中","pinyin":"zhong1","meaning":["China","Chinese","surname Zhong"]},{"traditional":"中","simplified":"中","pinyin":"zhong1","meaning":["within","among","in","middle","center","while (doing sth)","during","(dialect) OK","all right"]},{"traditional":"中","simplified":"中","pinyin":"zhong4","meaning":["to hit (the mark)","to be hit by","to suffer","to win (a prize, a lottery)"]}]},{"term":"“"},{"term":"性感","dict":[{"traditional":"性感","simplified":"性感","pinyin":"xing4 gan3","meaning":["sex appeal","eroticism","sexuality","sexy"]}]},{"term":"”"},{"term":"一","dict":[{"traditional":"一","simplified":"一","pinyin":"yi1","meaning":["one","1","single","a (article)","as soon as","entire","whole","all","throughout","\"one\" radical in Chinese characters (Kangxi radical 1)","also pr. [yao1] for greater clarity when spelling out numbers digit by digit"]}]},{"term":"词","dict":[{"traditional":"䛐","simplified":"词","pinyin":"ci2","meaning":["old variant of 詞|词[ci2]"]},{"traditional":"詞","simplified":"词","pinyin":"ci2","meaning":["word","statement","speech","lyrics","CL:組|组[zu3],個|个[ge4]","a form of lyric poetry, flourishing in the Song dynasty 宋朝|宋朝[Song4 chao2]","CL:首[shou3]"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"出现","dict":[{"traditional":"出現","simplified":"出现","pinyin":"chu1 xian4","meaning":["to appear","to arise","to emerge","to show up"]}]},{"term":"频率","dict":[{"traditional":"頻率","simplified":"频率","pinyin":"pin2 lu:4","meaning":["frequency"]}]},{"term":"来得","dict":[{"traditional":"來得","simplified":"来得","pinyin":"lai2 de5","meaning":["to emerge (from a comparison)","to come out as","to be competent or equal to"]}]},{"term":"出","dict":[{"traditional":"出","simplified":"出","pinyin":"chu1","meaning":["to go out","to come out","to occur","to produce","to go beyond","to rise","to put forth","to happen","(used after a verb to indicate an outward direction or a positive result)","classifier for dramas, plays, operas etc"]}]},{"term":"结果","dict":[{"traditional":"結果","simplified":"结果","pinyin":"jie1 guo3","meaning":["to bear fruit","CL:個|个[ge4]"]},{"traditional":"結果","simplified":"结果","pinyin":"jie2 guo3","meaning":["outcome","result","conclusion","in the end","as a result","to kill","to dispatch"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"。"},{"term":"《"},{"term":"太阳报","dict":[{"traditional":"太陽報","simplified":"太阳报","pinyin":"tai4 yang2 bao4","meaning":["The Sun (the name of various newspapers, notably in the UK and in Hong Kong)"]}]},{"term":"》"},{"term":"写","dict":[{"traditional":"寫","simplified":"写","pinyin":"xie3","meaning":["to write"]}]},{"term":"道","dict":[{"traditional":"道","simplified":"道","pinyin":"dao4","meaning":["road","path","CL:條|条[tiao2],股[gu3]","principle","truth","morality","reason","skill","method","Dao (of Daoism)","to say","to speak","to talk","classifier for long thin things (rivers, cracks etc), barriers (walls, doors etc), questions (in an exam etc), commands, courses in a meal, steps in a process","(old) circuit (administrative division)"]}]},{"term":","},{"term":"调查","dict":[{"traditional":"調查","simplified":"调查","pinyin":"diao4 cha2","meaning":["investigation","inquiry","to investigate","to survey","survey","(opinion) poll","CL:項|项[xiang4],個|个[ge4]"]}]},{"term":"发现","dict":[{"traditional":"發現","simplified":"发现","pinyin":"fa1 xian4","meaning":["to find","to discover"]}]},{"term":","},{"term":"威廉","dict":[{"traditional":"威廉","simplified":"威廉","pinyin":"wei1 lian2","meaning":["William or Wilhelm (name)"]}]},{"term":"王子","dict":[{"traditional":"王子","simplified":"王子","pinyin":"wang2 zi3","meaning":["prince","son of a king"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"名字","dict":[{"traditional":"名字","simplified":"名字","pinyin":"ming2 zi5","meaning":["name (of a person or thing)","CL:個|个[ge4]"]}]},{"term":"被","dict":[{"traditional":"被","simplified":"被","pinyin":"bei4","meaning":["quilt","by","(indicates passive-voice clauses)","(literary) to cover","to meet with","(coll.) (since c. 2009) used before a verb that does not accurately represent what actually happened, to describe with black humor how sb or sth was dealt with by the authorities (as in 被自殺|被自杀[bei4 zi4 sha1])"]}]},{"term":"提及","dict":[{"traditional":"提及","simplified":"提及","pinyin":"ti2 ji2","meaning":["to mention","to raise (a subject)","to bring to sb's attention"]}]},{"term":"1"},{"term":"7"},{"term":"6"},{"term":"0"},{"term":"万","dict":[{"traditional":"万","simplified":"万","pinyin":"mo4","meaning":["see 万俟[Mo4 qi2]"]}]},{"term":"次","dict":[{"traditional":"次","simplified":"次","pinyin":"ci4","meaning":["next in sequence","second","the second (day, time etc)","secondary","vice-","sub-","infra-","inferior quality","substandard","order","sequence","hypo- (chemistry)","classifier for enumerated events: time"]}]},{"term":"。"},{"term":"这","dict":[{"traditional":"這","simplified":"这","pinyin":"zhe4","meaning":["this","these","(commonly pr. [zhei4] before a classifier, esp. in Beijing)"]}]},{"term":"篇","dict":[{"traditional":"篇","simplified":"篇","pinyin":"pian1","meaning":["sheet","piece of writing","bound set of bamboo slips used for record keeping (old)","classifier for written items: chapter, article"]}]},{"term":"文章","dict":[{"traditional":"文章","simplified":"文章","pinyin":"wen2 zhang1","meaning":["article","essay","literary works","writings","hidden meaning","CL:篇[pian1],段[duan4],頁|页[ye4]"]}]},{"term":"还","dict":[{"traditional":"還","simplified":"还","pinyin":"huan2","meaning":["surname Huan"]},{"traditional":"還","simplified":"还","pinyin":"hai2","meaning":["still","still in progress","still more","yet","even more","in addition","fairly","passably (good)","as early as","even","also","else"]},{"traditional":"還","simplified":"还","pinyin":"huan2","meaning":["to pay back","to return"]}]},{"term":"提到","dict":[{"traditional":"提到","simplified":"提到","pinyin":"ti2 dao4","meaning":["to mention","to raise (a subject)","to refer to"]}]},{"term":"了","dict":[{"traditional":"了","simplified":"了","pinyin":"le5","meaning":["(completed action marker)","(modal particle indicating change of state, situation now)","(modal particle intensifying preceding clause)"]},{"traditional":"了","simplified":"了","pinyin":"liao3","meaning":["to finish","to achieve","variant of 瞭|了[liao3]","to understand clearly"]}]},{"term":"调查","dict":[{"traditional":"調查","simplified":"调查","pinyin":"diao4 cha2","meaning":["investigation","inquiry","to investigate","to survey","survey","(opinion) poll","CL:項|项[xiang4],個|个[ge4]"]}]},{"term":"结果","dict":[{"traditional":"結果","simplified":"结果","pinyin":"jie1 guo3","meaning":["to bear fruit","CL:個|个[ge4]"]},{"traditional":"結果","simplified":"结果","pinyin":"jie2 guo3","meaning":["outcome","result","conclusion","in the end","as a result","to kill","to dispatch"]}]},{"term":"中","dict":[{"traditional":"中","simplified":"中","pinyin":"zhong1","meaning":["China","Chinese","surname Zhong"]},{"traditional":"中","simplified":"中","pinyin":"zhong1","meaning":["within","among","in","middle","center","while (doing sth)","during","(dialect) OK","all right"]},{"traditional":"中","simplified":"中","pinyin":"zhong4","meaning":["to hit (the mark)","to be hit by","to suffer","to win (a prize, a lottery)"]}]},{"term":"入选","dict":[{"traditional":"入選","simplified":"入选","pinyin":"ru4 xuan3","meaning":["to be chosen","to be elected as"]}]},{"term":"前","dict":[{"traditional":"前","simplified":"前","pinyin":"qian2","meaning":["front","forward","ahead","first","top (followed by a number)","future","ago","before","BC (e.g. 前293年)","former","formerly"]}]},{"term":"十位","dict":[{"traditional":"十位","simplified":"十位","pinyin":"shi2 wei4","meaning":["the tens place (or column) in the decimal system"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"其他","dict":[{"traditional":"其他","simplified":"其他","pinyin":"qi2 ta1","meaning":["other","(sth or sb) else","the rest"]}]},{"term":"名人","dict":[{"traditional":"名人","simplified":"名人","pinyin":"ming2 ren2","meaning":["personage","celebrity"]}]},{"term":"。"},{"term":"迈","dict":[{"traditional":"邁","simplified":"迈","pinyin":"mai4","meaning":["to take a step","to stride"]}]},{"term":"克","dict":[{"traditional":"克","simplified":"克","pinyin":"ke4","meaning":["abbr. for 克羅地亞|克罗地亚[Ke4 luo2 di4 ya4], Croatia","(Tw) abbr. for 克羅埃西亞|克罗埃西亚[Ke4 luo2 ai1 xi1 ya4], Croatia"]},{"traditional":"克","simplified":"克","pinyin":"ke4","meaning":["to be able to","to subdue","to restrain","to overcome","gram","Tibetan unit of land area, about 6 ares"]}]},{"term":"•"},{"term":"泰","dict":[{"traditional":"泰","simplified":"泰","pinyin":"tai4","meaning":["Mt Tai 泰山[Tai4 Shan1] in Shandong","abbr. for Thailand"]},{"traditional":"泰","simplified":"泰","pinyin":"tai4","meaning":["safe","peaceful","most","grand"]}]},{"term":"森","dict":[{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["Mori (Japanese surname)"]},{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["forest"]}]},{"term":"仅","dict":[{"traditional":"僅","simplified":"仅","pinyin":"jin3","meaning":["barely","only","merely"]}]},{"term":"次于","dict":[{"traditional":"次於","simplified":"次于","pinyin":"ci4 yu2","meaning":["second after","second only to"]}]},{"term":"威廉","dict":[{"traditional":"威廉","simplified":"威廉","pinyin":"wei1 lian2","meaning":["William or Wilhelm (name)"]}]},{"term":"王子","dict":[{"traditional":"王子","simplified":"王子","pinyin":"wang2 zi3","meaning":["prince","son of a king"]}]},{"term":","},{"term":"排","dict":[{"traditional":"排","simplified":"排","pinyin":"pai2","meaning":["a row","a line","to set in order","to arrange","to line up","to eliminate","to drain","to push open","platoon","raft","classifier for lines, rows etc"]}]},{"term":"在","dict":[{"traditional":"在","simplified":"在","pinyin":"zai4","meaning":["(located) at","(to be) in","to exist","in the middle of doing sth","(indicating an action in progress)"]}]},{"term":"第二位","dict":[{"traditional":"第二位","simplified":"第二位","pinyin":"di4 er4 wei4","meaning":["second place"]}]},{"term":","},{"term":"紧","dict":[{"traditional":"緊","simplified":"紧","pinyin":"jin3","meaning":["tight","strict","close at hand","near","urgent","tense","hard up","short of money","to tighten"]}]},{"term":"随","dict":[{"traditional":"隨","simplified":"随","pinyin":"sui2","meaning":["surname Sui"]},{"traditional":"隨","simplified":"随","pinyin":"sui2","meaning":["to follow","to comply with","varying according to...","to allow","subsequently"]}]},{"term":"其后","dict":[{"traditional":"其後","simplified":"其后","pinyin":"qi2 hou4","meaning":["next","later","after that"]}]},{"term":"的","dict":[{"traditional":"的","simplified":"的","pinyin":"de5","meaning":["of","~'s (possessive particle)","(used after an attribute)","(used to form a nominal expression)","(used at the end of a declarative sentence for emphasis)","also pr. [di4] or [di5] in poetry and songs"]},{"traditional":"的","simplified":"的","pinyin":"di1","meaning":["see 的士[di1 shi4]"]},{"traditional":"的","simplified":"的","pinyin":"di2","meaning":["really and truly"]},{"traditional":"的","simplified":"的","pinyin":"di4","meaning":["aim","clear"]}]},{"term":"是","dict":[{"traditional":"是","simplified":"是","pinyin":"shi4","meaning":["is","are","am","yes","to be"]}]},{"term":"《"},{"term":"速度","dict":[{"traditional":"速度","simplified":"速度","pinyin":"su4 du4","meaning":["speed","rate","velocity","(music) tempo","CL:個|个[ge4]"]}]},{"term":"与","dict":[{"traditional":"與","simplified":"与","pinyin":"yu2","meaning":["variant of 歟|欤[yu2]"]},{"traditional":"與","simplified":"与","pinyin":"yu3","meaning":["and","to give","together with"]},{"traditional":"與","simplified":"与","pinyin":"yu4","meaning":["to take part in"]}]},{"term":"激情","dict":[{"traditional":"激情","simplified":"激情","pinyin":"ji1 qing2","meaning":["passion","fervor","enthusiasm","strong emotion"]}]},{"term":"》"},{"term":"主演","dict":[{"traditional":"主演","simplified":"主演","pinyin":"zhu3 yan3","meaning":["to act the leading role (in a movie or a play)","to star","lead actor"]}]},{"term":"杰","dict":[{"traditional":"杰","simplified":"杰","pinyin":"jie2","meaning":["variant of 傑|杰[jie2]"]}]},{"term":"森","dict":[{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["Mori (Japanese surname)"]},{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["forest"]}]},{"term":"•"},{"term":"斯","dict":[{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["Slovakia","Slovak","abbr. for 斯洛伐克[Si1 luo4 fa2 ke4]"]},{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["(phonetic)","this"]}]},{"term":"坦","dict":[{"traditional":"坦","simplified":"坦","pinyin":"tan3","meaning":["flat","open-hearted","level","smooth"]}]},{"term":"森","dict":[{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["Mori (Japanese surname)"]},{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["forest"]}]},{"term":"、"},{"term":"说唱","dict":[{"traditional":"說唱","simplified":"说唱","pinyin":"shuo1 chang4","meaning":["speaking and singing, as in various forms of storytelling such as 彈詞|弹词[tan2 ci2] and 相聲|相声[xiang4 sheng5]","(music) rapping"]}]},{"term":"歌手","dict":[{"traditional":"歌手","simplified":"歌手","pinyin":"ge1 shou3","meaning":["singer"]}]},{"term":"皮","dict":[{"traditional":"皮","simplified":"皮","pinyin":"pi2","meaning":["surname Pi"]},{"traditional":"皮","simplified":"皮","pinyin":"pi2","meaning":["leather","skin","fur","CL:張|张[zhang1]","pico- (one trillionth)","naughty"]}]},{"term":"普","dict":[{"traditional":"普","simplified":"普","pinyin":"pu3","meaning":["general","popular","everywhere","universal"]}]},{"term":"保罗","dict":[{"traditional":"保羅","simplified":"保罗","pinyin":"bao3 luo2","meaning":["Paul"]}]},{"term":"、"},{"term":"迈","dict":[{"traditional":"邁","simplified":"迈","pinyin":"mai4","meaning":["to take a step","to stride"]}]},{"term":"克","dict":[{"traditional":"克","simplified":"克","pinyin":"ke4","meaning":["abbr. for 克羅地亞|克罗地亚[Ke4 luo2 di4 ya4], Croatia","(Tw) abbr. for 克羅埃西亞|克罗埃西亚[Ke4 luo2 ai1 xi1 ya4], Croatia"]},{"traditional":"克","simplified":"克","pinyin":"ke4","meaning":["to be able to","to subdue","to restrain","to overcome","gram","Tibetan unit of land area, about 6 ares"]}]},{"term":"尔","dict":[{"traditional":"尒","simplified":"尔","pinyin":"er3","meaning":["variant of 爾|尔[er3]"]},{"traditional":"爾","simplified":"尔","pinyin":"er3","meaning":["thus","so","like that","you","thou"]}]},{"term":"•"},{"term":"乔丹","dict":[{"traditional":"喬丹","simplified":"乔丹","pinyin":"qiao2 dan1","meaning":["Jordan (name)"]}]},{"term":"、"},{"term":"拳击手","dict":[{"traditional":"拳擊手","simplified":"拳击手","pinyin":"quan2 ji1 shou3","meaning":["boxer"]}]},{"term":"弗","dict":[{"traditional":"弗","simplified":"弗","pinyin":"fu2","meaning":["not"]}]},{"term":"洛","dict":[{"traditional":"洛","simplified":"洛","pinyin":"luo4","meaning":["surname Luo","old name of several rivers (in Henan, Shaanxi, Sichuan and Anhui)"]},{"traditional":"洛","simplified":"洛","pinyin":"luo4","meaning":["used in transliteration"]}]},{"term":"伊","dict":[{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["surname Yi","abbr. for 伊拉克[Yi1 la1 ke4], Iraq","abbr. for 伊朗[Yi1 lang3], Iran"]},{"traditional":"伊","simplified":"伊","pinyin":"yi1","meaning":["(old) third person singular pronoun (\"he\" or \"she\")","second person singular pronoun (\"you\")","(May 4th period) third person singular feminine pronoun (\"she\")","(Classical Chinese) introductory particle with no specific meaning","that (preceding a noun)"]}]},{"term":"德","dict":[{"traditional":"德","simplified":"德","pinyin":"de2","meaning":["Germany","German","abbr. for 德國|德国[De2 guo2]"]},{"traditional":"德","simplified":"德","pinyin":"de2","meaning":["virtue","goodness","morality","ethics","kindness","favor","character","kind"]}]},{"term":"•"},{"term":"梅","dict":[{"traditional":"梅","simplified":"梅","pinyin":"mei2","meaning":["surname Mei"]},{"traditional":"梅","simplified":"梅","pinyin":"mei2","meaning":["plum","plum flower","Japanese apricot (Prunus mume)"]}]},{"term":"威","dict":[{"traditional":"威","simplified":"威","pinyin":"wei1","meaning":["power","might","prestige"]}]},{"term":"瑟","dict":[{"traditional":"瑟","simplified":"瑟","pinyin":"se4","meaning":["a type of standing harp, smaller than konghou 箜篌, with 5-25 strings"]}]},{"term":"、"},{"term":"约翰","dict":[{"traditional":"約翰","simplified":"约翰","pinyin":"yue1 han4","meaning":["John (name)","Johan (name)","Johann (name)"]}]},{"term":"•"},{"term":"特","dict":[{"traditional":"特","simplified":"特","pinyin":"te4","meaning":["special","unique","distinguished","especially","unusual","very","abbr. for 特克斯[te4 ke4 si1], tex"]}]},{"term":"拉","dict":[{"traditional":"拉","simplified":"拉","pinyin":"la1","meaning":["to pull","to play (a bowed instrument)","to drag","to draw","to chat","(coll.) to empty one's bowels"]}]},{"term":"沃","dict":[{"traditional":"沃","simplified":"沃","pinyin":"wo4","meaning":["fertile","rich","to irrigate","to wash (of river)"]}]},{"term":"尔","dict":[{"traditional":"尒","simplified":"尔","pinyin":"er3","meaning":["variant of 爾|尔[er3]"]},{"traditional":"爾","simplified":"尔","pinyin":"er3","meaning":["thus","so","like that","you","thou"]}]},{"term":"塔","dict":[{"traditional":"塔","simplified":"塔","pinyin":"ta3","meaning":["pagoda","tower","minaret","stupa (abbr. loanword from Sanskrit tapo)","CL:座[zuo4]"]}]},{"term":"、"},{"term":"布","dict":[{"traditional":"布","simplified":"布","pinyin":"bu4","meaning":["cloth","to declare","to announce","to spread","to make known"]}]},{"term":"鲁","dict":[{"traditional":"魯","simplified":"鲁","pinyin":"lu3","meaning":["surname Lu","Lu, ancient state of China 魯國|鲁国[Lu3 guo2]","Lu, short name for Shandong 山東|山东[Shan1 dong1]"]},{"traditional":"魯","simplified":"鲁","pinyin":"lu3","meaning":["(bound form) crass","stupid","rude","(used to represent the sounds of \"ru\", \"lu\" etc in loanwords)"]}]},{"term":"斯","dict":[{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["Slovakia","Slovak","abbr. for 斯洛伐克[Si1 luo4 fa2 ke4]"]},{"traditional":"斯","simplified":"斯","pinyin":"si1","meaning":["(phonetic)","this"]}]},{"term":"•"},{"term":"威利斯","dict":[{"traditional":"威利斯","simplified":"威利斯","pinyin":"wei1 li4 si1","meaning":["Willis (name)"]}]},{"term":"、"},{"term":"“"},{"term":"巨石","dict":[{"traditional":"巨石","simplified":"巨石","pinyin":"ju4 shi2","meaning":["huge rock","boulder","monolith"]}]},{"term":"”"},{"term":"强","dict":[{"traditional":"強","simplified":"强","pinyin":"qiang2","meaning":["surname Qiang"]},{"traditional":"強","simplified":"强","pinyin":"jiang4","meaning":["stubborn","unyielding"]},{"traditional":"強","simplified":"强","pinyin":"qiang2","meaning":["strong","powerful","better","slightly more than","vigorous","violent","best in their category, e.g. see 百強|百强[bai3 qiang2]"]},{"traditional":"強","simplified":"强","pinyin":"qiang3","meaning":["to force","to compel","to strive","to make an effort"]},{"traditional":"彊","simplified":"强","pinyin":"jiang4","meaning":["variant of 強|强[jiang4]"]},{"traditional":"彊","simplified":"强","pinyin":"qiang2","meaning":["variant of 強|强[qiang2]"]},{"traditional":"彊","simplified":"强","pinyin":"qiang3","meaning":["variant of 強|强[qiang3]"]}]},{"term":"森","dict":[{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["Mori (Japanese surname)"]},{"traditional":"森","simplified":"森","pinyin":"sen1","meaning":["forest"]}]},{"term":"和","dict":[{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["surname He","Japanese (food, clothes etc)"]},{"traditional":"和","simplified":"和","pinyin":"he2","meaning":["and","together with","with","sum","union","peace","harmony","Taiwan pr. [han4] when it means \"and\" or \"with\""]},{"traditional":"和","simplified":"和","pinyin":"he4","meaning":["to compose a poem in reply (to sb's poem) using the same rhyme sequence","to join in the singing","to chime in with others"]},{"traditional":"和","simplified":"和","pinyin":"hu2","meaning":["to complete a set in mahjong or playing cards"]},{"traditional":"和","simplified":"和","pinyin":"huo2","meaning":["to combine a powdery substance (flour, plaster etc) with water","Taiwan pr. [huo4]"]},{"traditional":"和","simplified":"和","pinyin":"huo4","meaning":["to mix (ingredients) together","to blend","classifier for rinses of clothes","classifier for boilings of medicinal herbs"]}]},{"term":"范","dict":[{"traditional":"范","simplified":"范","pinyin":"fan4","meaning":["surname Fan"]}]},{"term":"•"},{"term":"迪","dict":[{"traditional":"迪","simplified":"迪","pinyin":"di2","meaning":["to enlighten"]}]},{"term":"塞","dict":[{"traditional":"塞","simplified":"塞","pinyin":"sai1","meaning":["Serbia","Serbian","abbr. for 塞爾維亞|塞尔维亚[Sai1 er3 wei2 ya4]"]},{"traditional":"塞","simplified":"塞","pinyin":"sai1","meaning":["to stop up","to squeeze in","to stuff","cork","stopper"]},{"traditional":"塞","simplified":"塞","pinyin":"sai4","meaning":["strategic pass","tactical border position"]},{"traditional":"塞","simplified":"塞","pinyin":"se4","meaning":["to stop up","to stuff","to cope with"]}]},{"term":"尔","dict":[{"traditional":"尒","simplified":"尔","pinyin":"er3","meaning":["variant of 爾|尔[er3]"]},{"traditional":"爾","simplified":"尔","pinyin":"er3","meaning":["thus","so","like that","you","thou"]}]},{"term":"。"}] \ No newline at end of file diff --git a/server/routers/car-wash/auth/index.js b/server/routers/car-wash/auth/index.js new file mode 100644 index 0000000..efc6047 --- /dev/null +++ b/server/routers/car-wash/auth/index.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.use(require('./login')) +router.use(require('./registration')) +router.use(require('./logrec')) +router.use(require('./passrec')) + +module.exports = router diff --git a/server/routers/car-wash/auth/login/error.json b/server/routers/car-wash/auth/login/error.json new file mode 100644 index 0000000..3b51be5 --- /dev/null +++ b/server/routers/car-wash/auth/login/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/login/index.js b/server/routers/car-wash/auth/login/index.js new file mode 100644 index 0000000..07ce17b --- /dev/null +++ b/server/routers/car-wash/auth/login/index.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.post('/postAuthorization', (req, res) => { + if (req?.session?.[req.body.login]?.login) { + const { login } = req.session[req.body.login] + const { pass } = req.session[req.body.login] + if (login === req.body.login && pass === req.body.pass) { + return res.send(req.session[req.body.login]) + } + } + + res.send(require('./error.json')) +}) + +module.exports = router diff --git a/server/routers/car-wash/auth/login/success.json b/server/routers/car-wash/auth/login/success.json new file mode 100644 index 0000000..0460d16 --- /dev/null +++ b/server/routers/car-wash/auth/login/success.json @@ -0,0 +1,3 @@ +{ + "status": "success" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/logrec/error.json b/server/routers/car-wash/auth/logrec/error.json new file mode 100644 index 0000000..3b51be5 --- /dev/null +++ b/server/routers/car-wash/auth/logrec/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/logrec/index.js b/server/routers/car-wash/auth/logrec/index.js new file mode 100644 index 0000000..9466a7f --- /dev/null +++ b/server/routers/car-wash/auth/logrec/index.js @@ -0,0 +1,40 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.post('/postLoginRec', (req, res) => { + if (Object.getOwnPropertyNames(req.session).some((item) => item === req.body.phone)) { + const loginRec = req.session[req.body.phone].login + if (req.body.phoneRecForm === 0) { + if (req.session[loginRec].phone === req.body.phone) { + const code = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000 + const ret1 = { + status: 'success', + phonecode: code, + } + req.session[loginRec].phonecode = ret1.phonecode + return res.send(ret1) + } + res.send(require('./error.json')) + } + + if (req.body.phoneRecForm === 1) { + if (req.session[loginRec].phonecode === req.body.phonecode) { + const ret = { + login: req.session[loginRec].login, + phone: req.session[loginRec].phone, + status: 'success', + } + req.session[loginRec].phonecode = undefined + return res.send(ret) + } + const ret = { + phonecode: req.session[loginRec].phonecode, + status: 'error', + } + return res.send(ret) + } + } + res.send(require('./error.json')) +}) + +module.exports = router diff --git a/server/routers/car-wash/auth/logrec/success.json b/server/routers/car-wash/auth/logrec/success.json new file mode 100644 index 0000000..0460d16 --- /dev/null +++ b/server/routers/car-wash/auth/logrec/success.json @@ -0,0 +1,3 @@ +{ + "status": "success" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/passrec/error.json b/server/routers/car-wash/auth/passrec/error.json new file mode 100644 index 0000000..3b51be5 --- /dev/null +++ b/server/routers/car-wash/auth/passrec/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/passrec/index.js b/server/routers/car-wash/auth/passrec/index.js new file mode 100644 index 0000000..6c19726 --- /dev/null +++ b/server/routers/car-wash/auth/passrec/index.js @@ -0,0 +1,44 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.post('/postPassRec', (req, res) => { + if (req.body.login in req.session) { + if (req.body.phoneRecForm === 0) { + const code = Math.floor(Math.random() * (9999 - 1000 + 1)) + 1000 + + const ret1 = { + status: 'success', + phonecode: code, + } + req.session[req.body.login].phonecode = ret1.phonecode + return res.send(ret1) + } + if (req.body.phoneRecForm === 1) { + if (req.session[req.body.login].phonecode === req.body.phonecode) { + const ret = { + login: req.session[req.body.login].login, + phone: req.session[req.body.login].phone, + phonecode: req.session[req.body.login].phonecode, + status: 'success', + } + return res.send(ret) + } + const ret = { + phonecode: req.session[req.body.login].phonecode, + status: 'err', + } + return res.send(ret) + } + if (req.body.phoneRecForm === 2) { + const ret = { + status: 'success', + } + req.session[req.body.login].phonecode = undefined + req.session[req.body.login].pass = req.body.phonenewpass + return res.send(ret) + } + } + res.send(require('./error.json')) +}) + +module.exports = router diff --git a/server/routers/car-wash/auth/passrec/success.json b/server/routers/car-wash/auth/passrec/success.json new file mode 100644 index 0000000..0460d16 --- /dev/null +++ b/server/routers/car-wash/auth/passrec/success.json @@ -0,0 +1,3 @@ +{ + "status": "success" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/registration/dooble.json b/server/routers/car-wash/auth/registration/dooble.json new file mode 100644 index 0000000..e6682b8 --- /dev/null +++ b/server/routers/car-wash/auth/registration/dooble.json @@ -0,0 +1,3 @@ +{ + "status": "dooble" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/registration/dooblephone.json b/server/routers/car-wash/auth/registration/dooblephone.json new file mode 100644 index 0000000..6c6d81b --- /dev/null +++ b/server/routers/car-wash/auth/registration/dooblephone.json @@ -0,0 +1,3 @@ +{ + "status": "dooblePhone" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/registration/error.json b/server/routers/car-wash/auth/registration/error.json new file mode 100644 index 0000000..3b51be5 --- /dev/null +++ b/server/routers/car-wash/auth/registration/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} \ No newline at end of file diff --git a/server/routers/car-wash/auth/registration/index.js b/server/routers/car-wash/auth/registration/index.js new file mode 100644 index 0000000..209c1f0 --- /dev/null +++ b/server/routers/car-wash/auth/registration/index.js @@ -0,0 +1,26 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.post('/postRegistration', (req, res) => { + if (req.body.phone && req.body.login && req.body.pass) { + if (!req.session[req.body.login]) { + const ret = { + login: req.body.login, + pass: req.body.pass, + phone: req.body.phone, + status: 'success', + } + req.session[req.body.login] = ret + req.session[req.body.phone] = ret + } else if (req.session[req.body.login]) { + return res.send(require('./dooble.json')) + } else if (req.session[req.body.phone]) { + return res.send(require('./dooblephone.json')) + } + return res.send(require('./success.json')) + // return res.send(req.session); + } + res.send(require('./error.json')) +}) + +module.exports = router diff --git a/server/routers/car-wash/auth/registration/success.json b/server/routers/car-wash/auth/registration/success.json new file mode 100644 index 0000000..0460d16 --- /dev/null +++ b/server/routers/car-wash/auth/registration/success.json @@ -0,0 +1,3 @@ +{ + "status": "success" +} \ No newline at end of file diff --git a/server/routers/car-wash/carousel/carousel-en.json b/server/routers/car-wash/carousel/carousel-en.json new file mode 100644 index 0000000..227a10a --- /dev/null +++ b/server/routers/car-wash/carousel/carousel-en.json @@ -0,0 +1,40 @@ +{ + "status": { + "code": 0 + }, + + "banners": [ + { + "img": "first-slide.gif", + "title": "Fast and quality service", + "description": "1", + "color": "black" + }, + { + "img": "second-slide.gif", + "title": "Affordable prices", + "description": "2", + "color": "black" + }, + { + "img": "third-slide.gif", + "title": "Courteous staff", + "description": "3", + "color": "black" + }, + + { + "img": "fourth-slide.gif", + "title": "Comfortable waiting area", + "description": "3", + "color": "black" + }, + + { + "img": "fifth-slide.gif", + "title": "Convenient operating hours", + "description": "3", + "color": "black" + } + ] +} diff --git a/server/routers/car-wash/carousel/carousel-ru.json b/server/routers/car-wash/carousel/carousel-ru.json new file mode 100644 index 0000000..ffc081b --- /dev/null +++ b/server/routers/car-wash/carousel/carousel-ru.json @@ -0,0 +1,40 @@ +{ + "status": { + "code": 0 + }, + + "banners": [ + { + "img": "first-slide.gif", + "title": "Быстрое и качественное обслуживание", + "description": "1", + "color": "black" + }, + { + "img": "second-slide.gif", + "title": "Доступные цены", + "description": "2", + "color": "black" + }, + { + "img": "third-slide.gif", + "title": "Вежливый персонал", + "description": "3", + "color": "black" + }, + + { + "img": "fourth-slide.gif", + "title": "Комфортная зона ожидания", + "description": "3", + "color": "black" + }, + + { + "img": "fifth-slide.gif", + "title": "Удобное время работы", + "description": "3", + "color": "black" + } + ] +} diff --git a/server/routers/car-wash/carousel/index.js b/server/routers/car-wash/carousel/index.js new file mode 100644 index 0000000..db1d783 --- /dev/null +++ b/server/routers/car-wash/carousel/index.js @@ -0,0 +1,23 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.get('/getBanners', (req, res) => { + switch (req.query.lng) { + case 'en': + res.send(require('./carousel-en.json')) + break + case 'ru': + res.send(require('./carousel-ru.json')) + break + case 'en-En': + res.send(require('./carousel-en.json')) + break + case 'ru-Ru': + res.send(require('./carousel-ru.json')) + break + default: + console.log('Unknown language') + } +}) + +module.exports = router diff --git a/server/routers/car-wash/index.js b/server/routers/car-wash/index.js new file mode 100644 index 0000000..d70afa8 --- /dev/null +++ b/server/routers/car-wash/index.js @@ -0,0 +1,9 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.use(require('./carousel')) +router.use(require('./map')) +router.use('/auth', require('./auth')) +router.use(require('./prices')) + +module.exports = router diff --git a/server/routers/car-wash/map/index.js b/server/routers/car-wash/map/index.js new file mode 100644 index 0000000..9915acc --- /dev/null +++ b/server/routers/car-wash/map/index.js @@ -0,0 +1,23 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.get('/get-map-info', (req, res) => { + switch (req.query.lng) { + case 'en': + res.send(require('./map-info-en.json')) + break + case 'ru': + res.send(require('./map-info-ru.json')) + break + case 'en-En': + res.send(require('./map-info-en.json')) + break + case 'ru-Ru': + res.send(require('./map-info-ru.json')) + break + default: + console.log('Unknown language') + } +}) + +module.exports = router diff --git a/server/routers/car-wash/map/map-info-en.json b/server/routers/car-wash/map/map-info-en.json new file mode 100644 index 0000000..85a2df5 --- /dev/null +++ b/server/routers/car-wash/map/map-info-en.json @@ -0,0 +1,37 @@ +{ + "address": [ + { + "id": "1", + "x": "55.746971", + "y": "48.743549", + "name": "InnoWashing", + "phone": "7654321", + "address": "Russia, Republic of Tatarstan, Verkhneuslonsky District, Innopolis, 106 Sportivnaya Street", + "workingMode": "08:00-20:00", + "services": ["Contactless car wash", "Salon wash"], + "availableTime": ["7.00-8.00", "11.00-12.00", "17.00-18.00", "19.00-20.00", "21.00-22.00"] + }, + { + "id": "2", + "x": "55.754105", + "y": "48.743341", + "name": "Car Wash №1", + "phone": "1234567", + "address": "Russia, Republic of Tatarstan, Verkhneuslonsky District, Innopolis, 1 University Street", + "workingMode": "09:00-20:00", + "services": ["3-in-1 Wash", "Nano Wash", "Salon Wash", "Contactless Wash"], + "availableTime": ["9.00-10.00", "12.00-13.00", "15.00-16.00"] + }, + { + "id": "3", + "x": "55.784105", + "y": "48.733341", + "name": "Hare's car wash", + "phone": "00000", + "address": "Russia, Republic of Tatarstan, Verkhneuslonsky district, Makarievsky forest", + "workingMode": "24 hours", + "services": ["Paw wash", "Juniper wash", "Hose wash"], + "availableTime": ["9.00-24.00"] + } + ] +} \ No newline at end of file diff --git a/server/routers/car-wash/map/map-info-ru.json b/server/routers/car-wash/map/map-info-ru.json new file mode 100644 index 0000000..354ca64 --- /dev/null +++ b/server/routers/car-wash/map/map-info-ru.json @@ -0,0 +1,37 @@ +{ + "address": [ + { + "id": "1", + "x": "55.746971", + "y": "48.743549", + "name": "InnoWashing", + "phone": "7654321", + "address": "Россия, Республика Татарстан, Верхнеуслонский район, Иннополис, Спортивная улица, 106", + "workingMode": "08:00–20:00", + "services": ["Бесконтактная мойка", "Мойка салона"], + "availableTime": ["7.00-8.00", "11.00-12.00", "17.00-18.00", "19.00-20.00", "21.00-22.00"] + }, + { + "id": "2", + "x": "55.754105", + "y": "48.743341", + "name": "Автомойка №1", + "phone": "1234567", + "address": "Россия, Республика Татарстан, Верхнеуслонский район, Иннополис, Университетская улица, 1", + "workingMode": "09:00–20:00", + "services": ["Мойка 3 в 1", "Наномойка", "Мойка салона","Бесконтактная мойка"], + "availableTime": ["9.00-10.00", "12.00-13.00", "15.00-16.00"] + }, + { + "id": "3", + "x": "55.784105", + "y": "48.733341", + "name": "Автомойка у зайца", + "phone": "00000", + "address": "Россия, Республика Татарстан, Верхнеуслонский район, Макарьевский лес", + "workingMode": "24 часа", + "services": ["Мойка лапами", "Мойка можжевеловой мочалкой", "Мойка из шланга"], + "availableTime": ["9.00-24.00"] + } + ] +} \ No newline at end of file diff --git a/server/routers/car-wash/prices/index.js b/server/routers/car-wash/prices/index.js new file mode 100644 index 0000000..c8480ff --- /dev/null +++ b/server/routers/car-wash/prices/index.js @@ -0,0 +1,22 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.get('/get-prices', (req, res) => { + switch (req.query.lng) { + case 'en': + res.send(require('./prices-en.json')) + break + case 'ru': + res.send(require('./prices-ru.json')) + break + case 'en-En': + res.send(require('./prices-en.json')) + break + case 'ru-Ru': + res.send(require('./prices-en.json')) + break + default: + console.log('Unknown language') + } +}) +module.exports = router diff --git a/server/routers/car-wash/prices/prices-en.json b/server/routers/car-wash/prices/prices-en.json new file mode 100644 index 0000000..3fdaf50 --- /dev/null +++ b/server/routers/car-wash/prices/prices-en.json @@ -0,0 +1,59 @@ +{ + "prices": [ + { + "id": "1", + "name": "Contactless car wash", + "price": "459" + }, + { + "id": "2", + "name": "Nanowash", + "price": "759" + }, + { + "id": "3", + "name": "Deluxe wash", + "price": "1559" + }, + { + "id": "4", + "name": "Comprehensive wash", + "price": "859" + }, + { + "id": "5", + "name": "Comprehensive nano wash", + "price": "11559" + }, + { + "id": "6", + "name": "Antireagent", + "price": "1400" + }, + { + "id": "7", + "name": "Antireagent complex", + "price": "1800" + }, + { + "id": "8", + "name": "Express wash", + "price": "250" + }, + { + "id": "9", + "name": "Vacuum cleaner", + "price": "250" + }, + { + "id": "10", + "name": "Glass", + "price": "250" + }, + { + "id": "11", + "name": "Plastic polish", + "price": "250" + } + ] +} diff --git a/server/routers/car-wash/prices/prices-ru.json b/server/routers/car-wash/prices/prices-ru.json new file mode 100644 index 0000000..4e32503 --- /dev/null +++ b/server/routers/car-wash/prices/prices-ru.json @@ -0,0 +1,59 @@ +{ + "prices": [ + { + "id": "1", + "name": "Бесконтактная мойка", + "price": "459" + }, + { + "id": "2", + "name": "Наномойка", + "price": "759" + }, + { + "id": "3", + "name": "Мойка люкс", + "price": "1559" + }, + { + "id": "4", + "name": "Комплексная мойка", + "price": "859" + }, + { + "id": "5", + "name": "Комплексная наномойка", + "price": "11559" + }, + { + "id": "6", + "name": "Антиреагент", + "price": "1400" + }, + { + "id": "7", + "name": "Антиреагент комплекс", + "price": "1800" + }, + { + "id": "8", + "name": "Экспресс-мойка", + "price": "250" + }, + { + "id": "9", + "name": "Пылесос", + "price": "250" + }, + { + "id": "10", + "name": "Стекла", + "price": "250" + }, + { + "id": "11", + "name": "Полироль пластика", + "price": "250" + } + ] +} \ No newline at end of file diff --git a/server/routers/coder/catalog/cardData.json b/server/routers/coder/catalog/cardData.json new file mode 100644 index 0000000..dad6beb --- /dev/null +++ b/server/routers/coder/catalog/cardData.json @@ -0,0 +1,136 @@ +{ "status": "success", + + "dataFeatured": [{ + "title": "Featured", + "items": [{ + "description":"Detailed Explanation of", + "title": "Dynamic Programming", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "/coder/topics/dynamic-programming/", + "progressCard": 0, + "primeContent": null, + "iconCard": "featured1", + "slug": "dynamic-programming", + "categorySlug": "featured" + },{ + "description":"Detailed Explanation of", + "title": "Heap", + "chanptersCount": 4, + "itemCount":28, + "linkToPage": "/coder/topics/heap/", + "progressCard": 0, + "primeContent": null, + "iconCard":"featured2", + "slug": "heap" + + },{ + "description":"Detailed Explanation of", + "title": "Graph", + "chanptersCount": 6, + "itemCount":58, + "linkToPage": "/coder/topics/graph/", + "progressCard": 0, + "primeContent": null, + "iconCard":"featured3", + "slug": "graph" + },{ + "description":"Introductuion to Data Structure", + "title": "Arrays 101", + "chanptersCount": 6, + "itemCount":31, + "linkToPage": "/coder/card/fun-with-arrays/", + "progressCard": 0, + "primeContent": null, + "iconCard":"featured4", + "slug": "fun-with-arrays" + }] + },{ + "title": "Interview", + "items": [{ + "description":"Get Well Prepared for", + "title": "Google Interview", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/interview/card/google/", + "progressCard": 0, + "primeContent": 1, + "iconCard": "interview1", + "slug": "google" + },{ + "description":"Get Well Prepared for", + "title": "Facebook", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/interview/card/facebook/", + "progressCard": 0, + "primeContent": 1, + "iconCard": "interview2", + "slug": "facebook" + },{ + "description":"Top Questions from", + "title": "Microsoft", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/interview/card/microsoft/", + "progressCard": 0, + "primeContent": 1, + "iconCard": "interview3", + "slug": "microsoft" + },{ + "description":"Top Questions from", + "title": "Amazon", + "chanptersCount": 8, + "itemCount":68, + "linkToPage": "coder/interview/card/amazon/", + "progressCard": 0, + "primeContent": 1, + "iconCard": "interview4", + "slug": "amazon" + }] + },{ + "title": "Learn", + "items": [{ + "description":"Detailed Explanation of", + "title": "Graph", + "chanptersCount": 6, + "itemCount":58, + "linkToPage": "coder/learn/card/graph", + "progressCard": 0, + "primeContent": null, + "iconCard": "learn1", + "slug": "graph" + },{ + "description":"Introductuion to Data Structure", + "title": "Arrays 101", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/learn/card/fun-with-arrays", + "progressCard": 0, + "primeContent": null, + "iconCard": "learn2", + "slug": "fun-with-arrays" + },{ + "description":"Introductuion to Data Structure", + "title": "Linked List", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/learn/card/linked-list", + "progressCard": 0, + "primeContent": null, + "iconCard": "learn3", + "slug": "linked-list" + },{ + "description":"Introductuion to Data Structure", + "title": "Binary Tree", + "chanptersCount": 6, + "itemCount":55, + "linkToPage": "coder/learn/card/data-structure-tree", + "progressCard": 0, + "primeContent": null, + "iconCard": "learn4", + "slug": "data-structure-tree" + }] + }] +} + \ No newline at end of file diff --git a/server/routers/coder/catalog/error.json b/server/routers/coder/catalog/error.json new file mode 100644 index 0000000..eb6bf3a --- /dev/null +++ b/server/routers/coder/catalog/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} diff --git a/server/routers/coder/catalog/index.js b/server/routers/coder/catalog/index.js new file mode 100644 index 0000000..9dfe5e1 --- /dev/null +++ b/server/routers/coder/catalog/index.js @@ -0,0 +1,15 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router(); + +router.get('/catalog', (request, response, next) => { + setTimeout(() => next()); +}, (request, response) => { + const params = process.env.stub; + if (params === 'error') { + response.send(require('./error.json')); + } else { + response.send(require('./cardData.json')); + } +}); + +module.exports = router; diff --git a/server/routers/coder/controllers.js b/server/routers/coder/controllers.js new file mode 100644 index 0000000..136f2a5 --- /dev/null +++ b/server/routers/coder/controllers.js @@ -0,0 +1,424 @@ +const { getDB } = require('../../utils/mongo') + +let db = null + +// Database Name +const dbName = 'coder' + +// Collections constant +const TOPIC_TAGS_COLLECTION = 'topic-tags' +const TOPIC_CATEGORIES_COLLECTION = 'topic-categories' +const TOPIC_LIST_COLLECTION = 'topic-list' +const TOPIC_COMMENTS_COLLECTION = 'topic-comments' +const USERS_COLLECTION = 'users' + +// page size +const PAGE_SIZE = 2 + +// TODO убрать из export? +const connect = async () => { + db = await getDB(dbName) +} + +const getCategories = async () => { + // TODO при первом запросе db = null + if (db === null) { + throw new Error('no db connection') + } + + const collection = db.collection(TOPIC_CATEGORIES_COLLECTION) + + const categories = await collection.find({ + }).project({ + _id: 0, + }).toArray() + + if (categories.length === 0) { + const newCategories = require('./forum/categories.json').body + collection.insertMany(newCategories) + return newCategories + } + return categories +} + +const getCategoryByPath = async (path) => { + if (db === null) { + throw new Error('no db connection') + } + + const collection = db.collection(TOPIC_CATEGORIES_COLLECTION) + + const category = await collection.findOne({ + path, + }, { + projection: { + _id: 0, + }, + }) + + if (!category) { + throw new Error('No data') + } + return category +} + +const getTopicById = async (id) => { + if (db === null) { + throw new Error('no db connection') + } + + const topicsCollection = db.collection(TOPIC_LIST_COLLECTION) + + const topic = await topicsCollection + .aggregate([ + { + $match: { + id: Number(id), + }, + }, + { + $limit: 1, + }, + { + $lookup: { + from: USERS_COLLECTION, localField: 'authorId', foreignField: 'id', as: 'author', + }, + }, + { + $unwind: '$author', + }, + { + $lookup: { + from: TOPIC_TAGS_COLLECTION, localField: 'tagsId', foreignField: 'id', as: 'tags', + }, + }, + { + $project: { + id: 0, + categoryId: 0, + authorId: 0, + tagsId: 0, + 'author.id': 0, + 'author._id': 0, + 'tags.id': 0, + 'tags._id': 0, + _id: 0, + }, + }, + ]) + .toArray() + + if (topic.length === 0) { + throw new Error('No data') + } + + return topic[0] +} + +const getCommentsByTopicId = async (id, page) => { + if (db === null) { + throw new Error('no db connection') + } + + if (page === undefined) { + page = 1 + } + + const commentsCollection = db.collection(TOPIC_COMMENTS_COLLECTION) + + let count = await commentsCollection.count({ + }, { + limit: 1, + }) + if (count === 0) { + const newComments = require('./forum/topic-comments.json').body + commentsCollection.insertMany(newComments) + } + + const comments = await commentsCollection + .aggregate([ + { + $match: { + topicId: Number(id), + }, + }, + { + $skip: PAGE_SIZE * Number(page) - PAGE_SIZE, + }, + { + $limit: PAGE_SIZE, + }, + { + $lookup: { + from: USERS_COLLECTION, localField: 'authorId', foreignField: 'id', as: 'author', + }, + }, + { + $unwind: '$author', + }, + { + $project: { + topicId: 0, + authorId: 0, + 'author.id': 0, + 'author._id': 0, + _id: 0, + }, + }, + ]) + .toArray() + + // pagination + count = await commentsCollection.count({ + topicId: Number(id), + }) + const result = { + page, + pageSize: PAGE_SIZE, + total: count, + totalPages: Math.ceil(count / PAGE_SIZE), + comments, + } + + return result +} + +const getTopicsByCategoryId = async (id, page) => { + if (db === null) { + throw new Error('no db connection') + } + + if (page === undefined) { + page = 1 + } + + const topicsCollection = db.collection(TOPIC_LIST_COLLECTION) + + let count = await topicsCollection.count({ + }, { + limit: 1, + }) + if (count === 0) { + const newTopics = require('./forum/topic-list.json').body.items + topicsCollection.insertMany(newTopics) + } + + // TODO delete after auth implementation + const usersCollection = db.collection(USERS_COLLECTION) + const usersCount = await usersCollection.count({ + }, { + limit: 1, + }) + if (usersCount === 0) { + const newUsers = require('./forum/users.json').body + usersCollection.insertMany(newUsers) + } + + const topics = await topicsCollection + .aggregate([ + { + $match: { + categoryId: Number(id), + }, + }, + { + $skip: PAGE_SIZE * Number(page) - PAGE_SIZE, + }, + { + $limit: PAGE_SIZE, + }, + { + $lookup: { + from: USERS_COLLECTION, localField: 'authorId', foreignField: 'id', as: 'author', + }, + }, + { + $unwind: '$author', + }, + { + $project: { + id: 1, + title: 1, + commentCount: 1, + viewCount: 1, + voteCount: 1, + creationDate: 1, + 'author.name': 1, + 'author.avatar': 1, + _id: 0, + }, + }, + ]) + .toArray() + + if (topics.length === 0) { + throw new Error('No data') + } + + // pagination + count = await topicsCollection.count({ + categoryId: Number(id), + }) + const result = { + page, + pageSize: PAGE_SIZE, + total: count, + totalPages: Math.ceil(count / PAGE_SIZE), + topics, + } + + return result +} + +const getTags = async () => { + if (db === null) { + throw new Error('no db connection') + } + + const tagsCollection = db.collection(TOPIC_TAGS_COLLECTION) + + const count = await tagsCollection.count({ + }, { + limit: 1, + }) + if (count === 0) { + const newTags = require('./forum/topic-tags.json').body + tagsCollection.insertMany(newTags) + } + + const tags = await tagsCollection.find({ + }).project({ + _id: 0, + }).toArray() + + if (tags.length === 0) { + throw new Error('No data') + } + + return tags +} + +const findTags = async (value) => { + if (db === null) { + throw new Error('no db connection') + } + const tagsCollection = db.collection(TOPIC_TAGS_COLLECTION) + + const tags = await tagsCollection + .find({ + name: { + $regex: `${value}`, + }, + }) + .project({ + _id: 0, + }) + .toArray() + + return tags +} + +const insertTag = async (value) => { + if (db === null) { + throw new Error('no db connection') + } + const tagsCollection = db.collection(TOPIC_TAGS_COLLECTION) + // TODO no fast, reimplement + const count = await tagsCollection.estimatedDocumentCount() + + await tagsCollection.insertOne({ + id: count + 1, + name: value, + numTopics: 0, + }) + + return count + 1 +} + +const insertComment = async (comment) => { + if (db === null) { + throw new Error('no db connection') + } + const commentsCollection = db.collection(TOPIC_COMMENTS_COLLECTION) + // TODO no fast, reimplement + // TODO может перейти на _id? + const count = await commentsCollection.estimatedDocumentCount() + + const currentTime = Math.round(new Date().getTime() / 1000) + + await commentsCollection.insertOne({ + id: count + 1, + topicId: comment.topicId, + voteCount: 0, + content: comment.content, + updationDate: currentTime, + creationDate: currentTime, + authorId: comment.authorId, + authorIsModerator: false, + isOwnPost: false, + }) + + return comment +} + +const insertTopic = async (topic) => { + if (db === null) { + throw new Error('no db connection') + } + const topicsCollection = db.collection(TOPIC_LIST_COLLECTION) + // TODO no fast, reimplement + // TODO может перейти на _id? + const count = await topicsCollection.estimatedDocumentCount() + + const currentTime = Math.round(new Date().getTime() / 1000) + + const tagsId = [] + + if (topic.tags) { + for (let index = 0; index < topic.tags.length; index++) { + const tag = topic.tags[index] + if (tag.id === 0) { + const tagId = await insertTag(tag.name) + tagsId.push(tagId) + } else { + tagsId.push(tag.id) + } + } + } + + const result = await topicsCollection.insertOne({ + id: count + 1, + categoryId: topic.categoryId, + title: topic.title, + commentCount: 0, + viewCount: 0, + tagsId, + voteCount: 0, + voteStatus: 0, + content: topic.content, + updationDate: currentTime, + creationDate: currentTime, + authorId: topic.authorId, + isOwnPost: true, + }) + + if (!result.insertedId) { + throw new Error('Insert data failed, try again later') + } + + return count + 1 +} + +module.exports = { + connect, + getTags, + findTags, + insertTag, + getCategories, + getTopicsByCategoryId, + getTopicById, + getCommentsByTopicId, + insertComment, + insertTopic, + getCategoryByPath, +} diff --git a/server/routers/coder/forum/categories.json b/server/routers/coder/forum/categories.json new file mode 100644 index 0000000..5e15ea1 --- /dev/null +++ b/server/routers/coder/forum/categories.json @@ -0,0 +1,49 @@ +{ + "success": true, + "body": [ + { + "id": 1, + "title": "Interview Question", + "description": "Share and discuss questions from real technical interviews", + "path": "interview-question" + }, + { + "id": 2, + "title": "Interview Experience", + "description": "Share details about the interview processes you have been through", + "path": "interview-experience" + }, + { + "id": 3, + "title": "Compensation", + "description": "What kind of offers have you received? Share it here!", + "path": "compensation" + }, + { + "id": 4, + "title": "Career", + "description": "Question about working in the tech industry? Discuss your career questions here.", + "path": "career" + }, + { + "id": 5, + "title": "Study Guide", + "description": "Share your study guide or summaries for certain topics/patterns", + "path": "study-guide" + }, + { + "id": 6, + "title": "General Discussion", + "description": "Discuss anything not covered in other categories", + "path": "general-discussion" + }, + { + "id": 7, + "title": "Support & Feedback", + "description": "Get help on issues or submit feedback regarding LeetCode", + "path": "feedback" + } + ], + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/forum/error.json b/server/routers/coder/forum/error.json new file mode 100644 index 0000000..eb6bf3a --- /dev/null +++ b/server/routers/coder/forum/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} diff --git a/server/routers/coder/forum/index.js b/server/routers/coder/forum/index.js new file mode 100644 index 0000000..c1ca4d9 --- /dev/null +++ b/server/routers/coder/forum/index.js @@ -0,0 +1,96 @@ +const router = require('express').Router(); + +const { getResponse } = require('../../../utils/common'); +const { + getTags, + connect, + findTags, + insertTag, + getCategories, + getTopicsByCategoryId, + getTopicById, + getCommentsByTopicId, + insertComment, + getCategoryByPath, + insertTopic, +} = require('../controllers'); + +connect(); + +router.get('/forum/topic-categories', async (req, res) => { + const errors = []; + const categories = await getCategories().catch((e) => errors.push(e.message)); + res.send(getResponse(errors, categories)); +}); + +router.get('/forum/topic-categories/:groupId', async (req, res) => { + const errors = []; + const category = await getCategoryByPath(req.params.groupId).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, category)); +}); + +router.get('/forum/topic-comments/:topicId', async (req, res) => { + const errors = []; + const comments = await getCommentsByTopicId(req.params.topicId, req.query.page).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, comments)); +}); + +router.post('/forum/topic-comments', async (req, res) => { + const errors = []; + if (!req.body) { + errors.push('Bad request, no body'); + res.send(getResponse(errors, undefined)); + } else { + const comment = await insertComment(req.body).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, comment)); + } +}); + +router.get('/forum/topic-list/:id', async (req, res) => { + const errors = []; + const topics = await getTopicsByCategoryId(req.params.id, req.query.page).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, topics)); +}); + +router.get('/forum/topic/:id', async (req, res) => { + const errors = []; + const topic = await getTopicById(req.params.id).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, topic)); +}); + +router.post('/forum/topic', async (req, res) => { + const errors = []; + if (!req.body) { + errors.push('Bad request, no body'); + res.send(getResponse(errors, undefined)); + } else { + const topic = await insertTopic(req.body).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, topic)); + } +}); + +router.get('/forum/topic-tags', async (req, res) => { + const errors = []; + if (req.query.search !== undefined) { + const tags = await findTags(req.query.search).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, tags)); + } else { + const tags = await getTags().catch((e) => errors.push(e.message)); + res.send(getResponse(errors, tags)); + } +}); + +router.post('/forum/topic-tags', async (req, res) => { + const errors = []; + const tags = await insertTag(req.body?.name).catch((e) => errors.push(e.message)); + res.send(getResponse(errors, tags)); +}); + +router.get('/forum/stub/:data', (request, response) => { + console.log(request.params); + process.env.stub = request.params.data; + + response.sendStatus(200); +}); + +module.exports = router; diff --git a/server/routers/coder/forum/topic-comments.json b/server/routers/coder/forum/topic-comments.json new file mode 100644 index 0000000..4a7b69e --- /dev/null +++ b/server/routers/coder/forum/topic-comments.json @@ -0,0 +1,29 @@ +{ + "success": true, + "body": [ + { + "id": 1, + "topicId": 1, + "voteCount": 36, + "content": "wish for offer", + "updationDate": 1563064458, + "creationDate": 1563064458, + "authorId": 1, + "authorIsModerator": false, + "isOwnPost": false + }, + { + "id": 2, + "topicId": 1, + "voteCount": 10, + "content": "Thank you for your explantion", + "updationDate": 1559050657, + "creationDate": 1559050657, + "authorId": 1, + "authorIsModerator": false, + "isOwnPost": false + } + ], + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/forum/topic-list.json b/server/routers/coder/forum/topic-list.json new file mode 100644 index 0000000..9f784f5 --- /dev/null +++ b/server/routers/coder/forum/topic-list.json @@ -0,0 +1,235 @@ +{ + "success": true, + "body": { + "totalNum": 15, + "items": [ + { + "id": 1, + "categoryId": 1, + "title": "How to write an Interview Question post", + "commentCount": 2, + "viewCount": 0, + "tagsId": [1, 2], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1524865315, + "creationDate": 1524865315, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 2, + "categoryId": 1, + "title": "Microsoft Online Assessment Questions", + "commentCount": 0, + "viewCount": 0, + "tagsId": [1, 2], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1570318826, + "creationDate": 1570318826, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 3, + "categoryId": 2, + "title": "Google Online Assessment Questions", + "commentCount": 0, + "viewCount": 0, + "tagsId": [1], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1565090199, + "creationDate": 1565090199, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 4, + "categoryId": 2, + "title": "Meta | March 2022 | Onsite USA E4", + "commentCount": 0, + "viewCount": 0, + "tagsId": [3, 4], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649546823, + "creationDate": 1649546823, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 5, + "categoryId": 2, + "title": "Flipkart | SDE 2 | Machine Coding", + "commentCount": 0, + "viewCount": 0, + "tagsId": [4, 5, 6], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649599102, + "creationDate": 1649599102, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 6, + "categoryId": 3, + "title": "Google | SDE (L4/L5) | Virtual Onsite | PENDING", + "commentCount": 0, + "viewCount": 0, + "tagsId": [7, 8], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649537604, + "creationDate": 1649537604, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 7, + "categoryId": 3, + "title": "Leetcode not taking track of submission and not filled the active days box", + "commentCount": 0, + "viewCount": 0, + "tagsId": [11, 12], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649486170, + "creationDate": 1649486170, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 8, + "categoryId": 4, + "title": "Salesforce India || AMTS (2022 Graduate) || Online Assessment || Off Campus", + "commentCount": 0, + "viewCount": 0, + "tagsId": [10, 20], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649572752, + "creationDate": 1649572752, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 9, + "categoryId": 5, + "title": "Meta | February Phone Interview | E4 | USA", + "commentCount": 0, + "viewCount": 0, + "tagsId": [14, 15], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649462307, + "creationDate": 1649462307, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 10, + "categoryId": 5, + "title": "Maximize minimum array", + "commentCount": 0, + "viewCount": 0, + "tagsId": [11, 7], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649652616, + "creationDate": 1649652616, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 11, + "categoryId": 6, + "title": "Yelp | London | April 2022 | Screening + Virtual On-Site | Full Stack Role", + "commentCount": 0, + "viewCount": 0, + "tagsId": [7, 12], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649637943, + "creationDate": 1649637943, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 12, + "categoryId": 6, + "title": "[System Design Question] Design a Game Matching system", + "commentCount": 0, + "viewCount": 0, + "tagsId": [8, 11], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649637516, + "creationDate": 1649637516, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 13, + "categoryId": 6, + "title": "Uber | Data Analyst | SF | 2022-04", + "commentCount": 0, + "viewCount": 0, + "tagsId": [1, 12], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649625709, + "creationDate": 1649625709, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 14, + "categoryId": 7, + "title": "Google Online Assessment", + "commentCount": 0, + "viewCount": 0, + "tagsId": [11, 2], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649622307, + "creationDate": 1649622307, + "authorId": 1, + "isOwnPost": true + }, + { + "id": 15, + "categoryId": 7, + "title": "Amazon || SDE 2 || OA", + "commentCount": 0, + "viewCount": 0, + "tagsId": [], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1649619969, + "creationDate": 1649619969, + "authorId": 1, + "isOwnPost": true + } + ] + }, + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/forum/topic-tags.json b/server/routers/coder/forum/topic-tags.json new file mode 100644 index 0000000..53ac70f --- /dev/null +++ b/server/routers/coder/forum/topic-tags.json @@ -0,0 +1,107 @@ +{ + "success": true, + "body": [ + { + "id": 1, + "name": "google", + "numTopics": 0 + }, + { + "id": 2, + "name": "phone screen", + "numTopics": 0 + }, + { + "id": 3, + "name": "amazon", + "numTopics": 0 + }, + { + "id": 4, + "name": "facebook", + "numTopics": 0 + }, + { + "id": 5, + "name": "online assessment", + "numTopics": 0 + }, + { + "id": 6, + "name": "onsite", + "numTopics": 0 + }, + { + "id": 7, + "name": "system design", + "numTopics": 0 + }, + { + "id": 8, + "name": "microsoft", + "numTopics": 0 + }, + { + "id": 9, + "name": "online assesment", + "numTopics": 0 + }, + { + "id": 10, + "name": "graph", + "numTopics": 0 + }, + { + "id": 11, + "name": "uber", + "numTopics": 0 + }, + { + "id": 12, + "name": "intern", + "numTopics": 0 + }, + { + "id": 13, + "name": "amazon online assesment", + "numTopics": 0 + }, + { + "id": 14, + "name": "bloomberg", + "numTopics": 0 + }, + { + "id": 15, + "name": "amazon interview", + "numTopics": 0 + }, + { + "id": 16, + "name": "new grad", + "numTopics": 0 + }, + { + "id": 17, + "name": "interview", + "numTopics": 0 + }, + { + "id": 18, + "name": "amazon sde2", + "numTopics": 0 + }, + { + "id": 19, + "name": "array", + "numTopics": 0 + }, + { + "id": 20, + "name": "phone-interview", + "numTopics": 0 + } + ], + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/forum/topic.json b/server/routers/coder/forum/topic.json new file mode 100644 index 0000000..e28a7b3 --- /dev/null +++ b/server/routers/coder/forum/topic.json @@ -0,0 +1,20 @@ +{ + "success": true, + "body": { + "id": 1, + "categoryId": 1, + "title": "How to write an Interview Question post", + "commentCount": 2, + "viewCount": 0, + "tagsId": [1, 2], + "voteCount": 0, + "voteStatus": 0, + "content": "## Heading level 2\n#### Heading level 4\nI just love **bold text**.\nItalicized text is the _cat's meow_.\n- Revenue was off the chart.\n- Profits were higher than ever.\n", + "updationDate": 1648229493, + "creationDate": 1524865315, + "authorId": 1, + "isOwnPost": true + }, + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/forum/users.json b/server/routers/coder/forum/users.json new file mode 100644 index 0000000..c77a4c8 --- /dev/null +++ b/server/routers/coder/forum/users.json @@ -0,0 +1,6 @@ +{ + "success": true, + "body": [{ "id": 1, "name": "Test", "avatar": "https://s3-us-west-1.amazonaws.com/s3-lc-upload/assets/default_avatar.jpg" }], + "errors": [], + "warnings": [] +} diff --git a/server/routers/coder/index.js b/server/routers/coder/index.js new file mode 100644 index 0000000..c84f996 --- /dev/null +++ b/server/routers/coder/index.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line new-cap +const router = require('express').Router() + +router.use(require('./forum')) +router.use(require('./catalog')) +router.use(require('./topic')) + +module.exports = router diff --git a/server/routers/coder/topic/dynamic-programming.json b/server/routers/coder/topic/dynamic-programming.json new file mode 100644 index 0000000..6e24fbb --- /dev/null +++ b/server/routers/coder/topic/dynamic-programming.json @@ -0,0 +1,27 @@ +{ + "status": "success", + "title" : "Dynamic Programming", + "slug":"dynamic-programming", + "overview":"In this explore card, we're going to go over the basics of DP, provide you with a framework for solving DP problems, learn about common patterns, and walk through many examples.", + "chapters": [ + { + "title" : "Dynamic Programming", + "section" : "dynamic-programming", + "isLock" : false, + "content" : "

Динамическое программирование

" + }, + { + "title" : "Arrays and Strings", + "section" : "arrays-and-strings", + "isLock" : false, + "content" : "

Массивы и строки

" + }, + { + "title" : "Linked list", + "section" : "linked-list", + "isLock" : true, + "content" : "

Ссылочный список

" + } + ] +} + \ No newline at end of file diff --git a/server/routers/coder/topic/dynamic-programming/arrays-and-strings.json b/server/routers/coder/topic/dynamic-programming/arrays-and-strings.json new file mode 100644 index 0000000..a06974f --- /dev/null +++ b/server/routers/coder/topic/dynamic-programming/arrays-and-strings.json @@ -0,0 +1,10 @@ +{ + "title" : "Arrays and Strings", + "slug" : "arrays-and-strings", + "content": [ + {"data":"## Arrays and String"}, + {"data":"An array is a collection of similar type of elements that are stored in a contiguous memory location. Arrays can contain primitives(int, char, etc) as well as object(non-primitives) references of a class depending upon the definition of the array. In the case of primitive data type, the actual values are stored in contiguous memory locations whereas in the case of objects of a class the actual objects are stored in the heap segment. In Java, all the arrays are allocated dynamically. The size of an array must be specified by an int value and not long or short. The array index starts from 0 and goes up to n-1 where n is the length of the array."}, + {"data":"#### Array Declaration Syntax"}, + {"data": "An array declaration has two components: the type and the var-name. The type declares the element type of the array. The element type determines the data type of each element that comprises the array. The var-name declares the name of the array variable. Like an array of int type, we can also create an array of other primitive data types like char, float, double…etc."} + ] +} diff --git a/server/routers/coder/topic/dynamic-programming/dynamic-programming.json b/server/routers/coder/topic/dynamic-programming/dynamic-programming.json new file mode 100644 index 0000000..59d9819 --- /dev/null +++ b/server/routers/coder/topic/dynamic-programming/dynamic-programming.json @@ -0,0 +1,10 @@ +{ + "title": "Dynamic programming", + "slug": "dynamic-programming", + "content": [ + {"data":"## Hello markdown"}, + {"data":"Dynamic programming is both a mathematical optimization method and a computer programming method. The method was developed by Richard Bellman in the 1950s and has found applications in numerous fields, from aerospace engineering to economics. In both contexts it refers to simplifying a complicated problem by breaking it down into simpler sub-problems in a recursive manner. While some decision problems cannot be taken apart this way, decisions that span several points in time do often break apart recursively. Likewise, in computer science, if a problem can be solved optimally by breaking it into sub-problems and then recursively finding the optimal solutions to the sub-problems, then it is said to have optimal substructure.If sub-problems can be nested recursively inside larger problems, so that dynamic programming methods are applicable, then there is a relation between the value of the larger problem and the values of the sub-problems.[1] In the optimization literature this relationship is called the Bellman equation."}, + {"data":"#### Mathematical optimization"}, + {"data": "In terms of mathematical optimization, dynamic programming usually refers to simplifying a decision by breaking it down into a sequence of decision steps over time. This is done by defining a sequence of value functions V1, V2, ..., Vn taking y as an argument representing the state of the system at times i from 1 to n. The definition of Vn(y) is the value obtained in state y at the last time n. The values Vi at earlier times i = n −1, n − 2, ..., 2, 1 can be found by working backwards, using a recursive relationship called the Bellman equation. For i = 2, ..., n, Vi−1 at any state y is calculated from Vi by maximizing a simple function (usually the sum) of the gain from a decision at time i − 1 and the function Vi at the new state of the system if this decision is made. Since Vi has already been calculated for the needed states, the above operation yields Vi−1 for those states. Finally, V1 at the initial state of the system is the value of the optimal solution. The optimal values of the decision variables can be recovered, one by one, by tracking back the calculations already performed."} + ] +} diff --git a/server/routers/coder/topic/dynamic-programming/linked-list.json b/server/routers/coder/topic/dynamic-programming/linked-list.json new file mode 100644 index 0000000..01402ac --- /dev/null +++ b/server/routers/coder/topic/dynamic-programming/linked-list.json @@ -0,0 +1,8 @@ +{ + "title" : "Linked list", + "slug" : "linked-list", + "content": [ + {"data":"# Hello markdown"}, + {"data":"# Hello markdown"} + ] +} diff --git a/server/routers/coder/topic/dynamic-programming/overview.json b/server/routers/coder/topic/dynamic-programming/overview.json new file mode 100644 index 0000000..9ca1f3d --- /dev/null +++ b/server/routers/coder/topic/dynamic-programming/overview.json @@ -0,0 +1,8 @@ +{ + "title" : "Overview", + "slug" : "overview", + "content": [ + {"data":"## Overview"}, + {"data":"In this explore card, we're going to go over the basics of DP, provide you with a framework for solving DP problems, learn about common patterns, and walk through many examples.No prior knowledge of DP is required for this card, but you will need a solid understanding of recursion, a basic understanding of what greedy algorithms are, and general knowledge such as big O and hash tables. If you aren't familiar with recursion yet, check out the recursion explore card first."} + ] +} diff --git a/server/routers/coder/topic/error.json b/server/routers/coder/topic/error.json new file mode 100644 index 0000000..eb6bf3a --- /dev/null +++ b/server/routers/coder/topic/error.json @@ -0,0 +1,3 @@ +{ + "status": "error" +} diff --git a/server/routers/coder/topic/index.js b/server/routers/coder/topic/index.js new file mode 100644 index 0000000..7ebc0b7 --- /dev/null +++ b/server/routers/coder/topic/index.js @@ -0,0 +1,30 @@ +const router = require('express').Router() + +router.get('/gettopic/:topic/:section', (request, response) => { + const topic = request.params.topic + let section = request.params.section + + if (!topic || !section) { + response.send(require('./error.json')) + } else { + response.send( + // require(`./${topic}/${section}.json`) + require(`./dynamic-programming/${section}.json`), + ) + } +}) + +router.get('/gettopic/:topic', (request, response) => { + const topic = request.params.topic + + if (!topic) { + response.send(require('./error.json')) + } else { + response.send( + // require(`./${topic}.json`) + require('./dynamic-programming.json'), + ) + } +}) + +module.exports = router diff --git a/server/routers/easy-project/auth.js b/server/routers/easy-project/auth.js new file mode 100644 index 0000000..59fe821 --- /dev/null +++ b/server/routers/easy-project/auth.js @@ -0,0 +1,48 @@ +const router = require('express').Router() +const jwt = require('jsonwebtoken') +const { JWT_SECRET } = require('./constants') +const { registrationUser, signInUser } = require('./db') +const { requiredFields, responseWrapper } = require('./utils') + +router.get('/healthcheck', (req, res) => { + res.send(true) +}) + +router.post('/registration', requiredFields(['email', 'login', 'password']), async (req, res, next) => { + const { email, login, password, ...rest } = req.body + + try { + await registrationUser({ + email, login, password, ...rest, + }) + + res.send(responseWrapper(undefined, { + })) + } catch (e) { + next(e) + } +}) + +router.post('/sign-in', requiredFields(['email', 'password']), async (req, res, next) => { + const { email, password } = req.body + + try { + const user = await signInUser({ + email, password, + }) + + req.session.user = user + + const token = jwt.sign({ + id: user._id, + }, JWT_SECRET) + + res.send(responseWrapper(undefined, { + token, user, + })) + } catch (e) { + next(e) + } +}) + +module.exports = router diff --git a/server/routers/easy-project/constants.js b/server/routers/easy-project/constants.js new file mode 100644 index 0000000..e8b7f4a --- /dev/null +++ b/server/routers/easy-project/constants.js @@ -0,0 +1,30 @@ +const JWT_SECRET = `MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDsZZ+2H3Q0uvFh +JohVkLKGUGR0dJRo801QbH/UMQjsuIYPExn4wLHr06ALGb3WQe+hiERthsJu3veV +38AuQ3YHE1mcD5KRwkBflqc+lldp1JyZm8qPO1PLCJBc/553EPV16MbuDdmdxoY5 +Uk2X5b3+UVjzDY83Pd9YFa3i42y7wREKj7csTxJPGXGvFDtCgyhhH3vjtd91pCg8 +nuXuFShv5HI5S2ffBbxj/p8rjIK+a+DOw2zKEeYN3G5OLCVsmBow76KQZyVmmYAq +Qnlut0s0HbNX8Deo70iib35AEts00ey+2Y5gJh4Lq8tCpSeFlO0mQ13g/jN8jDxu +mnoluhQnAgMBAAECggEARG4KdHLYdacj1maMEpDHTOAapCdXCqZbXAt8WVU0aynj +DJwP6ZUGK+jfrDbwYARINK84d6gJwoRikQzrGblHgjbUurs7R1w+vCzlDtYASc9U +4ZZaZWncEKrS90i7e2X6V/5hD2oM84ITOqabdXv4qpSrtffX3DrZ2yqzYjlJMXPc +VT+qqG8pDEhluJWO+CQBr3L7kk69S1s6ehlVh7OFOvtCXTPfwM23NrwDSRp+kx9x +GikhoPUFZL6FZttJxzgonW10Yi4MvlCNHuWs5F1vfK0b3eG9FsGsvclBd9E0P75i +iQeWG+Ecf81XWaqmaKMvQv5upK0jwEvHBEa6IXhoiQKBgQD+XPv68a8TKlbdg0UY +YYKbs+U/7v0ZcRwkweYTPrhg1cO91nRk8e9OXnD+Boqk2zMojLI9FEF7qf13LY9X +Ue9XikgoDQAIg6bS92FUx5KoyxOnQcDdTenhZZ7dbF0qXn8KBz5EXgPxMVfS3hhk +uZ7PBWbeXtnVyvV+7ymjzX/PDQKBgQDt6wslvUrlLLPDE9bqO+Zi7sYPyQXphRWS +IvG4SisKa0Fo/MCgAP+0hfLBXgl+z+JQFmxpGaZIHikgwI0JA2jQLYdTAcjMiWHn +bxtw+dvOyp8xMjDg0cKuSs798zW1ylGdBvOKMcB4tJK66ahNPoGfd/iVpqkXCCJO +rptTRaODAwKBgDknn58li1ddHiOsCWyPDI/7/jk9dDWxSsefohkU8M0he1g+xeyg +yErtwanywliEwJwN8Ub0NDqbWc7bt+fBC2y6L7iAI0/GdUfWOlKYfYXcC9B7X+Da +TwFMmkPaw5xvm1AfjIhEL9KUac2CBi0r4FlYN2MkIQJ/FmatSsf5twxJAoGBALp8 +5E3+pDgi4/zjDjCoJxwhISq6XWH/qTrVHTdhG3+dNrY+eBZy8fvkirW7KiI2fKRe +DzgKnOYmjgJYK7SG8Z9MMKiF24lHnnA0DQRvNTZQaJu9RcbTZJANn1Y7Tzxhi7tT ++Y23FbEHiYPtJrj1Z9FBzp4u9pdRDuMxxhptmY9VAoGANasQyyWaNmJNFqK2OZRk +HhKwV5AXk7Q0F3YbGXOUUmlsQw+wYVtQmyThYESMbS3T9ccjTO1avCDZNcBYnKir +xkMh3KPVALIbolNjaac7TZ+CCu4VL99hCQVerVZqMivXiqmjjioobX3fspQl9nZL +h+adTrBTkdlVVgHE8TNs88Q=` + +module.exports = { + JWT_SECRET, +} diff --git a/server/routers/easy-project/db.js b/server/routers/easy-project/db.js new file mode 100644 index 0000000..4db8ff7 --- /dev/null +++ b/server/routers/easy-project/db.js @@ -0,0 +1,410 @@ +const { v4: uuid } = require('uuid') +const ObjectId = require('mongodb').ObjectID + +const { getDB } = require('../../utils/mongo') +const { _idToId, checkDB, _idToIdArray, filterId } = require('./utils') + +let db = null + +const USERS_COLL = 'ep_users' +const PROJECTS_COLL = 'ep_all_projects' +const PROJECT_TASKS_COLL = 'ep_projects_tasks' +const PROJECT_MEMBERS_COLL = 'ep_projects_members' +const PROJECT_STATUSES_COLL = 'ep_projects_statuses' +const PROJECT_TYPES_COLL = 'ep_projects_types' + +const connect = async () => { + db = await getDB('easy-project') + if (db === null) throw new Error('Нет подключения к базе данных') +} + +connect() + +const hashPassword = (password, salt = uuid(), salt2 = uuid(), salt3 = uuid()) => ({ + password: (password.split('').join(salt) + salt2 + password.split('').join(salt3)).split('-').reverse().join('-'), + salt, + salt2, + salt3, +}) + +const registrationUser = async ({ email, login, password, ...rest }) => { + checkDB(db) + const usersCollection = db.collection(USERS_COLL) + const userExist = await usersCollection.find({ + $or: [{ + login, + }, { + email, + }], + }).toArray() + + if (userExist.length) { + if (userExist[0].login === login) { + throw new Error('Логин уже занят') + } + if (userExist[0].email === email) { + throw new Error('Email уже занят') + } + } + + const { password: hash, salt, salt2, salt3 } = hashPassword(password) + + const user = { + salt, + salt2, + salt3, + hash, + login, + email, + ...rest, + } + + const { insertedId } = await usersCollection.insertOne(user) + user.id = insertedId +} + +const signInUser = async ({ email, password }) => { + checkDB(db) + + const usersCollection = db.collection(USERS_COLL) + + const [userCandidate] = await usersCollection.find({ + email, + }).toArray() + + if (!userCandidate) { + throw new Error('Email или пароль не корректный') + } + const { salt, salt2, salt3, hash, ...cleanUser } = userCandidate + const { password: hashFromDb } = hashPassword(password, salt, salt2, salt3) + + if (hash !== hashFromDb) { + throw new Error('Email или пароль не корректный') + } + + return cleanUser +} + +const getMyProjects = async (userId) => { + checkDB(db) + + const userFilterById = filterId(userId) + + const projectCollection = db.collection(PROJECTS_COLL) + const usersCollection = db.collection(USERS_COLL) + + let projectList = await projectCollection.find({ + $or: [{ + userId, + }, { + members: { + $in: [userId], + }, + }], + }).toArray() + + if (projectList) { + const [userAuthor] = await usersCollection.find(userFilterById).toArray() + for (let index = 0; index < projectList.length; index++) { + projectList[index].author = userAuthor + projectList[index] = _idToId(projectList[index]) + } + return projectList + } + return [] +} + +const deleteProjectById = async (projectId) => { + checkDB(db) + + const projectCollection = db.collection(PROJECTS_COLL) + const projectFilterById = filterId(projectId) + const deleted = await projectCollection.deleteOne(projectFilterById) + return deleted +} + +const getMyProjectById = async (userId, projectId) => { + checkDB(db) + + const projectCollection = db.collection(PROJECTS_COLL) + const usersCollection = db.collection(USERS_COLL) + + const userFilterById = filterId(userId) + + const [userAuthor] = await usersCollection.find(userFilterById).toArray() + + const projectFilter = filterId(projectId) + + let [projectMyExist] = await projectCollection.find(projectFilter).toArray() + + const members = await usersCollection.find({ + _id: { + $in: projectMyExist.members.map((memberId) => new ObjectId(memberId)), + }, + }).toArray() + + projectMyExist.members = members.map((m) => ({ + value: m._id, label: m.email, + })) + projectMyExist.author = userAuthor + + projectMyExist = _idToId(projectMyExist) + + return projectMyExist +} + +const newProject = async ({ + title, + code, + userId, + members, +}) => { + checkDB(db) + + if (!title || !code) { + throw new Error('Fields can\'t be empty') + } + + const projectCollection = db.collection(PROJECTS_COLL) + + const project = { + title, + code, + userId, + created: Date.now(), + changed: Date.now(), + changedBy: userId, + taskIndex: 0, + members, + } + + await projectCollection.insertOne(project) + + return _idToId(project) +} + +const updateProject = async ({ projectId, title, code, members }) => { + checkDB(db) + + if (!title || !code) { + throw new Error('Fields can\'t be empty') + } + const projectCollection = db.collection(PROJECTS_COLL) + + const projectFilterById = filterId(projectId) + + const updatedProject = await projectCollection.updateOne(projectFilterById, { + $set: { + title, + code, + changed: Date.now(), + members, + }, + }) + + return updatedProject +} + +// TODO: Совмещение projectId с userId ИЛИ поиск по memberIds +const getProjectById = async ({ projectId }) => { + checkDB(db) + + const projectFilterById = filterId(projectId) + + const projectCollection = db.collection(PROJECTS_COLL) + const [projectExist] = await projectCollection.find(projectFilterById).toArray() + + return projectExist +} + +const getTaskById = async ({ taskId, userId }) => { + checkDB(db) + if (taskId) { + const userFilterById = filterId(userId) + const taskFilterById = filterId(taskId) + + const taskCollection = db.collection(PROJECT_TASKS_COLL) + const usersCollection = db.collection(USERS_COLL) + let [taskExist] = await taskCollection.find(taskFilterById).toArray() + + if (taskExist) { + const [userAuthor] = await usersCollection.find(userFilterById).toArray() + taskExist.author = userAuthor + return _idToId(taskExist) + } + } + return { + } +} + +const createTask = async ({ taskData, authorId, projectId }) => { + checkDB(db) + + const projectCollection = db.collection(PROJECTS_COLL) + const projectFilterById = filterId(projectId) + + const [projectExist] = await projectCollection.find(projectFilterById).toArray() + + if (!projectExist) { + throw new Error('The project not exists [createTask]') + } + + const nextIndex = projectExist.taskIndex + 1 + + const taskCollection = db.collection(PROJECT_TASKS_COLL) + + const { type, status, ...taskRest } = taskData + + const task = { + ...taskRest, + type: Number(type), + status: Number(status), + changed: Date.now(), + created: Date.now(), + taskIndex: nextIndex, + authorId, + projectId, + } + + await projectCollection.updateOne(projectFilterById, { + $set: { + taskIndex: nextIndex, + projectChanged: Date.now(), + }, + }) + + await taskCollection.insertOne(task) + + return _idToId(task) +} + +const getTaskListByProjectId = async ({ projectId }) => { + checkDB(db) + + const projectFilterById = filterId(projectId) + + const projectCollection = db.collection(PROJECTS_COLL) + const [projectExist] = await projectCollection.find(projectId).toArray() + + if (!projectExist) { + throw new Error('The project not exists [getTaskListByProjectId]') + } + + const taskCollection = db.collection(PROJECT_TASKS_COLL) + let taskListCandidate = await taskCollection.find({ + projectId, + }).toArray() + + // if (taskListCandidate.length > 0) { + // for (let index = 0; index < taskListCandidate.length; index++) { + // // const [userAuthor] = await usersCollection.find(userFilterById).toArray() + // // taskListCandidate[index].author = userAuthor + // projectExist[index] = _idToId(projectExist[index]) + // } + // } + + taskListCandidate = _idToIdArray(taskListCandidate) + + return taskListCandidate +} + +const editTask = async ({ taskData, projectId, authorId, taskId }) => { + checkDB(db) + + const taskCollection = db.collection(PROJECT_TASKS_COLL) + const projectCollection = db.collection(PROJECTS_COLL) + + const taskFilterById = filterId(taskId) + const projectFilterById = filterId(projectId) + + const { type, status, ...taskRest } = taskData + + const updatedTask = await taskCollection.updateOne(taskFilterById, { + $set: { + type: Number(type), + status: Number(status), + ...taskRest, + }, + }) + + await projectCollection.updateOne(projectFilterById, { + $set: { + projectChanged: Date.now(), + }, + }) + + return updatedTask +} + +const deleteTaskById = async (taskId) => { + checkDB(db) + + const taskCollection = db.collection(PROJECT_TASKS_COLL) + const taskFilterById = filterId(taskId) + const deleted = await taskCollection.deleteOne(taskFilterById) + return deleted +} + +const getAllUsers = async () => { + checkDB(db) + + const usersCollection = db.collection(USERS_COLL) + + let allUsers = await usersCollection.find().toArray() + + return _idToIdArray(allUsers) +} + +// const getProjectMember = async () => { +// checkDB(db) + +// const usersCollection = db.collection(USERS_COLL) + +// let allUsers = await usersCollection.find().toArray() + +// return _idToIdArray(allUsers) +// } + +const updateProjectMembers = async (projectData, members) => { + checkDB(db) + + const memberCollection = db.collection(PROJECT_MEMBERS_COLL) + + await memberCollection.deleteMany({ + projectId: projectData.id, + }) + + const membersAdd = [] + + for (let memberIndex = 0; memberIndex < members.length; memberIndex++) { + const member = { + projectId: projectData.id, + memberId: members[memberIndex].value, + } + membersAdd.push(member) + } + const { insertedData } = await memberCollection.insertMany(membersAdd) + + return insertedData +} + +module.exports = { + connect, + registrationUser, + signInUser, + getMyProjects, + deleteProjectById, + newProject, + createTask, + editTask, + deleteTaskById, + getTaskListByProjectId, + getProjectById, + getMyProjectById, + getTaskById, + updateProject, + + getAllUsers, + + updateProjectMembers, +} diff --git a/server/routers/easy-project/index.js b/server/routers/easy-project/index.js new file mode 100644 index 0000000..4a3965c --- /dev/null +++ b/server/routers/easy-project/index.js @@ -0,0 +1,15 @@ +const router = require('express').Router() + +router.use('/', require('./auth')) + +router.use((err, req, res, next) => { + res.status(400).send({ + success: false, error: err.message || 'Что-то пошло не так', + }) +}) + +router.use('/projects', require('./projects')) +router.use('/tasks', require('./tasks')) +router.use('/users', require('./users')) + +module.exports = router diff --git a/server/routers/easy-project/middlewares/auth-middleware.js b/server/routers/easy-project/middlewares/auth-middleware.js new file mode 100644 index 0000000..e69de29 diff --git a/server/routers/easy-project/projects.js b/server/routers/easy-project/projects.js new file mode 100644 index 0000000..d72ec45 --- /dev/null +++ b/server/routers/easy-project/projects.js @@ -0,0 +1,116 @@ +const router = require('express').Router() +const { expressjwt: jwt } = require('express-jwt') + +const { JWT_SECRET } = require('./constants') +const { + getMyProjects, + newProject, + getProjectById, + updateProject, + getMyProjectById, + deleteProjectById, + updateProjectMembers, +} = require('./db') +const { requiredFields, responseWrapper, _idToId } = require('./utils') + +router.get('/healthcheck', (req, res) => { + res.send(true) +}) + +router.get('/', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const projectList = await getMyProjects(req.auth.id) + + res.send(responseWrapper(undefined, projectList)) + } catch (e) { + next(e) + } +}) + +router.get('/:projectId', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const { projectId } = req.params + const myProject = await getMyProjectById(req.auth.id, projectId) + + res.send(responseWrapper(undefined, myProject)) + } catch (e) { + next(e) + } +}) + +router.post('/new', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const userId = req.auth.id + const { title, code, members } = req.body + + const project = await newProject({ + title, code, userId, members, + }) + + res.send(responseWrapper(undefined, project)) + } catch (e) { + next(e) + } +}) + +router.post('/delete', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const userId = req.auth.id + const { projectId } = req.body + + const myProject = await getMyProjectById(userId, projectId) + + if (myProject) { + const answered = await deleteProjectById(projectId) + if (answered.result.ok) { + res.send(responseWrapper(undefined)) + } + } + } catch (e) { + next(e) + } +}) + +router.post('/edit', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const userId = req.auth.id + const { projectId, title, code, members } = req.body + + const projectCandidate = await getProjectById({ + projectId, + }) + + if (!projectCandidate) { + throw new Error('The project not exists [project.edit]') + } + + await updateProject({ + projectId, title, code, members, + }) + + const updatedProject = await getProjectById({ + projectId, + }) + + const projectSummary = { + oldData: projectCandidate, + newData: updatedProject, + } + + res.send(responseWrapper(undefined, projectSummary)) + } catch (e) { + next(e) + } +}) + +module.exports = router diff --git a/server/routers/easy-project/tasks.js b/server/routers/easy-project/tasks.js new file mode 100644 index 0000000..b0ae914 --- /dev/null +++ b/server/routers/easy-project/tasks.js @@ -0,0 +1,137 @@ +const router = require('express').Router() +const { expressjwt: jwt } = require('express-jwt') +const ObjectId = require('mongodb').ObjectID + +const { JWT_SECRET } = require('./constants') +const { requiredFields, responseWrapper } = require('./utils') +const { createTask, getTaskListByProjectId, getProjectById, editTask, getTaskById, deleteTaskById } = require('./db') + +router.get('/healthcheck', (req, res) => { + res.send(true) +}) + +router.get('/:projectId', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + const { projectId } = req.params + + const taskList = await getTaskListByProjectId({ + projectId, + }) + + res.send(responseWrapper(undefined, taskList)) +}) + +router.get('/:projectId/:taskId', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + const { projectId, taskId } = req.params + + if (projectId && taskId !== undefined && taskId !== 'undefined') { + const userId = req.auth.id + + const taskDetail = await getTaskById({ + taskId, userId, + }) + + res.send(responseWrapper(undefined, taskDetail)) + } else { + res.send(responseWrapper(undefined, [])) + } +}) + +router.post('/create', requiredFields(['projectId', 'title', 'type', 'status']), jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const authorId = req.auth.id + + const { projectId, ...taskData } = req.body + + const taskCandidate = await createTask({ + taskData, projectId, authorId, + }) + + res.send(responseWrapper(undefined, taskCandidate)) + } catch (e) { + next(e) + } +}) + +router.post('/edit', requiredFields(['projectId', 'taskId', 'title', 'type', 'status']), jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const authorId = req.auth.id + + const { projectId, taskId, ...taskData } = req.body + + const projectCandidate = await getProjectById({ + projectId, + }) + + if (!projectCandidate) { + throw new Error('The project not exists [task.edit.projectCandidate]') + } + + const taskCandidate = await getTaskById({ + taskId, + }) + + if (!taskCandidate) { + throw new Error('The project not exists [task.edit.taskCandidate]') + } + + await editTask({ + taskData, projectId, authorId, taskId, + }) + + const updatedTask = await getTaskById({ + taskId, + }) + + const taskSummary = { + oldData: taskCandidate, + newData: updatedTask, + } + + res.send(responseWrapper(undefined, taskSummary)) + } catch (e) { + next(e) + } +}) + +router.post('/delete', requiredFields(['projectId', 'taskId']), jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + try { + const authorId = req.auth.id + + const { projectId, taskId } = req.body + + const projectCandidate = await getProjectById({ + projectId, + }) + + if (!projectCandidate) { + throw new Error('The project not exists [task.edit.projectCandidate]') + } + + const taskCandidate = await getTaskById({ + taskId, + }) + + if (!taskCandidate) { + throw new Error('The project not exists [task.edit.taskCandidate]') + } + + const answered = await deleteTaskById(taskId) + if (answered.result.ok) { + res.send(responseWrapper(undefined)) + } + } catch (e) { + next(e) + } +}) + +module.exports = router diff --git a/server/routers/easy-project/users.js b/server/routers/easy-project/users.js new file mode 100644 index 0000000..8a535c8 --- /dev/null +++ b/server/routers/easy-project/users.js @@ -0,0 +1,21 @@ +const router = require('express').Router() +const { expressjwt: jwt } = require('express-jwt') +const ObjectId = require('mongodb').ObjectID + +const { JWT_SECRET } = require('./constants') +const { requiredFields, responseWrapper } = require('./utils') +const { getAllUsers } = require('./db') + +router.get('/healthcheck', (req, res) => { + res.send(true) +}) + +router.get('/getForSelect', jwt({ + secret: JWT_SECRET, algorithms: ['HS256'], +}), async (req, res, next) => { + const userList = await getAllUsers() + + res.send(responseWrapper(undefined, userList)) +}) + +module.exports = router diff --git a/server/routers/easy-project/utils.js b/server/routers/easy-project/utils.js new file mode 100644 index 0000000..e6ccf63 --- /dev/null +++ b/server/routers/easy-project/utils.js @@ -0,0 +1,49 @@ +const ObjectId = require('mongodb').ObjectID + +const requiredFields = (fields) => (req, res, next) => { + for (const fieldName of fields) { + if (!req.body[fieldName]) { + throw new Error(`Field ${fieldName} does't set`) + } + } + + next() +} + +const responseWrapper = (error, data, success = true) => ({ + error, data, success, +}) + +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, + ...rest, + } +} + +const _idToIdArray = (arrayData, setAuthor = false) => { + let newArray = [] + for (let index = 0; index < arrayData.length; index++) { + newArray[index] = _idToId(arrayData[index]) + } + return newArray +} + +const checkDB = (db) => { + if (db === null) throw new Error('no db connection') +} + +const filterId = (id) => ({ + _id: new ObjectId(id), +}) + +module.exports = { + checkDB, + requiredFields, + responseWrapper, + _idToId, + _idToIdArray, + filterId, +} diff --git a/server/routers/example/index.js b/server/routers/example/index.js new file mode 100644 index 0000000..85e655e --- /dev/null +++ b/server/routers/example/index.js @@ -0,0 +1,19 @@ +const router = require('express').Router() + +const first = router.get('/first', (req, res) => { + res.send({ + success: true, + warnings: [{ + title: 'Внимание', + text: 'Данный api создан для примера!', + }], + }) + + /** + * Этот эндпоинт будет доступен по адресу http://89.223.91.151:8080/multystub/example/first + */ +}) + +router.use('/example-api', first) + +module.exports = router diff --git a/server/routers/hub-video/index.js b/server/routers/hub-video/index.js new file mode 100644 index 0000000..c1755a2 --- /dev/null +++ b/server/routers/hub-video/index.js @@ -0,0 +1,11 @@ +const { getIo } = require('../../io') + +const io = getIo() + +io.on('connection', (socket) => { + socket.on('play', () => { + socket.broadcast.emit('play') + }) +}) + +console.log('test') diff --git a/server/routers/music-learn/index.js b/server/routers/music-learn/index.js new file mode 100644 index 0000000..5b3578d --- /dev/null +++ b/server/routers/music-learn/index.js @@ -0,0 +1,51 @@ +const router = require('express').Router() + +router.get('/courses', (req, res) => { + res.send(require('./mocks/courses/success.json')) +}) + +router.get('/courses/1', (req, res) => { + res.send(require('./mocks/courses/1/success.json')) +}) + +router.get('/notes', (req, res) => { + res.send(require('./mocks/notes/success.json')) +}) + +router.get('/user/courses', (req, res) => { + res.send(require('./mocks/user/courses/success.json')) +}) + +router.post('/user/courses', (req, res) => { + res.send(require('./mocks/user/courses/add/success.json')) +}) + +router.get('/user/notes', (req, res) => { + res.send(require('./mocks/user/notes/success.json')) +}) + +router.get('/user', (req, res) => { + res.send(require('./mocks/user/success.json')) +}) + +router.post('/user', (req, res) => { + res.send(require('./mocks/user/success.json')) +}) + +router.post('/login', (req, res) => { + if (req.body.login === 'error' || req.body.password === 'error') { + return res.status(401).send({ + message: 'Unauthorized Error', + }) + } + + res.send(require('./mocks/user/login/success.json')) + return null +}) + +router.get('/logout', (req, res) => { + res.send(require('./mocks/user/logout/success.json')) +}) +/* eslint-enable global-require */ + +module.exports = router diff --git a/server/routers/music-learn/mocks/courses/1/success.json b/server/routers/music-learn/mocks/courses/1/success.json new file mode 100644 index 0000000..c540c83 --- /dev/null +++ b/server/routers/music-learn/mocks/courses/1/success.json @@ -0,0 +1,5 @@ +{ + "key": 1, + "name": "Mock course 1", + "href": "/" +} diff --git a/server/routers/music-learn/mocks/courses/success.json b/server/routers/music-learn/mocks/courses/success.json new file mode 100644 index 0000000..68ab110 --- /dev/null +++ b/server/routers/music-learn/mocks/courses/success.json @@ -0,0 +1,77 @@ +[ + { + "key": 1, + "name": "Mock course 1", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 2, + "name": "Mock course 2", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 3, + "name": "Mock course 3", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + }, + { + "key": 4, + "name": "Mock course 4", + "href": "https://www.youtube.com/watch?v=kLFkT3LBWzA" + }, + { + "key": 5, + "name": "Mock course 5", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 6, + "name": "Mock course 6", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 7, + "name": "Mock course 7", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + }, + { + "key": 8, + "name": "Mock course 8", + "href": "https://www.youtube.com/watch?v=kLFkT3LBWzA" + }, + { + "key": 9, + "name": "Mock course 9", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 10, + "name": "Mock course 10", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 11, + "name": "Mock course 11", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + }, + { + "key": 12, + "name": "Mock course 12", + "href": "https://www.youtube.com/watch?v=kLFkT3LBWzA" + }, + { + "key": 13, + "name": "Mock course 13", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 14, + "name": "Mock course 14", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 15, + "name": "Mock course 15", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + } +] diff --git a/server/routers/music-learn/mocks/notes/success.json b/server/routers/music-learn/mocks/notes/success.json new file mode 100644 index 0000000..d74e075 --- /dev/null +++ b/server/routers/music-learn/mocks/notes/success.json @@ -0,0 +1,13 @@ +[ + { "key": 1, "name": "Music Sheet 1", "href": "/" }, + { "key": 2, "name": "Music Sheet 2", "href": "/" }, + { "key": 3, "name": "Music Sheet 3", "href": "/" }, + { "key": 4, "name": "Music Sheet 4", "href": "/" }, + { "key": 5, "name": "Music Sheet 5", "href": "/" }, + { "key": 6, "name": "Music Sheet 6", "href": "/" }, + { "key": 7, "name": "Music Sheet 7", "href": "/" }, + { "key": 8, "name": "Music Sheet 8", "href": "/" }, + { "key": 9, "name": "Music Sheet 9", "href": "/" }, + { "key": 10, "name": "Music Sheet 10", "href": "/" }, + { "key": 11, "name": "Music Sheet 11", "href": "/" } +] diff --git a/server/routers/music-learn/mocks/user/courses/add/success.json b/server/routers/music-learn/mocks/user/courses/add/success.json new file mode 100644 index 0000000..24745a2 --- /dev/null +++ b/server/routers/music-learn/mocks/user/courses/add/success.json @@ -0,0 +1,3 @@ +{ + "status": 500 +} diff --git a/server/routers/music-learn/mocks/user/courses/success.json b/server/routers/music-learn/mocks/user/courses/success.json new file mode 100644 index 0000000..3668483 --- /dev/null +++ b/server/routers/music-learn/mocks/user/courses/success.json @@ -0,0 +1,37 @@ +[ + { + "key": 1, + "name": "My course 1", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 2, + "name": "My course 2", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 3, + "name": "My course 3", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + }, + { + "key": 4, + "name": "My course 4", + "href": "https://www.youtube.com/watch?v=kLFkT3LBWzA" + }, + { + "key": 5, + "name": "My course 5", + "href": "https://www.youtube.com/watch?v=827jmswqnEA" + }, + { + "key": 6, + "name": "My course 6", + "href": "https://www.youtube.com/watch?v=bzNKQ2FkEJI" + }, + { + "key": 7, + "name": "My course 7", + "href": "https://www.youtube.com/watch?v=EHI3e75zHis" + } +] diff --git a/server/routers/music-learn/mocks/user/login/success.json b/server/routers/music-learn/mocks/user/login/success.json new file mode 100644 index 0000000..24745a2 --- /dev/null +++ b/server/routers/music-learn/mocks/user/login/success.json @@ -0,0 +1,3 @@ +{ + "status": 500 +} diff --git a/server/routers/music-learn/mocks/user/logout/success.json b/server/routers/music-learn/mocks/user/logout/success.json new file mode 100644 index 0000000..24745a2 --- /dev/null +++ b/server/routers/music-learn/mocks/user/logout/success.json @@ -0,0 +1,3 @@ +{ + "status": 500 +} diff --git a/server/routers/music-learn/mocks/user/notes/success.json b/server/routers/music-learn/mocks/user/notes/success.json new file mode 100644 index 0000000..a7a37b9 --- /dev/null +++ b/server/routers/music-learn/mocks/user/notes/success.json @@ -0,0 +1,7 @@ +[ + { "key": 1, "name": "Music Sheet 1", "href": "/" }, + { "key": 2, "name": "Music Sheet 2", "href": "/" }, + { "key": 3, "name": "Music Sheet 3", "href": "/" }, + { "key": 4, "name": "Music Sheet 4", "href": "/" }, + { "key": 5, "name": "Music Sheet 5", "href": "/" } +] diff --git a/server/routers/music-learn/mocks/user/success.json b/server/routers/music-learn/mocks/user/success.json new file mode 100644 index 0000000..a2dc2e3 --- /dev/null +++ b/server/routers/music-learn/mocks/user/success.json @@ -0,0 +1,6 @@ +{ + "id": 88, + "email": "current.user@example.com", + "login": "userlogin@564", + "password": "1234568" +} diff --git a/server/routers/neptunium/index.js b/server/routers/neptunium/index.js new file mode 100644 index 0000000..b91f560 --- /dev/null +++ b/server/routers/neptunium/index.js @@ -0,0 +1,226 @@ +const router = require('express').Router() + +let labels = [ + { + color: 'D50101', + title: 'Важное', + }, + { + color: 'F4511E', + title: 'Дом', + }, + { + color: 'F5BF25', + title: 'Работа', + }, + { + color: '0B8043', + title: 'Дача', + }, + { + color: '0C9CE5', + title: 'Аниме', + }, + { + color: 'E67C73', + title: 'Синий', + }, + { + color: '33B679', + title: 'Грабежи', + }, + { + color: '8E24AA', + title: 'Оранжевый', + }, +] + +const todos = [ + { + id: 0, + completed: false, + title: 'Съесть деда', + labels: [ + { + color: 'D50101', + title: 'Важное', + }, + { + color: 'F4511E', + title: 'Дом', + }, + ], + description: 'Lorem ipsum dolor sit amet.', + completeDate: 567800000000, + }, + { + id: 1, + completed: false, + title: 'гав', + labels: [ + { + color: '0B8043', + title: 'Дача', + }, + { + color: '0C9CE5', + title: 'Аниме', + }, + { + color: 'F5BF25', + title: 'Работа', + }, + ], + description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur, laboriosam.', + completeDate: 1997800000000, + }, + { + id: 2, + completed: true, + title: 'Мяу', + labels: [ + { + color: 'E67C73', + title: 'Синий', + }, + { + color: '33B679', + title: 'Грабежи', + }, + { + color: '8E24AA', + title: 'Оранжевый', + }, + ], + description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur, laboriosam.', + completeDate: 1997800000000, + }, + { + id: 3, + completed: false, + title: 'Неудаляемая', + labels: [ + { + color: 'E67C73', + title: 'Синий', + }, + { + color: '33B679', + title: 'Грабежи', + }, + { + color: '8E24AA', + title: 'Оранжевый', + }, + ], + description: 'Lorem ipsum dolor sit amet consectetur adipisicing elit. Consectetur, laboriosam.', + completeDate: 1997800000000, + }, +] + +const ErrorHandler = (error, _req, res) => { + const statusCode = res.statusCode || 500 + res.status(statusCode) + res.json({ + message: error.message, + stack: process.env.NODE_ENV === 'production' ? '🥑' : error.stack, + }) +} + +try { + router.post('/signup', (_req, _res, next) => { + setTimeout(next, 1000) + }, (_req, res) => { + res.status(200).send({ + accessToken: 'jhbdhbfsuhbvhsfbvuhsbfuvhsbfu', + }) + }) + + router.post('/login', (_req, _res, next) => { + setTimeout(next, 1000) + }, (req, res) => { + if (req.body.password !== 'pass') res.status(401).send('Wrong password!') + else { + res.status(200).send({ + accessToken: 'lfhjvbfealihvbsfjlh', + }) + } + }) + + router.get('/user', (_req, res) => { + res.send({ + username: 'stalin', + email: 'vozhd@kgb.ussr', + }) + }) + + router.put('/user/username', (req, res) => { + if (req.body.username === 'error') { + res.status(500).send() + } else { + res.status(201).send() + } + }) + + router.put('/user/password', (_req, res) => { + res.status(201).send() + }) + + router.get('/labels', (_req, res) => { + res.send(labels) + }) + + router.patch('/label', (_req, res) => { + res.status(201).send() + }) + + router.put('/labels', (_req, res) => { + res.status(201).send() + }) + + router.get('/todos', (_req, res) => { + res.send({ + todos, + }) + }) + + router.post('/todo', (_req, _res, next) => { + setTimeout(next, 1000) + }, (req, res) => { + if (req.body.title === 'error') { + res.status(500).send() + } else { + res.status(204).send() + } + }) + + router.put('/todo', (_req, _res, next) => { + setTimeout(next, 300) + }, (req, res) => { + if (req.body.todo.title === 'error' || req.body.todo.title === 'Неудаляемая') { + res.status(500).send() + } else { + res.status(201).send() + } + }) + + router.delete('/todo', (_req, _res, next) => { + setTimeout(next, 300) + }, (req, res) => { + if (req.body.id === 3) { + res.status(500).send() + } else { + res.status(204).send() + } + }) + + router.patch('/todo', (_req, res) => { + res.status(204).send() + }) + + router.use(ErrorHandler) +} catch (e) { + console.error(e) +} + +module.exports = router diff --git a/server/routers/publicium/index.js b/server/routers/publicium/index.js new file mode 100644 index 0000000..a697a5f --- /dev/null +++ b/server/routers/publicium/index.js @@ -0,0 +1,42 @@ +const { Router, json } = require('express') +const cors = require('cors') + +const router = Router() + +router.use(json()) + +if (process.env.NODE_ENV !== 'production') { + router.use(cors()) +} + +router.get('/games/trending', (req, res) => res.status(200).send(require('./mocks/games/trending.json'))) + +router.get('/users/top-load', (req, res) => res.status(200).send(require('./mocks/users/top-load.json'))) + +router.get('/maps/trending', (req, res) => res.status(200).send(require('./mocks/maps/trending.json'))) + +router.get('/search', (req, res) => res.status(200).send(require('./mocks/search.json'))) + +router.get('/games', (req, res) => res.status(200).send(require('./mocks/games.json'))) +router.get('/games/:id', (req, res) => { + const games = require('./mocks/games.json') + + const game = games.find((game) => game.id === Number.parseInt(req.params.id, 10)) + + if (!game) { + return res.status(404).send({ + code: -3, + message: 'Game not found', + }) + } + + res.status(200).send(game) +}) + +router.get('/users/:id', (req, res) => res.status(200).send(require('./mocks/users/12.json'))) + +router.get('/users/:id/collection', (req, res) => res.status(200).send(require('./mocks/users/12/collection.json'))) + +router.get('/maps/by/:id', (req, res) => res.send(require('./mocks/maps/by/id.json'))) + +module.exports = router diff --git a/server/routers/publicium/mocks/games.json b/server/routers/publicium/mocks/games.json new file mode 100644 index 0000000..34184f2 --- /dev/null +++ b/server/routers/publicium/mocks/games.json @@ -0,0 +1,17 @@ +[ + { + "id": 1, + "name": "Black Mesa", + "logo": "bms" + }, + { + "id": 12, + "name": "Minecraft", + "logo": "mc" + }, + { + "id": 31, + "name": "CS: GO", + "logo": "csgo" + } +] \ No newline at end of file diff --git a/server/routers/publicium/mocks/games/trending.json b/server/routers/publicium/mocks/games/trending.json new file mode 100644 index 0000000..91593cc --- /dev/null +++ b/server/routers/publicium/mocks/games/trending.json @@ -0,0 +1,22 @@ +[ + { + "id": 1, + "name": "Black Mesa", + "logo": "bms" + }, + { + "id": 12, + "name": "Minecraft", + "logo": "mc" + }, + { + "id": 31, + "name": "CS: GO", + "logo": "csgo" + }, + { + "id": 43, + "name": "Left 4 Dead", + "logo": "l4d" + } +] \ No newline at end of file diff --git a/server/routers/publicium/mocks/maps/by/id.json b/server/routers/publicium/mocks/maps/by/id.json new file mode 100644 index 0000000..d09110e --- /dev/null +++ b/server/routers/publicium/mocks/maps/by/id.json @@ -0,0 +1,20 @@ +[ + { + "id": 302, + "name": "Lambda Core 1", + "logo": "lambda-1.png", + "game": 1 + }, + { + "id": 21, + "name": "Xen Factory 2", + "logo": "bms-xen2.png", + "game": 1 + }, + { + "id": 5, + "name": "Office Complex 4", + "logo": "bms-office4.png", + "game": 1 + } +] diff --git a/server/routers/publicium/mocks/maps/trending.json b/server/routers/publicium/mocks/maps/trending.json new file mode 100644 index 0000000..aa590ab --- /dev/null +++ b/server/routers/publicium/mocks/maps/trending.json @@ -0,0 +1,26 @@ +[ + { + "id": 302, + "name": "Lambda Core 1", + "logo": "lambda-1.png", + "game": 1 + }, + { + "id": 12, + "name": "Inferno", + "logo": "csgo-inferno.png", + "game": 31 + }, + { + "id": 43, + "name": "Ice Spikes", + "logo": "mc-icespk.png", + "game": 12 + }, + { + "id": 9, + "name": "Dust 2", + "logo": "csgo-dust2.png", + "game": 31 + } +] \ No newline at end of file diff --git a/server/routers/publicium/mocks/search.json b/server/routers/publicium/mocks/search.json new file mode 100644 index 0000000..a9cf18a --- /dev/null +++ b/server/routers/publicium/mocks/search.json @@ -0,0 +1,28 @@ +[ + { + "type": "game", + "item": { + "id": 1, + "name": "Black Mesa", + "logo": "bms-logo.png" + } + }, + { + "type": "map", + "item": { + "id": 302, + "name": "Lambda Core 1", + "logo": "lambda-1.png", + "game": 1 + } + }, + { + "type": "map", + "item": { + "id": 21, + "name": "Xen Factory 2", + "logo": "bms-xen2.png", + "game": 1 + } + } +] \ No newline at end of file diff --git a/server/routers/publicium/mocks/users/12.json b/server/routers/publicium/mocks/users/12.json new file mode 100644 index 0000000..a00088d --- /dev/null +++ b/server/routers/publicium/mocks/users/12.json @@ -0,0 +1,5 @@ +{ + "id": 12, + "name": "Gordon Freeman", + "avatar": "user.png" +} \ No newline at end of file diff --git a/server/routers/publicium/mocks/users/12/collection.json b/server/routers/publicium/mocks/users/12/collection.json new file mode 100644 index 0000000..263f505 --- /dev/null +++ b/server/routers/publicium/mocks/users/12/collection.json @@ -0,0 +1,40 @@ +[ + { + "game": 1, + "maps": [ + { + "id": 302, + "name": "Lambda Core 1", + "logo": "lambda-1.png", + "game": 1, + "size": 12280 + }, + { + "id": 21, + "name": "Xen Factory 2", + "logo": "bms-xen2.png", + "game": 1, + "size": 14760 + }, + { + "id": 5, + "name": "Office Complex 4", + "logo": "bms-office4.png", + "game": 1, + "size": 9810 + } + ] + }, + { + "game": 12, + "maps": [ + { + "id": 43, + "name": "Ice Spikes", + "logo": "mc-icespk.png", + "game": 12, + "size": 43210 + } + ] + } +] \ No newline at end of file diff --git a/server/routers/publicium/mocks/users/top-load.json b/server/routers/publicium/mocks/users/top-load.json new file mode 100644 index 0000000..034ec41 --- /dev/null +++ b/server/routers/publicium/mocks/users/top-load.json @@ -0,0 +1,22 @@ +[ + { + "id": 1, + "name": "Foo Bar", + "avatar": "user.png" + }, + { + "id": 31, + "name": "Holy Radar", + "avatar": "user.png" + }, + { + "id": 12, + "name": "Gordon Freeman", + "avatar": "user.png" + }, + { + "id": 43, + "name": "Portator Defunctorum", + "avatar": "user.png" + } +] \ No newline at end of file diff --git a/server/routers/stc-21-03/controllers.js b/server/routers/stc-21-03/controllers.js new file mode 100644 index 0000000..1567c93 --- /dev/null +++ b/server/routers/stc-21-03/controllers.js @@ -0,0 +1,107 @@ +const { getDB } = require('../../utils/mongo') + +let db = null + +const connect = async () => { + db = await getDB('stc-21-03') +} + +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, ...rest, + } +} + +const FILM_TOMATOS_COLL = 'films-tomatos' +const getFilmData = async (filmId) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + const newData = { + filmId, + views: 0, + ratings: [], + likes: 0, + } + + filmsCollection.insertMany([newData]) + + return _idToId(newData) + } + const filmData = data[0] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + views: ++filmData.views, + }, + }, + ]) + return _idToId(filmData) +} + +const setLike = async (filmId) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + throw new Error('no film data') + } + + const filmData = data[0] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + likes: ++filmData.likes, + }, + }, + ]) + return _idToId(filmData) +} + +const setRating = async ({ filmId, rating }) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + throw new Error('no film data') + } + + const filmData = data[0] + filmData.ratings = [...filmData.ratings, rating] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + ratings: filmData.ratings, + }, + }, + ]) + return _idToId(filmData) +} + +module.exports = { + connect, + getFilmData, + setLike, + setRating, +} diff --git a/server/routers/stc-21-03/index.js b/server/routers/stc-21-03/index.js new file mode 100644 index 0000000..ca9eb7f --- /dev/null +++ b/server/routers/stc-21-03/index.js @@ -0,0 +1,94 @@ +const router = require('express').Router() + +const { connect, getFilmData, setLike, setRating } = require('./controllers') +const { getAnswer } = require('../../utils/common') + +connect() + +router.get('/film/:id', async (req, res) => { + const data = await getFilmData(req.params.id) + res.send(getAnswer(null, data)) +}) + +router.post('/film/:id/rating', async (req, res) => { + const filmData = await setRating({ + filmId: req.params.id, rating: req.body.rating, + }) + res.send(getAnswer(null, filmData)) +}) + +router.post('/film/:id/like', async (req, res) => { + const filmData = await setLike(req.params.id) + res.send(getAnswer(null, filmData)) +}) + +const first = router.all('/feedback', (req, res) => { + setTimeout(() => { + res.send({ + success: true, + body: { + ...req.query, ...req.body, + }, + }) + }, 1000) + + /** + * Этот эндпоинт будет доступен по адресу http://inno-ijl.ru/multystub/stc-21-03/feedback + */ +}) + +function idGen() { + let i = 1 + return () => i++ +} + +const getId = idGen() + +let posts = [ + { + id: getId(), + link: 'https://www.unian.net/russianworld/v-rossii-na-bereg-zaliva-vybrosilo-tonny-ikry-mestnye-udobryayut-eyu-ogorody-video-novosti-rossii-11420710.html', + header: 'В России на берег залива выбросило тонны икры: местные удобряют ею огороды (видео)', + poster: 'images/1.jpeg', + text: `На побережье залива Анива в Сахалинской области РФ штормом выбросило тонны икры тихоокеанской сельди сахалино-хоккайдского стада. Об этом на своей странице в Facebook рассказал глава общественной организации "Экологическая вахта Сахалина" Дмитрий Лисицын. + По его словам, икру косяки сельди ранее отметали недалеко от берега, а теперь ее сплошная полоса шириной в несколько метров растянулась по побережью примерно на 3 км. Толщина слоя икры местами достигает 10-15 см.`, + }, + { + id: getId(), + link: 'https://www.unian.net/curiosities/zhenshchina-postirala-vyigryshnyy-bilet-na-26-millionov-dollarov-poslednie-novosti-11420341.html', + header: 'Женщина постирала выигрышный билет на 26 миллионов долларов', + poster: 'images/2.webp', + text: `Американка случайно постирала со штанами выигрышный лотерейный билет на 26 миллионов долларов. +Женщина приобрела лотерею еще в ноябре в пригороде Лос-Анджелеса. Однако за выигрышем она пришла тогда, когда истекал крайний срок – через 180 дней. В магазине американка отметила, что не может показать билет, поскольку постирала его в кармане одежды. +В то же время представитель калифорнийской лотереи Кэти Джонстон заявила, что отснятого материала (имея в виду кадры с камер видеонаблюдения, на которые попала покупатель) недостаточно, чтобы выдать призовые деньги женщине.`, + }, +] + +const getPosts = (req, res) => { + setTimeout(() => { + res.send({ + success: true, body: posts, + }) + }, 1000) + + /** + * Этот эндпоинт будет доступен по адресу http://89.223.91.151:8080/multystub/stc-21-03/posts + */ +} + +const addPost = (req, res) => { + posts.push({ + id: getId(), ...req.body, + }) + setTimeout(() => { + res.send({ + success: true, body: posts, + }) + }, 1000) +} + +router.get('/posts', getPosts) +router.post('/posts', addPost) +router.use('/', first) + +module.exports = router diff --git a/server/routers/stc-22-24/controller.js b/server/routers/stc-22-24/controller.js new file mode 100644 index 0000000..6401b42 --- /dev/null +++ b/server/routers/stc-22-24/controller.js @@ -0,0 +1,198 @@ +const ObjectId = require('mongodb').ObjectID + +const { getDB } = require('../../utils/mongo') +const dishData = require('./data/dishdata.json') +const tabsData = require('./data/tabs.json') +const { getResponse, _idToIdArray, _idToId } = require('./utils/common') + +const DISH_COLLECTION = 'default_dishes' +const TAB_COLLECTION = 'default_tabs' +const USER_COLLECTION = 'users' + +const _idRemove = (data) => { + const { _id, ...rest } = data + + return { + _id: undefined, + ...rest, + } +} + +let db = null + +const connect = async () => { + db = await getDB('dish') +} + +const init = async () => { + await connect() + const dishesCollection = db.collection(DISH_COLLECTION) + const findDish = await dishesCollection.find({ + }).toArray() + if (findDish.length === 0) { + await dishesCollection.insertMany(dishData) + } + const tabsCollection = db.collection(TAB_COLLECTION) + const findTabs = await tabsCollection.find({ + }).toArray() + if (findTabs.length === 0) { + await tabsCollection.insertMany(tabsData) + } + const usersCollection = db.collection(USER_COLLECTION) +} + +init() + +const getDish = async () => { + if (db === null) throw new Error('no db connection') + try { + const dishesCollection = db.collection(DISH_COLLECTION) + const defaultDishes = await dishesCollection.find({}).toArray() + return _idToIdArray(defaultDishes) + } catch (e) { + throw new Error(e) + } +} + +const getTabs = async () => { + if (db === null) throw new Error('no db connection') + try { + const tabsCollection = db.collection(TAB_COLLECTION) + const defaultTabs = await tabsCollection.find({}).toArray() + return _idToIdArray(defaultTabs) + } catch (e) { + throw new Error(e) + } +} + +const updateTab = async (id, timestampsNew) => { + if (db === null) throw new Error('no db connection') + try { + const tabsCollection = db.collection(TAB_COLLECTION) + const findData = await tabsCollection.findOne({ + _id: new ObjectId(id), + }) + if (!findData) throw new Error('Tabs is not exist') + const filter = { + _id: new ObjectId(id), + } + const options = { + upsert: false, + } + const updateDoc = { + $set: { + timeStamps: timestampsNew, + }, + } + const result = await tabsCollection.updateOne(filter, updateDoc, options) + return _idToId(result) + } catch (e) { + throw new Error(e) + } +} + +const getUsers = async () => { + if (db === null) throw new Error('no db connection') + try { + const usersCollection = db.collection(USER_COLLECTION) + const users = await usersCollection.find({ + }).project({ + _id: 0, + }).toArray() + return _idToIdArray(users) + } catch (e) { + throw new Error(e) + } +} + +const getUserByEmail = async ({ email }) => { + if (db === null) throw new Error('no db connection') + try { + const usersCollection = db.collection(USER_COLLECTION) + const user = await usersCollection.findOne( + { + email, + }, + { + projection: + { + _id: 0, + }, + }, + ) + return user + } catch (e) { + throw new Error(e) + } +} + +const addUser = async ({ email, hash }) => { + if (db === null) throw new Error('no db connection') + try { + const usersCollection = db.collection(USER_COLLECTION) + const user = await usersCollection.findOne( + { + email, + }, + ) + if (user) throw new Error('User is exist') + const insertData = await usersCollection.insertOne( + { + email, + hash, + }, + ) + const { insertedCount, ops } = insertData + if (insertedCount) { + return _idRemove(ops[0]) + } + throw new Error('insert error') + } catch (e) { + throw new Error(e) + } +} + +const getDishById = async ({ id }) => { + if (db === null) throw new Error('no db connection') + try { + const dishesCollection = db.collection(DISH_COLLECTION) + const dish = await dishesCollection.findOne( + { + _id: new ObjectId(id), + }, + ) + return _idToId(dish) + } catch (e) { + throw new Error(e) + } +} + +const getDishByCategory = async ({ cat, id }) => { + if (db === null) throw new Error('no db connection') + try { + const dishesCollection = db.collection(DISH_COLLECTION) + const dish = await dishesCollection.find( + { + _id: + { + $ne: new ObjectId(id), + }, + category: cat, + }, + ).toArray() + return _idToIdArray(dish) + } catch (e) { + throw new Error(e) + } +} + +module.exports = { + getDish, + getTabs, + getDishById, + getDishByCategory, + getUsers, + addUser, + getUserByEmail, + updateTab, +} diff --git a/server/routers/stc-22-24/data/dishdata.json b/server/routers/stc-22-24/data/dishdata.json new file mode 100644 index 0000000..6680232 --- /dev/null +++ b/server/routers/stc-22-24/data/dishdata.json @@ -0,0 +1,116 @@ +[ + { + "category": "Salads", + "title": "Qwerty salad", + "image": "qwertysalad.jpg", + "price": 244, + "description": "Fragrant crispy keys dressed with coffee, beer or coca-cola" + }, + { + "category": "Salads", + "title": "Fibonacci salad", + "image": "fibonaccisalad.jpg", + "price": 199, + "description": "Refined taste of yesterday salad, complimented by salad from two days ago" + }, + { + "category": "Salads", + "title": "RNG salad", + "image": "rngsalad.jpg", + "price": 317, + "description": "Exquisite original taste of fully natural, randomly generated numbers" + }, + { + "category": "Salads", + "title": "Merge request", + "image": "mergerequestsalad.jpg", + "price": 241, + "description": "Non-merged salad, ideal for merge conflicts intolerance" + }, + { + "category": "CFood", + "title": "SalmON", + "image": "salmon.jpg", + "price": 441, + "description": "Salmon with user-friendly interface" + }, + { + "category": "CFood", + "title": "SalmOFF", + "image": "salmoff1.jpg", + "price": 16, + "description": "The pink Salmon skeleton is perfect for research and debugging" + }, + { + "category": "CFood", + "title": "Develobster", + "image": "develobster.jpg", + "price": 1024, + "description": "High skilled senior frontend develobster" + }, + { + "category": "CFood", + "title": "8-bit Octopus", + "image": "octopus1.jpg", + "price": 500, + "description": "8-bit Octopus summary" + }, + { + "category": "Soups", + "title": "Hooks & props", + "image": "hookspropssoup.jpg", + "price": 411, + "description": "A rich fragrant soup with a large set of properties and states that is easy to hook" + }, + { + "category": "Soups", + "title": "Float points", + "image": "floatpointsoup.jpg", + "price": 433, + "description": "A light soup, the original taste and unique aroma of which is provided by floating points" + }, + { + "category": "Soups", + "title": "BorscHTML", + "image": "borschtml.jpg", + "price": 422, + "description": "Marked up by sour cream soup based on thoroughly tested bit-root" + }, + { + "category": "Soups", + "title": "Try-catch", + "image": "trycatch3.jpg", + "price": 455, + "description": "Soup for real gourmets familiar with advanced try-catch technologies" + }, + { + "category": "Desserts", + "title": "Fractal", + "image": "fractal3.jpg", + "price": 378, + "description": "Self-similar fractal produced by recursion from dark chocolate and cream" + }, + { + "category": "Desserts", + "title": "Debugged apple", + "image": "apple.jpg", + "price": 85, + "description": "Eco-friendly apple debugged and tested in the most thorough way" + }, + { + "category": "Desserts", + "title": "Cookies", + "image": "cookies2.jpg", + "price": 111, + "description": "We also use cookies, but not for this" + }, + { + "category": "Desserts", + "title": "Syntactic sugar", + "image": "sugar.jpg", + "price": 100, + "description": "Syntactic sugar which make it easier for humans to code. Enjoy it!" + } +] + + diff --git a/server/routers/stc-22-24/data/tabs.json b/server/routers/stc-22-24/data/tabs.json new file mode 100644 index 0000000..d27a9dd --- /dev/null +++ b/server/routers/stc-22-24/data/tabs.json @@ -0,0 +1,137 @@ +[ + { + "location": [ + [0, 1], + [1, 1], + [1, 0] + ], + "timeStamps": ["2022-12-12", "2022-12-13"] + }, + { + "location": [ + [1, 1, 1], + [0, 1, 0] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 1], + [0, 1], + [0, 1] + ], + "timeStamps": ["2022-12-13", "2022-12-14"] + }, + { + "location": [ + [1, 1], + [1, 0], + [1, 0] + ], + "timeStamps": ["2022-12-14"] + }, + { + "location": [ + [1, 1], + [1, 1] + ], + "timeStamps": ["2022-12-15", "2022-12-16"] + }, + { + "location": [ + [1, 0], + [1, 1], + [0, 1] + ], + "timeStamps": ["2022-12-15"] + }, + { + "location": [ + [1, 0], + [1, 1], + [1, 0] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 1], + [1, 1] + ], + "timeStamps": ["2022-12-12"] + }, + { + "location": [ + [0, 1], + [1, 1], + [0, 1] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 0], + [1, 0], + [1, 1] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 0], + [1, 1], + [0, 1] + ], + "timeStamps": [] + }, + { + "location": [ + [0, 1], + [0, 1], + [1, 1] + ], + "timeStamps": [] + }, + { + "location": [ + [0, 1, 1], + [1, 1, 0] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 1, 1], + [0, 1, 0] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 1, 1], + [1, 0, 0] + ], + "timeStamps": [] + }, + { + "location": [ + [1, 0, 0], + [1, 1, 1] + ], + "timeStamps": [] + }, + { + "location": [ + [0, 1, 0], + [1, 1, 1] + ], + "timeStamps": ["2022-12-12"] + }, + { + "location": [ + [0, 0, 1], + [1, 1, 1] + ], + "timeStamps": ["2022-12-13"] + } +] diff --git a/server/routers/stc-22-24/index.js b/server/routers/stc-22-24/index.js new file mode 100644 index 0000000..f8ccda8 --- /dev/null +++ b/server/routers/stc-22-24/index.js @@ -0,0 +1,8 @@ +const router = require('express').Router() + +router.use('/auth', require('./routes/auth')) +router.use('/dish', require('./routes/dish')) +router.use('/reservation', require('./routes/reservation')) +router.use('/order', require('./routes/order')) + +module.exports = router diff --git a/server/routers/stc-22-24/midlewares/checkRequired.midleware.js b/server/routers/stc-22-24/midlewares/checkRequired.midleware.js new file mode 100644 index 0000000..0d62845 --- /dev/null +++ b/server/routers/stc-22-24/midlewares/checkRequired.midleware.js @@ -0,0 +1,12 @@ +const checkRequiredMidleware = (options) => (req, res, next) => { + // eslint-disable-next-line no-restricted-syntax + for (const option of options) { + if (!req.body[option]) { + res.status(400).send(`Required field ${option} is not present`) + return + } + } + next() +} + +module.exports = checkRequiredMidleware diff --git a/server/routers/stc-22-24/routes/auth.js b/server/routers/stc-22-24/routes/auth.js new file mode 100644 index 0000000..2d9ffe0 --- /dev/null +++ b/server/routers/stc-22-24/routes/auth.js @@ -0,0 +1,47 @@ +const authRouter = require('express').Router() +const jwt = require('jsonwebtoken') +const bcrypt = require('bcrypt') +const { JWT_TOKEN, SALT } = require('./key') +const { getResponse } = require('../utils/common') +const { getUsers, addUser, getUserByEmail } = require('../controller') +const checkRequiredMidleware = require('../midlewares/checkRequired.midleware') + +authRouter.get('/users', async (req, res) => { + let error = null + const dishData = await getUsers().catch((e) => error = e.message) + res.send(getResponse(error, dishData)) +}) + +authRouter.post( + '/register', + checkRequiredMidleware(['email', 'password']), + async (req, res) => { + const { email, password } = req.body + const hash = await bcrypt.hash(password, SALT) + let error = null + const user = await addUser({ email, hash }).catch((e) => error = e.message) + res.send(getResponse(error, user)) + }, +) + +authRouter.post( + '/login', + checkRequiredMidleware(['email', 'password']), + async (req, res) => { + const { email, password } = req.body; + let error = null + const user = await getUserByEmail({ email }).catch((e) => error = e.message) + if (user) { + const passwordCorrect = await bcrypt.compare(password, user.hash) + if (passwordCorrect) { + // eslint-disable-next-line no-undef + const token = jwt.sign({ email }, JWT_TOKEN) + res.send({ email, token }) + return + } + } + res.status(400).send('Incorrect email or password') + }, +) + +module.exports = authRouter diff --git a/server/routers/stc-22-24/routes/dish.js b/server/routers/stc-22-24/routes/dish.js new file mode 100644 index 0000000..32aa356 --- /dev/null +++ b/server/routers/stc-22-24/routes/dish.js @@ -0,0 +1,33 @@ +const dishRouter = require('express').Router() +const ObjectId = require('mongodb').ObjectID +const { getResponse } = require('../utils/common') +const { getDish, getTabs, getDishById, getDishByCategory } = require('../controller') + +dishRouter.get('/', async (req, res) => { + let error = null + const dishData = await getDish().catch((e) => error = e.message) + res.send(getResponse(error, dishData)) +}) + +dishRouter.get('/reservation', async (req, res) => { + let error = null + const tabData = await getTabs().catch((e) => error = e.message) + res.send(getResponse(error, tabData)) +}) + +dishRouter.get('/alsolike/:dishId', async (req, res) => { + let error = null + const dish = await getDishById({ id: req.params.dishId }).catch((e) => error = e.message) + const categoryArr = await getDishByCategory({ + cat: dish.category, id: req.params.dishId, + }).catch((e) => error = e.message) + res.status(200).send(getResponse(error, categoryArr)) +}) + +dishRouter.get('/:dishId', async (req, res) => { + let error = null + const dishData = await getDishById({ id: req.params.dishId }).catch((e) => error = e.message) + res.send(getResponse(error, dishData)) +}) + +module.exports = dishRouter diff --git a/server/routers/stc-22-24/routes/key.js b/server/routers/stc-22-24/routes/key.js new file mode 100644 index 0000000..fb1a6a5 --- /dev/null +++ b/server/routers/stc-22-24/routes/key.js @@ -0,0 +1,7 @@ +const JWT_TOKEN = 'secret' +const SALT = 3 + +module.exports = { + JWT_TOKEN, + SALT, +} diff --git a/server/routers/stc-22-24/routes/order.js b/server/routers/stc-22-24/routes/order.js new file mode 100644 index 0000000..a05dd5f --- /dev/null +++ b/server/routers/stc-22-24/routes/order.js @@ -0,0 +1,8 @@ +const orderRouter = require('express').Router() + +orderRouter.post('/', (req, res) => { + const orderNumber = 2003 + res.status(200).send({ orderNumber }) +}) + +module.exports = orderRouter diff --git a/server/routers/stc-22-24/routes/reservation.js b/server/routers/stc-22-24/routes/reservation.js new file mode 100644 index 0000000..5750b70 --- /dev/null +++ b/server/routers/stc-22-24/routes/reservation.js @@ -0,0 +1,32 @@ +const reservationRouter = require('express').Router() +const { getTabs, updateTab } = require('../controller') + +reservationRouter.get('/', async (req, res) => { + let error = null + const tabData = await getTabs().catch((e) => error = e.message) + if (error) { + res.status(400).send(error) + } else { + res.status(200).send(tabData) + } +}) + +reservationRouter.post('/post', async (req, res) => { + let error = null + const data = req.body + console.log(data.length) + const promises = [] + for (let i = 0; i < data.length; i++) { + const item = data[i] + const result = updateTab(item.id, item.timeStamps) + promises.push(result) + } + await Promise.all(promises).catch((e) => error = e.message) + if (error) { + res.status(400).send(error) + } else { + res.status(200).send() + } +}) + +module.exports = reservationRouter diff --git a/server/routers/stc-22-24/utils/common.js b/server/routers/stc-22-24/utils/common.js new file mode 100644 index 0000000..9b77704 --- /dev/null +++ b/server/routers/stc-22-24/utils/common.js @@ -0,0 +1,34 @@ +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, + ...rest, + } +} + +const _idToIdArray = (data) => { + const _idToIdMap = data.map((item) => _idToId(item)) + + return _idToIdMap +} + +const getResponse = (error, data, success = true) => { + if (error) { + return { + success: false, + error, + } + } + + return { + success, + data, + } +} + +module.exports = { + getResponse, + _idToIdArray, + _idToId, +} diff --git a/server/routers/stc/controllers.js b/server/routers/stc/controllers.js new file mode 100644 index 0000000..1567c93 --- /dev/null +++ b/server/routers/stc/controllers.js @@ -0,0 +1,107 @@ +const { getDB } = require('../../utils/mongo') + +let db = null + +const connect = async () => { + db = await getDB('stc-21-03') +} + +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, ...rest, + } +} + +const FILM_TOMATOS_COLL = 'films-tomatos' +const getFilmData = async (filmId) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + const newData = { + filmId, + views: 0, + ratings: [], + likes: 0, + } + + filmsCollection.insertMany([newData]) + + return _idToId(newData) + } + const filmData = data[0] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + views: ++filmData.views, + }, + }, + ]) + return _idToId(filmData) +} + +const setLike = async (filmId) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + throw new Error('no film data') + } + + const filmData = data[0] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + likes: ++filmData.likes, + }, + }, + ]) + return _idToId(filmData) +} + +const setRating = async ({ filmId, rating }) => { + if (db === null) throw new Error('no db connection') + + const filmsCollection = db.collection(FILM_TOMATOS_COLL) + const data = await filmsCollection.find({ + filmId, + }).toArray() + + if (data.length === 0) { + throw new Error('no film data') + } + + const filmData = data[0] + filmData.ratings = [...filmData.ratings, rating] + filmsCollection.updateOne({ + filmId, + }, [ + { + $set: { + ratings: filmData.ratings, + }, + }, + ]) + return _idToId(filmData) +} + +module.exports = { + connect, + getFilmData, + setLike, + setRating, +} diff --git a/server/routers/stc/index.js b/server/routers/stc/index.js new file mode 100644 index 0000000..ca9eb7f --- /dev/null +++ b/server/routers/stc/index.js @@ -0,0 +1,94 @@ +const router = require('express').Router() + +const { connect, getFilmData, setLike, setRating } = require('./controllers') +const { getAnswer } = require('../../utils/common') + +connect() + +router.get('/film/:id', async (req, res) => { + const data = await getFilmData(req.params.id) + res.send(getAnswer(null, data)) +}) + +router.post('/film/:id/rating', async (req, res) => { + const filmData = await setRating({ + filmId: req.params.id, rating: req.body.rating, + }) + res.send(getAnswer(null, filmData)) +}) + +router.post('/film/:id/like', async (req, res) => { + const filmData = await setLike(req.params.id) + res.send(getAnswer(null, filmData)) +}) + +const first = router.all('/feedback', (req, res) => { + setTimeout(() => { + res.send({ + success: true, + body: { + ...req.query, ...req.body, + }, + }) + }, 1000) + + /** + * Этот эндпоинт будет доступен по адресу http://inno-ijl.ru/multystub/stc-21-03/feedback + */ +}) + +function idGen() { + let i = 1 + return () => i++ +} + +const getId = idGen() + +let posts = [ + { + id: getId(), + link: 'https://www.unian.net/russianworld/v-rossii-na-bereg-zaliva-vybrosilo-tonny-ikry-mestnye-udobryayut-eyu-ogorody-video-novosti-rossii-11420710.html', + header: 'В России на берег залива выбросило тонны икры: местные удобряют ею огороды (видео)', + poster: 'images/1.jpeg', + text: `На побережье залива Анива в Сахалинской области РФ штормом выбросило тонны икры тихоокеанской сельди сахалино-хоккайдского стада. Об этом на своей странице в Facebook рассказал глава общественной организации "Экологическая вахта Сахалина" Дмитрий Лисицын. + По его словам, икру косяки сельди ранее отметали недалеко от берега, а теперь ее сплошная полоса шириной в несколько метров растянулась по побережью примерно на 3 км. Толщина слоя икры местами достигает 10-15 см.`, + }, + { + id: getId(), + link: 'https://www.unian.net/curiosities/zhenshchina-postirala-vyigryshnyy-bilet-na-26-millionov-dollarov-poslednie-novosti-11420341.html', + header: 'Женщина постирала выигрышный билет на 26 миллионов долларов', + poster: 'images/2.webp', + text: `Американка случайно постирала со штанами выигрышный лотерейный билет на 26 миллионов долларов. +Женщина приобрела лотерею еще в ноябре в пригороде Лос-Анджелеса. Однако за выигрышем она пришла тогда, когда истекал крайний срок – через 180 дней. В магазине американка отметила, что не может показать билет, поскольку постирала его в кармане одежды. +В то же время представитель калифорнийской лотереи Кэти Джонстон заявила, что отснятого материала (имея в виду кадры с камер видеонаблюдения, на которые попала покупатель) недостаточно, чтобы выдать призовые деньги женщине.`, + }, +] + +const getPosts = (req, res) => { + setTimeout(() => { + res.send({ + success: true, body: posts, + }) + }, 1000) + + /** + * Этот эндпоинт будет доступен по адресу http://89.223.91.151:8080/multystub/stc-21-03/posts + */ +} + +const addPost = (req, res) => { + posts.push({ + id: getId(), ...req.body, + }) + setTimeout(() => { + res.send({ + success: true, body: posts, + }) + }, 1000) +} + +router.get('/posts', getPosts) +router.post('/posts', addPost) +router.use('/', first) + +module.exports = router diff --git a/server/routers/sugarbun/collections/adminstats.json b/server/routers/sugarbun/collections/adminstats.json new file mode 100644 index 0000000..d634cc9 --- /dev/null +++ b/server/routers/sugarbun/collections/adminstats.json @@ -0,0 +1,15 @@ +{"status":"success", +"adminstats":[ + {"id":1,"month":"Январь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":100.5}, + {"id":2,"month":"Февраль","monthly_sales":110000,"monthly_orders":23,"monthly_revenue":120.4}, + {"id":3,"month":"Март","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":100.6}, + {"id":4,"month":"Апрель","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":102.3}, + {"id":5,"month":"Май","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":80.2}, + {"id":6,"month":"Июнь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":150.6}, + {"id":7,"month":"Июль","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":130.2}, + {"id":8,"month":"Август","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":240.7}, + {"id":9,"month":"Сентябрь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":180.4}, + {"id":10,"month":"Октбярь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":100.44}, + {"id":11,"month":"Ноябрь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":15.5}, + {"id":12,"month":"Декабрь","monthly_sales":85600,"monthly_orders":23,"monthly_revenue":21.7} + ]} \ No newline at end of file diff --git a/server/routers/sugarbun/collections/cakeitem.json b/server/routers/sugarbun/collections/cakeitem.json new file mode 100644 index 0000000..6e8e035 --- /dev/null +++ b/server/routers/sugarbun/collections/cakeitem.json @@ -0,0 +1,229 @@ + { + "cakes": [ + { + "title": "АйЛи", + "image": "AiLi.png", + "description": "Ванильный бисквит", + "description1": "Ванильная пропитка", + "description2": "Сливочно-сырный крем", + "description3": "Клубничная прослойка", + "price": "1600", + "id": "cake" + }, + { + "title": "Лавандовый", + "image": "Lavender.png", + "description": "Лавандовый бисквит", + "description1": "Черничная пропитка", + "description2": "Сливочно-сырный крем", + "description3": "Черничный соус", + "price": "1700", + "id": "cake1" + }, + { + "title": "Шоколадный с солёной карамелью ", + "image": "Chocolate_with_salted caramel.png", + "description": "Шоколадный бисквит", + "description1": "Сливочно-сырный крем", + "description2": "Соленая карамель", + "description3": "Орехи и мягкий шоколадный ганаш", + "price": "1700", + "id": "cake2" + }, + { + "title": "Шоколадный трюфель", + "image": "Chocolate_truffle.png", + "description": "Шоколадный бисквит", + "description1": "Ванильная пропитка", + "description2": "Мягкий шоколадный ганаш", + "description3": "", + "price": "1700", + "id": "cake3" + }, + { + "title": "Красный бархат с вишней", + "image": "Red_velvet.png", + "description": "Бисквит красный бархат", + "description1": "Ягодная пропитка", + "description2": "Сливочно-сырный крем", + "description3": "Вишневый соус с кусочками вишни", + "price": "1600", + "id": "cake4" + }, + { + "title": "Фисташка-малина", + "image": "Pistachio-raspberry.png", + "description": "Фисташковый бисквит", + "description1": "Сливочно-сырный крем", + "description2": "Малиновый соус", + "description3": "", + "price": "1600", + "id": "cake5" + }, + { + "title": "Морковный с облепиховой прослойкой", + "image": "Carrot.png", + "description": "Пряный морковный бисквит с орехами", + "description1": "Облепиховая пропитка", + "description2": "Сливочно-сырный крем", + "description3": "Облепиховый соус", + "price": "1700", + "id": "cake6" + }, + { + "title": "Груша-дорблю", + "image": "Pear-dorblu.png", + "description": "Ванильный бисквит", + "description1": "Томлёная с ванилью груша", + "description2": "Сливочно-сырный крем", + "description3": "Кедровые орехи", + "price": "1700", + "id": "cake7" + }, + { + "title": "Шоколадный медовый", + "image": "Chocolate_honey.jpeg", + "description": "Шоколадные медовые коржи", + "description1": "Ванильное суфле", + "description2": "Сметанный крем с добавлением грецких орехов", + "description3": "", + "price": "1600", + "id": "cake8" + }, + { + "title": "Наполеон", + "image": "Napoleon.png", + "description": "Тонкие коржи из слоеного теста", + "description1": "Пропитка из заварного крема на сливках", + "description2": "", + "description3": "", + "price": "1700", + "id": "cake9" + }, + { + "title": "Тропический", + "image": "Tropical.png", + "description": "Кокосовый бисквит", + "description1": "Пропитка на кокосовом молоке", + "description2": "Пюре из манго и маракуйи", + "description3": "Сливочно-сырный крем с кокосовым муссом", + "price": "1700", + "id": "cake10" + }, + { + "title": "Маковый", + "image": "Poppy.png", + "description": "Маковый бисквит", + "description1": "Пропитка абрикос-маракуйя", + "description2": "Сливочно-сырный крем", + "description3": "Прослойка из абрикоса и маракуйи", + "price": "1700", + "id": "cake11" + }, + { + "title": "Павлова", + "image": "Pavlova.png", + "description": "Воздушные коржи из меренги с мягкой серединкой", + "description1": "Начинка апельсин-маракуйя", + "description2": "Сливочно-сырный крем", + "description3": "", + "price": "1800", + "id": "cake12" + }, + { + "title": "Чизкейк Нью-Йорк с солёной карамелью", + "image": "New-york-cheesecake_with_salted_caramel.png", + "description": "Песочная основа по оригинальному рецепту", + "description1": "Нежный сырный слой под слоем тягучей соленой карамели", + "description2": "", + "description3": "", + "price": "1600", + "id": "cake13" + }, + { + "title": "Чизкейк Нью-Йорк", + "image": "New-york-cheesecake.jpeg", + "description": "Песочная основа по оригинальному рецепту", + "description1": "Нежный сырный слой", + "description2": "", + "description3": "", + "price": "1500", + "id": "cake14" + }, + { + "title": "Чизкейк Сникерс", + "image": "Cheesecake_Snickers.png", + "description": "Песочно-шоколадная основа", + "description1": "Сырный слой", + "description2": "Соленая карамель с орехами", + "description3": "Покрыт слоем настоящего шоколада", + "price": "1600", + "id": "cake15" + }, + { + "title": "Баноффи", + "image": "Banoffi.png", + "description": "Песочная основа", + "description1": "Банановые кольца под слоем соленой карамели", + "description2": "Воздушный крем-чиз", + "description3": "", + "price": "1600", + "id": "cake16" + }, + { + "title": "Классический медовый с клюквой", + "image": "Classic_honey.png", + "description": "Недные медовые коржи", + "description1": "Небольшая кислинка в виде клюквенной прослойки", + "description2": "Ванильное суфле", + "description3": "Сметанный крем", + "price": "1600", + "id": "cake17" + } + ], + + "desserts": [ + { + "title": "Капкейк", + "image": "Kapkeik.png", + "description": "Нежный кекс с начинкой и кремовой шапочкой", + "price": "160", + "id": "des" + }, + { + "title": "Макарон", + "image": "Makaron.png", + "description": "Классический французский десерт из двух миндальных крышек и мягкой начинки", + "price": "100", + "id": "des1" + }, + { + "title": "Десерт Павлова", + "image": "Pavlova_desert.png", + "description": "Безе с мягкой сердцевиной внутри", + "price": "240", + "id": "des2" + }, + { + "title": "Трюфель", + "image": "Truffel.png", + "description": "Нежные конфеты на бельгийском шоколаде", + "price": "80", + "id": "des3" + }, + { + "title": "Кейк-ппс", + "image": "Keyk-pops.png", + "description": "Любимое лакомство детей. Пирожное картошка в новом исполнении", + "price": "100", + "id": "des4" + }, + { + "title": "Эклер", + "image": "Ekler.png", + "description": "Десерт на основе заварного теста с заварным кремом внутри", + "price": "160", + "id": "des5" + } + ] +} diff --git a/server/routers/sugarbun/collections/cakeshape.json b/server/routers/sugarbun/collections/cakeshape.json new file mode 100644 index 0000000..c672e74 --- /dev/null +++ b/server/routers/sugarbun/collections/cakeshape.json @@ -0,0 +1,22 @@ +[{ + "name": "Круг", + "id": "sh1", + "available": true +},{ + "name": "Квадрат", + "id": "sh2", + "available": true +},{ + "name": "Прямоугольник", + "id": "sh3", + "available": true +},{ + "name": "Овал", + "id": "sh4", + "available": true +},{ + "name": "Сложной формы", + "id": "sh5", + "available": true +} +] \ No newline at end of file diff --git a/server/routers/sugarbun/collections/cakesweight.json b/server/routers/sugarbun/collections/cakesweight.json new file mode 100644 index 0000000..97f15a3 --- /dev/null +++ b/server/routers/sugarbun/collections/cakesweight.json @@ -0,0 +1,30 @@ +[{ + "name": "1.5 кг", + "id": "cw1", + "available": true +},{ + "name": "2 кг", + "id": "cw2", + "available": true +},{ + "name": "3 кг", + "id": "cw3", + "available": true +},{ + "name": "4 кг", + "id": "cw4", + "available": true +},{ + "name": "5 кг", + "id": "cw5", + "available": true +},{ + "name": "6 кг", + "id": "cw6", + "available": true +},{ + "name": "7 кг", + "id": "cw8", + "available": true +} +] \ No newline at end of file diff --git a/server/routers/sugarbun/collections/ingredients.json b/server/routers/sugarbun/collections/ingredients.json new file mode 100644 index 0000000..438fa62 --- /dev/null +++ b/server/routers/sugarbun/collections/ingredients.json @@ -0,0 +1,74 @@ +[{ + "name": "Ванильный с клубникой", + "id": "ing1", + "available": true + },{ + "name": "Лавандовый", + "id": "ing2", + "available": true + },{ + "name": "Шоколадный с солёной карамелью, орехами и шоколадом", + "id": "ing3", + "available": true + },{ + "name": "Шоколадный трюфель", + "id": "ing4", + "available": true + },{ + "name": "Красный бархат с вишней", + "id": "ing5", + "available": true + },{ + "name": "Фисташка-малина", + "id": "ing6", + "available": true + },{ + "name": "Морковный с облепиховой прослойкой", + "id": "ing7", + "available": true + },{ + "name": "Груша-дорблю", + "id": "ing8", + "available": true + },{ + "name": "Классический медовый с клюквойм", + "id": "ing9", + "available": true + },{ + "name": "Шоколадный медовый", + "id": "ing10", + "available": true + },{ + "name": "Наполеон", + "id": "ing11", + "available": true + },{ + "name": "Тропический", + "id": "ing12", + "available": true + },{ + "name": "Маковый", + "id": "ing13", + "available": true + },{ + "name": "Павлова", + "id": "ing14", + "available": true + },{ + "name": "Чизкейк Нью-Йорк", + "id": "ing15", + "available": true + },{ + "name": "Чизкейк Нью-Йорк с соленой карамелью", + "id": "ing16", + "available": true + },{ + "name": "Чизкейк Сникерс", + "id": "ing17", + "available": true + },{ + "name": "Баноффи", + "id": "ing18", + "available": true + } +] \ No newline at end of file diff --git a/server/routers/sugarbun/controller.js b/server/routers/sugarbun/controller.js new file mode 100644 index 0000000..1713859 --- /dev/null +++ b/server/routers/sugarbun/controller.js @@ -0,0 +1,107 @@ +const ObjectId = require('mongodb').ObjectID + +const { getDB } = require('../../utils/mongo') + +const ingredients = require('./collections/ingredients.json') +const cakeshape = require('./collections/cakeshape.json') +const cakesweight = require('./collections/cakesweight.json') +const adminstats = require('./collections/adminstats.json') + +const INGREDIENTS_COLLECTION = 'ingredients' +const CAKESHAPE_COLLECTION = 'cakeshape' +const CAKESWEIGHT_COLLECTION = 'cakeswaight' +const ADMINSTATS_COLLECTION = 'adminstats' + +let db = null + +const connect = async () => { + db = await getDB('sugarbundb') +} + +const init = async () => { + await connect() + const ingredientsCollection = db.collection(INGREDIENTS_COLLECTION) + const findingredients = await ingredientsCollection.find({ + }).toArray() + // console.log(findingredients) + if (findingredients.length === 0) { + await ingredientsCollection.insertMany(ingredients) + } + const cakeshapeCollection = db.collection(CAKESHAPE_COLLECTION) + const findcakeshape = await cakeshapeCollection.find({ + }).toArray() + if (findcakeshape.length === 0) { + await cakeshapeCollection.insertMany(cakeshape) + } + const cakesweightCollection = db.collection(CAKESWEIGHT_COLLECTION) + const findcakesweight = await cakesweightCollection.find({ + }).toArray() + if (findcakesweight.length === 0) { + await cakesweightCollection.insertMany(cakesweight) + } + const adminstatsCollection = db.collection(ADMINSTATS_COLLECTION) + const findadminstats = await adminstatsCollection.find({ + }).toArray() + if (findadminstats.length === 0) { + await adminstatsCollection.insertMany(adminstats.adminstats) + } +} + +init() + +const getIngredients = async () => { + if (db === null) throw new Error('no db connection') + try { + const ingredientsCollection = db.collection(INGREDIENTS_COLLECTION) + const defaultIngredients = await ingredientsCollection.find({ + available: true, + }).toArray() + return (defaultIngredients) + } catch (e) { + throw new Error(e) + } +} + +const getCakeshape = async () => { + if (db === null) throw new Error('no db connection') + try { + const cakeshapeCollection = db.collection(CAKESHAPE_COLLECTION) + const defaultCakeshapes = await cakeshapeCollection.find({ + available: true, + }).toArray() + return (defaultCakeshapes) + } catch (e) { + throw new Error(e) + } +} + +const getCakesweight = async () => { + if (db === null) throw new Error('no db connection') + try { + const cakesweightCollection = db.collection(CAKESWEIGHT_COLLECTION) + const defaultCakesweights = await cakesweightCollection.find({ + available: true, + }).toArray() + return (defaultCakesweights) + } catch (e) { + throw new Error(e) + } +} + +const getStats = async () => { + if (db === null) throw new Error('no db connection') + try { + const adminstatsCollection = db.collection(ADMINSTATS_COLLECTION) + const defaultStats = await adminstatsCollection.find().toArray() + return (defaultStats) + } catch (e) { + throw new Error(e) + } +} + +module.exports = { + getIngredients, + getCakeshape, + getCakesweight, + getStats, +} diff --git a/server/routers/sugarbun/index.js b/server/routers/sugarbun/index.js new file mode 100644 index 0000000..2cdda98 --- /dev/null +++ b/server/routers/sugarbun/index.js @@ -0,0 +1,44 @@ +const router = require('express').Router() +const { getIngredients, getCakeshape, getCakesweight, getStats, getCakeitem } = require('./controller') + +module.exports = router + +router.get('/constructor/formitems', async (req, res) => { + // получение данных из бэкенда + const ingredient = (await getIngredients()).map((item) => ({ + ...item, + _id: undefined, + })) + const cakeshape = (await getCakeshape()).map((item) => ({ + ...item, + _id: undefined, + })) + const cakesweight = (await getCakesweight()).map((item) => ({ + ...item, + _id: undefined, + })) + res.send({ + ingredients: ingredient, + cakeshapes: cakeshape, + cakesweights: cakesweight, + }) +}) + +router.get('/admin/adminstats', async (req, res) => { + // получение данных из бэкенда + const adminstat = (await getStats()).map((item) => ({ + ...item, + _id: undefined, + })) + res.send({ + adminstats: adminstat, + }) +}) +router.post('/constructor/submit', (req, res) => { + res.send() +}) + +router.get('/menu/cakeitems', async (req, res) => { + // получение данных из бэкенда + res.send(require('./collections/cakeitem.json')) +}) diff --git a/server/routers/task-boss/auth.js b/server/routers/task-boss/auth.js new file mode 100644 index 0000000..d06cd24 --- /dev/null +++ b/server/routers/task-boss/auth.js @@ -0,0 +1,22 @@ +const hash = require('pbkdf2-password')() + +const users = [{ + salt: '1iKffJhuhGpQGx7JjiGc+ShnorhVcJDtEqTTBQjX7tnuMxfdN3nMpYpcxY0MZSPSCCGP+9l4swhit4E/ZGgVZA==', + hash: 'tQ0V8293708V2/sjyVG6yMSAlizKmTezTpoLxBc0hpfxEOImRNRGQbEx3HuGrowE4HYjzdshJbu52E5rsDE0Hfrmy1unoL/8tjeWGRF04d2sF1lhUrpxt3v1pf3du0rhR2PLTL5d2BWEtT3pSStiWeetw/zdZRDNMo9PVQqnjX0=', + login: 'task-boss', + id: '1', +}] + +function authenticate(login, pass, fn) { + let user = users.find((u) => u.login === login) + if (!user) return fn(new Error('невозможно найти пользователя')) + hash({ + password: pass, salt: user.salt, + }, (err, pass, salt, hash) => { + if (err) return fn(err) + if (hash === user.hash) return fn(null, user) + fn(new Error('неверный пароль')) + }) +} + +module.exports = authenticate diff --git a/server/routers/task-boss/constants.js b/server/routers/task-boss/constants.js new file mode 100644 index 0000000..16dd41b --- /dev/null +++ b/server/routers/task-boss/constants.js @@ -0,0 +1,5 @@ +const JWT_SECRET_KEY = 'hefiowaehfipwehafcpoweHPOCHopcvhophvnpx dsl;sad sl;dn lsdn lsd' + +module.exports = { + JWT_SECRET_KEY, +} diff --git a/server/routers/task-boss/controllers.js b/server/routers/task-boss/controllers.js new file mode 100644 index 0000000..aeb3a31 --- /dev/null +++ b/server/routers/task-boss/controllers.js @@ -0,0 +1,288 @@ +/* eslint-disable no-restricted-syntax */ + +const hash = require('pbkdf2-password')() + +const { getDB } = require('../../utils/mongo') +// eslint-disable-next-line import/order +const ObjectId = require('mongodb').ObjectID + +let db = null + +const connect = async () => { + db = await getDB('task-boss') +} + +const _idToId = (data) => { + const { _id, ...rest } = data + + return { + id: _id, + ...rest, + } +} + +const DEPTS_COLLECTION = 'depts4' +const PEOPLES_COLLECTION = 'peoples4' +const USERS_COLL = 'users3' + +const getDepts = async () => { + if (db === null) throw new Error('no db connection') + + const deptsCollection = db.collection(DEPTS_COLLECTION) + + let responseData = null + + try { + responseData = await deptsCollection.aggregate([{ + $lookup: { + from: 'peoples', + let: { + id_fio_resp: '$idFio', + }, + pipeline: [ + { + $match: + { + $expr: + { + $eq: ['$id', '$$id_fio_resp'], + }, + }, + }, + { + $project: { + id: '$_id', + _id: 0, + family: 1, + name: 1, + secondName: 1, + email: 1, + phone: 1, + }, + }], + as: 'responsible', + }, + }, + { + $unwind: '$responsible', + }, + { + $project: { + id: '$_id', + _id: 0, + parentId: '$parentDept', + name: 1, + qty: { + $size: '$employees', + }, + responsible: '$responsible', + notes: '$note', + tasks: { + inWork: '0', + newTasks: '0', + }, + }, + }, + ]).toArray() + } catch (e) { + console.log(e.message) + } + + if (!responseData || responseData?.length === 0) { + responseData = require('./stubs/depts.json').body + } + + return responseData +} + +const getDeptData = async (deptId) => { + if (db === null) throw new Error('no db connection') + + const deptsCollection = db.collection(DEPTS_COLLECTION) + const data = await deptsCollection.aggregate([ + { + $match: { + _id: new ObjectId(deptId), + }, + }, + { + $lookup: { + from: 'peoples', + pipeline: [{ + $project: { + id: '$_id', + _id: 0, + family: 1, + name: 1, + secondName: 1, + email: 1, + phone: 1, + }, + }], + localField: 'idFio', + foreignField: 'id', + as: 'responsible', + }, + }, + { + $unwind: '$responsible', + }, + { + $project: { + id: '$_id', + _id: 0, + parentId: '$parentDept', + name: 1, + qty: { + $size: '$employees', + }, + responsible: '$responsible', + notes: '$note', + tasks: { + inWork: '0', + newTasks: '0', + }, + }, + }, + ]).toArray() + + if (data.length === 0) { + throw new Error('No data') + } + + return _idToId(data[0]) +} + +const dropDocuments = async (id) => { + try { + const deptsCollection = db.collection(DEPTS_COLLECTION) + + const data = await deptsCollection.find({ + parentDept: id, + }).toArray() + + data.forEach((element) => { + dropDocuments(element._id) + }) + + deptsCollection.deleteOne({ + _id: new ObjectId(id), + }) + } catch (e) { + console.log(e) + } +} + +const deleteDeptById = async (body) => { + if (db === null) throw new Error('no db connection'); + try { + // eslint-disable-next-line guard-for-in + for (let deptId in body) { + dropDocuments(deptId) + } + } catch (e) { + console.log(e) + } +} + +const getPeoplesData = async () => { + if (db === null) throw new Error('no db connection') + + const peoplesCollection = db.collection(PEOPLES_COLLECTION) + const data = await peoplesCollection.find().toArray() + + if (data.length === 0) { + const newData = require('./stubs/peoples/success.json').data + + peoplesCollection.insertMany(newData) + + return _idToId(newData) + } + + return data +} + +const createDept = async ({ form, peoples }) => { + if (db === null) throw new Error('no db connection') + + const deptsCollection = db.collection(DEPTS_COLLECTION) + + const data = await deptsCollection.find({ + name: form.name, + }).toArray() + + if (data.length > 0) throw new Error('duplication of stirng') + + const employees = [] + peoples.forEach((item) => employees.push({ + id: item.id, + })) + const dataToInsert = { + ...form, employees, + } + deptsCollection.insertMany([dataToInsert]) + + return dataToInsert +} +const authenticate = async (login, pass, fn) => { + if (db === null) return fn(new Error('no db connection')) + const usersCollection = db.collection(USERS_COLL) + const users = await usersCollection.find({ + login, + }).toArray() + if (!users.length) return fn(new Error('невозможно найти пользователя')) + const [user] = users + + hash({ + password: pass, salt: user.salt, + }, (err, pass, salt, hash) => { + if (err) return fn(err) + if (hash === user.hash) return fn(null, user) + fn(new Error('неверный пароль')) + }) +} + +const setUsers = async (dataUsers) => { + if (db === null) throw new Error('no db connection') + + const usersCollection = db.collection(USERS_COLL) + const data = await usersCollection.find({ + $or: [{ + login: dataUsers.login, + }, { + mail: dataUsers.mail, + }], + }).toArray() + + if (data.length === 0) { + hash({ + password: dataUsers.password, saltLength: 15, + }, (err, pass, salt, hash) => { + const users = { + } + const { login, password, mail } = { + ...dataUsers, + } + users.login = login + users.name = login + users.mail = mail + users.hash = hash + users.salt = salt + usersCollection.insertMany([users]) + }) + + return dataUsers + } + if (data.length !== 0) throw new Error('Почта или логин уже существует') +} + +module.exports = { + connect, + getDepts, + getDeptData, + getPeoplesData, + createDept, + setUsers, + deleteDeptById, + authenticate, +} diff --git a/server/routers/task-boss/index.js b/server/routers/task-boss/index.js new file mode 100644 index 0000000..2a845dc --- /dev/null +++ b/server/routers/task-boss/index.js @@ -0,0 +1,162 @@ +const router = require('express').Router() +const { promisify } = require('util') +const jwt = require('jsonwebtoken') +const fs = require('fs') +const path = require('path') +const md5 = require('crypto-js/md5') + +const { JWT_SECRET_KEY } = require('./constants') +const { getResponse } = require('../../utils/common') +const { connect, getPeoplesData, createDept, getDepts, getDeptData, deleteDeptById, setUsers, authenticate } = require('./controllers') + +connect() + +router.get('/depts', async (req, res) => { + const errors = [] + const depts = await getDepts().catch((e) => errors.push(e.message)) + res.send(getResponse(errors, depts)) +}) + +router.get('/peoples', async (req, res) => { + const errors = [] + const peoplesData = await getPeoplesData().catch((e) => errors.push(e.message)) + res.send(getResponse(errors, peoplesData)) +}) + +router.post('/depts/create', async (req, res) => { + const errors = [] + const deptData = await createDept(req.body.data).catch((e) => errors.push(e.message)) + res.send(getResponse(errors, deptData)) +}) + +router.get('/dept/:id', async (req, res) => { + const errors = [] + const data = await getDeptData(req.params.id) + res.send(getResponse(errors, data)) +}) + +router.post('/dept/delete', async (req, res) => { + const errors = [] + await deleteDeptById(req.body) + res.send(getResponse(errors, 'success')) +}); + +router.post('/login', async (req, res, next) => { + const auth = promisify(authenticate) + try { + console.log(req.body.login) + console.log(req.body.password) + const { hash, salt, ...user } = await auth(req.body.login, req.body.password) + + const token = jwt.sign({ + user, + }, JWT_SECRET_KEY) + req.session.regenerate(() => { + req.session.user = user + res.send({ + success: true, + body: { + ...user, + token, + }, + errors: [], + warnings: [], + }) + }) + } catch (error) { + next(error) + } +}) + +router.get('/tasks', (req, resp) => { + resp.send(require('./stubs/tasks/tasks.json')) +}) + +router.post('/tasks/create', (req, resp) => { + try { + const { dept } = req.body + const rawTasksData = fs.readFileSync(path.resolve(__dirname, './stubs/tasks/tasks.json')) + const tasksData = JSON.parse(rawTasksData) + const deptTasksData = tasksData.body.filter((data) => data.label === dept) + + const task = { + id: md5(new Date()).toString(), + number: 100, + task: req.body.task, + status: 'open', + priority: req.body.priority, + performer: req.body.performer, + deadline: new Date(req.body.deadline).getTime(), + lastChanged: new Date().getTime(), + description: req.body.description, + } + + if (!deptTasksData.length) { + const newDeptTasksData = { + label: req.body.dept, + data: [task], + } + tasksData.body.push(newDeptTasksData) + } else { + tasksData.body.map((data) => { + if (data.label === dept) { + return data.data.push(task) + } + return data + }) + } + fs.writeFileSync(path.resolve(__dirname, './stubs/tasks/tasks.json'), JSON.stringify(tasksData)) + resp.send({ + success: true, + body: task, + errors: [], + warnings: [], + }) + } catch (e) { + resp.send('./stubs/error.json') + } +}) + +router.post('/tasks/delete', (req, resp) => { + resp.send(require('./stubs/tasks/delete.json')) +}) + +router.post('/tasks/edit', (req, resp) => { + resp.send({ + success: true, + body: req.body, + errors: [], + warnings: [], + }) +}) + +router.post('/sign-up', async (req, res, next) => { + try { + const { hash, salt, ...user } = await setUsers({ + login: req.body.login, + password: req.body.password, + mail: req.body.mail, + }) + + const token = jwt.sign({ + user, + }, JWT_SECRET_KEY) + req.session.regenerate(() => { + req.session.user = user + + res.send({ + success: true, + body: { + ...user, + token, + }, + errors: [], + warnings: [], + }) + }) + } catch (error) { + next(error) + } +}) + +module.exports = router diff --git a/server/routers/task-boss/stubs/depts.json b/server/routers/task-boss/stubs/depts.json new file mode 100644 index 0000000..657d691 --- /dev/null +++ b/server/routers/task-boss/stubs/depts.json @@ -0,0 +1,119 @@ +{ + "body": [{ + "id": "001", + "parentId": "0", + "name": "Головной", + "qty": 56, + "responsible": { + "id": 1, + "family": "Иванов", + "name": "Иван", + "secondName": "Иванович", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 12, + "newTasks": 54 + }, + "notes": "" + }, + { + "id": "002", + "parentId": "0", + "name": "Цех", + "qty": 52, + "responsible": { + "id": 2, + "family": "Буйнов", + "name": "Александр", + "secondName": "Александрович", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 67, + "newTasks": 12 + }, + "notes": "" + }, + { + "id": "003", + "parentId": "002", + "name": "Токарка", + "qty": 6, + "responsible": { + "id": 3, + "family": "Петров", + "name": "Иван", + "secondName": "Иванович", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 22, + "newTasks": 2 + }, + "notes": "1 этаж. красный сектор" + }, + { + "id": "004", + "parentId": "002", + "name": "Слесарка", + "qty": 34, + "responsible": { + "id": 3, + "family": "Петров", + "name": "Иван", + "secondName": "Иванович", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 34, + "newTasks": 10 + }, + "notes": "1 этаж. синий сектор" + }, + { + "id": "005", + "parentId": "002", + "name": "Отрезной", + "qty": 12, + "responsible": { + "id": 4, + "family": "Сидоров", + "name": "Сергей", + "secondName": "Викторович", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 11, + "newTasks": 0 + }, + "notes": "1 этаж. оранжевый сектор" + }, + { + "id": "006", + "parentId": "0", + "name": "Снабжение", + "qty": 1, + "responsible": { + "id": 5, + "family": "Зыков", + "name": "Александр", + "secondName": "Геннадьевич", + "phone": "", + "email": "" + }, + "tasks": { + "inWork": 2, + "newTasks": 0 + }, + "notes": "" + } + ], + "errors": [], + "warnings": [] +} \ No newline at end of file diff --git a/server/routers/task-boss/stubs/error.json b/server/routers/task-boss/stubs/error.json new file mode 100644 index 0000000..8f49e38 --- /dev/null +++ b/server/routers/task-boss/stubs/error.json @@ -0,0 +1,6 @@ +{ + "success": true, + "body": null, + "errors": [], + "warnings": [] +} diff --git a/server/routers/task-boss/stubs/peoples/success.json b/server/routers/task-boss/stubs/peoples/success.json new file mode 100644 index 0000000..6dcca0f --- /dev/null +++ b/server/routers/task-boss/stubs/peoples/success.json @@ -0,0 +1,30 @@ +{ + "data": [ + { + "id": 1, + "family": "Иванов", + "name": "Иван", + "secondName": "Иванович", + "phone": "", + "email": "" + }, + { + "id": 2, + "family": "Буйнов", + "name": "Александр", + "secondName": "Александрович", + "phone": "", + "email": "" + }, + { + "id": 3, + "family": "Зыков", + "name": "Александр", + "secondName": "Григорьевич", + "phone": "", + "email": "" + } + ], + "errors": [], + "warnings": [] +} diff --git a/server/routers/task-boss/stubs/tasks/delete.json b/server/routers/task-boss/stubs/tasks/delete.json new file mode 100644 index 0000000..c54731f --- /dev/null +++ b/server/routers/task-boss/stubs/tasks/delete.json @@ -0,0 +1,8 @@ +{ + "success": true, + "body": { + "id": "1" + }, + "errors": [], + "warnings": [] +} diff --git a/server/routers/task-boss/stubs/tasks/tasks.json b/server/routers/task-boss/stubs/tasks/tasks.json new file mode 100644 index 0000000..104f008 --- /dev/null +++ b/server/routers/task-boss/stubs/tasks/tasks.json @@ -0,0 +1,165 @@ +{ + "success": true, + "body": [{ + "label": "Головной", + "data": [{ + "id": "1", + "number": 10, + "task": "Установить Microsoft Office", + "status": "inProgress", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "2", + "number": 11, + "task": "Замена картриджа", + "status": "open", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "3", + "number": 12, + "task": "Установка второго монитора", + "status": "inProgress", + "priority": "low", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "4", + "number": 13, + "task": "Замена клавиатуры", + "status": "inProgress", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1629534740538, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "5", + "number": 14, + "task": "Закончилась подписка на ПО", + "status": "needInfo", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }] + }, { + "label": "Цех", + "data": [{ + "id": "6", + "number": 20, + "task": "Установить Microsoft Office", + "status": "inProgress", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "7", + "number": 21, + "task": "Замена картриджа", + "status": "open", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "8", + "number": 22, + "task": "Установка второго монитора", + "status": "inProgress", + "priority": "low", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "9", + "number": 23, + "task": "Замена клавиатуры", + "status": "inProgress", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1629534740538, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "10", + "number": 24, + "task": "Закончилась подписка на ПО", + "status": "needInfo", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }] + }, { + "label": "Токарка", + "data": [{ + "id": "11", + "number": 30, + "task": "Установить Microsoft Office", + "status": "inProgress", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "12", + "number": 31, + "task": "Замена картриджа", + "status": "open", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "13", + "number": 32, + "task": "Установка второго монитора", + "status": "inProgress", + "priority": "low", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "14", + "number": 33, + "task": "Замена клавиатуры", + "status": "inProgress", + "priority": "high", + "performer": "Иванов Иван Иванович", + "deadline": 1629534740538, + "lastChanged": 1629534740538, + "description": "Описание" + }, { + "id": "15", + "number": 34, + "task": "Закончилась подписка на ПО", + "status": "needInfo", + "priority": "middle", + "performer": "Иванов Иван Иванович", + "deadline": 1640927340000, + "lastChanged": 1629534740538, + "description": "Описание" + }] + }], + "errors": [], + "warnings": [] +} diff --git a/server/routers/uryndyklar/index.js b/server/routers/uryndyklar/index.js new file mode 100644 index 0000000..8e370f5 --- /dev/null +++ b/server/routers/uryndyklar/index.js @@ -0,0 +1,41 @@ +const router = require('express').Router() + +// The code in this folder is partially based on the code from this repo: +// https://bitbucket.org/online-mentor/auth-system/src/master/stubs/api/ + +const wait = (time = 100) => (req, res, next) => setTimeout(next, time) + +const stubs = [ + ['cart', 'get', 'success'], + // ['search', 'get', 'success'], + ['cart', 'post', 'success'], +] + +for (let [func, method, mock] of stubs) { + router[method](`/${func}`, wait(), (req, res) => { + res.send(require(`./mocks/${func}_${method}/${mock}`)) + }) +} + +router.get('/search', wait(), (req, res, _) => { + let data = require('./mocks/search_get/success.json') + let { items } = data + const filters = req.query.filters.length > 0 ? req.query.filters.split(',') : [] + const query = req.query.query.toLowerCase() + + const chairsToSend = [] + for (const chair of items) { + if (chair.model.toLowerCase().includes(query) && filters.every((tag) => chair.tags.includes(tag))) { + chairsToSend.push(chair) + } + } + + res.send( + { + success: true, + items: chairsToSend, + }, + ) +}) + +module.exports = router diff --git a/server/routers/uryndyklar/mocks/cart_get/empty.json b/server/routers/uryndyklar/mocks/cart_get/empty.json new file mode 100644 index 0000000..deb15e1 --- /dev/null +++ b/server/routers/uryndyklar/mocks/cart_get/empty.json @@ -0,0 +1,4 @@ +{ + "success": true, + "items": [] +} diff --git a/server/routers/uryndyklar/mocks/cart_get/error.json b/server/routers/uryndyklar/mocks/cart_get/error.json new file mode 100644 index 0000000..bcdf55b --- /dev/null +++ b/server/routers/uryndyklar/mocks/cart_get/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "message": "Error retrieving cart" +} diff --git a/server/routers/uryndyklar/mocks/cart_get/success.json b/server/routers/uryndyklar/mocks/cart_get/success.json new file mode 100644 index 0000000..ec6e1bc --- /dev/null +++ b/server/routers/uryndyklar/mocks/cart_get/success.json @@ -0,0 +1,18 @@ +{ + "success": true, + "items": [ + { + "id": "42", + "model": "model A", + "price_usual": "$299", + "picture": "https://cdn.shopify.com/s/files/1/0011/1273/5803/products/LF-HB_BrisaBlackOnyx_shadow_clip_c-j_800x.jpg?v=1612828182" + }, + { + "id": "322", + "model": "model T", + "price_usual": "$499", + "price_discounted": "$69", + "picture": "https://ehire.co.za/wp-content/uploads/2018/10/furniture-chairs-conference-chair-charcoal.jpg" + } + ] +} diff --git a/server/routers/uryndyklar/mocks/cart_post/error.json b/server/routers/uryndyklar/mocks/cart_post/error.json new file mode 100644 index 0000000..2b5c85f --- /dev/null +++ b/server/routers/uryndyklar/mocks/cart_post/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "message": "Unknown action: not_add_or_remove" +} diff --git a/server/routers/uryndyklar/mocks/cart_post/success.json b/server/routers/uryndyklar/mocks/cart_post/success.json new file mode 100644 index 0000000..33c0c84 --- /dev/null +++ b/server/routers/uryndyklar/mocks/cart_post/success.json @@ -0,0 +1,3 @@ +{ + "success": true +} diff --git a/server/routers/uryndyklar/mocks/search_get/empty.json b/server/routers/uryndyklar/mocks/search_get/empty.json new file mode 100644 index 0000000..deb15e1 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/empty.json @@ -0,0 +1,4 @@ +{ + "success": true, + "items": [] +} diff --git a/server/routers/uryndyklar/mocks/search_get/error.json b/server/routers/uryndyklar/mocks/search_get/error.json new file mode 100644 index 0000000..7971079 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/error.json @@ -0,0 +1,4 @@ +{ + "success": false, + "message": "Error retrieving search results" +} diff --git a/server/routers/uryndyklar/mocks/search_get/ikea.json b/server/routers/uryndyklar/mocks/search_get/ikea.json new file mode 100644 index 0000000..85d9da7 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/ikea.json @@ -0,0 +1,21 @@ +{ + "success": true, + "items": [ + { + "id": "101", + "model": "model M", + "price_usual": "$9", + "price_discounted": "$4.99", + "picture": "https://dg-home.ru/pic/234417/taburet_tronco_kollektsiia_tronko__4__big.jpg", + "tags": ["for_children", "ikea", "yellow", "spruce"] + }, + { + "id": "1337", + "model": "model H", + "price_usual": "$1", + "price_discounted": "$0.01", + "picture": "https://media.istockphoto.com/photos/old-broken-chair-picture-id157336134", + "tags": ["for_children", "ikea", "multi_color", "spruce"] + } + ] +} diff --git a/server/routers/uryndyklar/mocks/search_get/ikea_multicolor.json b/server/routers/uryndyklar/mocks/search_get/ikea_multicolor.json new file mode 100644 index 0000000..ab4f8c5 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/ikea_multicolor.json @@ -0,0 +1,13 @@ +{ + "success": true, + "items": [ + { + "id": "1337", + "model": "model H", + "price_usual": "$1", + "price_discounted": "$0.01", + "picture": "https://media.istockphoto.com/photos/old-broken-chair-picture-id157336134", + "tags": ["for_children", "ikea", "multi_color", "spruce"] + } + ] +} diff --git a/server/routers/uryndyklar/mocks/search_get/modelH.json b/server/routers/uryndyklar/mocks/search_get/modelH.json new file mode 100644 index 0000000..ab4f8c5 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/modelH.json @@ -0,0 +1,13 @@ +{ + "success": true, + "items": [ + { + "id": "1337", + "model": "model H", + "price_usual": "$1", + "price_discounted": "$0.01", + "picture": "https://media.istockphoto.com/photos/old-broken-chair-picture-id157336134", + "tags": ["for_children", "ikea", "multi_color", "spruce"] + } + ] +} diff --git a/server/routers/uryndyklar/mocks/search_get/success.json b/server/routers/uryndyklar/mocks/search_get/success.json new file mode 100644 index 0000000..3e452e1 --- /dev/null +++ b/server/routers/uryndyklar/mocks/search_get/success.json @@ -0,0 +1,67 @@ +{ + "success": true, + "items": [ + { + "id": "322", + "model": "model T", + "price_usual": "$499", + "price_discounted": "$69", + "picture": "https://ehire.co.za/wp-content/uploads/2018/10/furniture-chairs-conference-chair-charcoal.jpg", + "tags": ["office", "chairman", "black", "dark_oak"] + }, + { + "id": "42", + "model": "model A", + "price_usual": "$299", + "picture": "https://cdn.shopify.com/s/files/1/0011/1273/5803/products/LF-HB_BrisaBlackOnyx_shadow_clip_c-j_800x.jpg?v=1612828182", + "tags": ["office", "gamer", "argos", "black", "red", "maple"] + }, + { + "id": "228", + "model": "model G", + "price_usual": "$999", + "price_discounted": "$599", + "picture": "https://www.powerplanetonline.com/cdnassets/silla_gaming_white_shark_monza_rojo_01_l.jpg", + "tags": ["gamer", "chairman", "red", "acacia"] + }, + { + "id": "101", + "model": "model M", + "price_usual": "$9", + "price_discounted": "$4.99", + "picture": "https://dg-home.ru/pic/234417/taburet_tronco_kollektsiia_tronko__4__big.jpg", + "tags": ["for_children", "ikea", "yellow", "spruce"] + }, + { + "id": "111", + "model": "model C", + "price_usual": "$199", + "picture": "https://www.techinn.com/f/13809/138093984/talius-caiman-gaming-chair.jpg", + "tags": ["gamer", "dx_racer", "black", "yellow", "oak"] + }, + { + "id": "1337", + "model": "model H", + "price_usual": "$1", + "price_discounted": "$0.01", + "picture": "https://media.istockphoto.com/photos/old-broken-chair-picture-id157336134", + "tags": ["for_children", "ikea", "multi_color", "spruce"] + }, + { + "id": "227", + "model": "model K", + "price_usual": "$549", + "price_discounted": "$499", + "picture": "https://l33t-gaming.com/wp-content/uploads/2021/01/160373_01.png", + "tags": ["gamer", "office", "chairman", "black", "white", "birch"] + }, + { + "id": "121", + "model": "model Q", + "price_usual": "$949", + "price_discounted": "$899", + "picture": "https://target.scene7.com/is/image/Target/GUEST_1144a161-ee20-484b-b9a1-724bbee36c41?wid=488&hei=488&fmt=pjpeg", + "tags": ["gamer", "secretlab", "multi_color", "spruce"] + } + ] +} diff --git a/server/routers/zoom-bar/index.js b/server/routers/zoom-bar/index.js new file mode 100644 index 0000000..9bea5c6 --- /dev/null +++ b/server/routers/zoom-bar/index.js @@ -0,0 +1,97 @@ +const router = require('express').Router() + +const onlines = new Map([ +]) + +const otmetki = new Map() + +setInterval(() => { + [...otmetki.entries()].forEach(([user, otm]) => { + if (Date.now() - otm > 3500) { + onlines.set(user, { + ...(onlines.get(user) || { + }), + online: false, + }) + } + }) +}, 3000) + +const mapToObj = (map) => [...map.entries()].reduce((acc, [key, value]) => ({ + ...acc, + [key]: { + name: key, + ...value, + }, +}), { +}) + +router.post('/enter', (req, res) => { + const { username } = req.body + onlines.set(username, { + ...(onlines.get(username) || { + }), + online: true, + }) + req.session.username = username + res.send({ + }) +}) + +let syncData = { + online: mapToObj(onlines), +} + +router.get('/events', (req, res) => { + syncData.online = mapToObj(onlines) + res.send(syncData) +}) + +router.post('/set-usr-event', (req, res) => { + const { + username, + userData, + } = req.body + onlines.set(username, { + ...(onlines.get(username) || { + }), + data: userData, + }) + res.send({ + }) +}) + +router.post('/set-bar-event', (req, res) => { + const { type } = req.body + syncData.event = type + syncData.id = Math.random() + + res.send({ + }) +}) + +router.get('/bar/:u', (req, res) => { + onlines.set(req.params.u, { + ...(onlines.get(req.params.u) || { + }), + online: true, + }) + syncData.online = mapToObj(onlines) + // syncData.id = Math.random(); + otmetki.set(req.params.u, Date.now()) + + res.send(syncData) +}) + +router.get('/quit-bar', (req, res) => { + onlines.set(req.session.username || req.params.u, { + ...(onlines.get(req.session.username || req.params.u) || { + }), + online: false, + }) + syncData.online = mapToObj(onlines) + res.send({ + }) +}) + +module.exports = router diff --git a/server/utils/common.js b/server/utils/common.js new file mode 100644 index 0000000..d5b7d00 --- /dev/null +++ b/server/utils/common.js @@ -0,0 +1,35 @@ +const getAnswer = (errors, data, success = true) => { + if (errors) { + return { + success: false, + errors, + } + } + + return { + success, + body: data, + } +} + +const getResponse = (errors, data, success = true) => { + if (errors.length) { + return { + success: false, + errors, + warnings: [], + } + } + + return { + success, + body: data, + errors: [], + warnings: [], + } +} + +module.exports = { + getAnswer, + getResponse, +} diff --git a/server/utils/mongo.js b/server/utils/mongo.js new file mode 100644 index 0000000..c6be2a0 --- /dev/null +++ b/server/utils/mongo.js @@ -0,0 +1,34 @@ +const MDBClient = require('mongodb').MongoClient + +const rc = require('../../.serverrc') + +// Connection URL +const url = `mongodb://${rc.mongoAddr}:${rc.mongoPort}` + +const dbInstanses = { +} +const mongoDBConnect = async () => { + try { + const MongoClient = new MDBClient(url, { + useUnifiedTopology: true, + }) + return await MongoClient.connect() + } catch (error) { + console.error(error) + } +} +const client = mongoDBConnect() + +const getDB = async (dbName) => { + try { + const cl = await client + dbInstanses[dbName] = await cl.db(dbName) + return dbInstanses[dbName] + } catch (error) { + console.error(error) + } +} + +module.exports = { + getDB, +}