[
  {
    "path": ".gitignore",
    "content": "node_modules/*"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"git.ignoreLimitWarning\": true\n}"
  },
  {
    "path": "README.md",
    "content": "# Secondary_trading_applet\n\n基于微信小程序的校园二手交易平台\n\n## 校园二手商城微信小程序成果（云开发）\n图片看不到可在B站搜索易珠观看效果\n\n### 功能\n\n**（1）用户登陆注册**：在小程序个人主页点击登录或注册，填写相关信息，即可登录或注册，拥有个人账号进行买卖操作。后续也可以修改用户资料。\n\n**（2）用户（卖家）出售商品**：在小程序发布页面，上传商品图片，填写商品各种详细即可发布商品。在个人主页的发布信息中即可查看商品交易信息，可以删除订单，重新上架商品，删除商品。\n\n**（3）用户浏览商品**：商城主页，用户可以通过分类查看各个商品信息，也可以搜索商品名，得到筛选后的商品。点击商品进入商品详情页，可查看商品详细信息。\n\n**（4）用户（买家）购买商品**：在商品详情页，买家可点击立即购买，预定这个商品，可在个人主页的购买信息中查看自己的购买记录，也可以在放弃购买时删除该订单，或在收到商品交易达成后，点击确认收货。交易完成。\n\n**（5）用户交流**：买家可在商品详情页点击聊天与卖家进行沟通。在个人主页的消息中心中，都可以查看聊天信息，进入聊天室。\n\n### 用户操作举例\n\n首先进入小程序进行登录授权，授权进入后，显示商城主页，当前为未登陆注册状态不能发布和购买商品。\n\n<img src=\"README.assets/image-20200920220005803.png\" alt=\"image-20200920220005803\" style=\"zoom: 50%;\" /> <img src=\"https://github.com/Taoshaoji/CloudIMG/blob/master/image-20200920220722873.png\" alt=\"image-20200920220722873\" style=\"zoom:50%;\" />\n\n点击下方导航栏‘我的’进入个人主页，点击**登录**，填写信息，注册或登录账号，登录注册成功，个人主页显示用户微信头像及昵称\n\n<img src=\"README.assets/image-20200920220841085.png\" alt=\"image-20200920220841085\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920220948222.png\" alt=\"image-20200920220948222\" style=\"zoom:50%;\" />\n\n\n\n用户想要**出售商品**，可在商城主页导航栏点击‘发布’，填写信息发布商品，在个人主页我的发布中查看出售情况，如不想出售也可在我的发布处点击删除，商品下架。\n\n<img src=\"README.assets/image-20200920221442425.png\" alt=\"image-20200920221442425\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920221738182.png\" alt=\"image-20200920221738182\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920221751633.png\" alt=\"image-20200920221751633\" style=\"zoom:50%;\" />\n\n\n\n用户想要**入手商品**，可回到商城首页，分类浏览商品，也可以通过上方搜索栏搜索商品，用户可以点击商品，进入商品详情页，查看物品详情，卖家信息，备注等等\n\n<img src=\"README.assets/image-20200920221852958.png\" alt=\"image-20200920221852958\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920221938299.png\" alt=\"image-20200920221938299\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920222108667.png\" alt=\"image-20200920222108667\" style=\"zoom:50%;\" />\n\n\n\n买卖双方**交易过程：**\n\n1.买家购买商品：\n\n买家购买商品后，如在线下收到商品，则可以通过确认收货通知卖家\n\n<img src=\"README.assets/image-20200920222151402.png\" alt=\"image-20200920222151402\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920222300547.png\" alt=\"image-20200920222300547\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920222352110.png\" alt=\"image-20200920222352110\" style=\"zoom:50%;\" />\n\n\n\n2.买家中止交易：\n\n买家可以点击取消订单按钮中途取消交易，卖家会收到消息提醒。商品会自动上架。\n\n<img src=\"README.assets/image-20200920222529192.png\" alt=\"image-20200920222529192\" style=\"zoom:50%;\" />\n\n3.卖家中止交易：\n\n卖家可中途中止交易。然后点击重新上架按钮，重新发布到首页展示。\n\n<img src=\"README.assets/image-20200920222737231.png\" alt=\"image-20200920222737231\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920222748670.png\" alt=\"image-20200920222748670\" style=\"zoom:50%;\" /><img src=\"README.assets/image-20200920222804302.png\" alt=\"image-20200920222804302\" style=\"zoom:50%;\" />\n\n\n\n买家可在商品详情页点击‘聊天’与卖家沟通\n\n<img src=\"README.assets/image-20200920222934149.png\" alt=\"image-20200920222934149\" style=\"zoom:50%;\" />\n\n卖家可在个人主页消息中心中，看到买家的信息，进入聊天室与之交流。\n\n<img src=\"README.assets/image-20200920223013113.png\" alt=\"image-20200920223013113\" style=\"zoom: 50%;\" />\n\n\n\n\n\n### 部署教程：\n\n本小程序已经上线，可先预览：\n\n<img src=\"README.assets/image-20200920223554236.png\" alt=\"image-20200920223554236\" style=\"zoom:50%;\" />\n\n\n\n## 一、小程序端\n\n### 1、下载导入\n\n直接下载到本地，然后导入开发者工具\n\n> 小程序开发综合文档地址：https://developers.weixin.qq.com/miniprogram/dev/framework/\n\n### 2、开通云环境\n\n不罗嗦，这都是基础，直接看官方说明操作即可\n\n> 云开发官方文档说明：https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html\n\n### 3、配置前端config\n\n找到config.js文件，然后按照我写的注释更改为你自己的\n\n<img src=\"README.assets/image-20200920223633305.png\" alt=\"image-20200920223633305\" style=\"zoom:67%;\" />\n\n## 二、云函数\n\n### 1、修改基础信息\n\n每个云函数要修改的部分，我都捻出来放在了顶部，直接根据我做的注释信息进行修改，如下图所示\n\n<img src=\"README.assets/image-20200920223729148.png\" alt=\"image-20200920223729148\" style=\"zoom:67%;\" />\n\n\n\n### 2、上传全部文件\n\n挨个提交每个云函数，其中依赖包我已经一起上传了，无需再挨个本地去安装，直接上传所有文件即可\n\n<img src=\"README.assets/image-20200920223930768.png\" alt=\"image-20200920223930768\" style=\"zoom:67%;\" />\n\n\n\n## 三、云开发数据库\n\n### 1、创建集合 设置权限\n\n分别创建下图所示的集合，然后将所有集合的权限设置为所有可读\n\n<img src=\"README.assets/image-20200920224111392.png\" alt=\"image-20200920224111392\" style=\"zoom:67%;\" />\n\n### 2、设置banner\n\n#### ①在banner集合下新增一条记录\n\n#### ②按照下图所示添加字段\n\n<img src=\"README.assets/image-20200920224159506.png\" alt=\"image-20200920224159506\" style=\"zoom:67%;\" />\n\n#### 补充说明\n\nlist数组下的img为图片地址，id为唯一区分字段，url为点击轮播后跳转的地址，这个地址必须为与此小程序关联的公众号文章或者为业务域名地址，如果没有就留空即可\n\n\n\n### 3、设置启动页图片\n\n#### ①在start集合下新增一条记录\n\n#### ②按照下图所示添加字段\n\n<img src=\"README.assets/image-20200920224235782.png\" alt=\"image-20200920224235782\" style=\"zoom: 67%;\" />\n\n\n\n## 四、公众平台配置（小程序不上线则不需要执行此步骤）\n\n### 1、设置基本信息\n\n| 名称   | 配置                         |\n| ------ | ---------------------------- |\n| 类目   | 生活服务 > 环保回收/废品回收 |\n| 基础库 | 2.4.3                        |\n\n### 2、提交审核\n\n审核页面路径：pages/index/index\n\n### 3、设置在线客服\n\n打开【设置】--【客服】--【添加】，绑定成功后，打开小程序【客服小助手】，状态设置为在线即可，到时候有客户咨询自动会推送到你的微信号上的\n\n<img src=\"README.assets/image-20200920224525938.png\" alt=\"image-20200920224525938\" style=\"zoom:50%;\" />\n\n\n\n## 五、服务与反馈\n\n#### 如果需要提供安装服务，直接联系我微信：XXXXXXXXXX  如果觉得对你有帮助可以支持一下！感谢！**（代码开源，但时间不“开源”，伸手党勿扰！）**\n<img src=\"https://i.loli.net/2021/02/24/b6xh5ZnQoJXceOu.jpg\" alt=\"image-2020092022458\"  style=\"zoom:25%; size=25%\" />\n\n"
  },
  {
    "path": "cloudfunctions/his/index.js",
    "content": "const envid = 'taoshaoji-46f0r'; //云开发环境id\n\n/*\n下\n面\n不\n用\n管\n*/\n\n// 云函数入口文件\nconst cloud = require('wx-server-sdk')\ncloud.init({\n      env: envid,\n})\nconst TcbRouter = require('tcb-router'); //云函数路由\nconst db = cloud.database();\n// 云函数入口函数\nexports.main = async(event, context) => {\n      const app = new TcbRouter({\n            event\n      });\n      //钱包充值\n      app.router('recharge', async(ctx) => {\n            const wxContext = cloud.getWXContext()\n            const openid = wxContext.OPENID;\n            const userinfo = await db.collection('user').where({\n                  _openid: openid // 填入当前用户 openid\n            }).get()\n            try {\n                  ctx.body = await db.collection('user').doc(userinfo.data[0]._id).update({\n                        data: {\n                              parse: userinfo.data[0].parse + parseInt(event.num)\n                        }\n                  });\n            } catch (e) {\n                  console.error(e)\n            }\n      });\n      //买家确认收货\n      app.router('toseller', async(ctx) => {\n            //先增加历史记录\n            await db.collection('history').add({\n                  // data 字段表示需新增的 JSON 数据\n                  data: {\n                        oid: event.seller,\n                        name: '出售书籍',\n                        num: event.num,\n                        stamp: new Date().getTime(),\n                        type: 1,\n                  }\n            })\n\n            //再修改钱包值\n            let userinfo = await db.collection('user').where({\n                  _openid: event.seller, // 卖家openid\n            }).get()\n            ctx.body = await db.collection('user').doc(userinfo.data[0]._id).update({\n                  data: {\n                        parse: userinfo.data[0].parse + parseInt(event.num)\n                  }\n            });\n      });\n      //卖家取消订单退款\n      app.router('tobuyer', async(ctx) => {\n            //先增加历史记录\n            await db.collection('history').add({\n                  // data 字段表示需新增的 JSON 数据\n                  data: {\n                        oid: event.buyer,\n                        name: '卖家取消交易退款',\n                        num: event.num,\n                        stamp: new Date().getTime(),\n                        type: 1,\n                  }\n            })\n            //再修改钱包值\n            let userinfo = await db.collection('user').where({\n                  _openid: event.buyer,\n            }).get()\n            ctx.body = await db.collection('user').doc(userinfo.data[0]._id).update({\n                  data: {\n                        parse: userinfo.data[0].parse + parseInt(event.num)\n                  }\n            });\n      });\n      return app.serve();\n}"
  },
  {
    "path": "cloudfunctions/his/package.json",
    "content": "{\n      \"name\": \"his\",\n      \"version\": \"1.0.0\",\n      \"description\": \"\",\n      \"main\": \"index.js\",\n      \"scripts\": {\n            \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n      },\n      \"author\": \"\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n            \"tcb-router\": \"^1.1.2\",\n            \"wx-server-sdk\": \"^1.1.0\"\n      }\n}\n"
  },
  {
    "path": "cloudfunctions/imgSecCheck/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n      \"security.imgSecCheck\"\n    ]\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/imgSecCheck/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk');\ncloud.init({\n  env: cloud.DYNAMIC_CURRENT_ENV\n})\n\n// 云函数入口函数\nexports.main = async (event, context) => {\n  const wxContext = cloud.getWXContext()\n  try {\n    const result = await cloud.openapi.security.imgSecCheck({\n      media: {\n        contentType: 'image/png',\n        value: Buffer.from(event.img)   // 这里必须要将小程序端传过来的进行Buffer转化,否则就会报错,接口异常\n      }\n      \n    })\n\n    if (result && result.errCode.toString() === '87014') {\n      return { code: 500, msg: '内容含有违法违规内容', data: result }\n    } else {\n      return { code: 200, msg: '内容ok', data: result }\n    }\n  } catch (err) {\n    // 错误处理\n    if (err.errCode.toString() === '87014') {\n      return { code: 500, msg: '内容含有违法违规内容', data: err }\n    }\n    return { code: 502, msg: '调用imgSecCheck接口异常', data: err }\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/imgSecCheck/package.json",
    "content": "{\n  \"name\": \"imgSecCheck\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.2.0\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/login/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": []\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/login/index.js",
    "content": "// 云函数模板\n// 部署：在 cloud-functions/login 文件夹右击选择 “上传并部署”\n\nconst cloud = require('wx-server-sdk')\n\n// 初始化 cloud\ncloud.init({\n  // API 调用都保持和云函数当前所在环境一致\n  env: \"taoshaoji-46f0r\"\n})\n\n/**\n * 这个示例将经自动鉴权过的小程序用户 openid 返回给小程序端\n * \n * event 参数包含小程序端调用传入的 data\n * \n */\nexports.main = (event, context) => {\n  console.log(event)\n  console.log(context)\n\n  // 可执行其他自定义逻辑\n  // console.log 的内容可以在云开发云函数调用日志查看\n\n  // 获取 WX Context (微信调用上下文)，包括 OPENID、APPID、及 UNIONID（需满足 UNIONID 获取条件）等信息\n  const wxContext = cloud.getWXContext()\n\n  return {\n    event,\n    openid: wxContext.OPENID,\n    appid: wxContext.appid,\n    unionid: wxContext.UNIONID,\n    env: wxContext.ENV,\n  }\n}\n\n"
  },
  {
    "path": "cloudfunctions/login/package.json",
    "content": "{\n  \"name\": \"login\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"latest\"\n  }\n}\n"
  },
  {
    "path": "cloudfunctions/node/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/node/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n  \ncloud.init()\n  \nconst db = cloud.database()\nconst _ = db.command\n  \n// 云函数入口函数\nexports.main = async (event, _context) => {\n try {\n  return await db.collection('publish').doc(event._id).update({\n   // data 传入需要局部更新的数据\n   data: {\n      status:event.status\n   }\n  })\n } catch (e) {\n  console.error(e)\n }\n}"
  },
  {
    "path": "cloudfunctions/node/package.json",
    "content": "{\n  \"name\": \"node\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.1.2\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/pay/index.js",
    "content": "const config = {\n      appid: 'xxxxxxx', //服务商公众号Appid\n      envName: 'taoshaoji-46f0r', // 小程序云开发环境ID\n      mchid: 'xxxxxxxx', //商户号\n      partnerKey: 'xxxxxxxxxxxxx', //此处填服务商密钥\n      notify_url: 'https://mp.weixin.qq.com', //这个不要管\n      spbill_create_ip: '127.0.0.1'//这个不要管\n};\n\n/*\n下\n面\n不\n用\n管\n*/\n\nconst cloud = require('wx-server-sdk');\ncloud.init({\n      env: config.envName\n})\nconst db = cloud.database();\nconst TcbRouter = require('tcb-router'); //云函数路由\nconst rq = require('request');\nconst tenpay = require('tenpay');//支付核心模块\n\nexports.main = async (event, context) => {\n      const app = new TcbRouter({\n            event\n      });\n      //支付回调\n      app.router('pay', async (ctx) => {\n            const wxContext = cloud.getWXContext();\n            // 在云函数参数中，提取商品 ID\n            const goodId = event.goodId;\n            // 根据商品的数据库_id将其它数据提取出来\n            let goods = await db.collection('publish').doc(goodId).get();\n            // 在云函数中提取数据，包括名称、价格才更合理安全，\n            // 因为从端里传过来的商品数据都是不可靠的\n            let good=goods.data;\n            const curTime = Date.now();\n            const api = tenpay.init(config)\n            let result = await api.getPayParams({\n                  //商户订单号，我这里是定义的boolk+商品发布时间+当前时间戳\n                  //微信这里限制订单号一次性不能重复，只需要唯一即可\n                  out_trade_no: 'book'+good.creat + '' + curTime,     \n                  body: good.bookinfo.title,       //商品名称，我设置的书名\n                  total_fee: parseInt(good.price)*100,     //金额，注意是数字，不是字符串\n                 openid: wxContext.OPENID //***用户的openid\n            });\n            ctx.body = result;//返回前端结果\n      });\n      //充值钱包\n      app.router('recharge', async (ctx) => {\n            const wxContext = cloud.getWXContext();\n            const curTime = Date.now();\n            const api = tenpay.init(config)\n            let result = await api.getPayParams({\n                  //商户订单号\n                  out_trade_no: 'bookcz' + event.num + '' + curTime,\n                  body: '充值钱包',       //商品名称\n                   total_fee: parseInt(event.num)*100,     //金额，注意是数字，不是字符串\n                  openid: wxContext.OPENID //***用户的openid\n            });\n            ctx.body = result;//返回前端结果\n      });\n      //修改卖家在售状态\n      app.router('changeP', async (ctx) => {\n            try {\n                  return await db.collection('publish').doc(event._id).update({\n                        data: {\n                              status:event.status\n                        }\n                  })\n            } catch (e) {\n                  console.error(e)\n            }\n      });\n      //修改订单状态\n      app.router('changeO', async (ctx) => {\n            try {\n                  return await db.collection('order').doc(event._id).update({\n                        data: {\n                              status: event.status\n                        }\n                  })\n            } catch (e) {\n                  console.error(e)\n            }\n      });\n      return app.serve();\n}"
  },
  {
    "path": "cloudfunctions/pay/package.json",
    "content": "{\n      \"name\": \"pay\",\n      \"version\": \"1.0.0\",\n      \"description\": \"\",\n      \"main\": \"index.js\",\n      \"scripts\": {\n            \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n      },\n      \"author\": \"\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n            \"request\": \"^2.88.0\",\n            \"tcb-router\": \"^1.1.2\",\n            \"tenpay\": \"^2.1.18\",\n            \"wx-server-sdk\": \"latest\"\n      }\n}\n"
  },
  {
    "path": "cloudfunctions/poking/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/poking/index.js",
    "content": "const cloud = require('wx-server-sdk')\ncloud.init()\nexports.main = async(event, context) => {\n  try {\n    const result = await cloud.openapi.subscribeMessage.send({\n      touser: event.openid, //要推送给那个用户\n      page: 'pages/index/index', //要跳转到那个小程序页面\n      data: {//推送的内容\n        thing1: {\n          value: event.nickName\n        },\n        phrase2: {\n          value: event.phrase,\n        },\n        thing3: {\n          value: event.tip\n        }\n      },\n      templateId: 'XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q' //模板id\n    })\n    console.log(result)\n    return result\n  } catch (err) {\n    console.log(err)\n    return err\n  }\n}"
  },
  {
    "path": "cloudfunctions/poking/package.json",
    "content": "{\n  \"name\": \"poking\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.2.0\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/ref/index.js",
    "content": "const config = {\n      appid: 'wxd6beb52c8602bff4', //小程序Appid\n      envName: 'taoshaoji-46f0r', // 小程序云开发环境ID\n      mchid: '1111111111', //商户号\n      partnerKey: '1111111111111111111111', //此处填服务商密钥\n      pfx: '', //证书初始化\n      fileID: 'cloud://taoshaoji-46f0r.7461-taoshaoji-46f0r-1302243411/apiclient_cert.p12', //证书云存储id\n      actionName:'吉珠二手书商城小程序提现',\n      rate:1 //提现收取利率，1指的是每笔收取1%\n};\n\n/*\n下\n面\n不\n用\n管\n*/\nconst cloud = require('wx-server-sdk')\ncloud.init({\n      env: config.envName\n})\n\nconst db = cloud.database();\nconst tenpay = require('tenpay'); //支付核心模块\nexports.main = async(event, context) => {\n\n      let userInfo = (await db.collection('user').doc(event.userid).get()).data;\n      if (parseInt(userInfo.parse)<=parseInt(event.num)){\n            return 0;\n      }\n      //首先获取证书文件\n     let fileres = await cloud.downloadFile({\n            fileID: config.fileID,\n      })\n      config.pfx = fileres.fileContent\n      let pay = new tenpay(config,true)\n      let result = await pay.transfers({\n            partner_trade_no: 'bookreflect' + Date.now() + event.num,\n            openid: userInfo._openid,\n            check_name: 'NO_CHECK',\n            amount: parseInt(event.num) * (100 - config.rate),\n            desc: config.actionName,\n      });\n      if (result.result_code == 'SUCCESS') {\n            //成功后操作\n            //以下是进行余额计算\n            let re=await db.collection('user').doc(event.userid).update({\n                  data: {\n                        parse: userInfo.parse - parseInt(event.num)\n                  }\n            });\n            return re\n      }\n}\n"
  },
  {
    "path": "cloudfunctions/ref/package.json",
    "content": "{\n      \"name\": \"ref\",\n      \"version\": \"1.0.0\",\n      \"description\": \"\",\n      \"main\": \"index.js\",\n      \"scripts\": {\n            \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n      },\n      \"author\": \"\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n            \"tenpay\": \"^2.1.18\",\n            \"wx-server-sdk\": \"^1.2.1\"\n      }\n}\n"
  },
  {
    "path": "cloudfunctions/regist/RdWXBizDataCrypt.js",
    "content": "\n// 引入CryptoJS\nvar Crypto = require('cryptojs/cryptojs.js').Crypto;\n\nfunction RdWXBizDataCrypt(appId, sessionKey) {\n  this.appId = appId\n  this.sessionKey = sessionKey\n}\n\nRdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {\n  encryptedData = encryptedData.replace(/%/g, '%25')\n  // base64 decode ：使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码\n  var encryptedData = Crypto.util.base64ToBytes(encryptedData)\n  var key = Crypto.util.base64ToBytes(this.sessionKey);\n  var iv = Crypto.util.base64ToBytes(iv);\n\n  // 对称解密使用的算法为 AES-128-CBC，数据采用PKCS#7填充\n  var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);\n\n  try {\n    // 解密\n    var bytes = Crypto.AES.decrypt(encryptedData, key, {\n      asBpytes: true,\n      iv: iv,\n      mode: mode\n    });\n\n    var decryptResult = JSON.parse(bytes);\n\n  } catch (err) {\n    console.log(err)\n  }\n\n  if (decryptResult.watermark.appid !== this.appId) {\n    console.log(err)\n  }\n\n  return decryptResult\n}\n\nmodule.exports = RdWXBizDataCrypt"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/cryptojs.js",
    "content": "var Crypto = exports.Crypto = require('./lib/Crypto').Crypto;\n\n[ 'CryptoMath'\n, 'BlockModes'\n, 'DES'\n, 'AES'\n, 'HMAC'\n, 'MARC4'\n, 'MD5'\n, 'PBKDF2'\n, 'PBKDF2Async'\n, 'Rabbit'\n, 'SHA1'\n, 'SHA256'\n].forEach( function (path) {\n\trequire('./lib/' + path);\n});\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/AES.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8;\n\n// Precomputed SBOX\nvar SBOX = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,\n             0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,\n             0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,\n             0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,\n             0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,\n             0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,\n             0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,\n             0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,\n             0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,\n             0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,\n             0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,\n             0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,\n             0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,\n             0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,\n             0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,\n             0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,\n             0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,\n             0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,\n             0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,\n             0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,\n             0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,\n             0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,\n             0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,\n             0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,\n             0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,\n             0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,\n             0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,\n             0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,\n             0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,\n             0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,\n             0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,\n             0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ];\n\n// Compute inverse SBOX lookup table\nfor (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i;\n\n// Compute mulitplication in GF(2^8) lookup tables\nvar MULT2 = [],\n    MULT3 = [],\n    MULT9 = [],\n    MULTB = [],\n    MULTD = [],\n    MULTE = [];\n\nfunction xtime(a, b) {\n\tfor (var result = 0, i = 0; i < 8; i++) {\n\t\tif (b & 1) result ^= a;\n\t\tvar hiBitSet = a & 0x80;\n\t\ta = (a << 1) & 0xFF;\n\t\tif (hiBitSet) a ^= 0x1b;\n\t\tb >>>= 1;\n\t}\n\treturn result;\n}\n\nfor (var i = 0; i < 256; i++) {\n\tMULT2[i] = xtime(i,2);\n\tMULT3[i] = xtime(i,3);\n\tMULT9[i] = xtime(i,9);\n\tMULTB[i] = xtime(i,0xB);\n\tMULTD[i] = xtime(i,0xD);\n\tMULTE[i] = xtime(i,0xE);\n}\n\n// Precomputed RCon lookup\nvar RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];\n\n// Inner state\nvar state = [[], [], [], []],\n    keylength,\n    nrounds,\n    keyschedule;\n\nvar AES = C.AES = {\n\n\t/**\n\t * Public API\n\t */\n\n\tencrypt: function (message, password, options) {\n\n\t\toptions = options || {};\n\n\t\t// Determine mode\n\t\tvar mode = options.mode || new C.mode.OFB;\n\n\t\t// Allow mode to override options\n\t\tif (mode.fixOptions) mode.fixOptions(options);\n\n\t\tvar\n\n\t\t\t// Convert to bytes if message is a string\n\t\t\tm = (\n\t\t\t\tmessage.constructor == String ?\n\t\t\t\tUTF8.stringToBytes(message) :\n\t\t\t\tmessage\n\t\t\t),\n\n\t\t\t// Generate random IV\n\t\t\tiv = options.iv || util.randomBytes(AES._blocksize * 4),\n\n\t\t\t// Generate key\n\t\t\tk = (\n\t\t\t\tpassword.constructor == String ?\n\t\t\t\t// Derive key from passphrase\n\t\t\t\tC.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t\t\t// else, assume byte array representing cryptographic key\n\t\t\t\tpassword\n\t\t\t);\n\n\t\t// Encrypt\n\t\tAES._init(k);\n\t\tmode.encrypt(AES, m, iv);\n\n\t\t// Return ciphertext\n\t\tm = options.iv ? m : iv.concat(m);\n\t\treturn (options && options.asBytes) ? m : util.bytesToBase64(m);\n\n\t},\n\n\tdecrypt: function (ciphertext, password, options) {\n\n\t\toptions = options || {};\n\n\t\t// Determine mode\n\t\tvar mode = options.mode || new C.mode.OFB;\n\n\t\t// Allow mode to override options\n\t\tif (mode.fixOptions) mode.fixOptions(options);\n\n\t\tvar\n\n\t\t\t// Convert to bytes if ciphertext is a string\n\t\t\tc = (\n\t\t\t\tciphertext.constructor == String ?\n\t\t\t\tutil.base64ToBytes(ciphertext):\n\t\t\t    ciphertext\n\t\t\t),\n\n\t\t\t// Separate IV and message\n\t\t\tiv = options.iv || c.splice(0, AES._blocksize * 4),\n\n\t\t\t// Generate key\n\t\t\tk = (\n\t\t\t\tpassword.constructor == String ?\n\t\t\t\t// Derive key from passphrase\n\t\t\t\tC.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t\t\t// else, assume byte array representing cryptographic key\n\t\t\t\tpassword\n\t\t\t);\n\n\t\t// Decrypt\n\t\tAES._init(k);\n\t\tmode.decrypt(AES, c, iv);\n\n\t\t// Return plaintext\n\t\treturn (options && options.asBytes) ? c : UTF8.bytesToString(c);\n\n\t},\n\n\n\t/**\n\t * Package private methods and properties\n\t */\n\n\t_blocksize: 4,\n\n\t_encryptblock: function (m, offset) {\n\n\t\t// Set input\n\t\tfor (var row = 0; row < AES._blocksize; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] = m[offset + col * 4 + row];\n\t\t}\n\n\t\t// Add round key\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] ^= keyschedule[col][row];\n\t\t}\n\n\t\tfor (var round = 1; round < nrounds; round++) {\n\n\t\t\t// Sub bytes\n\t\t\tfor (var row = 0; row < 4; row++) {\n\t\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\t\tstate[row][col] = SBOX[state[row][col]];\n\t\t\t}\n\n\t\t\t// Shift rows\n\t\t\tstate[1].push(state[1].shift());\n\t\t\tstate[2].push(state[2].shift());\n\t\t\tstate[2].push(state[2].shift());\n\t\t\tstate[3].unshift(state[3].pop());\n\n\t\t\t// Mix columns\n\t\t\tfor (var col = 0; col < 4; col++) {\n\n\t\t\t\tvar s0 = state[0][col],\n\t\t\t\t    s1 = state[1][col],\n\t\t\t\t    s2 = state[2][col],\n\t\t\t\t    s3 = state[3][col];\n\n\t\t\t\tstate[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3;\n\t\t\t\tstate[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3;\n\t\t\t\tstate[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3];\n\t\t\t\tstate[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3];\n\n\t\t\t}\n\n\t\t\t// Add round key\n\t\t\tfor (var row = 0; row < 4; row++) {\n\t\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\t\tstate[row][col] ^= keyschedule[round * 4 + col][row];\n\t\t\t}\n\n\t\t}\n\n\t\t// Sub bytes\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] = SBOX[state[row][col]];\n\t\t}\n\n\t\t// Shift rows\n\t\tstate[1].push(state[1].shift());\n\t\tstate[2].push(state[2].shift());\n\t\tstate[2].push(state[2].shift());\n\t\tstate[3].unshift(state[3].pop());\n\n\t\t// Add round key\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] ^= keyschedule[nrounds * 4 + col][row];\n\t\t}\n\n\t\t// Set output\n\t\tfor (var row = 0; row < AES._blocksize; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tm[offset + col * 4 + row] = state[row][col];\n\t\t}\n\n\t},\n\n\t_decryptblock: function (c, offset) {\n\n\t\t// Set input\n\t\tfor (var row = 0; row < AES._blocksize; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] = c[offset + col * 4 + row];\n\t\t}\n\n\t\t// Add round key\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] ^= keyschedule[nrounds * 4 + col][row];\n\t\t}\n\n\t\tfor (var round = 1; round < nrounds; round++) {\n\n\t\t\t// Inv shift rows\n\t\t\tstate[1].unshift(state[1].pop());\n\t\t\tstate[2].push(state[2].shift());\n\t\t\tstate[2].push(state[2].shift());\n\t\t\tstate[3].push(state[3].shift());\n\n\t\t\t// Inv sub bytes\n\t\t\tfor (var row = 0; row < 4; row++) {\n\t\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\t\tstate[row][col] = INVSBOX[state[row][col]];\n\t\t\t}\n\n\t\t\t// Add round key\n\t\t\tfor (var row = 0; row < 4; row++) {\n\t\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\t\tstate[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row];\n\t\t\t}\n\n\t\t\t// Inv mix columns\n\t\t\tfor (var col = 0; col < 4; col++) {\n\n\t\t\t\tvar s0 = state[0][col],\n\t\t\t\t    s1 = state[1][col],\n\t\t\t\t    s2 = state[2][col],\n\t\t\t\t    s3 = state[3][col];\n\n\t\t\t\tstate[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3];\n\t\t\t\tstate[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3];\n\t\t\t\tstate[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3];\n\t\t\t\tstate[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Inv shift rows\n\t\tstate[1].unshift(state[1].pop());\n\t\tstate[2].push(state[2].shift());\n\t\tstate[2].push(state[2].shift());\n\t\tstate[3].push(state[3].shift());\n\n\t\t// Inv sub bytes\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] = INVSBOX[state[row][col]];\n\t\t}\n\n\t\t// Add round key\n\t\tfor (var row = 0; row < 4; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tstate[row][col] ^= keyschedule[col][row];\n\t\t}\n\n\t\t// Set output\n\t\tfor (var row = 0; row < AES._blocksize; row++) {\n\t\t\tfor (var col = 0; col < 4; col++)\n\t\t\t\tc[offset + col * 4 + row] = state[row][col];\n\t\t}\n\n\t},\n\n\n\t/**\n\t * Private methods\n\t */\n\n\t_init: function (k) {\n\t\tkeylength = k.length / 4;\n\t\tnrounds = keylength + 6;\n\t\tAES._keyexpansion(k);\n\t},\n\n\t// Generate a key schedule\n\t_keyexpansion: function (k) {\n\n\t\tkeyschedule = [];\n\n\t\tfor (var row = 0; row < keylength; row++) {\n\t\t\tkeyschedule[row] = [\n\t\t\t\tk[row * 4],\n\t\t\t\tk[row * 4 + 1],\n\t\t\t\tk[row * 4 + 2],\n\t\t\t\tk[row * 4 + 3]\n\t\t\t];\n\t\t}\n\n\t\tfor (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) {\n\n\t\t\tvar temp = [\n\t\t\t\tkeyschedule[row - 1][0],\n\t\t\t\tkeyschedule[row - 1][1],\n\t\t\t\tkeyschedule[row - 1][2],\n\t\t\t\tkeyschedule[row - 1][3]\n\t\t\t];\n\n\t\t\tif (row % keylength == 0) {\n\n\t\t\t\t// Rot word\n\t\t\t\ttemp.push(temp.shift());\n\n\t\t\t\t// Sub word\n\t\t\t\ttemp[0] = SBOX[temp[0]];\n\t\t\t\ttemp[1] = SBOX[temp[1]];\n\t\t\t\ttemp[2] = SBOX[temp[2]];\n\t\t\t\ttemp[3] = SBOX[temp[3]];\n\n\t\t\t\ttemp[0] ^= RCON[row / keylength];\n\n\t\t\t} else if (keylength > 6 && row % keylength == 4) {\n\n\t\t\t\t// Sub word\n\t\t\t\ttemp[0] = SBOX[temp[0]];\n\t\t\t\ttemp[1] = SBOX[temp[1]];\n\t\t\t\ttemp[2] = SBOX[temp[2]];\n\t\t\t\ttemp[3] = SBOX[temp[3]];\n\n\t\t\t}\n\n\t\t\tkeyschedule[row] = [\n\t\t\t\tkeyschedule[row - keylength][0] ^ temp[0],\n\t\t\t\tkeyschedule[row - keylength][1] ^ temp[1],\n\t\t\t\tkeyschedule[row - keylength][2] ^ temp[2],\n\t\t\t\tkeyschedule[row - keylength][3] ^ temp[3]\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/BlockModes.js",
    "content": "/*!\n * Crypto-JS contribution from Simon Greatrix\n */\n\n(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Create pad namespace\nvar C_pad = C.pad = {};\n\n// Calculate the number of padding bytes required.\nfunction _requiredPadding(cipher, message) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n    var reqd = blockSizeInBytes - message.length % blockSizeInBytes;\n    return reqd;\n};\n\n// Remove padding when the final byte gives the number of padding bytes.\nvar _unpadLength = function (message) {\n        var pad = message.pop();\n        for (var i = 1; i < pad; i++) {\n            message.pop();\n        }\n    };\n\n// No-operation padding, used for stream ciphers\nC_pad.NoPadding = {\n        pad : function (cipher,message) {},\n        unpad : function (message) {}\n    };\n\n// Zero Padding.\n//\n// If the message is not an exact number of blocks, the final block is\n// completed with 0x00 bytes. There is no unpadding.\nC_pad.ZeroPadding = {\n    pad : function (cipher, message) {\n        var blockSizeInBytes = cipher._blocksize * 4;\n        var reqd = message.length % blockSizeInBytes;\n        if( reqd!=0 ) {\n            for(reqd = blockSizeInBytes - reqd; reqd>0; reqd--) {\n                message.push(0x00);\n            }\n        }\n    },\n\n    unpad : function (message) {}\n};\n\n// ISO/IEC 7816-4 padding.\n//\n// Pads the plain text with an 0x80 byte followed by as many 0x00\n// bytes are required to complete the block.\nC_pad.iso7816 = {\n    pad : function (cipher, message) {\n        var reqd = _requiredPadding(cipher, message);\n        message.push(0x80);\n        for (; reqd > 1; reqd--) {\n            message.push(0x00);\n        }\n    },\n\n    unpad : function (message) {\n        while (message.pop() != 0x80) {}\n    }\n};\n\n// ANSI X.923 padding\n//\n// The final block is padded with zeros except for the last byte of the\n// last block which contains the number of padding bytes.\nC_pad.ansix923 = {\n    pad : function (cipher, message) {\n        var reqd = _requiredPadding(cipher, message);\n        for (var i = 1; i < reqd; i++) {\n            message.push(0x00);\n        }\n        message.push(reqd);\n    },\n\n    unpad : _unpadLength\n};\n\n// ISO 10126\n//\n// The final block is padded with random bytes except for the last\n// byte of the last block which contains the number of padding bytes.\nC_pad.iso10126 = {\n    pad : function (cipher, message) {\n        var reqd = _requiredPadding(cipher, message);\n        for (var i = 1; i < reqd; i++) {\n            message.push(Math.floor(Math.random() * 256));\n        }\n        message.push(reqd);\n    },\n\n    unpad : _unpadLength\n};\n\n// PKCS7 padding\n//\n// PKCS7 is described in RFC 5652. Padding is in whole bytes. The\n// value of each added byte is the number of bytes that are added,\n// i.e. N bytes, each of value N are added.\nC_pad.pkcs7 = {\n    pad : function (cipher, message) {\n        var reqd = _requiredPadding(cipher, message);\n        for (var i = 0; i < reqd; i++) {\n            message.push(reqd);\n        }\n    },\n\n    unpad : _unpadLength\n};\n\n// Create mode namespace\nvar C_mode = C.mode = {};\n\n/**\n * Mode base \"class\".\n */\nvar Mode = C_mode.Mode = function (padding) {\n    if (padding) {\n        this._padding = padding;\n    }\n};\n\nMode.prototype = {\n    encrypt: function (cipher, m, iv) {\n        this._padding.pad(cipher, m);\n        this._doEncrypt(cipher, m, iv);\n    },\n\n    decrypt: function (cipher, m, iv) {\n        this._doDecrypt(cipher, m, iv);\n        this._padding.unpad(m);\n    },\n\n    // Default padding\n    _padding: C_pad.iso7816\n};\n\n\n/**\n * Electronic Code Book mode.\n * \n * ECB applies the cipher directly against each block of the input.\n * \n * ECB does not require an initialization vector.\n */\nvar ECB = C_mode.ECB = function () {\n    // Call parent constructor\n    Mode.apply(this, arguments);\n};\n\n// Inherit from Mode\nvar ECB_prototype = ECB.prototype = new Mode;\n\n// Concrete steps for Mode template\nECB_prototype._doEncrypt = function (cipher, m, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n    // Encrypt each block\n    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {\n        cipher._encryptblock(m, offset);\n    }\n};\nECB_prototype._doDecrypt = function (cipher, c, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n    // Decrypt each block\n    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {\n        cipher._decryptblock(c, offset);\n    }\n};\n\n// ECB never uses an IV\nECB_prototype.fixOptions = function (options) {\n    options.iv = [];\n};\n\n\n/**\n * Cipher block chaining\n * \n * The first block is XORed with the IV. Subsequent blocks are XOR with the\n * previous cipher output.\n */\nvar CBC = C_mode.CBC = function () {\n    // Call parent constructor\n    Mode.apply(this, arguments);\n};\n\n// Inherit from Mode\nvar CBC_prototype = CBC.prototype = new Mode;\n\n// Concrete steps for Mode template\nCBC_prototype._doEncrypt = function (cipher, m, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n\n    // Encrypt each block\n    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {\n        if (offset == 0) {\n            // XOR first block using IV\n            for (var i = 0; i < blockSizeInBytes; i++)\n            m[i] ^= iv[i];\n        } else {\n            // XOR this block using previous crypted block\n            for (var i = 0; i < blockSizeInBytes; i++)\n            m[offset + i] ^= m[offset + i - blockSizeInBytes];\n        }\n        // Encrypt block\n        cipher._encryptblock(m, offset);\n    }\n};\nCBC_prototype._doDecrypt = function (cipher, c, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n\n    // At the start, the previously crypted block is the IV\n    var prevCryptedBlock = iv;\n\n    // Decrypt each block\n    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {\n        // Save this crypted block\n        var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);\n        // Decrypt block\n        cipher._decryptblock(c, offset);\n        // XOR decrypted block using previous crypted block\n        for (var i = 0; i < blockSizeInBytes; i++) {\n            c[offset + i] ^= prevCryptedBlock[i];\n        }\n        prevCryptedBlock = thisCryptedBlock;\n    }\n};\n\n\n/**\n * Cipher feed back\n * \n * The cipher output is XORed with the plain text to produce the cipher output,\n * which is then fed back into the cipher to produce a bit pattern to XOR the\n * next block with.\n * \n * This is a stream cipher mode and does not require padding.\n */\nvar CFB = C_mode.CFB = function () {\n    // Call parent constructor\n    Mode.apply(this, arguments);\n};\n\n// Inherit from Mode\nvar CFB_prototype = CFB.prototype = new Mode;\n\n// Override padding\nCFB_prototype._padding = C_pad.NoPadding;\n\n// Concrete steps for Mode template\nCFB_prototype._doEncrypt = function (cipher, m, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4,\n        keystream = iv.slice(0);\n\n    // Encrypt each byte\n    for (var i = 0; i < m.length; i++) {\n\n        var j = i % blockSizeInBytes;\n        if (j == 0) cipher._encryptblock(keystream, 0);\n\n        m[i] ^= keystream[j];\n        keystream[j] = m[i];\n    }\n};\nCFB_prototype._doDecrypt = function (cipher, c, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4,\n        keystream = iv.slice(0);\n\n    // Encrypt each byte\n    for (var i = 0; i < c.length; i++) {\n\n        var j = i % blockSizeInBytes;\n        if (j == 0) cipher._encryptblock(keystream, 0);\n\n        var b = c[i];\n        c[i] ^= keystream[j];\n        keystream[j] = b;\n    }\n};\n\n\n/**\n * Output feed back\n * \n * The cipher repeatedly encrypts its own output. The output is XORed with the\n * plain text to produce the cipher text.\n * \n * This is a stream cipher mode and does not require padding.\n */\nvar OFB = C_mode.OFB = function () {\n    // Call parent constructor\n    Mode.apply(this, arguments);\n};\n\n// Inherit from Mode\nvar OFB_prototype = OFB.prototype = new Mode;\n\n// Override padding\nOFB_prototype._padding = C_pad.NoPadding;\n\n// Concrete steps for Mode template\nOFB_prototype._doEncrypt = function (cipher, m, iv) {\n\n    var blockSizeInBytes = cipher._blocksize * 4,\n        keystream = iv.slice(0);\n\n    // Encrypt each byte\n    for (var i = 0; i < m.length; i++) {\n\n        // Generate keystream\n        if (i % blockSizeInBytes == 0)\n            cipher._encryptblock(keystream, 0);\n\n        // Encrypt byte\n        m[i] ^= keystream[i % blockSizeInBytes];\n\n    }\n};\nOFB_prototype._doDecrypt = OFB_prototype._doEncrypt;\n\n/**\n * Counter\n * @author Gergely Risko\n *\n * After every block the last 4 bytes of the IV is increased by one\n * with carry and that IV is used for the next block.\n *\n * This is a stream cipher mode and does not require padding.\n */\nvar CTR = C_mode.CTR = function () {\n    // Call parent constructor\n    Mode.apply(this, arguments);\n};\n\n// Inherit from Mode\nvar CTR_prototype = CTR.prototype = new Mode;\n\n// Override padding\nCTR_prototype._padding = C_pad.NoPadding;\n\nCTR_prototype._doEncrypt = function (cipher, m, iv) {\n    var blockSizeInBytes = cipher._blocksize * 4;\n    var counter = iv.slice(0);\n\n    for (var i = 0; i < m.length;) {\n        // do not lose iv\n        var keystream = counter.slice(0);\n\n        // Generate keystream for next block\n        cipher._encryptblock(keystream, 0);\n\n        // XOR keystream with block\n        for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) {\n            m[i] ^= keystream[j];\n        }\n\n        // Increase counter\n        if(++(counter[blockSizeInBytes-1]) == 256) {\n            counter[blockSizeInBytes-1] = 0;\n            if(++(counter[blockSizeInBytes-2]) == 256) {\n                counter[blockSizeInBytes-2] = 0;\n                if(++(counter[blockSizeInBytes-3]) == 256) {\n                    counter[blockSizeInBytes-3] = 0;\n                    ++(counter[blockSizeInBytes-4]);\n                }\n            }\n        }\n    }\n};\nCTR_prototype._doDecrypt = CTR_prototype._doEncrypt;\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/Crypto.js",
    "content": "if (typeof Crypto == \"undefined\" || ! Crypto.util)\n{\n(function(){\n\nvar base64map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n// Global Crypto object\n// with browser window or with node module\nvar Crypto = (typeof window === 'undefined') ? exports.Crypto = {} : window.Crypto = {}; \n\n// Crypto utilities\nvar util = Crypto.util = {\n\n\t// Bit-wise rotate left\n\trotl: function (n, b) {\n\t\treturn (n << b) | (n >>> (32 - b));\n\t},\n\n\t// Bit-wise rotate right\n\trotr: function (n, b) {\n\t\treturn (n << (32 - b)) | (n >>> b);\n\t},\n\n\t// Swap big-endian to little-endian and vice versa\n\tendian: function (n) {\n\n\t\t// If number given, swap endian\n\t\tif (n.constructor == Number) {\n\t\t\treturn util.rotl(n,  8) & 0x00FF00FF |\n\t\t\t       util.rotl(n, 24) & 0xFF00FF00;\n\t\t}\n\n\t\t// Else, assume array and swap all items\n\t\tfor (var i = 0; i < n.length; i++)\n\t\t\tn[i] = util.endian(n[i]);\n\t\treturn n;\n\n\t},\n\n\t// Generate an array of any length of random bytes\n\trandomBytes: function (n) {\n\t\tfor (var bytes = []; n > 0; n--)\n\t\t\tbytes.push(Math.floor(Math.random() * 256));\n\t\treturn bytes;\n\t},\n\n\t// Convert a byte array to big-endian 32-bit words\n\tbytesToWords: function (bytes) {\n\t\tfor (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)\n\t\t\twords[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);\n\t\treturn words;\n\t},\n\n\t// Convert big-endian 32-bit words to a byte array\n\twordsToBytes: function (words) {\n\t\tfor (var bytes = [], b = 0; b < words.length * 32; b += 8)\n\t\t\tbytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);\n\t\treturn bytes;\n\t},\n\n\t// Convert a byte array to a hex string\n\tbytesToHex: function (bytes) {\n\t\tfor (var hex = [], i = 0; i < bytes.length; i++) {\n\t\t\thex.push((bytes[i] >>> 4).toString(16));\n\t\t\thex.push((bytes[i] & 0xF).toString(16));\n\t\t}\n\t\treturn hex.join(\"\");\n\t},\n\n\t// Convert a hex string to a byte array\n\thexToBytes: function (hex) {\n\t\tfor (var bytes = [], c = 0; c < hex.length; c += 2)\n\t\t\tbytes.push(parseInt(hex.substr(c, 2), 16));\n\t\treturn bytes;\n\t},\n\n\t// Convert a byte array to a base-64 string\n\tbytesToBase64: function (bytes) {\n\n\t\t// Use browser-native function if it exists\n\t\tif (typeof btoa == \"function\") return btoa(Binary.bytesToString(bytes));\n\n\t\tfor(var base64 = [], i = 0; i < bytes.length; i += 3) {\n\t\t\tvar triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];\n\t\t\tfor (var j = 0; j < 4; j++) {\n\t\t\t\tif (i * 8 + j * 6 <= bytes.length * 8)\n\t\t\t\t\tbase64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));\n\t\t\t\telse base64.push(\"=\");\n\t\t\t}\n\t\t}\n\n\t\treturn base64.join(\"\");\n\n\t},\n\n\t// Convert a base-64 string to a byte array\n\tbase64ToBytes: function (base64) {\n\n\t\t// Use browser-native function if it exists\n\t\tif (typeof atob == \"function\") return Binary.stringToBytes(atob(base64));\n\n\t\t// Remove non-base-64 characters\n\t\tbase64 = base64.replace(/[^A-Z0-9+\\/]/ig, \"\");\n\n\t\tfor (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {\n\t\t\tif (imod4 == 0) continue;\n\t\t\tbytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |\n\t\t\t           (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));\n\t\t}\n\n\t\treturn bytes;\n\n\t}\n\n};\n\n// Crypto character encodings\nvar charenc = Crypto.charenc = {};\n\n// UTF-8 encoding\nvar UTF8 = charenc.UTF8 = {\n\n\t// Convert a string to a byte array\n\tstringToBytes: function (str) {\n\t\treturn Binary.stringToBytes(unescape(encodeURIComponent(str)));\n\t},\n\n\t// Convert a byte array to a string\n\tbytesToString: function (bytes) {\n\t\treturn decodeURIComponent(escape(Binary.bytesToString(bytes)));\n\t}\n\n};\n\n// Binary encoding\nvar Binary = charenc.Binary = {\n\n\t// Convert a string to a byte array\n\tstringToBytes: function (str) {\n\t\tfor (var bytes = [], i = 0; i < str.length; i++)\n\t\t\tbytes.push(str.charCodeAt(i) & 0xFF);\n\t\treturn bytes;\n\t},\n\n\t// Convert a byte array to a string\n\tbytesToString: function (bytes) {\n\t\tfor (var str = [], i = 0; i < bytes.length; i++)\n\t\t\tstr.push(String.fromCharCode(bytes[i]));\n\t\treturn str.join(\"\");\n\t}\n\n};\n\n})();\n}\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/CryptoMath.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcut\nvar util = C.util;\n\n// Convert n to unsigned 32-bit integer\nutil.u32 = function (n) {\n\treturn n >>> 0;\n};\n\n// Unsigned 32-bit addition\nutil.add = function () {\n\tvar result = this.u32(arguments[0]);\n\tfor (var i = 1; i < arguments.length; i++)\n\t\tresult = this.u32(result + this.u32(arguments[i]));\n\treturn result;\n};\n\n// Unsigned 32-bit multiplication\nutil.mult = function (m, n) {\n\treturn this.add((n & 0xFFFF0000) * m,\n\t\t\t(n & 0x0000FFFF) * m);\n};\n\n// Unsigned 32-bit greater than (>) comparison\nutil.gt = function (m, n) {\n\treturn this.u32(m) > this.u32(n);\n};\n\n// Unsigned 32-bit less than (<) comparison\nutil.lt = function (m, n) {\n\treturn this.u32(m) < this.u32(n);\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/DES.js",
    "content": "/**\n * Definition of Data Encryption Standard (DES) taken from:\n * http://www.itl.nist.gov/fipspubs/fip46-2.htm\n */\n\n(function() {\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n    // Shortcuts\n    var util = C.util, charenc = C.charenc, UTF8 = charenc.UTF8;\n\n    /***************************************************************************\n     * \n     * DES Key Schedule.\n     * \n     * The Key consists of 16 sub-keys of 48 bits each. As each sub-key is\n     * applied to an expanded 32-bit value where each 4 bits of input is\n     * expanded into 6 bits of output the sub-key can be broken down into 8\n     * 32-bit values which allows the key to be used without expansion.\n     * \n     * To create the 16 sub-keys, 56 bits are selected from the input 64 bit key\n     * according to <i>PC1</i>. Each sub-key is generated by left rotating the\n     * bits a different amount and then selecting 48 bits according to <i>PC2</i>.\n     * \n     **************************************************************************/\n\n    var KeySchedule;\n\n    /**\n     * Representation of a DES key schedule.\n     * \n     * @param {Array\n     *            of 8 bytes} key The cipher key\n     * \n     * @constructor\n     */\n    KeySchedule = function(key) {\n        /**\n         * The schedule of 16 keys\n         */\n        this.keys = new Array(16);\n        this._initialiseKeys(key);\n    };\n\n    /**\n     * Permuted Choice 1 (PC1) byte offsets into the key. Each of the 56 entries\n     * selects one bit of DES's 56 bit key.\n     * <p>\n     * \n     * <pre>\n     * The PC1 is defined as:\n     * \n     * 57,   49,    41,   33,    25,    17,    9,\n     *  1,   58,    50,   42,    34,    26,   18,\n     * 10,    2,    59,   51,    43,    35,   27,\n     * 19,   11,     3,   60,    52,    44,   36,\n     * 63,   55,    47,   39,    31,    23,   15,\n     *  7,   62,    54,   46,    38,    30,   22,\n     * 14,    6,    61,   53,    45,    37,   29,\n     * 21,   13,     5,   28,    20,    12,    4\n     * </pre>\n     * \n     * We represent this as an offset into an 8-byte array and a bit mask upon\n     * that byte. For example 57=(7*8)+1 so is the first (MSB) of the 7th byte.\n     * \n     * @constant\n     */\n    KeySchedule.PC1_offsets = [ 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0,\n            7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6,\n            5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 3, 2, 1, 0 ];\n\n    /**\n     * Permuted Choice 1 (PC1) bit masks. Each of the 56 entries selects one bit\n     * of DES's 56 bit key.\n     * \n     * @constant\n     */\n    KeySchedule.PC1_masks = [ 128, 128, 128, 128, 128, 128, 128, 128, 64, 64,\n            64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16,\n            16, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,\n            8, 8, 8, 16, 16, 16, 16 ];\n\n    /**\n     * Permuted Choice 2 (PC2) selects the active 48 bits from the 56 bits of\n     * the key.\n     * <p>\n     * \n     * <pre>\n     * The PC2 is defined as:\n     * \n     * 14,   17,   11,   24,    1,    5,\n     *  3,   28,   15,    6,   21,   10,\n     * 23,   19,   12,    4,   26,    8,\n     * 16,    7,   27,   20,   13,    2,\n     * 41,   52,   31,   37,   47,   55,\n     * 30,   40,   51,   45,   33,   48,\n     * 44,   49,   39,   56,   34,   53,\n     * 46,   42,   50,   36,   29,   32\n     * </pre>\n     * \n     * We invert the choice to specify what each bit adds to each 6-bit value of\n     * the key. For example, bit 1 is the 5th bit selected so this add 2 to the\n     * first 6-bit value.\n     * \n     * @constant\n     */\n    KeySchedule.PC2_offsets1 = [ 0, 3, 1, 2, 0, 1, 3, 2, 0, 1, 0, 2, 3, 0, 1,\n            3, 0, 0, 2, 3, 1, 0, 2, 0, 0, 2, 3, 1 ];\n\n    /**\n     * PC2 offsets for 2nd block.\n     * \n     * @constant\n     */\n    KeySchedule.PC2_offsets2 = [ 7, 5, 4, 7, 5, 6, 0, 7, 4, 0, 6, 5, 4, 7, 0,\n            6, 5, 7, 4, 5, 6, 7, 5, 4, 6, 0, 4, 6 ];\n\n    /**\n     * Permuted Choice 2 (PC2) masks for 1st block.\n     * \n     * @constant\n     */\n    KeySchedule.PC2_masks1 = [ 2, 1, 32, 4, 1, 4, 16, 1, 0, 1, 8, 8, 2, 32, 8,\n            32, 16, 0, 16, 4, 2, 0, 32, 4, 0, 2, 8, 16 ];\n\n    /**\n     * PC2 masks for 2nd block.\n     * \n     * @constant\n     */\n    KeySchedule.PC2_masks2 = [ 2, 32, 8, 1, 2, 2, 0, 4, 4, 0, 8, 16, 32, 16, 0,\n            32, 4, 32, 2, 1, 16, 8, 8, 16, 1, 0, 1, 4 ];\n\n    /**\n     * Cumulative key shifts.\n     * \n     * @constant\n     */\n    KeySchedule.keyShifts = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23,\n            25, 27, 28 ];\n\n    KeySchedule.prototype._initialiseKeys = function(key) {\n        var i;\n\n        // extract 56 key bits in order determined by PC1\n        var bits = new Array(56);\n        for (i = 0; i < 56; i++) {\n            bits[i] = (key[KeySchedule.PC1_offsets[i]] & KeySchedule.PC1_masks[i]) != 0;\n        }\n\n        // split 56 bits into two 28-bit chunks\n        var bits1 = bits.slice(0, 28);\n        var bits2 = bits.slice(28, 56);\n\n        // duplicate each half to allow for easy bit shifts\n        bits1 = bits1.concat(bits1);\n        bits2 = bits2.concat(bits2);\n\n        // assemble the 16 keys\n        for (i = 0; i < 16; i++) {\n            var k = [ 0, 0, 0, 0, 0, 0, 0, 0 ];\n\n            // select the bits of the key according to PC2\n            var s = KeySchedule.keyShifts[i];\n            for ( var j = 0; j < 28; j++) {\n                if (bits1[j + s]) {\n                    k[KeySchedule.PC2_offsets1[j]] += KeySchedule.PC2_masks1[j];\n                }\n                if (bits2[j + s]) {\n                    k[KeySchedule.PC2_offsets2[j]] += KeySchedule.PC2_masks2[j];\n                }\n            }\n\n            // Scale each of the 8 blocks to a 32-bit mask.\n            k[0] = ((k[0] & 0x1f) << 27) + ((k[0] & 0x20) >> 5);\n            for ( var j = 1; j <= 6; j++) {\n                k[j] = k[j] << (27 - 4 * j);\n            }\n            k[7] = ((k[7] & 0x3e) >> 1) + ((k[7] & 0x1) << 31);\n            this.keys[i] = k;\n        }\n    };\n\n    /**\n     * Retrieve the key for a specified round\n     * \n     * @param i\n     *            the round\n     * @returns the key\n     */\n    KeySchedule.prototype.getKey = function(i) {\n        return this.keys[i];\n    };\n\n    /***************************************************************************\n     * \n     * DES Engine State\n     * \n     **************************************************************************/\n\n    var State;\n\n    /**\n     * The algorithm's state. DES operates on two sets of 32-bits, with each\n     * block of 32-bits treated as a single number.\n     * \n     * @class\n     */\n    State = function() {\n        /** The LHS of the Feistel scheme */\n        this.lhs = 0;\n        /** The RHS of the Feistel scheme */\n        this.rhs = 0;\n    };\n\n    /**\n     * The masks that select the SBOX input. Each SBOX accepts 6 bits from the\n     * input.\n     * \n     * @constant\n     */\n    State.SBOX_MASK = [ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,\n            0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f ];\n\n    /**\n     * The SBOXes. The 8 SBOXes each map 6 bit masked bit of the input to 4 bits\n     * of output. These SBOXes include the post SBOX permutation and benefit\n     * from JavaScript's sparse arrays to make specifying the input match\n     * simple.\n     * \n     * @constant\n     */\n    State.SBOX = new Array(8);\n\n    var SBOX = State.SBOX;\n\n    SBOX[0] = new Array();\n    SBOX[0][0] = 0x808200; // 0 (0, 0) = 14\n    SBOX[0][268435456] = 0x8000; // 10000000 (0, 1) = 4\n    SBOX[0][536870912] = 0x808002; // 20000000 (0, 2) = 13\n    SBOX[0][805306368] = 0x2; // 30000000 (0, 3) = 1\n    SBOX[0][1073741824] = 0x200; // 40000000 (0, 4) = 2\n    SBOX[0][1342177280] = 0x808202; // 50000000 (0, 5) = 15\n    SBOX[0][1610612736] = 0x800202; // 60000000 (0, 6) = 11\n    SBOX[0][1879048192] = 0x800000; // 70000000 (0, 7) = 8\n    SBOX[0][-2147483648] = 0x202; // 80000000 (0, 8) = 3\n    SBOX[0][-1879048192] = 0x800200; // 90000000 (0, 9) = 10\n    SBOX[0][-1610612736] = 0x8200; // a0000000 (0, 10) = 6\n    SBOX[0][-1342177280] = 0x808000; // b0000000 (0, 11) = 12\n    SBOX[0][-1073741824] = 0x8002; // c0000000 (0, 12) = 5\n    SBOX[0][-805306368] = 0x800002; // d0000000 (0, 13) = 9\n    SBOX[0][-536870912] = 0x0; // e0000000 (0, 14) = 0\n    SBOX[0][-268435456] = 0x8202; // f0000000 (0, 15) = 7\n    SBOX[0][134217728] = 0x0; // 8000000 (1, 0) = 0\n    SBOX[0][402653184] = 0x808202; // 18000000 (1, 1) = 15\n    SBOX[0][671088640] = 0x8202; // 28000000 (1, 2) = 7\n    SBOX[0][939524096] = 0x8000; // 38000000 (1, 3) = 4\n    SBOX[0][1207959552] = 0x808200; // 48000000 (1, 4) = 14\n    SBOX[0][1476395008] = 0x200; // 58000000 (1, 5) = 2\n    SBOX[0][1744830464] = 0x808002; // 68000000 (1, 6) = 13\n    SBOX[0][2013265920] = 0x2; // 78000000 (1, 7) = 1\n    SBOX[0][-2013265920] = 0x800200; // 88000000 (1, 8) = 10\n    SBOX[0][-1744830464] = 0x8200; // 98000000 (1, 9) = 6\n    SBOX[0][-1476395008] = 0x808000; // a8000000 (1, 10) = 12\n    SBOX[0][-1207959552] = 0x800202; // b8000000 (1, 11) = 11\n    SBOX[0][-939524096] = 0x800002; // c8000000 (1, 12) = 9\n    SBOX[0][-671088640] = 0x8002; // d8000000 (1, 13) = 5\n    SBOX[0][-402653184] = 0x202; // e8000000 (1, 14) = 3\n    SBOX[0][-134217728] = 0x800000; // f8000000 (1, 15) = 8\n    SBOX[0][1] = 0x8000; // 1 (2, 0) = 4\n    SBOX[0][268435457] = 0x2; // 10000001 (2, 1) = 1\n    SBOX[0][536870913] = 0x808200; // 20000001 (2, 2) = 14\n    SBOX[0][805306369] = 0x800000; // 30000001 (2, 3) = 8\n    SBOX[0][1073741825] = 0x808002; // 40000001 (2, 4) = 13\n    SBOX[0][1342177281] = 0x8200; // 50000001 (2, 5) = 6\n    SBOX[0][1610612737] = 0x200; // 60000001 (2, 6) = 2\n    SBOX[0][1879048193] = 0x800202; // 70000001 (2, 7) = 11\n    SBOX[0][-2147483647] = 0x808202; // 80000001 (2, 8) = 15\n    SBOX[0][-1879048191] = 0x808000; // 90000001 (2, 9) = 12\n    SBOX[0][-1610612735] = 0x800002; // a0000001 (2, 10) = 9\n    SBOX[0][-1342177279] = 0x8202; // b0000001 (2, 11) = 7\n    SBOX[0][-1073741823] = 0x202; // c0000001 (2, 12) = 3\n    SBOX[0][-805306367] = 0x800200; // d0000001 (2, 13) = 10\n    SBOX[0][-536870911] = 0x8002; // e0000001 (2, 14) = 5\n    SBOX[0][-268435455] = 0x0; // f0000001 (2, 15) = 0\n    SBOX[0][134217729] = 0x808202; // 8000001 (3, 0) = 15\n    SBOX[0][402653185] = 0x808000; // 18000001 (3, 1) = 12\n    SBOX[0][671088641] = 0x800000; // 28000001 (3, 2) = 8\n    SBOX[0][939524097] = 0x200; // 38000001 (3, 3) = 2\n    SBOX[0][1207959553] = 0x8000; // 48000001 (3, 4) = 4\n    SBOX[0][1476395009] = 0x800002; // 58000001 (3, 5) = 9\n    SBOX[0][1744830465] = 0x2; // 68000001 (3, 6) = 1\n    SBOX[0][2013265921] = 0x8202; // 78000001 (3, 7) = 7\n    SBOX[0][-2013265919] = 0x8002; // 88000001 (3, 8) = 5\n    SBOX[0][-1744830463] = 0x800202; // 98000001 (3, 9) = 11\n    SBOX[0][-1476395007] = 0x202; // a8000001 (3, 10) = 3\n    SBOX[0][-1207959551] = 0x808200; // b8000001 (3, 11) = 14\n    SBOX[0][-939524095] = 0x800200; // c8000001 (3, 12) = 10\n    SBOX[0][-671088639] = 0x0; // d8000001 (3, 13) = 0\n    SBOX[0][-402653183] = 0x8200; // e8000001 (3, 14) = 6\n    SBOX[0][-134217727] = 0x808002; // f8000001 (3, 15) = 13\n\n    SBOX[1] = new Array();\n    SBOX[1][0] = 0x40084010; // 0 (0, 0) = 15\n    SBOX[1][16777216] = 0x4000; // 1000000 (0, 1) = 1\n    SBOX[1][33554432] = 0x80000; // 2000000 (0, 2) = 8\n    SBOX[1][50331648] = 0x40080010; // 3000000 (0, 3) = 14\n    SBOX[1][67108864] = 0x40000010; // 4000000 (0, 4) = 6\n    SBOX[1][83886080] = 0x40084000; // 5000000 (0, 5) = 11\n    SBOX[1][100663296] = 0x40004000; // 6000000 (0, 6) = 3\n    SBOX[1][117440512] = 0x10; // 7000000 (0, 7) = 4\n    SBOX[1][134217728] = 0x84000; // 8000000 (0, 8) = 9\n    SBOX[1][150994944] = 0x40004010; // 9000000 (0, 9) = 7\n    SBOX[1][167772160] = 0x40000000; // a000000 (0, 10) = 2\n    SBOX[1][184549376] = 0x84010; // b000000 (0, 11) = 13\n    SBOX[1][201326592] = 0x80010; // c000000 (0, 12) = 12\n    SBOX[1][218103808] = 0x0; // d000000 (0, 13) = 0\n    SBOX[1][234881024] = 0x4010; // e000000 (0, 14) = 5\n    SBOX[1][251658240] = 0x40080000; // f000000 (0, 15) = 10\n    SBOX[1][8388608] = 0x40004000; // 800000 (1, 0) = 3\n    SBOX[1][25165824] = 0x84010; // 1800000 (1, 1) = 13\n    SBOX[1][41943040] = 0x10; // 2800000 (1, 2) = 4\n    SBOX[1][58720256] = 0x40004010; // 3800000 (1, 3) = 7\n    SBOX[1][75497472] = 0x40084010; // 4800000 (1, 4) = 15\n    SBOX[1][92274688] = 0x40000000; // 5800000 (1, 5) = 2\n    SBOX[1][109051904] = 0x80000; // 6800000 (1, 6) = 8\n    SBOX[1][125829120] = 0x40080010; // 7800000 (1, 7) = 14\n    SBOX[1][142606336] = 0x80010; // 8800000 (1, 8) = 12\n    SBOX[1][159383552] = 0x0; // 9800000 (1, 9) = 0\n    SBOX[1][176160768] = 0x4000; // a800000 (1, 10) = 1\n    SBOX[1][192937984] = 0x40080000; // b800000 (1, 11) = 10\n    SBOX[1][209715200] = 0x40000010; // c800000 (1, 12) = 6\n    SBOX[1][226492416] = 0x84000; // d800000 (1, 13) = 9\n    SBOX[1][243269632] = 0x40084000; // e800000 (1, 14) = 11\n    SBOX[1][260046848] = 0x4010; // f800000 (1, 15) = 5\n    SBOX[1][268435456] = 0x0; // 10000000 (2, 0) = 0\n    SBOX[1][285212672] = 0x40080010; // 11000000 (2, 1) = 14\n    SBOX[1][301989888] = 0x40004010; // 12000000 (2, 2) = 7\n    SBOX[1][318767104] = 0x40084000; // 13000000 (2, 3) = 11\n    SBOX[1][335544320] = 0x40080000; // 14000000 (2, 4) = 10\n    SBOX[1][352321536] = 0x10; // 15000000 (2, 5) = 4\n    SBOX[1][369098752] = 0x84010; // 16000000 (2, 6) = 13\n    SBOX[1][385875968] = 0x4000; // 17000000 (2, 7) = 1\n    SBOX[1][402653184] = 0x4010; // 18000000 (2, 8) = 5\n    SBOX[1][419430400] = 0x80000; // 19000000 (2, 9) = 8\n    SBOX[1][436207616] = 0x80010; // 1a000000 (2, 10) = 12\n    SBOX[1][452984832] = 0x40000010; // 1b000000 (2, 11) = 6\n    SBOX[1][469762048] = 0x84000; // 1c000000 (2, 12) = 9\n    SBOX[1][486539264] = 0x40004000; // 1d000000 (2, 13) = 3\n    SBOX[1][503316480] = 0x40000000; // 1e000000 (2, 14) = 2\n    SBOX[1][520093696] = 0x40084010; // 1f000000 (2, 15) = 15\n    SBOX[1][276824064] = 0x84010; // 10800000 (3, 0) = 13\n    SBOX[1][293601280] = 0x80000; // 11800000 (3, 1) = 8\n    SBOX[1][310378496] = 0x40080000; // 12800000 (3, 2) = 10\n    SBOX[1][327155712] = 0x4000; // 13800000 (3, 3) = 1\n    SBOX[1][343932928] = 0x40004000; // 14800000 (3, 4) = 3\n    SBOX[1][360710144] = 0x40084010; // 15800000 (3, 5) = 15\n    SBOX[1][377487360] = 0x10; // 16800000 (3, 6) = 4\n    SBOX[1][394264576] = 0x40000000; // 17800000 (3, 7) = 2\n    SBOX[1][411041792] = 0x40084000; // 18800000 (3, 8) = 11\n    SBOX[1][427819008] = 0x40000010; // 19800000 (3, 9) = 6\n    SBOX[1][444596224] = 0x40004010; // 1a800000 (3, 10) = 7\n    SBOX[1][461373440] = 0x80010; // 1b800000 (3, 11) = 12\n    SBOX[1][478150656] = 0x0; // 1c800000 (3, 12) = 0\n    SBOX[1][494927872] = 0x4010; // 1d800000 (3, 13) = 5\n    SBOX[1][511705088] = 0x40080010; // 1e800000 (3, 14) = 14\n    SBOX[1][528482304] = 0x84000; // 1f800000 (3, 15) = 9\n\n    SBOX[2] = new Array();\n    SBOX[2][0] = 0x104; // 0 (0, 0) = 10\n    SBOX[2][1048576] = 0x0; // 100000 (0, 1) = 0\n    SBOX[2][2097152] = 0x4000100; // 200000 (0, 2) = 9\n    SBOX[2][3145728] = 0x10104; // 300000 (0, 3) = 14\n    SBOX[2][4194304] = 0x10004; // 400000 (0, 4) = 6\n    SBOX[2][5242880] = 0x4000004; // 500000 (0, 5) = 3\n    SBOX[2][6291456] = 0x4010104; // 600000 (0, 6) = 15\n    SBOX[2][7340032] = 0x4010000; // 700000 (0, 7) = 5\n    SBOX[2][8388608] = 0x4000000; // 800000 (0, 8) = 1\n    SBOX[2][9437184] = 0x4010100; // 900000 (0, 9) = 13\n    SBOX[2][10485760] = 0x10100; // a00000 (0, 10) = 12\n    SBOX[2][11534336] = 0x4010004; // b00000 (0, 11) = 7\n    SBOX[2][12582912] = 0x4000104; // c00000 (0, 12) = 11\n    SBOX[2][13631488] = 0x10000; // d00000 (0, 13) = 4\n    SBOX[2][14680064] = 0x4; // e00000 (0, 14) = 2\n    SBOX[2][15728640] = 0x100; // f00000 (0, 15) = 8\n    SBOX[2][524288] = 0x4010100; // 80000 (1, 0) = 13\n    SBOX[2][1572864] = 0x4010004; // 180000 (1, 1) = 7\n    SBOX[2][2621440] = 0x0; // 280000 (1, 2) = 0\n    SBOX[2][3670016] = 0x4000100; // 380000 (1, 3) = 9\n    SBOX[2][4718592] = 0x4000004; // 480000 (1, 4) = 3\n    SBOX[2][5767168] = 0x10000; // 580000 (1, 5) = 4\n    SBOX[2][6815744] = 0x10004; // 680000 (1, 6) = 6\n    SBOX[2][7864320] = 0x104; // 780000 (1, 7) = 10\n    SBOX[2][8912896] = 0x4; // 880000 (1, 8) = 2\n    SBOX[2][9961472] = 0x100; // 980000 (1, 9) = 8\n    SBOX[2][11010048] = 0x4010000; // a80000 (1, 10) = 5\n    SBOX[2][12058624] = 0x10104; // b80000 (1, 11) = 14\n    SBOX[2][13107200] = 0x10100; // c80000 (1, 12) = 12\n    SBOX[2][14155776] = 0x4000104; // d80000 (1, 13) = 11\n    SBOX[2][15204352] = 0x4010104; // e80000 (1, 14) = 15\n    SBOX[2][16252928] = 0x4000000; // f80000 (1, 15) = 1\n    SBOX[2][16777216] = 0x4010100; // 1000000 (2, 0) = 13\n    SBOX[2][17825792] = 0x10004; // 1100000 (2, 1) = 6\n    SBOX[2][18874368] = 0x10000; // 1200000 (2, 2) = 4\n    SBOX[2][19922944] = 0x4000100; // 1300000 (2, 3) = 9\n    SBOX[2][20971520] = 0x100; // 1400000 (2, 4) = 8\n    SBOX[2][22020096] = 0x4010104; // 1500000 (2, 5) = 15\n    SBOX[2][23068672] = 0x4000004; // 1600000 (2, 6) = 3\n    SBOX[2][24117248] = 0x0; // 1700000 (2, 7) = 0\n    SBOX[2][25165824] = 0x4000104; // 1800000 (2, 8) = 11\n    SBOX[2][26214400] = 0x4000000; // 1900000 (2, 9) = 1\n    SBOX[2][27262976] = 0x4; // 1a00000 (2, 10) = 2\n    SBOX[2][28311552] = 0x10100; // 1b00000 (2, 11) = 12\n    SBOX[2][29360128] = 0x4010000; // 1c00000 (2, 12) = 5\n    SBOX[2][30408704] = 0x104; // 1d00000 (2, 13) = 10\n    SBOX[2][31457280] = 0x10104; // 1e00000 (2, 14) = 14\n    SBOX[2][32505856] = 0x4010004; // 1f00000 (2, 15) = 7\n    SBOX[2][17301504] = 0x4000000; // 1080000 (3, 0) = 1\n    SBOX[2][18350080] = 0x104; // 1180000 (3, 1) = 10\n    SBOX[2][19398656] = 0x4010100; // 1280000 (3, 2) = 13\n    SBOX[2][20447232] = 0x0; // 1380000 (3, 3) = 0\n    SBOX[2][21495808] = 0x10004; // 1480000 (3, 4) = 6\n    SBOX[2][22544384] = 0x4000100; // 1580000 (3, 5) = 9\n    SBOX[2][23592960] = 0x100; // 1680000 (3, 6) = 8\n    SBOX[2][24641536] = 0x4010004; // 1780000 (3, 7) = 7\n    SBOX[2][25690112] = 0x10000; // 1880000 (3, 8) = 4\n    SBOX[2][26738688] = 0x4010104; // 1980000 (3, 9) = 15\n    SBOX[2][27787264] = 0x10104; // 1a80000 (3, 10) = 14\n    SBOX[2][28835840] = 0x4000004; // 1b80000 (3, 11) = 3\n    SBOX[2][29884416] = 0x4000104; // 1c80000 (3, 12) = 11\n    SBOX[2][30932992] = 0x4010000; // 1d80000 (3, 13) = 5\n    SBOX[2][31981568] = 0x4; // 1e80000 (3, 14) = 2\n    SBOX[2][33030144] = 0x10100; // 1f80000 (3, 15) = 12\n\n    SBOX[3] = new Array();\n    SBOX[3][0] = 0x80401000; // 0 (0, 0) = 7\n    SBOX[3][65536] = 0x80001040; // 10000 (0, 1) = 13\n    SBOX[3][131072] = 0x401040; // 20000 (0, 2) = 14\n    SBOX[3][196608] = 0x80400000; // 30000 (0, 3) = 3\n    SBOX[3][262144] = 0x0; // 40000 (0, 4) = 0\n    SBOX[3][327680] = 0x401000; // 50000 (0, 5) = 6\n    SBOX[3][393216] = 0x80000040; // 60000 (0, 6) = 9\n    SBOX[3][458752] = 0x400040; // 70000 (0, 7) = 10\n    SBOX[3][524288] = 0x80000000; // 80000 (0, 8) = 1\n    SBOX[3][589824] = 0x400000; // 90000 (0, 9) = 2\n    SBOX[3][655360] = 0x40; // a0000 (0, 10) = 8\n    SBOX[3][720896] = 0x80001000; // b0000 (0, 11) = 5\n    SBOX[3][786432] = 0x80400040; // c0000 (0, 12) = 11\n    SBOX[3][851968] = 0x1040; // d0000 (0, 13) = 12\n    SBOX[3][917504] = 0x1000; // e0000 (0, 14) = 4\n    SBOX[3][983040] = 0x80401040; // f0000 (0, 15) = 15\n    SBOX[3][32768] = 0x80001040; // 8000 (1, 0) = 13\n    SBOX[3][98304] = 0x40; // 18000 (1, 1) = 8\n    SBOX[3][163840] = 0x80400040; // 28000 (1, 2) = 11\n    SBOX[3][229376] = 0x80001000; // 38000 (1, 3) = 5\n    SBOX[3][294912] = 0x401000; // 48000 (1, 4) = 6\n    SBOX[3][360448] = 0x80401040; // 58000 (1, 5) = 15\n    SBOX[3][425984] = 0x0; // 68000 (1, 6) = 0\n    SBOX[3][491520] = 0x80400000; // 78000 (1, 7) = 3\n    SBOX[3][557056] = 0x1000; // 88000 (1, 8) = 4\n    SBOX[3][622592] = 0x80401000; // 98000 (1, 9) = 7\n    SBOX[3][688128] = 0x400000; // a8000 (1, 10) = 2\n    SBOX[3][753664] = 0x1040; // b8000 (1, 11) = 12\n    SBOX[3][819200] = 0x80000000; // c8000 (1, 12) = 1\n    SBOX[3][884736] = 0x400040; // d8000 (1, 13) = 10\n    SBOX[3][950272] = 0x401040; // e8000 (1, 14) = 14\n    SBOX[3][1015808] = 0x80000040; // f8000 (1, 15) = 9\n    SBOX[3][1048576] = 0x400040; // 100000 (2, 0) = 10\n    SBOX[3][1114112] = 0x401000; // 110000 (2, 1) = 6\n    SBOX[3][1179648] = 0x80000040; // 120000 (2, 2) = 9\n    SBOX[3][1245184] = 0x0; // 130000 (2, 3) = 0\n    SBOX[3][1310720] = 0x1040; // 140000 (2, 4) = 12\n    SBOX[3][1376256] = 0x80400040; // 150000 (2, 5) = 11\n    SBOX[3][1441792] = 0x80401000; // 160000 (2, 6) = 7\n    SBOX[3][1507328] = 0x80001040; // 170000 (2, 7) = 13\n    SBOX[3][1572864] = 0x80401040; // 180000 (2, 8) = 15\n    SBOX[3][1638400] = 0x80000000; // 190000 (2, 9) = 1\n    SBOX[3][1703936] = 0x80400000; // 1a0000 (2, 10) = 3\n    SBOX[3][1769472] = 0x401040; // 1b0000 (2, 11) = 14\n    SBOX[3][1835008] = 0x80001000; // 1c0000 (2, 12) = 5\n    SBOX[3][1900544] = 0x400000; // 1d0000 (2, 13) = 2\n    SBOX[3][1966080] = 0x40; // 1e0000 (2, 14) = 8\n    SBOX[3][2031616] = 0x1000; // 1f0000 (2, 15) = 4\n    SBOX[3][1081344] = 0x80400000; // 108000 (3, 0) = 3\n    SBOX[3][1146880] = 0x80401040; // 118000 (3, 1) = 15\n    SBOX[3][1212416] = 0x0; // 128000 (3, 2) = 0\n    SBOX[3][1277952] = 0x401000; // 138000 (3, 3) = 6\n    SBOX[3][1343488] = 0x400040; // 148000 (3, 4) = 10\n    SBOX[3][1409024] = 0x80000000; // 158000 (3, 5) = 1\n    SBOX[3][1474560] = 0x80001040; // 168000 (3, 6) = 13\n    SBOX[3][1540096] = 0x40; // 178000 (3, 7) = 8\n    SBOX[3][1605632] = 0x80000040; // 188000 (3, 8) = 9\n    SBOX[3][1671168] = 0x1000; // 198000 (3, 9) = 4\n    SBOX[3][1736704] = 0x80001000; // 1a8000 (3, 10) = 5\n    SBOX[3][1802240] = 0x80400040; // 1b8000 (3, 11) = 11\n    SBOX[3][1867776] = 0x1040; // 1c8000 (3, 12) = 12\n    SBOX[3][1933312] = 0x80401000; // 1d8000 (3, 13) = 7\n    SBOX[3][1998848] = 0x400000; // 1e8000 (3, 14) = 2\n    SBOX[3][2064384] = 0x401040; // 1f8000 (3, 15) = 14\n\n    SBOX[4] = new Array();\n    SBOX[4][0] = 0x80; // 0 (0, 0) = 2\n    SBOX[4][4096] = 0x1040000; // 1000 (0, 1) = 12\n    SBOX[4][8192] = 0x40000; // 2000 (0, 2) = 4\n    SBOX[4][12288] = 0x20000000; // 3000 (0, 3) = 1\n    SBOX[4][16384] = 0x20040080; // 4000 (0, 4) = 7\n    SBOX[4][20480] = 0x1000080; // 5000 (0, 5) = 10\n    SBOX[4][24576] = 0x21000080; // 6000 (0, 6) = 11\n    SBOX[4][28672] = 0x40080; // 7000 (0, 7) = 6\n    SBOX[4][32768] = 0x1000000; // 8000 (0, 8) = 8\n    SBOX[4][36864] = 0x20040000; // 9000 (0, 9) = 5\n    SBOX[4][40960] = 0x20000080; // a000 (0, 10) = 3\n    SBOX[4][45056] = 0x21040080; // b000 (0, 11) = 15\n    SBOX[4][49152] = 0x21040000; // c000 (0, 12) = 13\n    SBOX[4][53248] = 0x0; // d000 (0, 13) = 0\n    SBOX[4][57344] = 0x1040080; // e000 (0, 14) = 14\n    SBOX[4][61440] = 0x21000000; // f000 (0, 15) = 9\n    SBOX[4][2048] = 0x1040080; // 800 (1, 0) = 14\n    SBOX[4][6144] = 0x21000080; // 1800 (1, 1) = 11\n    SBOX[4][10240] = 0x80; // 2800 (1, 2) = 2\n    SBOX[4][14336] = 0x1040000; // 3800 (1, 3) = 12\n    SBOX[4][18432] = 0x40000; // 4800 (1, 4) = 4\n    SBOX[4][22528] = 0x20040080; // 5800 (1, 5) = 7\n    SBOX[4][26624] = 0x21040000; // 6800 (1, 6) = 13\n    SBOX[4][30720] = 0x20000000; // 7800 (1, 7) = 1\n    SBOX[4][34816] = 0x20040000; // 8800 (1, 8) = 5\n    SBOX[4][38912] = 0x0; // 9800 (1, 9) = 0\n    SBOX[4][43008] = 0x21040080; // a800 (1, 10) = 15\n    SBOX[4][47104] = 0x1000080; // b800 (1, 11) = 10\n    SBOX[4][51200] = 0x20000080; // c800 (1, 12) = 3\n    SBOX[4][55296] = 0x21000000; // d800 (1, 13) = 9\n    SBOX[4][59392] = 0x1000000; // e800 (1, 14) = 8\n    SBOX[4][63488] = 0x40080; // f800 (1, 15) = 6\n    SBOX[4][65536] = 0x40000; // 10000 (2, 0) = 4\n    SBOX[4][69632] = 0x80; // 11000 (2, 1) = 2\n    SBOX[4][73728] = 0x20000000; // 12000 (2, 2) = 1\n    SBOX[4][77824] = 0x21000080; // 13000 (2, 3) = 11\n    SBOX[4][81920] = 0x1000080; // 14000 (2, 4) = 10\n    SBOX[4][86016] = 0x21040000; // 15000 (2, 5) = 13\n    SBOX[4][90112] = 0x20040080; // 16000 (2, 6) = 7\n    SBOX[4][94208] = 0x1000000; // 17000 (2, 7) = 8\n    SBOX[4][98304] = 0x21040080; // 18000 (2, 8) = 15\n    SBOX[4][102400] = 0x21000000; // 19000 (2, 9) = 9\n    SBOX[4][106496] = 0x1040000; // 1a000 (2, 10) = 12\n    SBOX[4][110592] = 0x20040000; // 1b000 (2, 11) = 5\n    SBOX[4][114688] = 0x40080; // 1c000 (2, 12) = 6\n    SBOX[4][118784] = 0x20000080; // 1d000 (2, 13) = 3\n    SBOX[4][122880] = 0x0; // 1e000 (2, 14) = 0\n    SBOX[4][126976] = 0x1040080; // 1f000 (2, 15) = 14\n    SBOX[4][67584] = 0x21000080; // 10800 (3, 0) = 11\n    SBOX[4][71680] = 0x1000000; // 11800 (3, 1) = 8\n    SBOX[4][75776] = 0x1040000; // 12800 (3, 2) = 12\n    SBOX[4][79872] = 0x20040080; // 13800 (3, 3) = 7\n    SBOX[4][83968] = 0x20000000; // 14800 (3, 4) = 1\n    SBOX[4][88064] = 0x1040080; // 15800 (3, 5) = 14\n    SBOX[4][92160] = 0x80; // 16800 (3, 6) = 2\n    SBOX[4][96256] = 0x21040000; // 17800 (3, 7) = 13\n    SBOX[4][100352] = 0x40080; // 18800 (3, 8) = 6\n    SBOX[4][104448] = 0x21040080; // 19800 (3, 9) = 15\n    SBOX[4][108544] = 0x0; // 1a800 (3, 10) = 0\n    SBOX[4][112640] = 0x21000000; // 1b800 (3, 11) = 9\n    SBOX[4][116736] = 0x1000080; // 1c800 (3, 12) = 10\n    SBOX[4][120832] = 0x40000; // 1d800 (3, 13) = 4\n    SBOX[4][124928] = 0x20040000; // 1e800 (3, 14) = 5\n    SBOX[4][129024] = 0x20000080; // 1f800 (3, 15) = 3\n\n    SBOX[5] = new Array();\n    SBOX[5][0] = 0x10000008; // 0 (0, 0) = 12\n    SBOX[5][256] = 0x2000; // 100 (0, 1) = 1\n    SBOX[5][512] = 0x10200000; // 200 (0, 2) = 10\n    SBOX[5][768] = 0x10202008; // 300 (0, 3) = 15\n    SBOX[5][1024] = 0x10002000; // 400 (0, 4) = 9\n    SBOX[5][1280] = 0x200000; // 500 (0, 5) = 2\n    SBOX[5][1536] = 0x200008; // 600 (0, 6) = 6\n    SBOX[5][1792] = 0x10000000; // 700 (0, 7) = 8\n    SBOX[5][2048] = 0x0; // 800 (0, 8) = 0\n    SBOX[5][2304] = 0x10002008; // 900 (0, 9) = 13\n    SBOX[5][2560] = 0x202000; // a00 (0, 10) = 3\n    SBOX[5][2816] = 0x8; // b00 (0, 11) = 4\n    SBOX[5][3072] = 0x10200008; // c00 (0, 12) = 14\n    SBOX[5][3328] = 0x202008; // d00 (0, 13) = 7\n    SBOX[5][3584] = 0x2008; // e00 (0, 14) = 5\n    SBOX[5][3840] = 0x10202000; // f00 (0, 15) = 11\n    SBOX[5][128] = 0x10200000; // 80 (1, 0) = 10\n    SBOX[5][384] = 0x10202008; // 180 (1, 1) = 15\n    SBOX[5][640] = 0x8; // 280 (1, 2) = 4\n    SBOX[5][896] = 0x200000; // 380 (1, 3) = 2\n    SBOX[5][1152] = 0x202008; // 480 (1, 4) = 7\n    SBOX[5][1408] = 0x10000008; // 580 (1, 5) = 12\n    SBOX[5][1664] = 0x10002000; // 680 (1, 6) = 9\n    SBOX[5][1920] = 0x2008; // 780 (1, 7) = 5\n    SBOX[5][2176] = 0x200008; // 880 (1, 8) = 6\n    SBOX[5][2432] = 0x2000; // 980 (1, 9) = 1\n    SBOX[5][2688] = 0x10002008; // a80 (1, 10) = 13\n    SBOX[5][2944] = 0x10200008; // b80 (1, 11) = 14\n    SBOX[5][3200] = 0x0; // c80 (1, 12) = 0\n    SBOX[5][3456] = 0x10202000; // d80 (1, 13) = 11\n    SBOX[5][3712] = 0x202000; // e80 (1, 14) = 3\n    SBOX[5][3968] = 0x10000000; // f80 (1, 15) = 8\n    SBOX[5][4096] = 0x10002000; // 1000 (2, 0) = 9\n    SBOX[5][4352] = 0x10200008; // 1100 (2, 1) = 14\n    SBOX[5][4608] = 0x10202008; // 1200 (2, 2) = 15\n    SBOX[5][4864] = 0x2008; // 1300 (2, 3) = 5\n    SBOX[5][5120] = 0x200000; // 1400 (2, 4) = 2\n    SBOX[5][5376] = 0x10000000; // 1500 (2, 5) = 8\n    SBOX[5][5632] = 0x10000008; // 1600 (2, 6) = 12\n    SBOX[5][5888] = 0x202000; // 1700 (2, 7) = 3\n    SBOX[5][6144] = 0x202008; // 1800 (2, 8) = 7\n    SBOX[5][6400] = 0x0; // 1900 (2, 9) = 0\n    SBOX[5][6656] = 0x8; // 1a00 (2, 10) = 4\n    SBOX[5][6912] = 0x10200000; // 1b00 (2, 11) = 10\n    SBOX[5][7168] = 0x2000; // 1c00 (2, 12) = 1\n    SBOX[5][7424] = 0x10002008; // 1d00 (2, 13) = 13\n    SBOX[5][7680] = 0x10202000; // 1e00 (2, 14) = 11\n    SBOX[5][7936] = 0x200008; // 1f00 (2, 15) = 6\n    SBOX[5][4224] = 0x8; // 1080 (3, 0) = 4\n    SBOX[5][4480] = 0x202000; // 1180 (3, 1) = 3\n    SBOX[5][4736] = 0x200000; // 1280 (3, 2) = 2\n    SBOX[5][4992] = 0x10000008; // 1380 (3, 3) = 12\n    SBOX[5][5248] = 0x10002000; // 1480 (3, 4) = 9\n    SBOX[5][5504] = 0x2008; // 1580 (3, 5) = 5\n    SBOX[5][5760] = 0x10202008; // 1680 (3, 6) = 15\n    SBOX[5][6016] = 0x10200000; // 1780 (3, 7) = 10\n    SBOX[5][6272] = 0x10202000; // 1880 (3, 8) = 11\n    SBOX[5][6528] = 0x10200008; // 1980 (3, 9) = 14\n    SBOX[5][6784] = 0x2000; // 1a80 (3, 10) = 1\n    SBOX[5][7040] = 0x202008; // 1b80 (3, 11) = 7\n    SBOX[5][7296] = 0x200008; // 1c80 (3, 12) = 6\n    SBOX[5][7552] = 0x0; // 1d80 (3, 13) = 0\n    SBOX[5][7808] = 0x10000000; // 1e80 (3, 14) = 8\n    SBOX[5][8064] = 0x10002008; // 1f80 (3, 15) = 13\n\n    SBOX[6] = new Array();\n    SBOX[6][0] = 0x100000; // 0 (0, 0) = 4\n    SBOX[6][16] = 0x2000401; // 10 (0, 1) = 11\n    SBOX[6][32] = 0x400; // 20 (0, 2) = 2\n    SBOX[6][48] = 0x100401; // 30 (0, 3) = 14\n    SBOX[6][64] = 0x2100401; // 40 (0, 4) = 15\n    SBOX[6][80] = 0x0; // 50 (0, 5) = 0\n    SBOX[6][96] = 0x1; // 60 (0, 6) = 8\n    SBOX[6][112] = 0x2100001; // 70 (0, 7) = 13\n    SBOX[6][128] = 0x2000400; // 80 (0, 8) = 3\n    SBOX[6][144] = 0x100001; // 90 (0, 9) = 12\n    SBOX[6][160] = 0x2000001; // a0 (0, 10) = 9\n    SBOX[6][176] = 0x2100400; // b0 (0, 11) = 7\n    SBOX[6][192] = 0x2100000; // c0 (0, 12) = 5\n    SBOX[6][208] = 0x401; // d0 (0, 13) = 10\n    SBOX[6][224] = 0x100400; // e0 (0, 14) = 6\n    SBOX[6][240] = 0x2000000; // f0 (0, 15) = 1\n    SBOX[6][8] = 0x2100001; // 8 (1, 0) = 13\n    SBOX[6][24] = 0x0; // 18 (1, 1) = 0\n    SBOX[6][40] = 0x2000401; // 28 (1, 2) = 11\n    SBOX[6][56] = 0x2100400; // 38 (1, 3) = 7\n    SBOX[6][72] = 0x100000; // 48 (1, 4) = 4\n    SBOX[6][88] = 0x2000001; // 58 (1, 5) = 9\n    SBOX[6][104] = 0x2000000; // 68 (1, 6) = 1\n    SBOX[6][120] = 0x401; // 78 (1, 7) = 10\n    SBOX[6][136] = 0x100401; // 88 (1, 8) = 14\n    SBOX[6][152] = 0x2000400; // 98 (1, 9) = 3\n    SBOX[6][168] = 0x2100000; // a8 (1, 10) = 5\n    SBOX[6][184] = 0x100001; // b8 (1, 11) = 12\n    SBOX[6][200] = 0x400; // c8 (1, 12) = 2\n    SBOX[6][216] = 0x2100401; // d8 (1, 13) = 15\n    SBOX[6][232] = 0x1; // e8 (1, 14) = 8\n    SBOX[6][248] = 0x100400; // f8 (1, 15) = 6\n    SBOX[6][256] = 0x2000000; // 100 (2, 0) = 1\n    SBOX[6][272] = 0x100000; // 110 (2, 1) = 4\n    SBOX[6][288] = 0x2000401; // 120 (2, 2) = 11\n    SBOX[6][304] = 0x2100001; // 130 (2, 3) = 13\n    SBOX[6][320] = 0x100001; // 140 (2, 4) = 12\n    SBOX[6][336] = 0x2000400; // 150 (2, 5) = 3\n    SBOX[6][352] = 0x2100400; // 160 (2, 6) = 7\n    SBOX[6][368] = 0x100401; // 170 (2, 7) = 14\n    SBOX[6][384] = 0x401; // 180 (2, 8) = 10\n    SBOX[6][400] = 0x2100401; // 190 (2, 9) = 15\n    SBOX[6][416] = 0x100400; // 1a0 (2, 10) = 6\n    SBOX[6][432] = 0x1; // 1b0 (2, 11) = 8\n    SBOX[6][448] = 0x0; // 1c0 (2, 12) = 0\n    SBOX[6][464] = 0x2100000; // 1d0 (2, 13) = 5\n    SBOX[6][480] = 0x2000001; // 1e0 (2, 14) = 9\n    SBOX[6][496] = 0x400; // 1f0 (2, 15) = 2\n    SBOX[6][264] = 0x100400; // 108 (3, 0) = 6\n    SBOX[6][280] = 0x2000401; // 118 (3, 1) = 11\n    SBOX[6][296] = 0x2100001; // 128 (3, 2) = 13\n    SBOX[6][312] = 0x1; // 138 (3, 3) = 8\n    SBOX[6][328] = 0x2000000; // 148 (3, 4) = 1\n    SBOX[6][344] = 0x100000; // 158 (3, 5) = 4\n    SBOX[6][360] = 0x401; // 168 (3, 6) = 10\n    SBOX[6][376] = 0x2100400; // 178 (3, 7) = 7\n    SBOX[6][392] = 0x2000001; // 188 (3, 8) = 9\n    SBOX[6][408] = 0x2100000; // 198 (3, 9) = 5\n    SBOX[6][424] = 0x0; // 1a8 (3, 10) = 0\n    SBOX[6][440] = 0x2100401; // 1b8 (3, 11) = 15\n    SBOX[6][456] = 0x100401; // 1c8 (3, 12) = 14\n    SBOX[6][472] = 0x400; // 1d8 (3, 13) = 2\n    SBOX[6][488] = 0x2000400; // 1e8 (3, 14) = 3\n    SBOX[6][504] = 0x100001; // 1f8 (3, 15) = 12\n\n    SBOX[7] = new Array();\n    SBOX[7][0] = 0x8000820; // 0 (0, 0) = 13\n    SBOX[7][1] = 0x20000; // 1 (0, 1) = 2\n    SBOX[7][2] = 0x8000000; // 2 (0, 2) = 8\n    SBOX[7][3] = 0x20; // 3 (0, 3) = 4\n    SBOX[7][4] = 0x20020; // 4 (0, 4) = 6\n    SBOX[7][5] = 0x8020820; // 5 (0, 5) = 15\n    SBOX[7][6] = 0x8020800; // 6 (0, 6) = 11\n    SBOX[7][7] = 0x800; // 7 (0, 7) = 1\n    SBOX[7][8] = 0x8020000; // 8 (0, 8) = 10\n    SBOX[7][9] = 0x8000800; // 9 (0, 9) = 9\n    SBOX[7][10] = 0x20800; // a (0, 10) = 3\n    SBOX[7][11] = 0x8020020; // b (0, 11) = 14\n    SBOX[7][12] = 0x820; // c (0, 12) = 5\n    SBOX[7][13] = 0x0; // d (0, 13) = 0\n    SBOX[7][14] = 0x8000020; // e (0, 14) = 12\n    SBOX[7][15] = 0x20820; // f (0, 15) = 7\n    SBOX[7][-2147483648] = 0x800; // 80000000 (1, 0) = 1\n    SBOX[7][-2147483647] = 0x8020820; // 80000001 (1, 1) = 15\n    SBOX[7][-2147483646] = 0x8000820; // 80000002 (1, 2) = 13\n    SBOX[7][-2147483645] = 0x8000000; // 80000003 (1, 3) = 8\n    SBOX[7][-2147483644] = 0x8020000; // 80000004 (1, 4) = 10\n    SBOX[7][-2147483643] = 0x20800; // 80000005 (1, 5) = 3\n    SBOX[7][-2147483642] = 0x20820; // 80000006 (1, 6) = 7\n    SBOX[7][-2147483641] = 0x20; // 80000007 (1, 7) = 4\n    SBOX[7][-2147483640] = 0x8000020; // 80000008 (1, 8) = 12\n    SBOX[7][-2147483639] = 0x820; // 80000009 (1, 9) = 5\n    SBOX[7][-2147483638] = 0x20020; // 8000000a (1, 10) = 6\n    SBOX[7][-2147483637] = 0x8020800; // 8000000b (1, 11) = 11\n    SBOX[7][-2147483636] = 0x0; // 8000000c (1, 12) = 0\n    SBOX[7][-2147483635] = 0x8020020; // 8000000d (1, 13) = 14\n    SBOX[7][-2147483634] = 0x8000800; // 8000000e (1, 14) = 9\n    SBOX[7][-2147483633] = 0x20000; // 8000000f (1, 15) = 2\n    SBOX[7][16] = 0x20820; // 10 (2, 0) = 7\n    SBOX[7][17] = 0x8020800; // 11 (2, 1) = 11\n    SBOX[7][18] = 0x20; // 12 (2, 2) = 4\n    SBOX[7][19] = 0x800; // 13 (2, 3) = 1\n    SBOX[7][20] = 0x8000800; // 14 (2, 4) = 9\n    SBOX[7][21] = 0x8000020; // 15 (2, 5) = 12\n    SBOX[7][22] = 0x8020020; // 16 (2, 6) = 14\n    SBOX[7][23] = 0x20000; // 17 (2, 7) = 2\n    SBOX[7][24] = 0x0; // 18 (2, 8) = 0\n    SBOX[7][25] = 0x20020; // 19 (2, 9) = 6\n    SBOX[7][26] = 0x8020000; // 1a (2, 10) = 10\n    SBOX[7][27] = 0x8000820; // 1b (2, 11) = 13\n    SBOX[7][28] = 0x8020820; // 1c (2, 12) = 15\n    SBOX[7][29] = 0x20800; // 1d (2, 13) = 3\n    SBOX[7][30] = 0x820; // 1e (2, 14) = 5\n    SBOX[7][31] = 0x8000000; // 1f (2, 15) = 8\n    SBOX[7][-2147483632] = 0x20000; // 80000010 (3, 0) = 2\n    SBOX[7][-2147483631] = 0x800; // 80000011 (3, 1) = 1\n    SBOX[7][-2147483630] = 0x8020020; // 80000012 (3, 2) = 14\n    SBOX[7][-2147483629] = 0x20820; // 80000013 (3, 3) = 7\n    SBOX[7][-2147483628] = 0x20; // 80000014 (3, 4) = 4\n    SBOX[7][-2147483627] = 0x8020000; // 80000015 (3, 5) = 10\n    SBOX[7][-2147483626] = 0x8000000; // 80000016 (3, 6) = 8\n    SBOX[7][-2147483625] = 0x8000820; // 80000017 (3, 7) = 13\n    SBOX[7][-2147483624] = 0x8020820; // 80000018 (3, 8) = 15\n    SBOX[7][-2147483623] = 0x8000020; // 80000019 (3, 9) = 12\n    SBOX[7][-2147483622] = 0x8000800; // 8000001a (3, 10) = 9\n    SBOX[7][-2147483621] = 0x0; // 8000001b (3, 11) = 0\n    SBOX[7][-2147483620] = 0x20800; // 8000001c (3, 12) = 3\n    SBOX[7][-2147483619] = 0x820; // 8000001d (3, 13) = 5\n    SBOX[7][-2147483618] = 0x20020; // 8000001e (3, 14) = 6\n    SBOX[7][-2147483617] = 0x8020800; // 8000001f (3, 15) = 11\n\n    State.prototype._exchangeLR = function(v, m) {\n        var t = ((this.lhs >> v) ^ this.rhs) & m;\n        this.rhs ^= t;\n        this.lhs ^= (t << v);\n    };\n\n    State.prototype._exchangeRL = function(v, m) {\n        var t = ((this.rhs >> v) ^ this.lhs) & m;\n        this.lhs ^= t;\n        this.rhs ^= (t << v);\n    };\n\n    /**\n     * Perform the initial permutation of the input to create the starting state\n     * of the algorithm. The initial permutation maps each consecutive bit of\n     * the input into a different byte of the state.\n     * \n     * <pre>\n     * The initial permutation is defined to be:\n     * \n     *      58    50   42    34    26   18    10    2  \n     *      60    52   44    36    28   20    12    4\n     *      62    54   46    38    30   22    14    6\n     *      64    56   48    40    32   24    16    8\n     *      57    49   41    33    25   17     9    1\n     *      59    51   43    35    27   19    11    3\n     *      61    53   45    37    29   21    13    5\n     *      63    55   47    39    31   23    15    7\n     * </pre>\n     * \n     * \n     * @param message\n     *            The message as an array of unsigned bytes.\n     * @param offset\n     *            The offset into the message that the current 64-bit block\n     *            begins.\n     * @returns the initial engine state\n     */\n    State.prototype.initialPerm = function(message, offset) {\n        var input = message.slice(offset, offset + 8);\n\n        this.lhs = (input[0] << 24) + (input[1] << 16) + (input[2] << 8)\n                + input[3];\n        this.rhs = (input[4] << 24) + (input[5] << 16) + (input[6] << 8)\n                + input[7];\n\n        this._exchangeLR(4, 0x0f0f0f0f);\n        this._exchangeLR(16, 0x0000ffff);\n        this._exchangeRL(2, 0x33333333);\n        this._exchangeRL(8, 0x00ff00ff);\n        this._exchangeLR(1, 0x55555555);\n    };\n\n    /**\n     * Perform one round of the DES algorithm using the given key. A round is\n     * defined as:\n     * \n     * <pre>\n     * L&amp;rsquo = R\n     * R&amp;rsquo = L &circ; f(R, k)\n     * </pre>\n     * \n     * where f consists of expanding, XORing with the key and contracting back\n     * with the SBOXes.\n     * \n     * Note that the final round is defined slightly differently as:\n     * \n     * <pre>\n     * L&amp;rsquo = L &circ; f(R, k)\n     * R&amp;rsquo = R\n     * </pre>\n     * \n     * Therefore in the final round this function produces LHS and RHS the wrong\n     * way around.\n     * \n     * @param k\n     *            the key\n     */\n    State.prototype.round = function(k) {\n        var r = this.rhs, l = this.lhs;\n        var f = 0;\n        for ( var i = 0; i < 8; i++) {\n            var v = (r ^ k[i]) & State.SBOX_MASK[i];\n            f += State.SBOX[i][v];\n        }\n\n        this.lhs = r;\n        this.rhs = l ^ f;\n    };\n\n    /**\n     * Apply the inverse of the initial permutation.\n     * \n     * <pre>\n     * The inverse is defined to be:\n     * \n     *      40     8   48    16    56   24    64   32\n     *      39     7   47    15    55   23    63   31\n     *      38     6   46    14    54   22    62   30\n     *      37     5   45    13    53   21    61   29\n     *      36     4   44    12    52   20    60   28\n     *      35     3   43    11    51   19    59   27\n     *      34     2   42    10    50   18    58   26\n     *      33     1   41     9    49   17    57   25\n     * </pre>\n     * \n     * @param cipherText\n     * @param offset\n     */\n    State.prototype.finalPerm = function(cipherText, offset) {\n        var t = this.lhs;\n        this.lhs = this.rhs;\n        this.rhs = t;\n\n        this._exchangeLR(1, 0x55555555);\n        this._exchangeRL(8, 0x00ff00ff);\n        this._exchangeRL(2, 0x33333333);\n        this._exchangeLR(16, 0x0000ffff);\n        this._exchangeLR(4, 0x0f0f0f0f);\n\n        cipherText[offset] = (this.lhs >> 24) & 0xff;\n        cipherText[offset + 1] = (this.lhs >> 16) & 0xff;\n        cipherText[offset + 2] = (this.lhs >> 8) & 0xff;\n        cipherText[offset + 3] = (this.lhs) & 0xff;\n        cipherText[offset + 4] = (this.rhs >> 24) & 0xff;\n        cipherText[offset + 5] = (this.rhs >> 16) & 0xff;\n        cipherText[offset + 6] = (this.rhs >> 8) & 0xff;\n        cipherText[offset + 7] = (this.rhs) & 0xff;\n    };\n\n    /**\n     * DES cipher\n     */\n    var DES = C.DES = {\n        _blocksize : 2,\n\n        _keyschedule : null,\n\n        _state : new State(),\n\n        _init : function(k) {\n            this._keyschedule = new KeySchedule(k);\n        },\n\n        encrypt : function(message, password, options) {\n\n            options = options || {};\n\n            // Determine mode\n            var mode = options.mode || new C.mode.OFB;\n\n            // Allow mode to override options\n            if (mode.fixOptions)\n                mode.fixOptions(options);\n\n            var\n            // Convert to bytes if message is a string\n            m = (message.constructor == String ? UTF8.stringToBytes(message)\n                    : message),\n\n            // Generate random IV\n            iv = options.iv || util.randomBytes(8),\n\n            // Generate key\n            k = (password.constructor == String ?\n            // Derive key from passphrase\n            C.PBKDF2(password, iv, 8, {\n                asBytes : true\n            }) :\n            // else, assume byte array representing cryptographic key\n            password);\n\n            // Create key schedule\n            this._keyschedule = new KeySchedule(k);\n\n            // Encrypt\n            mode.encrypt(DES, m, iv);\n\n            // Return ciphertext\n            m = options.iv ? m : iv.concat(m);\n            return (options && options.asBytes) ? m : util.bytesToBase64(m);\n        },\n\n        _encryptblock : function(message, offset) {\n            this._state.initialPerm(message, offset);\n            for ( var i = 0; i <= 15; i++) {\n                this._state.round(this._keyschedule.getKey(i));\n            }\n            this._state.finalPerm(message, offset);\n        },\n\n        decrypt : function(ciphertext, password, options) {\n            options = options || {};\n\n            // Determine mode\n            var mode = options.mode || new C.mode.OFB;\n\n            // Allow mode to override options\n            if (mode.fixOptions)\n                mode.fixOptions(options);\n\n            var\n\n            // Convert to bytes if ciphertext is a string\n            c = (ciphertext.constructor == String ? util\n                    .base64ToBytes(ciphertext) : ciphertext),\n\n            // Separate IV and message\n            iv = options.iv || c.splice(0, 8),\n\n            // Generate key\n            k = (password.constructor == String ?\n            // Derive key from passphrase\n            C.PBKDF2(password, iv, 32, {\n                asBytes : true\n            }) :\n            // else, assume byte array representing cryptographic key\n            password);\n\n            // Create key schedule\n            this._keyschedule = new KeySchedule(k);\n\n            mode.decrypt(DES, c, iv);\n\n            // Return plaintext\n            return (options && options.asBytes) ? c : UTF8.bytesToString(c);\n        },\n\n        _decryptblock : function(message, offset) {\n            this._state.initialPerm(message, offset);\n            for ( var i = 15; i >= 0; i--) {\n                this._state.round(this._keyschedule.getKey(i));\n            }\n            this._state.finalPerm(message, offset);\n        }\n\n    };\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/HMAC.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\nC.HMAC = function (hasher, message, key, options) {\n\n\t// Convert to byte arrays\n\tif (message.constructor == String) message = UTF8.stringToBytes(message);\n\tif (key.constructor == String) key = UTF8.stringToBytes(key);\n\t/* else, assume byte arrays already */\n\n\t// Allow arbitrary length keys\n\tif (key.length > hasher._blocksize * 4)\n\t\tkey = hasher(key, { asBytes: true });\n\n\t// XOR keys with pad constants\n\tvar okey = key.slice(0),\n\t    ikey = key.slice(0);\n\tfor (var i = 0; i < hasher._blocksize * 4; i++) {\n\t\tokey[i] ^= 0x5C;\n\t\tikey[i] ^= 0x36;\n\t}\n\n\tvar hmacbytes = hasher(okey.concat(hasher(ikey.concat(message), { asBytes: true })), { asBytes: true });\n\n\treturn options && options.asBytes ? hmacbytes :\n\t       options && options.asString ? Binary.bytesToString(hmacbytes) :\n\t       util.bytesToHex(hmacbytes);\n\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/MARC4.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\nvar MARC4 = C.MARC4 = {\n\n\t/**\n\t * Public API\n\t */\n\n\tencrypt: function (message, password) {\n\n\t\tvar\n\n\t\t    // Convert to bytes\n\t\t    m = UTF8.stringToBytes(message),\n\n\t\t    // Generate random IV\n\t\t    iv = util.randomBytes(16),\n\n\t\t    // Generate key\n\t\t    k = password.constructor == String ?\n\t\t        // Derive key from passphrase\n\t\t        C.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t        // else, assume byte array representing cryptographic key\n\t\t        password;\n\n\t\t// Encrypt\n\t\tMARC4._marc4(m, k, 1536);\n\n\t\t// Return ciphertext\n\t\treturn util.bytesToBase64(iv.concat(m));\n\n\t},\n\n\tdecrypt: function (ciphertext, password) {\n\n\t\tvar\n\n\t\t    // Convert to bytes\n\t\t    c = util.base64ToBytes(ciphertext),\n\n\t\t    // Separate IV and message\n\t\t    iv = c.splice(0, 16),\n\n\t\t    // Generate key\n\t\t    k = password.constructor == String ?\n\t\t        // Derive key from passphrase\n\t\t        C.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t        // else, assume byte array representing cryptographic key\n\t\t        password;\n\n\t\t// Decrypt\n\t\tMARC4._marc4(c, k, 1536);\n\n\t\t// Return plaintext\n\t\treturn UTF8.bytesToString(c);\n\n\t},\n\n\n\t/**\n\t * Internal methods\n\t */\n\n\t// The core\n\t_marc4: function (m, k, drop) {\n\n\t\t// State variables\n\t\tvar i, j, s, temp;\n\n\t\t// Key setup\n\t\tfor (i = 0, s = []; i < 256; i++) s[i] = i;\n\t\tfor (i = 0, j = 0;  i < 256; i++) {\n\n\t\t\tj = (j + s[i] + k[i % k.length]) % 256;\n\n\t\t\t// Swap\n\t\t\ttemp = s[i];\n\t\t\ts[i] = s[j];\n\t\t\ts[j] = temp;\n\n\t\t}\n\n\t\t// Clear counters\n\t\ti = j = 0;\n\n\t\t// Encryption\n\t\tfor (var k = -drop; k < m.length; k++) {\n\n\t\t\ti = (i + 1) % 256;\n\t\t\tj = (j + s[i]) % 256;\n\n\t\t\t// Swap\n\t\t\ttemp = s[i];\n\t\t\ts[i] = s[j];\n\t\t\ts[j] = temp;\n\n\t\t\t// Stop here if we're still dropping keystream\n\t\t\tif (k < 0) continue;\n\n\t\t\t// Encrypt\n\t\t\tm[k] ^= s[(s[i] + s[j]) % 256];\n\n\t\t}\n\n\t}\n\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/MD5.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\n// Public API\nvar MD5 = C.MD5 = function (message, options) {\n\tvar digestbytes = util.wordsToBytes(MD5._md5(message));\n\treturn options && options.asBytes ? digestbytes :\n\t       options && options.asString ? Binary.bytesToString(digestbytes) :\n\t       util.bytesToHex(digestbytes);\n};\n\n// The core\nMD5._md5 = function (message) {\n\n\t// Convert to byte array\n\tif (message.constructor == String) message = UTF8.stringToBytes(message);\n\t/* else, assume byte array already */\n\n\tvar m = util.bytesToWords(message),\n\t    l = message.length * 8,\n\t    a =  1732584193,\n\t    b = -271733879,\n\t    c = -1732584194,\n\t    d =  271733878;\n\n\t// Swap endian\n\tfor (var i = 0; i < m.length; i++) {\n\t\tm[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |\n\t\t       ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;\n\t}\n\n\t// Padding\n\tm[l >>> 5] |= 0x80 << (l % 32);\n\tm[(((l + 64) >>> 9) << 4) + 14] = l;\n\n\t// Method shortcuts\n\tvar FF = MD5._ff,\n\t    GG = MD5._gg,\n\t    HH = MD5._hh,\n\t    II = MD5._ii;\n\n\tfor (var i = 0; i < m.length; i += 16) {\n\n\t\tvar aa = a,\n\t\t    bb = b,\n\t\t    cc = c,\n\t\t    dd = d;\n\n\t\ta = FF(a, b, c, d, m[i+ 0],  7, -680876936);\n\t\td = FF(d, a, b, c, m[i+ 1], 12, -389564586);\n\t\tc = FF(c, d, a, b, m[i+ 2], 17,  606105819);\n\t\tb = FF(b, c, d, a, m[i+ 3], 22, -1044525330);\n\t\ta = FF(a, b, c, d, m[i+ 4],  7, -176418897);\n\t\td = FF(d, a, b, c, m[i+ 5], 12,  1200080426);\n\t\tc = FF(c, d, a, b, m[i+ 6], 17, -1473231341);\n\t\tb = FF(b, c, d, a, m[i+ 7], 22, -45705983);\n\t\ta = FF(a, b, c, d, m[i+ 8],  7,  1770035416);\n\t\td = FF(d, a, b, c, m[i+ 9], 12, -1958414417);\n\t\tc = FF(c, d, a, b, m[i+10], 17, -42063);\n\t\tb = FF(b, c, d, a, m[i+11], 22, -1990404162);\n\t\ta = FF(a, b, c, d, m[i+12],  7,  1804603682);\n\t\td = FF(d, a, b, c, m[i+13], 12, -40341101);\n\t\tc = FF(c, d, a, b, m[i+14], 17, -1502002290);\n\t\tb = FF(b, c, d, a, m[i+15], 22,  1236535329);\n\n\t\ta = GG(a, b, c, d, m[i+ 1],  5, -165796510);\n\t\td = GG(d, a, b, c, m[i+ 6],  9, -1069501632);\n\t\tc = GG(c, d, a, b, m[i+11], 14,  643717713);\n\t\tb = GG(b, c, d, a, m[i+ 0], 20, -373897302);\n\t\ta = GG(a, b, c, d, m[i+ 5],  5, -701558691);\n\t\td = GG(d, a, b, c, m[i+10],  9,  38016083);\n\t\tc = GG(c, d, a, b, m[i+15], 14, -660478335);\n\t\tb = GG(b, c, d, a, m[i+ 4], 20, -405537848);\n\t\ta = GG(a, b, c, d, m[i+ 9],  5,  568446438);\n\t\td = GG(d, a, b, c, m[i+14],  9, -1019803690);\n\t\tc = GG(c, d, a, b, m[i+ 3], 14, -187363961);\n\t\tb = GG(b, c, d, a, m[i+ 8], 20,  1163531501);\n\t\ta = GG(a, b, c, d, m[i+13],  5, -1444681467);\n\t\td = GG(d, a, b, c, m[i+ 2],  9, -51403784);\n\t\tc = GG(c, d, a, b, m[i+ 7], 14,  1735328473);\n\t\tb = GG(b, c, d, a, m[i+12], 20, -1926607734);\n\n\t\ta = HH(a, b, c, d, m[i+ 5],  4, -378558);\n\t\td = HH(d, a, b, c, m[i+ 8], 11, -2022574463);\n\t\tc = HH(c, d, a, b, m[i+11], 16,  1839030562);\n\t\tb = HH(b, c, d, a, m[i+14], 23, -35309556);\n\t\ta = HH(a, b, c, d, m[i+ 1],  4, -1530992060);\n\t\td = HH(d, a, b, c, m[i+ 4], 11,  1272893353);\n\t\tc = HH(c, d, a, b, m[i+ 7], 16, -155497632);\n\t\tb = HH(b, c, d, a, m[i+10], 23, -1094730640);\n\t\ta = HH(a, b, c, d, m[i+13],  4,  681279174);\n\t\td = HH(d, a, b, c, m[i+ 0], 11, -358537222);\n\t\tc = HH(c, d, a, b, m[i+ 3], 16, -722521979);\n\t\tb = HH(b, c, d, a, m[i+ 6], 23,  76029189);\n\t\ta = HH(a, b, c, d, m[i+ 9],  4, -640364487);\n\t\td = HH(d, a, b, c, m[i+12], 11, -421815835);\n\t\tc = HH(c, d, a, b, m[i+15], 16,  530742520);\n\t\tb = HH(b, c, d, a, m[i+ 2], 23, -995338651);\n\n\t\ta = II(a, b, c, d, m[i+ 0],  6, -198630844);\n\t\td = II(d, a, b, c, m[i+ 7], 10,  1126891415);\n\t\tc = II(c, d, a, b, m[i+14], 15, -1416354905);\n\t\tb = II(b, c, d, a, m[i+ 5], 21, -57434055);\n\t\ta = II(a, b, c, d, m[i+12],  6,  1700485571);\n\t\td = II(d, a, b, c, m[i+ 3], 10, -1894986606);\n\t\tc = II(c, d, a, b, m[i+10], 15, -1051523);\n\t\tb = II(b, c, d, a, m[i+ 1], 21, -2054922799);\n\t\ta = II(a, b, c, d, m[i+ 8],  6,  1873313359);\n\t\td = II(d, a, b, c, m[i+15], 10, -30611744);\n\t\tc = II(c, d, a, b, m[i+ 6], 15, -1560198380);\n\t\tb = II(b, c, d, a, m[i+13], 21,  1309151649);\n\t\ta = II(a, b, c, d, m[i+ 4],  6, -145523070);\n\t\td = II(d, a, b, c, m[i+11], 10, -1120210379);\n\t\tc = II(c, d, a, b, m[i+ 2], 15,  718787259);\n\t\tb = II(b, c, d, a, m[i+ 9], 21, -343485551);\n\n\t\ta = (a + aa) >>> 0;\n\t\tb = (b + bb) >>> 0;\n\t\tc = (c + cc) >>> 0;\n\t\td = (d + dd) >>> 0;\n\n\t}\n\n\treturn util.endian([a, b, c, d]);\n\n};\n\n// Auxiliary functions\nMD5._ff  = function (a, b, c, d, x, s, t) {\n\tvar n = a + (b & c | ~b & d) + (x >>> 0) + t;\n\treturn ((n << s) | (n >>> (32 - s))) + b;\n};\nMD5._gg  = function (a, b, c, d, x, s, t) {\n\tvar n = a + (b & d | c & ~d) + (x >>> 0) + t;\n\treturn ((n << s) | (n >>> (32 - s))) + b;\n};\nMD5._hh  = function (a, b, c, d, x, s, t) {\n\tvar n = a + (b ^ c ^ d) + (x >>> 0) + t;\n\treturn ((n << s) | (n >>> (32 - s))) + b;\n};\nMD5._ii  = function (a, b, c, d, x, s, t) {\n\tvar n = a + (c ^ (b | ~d)) + (x >>> 0) + t;\n\treturn ((n << s) | (n >>> (32 - s))) + b;\n};\n\n// Package private blocksize\nMD5._blocksize = 16;\n\nMD5._digestsize = 16;\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/PBKDF2.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\nC.PBKDF2 = function (password, salt, keylen, options) {\n\n\t// Convert to byte arrays\n\tif (password.constructor == String) password = UTF8.stringToBytes(password);\n\tif (salt.constructor == String) salt = UTF8.stringToBytes(salt);\n\t/* else, assume byte arrays already */\n\n\t// Defaults\n\tvar hasher = options && options.hasher || C.SHA1,\n\t    iterations = options && options.iterations || 1;\n\n\t// Pseudo-random function\n\tfunction PRF(password, salt) {\n\t\treturn C.HMAC(hasher, salt, password, { asBytes: true });\n\t}\n\n\t// Generate key\n\tvar derivedKeyBytes = [],\n\t    blockindex = 1;\n\twhile (derivedKeyBytes.length < keylen) {\n\t\tvar block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));\n\t\tfor (var u = block, i = 1; i < iterations; i++) {\n\t\t\tu = PRF(password, u);\n\t\t\tfor (var j = 0; j < block.length; j++) block[j] ^= u[j];\n\t\t}\n\t\tderivedKeyBytes = derivedKeyBytes.concat(block);\n\t\tblockindex++;\n\t}\n\n\t// Truncate excess bytes\n\tderivedKeyBytes.length = keylen;\n\n\treturn options && options.asBytes ? derivedKeyBytes :\n\t       options && options.asString ? Binary.bytesToString(derivedKeyBytes) :\n\t       util.bytesToHex(derivedKeyBytes);\n\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/PBKDF2Async.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\nif (!C.nextTick) {\n    // node.js has setTime out but prefer process.nextTick\n    if (typeof process != 'undefined' && typeof process.nextTick !== 'undefined') {\n        C.nextTick = process.nextTick;\n    } else if (typeof setTimeout !== 'undefined') {\n        C.nextTick = function (callback) {\n            setTimeout(callback, 0);\n        };\n    }\n}\n\nC.PBKDF2Async = function (password, salt, keylen, callback, options) {\n\n    // Convert to byte arrays\n    if (password.constructor == String) password = UTF8.stringToBytes(password);\n    if (salt.constructor == String) salt = UTF8.stringToBytes(salt);\n    /* else, assume byte arrays already */\n\n    // Defaults\n    var hasher = options && options.hasher || C.SHA1,\n        iterations = options && options.iterations || 1;\n\n    // Progress callback option\n    var progressChangeHandler = options && options.onProgressChange;\n    var totalIterations = Math.ceil(keylen / hasher._digestsize) * iterations;\n    function fireProgressChange(currentIteration) {\n        if (progressChangeHandler) {\n            var iterationsSoFar = derivedKeyBytes.length / hasher._digestsize * iterations + currentIteration;\n            setTimeout(function () {\n                progressChangeHandler(Math.round(iterationsSoFar / totalIterations * 100));\n            }, 0);\n        }\n    }\n\n    // Pseudo-random function\n    function PRF(password, salt) {\n        return C.HMAC(hasher, salt, password, { asBytes: true });\n    }\n\n    var nextTick = C.nextTick;\n\n    // Generate key\n    var derivedKeyBytes = [],\n        blockindex = 1;\n\n    var outer, inner;\n    nextTick(outer = function () {\n        if (derivedKeyBytes.length < keylen) {\n            var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));\n            fireProgressChange(1);\n\n            var u = block, i = 1;\n            nextTick(inner = function () {\n                if (i < iterations) {\n                    u = PRF(password, u);\n                    for (var j = 0; j < block.length; j++) block[j] ^= u[j];\n                    i++;\n                    fireProgressChange(i);\n\n                    nextTick(inner);\n                } else {\n                    derivedKeyBytes = derivedKeyBytes.concat(block);\n                    blockindex++;\n                    nextTick(outer);\n                }\n            });\n        } else {\n            // Truncate excess bytes\n            derivedKeyBytes.length = keylen;\n            callback(\n                    options && options.asBytes ? derivedKeyBytes :\n                    options && options.asString ? Binary.bytesToString(derivedKeyBytes) :\n                    util.bytesToHex(derivedKeyBytes));\n        }\n    });\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/Rabbit.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\n// Inner state\nvar x = [],\n    c = [],\n    b;\n\nvar Rabbit = C.Rabbit = {\n\n\t/**\n\t * Public API\n\t */\n\n\tencrypt: function (message, password) {\n\n\t\tvar\n\n\t\t    // Convert to bytes\n\t\t    m = UTF8.stringToBytes(message),\n\n\t\t    // Generate random IV\n\t\t    iv = util.randomBytes(8),\n\n\t\t    // Generate key\n\t\t    k = password.constructor == String ?\n\t\t        // Derive key from passphrase\n\t\t        C.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t        // else, assume byte array representing cryptographic key\n\t\t        password;\n\n\t\t// Encrypt\n\t\tRabbit._rabbit(m, k, util.bytesToWords(iv));\n\n\t\t// Return ciphertext\n\t\treturn util.bytesToBase64(iv.concat(m));\n\n\t},\n\n\tdecrypt: function (ciphertext, password) {\n\n\t\tvar\n\n\t\t    // Convert to bytes\n\t\t    c = util.base64ToBytes(ciphertext),\n\n\t\t    // Separate IV and message\n\t\t    iv = c.splice(0, 8),\n\n\t\t    // Generate key\n\t\t    k = password.constructor == String ?\n\t\t        // Derive key from passphrase\n\t\t        C.PBKDF2(password, iv, 32, { asBytes: true }) :\n\t\t        // else, assume byte array representing cryptographic key\n\t\t        password;\n\n\t\t// Decrypt\n\t\tRabbit._rabbit(c, k, util.bytesToWords(iv));\n\n\t\t// Return plaintext\n\t\treturn UTF8.bytesToString(c);\n\n\t},\n\n\n\t/**\n\t * Internal methods\n\t */\n\n\t// Encryption/decryption scheme\n\t_rabbit: function (m, k, iv) {\n\n\t\tRabbit._keysetup(k);\n\t\tif (iv) Rabbit._ivsetup(iv);\n\n\t\tfor (var s = [], i = 0; i < m.length; i++) {\n\n\t\t\tif (i % 16 == 0) {\n\n\t\t\t\t// Iterate the system\n\t\t\t\tRabbit._nextstate();\n\n\t\t\t\t// Generate 16 bytes of pseudo-random data\n\t\t\t\ts[0] = x[0] ^ (x[5] >>> 16) ^ (x[3] << 16);\n\t\t\t\ts[1] = x[2] ^ (x[7] >>> 16) ^ (x[5] << 16);\n\t\t\t\ts[2] = x[4] ^ (x[1] >>> 16) ^ (x[7] << 16);\n\t\t\t\ts[3] = x[6] ^ (x[3] >>> 16) ^ (x[1] << 16);\n\n\t\t\t\t// Swap endian\n\t\t\t\tfor (var j = 0; j < 4; j++) {\n\t\t\t\t\ts[j] = ((s[j] <<  8) | (s[j] >>> 24)) & 0x00FF00FF |\n\t\t\t\t\t       ((s[j] << 24) | (s[j] >>>  8)) & 0xFF00FF00;\n\t\t\t\t}\n\n\t\t\t\t// Convert words to bytes\n\t\t\t\tfor (var b = 120; b >= 0; b -= 8)\n\t\t\t\t\ts[b / 8] = (s[b >>> 5] >>> (24 - b % 32)) & 0xFF;\n\n\t\t\t}\n\n\t\t\tm[i] ^= s[i % 16];\n\n\t\t}\n\n\t},\n\n\t// Key setup scheme\n\t_keysetup: function (k) {\n\n\t\t// Generate initial state values\n\t\tx[0] = k[0];\n\t\tx[2] = k[1];\n\t\tx[4] = k[2];\n\t\tx[6] = k[3];\n\t\tx[1] = (k[3] << 16) | (k[2] >>> 16);\n\t\tx[3] = (k[0] << 16) | (k[3] >>> 16);\n\t\tx[5] = (k[1] << 16) | (k[0] >>> 16);\n\t\tx[7] = (k[2] << 16) | (k[1] >>> 16);\n\n\t\t// Generate initial counter values\n\t\tc[0] = util.rotl(k[2], 16);\n\t\tc[2] = util.rotl(k[3], 16);\n\t\tc[4] = util.rotl(k[0], 16);\n\t\tc[6] = util.rotl(k[1], 16);\n\t\tc[1] = (k[0] & 0xFFFF0000) | (k[1] & 0xFFFF);\n\t\tc[3] = (k[1] & 0xFFFF0000) | (k[2] & 0xFFFF);\n\t\tc[5] = (k[2] & 0xFFFF0000) | (k[3] & 0xFFFF);\n\t\tc[7] = (k[3] & 0xFFFF0000) | (k[0] & 0xFFFF);\n\n\t\t// Clear carry bit\n\t\tb = 0;\n\n\t\t// Iterate the system four times\n\t\tfor (var i = 0; i < 4; i++) Rabbit._nextstate();\n\n\t\t// Modify the counters\n\t\tfor (var i = 0; i < 8; i++) c[i] ^= x[(i + 4) & 7];\n\n\t},\n\n\t// IV setup scheme\n\t_ivsetup: function (iv) {\n\n\t\t// Generate four subvectors\n\t\tvar i0 = util.endian(iv[0]),\n\t\t    i2 = util.endian(iv[1]),\n\t\t    i1 = (i0 >>> 16) | (i2 & 0xFFFF0000),\n\t\t    i3 = (i2 <<  16) | (i0 & 0x0000FFFF);\n\n\t\t// Modify counter values\n\t\tc[0] ^= i0;\n\t\tc[1] ^= i1;\n\t\tc[2] ^= i2;\n\t\tc[3] ^= i3;\n\t\tc[4] ^= i0;\n\t\tc[5] ^= i1;\n\t\tc[6] ^= i2;\n\t\tc[7] ^= i3;\n\n\t\t// Iterate the system four times\n\t\tfor (var i = 0; i < 4; i++) Rabbit._nextstate();\n\n\t},\n\n\t// Next-state function\n\t_nextstate: function () {\n\n\t\t// Save old counter values\n\t\tfor (var c_old = [], i = 0; i < 8; i++) c_old[i] = c[i];\n\n\t\t// Calculate new counter values\n\t\tc[0] = (c[0] + 0x4D34D34D + b) >>> 0;\n\t\tc[1] = (c[1] + 0xD34D34D3 + ((c[0] >>> 0) < (c_old[0] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[2] = (c[2] + 0x34D34D34 + ((c[1] >>> 0) < (c_old[1] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[3] = (c[3] + 0x4D34D34D + ((c[2] >>> 0) < (c_old[2] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[4] = (c[4] + 0xD34D34D3 + ((c[3] >>> 0) < (c_old[3] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[5] = (c[5] + 0x34D34D34 + ((c[4] >>> 0) < (c_old[4] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[6] = (c[6] + 0x4D34D34D + ((c[5] >>> 0) < (c_old[5] >>> 0) ? 1 : 0)) >>> 0;\n\t\tc[7] = (c[7] + 0xD34D34D3 + ((c[6] >>> 0) < (c_old[6] >>> 0) ? 1 : 0)) >>> 0;\n\t\tb = (c[7] >>> 0) < (c_old[7] >>> 0) ? 1 : 0;\n\n\t\t// Calculate the g-values\n\t\tfor (var g = [], i = 0; i < 8; i++) {\n\n\t\t\tvar gx = (x[i] + c[i]) >>> 0;\n\n\t\t\t// Construct high and low argument for squaring\n\t\t\tvar ga = gx & 0xFFFF,\n\t\t\t    gb = gx >>> 16;\n\n\t\t\t// Calculate high and low result of squaring\n\t\t\tvar gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb,\n\t\t\t    gl = (((gx & 0xFFFF0000) * gx) >>> 0) + (((gx & 0x0000FFFF) * gx) >>> 0) >>> 0;\n\n\t\t\t// High XOR low\n\t\t\tg[i] = gh ^ gl;\n\n\t\t}\n\n\t\t// Calculate new state values\n\t\tx[0] = g[0] + ((g[7] << 16) | (g[7] >>> 16)) + ((g[6] << 16) | (g[6] >>> 16));\n\t\tx[1] = g[1] + ((g[0] <<  8) | (g[0] >>> 24)) + g[7];\n\t\tx[2] = g[2] + ((g[1] << 16) | (g[1] >>> 16)) + ((g[0] << 16) | (g[0] >>> 16));\n\t\tx[3] = g[3] + ((g[2] <<  8) | (g[2] >>> 24)) + g[1];\n\t\tx[4] = g[4] + ((g[3] << 16) | (g[3] >>> 16)) + ((g[2] << 16) | (g[2] >>> 16));\n\t\tx[5] = g[5] + ((g[4] <<  8) | (g[4] >>> 24)) + g[3];\n\t\tx[6] = g[6] + ((g[5] << 16) | (g[5] >>> 16)) + ((g[4] << 16) | (g[4] >>> 16));\n\t\tx[7] = g[7] + ((g[6] <<  8) | (g[6] >>> 24)) + g[5];\n\n\t}\n\n};\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/SHA1.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\n// Public API\nvar SHA1 = C.SHA1 = function (message, options) {\n\tvar digestbytes = util.wordsToBytes(SHA1._sha1(message));\n\treturn options && options.asBytes ? digestbytes :\n\t       options && options.asString ? Binary.bytesToString(digestbytes) :\n\t       util.bytesToHex(digestbytes);\n};\n\n// The core\nSHA1._sha1 = function (message) {\n\n\t// Convert to byte array\n\tif (message.constructor == String) message = UTF8.stringToBytes(message);\n\t/* else, assume byte array already */\n\n\tvar m  = util.bytesToWords(message),\n\t    l  = message.length * 8,\n\t    w  =  [],\n\t    H0 =  1732584193,\n\t    H1 = -271733879,\n\t    H2 = -1732584194,\n\t    H3 =  271733878,\n\t    H4 = -1009589776;\n\n\t// Padding\n\tm[l >> 5] |= 0x80 << (24 - l % 32);\n\tm[((l + 64 >>> 9) << 4) + 15] = l;\n\n\tfor (var i = 0; i < m.length; i += 16) {\n\n\t\tvar a = H0,\n\t\t    b = H1,\n\t\t    c = H2,\n\t\t    d = H3,\n\t\t    e = H4;\n\n\t\tfor (var j = 0; j < 80; j++) {\n\n\t\t\tif (j < 16) w[j] = m[i + j];\n\t\t\telse {\n\t\t\t\tvar n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];\n\t\t\t\tw[j] = (n << 1) | (n >>> 31);\n\t\t\t}\n\n\t\t\tvar t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (\n\t\t\t         j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :\n\t\t\t         j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :\n\t\t\t         j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :\n\t\t\t                  (H1 ^ H2 ^ H3) - 899497514);\n\n\t\t\tH4 =  H3;\n\t\t\tH3 =  H2;\n\t\t\tH2 = (H1 << 30) | (H1 >>> 2);\n\t\t\tH1 =  H0;\n\t\t\tH0 =  t;\n\n\t\t}\n\n\t\tH0 += a;\n\t\tH1 += b;\n\t\tH2 += c;\n\t\tH3 += d;\n\t\tH4 += e;\n\n\t}\n\n\treturn [H0, H1, H2, H3, H4];\n\n};\n\n// Package private blocksize\nSHA1._blocksize = 16;\n\nSHA1._digestsize = 20;\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/lib/SHA256.js",
    "content": "(function(){\n\nvar C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;\n\n// Shortcuts\nvar util = C.util,\n    charenc = C.charenc,\n    UTF8 = charenc.UTF8,\n    Binary = charenc.Binary;\n\n// Constants\nvar K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,\n          0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,\n          0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,\n          0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,\n          0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,\n          0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,\n          0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,\n          0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,\n          0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,\n          0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,\n          0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,\n          0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,\n          0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,\n          0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,\n          0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,\n          0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ];\n\n// Public API\nvar SHA256 = C.SHA256 = function (message, options) {\n\tvar digestbytes = util.wordsToBytes(SHA256._sha256(message));\n\treturn options && options.asBytes ? digestbytes :\n\t       options && options.asString ? Binary.bytesToString(digestbytes) :\n\t       util.bytesToHex(digestbytes);\n};\n\n// The core\nSHA256._sha256 = function (message) {\n\n\t// Convert to byte array\n\tif (message.constructor == String) message = UTF8.stringToBytes(message);\n\t/* else, assume byte array already */\n\n\tvar m = util.bytesToWords(message),\n\t    l = message.length * 8,\n\t    H = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,\n\t          0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 ],\n\t    w = [],\n\t    a, b, c, d, e, f, g, h, i, j,\n\t    t1, t2;\n\n\t// Padding\n\tm[l >> 5] |= 0x80 << (24 - l % 32);\n\tm[((l + 64 >> 9) << 4) + 15] = l;\n\n\tfor (var i = 0; i < m.length; i += 16) {\n\n\t\ta = H[0];\n\t\tb = H[1];\n\t\tc = H[2];\n\t\td = H[3];\n\t\te = H[4];\n\t\tf = H[5];\n\t\tg = H[6];\n\t\th = H[7];\n\n\t\tfor (var j = 0; j < 64; j++) {\n\n\t\t\tif (j < 16) w[j] = m[j + i];\n\t\t\telse {\n\n\t\t\t\tvar gamma0x = w[j - 15],\n\t\t\t\t    gamma1x = w[j - 2],\n\t\t\t\t    gamma0  = ((gamma0x << 25) | (gamma0x >>>  7)) ^\n\t\t\t\t              ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t\t\t\t               (gamma0x >>> 3),\n\t\t\t\t    gamma1  = ((gamma1x <<  15) | (gamma1x >>> 17)) ^\n\t\t\t\t              ((gamma1x <<  13) | (gamma1x >>> 19)) ^\n\t\t\t\t               (gamma1x >>> 10);\n\n\t\t\t\tw[j] = gamma0 + (w[j - 7] >>> 0) +\n\t\t\t\t       gamma1 + (w[j - 16] >>> 0);\n\n\t\t\t}\n\n\t\t\tvar ch  = e & f ^ ~e & g,\n\t\t\t    maj = a & b ^ a & c ^ b & c,\n\t\t\t    sigma0 = ((a << 30) | (a >>>  2)) ^\n\t\t\t             ((a << 19) | (a >>> 13)) ^\n\t\t\t             ((a << 10) | (a >>> 22)),\n\t\t\t    sigma1 = ((e << 26) | (e >>>  6)) ^\n\t\t\t             ((e << 21) | (e >>> 11)) ^\n\t\t\t             ((e <<  7) | (e >>> 25));\n\n\n\t\t\tt1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);\n\t\t\tt2 = sigma0 + maj;\n\n\t\t\th = g;\n\t\t\tg = f;\n\t\t\tf = e;\n\t\t\te = (d + t1) >>> 0;\n\t\t\td = c;\n\t\t\tc = b;\n\t\t\tb = a;\n\t\t\ta = (t1 + t2) >>> 0;\n\n\t\t}\n\n\t\tH[0] += a;\n\t\tH[1] += b;\n\t\tH[2] += c;\n\t\tH[3] += d;\n\t\tH[4] += e;\n\t\tH[5] += f;\n\t\tH[6] += g;\n\t\tH[7] += h;\n\n\t}\n\n\treturn H;\n\n};\n\n// Package private blocksize\nSHA256._blocksize = 16;\n\nSHA256._digestsize = 32;\n\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/package.json",
    "content": "{\n  \"author\": \"Jeff Guo <gwjjeff@gmail.com>\",\n  \"name\": \"cryptojs\",\n  \"tags\": [\"Hash\", \"MD5\", \"SHA1\", \"SHA-1\", \"SHA256\", \"SHA-256\", \"RC4\", \"Rabbit\", \"AES\", \"DES\", \"PBKDF2\", \"HMAC\", \"OFB\", \"CFB\", \"CTR\", \"CBC\", \"Base64\"],\n  \"description\": \"Following googlecode project crypto-js, provide standard and secure cryptographic algorithms for NodeJS. Support MD5, SHA-1, SHA-256, RC4, Rabbit, AES, DES, PBKDF2, HMAC, OFB, CFB, CTR, CBC, Base64\",\n  \"version\": \"2.5.3\",\n  \"homepage\": \"https://github.com/gwjjeff/cryptojs\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/gwjjeff/cryptojs.git\"\n  },\n  \"main\": \"cryptojs.js\",\n  \"engines\": {\n    \"node\": \"*\"\n  },\n  \"dependencies\": {},\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "cloudfunctions/regist/cryptojs/test/PBKDF2-test.js",
    "content": "var assert = require('assert');\nvar Crypto = require('../cryptojs').Crypto; \n\n(function test_PBKDF2() {\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 128 / 8), \"cdedb5281bb2f801565a1122b2563515\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 256 / 8), \"cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 128 / 8, { iterations : 2\t}), \"01dbee7f4a9e243e988b62c73cda935d\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 256 / 8, { iterations : 2 }), \"01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 128 / 8, { iterations : 1200}), \"5c08eb61fdf71e4e4ec3cf6ba1f5512b\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"ATHENA.MIT.EDUraeburn\", 256 / 8, { iterations : 1200}), \"5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"\\x12\\x34\\x56\\x78\\x78\\x56\\x34\\x12\", 128 / 8, {\titerations : 5 }), \"d1daa78615f287e6a1c8b120d7062a49\");\n\tassert.strictEqual(Crypto.PBKDF2(\"password\", \"\\x12\\x34\\x56\\x78\\x78\\x56\\x34\\x12\", 256 / 8, {\titerations : 5 }), \"d1daa78615f287e6a1c8b120d7062a493f98d203e6be49a6adf4fa574b6e64ee\");\n\tassert.strictEqual(Crypto.PBKDF2(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\", \"pass phrase equals block size\", 128 / 8, { iterations : 1200 }), \"139c30c0966bc32ba55fdbf212530ac9\");\n\tassert.strictEqual(Crypto.PBKDF2(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\", \"pass phrase equals block size\", 256 / 8, { iterations : 1200 }), \"139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1\");\n\tassert.strictEqual(Crypto.PBKDF2(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\", \"pass phrase exceeds block size\", 128 / 8, { iterations : 1200 }), \"9ccad6d468770cd51b10e6a68721be61\");\n\tassert.strictEqual(Crypto.PBKDF2(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\", \"pass phrase exceeds block size\", 256 / 8, { iterations : 1200 }), \"9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a\");\n\tassert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], \"EXAMPLE.COMpianist\", 128 / 8, { iterations : 50 }), \"6b9cf26d45455a43a5b8bb276a403b39\");\n\tassert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], \"EXAMPLE.COMpianist\", 256 / 8, { iterations : 50 }), \"6b9cf26d45455a43a5b8bb276a403b39e7fe37a0c41e02c281ff3069e1e94f52\");\n})(); \n\n(function test_PBKSD2Async() {\n\tCrypto.PBKDF2Async(\"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\", \"pass phrase exceeds block size\", 256 / 8, function(result) {\n\t\tassert.strictEqual(result, \"9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a\");\n\t}, { iterations : 1200 });\n})();\n"
  },
  {
    "path": "cloudfunctions/regist/index.js",
    "content": "const appid = 'wxd6beb52c8602bff4'; //你的小程序appid\nconst secret = 'b00457b478f63f2388ef03476bb5a60c'; //你的小程序secret\n\n/*\n下\n面\n不\n用\n管\n*/\n\nconst cloud = require('wx-server-sdk');\ncloud.init()//这里后面加的初始化\nconst TcbRouter = require('tcb-router'); //云函数路由\nconst rq = require('request');\nconst wxurl = 'https://api.weixin.qq.com';\nvar WXBizDataCrypt = require('./RdWXBizDataCrypt') // 用于手机号解密\ncloud.init()\n// 云函数入口函数\nexports.main = async(event, context) => {\n      const app = new TcbRouter({\n            event\n      });\n      //获取电话号码\n      app.router('phone', async(ctx) => {\n            ctx.body = new Promise(resolve => {\n                  rq({\n                        url: wxurl + '/sns/jscode2session?appid=' + appid + '&secret=' + secret + '&js_code=' + event.code + '&grant_type=authorization_code',\n                        method: \"GET\",\n                        json: true,\n                  }, function(error, response, body) {\n                        const decrypt1 = new WXBizDataCrypt(appid, body.session_key) // -解密第一步\n                        const decrypt2 = decrypt1.decryptData(event.encryptedData, event.iv) // 解密第二步*/\n                        resolve({\n                              data: decrypt2\n                        })\n                  });\n            });\n      });\n      //获取openid\n      app.router('getid', async(ctx) => {\n            const wxContext = cloud.getWXContext()\n            ctx.body = wxContext.OPENID;\n      });\n      return app.serve();\n}"
  },
  {
    "path": "cloudfunctions/regist/package.json",
    "content": "{\n      \"name\": \"regist\",\n      \"version\": \"1.0.0\",\n      \"description\": \"\",\n      \"main\": \"index.js\",\n      \"scripts\": {\n            \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n      },\n      \"author\": \"\",\n      \"license\": \"ISC\",\n      \"dependencies\": {\n            \"request\": \"^2.88.0\",\n            \"tcb-router\": \"^1.1.2\",\n            \"wx-server-sdk\": \"^2.0.4\"\n      }\n}\n"
  },
  {
    "path": "cloudfunctions/removeChat/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/removeChat/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n\ncloud.init()\nconst db = cloud.database()\n// 云函数入口函数\nexports.main = async (event, context) => {\n  try {\n    await db.collection('rooms').doc(event.id).update({\n      data: {\n        deleted: 1\n      }\n    })\n    .then(console.log)\n    .catch(console.error)\n    \n  } catch(e) {\n    console.error(e)\n  }\n}"
  },
  {
    "path": "cloudfunctions/removeChat/package.json",
    "content": "{\n  \"name\": \"removeChat\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.2.0\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/removeOrder/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/removeOrder/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n\ncloud.init()\n\nconst db = cloud.database()\nconst _ = db.command\n\n// 云函数入口函数\nexports.main = async (event, _context) => {\n  try {\n    return await db.collection('order').doc(event._id).remove()\n  } catch (e) {\n    console.error(e)\n  }\n}"
  },
  {
    "path": "cloudfunctions/removeOrder/package.json",
    "content": "{\n  \"name\": \"removeOrder\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.2.0\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/sell/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/sell/index.js",
    "content": "// 云函数入口文件\nconst cloud = require('wx-server-sdk')\n  \ncloud.init()\n  \nconst db = cloud.database()\nconst _ = db.command\n  \n// 云函数入口函数\nexports.main = async (event, _context) => {\n try {\n  return await db.collection('order').doc(event._id).update({\n   // data 传入需要局部更新的数据\n   data: {\n      status:event.status\n   }\n  })\n } catch (e) {\n  console.error(e)\n }\n}"
  },
  {
    "path": "cloudfunctions/sell/package.json",
    "content": "{\n  \"name\": \"node\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.1.2\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendMsg/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendMsg/index.js",
    "content": "//编程小石头微信：2501902696\nconst cloud = require('wx-server-sdk')\ncloud.init()\nexports.main = async(event, context) => {\n  try {\n    const result = await cloud.openapi.subscribeMessage.send({\n      touser: event.openid, //要推送给那个用户\n      page: 'pages/index/index', //要跳转到那个小程序页面\n      data: {//推送的内容\n        thing3: {\n          value: event.good\n        },\n        thing1: {\n          value: event.status,\n          color: event.color\n        },\n        thing2: {\n          value: event.address\n        },\n        name4: {\n          value: event.nickName\n        },\n        thing6: {\n          value: event.describe\n        }\n      },\n      templateId: '6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0' //模板id\n    })\n    console.log(result)\n    return result\n  } catch (err) {\n    console.log(err)\n    return err\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendMsg/package.json",
    "content": "{\n  \"name\": \"sendMsg\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"latest\"\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendTip/config.json",
    "content": "{\n  \"permissions\": {\n    \"openapi\": [\n    ]\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendTip/index.js",
    "content": "const cloud = require('wx-server-sdk')\ncloud.init()\nexports.main = async(event, context) => {\n  try {\n    const result = await cloud.openapi.subscribeMessage.send({\n      touser: event.openid, //要推送给那个用户\n      page: 'pages/index/index', //要跳转到那个小程序页面\n      data: {//推送的内容\n        thing1: {\n          value: event.nickName\n        },\n        phrase2:{\n          value: '申请聊天'\n        },\n        thing3:{\n          value: event.tip\n        }\n      },\n      templateId: 'XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q' //模板id\n    })\n    console.log(result)\n    return result\n  } catch (err) {\n    console.log(err)\n    return err\n  }\n}"
  },
  {
    "path": "cloudfunctions/sendTip/package.json",
    "content": "{\n  \"name\": \"sendTip\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"wx-server-sdk\": \"~2.2.0\"\n  }\n}"
  },
  {
    "path": "miniprogram/app.js",
    "content": "const config = require(\"config.js\");\n\nApp({\n      openid: '',\n      userinfo:'',\n      roomlist:[],\n      canReflect:true,\n      onLaunch: function() {\n            if (!wx.cloud) {\n                  console.error('请使用 2.2.3 或以上的基础库以使用云能力')\n            } else {\n                  wx.cloud.init({\n                       env: JSON.parse(config.data).env,\n                        traceUser: true,\n                  })\n            }\n           this.systeminfo=wx.getSystemInfoSync();\n        \n      }\n})"
  },
  {
    "path": "miniprogram/app.json",
    "content": "{\n  \"cloud\": true,\n  \"pages\": [\n    \"pages/start/start\",\n    \"pages/index/index\",\n    \"pages/login/login\",\n    \"pages/publish/publish\",\n    \"pages/my/my\",\n    \"pages/detail/detail\",\n    \"pages/order/list/list\",\n    \"pages/order/detail/detail\",\n    \"pages/kefu/kefu\",\n    \"pages/about/about\",\n    \"pages/sell/list/list\",\n    \"pages/sell/detail/detail\",\n    \"pages/search/search\",\n    \"pages/edit/edit\",\n    \"pages/web/web\",\n    \"pages/message/message\",\n    \"pages/detail/room/room\",\n    \"pages/use/use\",\n    \"pages/help/help\",\n    \"pages/appreciateCode/appreciateCode\"\n  ],\n  \"window\": {\n    \"backgroundColor\": \"#fbbd08\",\n    \"backgroundTextStyle\": \"light\",\n    \"navigationBarBackgroundColor\": \"#fbbd08\",\n    \"navigationBarTitleText\": \"吉珠二手交易平台\",\n    \"navigationBarTextStyle\": \"white\"\n  },\n  \"sitemapLocation\": \"sitemap.json\",\n  \"tabBar\": {\n    \"color\": \"#707070\",\n    \"selectedColor\": \"#000000\",\n    \"list\": [{\n        \"pagePath\": \"pages/index/index\",\n        \"text\": \"首页\",\n        \"iconPath\": \"/images/tabbar/home.png\",\n        \"selectedIconPath\": \"/images/tabbar/home_on.png\"\n      },\n      {\n        \"pagePath\": \"pages/publish/publish\",\n        \"text\": \"发布\",\n        \"iconPath\": \"/images/tabbar/publish.png\",\n        \"selectedIconPath\": \"/images/tabbar/publish_on.png\"\n      },\n      {\n        \"pagePath\": \"pages/my/my\",\n        \"text\": \"我的\",\n        \"iconPath\": \"/images/tabbar/my.png\",\n        \"selectedIconPath\": \"/images/tabbar/my_on.png\"\n      }\n    ]\n  },\n  \"usingComponents\": {\n    \"van-steps\": \"/vant/steps/index\",\n    \"van-transition\": \"/vant/transition/index\",\n    \"van-stepper\": \"/vant/stepper/index\",\n    \"van-action-sheet\": \"/vant/action-sheet/index\",\n    \"van-popup\": \"/vant/popup/index\",\n    \"canvasdrawer\": \"/components/canvasdrawer/canvasdrawer\",\n    \"tips\": \"components/add_tips/index\",\n    \"welcome\": \"components/welcome/welcome\",\n    \"van-dialog\": \"/vant/dialog/index\",\n    \"van-button\": \"/vant/button/index\",\n    \"van-picker\": \"/vant/picker/index\",\n    \"van-icon\": \"/vant/icon/index\",\n    \"van-uploader\": \"/vant/uploader/index\",\n    \"van-checkbox\": \"/vant/checkbox/index\",\n    \"van-checkbox-group\": \"/vant/checkbox-group/index\",\n    \"van-divider\": \"/vant/divider/index\",\n    \"van-notice-bar\": \"vant/notice-bar/index\"\n  }\n}"
  },
  {
    "path": "miniprogram/app.wxss",
    "content": "page {\n      background: #fff;\n      width: 100%;\n      height: 100%;\n}\n\n.shadow {\n      box-shadow: 0 0 18rpx rgb(236, 236, 236);\n}\n\n.text-cut {\n      overflow: hidden;\n      white-space: nowrap;\n      text-overflow: ellipsis;\n}\n\n.loadmore {\n      width: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      padding: 30rpx 0;\n}\n\n.loadmore image {\n      width: 50rpx;\n      height: 50rpx;\n}\n\n.loadmore view {\n      font-size: 28rpx;\n      color: #b2b2b2;\n      letter-spacing: 4rpx;\n}\n.totop {\n      position: fixed;\n      right: 30rpx;\n      bottom: 80rpx;\n}\n\n.totop image {\n      width: 100rpx;\n      height: 100rpx;\n      z-index: 9;\n}"
  },
  {
    "path": "miniprogram/common.wxml",
    "content": "<template name=\"loadmore\">\n      <view class=\"loadmore\">\n            <image hidden=\"{{nomore}}\" src=\"/images/more.gif\"></image>\n            <view hidden=\"{{!nomore}}\">已加载到底</view>\n      </view>\n</template>"
  },
  {
    "path": "miniprogram/common.wxs",
    "content": "function commentTimeHandle(dateStr) {\n      var publishTime = dateStr,\n            date = getDate(publishTime), //获取dateStr的标准格式 console.log(date) 打印结果  Thu Sep 06 2018 18:47:00 GMT+0800 (中国标准时间)\n            // 获取date 中的 年 月 日 时 分 秒\n            Y = date.getFullYear(),\n            M = date.getMonth() + 1,\n            D = date.getDate(),\n            H = date.getHours(),\n            m = date.getMinutes(),\n            s = date.getSeconds();\n      // 对 月 日 时 分 秒 小于10时, 加0显示 例如: 09-09 09:01\n      if (M < 10) {\n            M = '0' + M;\n      }\n      if (D < 10) {\n            D = '0' + D;\n      }\n      if (H < 10) {\n            H = '0' + H;\n      }\n      if (m < 10) {\n            m = '0' + m;\n      }\n      if (s < 10) {\n            s = '0' + s;\n      }\n      var nowTime = getDate().getTime(), //获取此时此刻日期的秒数\n            diffValue = (nowTime - publishTime) / 1000, // 获取此时 秒数 与 要处理的日期秒数 之间的差值\n            diff_days = parseInt(diffValue / 86400), // 一天86400秒 获取相差的天数 取整\n            diff_hours = parseInt(diffValue / 3600), // 一时3600秒\n            diff_minutes = parseInt(diffValue / 60),\n            diff_secodes = parseInt(diffValue);\n      if (diff_days > 0 && diff_days < 3) { //相差天数 0 < diff_days < 3 时, 直接返出\n            return diff_days + \"天前\";\n      } else if (diff_days <= 0 && diff_hours > 0) {\n            return diff_hours + \"小时前\";\n      } else if (diff_hours <= 0 && diff_minutes > 0) {\n            return diff_minutes + \"分钟前\";\n      } else if (diff_secodes < 60) {\n            if (diff_secodes <= 0) {\n                  return \"刚刚\";\n            } else {\n                  return diff_secodes + \"秒前\";\n            }\n      } else if (diff_days >= 3 && diff_days < 30) {\n            return M + '月' + D + '日';\n      } else if (diff_days >= 30) {\n            return M + '月' + D + '日';\n      }\n}\nfunction format(dateStr) {\n      var publishTime = dateStr,\n            date = getDate(publishTime), //获取dateStr的标准格式 console.log(date) 打印结果  Thu Sep 06 2018 18:47:00 GMT+0800 (中国标准时间)\n            // 获取date 中的 年 月 日 时 分 秒\n            Y = date.getFullYear(),\n            M = date.getMonth() + 1,\n            D = date.getDate(),\n            H = date.getHours(),\n            m = date.getMinutes(),\n            s = date.getSeconds();\n      // 对 月 日 时 分 秒 小于10时, 加0显示 例如: 09-09 09:01\n      if (M < 10) {\n            M = '0' + M;\n      }\n      if (D < 10) {\n            D = '0' + D;\n      }\n      if (H < 10) {\n            H = '0' + H;\n      }\n      if (m < 10) {\n            m = '0' + m;\n      }\n      if (s < 10) {\n            s = '0' + s;\n      }\n      \n       return Y+'-'+M+'-'+D+' '+H+':'+m\n}\nmodule.exports = {\n      timelog: commentTimeHandle,\n      format:format\n}"
  },
  {
    "path": "miniprogram/components/add_tips/README.md",
    "content": "# add-tips\n> **微信小程序UI插件**\n> 用于提示用户首次进入小程序时，点击右上角菜单进行【添加到我的小程序】操作\n\n## 文档\n首先，把这个仓库下载/克隆到你的小程序目录，比如`/components/weplug-add-tips/`    \n然后，在首页`index.json`配置文件中，引入该组件：\n``` json\n{\n  \"usingComponents\": {\n    \"add-tips\": \"/components/weplug-add-tips/index\"\n  }\n}\n```\n最后，在首页`index.wxml`文件中，调用该组件即可：\n``` wxml\n<add-tips />\n```\n\n## 参数\n你可以传递两个参数进行自定义操作：\n\n### 1. text：提示的文字内容\n``` wxml\n<add-tips text=\"点击添加到小程序\" />\n```\n\n### 2. duration：提示关闭时间（单位秒）\n``` wxml\n<add-tips duration=\"10\" />\n```\n\n<!-- ## 截图\n![](https://i.loli.net/2019/03/29/5c9e0b1924201.png)\n\n## 你也可以扫一扫小程序进行体验效果：\n![](https://i.loli.net/2019/03/29/5c9e0b6bbd8f4.jpg) -->"
  },
  {
    "path": "miniprogram/components/add_tips/index.js",
    "content": "const STORAGE_KEY = 'PLUG-ADD-MYAPP-KEY';\n\nComponent({\n  /**\n   * 组件的属性列表\n   */\n  properties: {\n    // 提示文字\n    text: {\n      type: String,\n      value: '点击「添加小程序」，下次访问更便捷 >'\n    },\n    // 多少秒后关闭\n    duration: {\n      type: Number,\n      value: 5\n    }\n  },\n\n  /**\n   * 组件的初始数据\n   */\n  data: {\n    SHOW_TOP: false,\n    SHOW_MODAL: false\n  },\n\n  ready: function () {\n    // 判断是否已经显示过\n    let cache = wx.getStorageSync(STORAGE_KEY);\n    if (cache) return;\n    // 没显示过，则进行展示\n    this.setData({\n      SHOW_TOP: true\n    });\n    // 关闭时间\n    setTimeout(() => {\n      this.setData({\n        SHOW_TOP: false\n      })\n    }, this.data.duration * 1000);\n  },\n\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n    // 显示全屏添加说明\n    showModal: function () {\n      this.setData({\n        SHOW_TOP: false,\n        SHOW_MODAL: true\n      });\n    },\n\n    okHandler: function () {\n      this.setData({\n        SHOW_MODAL: false\n      });\n      wx.setStorage({\n        key: STORAGE_KEY,\n        data: +new Date,\n      });\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/components/add_tips/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/add_tips/index.wxml",
    "content": "<view class=\"box\" wx:if=\"{{SHOW_TOP}}\">\n  <view class='arrow'></view>\n  <view class='body' bindtap='showModal'>\n    <text>{{text}}</text>\n  </view>\n</view>\n\n<!-- modal -->\n<view class='modal' wx:if=\"{{SHOW_MODAL}}\">\n  <view style='flex-direction: row;align-items:center;'>\n    <text>1. 点击</text>\n    <image src='./assets/fav-1.jpg' style='width:100px' mode=\"widthFix\"></image>\n  </view>\n  <view>\n    <text>2. 点击「添加到我的小程序」</text>\n    <image src='./assets/fav-2.jpg' style='width:100%' mode=\"widthFix\"></image>\n  </view>\n  <view>\n    <text>3. 微信首页下拉，快速进入小程序</text>\n    <image src='./assets/fav-3.jpg' style='width:100%' mode=\"widthFix\"></image>\n  </view>\n\n  <!-- 知道了 -->\n  <view class='ok-btn' hover-class='btn-hover' bindtap='okHandler'>\n    <view>\n      <text>我知道了！</text>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/components/add_tips/index.wxss",
    "content": ".box {\n  position: fixed;\n  top: 0;\n  /* left: 0; */\n  right: 0;\n  z-index: 999;\n  display: flex;\n  justify-content: flex-end;\n  align-items: flex-end;\n  flex-direction: column;\n  width: 600rpx;\n}\n.arrow {\n  width: 0;\n  height: 0;\n  margin-right: 120rpx;\n  border-width: 20rpx;\n  border-style: solid;\n  border-color:  transparent transparent  #fbbd08;\n}\n.body {\n  background-color:   #fbbd08;\n  box-shadow: 0 10rpx 20rpx -10rpx   #fbbd08;\n  border-radius: 12rpx;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  height: 84rpx;\n  padding: 0 20rpx;\n  margin-right: 40rpx;\n}\n.body > text {\n  color: #FFF;\n  font-size: 28rpx;\n  font-weight: 400;\n}\n\n.modal {\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 999;\n  background-color: rgba(255, 255, 255, 0.9);\n  padding: 20px;\n}\n.modal > view {\n  margin: 10px 0;\n  display: flex;\n  /* align-items: center; */\n  flex-direction: column;\n}\n.modal > view > text {\n  font-size: 16px;\n  font-weight: 400;\n  margin-bottom: 5px;\n  color: #333;\n}\n.modal > view > image {\n  border-radius: 10px;\n}\n\n.ok-btn {\n  width: 100%;\n  margin-top: 40px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n.ok-btn > view {\n  height: 40px;\n  width: 120px;\n  background-color:   #fbbd08;\n  box-shadow: 0 5px 10px -px   #fbbd08;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  border-radius: 40px;\n}\n.ok-btn > view > text {\n  font-size: 14px;\n  color: #fff;\n  font-weight: 400;\n}\n.btn-hover {\n  opacity: 0.6;\n}"
  },
  {
    "path": "miniprogram/components/canvasdrawer/canvasdrawer.js",
    "content": "/* global Component wx */\n\nComponent({\n  properties: {\n    painting: {\n      type: Object,\n      value: {view: []},\n      observer (newVal, oldVal) {\n        if (!this.data.isPainting) {\n          if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\n            if (newVal && newVal.width && newVal.height) {\n              this.setData({\n                showCanvas: true,\n                isPainting: true\n              })\n              this.readyPigment()\n            }\n          } else {\n            if (newVal && newVal.mode !== 'same') {\n              this.triggerEvent('getImage', {errMsg: 'canvasdrawer:samme params'})\n            }\n          }\n        }\n      }\n    }\n  },\n  data: {\n    showCanvas: false,\n\n    width: 100,\n    height: 100,\n\n    tempFileList: [],\n\n    isPainting: false\n  },\n  ctx: null,\n  cache: {},\n  ready () {\n    wx.removeStorageSync('canvasdrawer_pic_cache')\n    this.cache = wx.getStorageSync('canvasdrawer_pic_cache') || {}\n    this.ctx = wx.createCanvasContext('canvasdrawer', this)\n  },\n  methods: {\n    readyPigment () {\n      const { width, height, views } = this.data.painting\n      this.setData({\n        width,\n        height\n      })\n\n      const inter = setInterval(() => {\n        if (this.ctx) {\n          clearInterval(inter)\n          this.ctx.clearActions()\n          this.ctx.save()\n          this.getImagesInfo(views)\n        }\n      }, 100)\n    },\n    getImagesInfo (views) {\n      const imageList = []\n      for (let i = 0; i < views.length; i++) {\n        if (views[i].type === 'image') {\n          imageList.push(this.getImageInfo(views[i].url))\n        }\n      }\n\n      const loadTask = []\n      for (let i = 0; i < Math.ceil(imageList.length / 8); i++) {\n        loadTask.push(new Promise((resolve, reject) => {\n          Promise.all(imageList.splice(i * 8, 8)).then(res => {\n            resolve(res)\n          }).catch(res => {\n            reject(res)\n          })\n        }))\n      }\n      Promise.all(loadTask).then(res => {\n        let tempFileList = []\n        for (let i = 0; i < res.length; i++) {\n          tempFileList = tempFileList.concat(res[i])\n        }\n        this.setData({\n          tempFileList\n        })\n        this.startPainting()\n      })\n    },\n    startPainting () {\n      const { tempFileList, painting: { views } } = this.data\n      console.log(tempFileList)\n      for (let i = 0, imageIndex = 0; i < views.length; i++) {\n        if (views[i].type === 'image') {\n          this.drawImage({\n            ...views[i],\n            url: tempFileList[imageIndex]\n          })\n          imageIndex++\n        } else if (views[i].type === 'text') {\n          if (!this.ctx.measureText) {\n            wx.showModal({\n              title: '提示',\n              content: '当前微信版本过低，无法使用 measureText 功能，请升级到最新微信版本后重试。'\n            })\n            this.triggerEvent('getImage', {errMsg: 'canvasdrawer:version too low'})\n            return\n          } else {\n            this.drawText(views[i])\n          }\n        } else if (views[i].type === 'rect') {\n          this.drawRect(views[i])\n        }\n      }\n      this.ctx.draw(false, () => {\n        wx.setStorageSync('canvasdrawer_pic_cache', this.cache)\n        const system = wx.getSystemInfoSync().system\n        if (/ios/i.test(system)) {\n          this.saveImageToLocal()\n        } else {\n          // 延迟保存图片，解决安卓生成图片错位bug。\n          setTimeout(() => {\n            this.saveImageToLocal()\n          }, 800)\n        }\n      })\n    },\n    drawImage (params) {\n      this.ctx.save()\n      const { url, top = 0, left = 0, width = 0, height = 0, borderRadius = 0, deg = 0 } = params\n      // if (borderRadius) {\n      //   this.ctx.beginPath()\n      //   this.ctx.arc(left + borderRadius, top + borderRadius, borderRadius, 0, 2 * Math.PI)\n      //   this.ctx.clip()\n      //   this.ctx.drawImage(url, left, top, width, height)\n      // } else {\n      if (deg !== 0) {\n        this.ctx.translate(left + width/2, top + height/2)\n        this.ctx.rotate(deg * Math.PI / 180)\n        this.ctx.drawImage(url, -width/2, -height/2, width, height)\n      } else {\n        this.ctx.drawImage(url, left, top, width, height)\n      }\n      // }\n      this.ctx.restore()\n    },\n    drawText (params) {\n      this.ctx.save()\n      const {\n        MaxLineNumber = 2,\n        breakWord = false,\n        color = 'black',\n        content = '',\n        fontSize = 16,\n        top = 0,\n        left = 0,\n        lineHeight = 20,\n        textAlign = 'left',\n        width,\n        bolder = false,\n        textDecoration = 'none'\n      } = params\n      \n      this.ctx.beginPath()\n      this.ctx.setTextBaseline('top')\n      this.ctx.setTextAlign(textAlign)\n      this.ctx.setFillStyle(color)\n      this.ctx.setFontSize(fontSize)\n\n      if (!breakWord) {\n        this.ctx.fillText(content, left, top)\n        this.drawTextLine(left, top, textDecoration, color, fontSize, content)\n      } else {\n        let fillText = ''\n        let fillTop = top\n        let lineNum = 1\n        for (let i = 0; i < content.length; i++) {\n          fillText += [content[i]]\n          if (this.ctx.measureText(fillText).width > width) {\n            if (lineNum === MaxLineNumber) {\n              if (i !== content.length) {\n                fillText = fillText.substring(0, fillText.length - 1) + '...'\n                this.ctx.fillText(fillText, left, fillTop)\n                this.drawTextLine(left, fillTop, textDecoration, color, fontSize, fillText)\n                fillText = ''\n                break\n              }\n            }\n            this.ctx.fillText(fillText, left, fillTop)\n            this.drawTextLine(left, fillTop, textDecoration, color, fontSize, fillText)\n            fillText = ''\n            fillTop += lineHeight\n            lineNum ++\n          }\n        }\n        this.ctx.fillText(fillText, left, fillTop)\n        this.drawTextLine(left, fillTop, textDecoration, color, fontSize, fillText)\n      }\n      \n      this.ctx.restore()\n\n      if (bolder) {\n        this.drawText({\n          ...params,\n          left: left + 0.3,\n          top: top + 0.3,\n          bolder: false,\n          textDecoration: 'none' \n        })\n      }\n    },\n    drawTextLine (left, top, textDecoration, color, fontSize, content) {\n      if (textDecoration === 'underline') {\n        this.drawRect({\n          background: color,\n          top: top + fontSize * 1.2,\n          left: left - 1,\n          width: this.ctx.measureText(content).width + 3,\n          height: 1\n        })\n      } else if (textDecoration === 'line-through') {\n        this.drawRect({\n          background: color,\n          top: top + fontSize * 0.6,\n          left: left - 1,\n          width: this.ctx.measureText(content).width + 3,\n          height: 1\n        })\n      }\n    },\n    drawRect (params) {\n      this.ctx.save()\n      const { background, top = 0, left = 0, width = 0, height = 0 } = params\n      this.ctx.setFillStyle(background)\n      this.ctx.fillRect(left, top, width, height)\n      this.ctx.restore()\n    },\n    getImageInfo (url) {\n      return new Promise((resolve, reject) => {\n        if (this.cache[url]) {\n          resolve(this.cache[url])\n        } else {\n          const objExp = new RegExp(/^http(s)?:\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- .\\/?%&=]*)?/)\n          if (objExp.test(url)) {\n            wx.getImageInfo({\n              src: url,\n              complete: res => {\n                if (res.errMsg === 'getImageInfo:ok') {\n                  this.cache[url] = res.path\n                  resolve(res.path)\n                } else {\n                  this.triggerEvent('getImage', {errMsg: 'canvasdrawer:download fail'})\n                  reject(new Error('getImageInfo fail'))\n                }\n              }\n            })\n          } else {\n            this.cache[url] = url\n            resolve(url)\n          }\n        }\n      })\n    },\n    saveImageToLocal () {\n      const { width, height } = this.data\n      wx.canvasToTempFilePath({\n        x: 0,\n        y: 0,\n        width,\n        height,\n        canvasId: 'canvasdrawer',\n        complete: res => {\n          if (res.errMsg === 'canvasToTempFilePath:ok') {\n            this.setData({\n              showCanvas: false,\n              isPainting: false,\n              tempFileList: []\n            })\n            this.triggerEvent('getImage', {tempFilePath: res.tempFilePath, errMsg: 'canvasdrawer:ok'})\n          } else {\n            this.triggerEvent('getImage', {errMsg: 'canvasdrawer:fail'})\n          }\n        }\n      }, this)\n    }\n  }\n})\n"
  },
  {
    "path": "miniprogram/components/canvasdrawer/canvasdrawer.json",
    "content": "{\n  \"component\": true\n}"
  },
  {
    "path": "miniprogram/components/canvasdrawer/canvasdrawer.wxml",
    "content": "<canvas canvas-id=\"canvasdrawer\" style=\"width:{{width}}px;height:{{height}}px;\" class=\"board\" wx:if=\"{{showCanvas}}\"></canvas>"
  },
  {
    "path": "miniprogram/components/canvasdrawer/canvasdrawer.wxss",
    "content": ".board {\n  position: fixed;\n  top: 2000rpx;\n}"
  },
  {
    "path": "miniprogram/components/chatroom/chatroom.js",
    "content": "var time = require('../../utils/util.js');\nconst FATAL_REBUILD_TOLERANCE = 10\nconst SETDATA_SCROLL_TO_BOTTOM = {\n  scrollTop: 100000,\n  scrollWithAnimation: true,\n}\n\nComponent({\n  properties: {\n    envId: String,\n    collection: String,\n    groupId: String,\n    groupName: String,\n    userInfo: Object,\n    onGetUserInfo: {\n      type: Function,\n    },\n    getOpenID: {\n      type: Function,\n    },\n  },\n\n  data: {\n    chats: [],\n    textInputValue: '',\n    openId: '',\n    scrollTop: 0,\n    scrollToMessage: '',\n    hasKeyboard: false,\n  },\n\n  methods: {\n    onGetUserInfo(e) {\n      this.properties.onGetUserInfo(e)\n    },\n\n    getOpenID() {\n      return this.properties.getOpenID()\n    },\n\n    mergeCommonCriteria(criteria) {\n      return {\n        groupId: this.data.groupId,\n        ...criteria,\n      }\n    },\n\n    async initRoom() {\n      this.try(async () => {\n        await this.initOpenID()\n\n        const {\n          envId,\n          collection\n        } = this.properties\n        const db = this.db = wx.cloud.database({\n          env: envId,\n        })\n        const _ = db.command\n\n        const {\n          data: initList\n        } = await db.collection(collection).where(this.mergeCommonCriteria()).orderBy('sendTimeTS', 'desc').get()\n\n        console.log('init query chats', initList)\n\n        this.setData({\n          chats: initList.reverse(),\n          scrollTop: 10000,\n        })\n\n        this.initWatch(initList.length ? {\n          sendTimeTS: _.gt(initList[initList.length - 1].sendTimeTS),\n        } : {})\n      }, '初始化失败')\n    },\n\n    async initOpenID() {\n      return this.try(async () => {\n        const openId = await this.getOpenID()\n\n        this.setData({\n          openId,\n        })\n      }, '初始化 openId 失败')\n    },\n\n    async initWatch(criteria) {\n      this.try(() => {\n        const {\n          collection\n        } = this.properties\n        const db = this.db\n        const _ = db.command\n\n        console.warn(`开始监听`, criteria)\n        this.messageListener = db.collection(collection).where(this.mergeCommonCriteria(criteria)).watch({\n          onChange: this.onRealtimeMessageSnapshot.bind(this),\n          onError: e => {\n            if (!this.inited || this.fatalRebuildCount >= FATAL_REBUILD_TOLERANCE) {\n              this.showError(this.inited ? '监听错误，已断开' : '初始化监听失败', e, '重连', () => {\n                this.initWatch(this.data.chats.length ? {\n                  sendTimeTS: _.gt(this.data.chats[this.data.chats.length - 1].sendTimeTS),\n                } : {})\n              })\n            } else {\n              this.initWatch(this.data.chats.length ? {\n                sendTimeTS: _.gt(this.data.chats[this.data.chats.length - 1].sendTimeTS),\n              } : {})\n            }\n          },\n        })\n      }, '初始化监听失败')\n    },\n\n    onRealtimeMessageSnapshot(snapshot) {\n      console.warn(`收到消息`, snapshot)\n\n      if (snapshot.type === 'init') {\n        this.setData({\n          chats: [\n            ...this.data.chats,\n            ...[...snapshot.docs].sort((x, y) => x.sendTimeTS - y.sendTimeTS),\n          ],\n        })\n        this.scrollToBottom()\n        this.inited = true\n      } else {\n        let hasNewMessage = false\n        let hasOthersMessage = false\n        const chats = [...this.data.chats]\n        for (const docChange of snapshot.docChanges) {\n          switch (docChange.queueType) {\n            case 'enqueue': {\n              hasOthersMessage = docChange.doc._openid !== this.data.openId\n              const ind = chats.findIndex(chat => chat._id === docChange.doc._id)\n              if (ind > -1) {\n                if (chats[ind].msgType === 'image' && chats[ind].tempFilePath) {\n                  chats.splice(ind, 1, {\n                    ...docChange.doc,\n                    tempFilePath: chats[ind].tempFilePath,\n                  })\n                } else chats.splice(ind, 1, docChange.doc)\n              } else {\n                hasNewMessage = true\n                chats.push(docChange.doc)\n              }\n              break\n            }\n          }\n        }\n        this.setData({\n          chats: chats.sort((x, y) => x.sendTimeTS - y.sendTimeTS),\n        })\n        if (hasOthersMessage || hasNewMessage) {\n          this.scrollToBottom()\n        }\n      }\n    },\n\n    async onConfirmSendText(e) {\n      this.try(async () => {\n        if (!e.detail.value) {\n          return\n        }\n\n        const {\n          collection\n        } = this.properties\n        const db = this.db\n        const _ = db.command\n\n        const doc = {\n          _id: `${Math.random()}_${Date.now()}`,\n          groupId: this.data.groupId,\n          avatar: this.data.userInfo.avatarUrl,\n          nickName: this.data.userInfo.nickName,\n          msgType: 'text',\n          textContent: e.detail.value,\n          sendTime: new Date(),\n          sendTimeTS: time.formatTime(new Date(),'Y/M/D h:m:s'), // fallback\n        }\n\n        this.setData({\n          textInputValue: '',\n          chats: [\n            ...this.data.chats,\n            {\n              ...doc,\n              _openid: this.data.openId,\n              writeStatus: 'pending',\n            },\n          ],\n        })\n        this.scrollToBottom(true)\n\n        await db.collection(collection).add({\n          data: doc,\n        })\n\n\n        this.setData({\n          chats: this.data.chats.map(chat => {\n            if (chat._id === doc._id) {\n              return {\n                ...chat,\n                writeStatus: 'written',\n              }\n            } else return chat\n          }),\n        })\n\n\n      }, '发送文字失败')\n\n    },\n\n    async onChooseImage(e) {\n      wx.chooseImage({\n        count: 1,\n        sourceType: ['album', 'camera'],\n        success: async res => {\n          const {\n            envId,\n            collection\n          } = this.properties\n          const doc = {\n            _id: `${Math.random()}_${Date.now()}`,\n            groupId: this.data.groupId,\n            avatar: this.data.userInfo.avatarUrl,\n            nickName: this.data.userInfo.nickName,\n            msgType: 'image',\n            sendTime: new Date(),\n            sendTimeTS: time.formatTime(new Date(),'Y/M/D h:m:s'), // fallback\n          }\n\n          this.setData({\n            chats: [\n              ...this.data.chats,\n              {\n                ...doc,\n                _openid: this.data.openId,\n                tempFilePath: res.tempFilePaths[0],\n                writeStatus: 0,\n              },\n            ]\n          })\n          this.scrollToBottom(true)\n\n          const uploadTask = wx.cloud.uploadFile({\n            cloudPath: `${this.data.openId}/${Math.random()}_${Date.now()}.${res.tempFilePaths[0].match(/\\.(\\w+)$/)[1]}`,\n            filePath: res.tempFilePaths[0],\n            config: {\n              env: envId,\n            },\n            success: res => {\n              this.try(async () => {\n                await this.db.collection(collection).add({\n                  data: {\n                    ...doc,\n                    imgFileID: res.fileID,\n                  },\n                })\n              }, '发送图片失败')\n            },\n            fail: e => {\n              this.showError('发送图片失败', e)\n            },\n          })\n\n          uploadTask.onProgressUpdate(({\n            progress\n          }) => {\n            this.setData({\n              chats: this.data.chats.map(chat => {\n                if (chat._id === doc._id) {\n                  return {\n                    ...chat,\n                    writeStatus: progress,\n                  }\n                } else return chat\n              })\n            })\n          })\n        },\n      })\n    },\n\n    onMessageImageTap(e) {\n      wx.previewImage({\n        urls: [e.target.dataset.fileid],\n      })\n    },\n\n    scrollToBottom(force) {\n      if (force) {\n        console.log('force scroll to bottom')\n        this.setData(SETDATA_SCROLL_TO_BOTTOM)\n        return\n      }\n\n      this.createSelectorQuery().select('.body').boundingClientRect(bodyRect => {\n        this.createSelectorQuery().select(`.body`).scrollOffset(scroll => {\n          if (scroll.scrollTop + bodyRect.height * 3 > scroll.scrollHeight) {\n            console.log('should scroll to bottom')\n            this.setData(SETDATA_SCROLL_TO_BOTTOM)\n          }\n        }).exec()\n      }).exec()\n    },\n\n    async onScrollToUpper() {\n      if (this.db && this.data.chats.length) {\n        const {\n          collection\n        } = this.properties\n        const _ = this.db.command\n        const {\n          data\n        } = await this.db.collection(collection).where(this.mergeCommonCriteria({\n          sendTimeTS: _.lt(this.data.chats[0].sendTimeTS),\n        })).orderBy('sendTimeTS', 'desc').get()\n        this.data.chats.unshift(...data.reverse())\n        this.setData({\n          chats: this.data.chats,\n          scrollToMessage: `item-${data.length}`,\n          scrollWithAnimation: false,\n        })\n      }\n    },\n\n    async try (fn, title) {\n      try {\n        await fn()\n      } catch (e) {\n        this.showError(title, e)\n      }\n    },\n\n    showError(title, content, confirmText, confirmCallback) {\n      console.error(title, content)\n      wx.showModal({\n        title,\n        content: content.toString(),\n        showCancel: confirmText ? true : false,\n        confirmText,\n        success: res => {\n          res.confirm && confirmCallback()\n        },\n      })\n    },\n  },\n\n  ready() {\n    global.chatroom = this\n    this.initRoom()\n    this.fatalRebuildCount = 0\n  },\n})"
  },
  {
    "path": "miniprogram/components/chatroom/chatroom.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n\n  }\n}"
  },
  {
    "path": "miniprogram/components/chatroom/chatroom.wxml",
    "content": "<view class=\"chatroom\">\n\t<!-- chats -->\n\t<scroll-view class=\"body\" scroll-y scroll-with-animation=\"{{scrollWithAnimation}}\" scroll-top=\"{{scrollTop}}\" scroll-into-view=\"{{scrollToMessage}}\" bindscrolltoupper=\"onScrollToUpper\">\n\t\t<view wx:for=\"{{chats}}\" wx:key=\"{{item._id}}\" id=\"item-{{index}}\" class=\"message {{openId == item._openid ? 'message__self' : ''}}\">\n\t\t\t<image class=\"avatar\" src=\"{{item.avatar}}\" mode=\"scaleToFill\"></image>\n\t\t\t<view class=\"main\">\n\t\t\t\t<view class=\"nickname\">{{item.nickName}}</view>\n\t\t\t\t<block wx:if=\"{{item.msgType === 'image'}}\">\n\t\t\t\t\t<view class=\"image-wrapper\">\n\t\t\t\t\t\t<view class=\"loading\" wx:if=\"{{item.writeStatus > -1}}\">{{item.writeStatus}}%</view>\n\t\t\t\t\t\t<image src=\"{{item.tempFilePath || item.imgFileID}}\" data-fileid=\"{{item.tempFilePath || item.imgFileID}}\" class=\"image-content\" style=\"{{item.imgStyle}}\" mode=\"scallToFill\" bindtap=\"onMessageImageTap\"></image>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"time\">{{item.sendTimeTS}}</view>\n\t\t\t\t</block>\n\t\t\t\t<block wx:else>\n\t\t\t\t\t<view class=\"text-wrapper\">\n\t\t\t\t\t\t<view class=\"loading\" wx:if=\"{{item.writeStatus === 'pending'}}\">···</view>\n\t\t\t\t\t\t<view class=\"text-content\">{{item.textContent}}</view>\n\t\t\t\t\t</view>\n\t\t\t\t\t<view class=\"time\">{{item.sendTimeTS}}</view>\n\t\t\t\t</block>\n\t\t\t</view>\n\t\t</view>\n\t</scroll-view>\n\n\t<!-- message sender -->\n\t<view class=\"footer\">\n\t\t<view class=\"message-sender\" wx:if=\"{{userInfo}}\">\n\n\t\t\t<image src=\"./photo.png\" class=\"btn-send-image\" mode=\"scaleToFill\" bindtap=\"onChooseImage\"></image>\n\t\t\t<input class=\"text-input\" type=\"text\" confirm-type=\"send\" bindconfirm=\"onConfirmSendText\" cursor-spacing=\"20\" value=\"{{textInputValue}}\"></input>\n\n\n\t\t</view>\n\n\t\t<view class=\"message-sender\" wx:if=\"{{!userInfo}}\">\n\t\t\t<button open-type=\"getUserInfo\" bindgetuserinfo=\"onGetUserInfo\" class=\"userinfo\">请先登录后参与聊天</button>\n\t\t</view>\n\t</view>\n\n</view>"
  },
  {
    "path": "miniprogram/components/chatroom/chatroom.wxss",
    "content": ".chatroom {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n}\n/* .chatroom .header {\n  flex-basis: fit-content;\n  display: flex;\n  flex-direction: row;\n  border-bottom: 1px solid #ddd;\n  margin-top: -25px;\n  padding: 20rpx 0 30rpx;\n  font-size:25 rpx;\n} */\n\n.chatroom .header .left {\n  flex: 1;\n}\n\n.chatroom .header .middle {\n  flex: 2;\n  text-align: center;\n}\n\n.chatroom .header .right {\n  flex: 1;\n}\n\n.chatroom .body {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  background: rgb(237,237,237);\n  padding-bottom: 16rpx;\n}\n\n.body .message {\n  display: flex;\n  flex-direction: row;\n  position: relative;\n  margin: 12rpx 0;\n}\n\n.body .message.message__self {\n  flex-direction: row-reverse;\n}\n\n.body .message .avatar {\n  position: relative;\n  top: 5rpx;\n  width: 60rpx;\n  height: 60rpx;\n  border-radius: 5rpx;\n  margin: 15rpx;\n}\n\n.body .message .main {\n  flex: 1;\n  display: flex;\n  flex-direction: column;\n  align-items: flex-start;\n}\n\n.body .message.message__self .main {\n  align-items: flex-end;\n}\n\n.body .message .nickname {\n  font-size: 24rpx;\n  color: #444;\n}\n.body .message .time {\n  font-size: 24rpx;\n  color: #444;\n}\n\n.body .message .text-content {\n  border: 1px solid transparent;\n  border-radius: 3px;\n  background-color: #fff;\n  margin: 2px 0 0 0;\n  padding: 4px 10px;\n  font-size: 30rpx;\n  display: inline-block;\n}\n\n.body .message.message__self .text-content {\n  background-color: paleturquoise;\n}\n\n.body .message .text-wrapper {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  max-width: 80%;\n}\n\n.body .message.message__self .text-wrapper .loading{\n  font-size: 16rpx;\n  margin-right: 18rpx;\n}\n\n.body .message .image-wrapper {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.body .message .image-content {\n  max-width: 240rpx;\n  max-height: 240rpx;\n}\n\n.body .message.message__self .image-wrapper .loading {\n  font-size: 20rpx;\n  margin-right: 18rpx;\n}\n\n.chatroom .footer {\n  flex-basis: fit-content;\n  display: flex;\n  flex-direction: row;\n  border-top: 1px solid #ddd;\n  font-size: 10rpx;\n  padding: 20rpx 30rpx;\n  background: rgb(246,246,246);\n}\n\n.chatroom .footer .message-sender {\n  flex: 1;\n  display: flex;\n  flex-direction: row;\n}\n\n.message-sender .text-input {\n  flex: 1;\n  font-size: 16px;\n  border: 1px solid transparent;\n  border-radius: 5px;\n  padding: 3px 6px;\n  margin: 0 10px 0 5px;\n  background: #fff;\n}\n\n.message-sender .btn-send-image {\n  width: 50rpx;\n  height: 50rpx;\n  align-self: center;\n}\n\nbutton {\n  font-size: 30rpx;\n}\n\nbutton.userinfo {\n  background: darkturquoise;\n  color: aliceblue;\n  padding: 0 100rpx;\n  border: 1px solid #ddd;\n  border-radius: 20px;\n}\n"
  },
  {
    "path": "miniprogram/components/welcome/welcome.js",
    "content": "const STORAGE1_KEY = 'PLUG-WELCOME-MYAPP-KEY';\n\nComponent({\n  /**\n   * 组件的属性列表\n   */\n  // properties: {\n  //   // 提示文字\n  //   text: {\n  //     type: String,\n  //     value: '点击「添加小程序」，下次访问更便捷 >'\n  //   },\n  //   // 多少秒后关闭\n  //   duration: {\n  //     type: Number,\n  //     value: 5\n  //   }\n  // },\n\n  /**\n   * 组件的初始数据\n   */\n  data: {\n    SHOW_MODAL:false\n  },\n\n  ready: function () {\n    // 判断是否已经显示过\n    let cache = wx.getStorageSync(STORAGE1_KEY);\n    if (cache) return;\n    // 没显示过，则进行展示\n    this.setData({\n      SHOW_MODAL: true\n    });\n    this.showModal();\n  \n  },\n\n  /**\n   * 组件的方法列表\n   */\n  methods: {\n    // 显示全屏添加说明\n    showModal: function () {\n      this.setData({\n        SHOW_MODAL: true\n      });\n    },\n\n    okHandler: function () {\n      this.setData({\n        SHOW_MODAL: false\n      });\n      wx.setStorage({\n        key: STORAGE1_KEY,\n        data: +new Date,\n      });\n      wx.requestSubscribeMessage({\n        tmplIds: ['6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0','XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q'], //这里填入我们生成的模板id\n        success(res) {          \n              console.log('授权成功', res)\n        },\n        fail(res) {\n              console.log('授权失败', res)\n        }\n  })\n      wx.navigateTo({\n        url: '/pages/help/help',\n      })\n    }\n  },\n  \n})\n"
  },
  {
    "path": "miniprogram/components/welcome/welcome.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/components/welcome/welcome.wxml",
    "content": "<!-- modal -->\n<view class='modal' wx:if=\"{{SHOW_MODAL}}\">\n  <view style='flex-direction: row;align-items:center;'>\n    <text class=\"font\">1. 欢迎来到 易珠 小程序，感谢您的使用</text>  \n  </view>\n  <view >\n    <text class=\"font\">2.同学们使用前可在（我的—用户手册）页面查看小程序使用详情,注册时请点击授权接受服务通知（并点击不在询问）以便能及时接收到信息 </text>\n    <image src='./assets/about_2.jpg' style='width:110px;flex-direction: row;align-items:center;' mode=\"widthFix\"></image>\n  </view>\n  <view>\n    <text class=\"font\">3. 关于为什么有广告出现问题，可在 （我的—使用说明） 页面处了解，感谢您的理解！</text>\n    <image src='./assets/ad_1.jpg' style='width:100%' mode=\"widthFix\"></image>\n    <image src='./assets/about.jpg' style='width:100%' mode=\"widthFix\"></image>\n  </view>\n\n  <!-- 知道了 -->\n  <view class='ok-btn' hover-class='btn-hover' bindtap='okHandler'>\n    <view>\n      <text>现在去康康>></text>\n    </view>\n  </view>\n</view>"
  },
  {
    "path": "miniprogram/components/welcome/welcome.wxss",
    "content": "/* components/welcome.wxss */\r\n.box {\r\n  position: fixed;\r\n  top: 0;\r\n  /* left: 0; */\r\n  right: 0;\r\n  z-index: 999;\r\n  display: flex;\r\n  justify-content: flex-end;\r\n  align-items: flex-end;\r\n  flex-direction: column;\r\n  width: 600rpx;\r\n}\r\n.arrow {\r\n  width: 0;\r\n  height: 0;\r\n  margin-right: 120rpx;\r\n  border-width: 20rpx;\r\n  border-style: solid;\r\n  border-color:  transparent transparent  #fbbd08;\r\n}\r\n.body {\r\n  background-color:   #fbbd08;\r\n  box-shadow: 0 10rpx 20rpx -10rpx   #fbbd08;\r\n  border-radius: 12rpx;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  height: 84rpx;\r\n  padding: 0 20rpx;\r\n  margin-right: 40rpx;\r\n}\r\n.body > text {\r\n  color: #FFF;\r\n  font-size: 28rpx;\r\n  font-weight: 400;\r\n}\r\n.font{\r\n  size: 20px;\r\n}\r\n\r\n.modal {\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  z-index: 999;\r\n  background-image: linear-gradient(to top, #dfe9f3 0%, white 100%);\r\n  padding: 10px;\r\n}\r\n.modal > view {\r\n  margin: 10px 0;\r\n  display: flex;\r\n  /* align-items: center; */\r\n  flex-direction: column;\r\n}\r\n.modal > view > text {\r\n  font-size: 16px;\r\n  font-weight: 400;\r\n  margin-bottom: 5px;\r\n  color: rgb(7, 7, 7);\r\n}\r\n.modal > view > image {\r\n  border-radius: 10px;\r\n}\r\n\r\n.ok-btn {\r\n  width: 100%;\r\n  margin-top: 40px;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n}\r\n.ok-btn > view {\r\n  height: 40px;\r\n  width: 120px;\r\n  background-color:   #fbbd08;\r\n  box-shadow: 0 5px 10px -px   #fbbd08;\r\n  display: flex;\r\n  align-items: center;\r\n  justify-content: center;\r\n  border-radius: 40px;\r\n}\r\n.ok-btn > view > text {\r\n  font-size: 14px;\r\n  color: #fff;\r\n  font-weight: 400;\r\n}\r\n.btn-hover {\r\n  opacity: 0.6;\r\n}"
  },
  {
    "path": "miniprogram/config.js",
    "content": "var data = {\n      //云开发环境id\n      env: 'taoshaoji-46f0r',\n      //分享配置\n      share_title: '吉珠二手交易平台',\n      share_img: '/images/poster.jpg', //可以是网络地址，本地文件路径要填绝对位置\n      share_poster:'https://s2.ax1x.com/2019/11/20/Mhpqmt.png',//必须为网络地址\n      //客服联系方式\n      kefu: {\n            qq: '859162716',\n            weixin:'ttao527'\n      },\n      //默认启动页背景图，防止请求失败完全空白 \n      //可以是网络地址，本地文件路径要填绝对位置\n      bgurl: '',\n      //校区\n      campus: [{\n                  name: '竹园',\n                  id: 0\n            },\n            {\n                  name: '康园',\n                  id: 1\n            },\n            {\n                  name: '松园',\n                  id: 2\n            },\n            {\n                  name: '桂园',\n                  id: 3\n            },\n            {\n                  name: '梅园',\n                  id: 4\n            },\n            {\n                  name: '榕园',\n                  id: 5\n            },\n            {\n                  name: '松园',\n                  id: 6\n            },\n\n      ],\n      //配置学院，建议不要添加太多，不然前端不好看\n      college: [{\n                  name: '通用',\n                  id: -1\n            },\n            {\n                  name: '学习用品',\n                  id: 0\n            },\n            {\n                  name: '日用品',\n                  id: 1\n            },\n            {\n                  name: '装饰品',\n                  id: 2\n            },\n            {\n                  name: '衣物',\n                  id: 3\n            },\n            {\n                  name: '运动器材',\n                  id: 4\n            },\n            {\n                  name: '化妆品',\n                  id: 5\n            },\n            {\n                  name: '其他',\n                  id: 6\n            },\n      ],\n}\n//下面的就别动了\nfunction formTime(creatTime) {\n      let date = new Date(creatTime),\n            Y = date.getFullYear(),\n            M = date.getMonth() + 1,\n            D = date.getDate(),\n            H = date.getHours(),\n            m = date.getMinutes(),\n            s = date.getSeconds();\n      if (M < 10) {\n            M = '0' + M;\n      }\n      if (D < 10) {\n            D = '0' + D;\n      }\n      if (H < 10) {\n            H = '0' + H;\n      }\n      if (m < 10) {\n            m = '0' + m;\n      }\n      if (s < 10) {\n            s = '0' + s;\n      }\n      return Y + '-' + M + '-' + D + ' ' + H + ':' + m + ':' + s;\n}\n\nfunction days() {\n      let now = new Date();\n      let year = now.getFullYear();\n      let month = now.getMonth() + 1;\n      let day = now.getDate();\n      if (month < 10) {\n            month = '0' + month;\n      }\n      if (day < 10) {\n            day = '0' + day;\n      }\n      let date = year + \"\" + month + day;\n      return date;\n}\nmodule.exports = {\n      data: JSON.stringify(data),\n      formTime: formTime,\n      days: days\n}"
  },
  {
    "path": "miniprogram/pages/about/about.js",
    "content": "// pages/about/about.js\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    imgs1: [{\n        url: 'tao.jpg',\n        name: '是芒果千层呀',\n        id: \"0\"\n      },\n      {\n        url: 'chen.jpg',\n        name: '楚利略',\n        id: \"1\"\n      },\n    ],\n    des: '随着人们节约环保的消费意识的增强，在商品极丰富的大学校园里，二手物品交易市场迅速发展。大学生的消费金额限制、其节约意识以及每年大量的新生入学和毕业生离校，给予大学二手交易市场巨大的发展空间。然而我们观察发现，当前校园内的二手交易市场缺乏一个可靠实用的校园交易平台。考虑到微信小程序，方便快捷即用即走，速度快，安全性强等的优点，我们选择它作为交易平台。\\n注意：\\n本微信小程序只是提供物品交易的平台，不涉及金钱交易！主要服务于大学校园的学生与教师。'\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function (options) {\n    // 在页面中定义插屏广告\n    let interstitialAd = null\n\n    // 在页面onLoad回调事件中创建插屏广告实例\n    if (wx.createInterstitialAd) {\n      interstitialAd = wx.createInterstitialAd({\n        adUnitId: 'adunit-dfbad1c323913ca2'\n      })\n      interstitialAd.onLoad(() => {})\n      interstitialAd.onError((err) => {})\n      interstitialAd.onClose(() => {})\n    }\n\n    // 在适合的场景显示插屏广告\n    if (interstitialAd) {\n      interstitialAd.show().catch((err) => {\n        console.error(err)\n      })\n    }\n  },\n  \n  //图片点击事件\n  img: function (event) {\n    let arr = [];\n    arr.push('https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/appreciate-code/appreciateimg.jpg?sign=7a94d719f891a5b8838fae33a1b79d22&t=1597422871')\n    wx.previewImage({\n      current: 'current', // 当前显示图片的http链接\n      urls: arr // 需要预览的图片http链接列表\n    })\n  },\n  onReady: function () {\n\n  },\n  //复制\n  copy(e) {\n    wx.setClipboardData({\n      data: e.currentTarget.dataset.copy,\n      success: res => {\n        wx.showToast({\n          title: '复制' + e.currentTarget.dataset.name + '成功',\n          icon: 'success',\n          duration: 1000,\n        })\n      }\n    })\n  },\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload: function () {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh: function () {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom: function () {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage: function () {\n\n  }\n})"
  },
  {
    "path": "miniprogram/pages/about/about.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/about/about.wxml",
    "content": "<view class=\"title\">开发：</view>\n<view class=\"main\">\n\t<view class=\"image\">\n\t\t<view class=\"txt\" wx:for=\"{{imgs1}}\" wx:key=\"{{index}}\">\n\t\t\t<image class=\"im\" src=\"{{item.url}}\" data-id=\"{{index}}\"></image>\n\t\t\t<view class=\"t\">\n\t\t\t\t{{item.name}}\n\t\t\t</view>\n\t\t</view>\n\t</view>\n</view>\n<view class=\"contain\">\n\t<view class=\"title\">程序简介</view>\n\t<view class=\"description\">\n\t\t<text space=\"emsp\" decode=\"{{ true }}\">{{des}}</text>\n\t</view>\n\t<view class=\"title\">打赏我们</view>\n\t<view class=\"description\">\n\t\t<view class='imagesize'>\n\t\t\t<image src=\"https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/appreciate-code/appreciateimg.jpg?sign=7a94d719f891a5b8838fae33a1b79d22&t=1597422871\" class='in-image' bindtap=\"img\" />\n\t\t</view>\n\t</view>\n\t<view class=\"title\">联系方式</view>\n\t<view class=\"description\">\n\t\t<view class=\"tip\" bindtap=\"copy\" data-copy=\"拈花我把酒\" data-name=\"微信公众号\">\n\t\t\t<view>公众号</view>:\n\t\t\t<text>拈花我把酒</text>\n\t\t</view>\n\t\t<view class=\"tip\" bindtap=\"copy\" data-copy=\"859162716\" data-name=\"QQ群\">\n\t\t\t<view>QQ群</view>:\n\t\t\t<text>859162716</text>\n\t\t</view>\n\t</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/about/about.wxss",
    "content": "page {\n      background: #eee;\n}\n\n.des_contain {\n      width: 618rpx;\n      height: 157rpx;\n      border-radius: 10rpx;\n      background: #fff;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n      justify-content: center;\n      padding: 0 0 0 90rpx;\n}\n\n.imagesize {\n      display: flex;\n      justify-content: center;\n}\n\n.imagesize image {\n      width: 400rpx;\n      height: 400rpx;\n}\n\n.name {\n      font-size: 36rpx;\n      line-height: 50rpx;\n}\n\n.sign {\n      margin-top: 10rpx;\n      font-size: 28rpx;\n      letter-spacing: 3rpx;\n      line-height: 45rpx;\n      color: #b8b8b8;\n}\n\n.avator_box {\n      position: absolute;\n      left: 0rpx;\n      top: 0rpx;\n      display: flex;\n      padding: 44rpx 0 0 40rpx;\n}\n\n.avator {\n      box-shadow: 0 0 10rpx #b8b8b8;\n      width: 110rpx;\n      height: 110rpx;\n      border-radius: 20rpx;\n}\n\n.contain {\n      width: 100%;\n      background: #eee;\n      display: flex;\n      flex-direction: column;\n      padding: 0 20rpx;\n      box-sizing: border-box;\n}\n\n.title {\n      margin-top: 20rpx;\n      line-height: 45rpx;\n      padding-left: 20rpx;\n      font-size: 32rpx;\n      letter-spacing: 3rpx;\n      color: #000;\n}\n\n.description {\n      width: 100%;\n      padding: 24rpx 30rpx;\n      background: #fff;\n      border-radius: 10rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n}\n\n.description text {\n      width: 100%;\n      font-size: 28rpx;\n      line-height: 44rpx;\n      letter-spacing: 3rpx;\n}\n\n.tip {\n      display: flex;\n      align-items: center;\n}\n\n.tip view {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n      padding: 15rpx 0;\n      width: 150rpx;\n      display: flex;\n      justify-content: space-between;\n}\n\n.tip text {\n      margin-left: 20rpx;\n      font-size: 28rpx;\n      color: #008ecf;\n      text-decoration-line: underline;\n}\n\n.main {\n      background: #fff;\n      margin: 0 3px;\n      position: relative;\n      padding: 4rpx 30px;\n      color: #1c1111;\n      font-size: 12px;\n      display: flex;\n}\n\n.image {\n      display: flex;\n      flex-wrap: wrap;\n}\n\n.im {\n      margin-left: 80rpx;\n      margin-top: 35rpx;\n      height: 145rpx;\n      width: 145rpx;\n      border-radius: 50%;\n}\n\n.txt {\n      width: 230rpx;\n      text-align: center\n}\n\n.t {\n      margin-left: 26px;\n      color: lightskyblue;\n}"
  },
  {
    "path": "miniprogram/pages/appreciateCode/appreciateCode.js",
    "content": "const db = wx.cloud.database();\nconst app = getApp();\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    bigImg: '',\n    isExist: Boolean, //如果存在的话就是真，不存在的话就是假\n    openid: app.openid\n  },\n  onLoad() {\n    this.getCodeFromSet()\n  },\n\n  getCodeFromSet() {\n    let that = this;\n    let openid = app.openid\n    console.log(openid)\n    db.collection('appreciatecode').where({\n      _openid: openid,\n    }).get().then(res => {\n      if (res.data.length > 0) {\n        that.setData({\n          isExist: true,\n          bigImg: res.data[0].bigImg\n        })\n        console.log(res.data[0].bigImg)\n        console.log(\"isExist---->\" + that.data.isExist)\n      } else {\n        that.setData({\n          isExist: false,\n        })\n        console.log(\"isExist---->\" + that.data.isExist)\n      }\n    })\n  },\n\n\n  changeBigImg() {\n    let that = this;\n    let openid = app.openid\n    wx.chooseImage({\n      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图，默认二者都有\n      sourceType: ['album'], // 可以指定来源是相册还是相机，默认二者都有\n      success: function (res) {\n        wx.showLoading({\n          title: '上传中',\n        });\n        // 返回选定照片的本地文件路径列表，tempFilePath可以作为img标签的src属性显示图片\n        let filePath = res.tempFilePaths[0];\n        const name = Math.random() * 1000000;\n        const cloudPath = 'appreciate-code/' + app.openid + '/' + name + filePath.match(/\\.[^.]+?$/)[0]\n        wx.cloud.uploadFile({\n          cloudPath, //云存储图片名字\n          filePath, //临时路径\n          success: res => {\n            console.log('[上传图片] 成功：', res)\n            that.setData({\n              bigImg: res.fileID, //云存储图片路径,可以把这个路径存到集合，要用的时候再取出来\n            });\n            let fileID = res.fileID;\n            //把图片存到appreciatecode集合表\n            const db = wx.cloud.database();\n            if (that.data.isExist == false) {\n              db.collection(\"appreciatecode\").add({\n                data: {\n                  bigImg: fileID,\n                },\n                success: function () {\n                  wx.showToast({\n                    title: '赞赏码上传成功',\n                    'icon': 'none',\n                    duration: 3000\n                  })\n                  console.log(\"这里是第一次，用add\")\n                  that.setData({\n                    isExist: true\n                  })\n                },\n                fail: function () {\n                  wx.showToast({\n                    title: '赞赏码上传失败',\n                    'icon': 'none',\n                    duration: 3000\n                  })\n                }\n              });\n            } else {\n              db.collection(\"appreciatecode\").where({\n                _openid: openid\n              }).update({\n                data: {\n                  bigImg: fileID,\n                },\n                success: function () {\n                  wx.showToast({\n                    title: '赞赏码上传成功',\n                    'icon': 'none',\n                    duration: 3000\n                  })\n                  console.log(\"这里是第二次，用update\")\n                },\n                fail: function () {\n                  wx.showToast({\n                    title: '赞赏码上传失败',\n                    'icon': 'none',\n                    duration: 3000\n                  })\n                }\n              });\n            }\n          },\n          fail: e => {\n            console.error('[上传图片] 失败：', e)\n          },\n          complete: () => {\n            wx.hideLoading()\n          }\n        });\n      }\n    })\n  },\n})"
  },
  {
    "path": "miniprogram/pages/appreciateCode/appreciateCode.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/appreciateCode/appreciateCode.wxml",
    "content": "<!-- <view wx:if='{{!isExist}}'>\n\t<image src='cloud://taoshaoji-46f0r.7461-taoshaoji-46f0r-1302243411/gzh/eg.jpeg' mode=\"aspectFit\" class=\"image\"></image>\n</view>\n<view wx:elif='{{isExist}}'>\n\t<image src='{{bigImg}}' mode=\"aspectFit\" class=\"image\"></image>\n</view> -->\n<view class=\"space\"></view>\n<view class='imagesize' wx:if='{{!isExist}}'>\n  <image src='cloud://taoshaoji-46f0r.7461-taoshaoji-46f0r-1302243411/gzh/eg.jpeg' class='in-image'/>\n</view>\n<view class='imagesize' wx:if='{{isExist}}'>\n  <image src='{{bigImg}}' class='in-image'/>\n</view>\n\n<view class=\"space\"></view>\n<button class=\"btn\" style=\"width:60vw\" bindtap='changeBigImg' size=\"default\">{{(!isExist)?\"上传赞赏码\":\"修改赞赏码\"}}</button>\n\n\n<view class=\"contain\">\n\t<view class=\"title\"><image class=\"about\" src=\"/images/about.png\" />上传申明</view>\n\t<view class=\"title\">1、为什么要上传赞赏码？</view>\n\t<view class=\"description\">\n\t\t<text space=\"emsp\" decode=\"{{ true }}\">因为微信小程序中无法识别收款码或者提供其它财产交易方式，所以我们采用小程序能够识别的赞赏码来进行付款交易</text>\n\t</view>\n\t<view class=\"title\">2、如何获取付款码？</view>\n\t<view class=\"description\">\n\t\t<text space=\"emsp\" decode=\"{{ true }}\">用户可以在微信中我的-支付-钱包中的收付款页面下方选项-赞赏码获取，然后保存赞赏码上传到本小程序中，便可实现在线交易。后续我们会努力拿到微信支付的接口权限，简化交易过程。</text>\n\t</view>\n\t<view class=\"title\"><image class=\"about\" src=\"/images/about.png\" />作者声明</view>\n\t<view class=\"description\">\n\t\t<text space=\"emsp\" decode=\"{{ true }}\">赞赏码的用途和收款码类似。只能用于收款，用户不用担心会因此产生不必要的财产损失。我们会将赞赏码附加于订单详情页，买家可以通过扫描赞赏码向卖家进行费用支付。\\nTip:如果卖家不想上传赞赏码，可以在线下和买家进行沟通，面对面扫一扫交易也可。</text>\n\t</view>\n\t<view class=\"space\"></view>\n</view>"
  },
  {
    "path": "miniprogram/pages/appreciateCode/appreciateCode.wxss",
    "content": "page {\n  background: #eee;\n}\n\n.imagesize {\n  display: flex; \n  justify-content: center; \n}\n\n.imagesize image {\n  width: 400rpx;\n  height: 400rpx;\n}\n\n.contain {\n  width: 100%;\n  background: #eee;\n  display: flex;\n  flex-direction: column;\n  padding: 0 20rpx;\n  box-sizing: border-box;\n}\n\n.btn {\n  background-image: linear-gradient(-225deg, #9EFBD3 0%, #57E9F2 48%, #45D4FB 100%);\n  margin-bottom: 20rpx;\n  width: 100%;\n  height: 100rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  border-radius: 100rpx;\n  color: #fff;\n  font-size: 40rpx;\n  letter-spacing: 4rpx;\n  border: none;\n}\n\n.shen_title {\n  margin-top: 40rpx;\n  font-size: 32rpx;\n  letter-spacing: 2rpx;\n  display: flex;\n  justify-content: flex-start;\n  align-items: center;\n}\n\n.about {\n  width: 32rpx;\n  height: 32rpx;\n  padding-right: 10rpx;\n}\n\n.title {\n  margin-top: 20rpx;\n  line-height: 56rpx;\n  padding-left: 20rpx;\n  font-size: 32rpx;\n  letter-spacing: 3rpx;\n  color: #000;\n}\n\n.description {\n  width: 100%;\n  padding: 24rpx 30rpx;\n  background: #fff;\n  border-radius: 10rpx;\n  display: flex;\n  box-sizing: border-box;\n  flex-direction: column;\n}\n\n.description text {\n  width: 100%;\n  font-size: 28rpx;\n  line-height: 44rpx;\n  letter-spacing: 3rpx;\n}\n\n.space {\n  width: 100%;\n  height: 20rpx;\n  background: #eee;\n}\n\n.nocontent {\n  width: 100%;\n  height: calc(100% - 400rpx);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  flex-direction: column;\n  box-sizing: border-box;\n}\n\n.image {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}"
  },
  {
    "path": "miniprogram/pages/detail/detail.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../config.js\");\nconst _ = db.command;\nlet obj = ''\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            first_title: true,\n            place: '',\n            roomID: '',\n            goodssaller: '',\n            openid: '',\n            imgs: [],\n            isShow: true,\n            status: 0,\n            avatarUrl: '',\n            buyerInfo: [],\n            isExist: Boolean,\n            address:''\n      },\n      onLoad(e) {\n            obj = e;\n            this.getuserdetail();\n            this.data.id = e.scene;\n            this.getPublish(e.scene);\n            if (app.openid) {\n                  this.setData({\n                        openid: app.openid\n                  })\n            } else {\n                  console.log(\"no openid\");\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }\n            this.getBuyer(this.data.openid)\n            wx.showShareMenu({\n                  withShareTicket: true,\n                  menus: ['shareAppMessage', 'shareTimeline']\n            })\n      },\n\n      //获取买家信息\n      getBuyer(m) {\n            let that = this;\n            db.collection('user').where({\n                  _openid: m\n            }).get({\n                  success: function (res) {\n                        wx.hideLoading();\n                        that.setData({\n                              buyerInfo: res.data[0]\n                        })\n                  }\n            })\n      },\n\n      goo(e) {\n            var myid = this.data.openid;\n            var sallerid = this.data.goodssaller;\n            wx.cloud.init({\n                  env: 'taoshaoji-46f0r',\n                  traceUser: true\n            });\n            //初始化数据库\n            const db = wx.cloud.database();\n            if (myid != sallerid) {\n                  db.collection('rooms').where({\n                        p_b: myid,\n                        p_s: sallerid\n                  }).get().then(res => {\n                        console.log(res.data);\n                        if (res.data.length > 0) {\n                              this.setData({\n                                    roomID: res.data[0]._id\n                              })\n                              db.collection(\"rooms\").doc(res.data[0]._id).update({\n                                    data: {\n                                      deleted:0\n                                    },\n                                  }),\n                              wx.navigateTo({\n                                    url: 'room/room?id=' + this.data.roomID,\n                              })\n                        } else {\n                              db.collection('rooms').add({\n                                    data: {\n                                          p_b: myid,\n                                          p_s: sallerid,\n                                          deleted:0\n                                    },\n                              }).then(res => {\n                                    console.log(res)\n                                    this.setData({\n                                          roomID: res._id\n                                    })\n                                    wx.navigateTo({\n                                          url: 'room/room?id=' + this.data.roomID,\n                                    })\n                              })\n                        }\n                  })\n            } else {\n                  wx.showToast({\n                        title: '无法和自己建立聊天',\n                        icon: 'none',\n                        duration: 1500\n                  })\n            }\n      },\n\n\n      changeTitle(e) {\n            let that = this;\n            that.setData({\n                  first_title: e.currentTarget.dataset.id\n            })\n      },\n      //获取发布信息\n      getPublish(e) {\n            let that = this;\n            db.collection('publish').doc(e).get({\n                  success: function (res) {\n                        that.setData({\n                              collegeName: JSON.parse(config.data).college[parseInt(res.data.collegeid) + 1],\n                              publishinfo: res.data\n                        })\n                        that.getSeller(res.data._openid)\n                  }\n            })\n      },\n      //获取卖家信息\n      getSeller(m, n) {\n            let that = this;\n            db.collection('user').where({\n                  _openid: m\n            }).get({\n                  success: function (res) {\n                        console.log(res.data[0]._openid);\n                        that.setData({\n                              userinfo: res.data[0],\n                              goodssaller: res.data[0]._openid\n                        })\n                        that.getBook(n)\n                  }\n            })\n      },\n      //回到首页\n      home() {\n            wx.switchTab({\n                  url: '/pages/index/index',\n            })\n      },\n      //回到我的\n      my() {\n            wx.switchTab({\n                  url: '/pages/my/my',\n            })\n      },\n      //购买检测\n      buy() {\n            var myid = this.data.openid;\n            var sallerid = this.data.goodssaller;\n            let that = this;\n            if (myid == sallerid) {\n                  wx.showToast({\n                        title: '自己买不了自己的噢！',\n                        icon: 'none',\n                        duration: 1500\n                  })\n                  return false\n            }\n            if (!app.openid) {\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }\n            if (that.data.publishinfo.deliveryid == 1) {\n                  if (that.data.place == '') {\n                        wx.hideLoading();\n                        wx.showToast({\n                              title: '请输入您的收货地址',\n                              icon: 'none'\n                        })\n                        return false\n                  }\n            }\n            that.getStatus();\n      },\n      //获取订单状态\n      getStatus() {\n            let that = this;\n            let _id = that.data.publishinfo._id;\n            console.log(_id);\n            db.collection('publish').doc(_id).get({\n                  success(e) {\n                        if (e.data.status == 0) {\n                              that.creatOrder(_id);\n                        }\n                        if (e.data.status == 1) {\n                              wx.showToast({\n                                    title: '该物品刚刚被抢光了~',\n                                    icon: 'none'\n                              })\n                        }\n                        if (e.data.status == 2) {\n                              wx.showToast({\n                                    title: '该物品已出售',\n                                    icon: 'none'\n                              })\n                        }\n                        if (e.data.status == 3) {\n                              wx.showToast({\n                                    title: '该物品已下架',\n                                    icon: 'none'\n                              })\n                        }\n                  }\n            })\n      },\n      //创建订单\n      creatOrder(iid) {\n            let that = this;\n\n            db.collection('order').where({\n                  _id: iid\n            }).get().then(res => {\n                  console.log(res.data);\n                  if (res.data.length > 0) {\n                        that.setData({\n                              isExist: true\n                        })\n                        console.log(\"isExist:\" + that.data.isExist)\n                  } else {\n                        that.setData({\n                              isExist: false\n                        })\n                        console.log(\"isExist:\" + that.data.isExist)\n                  }\n            })\n\n            wx.showModal({\n                  title: '确认提示',\n                  content: '是否确认下单购买此商品？',\n                  success(res) {\n                        if (res.confirm) {\n                              if (!that.data.isExist) {\n                                    wx.cloud.callFunction({\n                                          // 云函数名称\n                                          name: 'node',\n                                          // 传给云函数的参数\n                                          data: {\n                                                _id: iid,\n                                                status: 1\n                                          },\n                                          success: function (res) {\n                                                console.log(res)\n                                          },\n                                          fail: console.error\n                                    })\n                                    wx.getUserInfo({\n                                          success: function (res) {\n                                                that.setData({\n                                                      buyerName: res.userInfo.nickName,\n                                                      avatarUrl: res.userInfo.avatarUrl,\n                                                })\n                                          },\n                                          fail(){\n                                                console.log(\"调用getUserinfo失败\")\n                                          }\n                                    })\n                                    db.collection('publish').doc({\n                                          iid\n                                    }).update({\n                                          data: {\n                                                status: 1\n                                          },\n                                          success() {\n                                                wx.hideLoading();\n                                                // that.getList();\n                                                db.collection('order').add({\n                                                      data: {\n                                                            creat: new Date().getTime(),\n                                                            status: 1, //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；\n                                                            price: that.data.publishinfo.price, //售价\n                                                            deliveryid: that.data.publishinfo.deliveryid, //0自1配\n                                                            ztplace: that.data.publishinfo.place, //自提时地址\n                                                            psplace: that.data.place, //配送时买家填的地址\n                                                            bookinfo: {\n                                                                  describe: that.data.publishinfo.bookinfo.describe,\n                                                                  pic: that.data.publishinfo.bookinfo.pic,\n                                                                  good: that.data.publishinfo.bookinfo.good,\n                                                            },\n                                                            buyerInfo: that.data.buyerInfo,\n                                                            seller: that.data.publishinfo._openid,\n                                                            sellid: that.data.publishinfo._id,\n                                                            _id: that.data.publishinfo._id,\n                                                      },\n                                                      success() {\n                                                            that.getAddress()\n                                                            that.send(that.data.goodssaller)\n                                                            wx.showToast({\n                                                                  title: '成功预订！',\n                                                                  icon: 'success',\n                                                                  duration: 3000\n                                                            })\n                                                            setTimeout(function () {\n                                                                  wx.switchTab({\n                                                                        url: '/pages/index/index',\n                                                                  })\n                                                            }, 3000)\n                                                      },\n                                                      fail() {\n                                                            wx.hideLoading();\n                                                            wx.showToast({\n                                                                  title: '发生异常，请及时和管理人员联系处理',\n                                                                  icon: 'none'\n                                                            })\n                                                      }\n                                                })\n                                          },\n                                          fail() {\n                                                wx.hideLoading();\n                                                wx.showToast({\n                                                      title: '操作失败',\n                                                      icon: 'none'\n                                                })\n                                          }\n                                    })\n                                    that.onLoad(obj);\n                              } else {\n                                    wx.cloud.callFunction({\n                                          // 云函数名称\n                                          name: 'node',\n                                          // 传给云函数的参数\n                                          data: {\n                                                _id: iid,\n                                                status: 1\n                                          },\n                                          success: function (res) {\n                                                console.log(res)\n                                          },\n                                          fail: console.error\n                                    })\n                                    db.collection('publish').doc({\n                                          iid\n                                    }).update({\n                                          data: {\n                                                status: 1\n                                          },\n                                          success() {\n                                                wx.hideLoading();\n                                                // that.getList();\n                                                wx.cloud.callFunction({\n                                                      // 云函数名称\n                                                      name: 'pay',\n                                                      // 传给云函数的参数\n                                                      data: {\n                                                            $url: \"changeO\", //云函数路由参数\n                                                            _id: iid,\n                                                            status: 1\n                                                      },\n                                                      success() {\n                                                            that.getAddress()\n                                                            that.send(that.data.goodssaller)\n                                                            wx.showToast({\n                                                                  title: '成功预订！',\n                                                                  icon: 'success',\n                                                                  duration: 3000\n                                                            })\n                                                      },\n                                                      fail() {\n                                                            wx.hideLoading();\n                                                            wx.showToast({\n                                                                  title: '发生异常，请及时和管理人员联系处理',\n                                                                  icon: 'none'\n                                                            })\n                                                      }\n                                                })\n                                          },\n                                          fail() {\n                                                wx.hideLoading();\n                                                wx.showToast({\n                                                      title: '操作失败',\n                                                      icon: 'none'\n                                                })\n                                          }\n                                    })\n                                    that.onLoad(obj);\n                              }\n                        }\n                  }\n            })\n\n      },\n\n      //发送模板消息到指定用户,推送之前要先获取用户的openid\n      send(openid) {\n            let that = this;\n            wx.cloud.callFunction({\n                  name: \"sendMsg\",\n                  data: {\n                        openid: openid,\n                        status: '买家已预定', //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；\n                        address:that.data.address,\n                        describe: that.data.publishinfo.bookinfo.describe,\n                        good: that.data.publishinfo.bookinfo.good,\n                        nickName: that.data.buyerInfo.info.nickName,\n                        color: 'red'\n                  }\n            }).then(res => {\n                  console.log(\"推送消息成功\", res)\n            }).catch(res => {\n                  console.log(\"推送消息失败\", res)\n            })\n      },\n\n      //路由\n      go(e) {\n            wx.navigateTo({\n                  url: e.currentTarget.dataset.go,\n            })\n      },\n      //地址输入\n      placeInput(e) {\n            this.data.place = e.detail.value\n      },\n      //为了数据安全可靠，每次进入获取一次用户信息\n      getuserdetail() {\n            if (!app.openid) {\n                  wx.cloud.callFunction({\n                        name: 'regist', // 对应云函数名\n                        data: {\n                              $url: \"getid\", //云函数路由参数\n                        },\n                        success: re => {\n                              db.collection('user').where({\n                                    _openid: re.result\n                              }).get({\n                                    success: function (res) {\n                                          if (res.data.length !== 0) {\n                                                app.openid = re.result;\n                                                app.userinfo = res.data[0];\n                                                console.log(app)\n                                          }\n                                          console.log(res)\n                                    }\n                              })\n                        }\n                  })\n            }\n      },\n\n      //图片点击事件\n      img: function (event) {\n            let arr = [];\n            arr.push(this.data.publishinfo.bookinfo.imgs);\n            var src = event.currentTarget.dataset.src; //获取data-src\n            // var imgList = that.data.result.images_fileID;\n            //图片预览\n            wx.previewImage({\n                  current: src, // 当前显示图片的http链接\n                  urls: arr[0] // 需要预览的图片http链接列表\n            })\n      },\n\n      /**\n       * 获取地址\n       */\n      getAddress() {\n            let that = this;\n            if (that.data.publishinfo.deliveryid == 0) {\n                  that.setData({\n                        address: that.data.publishinfo.place\n                  })\n            } else {\n                  that.setData({\n                        address: that.data.place\n                  })\n            }\n      },\n})"
  },
  {
    "path": "miniprogram/pages/detail/detail.json",
    "content": "{\n\"navigationBarTitleText\": \"物品详情\"\n}"
  },
  {
    "path": "miniprogram/pages/detail/detail.wxml",
    "content": "<wxs src=\"../../common.wxs\" module=\"morejs\" />\n<view class=\"top_contain\">\n      <!--轮播图-->\n      <swiper indicator-dots='true' autoplay='true' interval='5000' duration='500' circular=\"true\" >\n            <block wx:for=\"{{publishinfo.bookinfo.imgs}}\" wx:key=\"index\">\n                  <swiper-item class=\"image\">\n                        <image src='{{item}}' mode=\"scaleToFill\" bindtap=\"img\" data-src=\"{{item}}\"></image>\n                  </swiper-item>\n            </block>\n      </swiper>\n      \n      <view class=\"title text-cut\">{{publishinfo.bookinfo.good}}</view>\n      <view class=\"price_box\">\n            <view class=\"now_price\">￥{{publishinfo.price}}元</view>\n      </view>\n</view>\n<view class=\"blank\"></view>\n<view class=\"center_contain\">\n      <view bindtap=\"changeTitle\" data-id=\"{{ true }}\" class=\"c_title {{first_title?'title_on':''}}\">发布信息</view>\n      <view bindtap=\"changeTitle\" data-id=\"{{ false }}\" class=\"c_title {{first_title?'':'title_on'}}\">物品详情</view>\n</view>\n<!--发布信息-->\n<view hidden=\"{{!first_title}}\">\n      <view class=\"user_box\">\n            <image lazy-load src=\"{{userinfo.info.avatarUrl}}\"></image>\n            <view class=\"des_box\">\n                  <view class=\"user_name\">{{userinfo.info.nickName}}</view>\n                  <view class=\"local_box\">\n                        <image src=\"/images/local.png\"></image>\n                        <view>{{userinfo.campus.name}}</view>\n                  </view>\n            </view>\n            <view class=\"sex\">\n                  <image lazy-load src=\"{{userinfo.info.gender==0?'/images/none.png':(userinfo.info.gender==1?'/images/boy.png':'/images/girl.png')}}\"></image>\n            </view>\n      </view>\n      <view class=\"time_box\">\n            <view class=\"kind\">{{collegeName.name}}类物品</view>\n            <view class=\"time\">发布于{{morejs.timelog(publishinfo.creat)}}</view>\n      </view>\n      <view class=\"deliver_box\">\n            <view class=\"deliver_first\">\n                  <view class=\"deliver_title\">取货方式：</view>\n                  <view class=\"deliver_kind\">{{publishinfo.deliveryid==0?'自提':'帮送'}}</view>\n            </view>\n            <view class=\"deliver_place\">{{publishinfo.place}}</view>\n      </view>\n      <view class=\"palceInput_box\" wx:if=\"{{publishinfo.deliveryid==1}}\">\n            <input bindinput=\"placeInput\" placeholder=\"卖家可以帮送，请填写您的收货地址\"></input>\n      </view>\n      <view class=\"notes_box\" wx:if=\"{{publishinfo.notes!==''}}\">\n            <view class=\"notes\">\n                  <view class=\"notes_text\">备注信息:</view>\n                  <text class=\"notes_text\" selectable=\"true\">{{publishinfo.notes}}</text>\n            </view>\n      </view>\n\n</view>\n<!--物品详情-->\n<view hidden=\"{{first_title}}\">\n      <view class=\"detail_contain\">\n            <view class=\"detail_card\">\n                  <view class=\"detail_title\">物品描述</view>\n                  <view class=\"detail_content\">{{publishinfo.bookinfo.describe}}</view>\n            </view>\n            <!--物品详情预览-->\n            <block class=\"image\" wx:for=\"{{publishinfo.bookinfo.imgs}}\" wx:key=\"index\">\n                  <view>\n                        <!-- <image class='img' src='{{item}}' data-index='index' bindtap='previewImg'></image>-->\n                        <image src=\"{{item}}\" mode=\"scaleToFill\" bindtap=\"img\" data-src=\"{{item}}\"></image>\n                  </view>\n            </block>\n      </view>\n</view>\n<view style=\"height: 96rpx;\"></view>\n<!--底部导航-->\n<view class=\"tabbar\">\n      <view class=\"t_card\">\n            <image src=\"/images/home.png\"></image>\n            <text>首页</text>\n            <button class=\"t_button\" bindtap=\"home\"></button>\n      </view>\n      <view class=\"t_card\" bindtap=\"my\">\n            <image src=\"/images/tabbar/my.png\"></image>\n            <text>我的</text>\n      </view>\n      <view class=\"buy_box\">\n            <view class=\"buy shadow\" bindtap=\"buy\">{{publishinfo.status==0?'立即购买':(publishinfo.status==1?'刚刚被抢光了':(publishinfo.status==2?'已出售':'已下架'))}}</view>\n      </view>\n</view>\n\n<!--悬浮聊天功能-->\n<view class=\"contact_box\" bindtap=\"goo\" data-id=\"{{roomID}}\" >\n     <image src=\"/images/chat.png\" ></image>\n     <view>私聊</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/detail/detail.wxss",
    "content": ".top_contain {\n      display: flex;\n      flex-direction: column;\n      padding: 24rpx;\n      box-sizing: border-box;\n}\n\n.chou {\n      padding-top: 30rpx;\n}\n\n.top_img {\n      width: 100%;\n      display: flex;\n      justify-content: center;\n}\n\n.top_img image {\n      width: 300rpx;\n      height: 300rpx;\n}\n\n.title {\n      padding-top: 30rpx;\n      font-size: 32rpx;\n      font-weight: 600;\n      letter-spacing: 2rpx;\n}\n\n.author {\n      padding-top: 10rpx;\n      font-size: 26rpx;\n      color: rgb(172, 171, 171);\n      letter-spacing: 2rpx;\n}\n\n.price_box {\n      margin-top: 20rpx;\n      display: flex;\n      align-items: flex-end;\n}\n\n.now_price {\n      font-size: 34rpx;\n      color: rgb(255, 1, 1);\n}\n\n.pre_price {\n      padding-left: 30rpx;\n      font-size: 28rpx;\n      color: rgb(172, 171, 171);\n      text-decoration: line-through;\n}\n\n.blank {\n      width: 100%;\n      height: 24rpx;\n      background: #eee;\n}\n\n.center_contain {\n      width: 100%;\n      height: 80rpx;\n      display: flex;\n      box-sizing: border-box;\n      padding: 0 100rpx;\n      justify-content: space-around;\n}\n\n.c_title {\n      font-size: 30rpx;\n      width: 140rpx;\n      height: 100%;\n      display: flex;\n      letter-spacing: 2rpx;\n      align-items: center;\n      justify-content: center;\n}\n\n.title_on {\n      font-size: 32rpx;\n      font-weight: 600;\n      color: #000;\n      border-bottom: 4rpx solid   #fbbd08;\n}\n\n.user_box {\n      width: 100%;\n      height: 148rpx;\n      display: flex;\n      padding: 24rpx;\n      align-items: center;\n      justify-content: space-between;\n      box-sizing: border-box;\n}\n\n.user_box image {\n      width: 100rpx;\n      height: 100rpx;\n      border-radius: 50%;\n}\n\n.des_box {\n      height: 100%;\n      width: 450rpx;\n      display: flex;\n      flex-direction: column;\n      align-items: flex-start;\n      justify-content: space-around;\n      padding: 10rpx 0;\n}\n\n.user_name {\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n}\n\n.local_box {\n      display: flex;\n      align-items: center;\n}\n\n.local_box image {\n      width: 30rpx;\n      height: 30rpx;\n}\n\n.local_box view {\n      padding-left: 5rpx;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: rgb(150, 150, 150);\n}\n\n.sex {\n      width: 100rpx;\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n}\n\n.sex image {\n      width: 50rpx;\n      height: 50rpx;\n      border-radius: 50%;\n}\n\n.notes_box {\n      width: 100%;\n      padding: 24rpx 24rpx 0 24rpx;\n      display: flex;\n      box-sizing: border-box;\n}\n\n.notes {\n      width: 100%;\n      background: rgb(238, 238, 238);\n      color: #aaa;\n      padding: 20rpx 20rpx 10rpx 20rpx;\n      border-radius: 10rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n}\n\n.notes_text {\n      letter-spacing: 2rpx;\n      font-size: 28rpx;\n      line-height: 45rpx;\n      padding-bottom: 10rpx;\n}\n\n.time_box {\n      width: 100%;\n      padding: 24rpx 24rpx 0 24rpx;\n      display: flex;\n      box-sizing: border-box;\n      justify-content: space-between;\n}\n\n.kind {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n}\n\n.time {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #8c9aa8;\n}\n\n.deliver_box {\n      width: 100%;\n      padding: 24rpx 24rpx 0 24rpx;\n      display: flex;\n      box-sizing: border-box;\n      justify-content: space-between;\n}\n\n.deliver_first {\n      display: flex;\n      align-items: center;\n}\n\n.deliver_title {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n}\n\n.deliver_kind {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #a5a5a5;\n}\n\n.deliver_place {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n}\n\n.palceInput_box {\n      width: 100%;\n      padding: 24rpx 24rpx 0 24rpx;\n      display: flex;\n      box-sizing: border-box;\n      justify-content: center;\n}\n\n.palceInput_box input {\n      width: 100%;\n      height: 66rpx;\n      border: 1rpx solid #eee;\n      border-radius: 10rpx;\n      font-size: 26rpx;\n      padding: 0 20rpx;\n      letter-spacing: 2rpx;\n}\n\n.detail_contain {\n      width: 100%;\n      padding: 24rpx;\n      display: flex;\n      margin: 0;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.detail_card {\n      display: flex;\n      width: 100%;\n      box-sizing: border-box;\n      padding: 30rpx 0;\n      justify-content: space-between;\n}\n\n.detail_border {\n      border-bottom: 1rpx solid #eee;\n}\n\n.detail_title {\n      width: 20%;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      line-height: 45rpx;\n}\n\n.detail_content {\n      width: 78%;\n      font-size: 27rpx;\n      letter-spacing: 2rpx;\n      line-height: 44rpx;\n      color: #616161;\n}\n\n/*底部导航*/\n\n.tabbar {\n      width: 100%;\n      height: 96rpx;\n      background: #fff;\n      opacity: 1;\n      position: fixed;\n      left: 0rpx;\n      bottom: 0rpx;\n      display: flex;\n      padding: 10rpx;\n      border-top: 1rpx solid #eee;\n      align-items: center;\n      box-sizing: border-box;\n      z-index: 8;\n}\n\n.t_card {\n      position: relative;\n      width: 30%;\n      height: 80rpx;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n      box-sizing: border-box;\n}\n\n.t_card image {\n      width: 40rpx;\n      height: 40rpx;\n\n}\n\n.t_card text {\n      display: flex;\n      align-items: flex-start;\n      justify-content: center;\n      height: calc(100% - 50rpx);\n      width: 100%;\n      font-size: 24rpx;\n      text-align: center;\n      white-space: nowrap;\n      padding-top: 4rpx;\n}\n\n.t_button {\n      width: 100%;\n      height: 100%;\n      position: absolute;\n      left: 0rpx;\n      top: 0rpx;\n      opacity: 0.01;\n      z-index: 9;\n}\n\n.buy_box {\n      width: 40%;\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      box-sizing: border-box;\n}\n\n.buy {\n      width: 90%;\n      height: 70rpx;\n      background:   #fbbd08;\n      color: #000;\n      letter-spacing: 4rpx;\n      font-size: 28rpx;\n      border-radius: 35rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n}\n\n.contact_box {\n      z-index: 9;\n      position: fixed;\n      bottom: 110rpx;\n      right: 40rpx;\n      display: flex;\n      width: 100rpx;\n      flex-direction: column;\n      align-items: center;\n      background: rgba(255, 255, 255, 0.8);\n      padding: 20rpx 0;\n      border-radius: 50rpx 50rpx 20rpx 20rpx;\n      box-shadow: 0 0 20rpx #f0f0f0 !important;\n}\n\n.contact_box image {\n      width: 80rpx;\n      height: 80rpx;\n}\n.image{\n      display:flex;\n      justify-content: center;\n}\n\n.contact_box view {\n      font-size: 26rpx;\n      letter-spacing: 2rpx;\n      margin-top: 10rpx;\n}\n\n.imgList {\n      width: 100%;\n}\n\n.imgList .imgList-li {\n      width: 100%;\n}\n\n.imgList .imgList-li .img {\n      width: 400rpx;\n      height: 400rpx;\n}"
  },
  {
    "path": "miniprogram/pages/detail/room/room.js",
    "content": "const app = getApp()\n\nPage({\n  data: {\n    avatarUrl: './user-unlogin.png',\n    userInfo: null,\n    logged: false,\n    takeSession: false,\n    requestResult: '',\n    //chatRoomEnvId: 'release-f8415a',\n    chatRoomCollection: 'chatroom',\n    chatRoomGroupId: '',\n    chatRoomGroupName: '聊天室',\n    // functions for used in chatroom components\n    onGetUserInfo: null,\n    getOpenID: null,\n  },\n\n  onLoad: function (opentions) {\n    // 获取用户信息\n    wx.getSetting({\n      success: res => {\n        if (res.authSetting['scope.userInfo']) {\n          // 已经授权，可以直接调用 getUserInfo 获取头像昵称，不会弹框\n          wx.getUserInfo({\n            success: res => {\n              this.setData({\n                avatarUrl: res.userInfo.avatarUrl,\n                userInfo: res.userInfo\n              })\n            }\n          })\n        }\n      }\n    })\n\n    this.setData({\n      onGetUserInfo: this.onGetUserInfo,\n      getOpenID: this.getOpenID,\n      chatRoomGroupId: opentions.id\n    })\n\n    wx.getSystemInfo({\n      success: res => {\n        console.log('system info', res)\n        if (res.safeArea) {\n          const {\n            top,\n            bottom\n          } = res.safeArea\n          this.setData({\n            containerStyle: `padding-top: ${(/ios/i.test(res.system) ? 10 : 20) + top}px; padding-bottom: ${20 + res.windowHeight - bottom}px`,\n          })\n        }\n      },\n    })\n  },\n\n  getOpenID: async function () {\n    if (app.openid) {\n      return app.openid\n    }\n    const {\n      result\n    } = await wx.cloud.callFunction({\n      name: 'login',\n    })\n    return result.openid\n  },\n\n  onGetUserInfo: function (e) {\n    if (!this.logged && e.detail.userInfo) {\n      this.setData({\n        logged: true,\n        avatarUrl: e.detail.userInfo.avatarUrl,\n        userInfo: e.detail.userInfo\n      })\n    }\n  },\n\n  onGetUserInfo: function (e) {\n    if (!this.logged && e.detail.userInfo) {\n      this.setData({\n        logged: true,\n        avatarUrl: e.detail.userInfo.avatarUrl,\n        userInfo: e.detail.userInfo\n      })\n    }\n  },\n\n  onShareAppMessage() {\n    return {\n      title: '聊天室',\n      path: '/pages/detail/room/room',\n    }\n  \n  },\n\n  \n\n  go(){\n    wx.navigateTo({\n      url: '/pages/message/message',\n    })\n  }\n\n})"
  },
  {
    "path": "miniprogram/pages/detail/room/room.json",
    "content": "{\n  \"usingComponents\": {\n    \"chatroom\": \"/components/chatroom/chatroom\"\n  }\n}"
  },
  {
    "path": "miniprogram/pages/detail/room/room.wxml",
    "content": "\n<view class=\"container\">\n\n<van-notice-bar left-icon=\"volume-o\" text=\"可以在我的——消息中心处 拍一拍 提醒对方上线哦!\" speed=\"30\" />\n  <chatroom\n    style=\"width: 100%; height: 95%\"\n    envId=\"{{chatRoomEnvId}}\"\n    collection=\"{{chatRoomCollection}}\"\n    groupId=\"{{chatRoomGroupId}}\"\n    groupName=\"{{chatRoomGroupName}}\"\n    userInfo=\"{{userInfo}}\"\n    onGetUserInfo=\"{{osnGetUserInfo}}\"\n    getOpenID=\"{{getOpenID}}\"\n  ></chatroom>\n</view>\n"
  },
  {
    "path": "miniprogram/pages/detail/room/room.wxss",
    "content": ".container {\n  height: 98%;\n  position: absolute;\n  /* top: 0; */\n  bottom: 0;\n  left: 0;\n  right: 0;\n  padding-top: 80rpx;\n  padding-bottom: 30rpx;\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n}\n\n.space {\n  width: 100%;\n  height: 15rpx;\n  background: #eee;\n}"
  },
  {
    "path": "miniprogram/pages/edit/edit.js",
    "content": "const db = wx.cloud.database();\nconst app = getApp();\nconst config = require(\"../../config.js\");\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            ids: -1,\n            wxnum: '',\n            qqnum: '',\n            email: '',\n            checked:false,\n            campus: JSON.parse(config.data).campus,\n      },\n      onChange(event) {\n            if(event.detail==true){\n                  wx.requestSubscribeMessage({\n                        tmplIds: ['6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0','XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q'], //这里填入我们生成的模板id\n                        success(res) {          \n                              console.log('授权成功', res)\n                        },\n                        fail(res) {\n                              console.log('授权失败', res)\n                        }\n                  })\n            }\n            this.setData({\n              checked: event.detail,\n            });\n          },\n      choose(e) {\n            let that = this;\n            that.setData({\n                  ids: e.detail.value\n            })\n            //下面这种办法无法修改页面数据\n            /* this.data.ids = e.detail.value;*/\n      },\n      onLoad() {\n            this.getdetail();\n      },\n      getdetail() {\n            let that = this;\n            db.collection('user').where({\n                  _openid: app.openid\n            }).get({\n                  success: function(res) {\n                        let info = res.data[0];\n                        that.setData({\n                              phone: info.phone,\n                              qqnum: info.qqnum,\n                              wxnum: info.wxnum,\n                              email: info.email,\n                              ids: info.campus.id,\n                              _id: info._id\n                        })\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败',\n                              icon: 'none'\n                        })\n                        let e = setTimeout(\n                              wx.navigateBack({}), 2000\n                        )\n                  }\n            })\n      },\n      \n      wxInput(e) {\n            this.data.wxnum = e.detail.value;\n      },\n      qqInput(e) {\n            this.data.qqnum = e.detail.value;\n      },\n      emInput(e) {\n            this.data.email = e.detail.value;\n      },\n      getUserInfo(e) {\n            let that = this;\n            console.log(e);\n            let test = e.detail.errMsg.indexOf(\"ok\");\n            if (test == '-1') {\n                  wx.showToast({\n                        title: '请授权后方可使用',\n                        icon: 'none',\n                        duration: 2000\n                  });\n            } else {\n                  that.setData({\n                        userInfo: e.detail.userInfo\n                  })\n                  that.check();\n            }\n      },\n      //校检\n      check() {\n            let that = this;\n            //校检手机\n            let phone = that.data.phone;\n            if (phone == '') {\n                  wx.showToast({\n                        title: '请先获取您的电话',\n                        icon: 'none',\n                        duration: 2000\n                  });\n                  return false\n            }\n            //校检校区\n            let ids = that.data.ids;\n            let campus = that.data.campus;\n            if (ids == -1) {\n                  wx.showToast({\n                        title: '请先获取您的校区',\n                        icon: 'none',\n                        duration: 2000\n                  });\n            }\n            //校检邮箱\n            let email = that.data.email;\n            if (!(/^\\w+((.\\w+)|(-\\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/.test(email))) {\n                  wx.showToast({\n                        title: '请输入常用邮箱',\n                        icon: 'none',\n                        duration: 2000\n                  });\n                  return false;\n            }\n            //校检QQ号\n            let qqnum = that.data.qqnum;\n            if (qqnum !== '') {\n                  if (!(/^\\s*[.0-9]{5,11}\\s*$/.test(qqnum))) {\n                        wx.showToast({\n                              title: '请输入正确QQ号',\n                              icon: 'none',\n                              duration: 2000\n                        });\n                        return false;\n                  }\n            }\n            //校检微信号\n            let wxnum = that.data.wxnum;\n            if (wxnum !== '') {\n                  if (!(/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(wxnum))) {\n                        wx.showToast({\n                              title: '请输入正确微信号',\n                              icon: 'none',\n                              duration: 2000\n                        });\n                        return false;\n                  }\n            }\n            wx.showLoading({\n                  title: '正在提交',\n            })\n            db.collection('user').doc(that.data._id).update({\n                  data: {\n                        phone: that.data.phone,\n                        campus: that.data.campus[that.data.ids],\n                        qqnum: that.data.qqnum,\n                        email: that.data.email,\n                        wxnum: that.data.wxnum,\n                        info: that.data.userInfo,\n                        updatedat: new Date().getTime(),\n                  },\n                  success: function(res) {\n                        console.log(res)\n                        db.collection('user').doc(that.data._id).get({\n                              success: function(res) {\n                                    app.userinfo = res.data;\n                                    app.openid = res.data._openid;\n                                    wx.hideLoading();\n                                    wx.showToast({\n                                          title: '修改成功',\n                                          icon: 'success'\n                                    })\n                              },\n                        })\n                  },\n                  fail() {\n                        wx.hideLoading();\n                        wx.showToast({\n                              title: '注册失败，请重新提交',\n                              icon: 'none',\n                        })\n                  }\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/edit/edit.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/edit/edit.wxml",
    "content": "<view class=\"top-bg\"></view>\n<view class=\"contain\">\n      <view class=\"card\">\n            <view class=\"title\">修改资料</view>\n            <picker bindchange=\"choose\" value=\"{{ids}}\" range=\"{{campus}}\" range-key=\"name\">\n                  <view class=\"campus\">\n                        <block wx:if=\"{{ids!==-1}}\">当前选择：{{campus[ids].name}}</block>\n                        <block wx:if=\"{{ids==-1}}\">请选择您所在校区</block>\n                        <image class=\"right\" src=\"/images/right.png\" />\n                  </view>\n            </picker>\n             <view class=\"contact\">\n                  <input bindinput=\"emInput\" value=\"{{email}}\" maxlength=\"30\" placeholder-class=\"pache\" placeholder=\"输入您的邮箱地址\" />\n            </view>\n            <view class=\"contact\">\n                  <input bindinput=\"wxInput\" value=\"{{wxnum}}\" maxlength=\"30\" placeholder-class=\"pache\" placeholder=\"输入您的微信号(选填)\" />\n            </view>\n            <view class=\"contact\">\n                  <input type=\"number\" bindinput=\"qqInput\" value=\"{{qqnum}}\" maxlength=\"20\" placeholder-class=\"pache\" placeholder=\"输入您的QQ号\" />\n            </view>\n      </view>\n       <van-divider />\n\t<van-checkbox value=\"{{checked}}\" checked-color=\"#fbbd08\" bind:change=\"onChange\">\n\t\t授权接收订单消息通知\n\t</van-checkbox>\n      <!--底部确认-->\n      <button class=\"confirm\" open-type='getUserInfo' bindgetuserinfo=\"getUserInfo\">提交修改</button>\n      <view class=\"shen_title\">\n            <image class=\"about\" src=\"/images/about.png\" />使用申明\n      </view>\n      <view class=\"des\">1. 请确保微信号、qq号和邮箱百分百有效，之后将用于发送实时订单通知。</view>\n      <view class=\"des\">2. 在未经您同意及确认之前，本程序不会将您的注册信息用于任何其它商业目的。</view>\n      <view class=\"des\">3. 本程序将对您所提供的资料进行严格的管理及保护，本程序将使用相应的技术，防止您的个人资料丢失、被盗用或遭篡改。</view>\n      <view class=\"des\">4. 请您放心使用！</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/edit/edit.wxss",
    "content": ".top-bg {\n      position: absolute;\n      top: 0rpx;\n      left: 0rpx;\n      width: 100%;\n      height: 460rpx;\n      background:#fbbd08;\n      background-repeat: no-repeat;\n      background-size: 100%;\n}\n\n.contain {\n      position: absolute;\n      top: 30rpx;\n      left: 0rpx;\n      width: 100%;\n      padding: 0rpx 40rpx 0rpx 40rpx;\n      box-sizing: border-box;\n}\n\n.card {\n      border-radius: 32rpx;\n      width: 100%;\n      background: #fff;\n      padding: 50rpx 60rpx;\n      box-sizing: border-box;\n      box-shadow: 0 0 20rpx #eee;\n}\n\n.title {\n      width: 100%;\n      text-align: center;\n      font-size: 40rpx;\n      font-weight: 600;\n      letter-spacing: 6rpx;\n}\n\n.phone {\n      justify-content: space-between;\n      margin-top: 45rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 20rpx 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      color: #8c9aa8;\n      border: none;\n}\n\n.phone::after {\n      border: none;\n}\n\n.campus {\n      margin-top: 24rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 20rpx 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      color: #8c9aa8;\n}\n\n.right {\n      width: 30rpx;\n      height: 30rpx;\n}\n\n.contact {\n      margin-top: 24rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      color: #8c9aa8;\n}\n\n.contact input {\n      width: 100%;\n      height: 100%;\n}\n\n.pache {\n      font-size: 32rpx;\n      color: #8c9aa8;\n}\n\n.confirm {\n      margin-top: 50rpx;\n      width: 100%;\n      height: 100rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background:linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);\n      border-radius: 60rpx;\n      color: #fff;\n      font-size: 40rpx;\n      letter-spacing: 4rpx;\n      box-shadow: 0 0 20rpx #eee;\n      border: none;\n}\n\n.confirm::after {\n      border: none;\n}\n\n.shen_title {\n      margin-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n      display: flex;\n      justify-content: flex-start;\n      align-items: center;\n}\n\n.about {\n      width: 32rpx;\n      height: 32rpx;\n      padding-right: 10rpx;\n}\n\n.des {\n      padding-left: 30rpx;\n      padding-top: 20rpx;\n      font-size: 26rpx;\n      color: #acacac;\n      letter-spacing: 2rpx;\n      line-height: 42rpx;\n}\n"
  },
  {
    "path": "miniprogram/pages/help/help.js",
    "content": "var app = getApp();\nvar db = wx.cloud.database();\n\nPage({\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            list: [{\n                        title: '小程序为什么会插入广告？',\n                        id: 0,\n                        des: ['对于本程序的正常运行，成本支出有以下几个方面', '1、程序部署上线，每年都需要微信认证300元。', '2、目前小程序每日CDN流量资费5元每天。', '3、云开发套餐，目前使用的是50元每月的套餐。', '小程序完全公益，不存在盈利目的，插入广告仅仅是为了本小程序的正常运行，望理解'],\n                        check: true,\n                  }, {\n                        title: '该程序收费吗？',\n                        id: 1,\n                        des: ['本程序是完全的公益项目，永久承诺不收取任何中介费，您可以随心所欲的发布自己的闲置物品和购买。如过您觉得本小程序不错，欢迎各位支持打赏我们，请我们喝阔落。'],\n                        check: false,\n                  }, {\n                        title: '该程序是做什么的？',\n                        id: 2,\n                        des: ['本程序主要是方便吉林大学珠海学院的同学发布自己不要了的二手书籍或者物品。',\n                              '如果您是其它学校的同学，可以访问【关于程序】页面，根据说明给自己学校也部署一个'\n                        ],\n                        check: false,\n                  }, {\n                        title: '本程序的通知形式？',\n                        id: 3,\n                        des: ['对于买家下单时，我们通过微信服务消息通知和邮件发送订单信息给卖家，通知与您联系完成交易', '当交易状态中途取消时，也会通过微信服务信息通知于您', '您也可以在订单详情页面通过买（卖）家留下的联系方式第一时间联系，这样更能提高效率'],\n                        check: false,\n                  },\n                  {\n                        title: '为什么要留下联系方式？',\n                        id: 4,\n                        des: ['本程序交易完全由交易双方沟通。', '除非程序出现问题导致交易故障，平台不参与任何交易'],\n                        check: false,\n                  }, {\n                        title: '小程序发现异常（bug）怎么办？',\n                        id: 5,\n                        des: ['点击客服加群或关注公众号反馈，我们会有专人为您服务。您还可以向我们提出意见或者建议，我们会争取将小程序做得更好！！！希望我们能够一起打造一个完美的二手交易平台。'],\n                        check: false,\n                  },\n            ]\n      },\n      onReady() {},\n\n      show(e) {\n            var that = this;\n            let ite = e.currentTarget.dataset.show;\n            let list = that.data.list;\n            if (!ite.check) {\n                  list[ite.id].check = true;\n            } else {\n                  list[ite.id].check = false;\n            }\n            that.setData({\n                  list: list\n            })\n      },\n      //跳转页面\n      go(e) {\n            wx.navigateTo({\n                  url: e.currentTarget.dataset.go\n            })\n      },\n      onLoad() {\n\n      },\n\n})"
  },
  {
    "path": "miniprogram/pages/help/help.json",
    "content": "{\n      \"navigationBarTitleText\": \"使用说明\",\n      \"navigationBarBackgroundColor\": \"#ffffff\",\n      \"navigationBarTextStyle\": \"black\"\n}"
  },
  {
    "path": "miniprogram/pages/help/help.wxml",
    "content": "<view class=\"contain\" >\n      <view class=\"contains\" wx:for=\"{{list}}\" wx:key=\"id\">\n            <view class=\"top\" bindtap=\"show\" data-show=\"{{item}}\">\n                  <view class=\"title\">{{item.id+1}}.{{item.title}}</view>\n                  <image wx:if=\"{{item.check}}\" class=\"ico\" src=\"/images/on.png\"></image>\n                  <image wx:if=\"{{!item.check}}\" class=\"ico\" src=\"/images/off.png\"></image>\n            </view>\n            <view class=\"descontain\" hidden=\"{{!item.check}}\">\n                  <block wx:for=\"{{item.des}}\" wx:key=\"*this\">\n                        <view class=\"destext\">{{item}} </view>\n                  </block>\n            </view>\n      </view>\n</view>\n<view style=\"height:100rpx;\"></view>\n<view class=\"bottom\">\n      <button bindtap=\"go\" data-go=\"/pages/kefu/kefu\">\n            <image style=\"width:40rpx;height:40rpx;\" src=\"/images/kefu.png\" />\n            <view class=\"btxt\">联系客服</view>\n      </button>\n      <view class=\"center\"></view>\n      <button bindtap=\"go\" data-go=\"/pages/about/about\">\n            <image style=\"width:40rpx;height:40rpx;\" src=\"/images/good.png\" />\n            <view class=\"btxt\">去打赏</view>\n      </button>\n</view>"
  },
  {
    "path": "miniprogram/pages/help/help.wxss",
    "content": ".contain {\n     width: 100%;\n     padding: 30rpx 30rpx;\n     box-sizing: border-box;\n}\n\n.top {\n     display: flex;\n     justify-content: space-between;\n     align-items: center;\n     height: 50rpx;\n     margin-top: 20rpx;\n}\n\n.title {\n     font-size: 32rpx;\n     font-weight: 600;\n     letter-spacing: 2rpx;\n     width: calc( 100% - 60rpx);\n     line-height: 50rpx;\n}\n\n.ico {\n     width: 50rpx;\n     height: 50rpx;\n}\n\n.descontain {\n     margin-top: 30rpx;\n     background: #f8f8f8;\n     border-radius: 15rpx;\n     width: 100%;\n     padding: 14rpx 24rpx 24rpx 24rpx;\n     box-sizing: border-box;\n}\n\n.destext {\n     padding-top: 10rpx;\n     font-size: 29rpx;\n     line-height: 44rpx;\n     color: #a7adb8;\n     letter-spacing: 1rpx;\n}\n\n.contains {\n     width: 100%;\n     padding-bottom: 30rpx;\n     border-bottom: 1rpx solid #f8f8f8;\n}\n\n.bottom {\n     left: 0rpx;\n     bottom: 0rpx;\n     right: 0rpx;\n     position: fixed;\n     align-items: center;\n     display: flex;\n     width: 100%;\n     height: 100rpx;\n     box-shadow: 0 0 24rpx rgba(0, 0, 0, 0.212);\n}\n\nbutton {\n     width: 49%;\n     height: 100%;\n     background: #fff;\n     display: flex;\n     justify-content: center;\n     align-items: center;\n     border: none;\n}\n\nbutton::after {\n     border: none;\n}\n\n.btxt {\n     padding-left: 20rpx;\n     font-size: 34rpx;\n     letter-spacing: 2rpx;\n}\n\n.center {\n     font-weight: 2%;\n     border-right: 2rpx solid #a7adb8;\n     height: 32rpx;\n}\n"
  },
  {
    "path": "miniprogram/pages/index/index.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../config.js\");\nconst _ = db.command;\nPage({\n      data: {\n            college: JSON.parse(config.data).college,\n            collegeCur: -2,\n            showList: false,\n            scrollTop: 0,\n            nomore: false,\n            adShow: false,\n            list: [],\n            banner: '',\n            indexTip: '',\n            openid: app.openid\n      },\n      // 用户点击右上角分享给好友,要先在分享好友这里设置menus的两个参数,才可以分享朋友圈\n      onShareAppMessage: function () {\n            wx.showShareMenu({\n                  withShareTicket: true,\n                  menus: ['shareAppMessage', 'shareTimeline']\n            })\n      },\n      //用户点击右上角分享朋友圈\n      onShareTimeline: function () {\n            return {\n                  title: '',\n                  query: {\n                        key: value\n                  },\n                  imageUrl: ''\n            }\n      },\n      onLoad() {\n            this.listkind();\n            this.getbanner();   \n            \n      },\n\n      //监测屏幕滚动\n      onPageScroll: function (e) {\n            this.setData({\n                  scrollTop: parseInt((e.scrollTop) * wx.getSystemInfoSync().pixelRatio)\n            })\n      },\n    \n        \n      //获取上次布局记忆\n      listkind() {\n            let that = this;\n            wx.getStorage({\n                  key: 'iscard',\n                  success: function (res) {\n                        that.setData({\n                              iscard: res.data\n                        })\n                  },\n                  fail() {\n                        that.setData({\n                              iscard: true,\n                        })\n                  }\n            })\n      },\n      //布局方式选择\n      changeCard() {\n            let that = this;\n            if (that.data.iscard) {\n                  that.setData({\n                        iscard: false\n                  })\n                  wx.setStorage({\n                        key: 'iscard',\n                        data: false,\n                  })\n            } else {\n                  that.setData({\n                        iscard: true\n                  })\n                  wx.setStorage({\n                        key: 'iscard',\n                        data: true,\n                  })\n            }\n      },\n      //跳转搜索\n      search() {\n            wx.navigateTo({\n                  url: '/pages/search/search',\n            })\n      },\n      //类别选择\n      collegeSelect(e) {\n            this.setData({\n                  collegeCur: e.currentTarget.dataset.id - 1,\n                  scrollLeft: (e.currentTarget.dataset.id - 3) * 100,\n                  showList: false,\n            })\n            this.getList();\n      },\n      //选择全部\n      selectAll() {\n            this.setData({\n                  collegeCur: -2,\n                  scrollLeft: -200,\n                  showList: false,\n            })\n            this.getList();\n      },\n      //展示列表小面板\n      showlist() {\n            let that = this;\n            if (that.data.showList) {\n                  that.setData({\n                        showList: false,\n                  })\n            } else {\n                  that.setData({\n                        showList: true,\n                  })\n            }\n      },\n      getList() {\n            console.log(\"调用了getlist\")\n            let that = this;\n            if (that.data.collegeCur == -2) {\n                  var collegeid = _.neq(-2); //除-2之外所有\n            } else {\n                  var collegeid = that.data.collegeCur + '' //小程序搜索必须对应格式\n            }\n            db.collection('publish').where({\n                  status: 0,\n                  dura: _.gt(new Date().getTime()),\n                  collegeid: collegeid\n            }).orderBy('creat', 'desc').limit(20).get({\n                  success: function (res) {\n                        wx.stopPullDownRefresh(); //暂停刷新动作\n                        if (res.data.length == 0) {\n                              that.setData({\n                                    nomore: true,\n                                    list: [],\n                              })\n                              return false;\n                        }\n                        if (res.data.length < 20) {\n                              that.setData({\n                                    nomore: true,\n                                    page: 0,\n                                    list: res.data,\n                              })\n                        } else {\n                              that.setData({\n                                    page: 0,\n                                    list: res.data,\n                                    nomore: false,\n                              })\n                        }\n                  }\n            })\n      },\n      more() {\n            let that = this;\n            if (that.data.nomore || that.data.list.length < 20) {\n                  return false\n            }\n            let page = that.data.page + 1;\n            if (that.data.collegeCur == -2) {\n                  var collegeid = _.neq(-2); //除-2之外所有\n            } else {\n                  var collegeid = that.data.collegeCur + '' //小程序搜索必须对应格式\n            }\n            db.collection('publish').where({\n                  status: 0,\n                  dura: _.gt(new Date().getTime()),\n                  collegeid: collegeid\n            }).orderBy('creat', 'desc').skip(page * 20).limit(20).get({\n                  success: function (res) {\n                        if (res.data.length == 0) {\n                              that.setData({\n                                    nomore: true\n                              })\n                              return false;\n                        }\n                        if (res.data.length < 20) {\n                              that.setData({\n                                    nomore: true\n                              })\n                        }\n                        that.setData({\n                              page: page,\n                              list: that.data.list.concat(res.data)\n                        })\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n      onReachBottom() {\n            this.more();\n      },\n      //下拉刷新\n      onPullDownRefresh() {\n            this.getList();\n      },\n      gotop() {\n            wx.pageScrollTo({\n                  scrollTop: 0\n            })\n      },\n      //跳转详情\n      detail(e) {\n            let that = this;\n            wx.navigateTo({\n                  url: '/pages/detail/detail?scene=' + e.currentTarget.dataset.id,\n            })\n      },\n      //获取轮播\n      getbanner() {\n            let that = this;\n            db.collection('banner').where({}).get({\n                  success: function (res) {\n                        that.setData({\n                              banner: res.data[0].list\n                        })\n                  }\n            })\n      },\n      //跳转轮播链接\n      goweb(e) {\n            console.log(e.currentTarget.dataset.web.url)\n            wx.navigateTo({\n                  url: '/pages/web/web?url=' + e.currentTarget.dataset.web.url,\n            })\n      },\n      onShareAppMessage() {\n            return {\n                  title: JSON.parse(config.data).share_title,\n                  imageUrl: JSON.parse(config.data).share_img,\n                  path: '/pages/start/start'\n            }\n      },\n\n      onShow() {\n\n            this.getList(),\n                  this.getTip()\n      },\n\n      getTip() {\n            let that = this\n            db.collection('Tip').where({}).get({\n                  success: function (res) {\n                        that.setData({\n                              indexTip: res.data[0].tip\n                        })\n                        console.log(\"zhelishixiaoxi\" + res)\n                  },\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/index/index.json",
    "content": "{\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "miniprogram/pages/index/index.wxml",
    "content": "<wxs src=\"../../common.wxs\" module=\"morejs\" />\n\n<view class=\"top_box\">\n      <view class=\"search_box\" bindtap=\"search\">\n            <image class=\"search_ico\" src=\"/images/search.png\"></image>\n            <view class=\"search_text\">搜索想要的物品，例如：杯子</view>\n      </view>\n      <image bindtap=\"changeCard\" class=\"top_list\" src=\"{{iscard?'/images/list.png':'/images/card.png'}}\"></image>\n</view>\n<van-notice-bar left-icon=\"volume-o\" text=\"{{indexTip}}\" speed=\"50\" />\n<swiper class=\"banner\" indicator-dots autoplay indicator-active-color=\"#fbbd08\" circular>\n      <block wx:for=\"{{banner}}\" wx:key=\"id\">\n            <swiper-item>\n                  <image lazy-load src=\"{{item.img}}\" bindtap=\"goweb\" data-web=\"{{item}}\" class=\"banner_image\" mode=\"aspectFill\" />\n            </swiper-item>\n      </block>\n</swiper>\n<view class=\"space\"></view>\n<ad unit-id=\"adunit-1cc91e12e4e9e519\" ad-type=\"grid\" grid-opacity=\"0.8\" grid-count=\"5\" ad-theme=\"white\"></ad>\n<official-account></official-account>\n<!--分类导航-->\n<view class=\"{{scrollTop>310?'nofixed':''}}\">\n</view>\n<view class=\"kind_contain {{scrollTop>310?'fixed':''}}\">\n      <view class=\"nav-item {{-2==collegeCur?'tab-on':''}}\" bindtap=\"selectAll\">\n            <view class=\"nav-text\">全部</view>\n      </view>\n      <scroll-view scroll-x class=\"nav\" scroll-with-animation scroll-left=\"{{scrollLeft}}rpx\">\n            <view class=\"nav-item\" wx:for=\"{{college}}\" wx:key=\"id\" bindtap=\"collegeSelect\" data-id=\"{{index}}\">\n                  <view class=\"nav-text {{index==collegeCur+1?'tab-on':''}}\">{{item.name}}</view>\n            </view>\n      </scroll-view>\n      <view class=\"kind_img\" bindtap=\"showlist\">\n            <image lazy-load src=\"{{showList?'/images/l_down.png':'/images/l_right.png'}}\" />\n      </view>\n      <view class=\"kindlist_box\" wx:if=\"{{showList}}\">\n            <view class=\"kindlist_card\">\n                  <view class=\"list_grid\">\n                        <block wx:for=\"{{college}}\" wx:key=\"id\">\n                              <view class=\"list_one\" bindtap=\"collegeSelect\" data-id=\"{{index}}\" data-class=\"{{item.id}}\">\n                                    <view class=\"{{index==collegeCur+1?'list-on':''}}\">{{item.name}}</view>\n                              </view>\n                        </block>\n                  </view>\n            </view>\n      </view>\n</view>\n<!--宫格显示-->\n<view hidden=\"{{!iscard}}\">\n      <view class=\"card_grid\" wx:if=\"{{list.length>0}}\">\n            <block wx:for=\"{{list}}\" wx:key=\"_id\">\n                  <view class=\"card_one\" bindtap=\"detail\" data-id=\"{{item._id}}\">\n                        <image lazy-load class=\"card_poster\" src=\"{{item.bookinfo.imgs[0]}}\"></image>\n                        <view class=\"card_title text-cut\">{{item.bookinfo.good}}\n                        </view>\n                        <view class=\"card_between\">\n                              <view class=\"card_price\">￥{{item.price}}元</view>\n                              <image lazy-load class=\"card_buy\" src=\"/images/buy.png\"></image>\n                        </view>\n                  </view>\n            </block>\n      </view>\n</view>\n<!--列表显示-->\n<view hidden=\"{{iscard}}\">\n      <block wx:if=\"{{list.length>0}}\">\n            <block wx:for=\"{{list}}\" wx:key=\"_id\">\n                  <view class=\"list_box\" bindtap=\"detail\" data-id=\"{{item._id}}\">\n                        <image lazy-load class=\"list_poster\" src=\"{{item.bookinfo.imgs[0]}}\"></image>\n                        <view class=\"list_content\">\n                              <view class=\"list_word\">\n                                    <view class=\"list_title text-cut\">{{item.bookinfo.good}}\n                                    </view>\n                              </view>\n                              <view class=\"list_between\">\n                                    <view class=\"list_price\">￥{{item.price}}元</view>\n                                    <view class=\"list_time\">{{morejs.timelog(item.creat )}}发布\n                                    </view>\n                              </view>\n                        </view>\n                  </view>\n            </block>\n      </block>\n</view>\n<!--无内容显示-->\n<view class=\"nocontent\" wx:if=\"{{list.length==0}}\">\n      <image lazy-load src=\"/images/blank.png\"></image>\n      <view class=\"blank_text\">这里空空如也~</view>\n</view>\n\n<block wx:if=\"{{list.length>10}}\">\n      <import src=\"/common.wxml\" />\n      <template is=\"loadmore\" data=\"{{nomore}}\" />\n</block>\n<van-transition show=\"{{ scrollTop>500 }}\" custom-class=\"block\" duration=\"600\">\n      <view class=\"totop\" bindtap=\"gotop\">\n            <image  lazy-load src=\"/images/top.png\"></image>\n      </view>\n</van-transition>\n<!--首次进入提示收藏小程序-->\n<tips />\n<welcome />"
  },
  {
    "path": "miniprogram/pages/index/index.wxss",
    "content": ".top_box {\n      width: 100%;\n      background: #fbbd08;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding: 20rpx 30rpx;\n      box-sizing: border-box;\n}\n\n.top_list {\n      width: 50rpx;\n      height: 50rpx;\n}\n\n.search_box {\n      width: 620rpx;\n      height: 66rpx;\n      border-radius: 33rpx;\n      background: #fff;\n      display: flex;\n      align-items: center;\n}\n\n.search_ico {\n      padding-left: 30rpx;\n      width: 32rpx;\n      height: 32rpx;\n}\n\n.search_text {\n      padding-left: 10rpx;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: rgb(167, 167, 167);\n}\n\n.banner {\n      width: 100%;\n      display: flex;\n      box-sizing: border-box;\n      height: 240rpx;\n}\n/* \n.banner_image {\n      width: auto;\n      display: flex;\n      box-sizing: border-box;\n      height: 240rpx;\n} */\n.banner_image {\n      width: 100%;\n      padding: 16rpx 16rpx 12rpx 16rpx;\n      display: flex;\n      box-sizing: border-box;\n      height: inherit;\n}\n\n::-webkit-scrollbar {\n      width: 0;\n      height: 0;\n      color: transparent;\n}\n\n.space {\n      width: 100%;\n      height: 15rpx;\n      background: #eee;\n}\n\n.kind_contain {\n      width: 100%;\n      height: 90rpx;\n      display: flex;\n      border-bottom: 1rpx solid #eee;\n      background: #fff;\n      align-items: center;\n      position: relative;\n}\n\n.nav {\n      width: calc(100% - 180rpx);\n      height: 100%;\n      white-space: nowrap;\n      display: flex;\n      box-sizing: border-box;\n}\n\n.nav-item {\n      width: 140rpx;\n      height: 100%;\n      display: inline-block;\n      font-size: 32rpx;\n}\n\n.nav-text {\n      width: 100%;\n      height: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      letter-spacing: 4rpx;\n      box-sizing: border-box;\n}\n\n.tab-on {\n      color: #fbbd08;\n      font-size: 32rpx !important;\n      font-weight: 600;\n      border-bottom: 4rpx solid #70f3ff !important;\n}\n\n.kind_img {\n      width: 60rpx;\n      height: 60rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n}\n\n.kind_img image {\n      width: 32rpx;\n      height: 32rpx;\n}\n\n.kindlist_box {\n      position: absolute;\n      width: 100%;\n      top: 90rpx;\n      left: 0rpx;\n      border-bottom: 1rpx solid #eee;\n}\n\n.kindlist_card {\n      padding: 20rpx 20rpx 0 20rpx;\n      width: 100%;\n      display: flex;\n      box-sizing: border-box;\n      background: #fff;\n}\n\n.list_grid {\n      width: 100%;\n      display: flex;\n      flex-wrap: wrap;\n}\n\n.list_one {\n      width: 25%;\n      padding: 0 10rpx 20rpx 10rpx;\n      display: flex;\n      box-sizing: border-box;\n}\n\n.list_one view {\n      width: 100%;\n      height: 60rpx;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      border: 1rpx solid #eee;\n      border-radius: 10rpx;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n}\n\n.list-on {\n      background: #fbbd08;\n      color: #fff;\n      border: none !important;\n}\n\n.card_grid {\n      width: 100%;\n      display: flex;\n      box-sizing: border-box;\n      padding: 20rpx 0rpx;\n      flex-wrap: wrap;\n}\n\n.card_one {\n      margin-top: 20rpx;\n      width: 50%;\n      padding: 20rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n      align-items: center;\n}\n\n.card_poster {\n      width: 260rpx;\n      height: 260rpx;\n}\n\n.card_title {\n      width: 100%;\n      font-size: 30rpx;\n      letter-spacing: 3rpx;\n      margin-top: 20rpx;\n      line-height: 45rpx;\n}\n\n.card_author {\n      width: 100%;\n      font-size: 26rpx;\n      letter-spacing: 3rpx;\n      line-height: 40rpx;\n      color: rgb(129, 129, 129);\n}\n\n.card_between {\n      margin-top: 5rpx;\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-end;\n}\n\n.card_price {\n      font-size: 33rpx;\n      color: rgb(255, 0, 0);\n}\n\n.card_buy {\n      padding-right: 10rpx;\n      width: 40rpx;\n      height: 40rpx;\n}\n\n.list_box {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      padding: 20rpx;\n      box-sizing: border-box;\n      margin-top: 10rpx;\n}\n\n.list_poster {\n      width: 230rpx;\n      height: 230rpx;\n}\n\n.list_content {\n      height: 230rpx;\n      width: calc(100% - 230rpx);\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      padding: 0 10rpx;\n      box-sizing: border-box;\n}\n\n.list_word {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      box-sizing: border-box;\n}\n\n.list_title {\n      width: 100%;\n      font-size: 32rpx;\n      letter-spacing: 3rpx;\n      line-height: 45rpx;\n}\n\n.list_author {\n      padding-top: 10rpx;\n      width: 100%;\n      font-size: 27rpx;\n      letter-spacing: 3rpx;\n      line-height: 40rpx;\n      color: rgb(129, 129, 129);\n}\n\n.list_between {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-end;\n      border-bottom: 1rpx solid #eee;\n      padding-bottom: 10rpx;\n}\n\n.list_price {\n      font-size: 36rpx;\n      color: rgb(255, 0, 0);\n}\n\n.list_time {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: rgb(129, 129, 129);\n}\n\n.nocontent {\n      width: 100%;\n      height: calc(100% - 400rpx);\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.nocontent image {\n      padding-left: 80rpx;\n      width: 340rpx;\n      height: 272rpx;\n}\n\n.blank_text {\n      padding-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n      color: #c6c6c8;\n}\n\n.fixed {\n      position: fixed;\n      left: 0rpx;\n      top: 0rpx;\n}\n\n.nofixed {\n      height: 91rpx;\n      width: 100%;\n      background: #fff;\n}"
  },
  {
    "path": "miniprogram/pages/kefu/kefu.js",
    "content": "var app = getApp();\nconst config = require(\"../../config.js\");\n\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            weixin: JSON.parse(config.data).kefu.weixin,\n            qq: JSON.parse(config.data).kefu.qq,\n            gzh: JSON.parse(config.data).kefu.gzh,\n            phone: JSON.parse(config.data).kefu.phone,\n            banner: \"/images/kefu.jpg\",\n           img:['https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/gzh/%E6%89%AB%E7%A0%81_%E6%90%9C%E7%B4%A2%E8%81%94%E5%90%88%E4%BC%A0%E6%92%AD%E6%A0%B7%E5%BC%8F-%E7%99%BD%E8%89%B2%E7%89%88.png?sign=4419b51be1d0c768dbbc95273f956fec&t=1597217797',]\n      },\n      onLoad() {\n\n      },\n\n      //复制\n      copy(e) {\n            wx.setClipboardData({\n                  data: e.currentTarget.dataset.copy,\n                  success: res => {\n                        wx.showToast({\n                              title: '复制' + e.currentTarget.dataset.name+'成功',\n                              icon: 'success',\n                              duration: 1000,\n                        })\n                  }\n            })\n      },\n      //预览图片\n      preview(e) {\n            wx.previewImage({\n                  current: 'current', // 当前显示图片的http链接\n                  urls:this.data.img// 需要预览的图片http链接列表\n                })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/kefu/kefu.json",
    "content": "{\n      \"navigationBarTitleText\": \"联系客服\",\n      \"navigationBarBackgroundColor\": \"#ffffff\",\n      \"navigationBarTextStyle\": \"black\"\n}"
  },
  {
    "path": "miniprogram/pages/kefu/kefu.wxml",
    "content": "<view class=\"contain\">\n      <view style=\"height:20rpx;\"></view>\n      <!--顶部图-->\n      <image src=\"{{banner}}\" class=\"slide-image\" />\n      <!--在线咨询-->\n      <view class=\"card\">\n            <view class=\"card1\">\n                  <image class=\"wechatimg\" src=\"/images/online.png\" />\n            </view>\n            <view class=\"borderbox\">\n                  <view class=\"border\"></view>\n            </view>\n            <view class=\"centercontain\">\n                  <view class=\"name\">在线咨询</view>\n                  <view class=\"des\">点击即可在线咨询客服</view>\n            </view>\n            <view class=\"rightico\">\n                        <image class=\"rightimg\" src=\"/images/right.png\" />\n            </view>\n            <button open-type=\"contact\"></button>\n      </view>\n      <!--微信联系-->\n      <view class=\"card\" bindtap=\"copy\" data-copy=\"{{weixin}}\" data-name=\"微信\">\n            <view class=\"card1\">\n                  <image class=\"wechatimg\" src=\"/images/weixin.png\" />\n            </view>\n            <view class=\"borderbox\">\n                  <view class=\"border\"></view>\n            </view>\n            <view class=\"centercontain\">\n                  <view class=\"name\">官方微信</view>\n                  <view class=\"des\">点击即可复制官方微信</view>\n            </view>\n            <view class=\"rightico\">\n                  <image class=\"rightimg\" src=\"/images/right.png\" />\n            </view>\n      </view>\n      <!--QQ联系-->\n      <view class=\"card\" bindtap=\"copy\" data-copy=\"{{qq}}\" data-name=\"QQ\">\n            <view class=\"card1\">\n                  <image class=\"wechatimg\" src=\"/images/qq.png\" />\n            </view>\n            <view class=\"borderbox\">\n                  <view class=\"border\"></view>\n            </view>\n            <view class=\"centercontain\">\n                  <view class=\"name\">QQ联系</view>\n                  <view class=\"des\">点击即可复制QQ群</view>\n            </view>\n            <view class=\"rightico\">\n                  <image class=\"rightimg\" src=\"/images/right.png\" />\n            </view>\n      </view>\n     \n      <!--公众号-->\n      <view class=\"card\" bindtap=\"preview\" data-link=\"{{gzh}}\">\n            <view class=\"card1\">\n                  <image class=\"wechatimg\" src=\"/images/gzh.png\" />\n            </view>\n            <view class=\"borderbox\">\n                  <view class=\"border\"></view>\n            </view>\n            <view class=\"centercontain\">\n                  <view class=\"name\">官方公众号</view>\n                  <view class=\"des\">识别二维码关注官方公众号</view>\n            </view>\n            <view class=\"rightico\">\n                  <image class=\"rightimg\" src=\"/images/right.png\" />\n            </view>\n      </view>\n</view>"
  },
  {
    "path": "miniprogram/pages/kefu/kefu.wxss",
    "content": ".contain{\n    width: 100%;\n    padding: 0 46rpx;\n    box-sizing: border-box;\n}\n.slide-image{\n    width: 100%;\n    height: 310rpx;\n    border-radius: 20rpx;\n}\n.card{\n    margin-top: 40rpx;\n    border-radius: 20rpx;\n    width: 100%;\n    height: 162rpx;\n    box-sizing: border-box;\n    box-shadow: 0 0 20rpx #eee;\n    display: flex;\n    position: relative;\n}\n.card button{\n      width: 100%;\n      height: 100%;\n      position: absolute;\n      left: 0rpx;\n      top: 0rpx;\n      opacity: 0.01;\n}\n.card1{\n    width: 140rpx;\n    height: 100%;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n}\n.wechatimg{\n    width: 90rpx;\n    height:90rpx;\n}\n.borderbox{\n    width: 10rpx;\n    height: 100%;\n    display: flex;\n    align-items: center;\n}\n\n.border{\n    width: 4rpx;\n    height: 82rpx;\n    border-left: 3rpx solid #eee;\n    box-sizing: border-box;\n}\n\n.centercontain{\n    width: 420rpx;\n    height: 100%;\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n     padding-left: 20rpx;\n}\n.name{\n    font-size: 32rpx;\n    font-weight: 600;\n    letter-spacing: 2rpx;\n}\n.des{\n    padding-top: 10rpx;\n    font-size: 28rpx;\n    color: rgb(161, 161, 161);\n     letter-spacing: 2rpx;\n}\n.rightico{\n    width: 40rpx;\n    height: 100%;\n     display: flex;\n    align-items: center;\n    justify-content: center;\n}\n\n.rightimg{\n    width: 30rpx;\n    height: 30rpx;\n}"
  },
  {
    "path": "miniprogram/pages/login/login.js",
    "content": "const db = wx.cloud.database();\nconst app = getApp();\nconst config = require(\"../../config.js\");\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            ids: -1,\n            wxnum: '',\n            qqnum: '',\n            email: '',\n            checked:false,\n            campus: JSON.parse(config.data).campus,\n      },\n\n      onChange(event) {\n            if(event.detail==true){\n                  wx.requestSubscribeMessage({\n                        tmplIds: ['6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0','XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q'], //这里填入我们生成的模板id\n                        success(res) {          \n                              console.log('授权成功', res)\n                        },\n                        fail(res) {\n                              console.log('授权失败', res)\n                        }\n                  })\n            }\n            this.setData({\n              checked: event.detail,\n            });\n          },\n\n      choose(e) {\n            let that = this;\n            that.setData({\n                  ids: e.detail.value\n            })\n            //下面这种办法无法修改页面数据\n            /* this.data.ids = e.detail.value;*/\n      },\n      wxInput(e) {\n            this.data.wxnum = e.detail.value;\n      },\n      qqInput(e) {\n            this.data.qqnum = e.detail.value;\n      },\n      emInput(e) {\n            this.data.email = e.detail.value;\n      },\n      getUserInfo(e) {\n            let that = this;\n            console.log(e);\n            let test = e.detail.errMsg.indexOf(\"ok\");\n            if (test == '-1') {\n                  wx.showToast({\n                        title: '请授权后方可使用',\n                        icon: 'none',\n                        duration: 2000\n                  });\n            } else {\n                  that.setData({\n                        userInfo: e.detail.userInfo\n                  })\n                  that.check();\n            }\n         \n      },\n      //校检\n      check() {\n            let that = this;\n           \n            //校检校区\n            let ids = that.data.ids;\n            let campus = that.data.campus;\n            if (ids == -1) {\n                  wx.showToast({\n                        title: '请先获取您的园区',\n                        icon: 'none',\n                        duration: 2000\n                  });\n            }\n             // 检验授权选项\n            let event =that.data.checked;\n            if(event==false){\n                  wx.showToast({\n                        title: '请授权订单提醒',\n                        icon: 'none',\n                        duration: 2000\n                  });\n                  return false;\n            }\n            //校检邮箱\n            let email = that.data.email;\n            if (!(/^\\w+((.\\w+)|(-\\w+))@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+).[A-Za-z0-9]+$/.test(email))) {\n                  wx.showToast({\n                        title: '请输入常用邮箱',\n                        icon: 'none',\n                        duration: 2000\n                  });\n                  return false;\n            }\n            //校检QQ号\n            let qqnum = that.data.qqnum;\n            if (qqnum !== '') {\n                  if (!(/^\\s*[.0-9]{5,11}\\s*$/.test(qqnum))) {\n                        wx.showToast({\n                              title: '请输入正确QQ号',\n                              icon: 'none',\n                              duration: 2000\n                        });\n                        return false;\n                  }\n            }\n            //校检微信号\n            let wxnum = that.data.wxnum;\n            if (wxnum !== '') {\n                  if (!(/^[a-zA-Z]([-_a-zA-Z0-9]{5,19})+$/.test(wxnum))) {\n                        wx.showToast({\n                              title: '请输入正确微信号',\n                              icon: 'none',\n                              duration: 2000\n                        });\n                        return false;\n                  }\n            }\n          \n            wx.showLoading({\n                  title: '正在提交',\n            })\n            db.collection('user').add({\n                  data: {\n                        phone: that.data.phone,\n                        campus: that.data.campus[that.data.ids],\n                        qqnum: that.data.qqnum,\n                        email: that.data.email,\n                        wxnum: that.data.wxnum,\n                        stamp: new Date().getTime(),\n                        info: that.data.userInfo,\n                        useful: true,\n                        parse: 0,\n                  },\n                  success: function(res) {\n                        console.log(res)\n                        db.collection('user').doc(res._id).get({\n                              success: function(res) {\n                                    app.userinfo = res.data;\n                                    app.openid = res.data._openid;\n                                    wx.navigateBack({})\n                              },\n                        })\n                  },\n                  fail() {\n                        wx.hideLoading();\n                        wx.showToast({\n                              title: '注册失败，请重新提交',\n                              icon: 'none',\n                        })\n                  }\n            })\n      },\n        //获取授权的点击事件\n        shouquan() {\n            wx.requestSubscribeMessage({\n                  tmplIds: ['6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0','XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q'], //这里填入我们生成的模板id\n                  success(res) {          \n                        console.log('授权成功', res)\n                  },\n                  fail(res) {\n                        console.log('授权失败', res)\n                  }\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/login/login.json",
    "content": "{\n\"navigationStyle\":\"custom\"\n}"
  },
  {
    "path": "miniprogram/pages/login/login.wxml",
    "content": "<view class=\"top-bg\"></view>\n<view class=\"contain\">\n\t<view class=\"card\">\n\t\t<view class=\"title\">登记注册</view>\n\t\t<picker bindchange=\"choose\" value=\"{{ids}}\" range=\"{{campus}}\" range-key=\"name\">\n\t\t\t<view class=\"campus\">\n\t\t\t\t<block wx:if=\"{{ids!==-1}}\">当前选择：{{campus[ids].name}}</block>\n\t\t\t\t<block wx:if=\"{{ids==-1}}\">请选择您所在园区</block>\n\t\t\t\t<image class=\"right\" src=\"/images/right.png\" />\n\t\t\t</view>\n\t\t</picker>\n\t\t<view class=\"contact\">\n\t\t\t<input bindinput=\"emInput\" value=\"{{email}}\" maxlength=\"30\" placeholder-class=\"pache\" placeholder=\"输入您的邮箱地址\" />\n\t\t</view>\n\t\t<view class=\"contact\">\n\t\t\t<input bindinput=\"wxInput\" value=\"{{wxnum}}\" maxlength=\"30\" placeholder-class=\"pache\" placeholder=\"输入您的微信号(选填)\" />\n\t\t</view>\n\t\t<view class=\"contact\">\n\t\t\t<input type=\"number\" bindinput=\"qqInput\" value=\"{{qqnum}}\" maxlength=\"20\" placeholder-class=\"pache\" placeholder=\"输入您的QQ号\" />\n\t\t</view>\n\t</view>\n      <van-divider />\n\t<van-checkbox value=\"{{ checked }}\" checked-color=\"#fbbd08\" bind:change=\"onChange\">\n\t\t授权接收订单消息通知\n\t</van-checkbox>\n\t<!--底部确认-->\n\t<button class=\"confirm\" open-type='getUserInfo' bindgetuserinfo=\"getUserInfo\">注册并登录</button>\n\t<view class=\"shen_title\">\n\t\t<image class=\"about\" src=\"/images/about.png\" />使用申明\n\t</view>\n\t<view class=\"des\">1. 请确保微信号、qq号和邮箱百分百有效，之后将用于发送实时订单通知。</view>\n\t<view class=\"des\">2. 在未经您同意及确认之前，本程序不会将您的注册信息用于任何其它商业目的。</view>\n\t<view class=\"des\">3. 本程序将对您所提供的资料进行严格的管理及保护，本程序将使用相应的技术，防止您的个人资料丢失、被盗用或遭篡改。</view>\n\t<view class=\"des\">4. 请您放心使用！</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/login/login.wxss",
    "content": ".top-bg {\n      position: absolute;\n      top: 0rpx;\n      left: 0rpx;\n      width: 100%;\n      height: 460rpx;\n      background-repeat: no-repeat;\n      background-size: 100%;\n}\n\n.contain {\n      position: absolute;\n      top: 176rpx;\n      left: 0rpx;\n      width: 100%;\n      padding: 0rpx 40rpx 0rpx 40rpx;\n      box-sizing: border-box;\n}\n\n.card {\n      border-radius: 32rpx;\n      width: 100%;\n      background: #fff;\n      padding: 50rpx 60rpx;\n      box-sizing: border-box;\n      box-shadow: 0 0 20rpx #eee;\n}\n\n.title {\n      width: 100%;\n      text-align: center;\n      font-size: 40rpx;\n      font-weight: 600;\n      letter-spacing: 6rpx;\n}\n\n.phone {\n      justify-content: space-between;\n      margin-top: 45rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 20rpx 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      color: #8c9aa8;\n      border: none;\n}\n\n.phone::after {\n      border: none;\n}\n\n.campus {\n      margin-top: 24rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 20rpx 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      color: #8c9aa8;\n}\n\n.right {\n      width: 30rpx;\n      height: 30rpx;\n}\n\n.contact {\n      margin-top: 24rpx;\n      width: 100%;\n      height: 92rpx;\n      background: #f1f3f8;\n      border-radius: 10rpx;\n      text-align: left;\n      padding: 0 36rpx;\n      box-sizing: border-box;\n      font-size: 32rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      color: #8c9aa8;\n}\n\n.contact input {\n      width: 100%;\n      height: 100%;\n}\n\n.pache {\n      font-size: 32rpx;\n      color: #8c9aa8;\n}\n\n.confirm {\n      margin-top: 50rpx;\n      width: 100%;\n      height: 100rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%);\n      border-radius: 60rpx;\n      color: #fff;\n      font-size: 40rpx;\n      letter-spacing: 4rpx;\n      box-shadow: 0 0 20rpx #eee;\n      border: none;\n}\n\n.confirm::after {\n      border: none;\n}\n.shen_title{\n      margin-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n      display: flex;\n      justify-content: flex-start;\n      align-items: center;\n}\n.about{\n      width: 32rpx;\n      height: 32rpx;\n      padding-right: 10rpx;\n}\n.des{\n      padding-left: 30rpx;\n      padding-top: 20rpx;\n      font-size: 26rpx;\n      color: #acacac;\n      letter-spacing: 2rpx;\n      line-height: 42rpx;\n}\n.top-bg {\n      position: absolute;\n      top: 0rpx;\n      left: 0rpx;\n      width: 100%;\n      height: 460rpx;\n      background: #fbbd08;\n      background-repeat: no-repeat;\n      background-size: 100%;\n}"
  },
  {
    "path": "miniprogram/pages/message/message.js",
    "content": "const app = getApp()\nvar time = require('../../utils/util.js');\nconst db = wx.cloud.database();\nPage({\n\n  data: {\n    roomlist: [],\n    openid: '',\n    myNickName: '',\n\n  },\n\n  onLoad: function (_options) {\n    wx.stopPullDownRefresh({\n      success: (res) => {\n        console.log(res)\n      },\n    })\n    this.init_charList()\n    this.setData({\n      openid: app.openid,\n      roomlist: app.roomlist\n    })\n    if (!app.openid) {\n      wx.showModal({\n        title: '温馨提示',\n        content: '该功能需要注册方可使用，是否马上去注册',\n        success(res) {\n          if (res.confirm) {\n            wx.navigateTo({\n              url: '/pages/login/login',\n            })\n          }\n        }\n      })\n      return false\n    }\n    console.log(\"输出列表用户信息\")\n    wx.cloud.init({\n      env: 'taoshaoji-46f0r',\n      traceUser: true\n    });\n    //初始化数据库\n    const db = wx.cloud.database();\n    var list = this.data.roomlist;\n    var that = this;\n    console.log(list);\n    for (var i = 0; i < list.length; i++) {\n      (function (i) {\n        db.collection('user').where({\n          _openid: list[i].openid\n        }).get().then(res => {\n          console.log(res.data[0]);\n          list[i].image = res.data[0].info.avatarUrl;\n          list[i].name = res.data[0].info.nickName;\n          //list[i].name = res.data[0]._id;\n          that.setData({\n            roomlist: list\n          })\n          console.log(list);\n        })\n      })(i);\n    }\n  },\n  /*\n  页面初始化\n  */\n  init_charList() {\n\n    var myid = this.data.openid;\n    var list = []\n    wx.cloud.init({\n      env: 'taoshaoji-46f0r',\n      traceUser: true\n    });\n    //初始化数据库\n    const db = wx.cloud.database();\n\n    console.log(\"enter A\");\n    db.collection('rooms').where({\n      p_s: myid,\n      deleted: 0\n    }).get().then(res => {\n      console.log(res.data);\n      console.log(\"1111111111111111111\");\n      if (res.data.length > 0) {\n        for (var i = 0; i < res.data.length; i++) {\n          var dia = new Object();\n          dia.roomid = res.data[i]._id;\n          dia.openid = res.data[i].p_b;\n          dia.time = \"\";\n          dia.cha = \"买家:\";\n          dia.name = \"\";\n          dia.image = \"\";\n          list.push(dia);\n          console.log(list);\n          console.log(\"list111111111111\");\n        }\n        app.roomlist = list;\n      }\n    })\n\n    db.collection('rooms').where({\n      p_b: myid,\n      deleted: 0\n    }).get().then(res => {\n      console.log(res.data);\n      if (res.data.length > 0) {\n        for (var i = 0; i < res.data.length; i++) {\n          var dia = new Object();\n          dia.roomid = res.data[i]._id;\n          dia.openid = res.data[i].p_s;\n          dia.time = \"\";\n          dia.cha = \"卖家:\";\n          dia.name = \"\";\n          dia.image = \"\";\n          list.push(dia);\n        }\n        app.roomlist = list;\n      }\n    })\n  },\n\n  /**\n   * 删除按钮事件\n   */\n  slideButtonTap(e) {\n    var that = this\n    console.log('slide button tap', e)\n    wx.showModal({\n      title: '提示',\n      content: '是否确认删除',\n      success(res) {\n        if (res.confirm) {\n          wx.showLoading({\n            title: '删除中..',\n          })\n          console.log('用户点击确定')\n          wx.cloud.callFunction({\n            name: 'removeChat',\n            data: {\n              id: e.currentTarget.dataset.delid\n            },\n            success: res => {\n              console.log('[云函数] [removeChat] 调用成功: ', res)\n\n              wx.showToast({\n                title: '删除成功',\n              })\n              wx.startPullDownRefresh()\n\n            },\n            fail: err => {\n              console.error('[云函数] [removeChat] 调用失败', err)\n            }\n          })\n        } else if (res.cancel) {\n          console.log('用户点击取消')\n        }\n      }\n    })\n  },\n  findtime() {\n    console.log(\"111111111111111111111111111\");\n    wx.cloud.init({\n      env: 'taoshaoji-46f0r',\n      traceUser: true\n    });\n    //初始化数据库\n    const db = wx.cloud.database();\n    var list = this.data.roomlist;\n    var that = this;\n    console.log(list);\n    for (var i = 0; i < list.length; i++) {\n      (function (i) {\n        db.collection('chatroom').where({\n          groupId: list[i].roomid,\n          deleted: 0\n        }).get().then(res => {\n          console.log(\"输出聊天数据\" + res.data.length);\n          console.log(res.data);\n          // list[i].time = time.formatTime(res.data[res.data.length - 1].sendTime);\n          list[i].time = res.data[res.data.length - 1].sendTimeTS;\n          that.setData({\n            roomlist: list\n          })\n          console.log(list);\n        })\n\n      })(i);\n    }\n  },\n  timesort() {\n    this.data.roomlist.sort(function (a, b) {\n      if (a.time > b.time) {\n        console.log(\"\");\n        return -1;\n      } else if (a.time == b.time) {\n        console.log(\"不变变\");\n        return 0;\n      } else {\n        console.log(\"我也不变变\");\n        return 1;\n      }\n\n    });\n    var test1 = setTimeout(this.changetime, \"1000\");\n\n  },\n  changetime() {\n    var list = this.data.roomlist\n    for (var i = 0; i < list.length; i++) {\n      console.log(\"改格式\" + time.formatTime(list[i].time, 'Y/M/D h:m:s'));\n      list[i].time = time.formatTime(list[i].time, 'Y/M/D h:m:s');\n    }\n    this.setData({\n      roomlist: list\n    })\n  },\n  go(e) {\n    wx.navigateTo({\n      url: '../detail/room/room?id=' + e.currentTarget.dataset.id,\n    })\n  },\n  onShow() {\n    this.init_charList()\n  },\n  //下拉刷新\n  onPullDownRefresh() {\n    this.onLoad();\n  },\n\n\n  getMyNickName() {\n    console.log(\"调用了getMyNickName\")\n    let that = this;\n    var myopenid = app.openid\n    db.collection('user').where({\n      _openid: myopenid\n    }).get().then(res => {\n      that.setData({\n        myNickName: res.data[0]\n      })\n      console.log(\"res.data.info.nickName:\" + res.data[0])\n    })\n  },\n\n\n  sendTip(e) {\n    let that = this;\n    that.onChange()\n    that.getMyNickName()\n    wx.showModal({\n      title: '温馨提示',\n      content: '您确定要发送消息通知提醒对方和你聊天吗？',\n      success(res) {\n        if (res.confirm) {\n          wx.cloud.callFunction({\n            name: \"sendTip\",\n            data: {\n              openid: e.currentTarget.dataset.opid,\n              nickName: that.data.myNickName.info.nickName,\n              tip: \"快去消息中心看看吧！\"\n            }\n          }).then(res => {\n            wx.showToast({\n              title: '提醒成功',\n              icon: 'success',\n              duration: 2000\n            })\n            console.log(\"推送消息成功\", res)\n            console.log(e.currentTarget.dataset.id)\n          }).catch(res => {\n            console.log(\"推送消息失败\", res)\n          })\n        }\n      }\n    })\n  },\n\n\n  onChange() {\n    wx.requestSubscribeMessage({\n      tmplIds: ['XXmEjf37meLWQaEsOX6qkkufcVH-YKAL3cHyY9Lru0Q'], //这里填入我们生成的模板id\n      success(res) {\n        console.log('授权成功', res)\n      },\n      fail(res) {\n        console.log('授权失败', res)\n      }\n    })\n  },\n})"
  },
  {
    "path": "miniprogram/pages/message/message.json",
    "content": "{\n\n  \"usingComponents\": { },\n  \"navigationBarTitleText\": \"消息中心\",\n  \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "miniprogram/pages/message/message.wxml",
    "content": "<view class=\"list\">\n\t<view class=\"item\" wx:for=\"{{roomlist}}\">\n\t\t<view class=\"left\">\n\t\t\t<image mode=\"aspectFill\" src=\"{{item.image}}\"  bindtap=\"go\" data-id=\"{{item.roomid}}\" ></image>\n\t\t</view>\n\t\t<view class=\"middle\"   bindtap=\"go\" data-id=\"{{item.roomid}}\" >\n\t\t\t<view class=\"title\">{{item.cha}}{{item.name}}</view>\n\t\t\t<view class=\"date\">{{list[i].time}}</view>\n\t\t</view>\n\t\t<view class=\"right\">\n\t\t\t<button class=\"btn\"  bindtap=\"sendTip\" >拍一拍</button>\n\t\t\t\t<button class=\"btn\"  bindtap=\"slideButtonTap\" data-delid=\"{{item.roomid}}\">删除</button>\n\t\t</view>\n\t</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/message/message.wxss",
    "content": ".list {\n      box-sizing: border-box;\n      width: 100%;\n      padding: 30rpx;\n    }\n    \n    .item {\n      display: flex;\n      flex-wrap: nowrap;\n      justify-content: center;\n      box-sizing: border-box;\n      margin-bottom: 35rpx;\n      width: 100%;\n      height: 160rpx;\n      border-radius: 20rpx;\n      box-shadow: 0rpx 0rpx 10rpx rgba(0, 0, 0, 0.2);\n      overflow: hidden;\n    }\n    \n    .left {\n      height: 100%;\n      width: 220rpx;\n    }\n    \n    .left image {\n      width: 100%;\n      height: 100%;\n    }\n    \n    .middle {\n      padding: 20rpx 0;\n      display: flex;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin-left: 20rpx;\n      flex: 3;\n    }\n    \n    .middle view {\n      margin: 5rpx 0;\n    }\n    \n    .title {\n      font-size: 30rpx;\n      font-weight: 600;\n      width: 100%;\n    }\n    \n    .date {\n      width: 100%;\n      color: #bbb;\n      font-size: 24rpx;\n    }\n    \n    .desc {\n      width: 100%;\n      color: #000;\n      font-size: 24rpx;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      display: -webkit-box;\n      -webkit-line-clamp: 1;\n      -webkit-box-orient: vertical;\n    }\n    \n    .right {\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex: 1;\n    }\n    \n    button.btn {\n      padding: 0;\n      margin-right: 30rpx;\n      width: 100rpx;\n      height: 55rpx;\n      line-height: 55rpx;\n      text-align: center;\n      font-size: 24rpx;\n      font-weight: 600;\n      background-color: #fdb92c;\n      border-radius: 6rpx;\n    }\n    \n    button.btn::after {\n      border: none;\n    }"
  },
  {
    "path": "miniprogram/pages/my/my.js",
    "content": "const app = getApp();\nconst config = require(\"../../config.js\");\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            showShare: false,\n            poster: JSON.parse(config.data).share_poster,\n            username: '',\n            openid: '',\n            roomlist: []\n      },\n      onShow() {\n            this.setData({\n                  userinfo: app.userinfo\n            })\n      },\n      onLoad: function (options) {\n            this.setData({\n                  openid: app.openid\n            })\n        \n      },\n      goo() {\n            console.log(app.roomlist);\n            if (!app.openid) {\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }else{\n                  wx.navigateTo({\n                        url: '../message/message',\n                  })\n            }\n\n      },\n      go(e) {\n            if (e.currentTarget.dataset.status == '1') {\n                  if (!app.openid) {\n                        wx.showModal({\n                              title: '温馨提示',\n                              content: '该功能需要注册方可使用，是否马上去注册',\n                              success(res) {\n                                    if (res.confirm) {\n                                          wx.navigateTo({\n                                                url: '/pages/login/login',\n                                          })\n                                    }\n                              }\n                        })\n                        return false\n                  }\n            }\n            wx.navigateTo({\n                  url: e.currentTarget.dataset.go\n            })\n      },\n      //展示分享弹窗\n      showShare() {\n            this.setData({\n                  showShare: true\n            });\n      },\n      //关闭弹窗\n      closePop() {\n            this.setData({\n                  showShare: false,\n            });\n      },\n      //预览图片\n      preview(e) {\n            \n            wx.previewImage({\n                  urls: e.currentTarget.dataset.link.split(\",\")\n            });\n      },\n      onShareAppMessage() {\n            return {\n                  title: JSON.parse(config.data).share_title,\n                  imageUrl: JSON.parse(config.data).share_img,\n                  path: '/pages/start/start'\n            }\n\n      },\n      // 用户点击右上角分享给好友,要先在分享好友这里设置menus的两个参数,才可以分享朋友圈\n\tonShareAppMessage: function() {\n\t\twx.showShareMenu({\n\t      withShareTicket: true,\n\t      menus: ['shareAppMessage', 'shareTimeline']\n\t    })\n\t},\n\t//用户点击右上角分享朋友圈\n\tonShareTimeline: function () {\n\t\treturn {\n\t      title: '',\n\t      query: {\n\t        key: value\n\t      },\n\t      imageUrl: ''\n\t    }\n\t},\n      //获取授权的点击事件\n      shouquan() {\n            wx.requestSubscribeMessage({\n                  tmplIds: ['6DGzsKqipoPxClnbkvwnxY9GqdXoLordLRdWTjJN1F0'], //这里填入我们生成的模板id\n                  success(res) {          \n                        console.log('授权成功', res)\n                  },\n                  fail(res) {\n                        console.log('授权失败', res)\n                  }\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/my/my.json",
    "content": "{\n\"navigationBarBackgroundColor\": \"#ffffff\"\n}"
  },
  {
    "path": "miniprogram/pages/my/my.wxml",
    "content": "<view class=\"top_box\">\n\t<view class=\"top_2\">\n\t\t<view class=\"avator\">\n\t\t\t<open-data wx:if=\"{{userinfo}}\" type=\"userAvatarUrl\"></open-data>\n\t\t\t<image wx:if=\"{{!userinfo}}\" src=\"/images/avator.png\"></image>\n\t\t</view>\n\t</view>\n\t<view class=\"top_1\">\n\t\t<view wx:if=\"{{!userinfo}}\" class=\"top_1_1\" bindtap=\"go\" data-go=\"/pages/login/login\">点击登录</view>\n\t\t<view wx:if=\"{{userinfo}}\" class=\"top_1_1\">\n\t\t\t<open-data type=\"userNickName\"></open-data>\n\t\t</view>\n\t\t<view class=\"top_1_2\" wx:if=\"{{!userinfo}}\">一秒登录，体验所有功能</view>\n\t\t<view class=\"top_1_2\" wx:if=\"{{userinfo}}\" bindtap=\"go\" data-go=\"/pages/edit/edit\" data-status=\"1\">点击修改资料</view>\n\t</view>\n</view>\n<view class=\"center_box\">\n\t<view class=\"center_1\" bindtap=\"go\" data-go=\"/pages/sell/list/list\" data-status=\"1\">\n\t\t<image src=\"/images/history.png\"></image>\n\t\t<view>我的发布</view>\n\t</view>\n\t<view class=\"center_1\" bindtap=\"go\" data-go=\"/pages/order/list/list\" data-status=\"1\">\n\t\t<image src=\"/images/publish.png\"></image>\n\t\t<view>我的购买</view>\n\t</view>\n\t<view class=\"center_1\" bindtap=\"goo\" data-go=\"/pages/help/help\">\n\t\t<image src=\"/images/help.png\"></image>\n\t\t<view>消息中心</view>\n\t</view>\n</view>\n<view class=\"blank\"></view>\n<view class=\"bottom_box\">\n\t<view class=\"bottom_card\" bindtap=\"go\" data-go=\"/pages/appreciateCode/appreciateCode\" data-status=\"1\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/appreciate.png\"></image>\n\t\t\t<view>上传赞赏码</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t</view>\n\n\t<view class=\"bottom_card\" bindtap=\"go\" data-go=\"/pages/help/help\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/illustrate.png\"></image>\n\t\t\t<view>使用说明</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t</view>\n\n\t<view class=\"bottom_card\" bindtap=\"go\" data-go=\"/pages/about/about\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/guanyu.png\"></image>\n\t\t\t<view>关于程序</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t</view>\n\t<view class=\"bottom_card\" bindtap=\"go\" data-go=\"/pages/kefu/kefu\" data-status=\"1\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/kefu.png\"></image>\n\t\t\t<view>联系客服</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t</view>\n\t<view class=\"bottom_card\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/feedback.png\"></image>\n\t\t\t<view>问题反馈</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t\t<button open-type=\"feedback\"></button>\n\t</view>\n\t<view class=\"bottom_card\" bindtap=\"go\" data-go=\"/pages/use/use\" data-status=\"1\">\n\t\t<view class=\"bottom_1\">\n\t\t\t<image src=\"/images/parse.png\"></image>\n\t\t\t<view>用户使用手册</view>\n\t\t</view>\n\t\t<image src=\"/images/go.png\"></image>\n\t</view>\n\n</view>"
  },
  {
    "path": "miniprogram/pages/my/my.wxss",
    "content": ".top_box {\n      width: 100%;\n      padding: 0 30rpx 30rpx 30rpx;\n      display: flex;\n      box-sizing: border-box;\n      border-bottom: 1rpx solid #eee;\n}\n\n.top_1 {\n      display: flex;\n      flex-direction: column;\n      width: 70%;\n      justify-content: space-between;\n      height: 140rpx;\n      box-sizing: border-box;\n      padding: 10rpx 20rpx;\n}\n\n.top_1_1 {\n      font-size: 42rpx;\n      letter-spacing: 2rpx;\n}\n\n.top_1_2 {\n      font-size: 34rpx;\n      color: #919191;\n      line-height: 42rpx;\n}\n\n.top_2 {\n      width: 30%;\n      height: 140rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n}\n\n.avator {\n      width: 140rpx;\n      height: 140rpx;\n      border-radius: 70rpx;\n      overflow: hidden;\n}\n\n.avator image {\n      width: 140rpx;\n      height: 140rpx;\n}\n\n.center_box {\n      width: 100%;\n      padding: 20rpx 0;\n      height: 200rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-around;\n      box-sizing: border-box;\n}\n\n.center_1 {\n      width: 160rpx;\n      height: 160rpx;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      justify-content: center;\n}\n\n.center_1 view {\n      font-size: 26rpx;\n      padding-top: 20rpx;\n}\n\n.center_1 image {\n      width: 60rpx;\n      height: 60rpx;\n}\n\n.blank {\n      width: 100%;\n      height: 20rpx;\n      background: #f4f4f4;\n}\n\n.bottom_box {\n      width: 100%;\n      display: flex;\n      box-sizing: border-box;\n      padding: 0 40rpx;\n      flex-direction: column;\n}\n\n.bottom_card {\n      position: relative;\n      width: 100%;\n      height: 124rpx;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      border-bottom: 1rpx solid #eee;\n      background: #fff;\n}\n.bottom_card button{\n      width: 100%;\n      height: 100%;\n      position: absolute;\n      left: 0;\n      top: 0;\n      opacity: 0.01;\n}\n.bottom_card image {\n      width: 14rpx;\n      height: 25rpx;\n}\n\n.bottom_1 {\n      display: flex;\n      height: 100%;\n      align-items: center;\n}\n\n.bottom_1 image {\n      width: 40rpx;\n      height: 40rpx;\n}\n\n.bottom_1 view {\n      font-size: 30rpx;\n      letter-spacing: 3rpx;\n      padding-left: 30rpx;\n}\n\n\n.share_contain {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n}\n\n.share_box {\n      display: flex;\n      align-items: center;\n      padding: 10rpx 20rpx 25rpx 20rpx;\n      box-sizing: border-box;\n      width: 500rpx;\n      justify-content: space-around;\n}\n\n.share_one {\n      display: flex;\n      position: relative;\n      flex-direction: column;\n      align-items: center;\n}\n\n.share_one image {\n      width: 70rpx;\n      height: 70rpx;\n}\n\n.share_one view {\n      padding-top: 20rpx;\n      font-size: 26rpx;\n}\n\n.share_title {\n      font-size: 30rpx;\n      letter-spacing: 3rpx;\n      padding: 16rpx;\n}\n\n.share_border {\n      margin-top: 20rpx;\n      display: flex;\n      box-sizing: border-box;\n      height: 6rpx;\n      width: 60rpx;\n      border-radius: 3rpx;\n      border-bottom:6rpx solid   #fbbd08;\n}\n\n.share_button {\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      opacity: 0.01;\n      border: none;\n}\n\n.share_button::after {\n      border: none;\n}\n\n.share_bor {\n      height: 60rpx;\n      width: 1rpx;\n      border-left: 1rpx solid #e7e7e7;\n}\n"
  },
  {
    "path": "miniprogram/pages/order/detail/detail.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            userinfo: [],\n            creatTime: '',\n            detail: [],\n            status: Number,\n            openid: app.openid,\n            appreciateCode: '',\n            address:'',\n            buyerInfo:[]\n      },\n      onLoad: function (e) {\n            if (app.openid) {\n                  this.setData({\n                        openid: app.openid\n                  })\n            } else {\n                  console.log(\"no openid\");\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }\n            this.getdetail(e.id);\n      },\n\n      //回到首页\n      home() {\n            wx.switchTab({\n                  url: '/pages/index/index',\n            })\n      },\n      //获取订单详情\n      getdetail(_id) {\n            let that = this;\n            db.collection('order').doc(_id).get({\n                  success(e) {\n                        that.setData({\n                              creatTime: config.formTime(e.data.creat),\n                              detail: e.data\n                        })\n                        that.getSeller(e.data.seller);\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败，请稍后到订单中心内查看',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n      //获取卖家信息\n      getSeller(m) {\n            let that = this;\n            db.collection('user').where({\n                  _openid: m\n            }).get({\n                  success: function (res) {\n                        wx.hideLoading();\n                        that.setData({\n                              userinfo: res.data[0]\n                        })\n                  }\n            })\n\n            db.collection('appreciatecode').where({\n                  _openid: m\n            }).get({\n                  success: function (res) {\n                        wx.hideLoading();\n                        that.setData({\n                              appreciateCode: res.data[0].bigImg\n                        })\n                        console.log(res.data[0].bigImg)\n                  }\n            })\n\n\n      },\n   \n      /**\n       * 获取地址\n       */\n      getAddress() {\n            let that = this;\n            if (that.data.detail.deliveryid == 0) {\n                  that.setData({\n                        address: that.data.detail.ztplace\n                  })\n            } else {\n                  that.setData({\n                        address: that.data.detail.psplace\n                  })\n            }\n      },\n      getBuyerInfo(){\n            db.collection('user').where({\n                  _openid:app.openid\n            }).get().then(res => {\n                  this.setData({\n                        buyerInfo:res.data[0].info\n                  })\n            })\n      },\n      //发送模板消息到指定用户,推送之前要先获取用户的openid\n      send() {\n            let that = this;\n            wx.cloud.callFunction({\n                  name: \"sendMsg\",\n                  data: {\n                        openid: that.data.detail.seller,\n                        status: '买家已确认收货，请确认是否收到钱款', //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；\n                        address: that.data.address,\n                        describe: that.data.detail.bookinfo.describe,\n                        good: that.data.detail.bookinfo.good,\n                        nickName: that.data.buyerInfo.nickName,\n                  }\n            }).then(res => {\n                  console.log(\"推送消息成功\", res)\n            }).catch(res => {\n                  console.log(\"推送消息失败\", res)\n            })\n      },\n\n      //确认收货\n      confirm() {\n            let that = this;\n            that.getAddress()\n            that.getBuyerInfo()\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认已收货吗',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                                    duration:1000\n                              })\n                              wx.cloud.callFunction({\n                                    name: 'pay',\n                                    data: {\n                                          $url: \"changeP\", //云函数路由参数\n                                          _id: that.data.detail.sellid,\n                                          status: 5 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款；5、等待卖家确认交易\n                                    },\n                                    success: res => {\n                                          wx.cloud.callFunction({\n                                                name: 'pay',\n                                                data: {\n                                                      $url: \"changeO\", //云函数路由参数\n                                                      _id: that.data.detail._id,\n                                                      status: 5 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款；5、等待卖家确认交易\n                                                },\n                                                success: res => {\n                                                      wx.showToast({\n                                                            title: '确认收货成功',\n                                                            icon:'success',\n                                                            duration:1000\n                                                          })\n                                                      that.send()\n                                                      that.getdetail(that.data.detail.sellid)\n                                                },\n                                                fail(e) {\n                                                      wx.hideLoading();\n                                                      wx.showToast({\n                                                            title: '发生异常，请及时和管理人员联系处理',\n                                                            icon: 'none'\n                                                      })\n                                                }\n                                          })\n                                    },\n                                    fail(e) {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '发生异常，请及时和管理人员联系处理',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      //删除订单\n      delete() {\n            let that = this;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认要删除此订单吗',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              db.collection('order').doc(that.data.detail._id).remove({\n                                    success() {\n                                          //页面栈返回\n                                          let i = getCurrentPages()\n                                          wx.navigateBack({\n                                                success: function () {\n                                                      i[i.length - 2].getlist();\n                                                }\n                                          });\n                                    },\n                                    fail: console.error\n                              })\n                        }\n                  }\n            })\n      },\n      //复制\n      copy(e) {\n            wx.setClipboardData({\n                  data: e.currentTarget.dataset.copy,\n                  success: res => {\n                        wx.showToast({\n                              title: '复制' + e.currentTarget.dataset.name + '成功',\n                              icon: 'success',\n                              duration: 1000,\n                        })\n                  }\n            })\n      },\n      //历史记录\n      history(name, num, type) {\n            let that = this;\n            db.collection('history').add({\n                  data: {\n                        stamp: new Date().getTime(),\n                        type: type, //1充值2支付\n                        name: name,\n                        num: num,\n                        oid: app.openid\n                  },\n                  success: function (res) {\n                        console.log(res)\n                  },\n                  fail: console.error\n            })\n      },\n\n      goo(e) {\n            var myid = this.data.openid;\n            var sallerid = this.data.detail.seller;\n            wx.cloud.init({\n                  env: 'taoshaoji-46f0r',\n                  traceUser: true\n            });\n            //初始化数据库\n            const db = wx.cloud.database();\n            if (myid != sallerid) {\n                  db.collection('rooms').where({\n                        p_b: myid,\n                        p_s: sallerid,\n                        deleted :0\n                  }).get().then(res => {\n                        console.log(res.data);\n                        if (res.data.length > 0) {\n                              this.setData({\n                                    roomID: res.data[0]._id\n                              })\n                              wx.navigateTo({\n                                    url: '/pages/detail/room/room?id=' + this.data.roomID,\n                              })\n                        } else {\n                              db.collection('rooms').add({\n                                    data: {\n                                          p_b: myid,\n                                          p_s: sallerid,\n                                          deleted :0\n                                    },\n                              }).then(res => {\n                                    console.log(res)\n                                    this.setData({\n                                          roomID: res._id\n                                    })\n                                    wx.navigateTo({\n                                          url: '/pages/detail/room/room?id=' + this.data.roomID,\n                                    })\n                              })\n                        }\n                  })\n            } else {\n                  wx.showToast({\n                        title: '无法和自己建立聊天',\n                        icon: 'none',\n                        duration: 1500\n                  })\n            }\n      },\n\n      //图片点击事件\n      img: function (event) {\n            let arr = [];\n            arr.push(this.data.appreciateCode)\n            wx.previewImage({\n                  current: 'current', // 当前显示图片的http链接\n                  urls: arr // 需要预览的图片http链接列表\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/order/detail/detail.json",
    "content": "{\n    \"navigationBarTitleText\": \"订单详情\"\n}"
  },
  {
    "path": "miniprogram/pages/order/detail/detail.wxml",
    "content": "<view class=\"contain\">\n\t<view class=\"card\">\n\t\t<view class=\"goods_box\">\n\t\t\t<image class=\"goods_img\" src=\"{{detail.bookinfo.pic[0]}}\"></image>\n\t\t\t<view class=\"goods_content\">\n\t\t\t\t<view class=\"goods_title text-cut\">{{detail.bookinfo.good}}</view>\n\t\t\t\t<view class=\"goods_author text-cut\">卖家：{{userinfo.info.nickName}}</view>\n\t\t\t</view>\n\t\t\t<view class=\"goods_price\">￥{{detail.price}}元</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"list\">\n\t\t\t<view class=\"list_1\">{{detail.deliveryid==0?'需要自提':'卖家帮送'}}</view>\n\t\t\t<view class=\"list_2\">\n\t\t\t\t地址：{{detail.deliveryid==0?detail.ztplace:detail.psplace}}\n\t\t\t</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"list\">\n\t\t\t<view class=\"list_1\">\n\t\t\t\t{{detail.status==1?'等待收货中':(detail.status==2?'交易完成':'订单已取消')}}\n\t\t\t</view>\n\t\t\t<view class=\"list_2\">\n\t\t\t\t{{detail.status==1?'系统已通知卖家准备':(detail.status==2?'要不再来一单':'祝您生活愉快')}}\n\t\t\t</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"orderfare\">ORDER FARE</view>\n\t\t<view class=\"fare_box\">\n\t\t\t<view class=\"fare_title\">下单时间</view>\n\t\t\t<view class=\"fare_des\">{{creatTime}}</view>\n\t\t</view>\n\t\t<view class=\"fare_box\">\n\t\t\t<view class=\"fare_title\">支付金额</view>\n\t\t\t<view class=\"fare_des\">￥{{detail.price}}.00元</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"orderfare\">CONTACT SELLER</view>\n\t\t<view class=\"fare_box\" bindtap=\"copy\" data-copy=\"{{userinfo.email}}\" data-name=\"邮箱\">\n\t\t\t<view class=\"fare_title\">邮箱</view>\n\t\t\t<view class=\"fare_des\">{{userinfo.email}}</view>\n\t\t</view>\n\t\t<view class=\"fare_box\" wx:if=\"{{userinfo.qqnum!==''}}\" bindtap=\"copy\" data-copy=\"{{userinfo.qqnum}}\" data-name=\"QQ\">\n\t\t\t<view class=\"fare_title\">QQ</view>\n\t\t\t<view class=\"fare_des\">{{userinfo.qqnum}}</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"bot_box\" wx:if=\"{{detail.status==1}}\">\n\t\t\t<view class=\"contact\" bindtap=\"confirm\">确认收货</view>\n\t\t</view>\n\t\t<view class=\"bot_box\" wx:if=\"{{detail.status==5}}\">\n\t\t\t<view class=\"contact\">等待卖家确认交易</view>\n\t\t</view>\n\t\t<view class=\"bot_box\">\n\t\t\t<view wx:if=\"{{detail.status==2||detail.status==3}}\" class=\"delete\" bindtap=\"delete\">\n\t\t\t\t删除订单\n\t\t\t</view>\n\t\t</view>\n\t\t<view class=\"border\" wx:if=\"{{appreciateCode}}\"></view>\n\t\t<view class=\"paycode\" wx:if=\"{{appreciateCode}}\">扫描下方二维码付款</view>\n\t\t<view wx:if=\"{{appreciateCode}}\" class='imagesize'>\n\t\t\t<image src=\"{{appreciateCode}}\" mode=\"scaleToFill\" bindtap=\"img\" data-src=\"{{appreciateCode}}\" class='in-image'></image>\n\t\t</view>\n\t\t<view wx:if=\"{{!appreciateCode}}\" class='imagesize'>\n\t\t\t<image src=\"{{!appreciateCode}}\" mode=\"scaleToFill\" src=\"https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/gzh/error.jpeg?sign=47d46e3798aea6c838d04518bca1ee9a&t=1597509495\" class='in-image'></image>\n\t\t</view>\n\t</view>\n</view>\n<!-- 悬浮聊天功能 -->\n<view class=\"contact_box\" bindtap=\"goo\" data-id=\"{{roomID}}\">\n\t<image src=\"/images/chat.png\"></image>\n\t<view>私聊</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/order/detail/detail.wxss",
    "content": "page {\n  background-image: linear-gradient(to top, #dad4ec 0%, #dad4ec 1%, #f3e7e9 100%);\n}\n\n.contain {\n  display: flex;\n  padding: 20rpx 28rpx;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.imagesize {\n  display: flex;\n  justify-content: center;\n}\n\n.imagesize image {\n  width: 400rpx;\n  height: 400rpx;\n}\n\n.card {\n  width: 100%;\n  background: #fff;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  padding: 40rpx 25rpx;\n}\n\n.top_over {\n  width: 100%;\n  height: 20rpx;\n  position: absolute;\n  left: 0rpx;\n  top: -10rpx;\n}\n\n.bot_over {\n  width: 100%;\n  height: 20rpx;\n  position: absolute;\n  left: 0rpx;\n  bottom: -10rpx;\n}\n\n.goods_box {\n  width: 100%;\n  display: flex;\n  box-sizing: border-box;\n  align-items: center;\n  height: 100rpx;\n}\n\n.goods_img {\n  width: 90rpx;\n  height: 90rpx;\n}\n\n.goods_content {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  padding-left: 20rpx;\n  width: calc(100% - 240rpx);\n  height: 90%;\n}\n\n.goods_title {\n  font-size: 29rpx;\n  letter-spacing: 3rpx;\n}\n\n.goods_author {\n  font-size: 26rpx;\n  letter-spacing: 2rpx;\n  color: rgb(150, 150, 150);\n}\n\n.goods_price {\n  width: 150rpx;\n  height: 100%;\n  font-size: 32rpx;\n  color: #f00;\n  white-space: nowrap;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.border {\n  width: 100%;\n  height: 20rpx;\n  border-bottom: 1rpx solid #eee;\n}\n\n.list {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  padding: 30rpx 0 10rpx 0;\n}\n\n.list_1 {\n  font-size: 26rpx;\n  color: rgb(167, 167, 167);\n  letter-spacing: 2rpx;\n}\n\n.list_2 {\n  padding-top: 10rpx;\n  font-size: 32rpx;\n  letter-spacing: 3rpx;\n}\n\n.orderfare {\n  margin-top: 28rpx;\n  font-size: 22rpx;\n  font-weight: 600;\n  letter-spacing: 2rpx;\n  color: rgb(167, 167, 167);\n  padding-bottom: 20rpx;\n}\n\n.paycode {\n  margin-top: 28rpx;\n  font-size: 25rpx;\n  font-weight: 600;\n  letter-spacing: 2rpx;\n  color: rgb(33, 47, 104);\n  padding-bottom: 20rpx;\n}\n.fare_box {\n  display: flex;\n  width: 100%;\n  justify-content: space-between;\n  align-items: center;\n  padding: 10rpx 0;\n}\n\n.fare_title {\n  font-size: 28rpx;\n  letter-spacing: 2rpx;\n}\n\n.fare_des {\n  font-size: 27rpx;\n  color: rgb(167, 167, 167);\n}\n\n.bot_box {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n\n.cancel {\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #000;\n  color: #fff;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 40rpx;\n  letter-spacing: 4rpx;\n}\n\n.contact {\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #fbbd08;\n  color: #000;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 20rpx;\n  letter-spacing: 4rpx;\n}\n\n.delete {\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #adadad;\n  color: #fff;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 20rpx;\n  letter-spacing: 4rpx;\n}\n\n\n.contact_box {\n  z-index: 9;\n  position: fixed;\n  bottom: 200rpx;\n  right: 40rpx;\n  display: flex;\n  width: 100rpx;\n  flex-direction: column;\n  align-items: center;\n  background: rgba(255, 255, 255, 0.8);\n  padding: 20rpx 10rpx;\n  border-radius: 50rpx 50rpx 20rpx 20rpx;\n  box-shadow: 0 0 20rpx #f0f0f0 !important;\n}\n\n.contact_box image {\n  width: 80rpx;\n  height: 80rpx;\n}\n\n.contact_box view {\n  font-size: 26rpx;\n  letter-spacing: 2rpx;\n  margin-top: 10rpx;\n}"
  },
  {
    "path": "miniprogram/pages/order/list/list.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            scrollTop: 0,\n            nomore: false,\n            tab: [{\n                        name: '全部',\n                        id: 0,\n                  },\n                  {\n                        name: '交易中',\n                        id: 1,\n                  },\n                  {\n                        name: '交易完成',\n                        id: 2,\n                  },\n                  // {\n                  //       name: '已取消',\n                  //       id: 3,\n                  // }\n            ],\n            tabid: 0,\n            detail: [],\n            address: ''\n      },\n      //导航栏切换\n      changeTab(e) {\n            let that = this;\n            that.setData({\n                  tabid: e.currentTarget.dataset.id\n            })\n            that.getlist();\n      },\n      //跳转详情页\n      godetail(e) {\n            let that = this;\n            let detail = e.currentTarget.dataset.id;\n            wx.navigateTo({\n                  url: '/pages/order/detail/detail?id=' + detail,\n            })\n      },\n      onShow() {\n            this.getlist();\n      },\n      onLoad() {\n            wx.showLoading({\n                  title: '加载中',\n            })\n            this.getlist();\n      },\n      //获取列表\n      getlist() {\n            let that = this;\n            let status = that.data.tabid;\n            if (status == 0) {\n                  var statusid = _.neq(0); //除-2之外所有\n            } else {\n                  var statusid = parseInt(status) //小程序搜索必须对应格式\n            }\n            db.collection('order').where({\n                  status: statusid,\n                  _openid: app.openid\n            }).orderBy('creat', 'desc').get({\n                  success(re) {\n                        wx.stopPullDownRefresh(); //暂停刷新动作\n                        that.setData({\n                              nomore: false,\n                              page: 0,\n                              list: re.data\n                        })\n                        wx.hideLoading();\n                  }\n            })\n      },\n      /**\n       * 获取地址\n       */\n      getAddress() {\n            let that = this;\n            if (that.data.detail.deliveryid == 0) {\n                  that.setData({\n                        address: that.data.detail.ztplace\n                  })\n            } else {\n                  that.setData({\n                        address: that.data.detail.psplace\n                  })\n            }\n      },\n      //取消订单(仅当订单为交易中时候，取消后卖家状态恢复)\n      cancel(ord) {\n            let that = this;\n            let detail = ord.currentTarget.dataset.ord;\n            that.setData({\n                  detail: detail\n            })\n            that.getAddress()\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认要取消并删除该订单吗',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              wx.cloud.callFunction({\n                                    name: 'removeOrder',\n                                    data: {\n                                          _id: detail._id,\n                                    },\n                                    success: res => {\n                                          wx.showToast({\n                                                title: '取消订单成功',\n                                                icon:'success',\n                                                duration:1000\n                                          })    \n                                          that.sendCancel(that.data.detail.seller)\n                                          that.onShow()\n                                    },\n                                    fail(e) {\n                                          wx.showToast({\n                                                title: '发生异常，请及时和管理人员联系处理',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                              //调用node函数去修改publish的状态\n                              wx.cloud.callFunction({\n                                    // 云函数名称\n                                    name: 'node',\n                                    // 传给云函数的参数\n                                    data: {\n                                          _id: detail._id,\n                                          status: 0\n                                    },\n                                    success: function (res) {\n                                          console.log(\"cancel(ord)输出的\" + res);\n                                    },\n                                    fail() {\n                                          wx.showToast({\n                                                title: '发生异常，请及时和管理人员联系处理',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n            console.log(that.data.detail.seller)\n      },\n\n\n      //发送模板消息到指定用户,推送之前要先获取用户的openid\n      sendCancel(openid) {\n            let that = this;\n            wx.cloud.callFunction({\n                  name: \"sendMsg\",\n                  data: {\n                        openid: that.data.detail.seller,\n                        status: '买家取消订单，已重新上架物品', //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；\n                        address: that.data.address,\n                        describe: that.data.detail.bookinfo.describe,\n                        good: that.data.detail.bookinfo.good,\n                        nickName: that.data.detail.buyerInfo.info.nickName,\n                  }\n            }).then(res => {\n                  console.log(\"推送消息成功\", res)\n            }).catch(res => {\n                  console.log(\"推送消息失败\", res)\n            })\n      },\n\n\n      send() {\n            let that = this;\n            wx.cloud.callFunction({\n                  name: \"sendMsg\",\n                  data: {\n                        openid: that.data.detail.seller,\n                        status: '买家已确认收货，请确认是否收到钱款',\n                        address: that.data.address,\n                        describe: that.data.detail.bookinfo.describe,\n                        good: that.data.detail.bookinfo.good,\n                        nickName: that.data.detail.buyerInfo.info.nickName,\n                  }\n            }).then(res => {\n                  console.log(\"推送消息成功\", res)\n            }).catch(res => {\n                  console.log(\"推送消息失败\", res)\n            })\n      },\n\n\n      //下拉刷新\n      onPullDownRefresh() {\n            this.getlist();\n      },\n      //确认收货\n      confirm(ord) {\n            let that = this;\n            let detail = ord.currentTarget.dataset.ord;\n            that.setData({\n                  detail: detail\n            })\n            that.getAddress()\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认已收货吗',\n                  success(res) {\n                        if (res.confirm) {\n                              \n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              wx.cloud.callFunction({\n                                    // 云函数名称\n                                    name: 'node',\n                                    // 传给云函数的参数\n                                    data: {\n                                          _id: detail._id,\n                                          status: 5, //状态5为等待卖家确认交易中，也就是在确认收货后\n                                    },\n                                    success: function (res) {\n                                          wx.showToast({\n                                                title: '确认收货成功',\n                                                icon: 'success',\n                                                duration: 1000\n                                          })\n                                          that.send()\n                                          that.getlist()\n                                          console.log(\"调用云函数成功！\")\n                                    },\n                                    fail() {\n                                          console.log(\"调用云函数失败！\")\n                                    }\n                              })\n                              db.collection('order').doc(detail._id).update({\n                                    data: {\n                                          status: 5, //状态5为等待卖家确认交易中，也就是在确认收货后\n                                    },\n                                    success() {\n                                          that.getList();\n                                    },\n                                    fail() {\n                                          wx.showToast({\n                                                title: '操作失败',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n\n      //删除订单\n      delete(ord) {\n            let that = this;\n            let detail = ord.currentTarget.dataset.ord;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认要删除此订单吗',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              db.collection('order').doc(detail._id).remove({\n                                    success() {\n                                          that.getlist();\n                                    },\n                                    fail: console.error\n                              })\n                        }\n                  }\n            })\n      },\n      //至顶\n      gotop() {\n            wx.pageScrollTo({\n                  scrollTop: 0\n            })\n      },\n      //监测屏幕滚动\n      onPageScroll: function (e) {\n            this.setData({\n                  scrollTop: parseInt((e.scrollTop) * wx.getSystemInfoSync().pixelRatio)\n            })\n      },\n      onReachBottom() {\n            this.more();\n      },\n      //加载更多\n      more() {\n            let that = this;\n            if (that.data.nomore || that.data.list.length < 20) {\n                  return false\n            }\n            let page = that.data.page + 1;\n            let status = that.data.tabid;\n            if (status == 0) {\n                  var statusid = _.neq(0); //除-2之外所有\n            } else {\n                  var statusid = parseInt(status) //小程序搜索必须对应格式\n            }\n            db.collection('order').where({\n                  status: statusid,\n                  _openid: app.openid\n            }).orderBy('creat', 'desc').skip(page * 20).limit(20).get({\n                  success: function (res) {\n                        if (res.data.length == 0) {\n                              that.setData({\n                                    nomore: true\n                              })\n                              return false;\n                        }\n                        if (res.data.length < 20) {\n                              that.setData({\n                                    nomore: true\n                              })\n                        }\n                        that.setData({\n                              page: page,\n                              list: that.data.list.concat(res.data)\n                        })\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n})"
  },
  {
    "path": "miniprogram/pages/order/list/list.json",
    "content": "{\n      \"navigationBarTitleText\": \"我的购买\",\n      \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "miniprogram/pages/order/list/list.wxml",
    "content": "<wxs src=\"../../../common.wxs\" module=\"morejs\" />\n<view class=\"tab_contain\">\n      <block wx:for=\"{{tab}}\" wx:key=\"id\">\n            <view class=\"tab_one\" bindtap=\"changeTab\" data-id=\"{{index}}\">\n                  <view class=\"{{tabid==item.id?'tab_on':''}}\">{{item.name}}</view>\n            </view>\n      </block>\n</view>\n\n<view class=\"contain\" wx:if=\"{{list.length!==0}}\">\n      <block wx:for=\"{{list}}\" wx:key=\"_id\">\n            <view class=\"card shadow\" bindtap=\"godetail\" data-id=\"{{item._id}}\">\n                  <view class=\"top\">\n                  <view class=\"top1\">\n                        <view class=\"title {{item.status==1?'text-red':''}}\">\n                              <image src=\"/images/order.png\"></image>\n                              <view>{{item.status==1||item.status==5?'交易中':(item.status== 2?'已完成':(item.status==3||item.status==4?'已取消':'待出售'))}}</view>\n                        </view>\n                        <view class=\"date\">{{morejs.timelog(item.creat)}}</view>\n                  </view>\n                  </view>\n                  <view class=\"center\">\n                        <image src=\"{{item.bookinfo.pic[0]}}\"></image>\n                        <view class=\"content\">\n                              <view class=\"book\">\n                                    <view class=\"book_name text-cut\">{{item.bookinfo.good}}</view>\n                              </view>\n                              <view class=\"price\">￥{{item.price}}元</view>\n                        </view>\n                  </view>\n                  <view class=\"bottom\">\n                          <view wx:if=\"{{item.status==3}}\">卖家取消交易</view>\n                          <view wx:if=\"{{item.status==1}}\" class=\"cancel\" catchtap=\"cancel\" data-ord=\"{{item}}\">取消订单</view>\n                          <view wx:if=\"{{item.status==1}}\" class=\"confirm\" catchtap=\"confirm\" data-ord=\"{{item}}\">确认收货</view>\n                          <view wx:if=\"{{item.status==5}}\">等待卖家确认交易</view>\n                          <view wx:if=\"{{item.status==2||item.status==3||item.status==4}}\" class=\"cancel\" catchtap=\"delete\" data-ord=\"{{item}}\">删除订单</view>     \n                  </view>\n            </view>\n      </block>\n</view>\n\n<!--无内容显示-->\n<view class=\"nocontent\" wx:if=\"{{list.length==0}}\">\n      <image src=\"/images/blank.png\"></image>\n      <view class=\"blank_text\">这里空空如也~</view>\n</view>\n\n<block wx:if=\"{{list.length>10}}\">\n      <import src=\"/common.wxml\" />\n      <template is=\"loadmore\" data=\"{{nomore}}\" />\n</block>\n<van-transition show=\"{{ scrollTop>500 }}\" custom-class=\"block\" duration=\"600\">\n      <view class=\"totop\" bindtap=\"gotop\">\n            <image src=\"/images/top.png\"></image>\n      </view>\n</van-transition>"
  },
  {
    "path": "miniprogram/pages/order/list/list.wxss",
    "content": ".tab_contain {\n      width: 100%;\n      height: 90rpx;\n      display: flex;\n      align-items: center;\n      box-sizing: border-box;\n      border-bottom: 1rpx solid #eee;\n}\n\n.tab_one {\n      width: 33%;\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      box-sizing: border-box;\n}\n\n.tab_one view {\n      height: 100%;\n      display: flex;\n      align-items: center;\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n}\n\n.tab_on {\n      font-size: 32rpx;\n      font-weight: 600;\n      border-bottom: 4rpx solid #fbbd08;\n}\n\n.contain {\n      width: 100%;\n      padding: 24rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n}\n\n.card {\n      width: 100%;\n      padding: 30rpx;\n      display: flex;\n      box-sizing: border-box;\n      border-radius: 15rpx;\n      margin-bottom: 30rpx;\n      flex-direction: column;\n}\n\n.top {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      padding-bottom: 20rpx;\n      border-bottom: 1rpx solid #eee;\n}\n.text-red{\n      color: #f80202;\n}\n.top1 {\n      display: flex;\n      width: 100%;\n      align-items: center;\n      justify-content: space-between;\n}\n\n.date {\n      font-size: 28rpx;\n      color: #b2b2b2;\n      letter-spacing: 2rpx;\n}\n\n.title {\n      display: flex;\n      align-items: center;\n}\n\n.title image {\n      width: 36rpx;\n      height: 36rpx;\n}\n\n.title view {\n      padding-left: 10rpx;\n      letter-spacing: 3rpx;\n      font-size: 30rpx;\n      font-weight: 600;\n}\n\n.del {\n      display: flex;\n      align-items: center;\n      border: 1rpx solid #c2c2c2;\n      border-radius: 20rpx;\n      padding: 0 10rpx;\n      box-sizing: border-box;\n      height: 40rpx;\n}\n\n.del image {\n      width: 28rpx;\n      height: 28rpx;\n}\n\n.del view {\n      font-size: 26rpx;\n      color: #c2c2c2;\n      letter-spacing: 3rpx;\n}\n\n.center {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      box-sizing: border-box;\n      padding: 20rpx 0;\n      border-bottom: 1rpx solid #eee;\n}\n\n.center image {\n      width: 130rpx;\n      height: 130rpx;\n}\n\n.content {\n      width: calc(100% - 130rpx);\n      padding: 0 20rpx;\n      height: 130rpx;\n      display: flex;\n      flex-direction: column;\n      box-sizing: border-box;\n      justify-content: space-between;\n}\n\n.book {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n}\n\n.book_name {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n}\n\n.book_author {\n      padding-top: 10rpx;\n      font-size: 26rpx;\n      letter-spacing: 3rpx;\n      color: #c2c2c2;\n}\n\n.price {\n      display: flex;\n      justify-content: flex-end;\n      font-size: 32rpx;\n      color: #f80202;\n}\n\n.bottom {\n      width: 100%;\n      display: flex;\n      justify-content: flex-end;\n      padding: 20rpx 0 0 0;\n}\n\n.cancel {\n      width: 110rpx;\n      font-size: 26rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      padding: 0 20rpx;\n      height: 50rpx;\n      border-radius: 25rpx;\n      color: #c2c2c2;\n      border: 1rpx solid #c2c2c2;\n      margin-left: 20rpx;\n}\n\n.confirm {\n      width: 110rpx;\n      font-size: 26rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      padding: 0 20rpx;\n      height: 50rpx;\n      border-radius: 25rpx;\n      color: #fbbd08;\n      border: 1rpx solid #fbbd08;\n      margin-left: 20rpx;\n}\n\n.nocontent {\n      width: 100%;\n      height: calc(100% - 90rpx);\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.nocontent image {\n      padding-left: 80rpx;\n      width: 340rpx;\n      height: 272rpx;\n}\n\n.blank_text {\n      padding-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n      color: #c6c6c8;\n}\n"
  },
  {
    "path": "miniprogram/pages/publish/publish.js",
    "content": "const db = wx.cloud.database();\nconst app = getApp();\nconst config = require(\"../../config.js\");\nconst MAX_IMG_NUM = 8;\nPage({\n      data: {\n            isExist: '',\n            selectPhoto: true,\n            systeminfo: app.systeminfo,\n            params: {\n                  imgUrl: new Array(),\n            },\n            tempFilePaths: [],\n            entime: {\n                  enter: 600,\n                  leave: 300\n            }, //进入褪出动画时长\n            college: JSON.parse(config.data).college.splice(1),\n            steps: [{\n                        text: '步骤一',\n                        desc: '补充物品信息'\n                  },\n                  {\n                        text: '步骤二',\n                        desc: '发布成功',\n                  },\n            ],\n      },\n      //恢复初始态\n      initial() {\n            let that = this;\n            that.setData({\n                  dura: 30,\n                  price: 15,\n                  place: '',\n                  chooseDelivery: 0,\n                  cids: '-1', //类别选择的默认值\n                  show_b: true,\n                  show_c: false,\n                  active: 0,\n                  chooseCollege: false,\n                  note_counts: 0,\n                  desc_counts: 0,\n                  notes: '',\n                  describe: '',\n                  good: '',\n                  kindid: 0,\n                  showorhide: true,\n                  tempFilePaths: [],\n                  params: {\n                        imgUrl: new Array(),\n                  },\n                  imgUrl: [],\n                  kind: [{\n                        name: '通用',\n                        id: 0,\n                        check: true,\n                  }, {\n                        name: '用途',\n                        id: 1,\n                        check: false\n                  }],\n                  delivery: [{\n                        name: '自提',\n                        id: 0,\n                        check: true,\n                  }, {\n                        name: '帮送',\n                        id: 1,\n                        check: false\n                  }],\n                  selectPhoto:true\n            })\n      },\n      onLoad() {\n            this.initial();\n            this.getCodeFromSet();\n            \n      },\n      onShow() {\n\n      },\n      //价格输入改变\n      priceChange(e) {\n            this.data.price = e.detail;\n      },\n      //时长才输入改变\n      duraChange(e) {\n            this.data.dura = e.detail;\n      },\n      //地址输入\n      placeInput(e) {\n            console.log(e)\n            this.data.place = e.detail.value\n      },\n      //物品输入\n      goodInput(e) {\n            console.log(e)\n            this.data.good = e.detail.value\n      },\n      //类别选择\n      kindChange(e) {\n            let that = this;\n            let kind = that.data.kind;\n            let id = e.detail.value;\n            for (let i = 0; i < kind.length; i++) {\n                  kind[i].check = false\n            }\n            kind[id].check = true;\n            if (id == 1) {\n                  that.setData({\n                        kind: kind,\n                        chooseCollege: true,\n                        kindid: id\n                  })\n            } else {\n                  that.setData({\n                        kind: kind,\n                        cids: '-1',\n                        chooseCollege: false,\n                        kindid: id\n                  })\n            }\n      },\n      //选择专业\n      choCollege(e) {\n            let that = this;\n            that.setData({\n                  cids: e.detail.value\n            })\n      },\n      //取货方式改变\n      delChange(e) {\n            let that = this;\n            let delivery = that.data.delivery;\n            let id = e.detail.value;\n            for (let i = 0; i < delivery.length; i++) {\n                  delivery[i].check = false\n            }\n            delivery[id].check = true;\n            if (id == 1) {\n                  that.setData({\n                        delivery: delivery,\n                        chooseDelivery: 1\n                  })\n            } else {\n                  that.setData({\n                        delivery: delivery,\n                        chooseDelivery: 0\n                  })\n            }\n      },\n      //输入备注\n      noteInput(e) {\n            let that = this;\n            that.setData({\n                  note_counts: e.detail.cursor,\n                  notes: e.detail.value,\n            })\n      },\n      //输入描述\n      describeInput(e) {\n            let that = this;\n            that.setData({\n                  desc_counts: e.detail.cursor,\n                  describe: e.detail.value,\n            })\n      },\n      //发布校检\n      check_pub() {\n            let that = this;\n            //如果用户选择了用途，需要选择用途类别\n            if (that.data.kind[1].check) {\n                  if (that.data.cids == -1) {\n                        wx.showToast({\n                              title: '请选择用途',\n                              icon: 'none',\n                        });\n                        return false;\n                  }\n            }\n            //如果用户选择了自提，需要填入详细地址\n            if (that.data.delivery[0].check) {\n                  if (that.data.place == '') {\n                        wx.showToast({\n                              title: '请输入地址',\n                              icon: 'none',\n                        });\n                        return false;\n                  }\n            }\n            that.publish();\n      },\n      //正式发布\n      publish() {\n            let that = this;\n            if (!app.openid) {\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }\n            if (that.data.good == '') {\n                  wx.showToast({\n                        title: '请输入商品名称',\n                        icon: 'none',\n                  });\n                  return false;\n            }\n            if (that.data.describe == '') {\n                  wx.showToast({\n                        title: '请输入商品的详细描述',\n                        icon: 'none',\n                  });\n                  return false;\n            }\n            if (that.data.imgUrl == '') {\n                  wx.showToast({\n                        title: '请选择图片',\n                        icon: 'none',\n                  });\n                  return false;\n            }\n            if (that.data.notes == '') {\n                  wx.showToast({\n                        title: '请输入相关的备注信息（如取货时间，新旧程度等）',\n                        icon: 'none',\n                  });\n                  return false;\n            }\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '经检测您填写的信息无误，是否马上发布？',\n                  success(res) {\n                        if (res.confirm) {\n                              db.collection('publish').add({\n                                    data: {\n                                          creat: new Date().getTime(),\n                                          dura: new Date().getTime() + that.data.dura * (24 * 60 * 60 * 1000),\n                                          status: 0, //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款\n                                          price: that.data.price, //售价\n                                          //分类\n                                          kindid: that.data.kindid, //区别通用还是用途\n                                          collegeid: that.data.cids, //学院id，-1表示通用类\n                                          deliveryid: that.data.chooseDelivery, //0自1配\n                                          place: that.data.place, //选择自提时地址\n                                          notes: that.data.notes, //备注\n                                          bookinfo: {\n                                                pic: that.data.imgUrl,\n                                                good: that.data.good,\n                                                describe: that.data.describe,\n                                                imgs: that.data.imgUrl\n                                          },\n                                          key: that.data.good,\n                                    },\n                                    success(e) {\n                                          console.log(e)\n                                          that.setData({\n                                                show_b: false,\n                                                show_c: true,\n                                                active: 2,\n                                                detail_id: e._id\n                                          });\n                                          wx.showToast({\n                                                title: '正在上传...',\n                                                icon: 'loading',\n                                                mask: true,\n                                                duration: 1000\n                                          })\n                                          setTimeout(function () {\n                                                //判断卖家是否已经上传了赞赏码\n                                                if (that.data.isExist == false) {\n                                                      wx.showModal({\n                                                            title: '商品发布成功',\n                                                            content: '您未上传赞赏码用于交易，是否现在去上传？',\n                                                            showCancel: true, //是否显示取消按钮\n                                                            cancelText: \"稍后再传\", //默认是“取消”\n                                                            cancelColor: '#fbbd08', //取消文字的颜色\n                                                            success(res) {\n                                                                  if (res.confirm) {\n                                                                        wx.navigateTo({\n                                                                              url: '/pages/appreciateCode/appreciateCode',\n                                                                        })\n                                                                  }\n                                                            }\n                                                      })\n                                                }\n                                          }, 2000)\n\n                                          that.setData({\n                                                show_b: false,\n                                                show_c: true,\n                                                active: 2,\n                                                detail_id: e._id,\n                                          });\n                                          //滚动到顶部\n                                          wx.pageScrollTo({\n                                                scrollTop: 0,\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      getCodeFromSet() {\n            let that = this;\n            let openid = app.openid\n            console.log(openid)\n            db.collection('appreciatecode').where({\n                  _openid: openid,\n            }).get().then(res => {\n                  if (res.data.length > 0) {\n                        that.setData({\n                              isExist: true,\n                              bigImg: res.data[0].bigImg\n                        })\n                        console.log(res.data[0].bigImg)\n                        console.log(\"isExist---->\" + that.data.isExist)\n                  } else {\n                        that.setData({\n                              isExist: false,\n                        })\n                        console.log(\"isExist---->\" + that.data.isExist)\n                  }\n            })\n      },\n      doUpload(filePath) {\n            const that = this;\n            // var timestamp = (new Date()).valueOf();\n            const cloudPath = 'goods-pic/' + app.openid + '/' + Math.floor(Math.random() * 10000 + 10000) + '.png';\n\n            wx.cloud.uploadFile({\n                  cloudPath,\n                  filePath\n            }).then(res => {\n                  console.log('[上传文件] 成功：', res)\n                  const {\n                        params\n                  } = that.data;\n                  const {\n                        imgUrl\n                  } = params;\n                  imgUrl.push(res.fileID);\n                  params['imgUrl'] = imgUrl;\n                  that.setData({\n                        imgUrl,\n                  });\n            }).catch(error => {\n                  console.error('[上传文件] 失败：', error);\n                  wx.showToast({\n                        icon: 'none',\n                        title: '上传失败',\n                        duration: 1000\n                  })\n            })\n      },\n\n      chooseImage: function () {\n            const that = this;\n            // 还能再选几张图片,初始值设置最大的数量-当前的图片的长度\n            let max = MAX_IMG_NUM - this.data.tempFilePaths.length;\n            // 选择图片\n            wx.chooseImage({\n                  count: max, // count表示最多可以选择的图片张数\n                  sizeType: ['compressed'],\n                  sourceType: ['album', 'camera'],\n                  success: (res) => {\n                        const tempFiles = res.tempFiles;\n                        const filePath = res.tempFilePaths;\n                        //将选择的图片上传\n                        filePath.forEach((path, _index) => {\n                              setTimeout(() => that.doUpload(path), _index); //加不同的延迟，避免多图上传时文件名相同\n                        });\n                        const {\n                              tempFilePaths\n                        } = that.data;\n                        that.setData({\n                              tempFilePaths: tempFilePaths.concat(filePath)\n                        }, () => {\n                              console.log(that.data.tempFilePaths)\n                        })\n                        // 还能再选几张图片\n                        max = MAX_IMG_NUM - this.data.tempFilePaths.length\n                        this.setData({\n                              selectPhoto: max <= 0 ? false : true // 当超过8张时,加号隐藏\n                        })\n                  },\n                  fail: e => {\n                        console.error(e)\n                  }\n            })\n      },\n      deletePic(e) {\n            console.log(e);\n            let index = e.currentTarget.dataset.index\n            let imgUrl = this.data.params.imgUrl\n            const {\n                  tempFilePaths\n            } = this.data;\n            tempFilePaths.splice(index, 1);\n            imgUrl.splice(index, 1)\n            this.setData({\n                  ['params.imgUrl']: imgUrl,\n                  tempFilePaths,\n            })\n            // 当添加的图片达到设置最大的数量时,添加按钮隐藏,不让新添加图片\n            if (this.data.tempFilePaths.length == MAX_IMG_NUM - 1) {\n                  this.setData({\n                        selectPhoto: true,\n                  })\n            }\n      },\n      detail() {\n            let that = this;\n            wx.navigateTo({\n                  url: '/pages/detail/detail?scene=' + that.data.detail_id,\n            })\n      }\n})"
  },
  {
    "path": "miniprogram/pages/publish/publish.json",
    "content": "{\n\"navigationBarTitleText\": \"发布物品\"\n}"
  },
  {
    "path": "miniprogram/pages/publish/publish.wxml",
    "content": "<view class=\"top_steps\">\n\t<van-steps steps=\"{{ steps }}\" active=\"{{ active }}\" active-color=\"#000000\" />\n</view>\n<view style=\"height:66.8px\"></view>\n<!--步骤一-->\n<van-transition show=\"{{ show_b }}\" name=\"fade-right\" custom-class=\"block\" duration=\"{{entime}}\">\n\t<view class=\"b_contain\">\n\n\t\t<view class=\"b_top\">\n\t\t\t<view class=\"b_content\">\n\t\t\t\t<view class=\"b_place\">\n\t\t\t\t\t<view class=\"b_plecebox\">\n\t\t\t\t\t\t<input maxlength=\"50\" placeholder=\"请输入您的每一物品名称,方便同学搜索，增加曝光率\" value=\"{{good}}\" bindinput=\"goodInput\" />\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<view class=\"b_notes\">\n\t\t\t\t\t<view class=\"b_text\">\n\t\t\t\t\t\t<textarea value=\"{{describe}}\" bindinput=\"describeInput\" maxlength=\"200\" placeholder=\"请输入物品的详细描述\"></textarea>\n\t\t\t\t\t\t<view class=\"b_less\">{{desc_counts}}/200</view>\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t\t<!-- </view> -->\n\t\t\t</view>\n\t\t</view>\n\t</view>\n\n\t<view class=\"pictures\">\n\t\t<view wx:key=\"index\" class=\"img_item\" wx:for=\"{{tempFilePaths}}\" data-index=\"{{index}}\">\n\t\t\t<image mode=\"aspectFit\" src=\"{{item}}\" />\n\t\t\t<van-icon bind:click=\"deletePic\" data-index=\"{{index}}\" name=\"close\" />\n\t\t</view>\n\t\t<view bindtap=\"chooseImage\" class=\"img_item upload-img\" hidden=\"{{!selectPhoto}}\">\n\t\t\t<van-icon name=\"plus\" />\n\t\t</view>\n\t</view>\n\n\t<view class=\"b_ccontain\">\n\t\t<view class=\"b_card\">\n\t\t\t<view class=\"b_bar\">\n\t\t\t\t<view class=\"b_name\">价格(元)</view>\n\t\t\t\t<van-stepper value=\"{{price}}\" integer bind:change=\"priceChange\" min=\"1\" max=\"10000\" />\n\t\t\t</view>\n\t\t\t<view class=\"b_border\"></view>\n\t\t\t<view class=\"b_bar\">\n\t\t\t\t<view class=\"b_name\">类别</view>\n\t\t\t\t<radio-group class=\"kind-group\" bindchange=\"kindChange\">\n\t\t\t\t\t<label class=\"b_radio\" wx:for=\"{{kind}}\" wx:key=\"id\">\n\t\t\t\t\t\t<radio color=\"#fbbd08\" value=\"{{item.id}}\" checked=\"{{item.check}}\" />{{item.name}}\n\t\t\t\t\t</label>\n\t\t\t\t</radio-group>\n\t\t\t</view>\n\t\t\t<!--选择类别的时候-->\n\t\t\t<block wx:if=\"{{chooseCollege}}\">\n\t\t\t\t<view class=\"b_border\"></view>\n\t\t\t\t<view class=\"b_bar\">\n\t\t\t\t\t<view class=\"b_name\">选择用途</view>\n\t\t\t\t\t<picker range=\"{{college}}\" range-key=\"name\" value=\"{{cids}}\" bindchange=\"choCollege\">\n\t\t\t\t\t\t<view class=\"b_picker\">\n\t\t\t\t\t\t\t<block wx:if=\"{{cids!==-1}}\">当前选择：{{college[cids].name}}</block>\n\t\t\t\t\t\t\t<block wx:if=\"{{cids==-1}}\">请选择用途类别</block>\n\t\t\t\t\t\t\t<image class=\"right\" src=\"/images/right.png\" />\n\t\t\t\t\t\t</view>\n\t\t\t\t\t</picker>\n\t\t\t\t</view>\n\t\t\t</block>\n\t\t\t<view class=\"b_border\"></view>\n\t\t\t<view class=\"b_bar\">\n\t\t\t\t<view class=\"name\">取货方式</view>\n\t\t\t\t<radio-group class=\"kind-group\" bindchange=\"delChange\">\n\t\t\t\t\t<label class=\"b_radio\" wx:for=\"{{delivery}}\" wx:key=\"id\">\n\t\t\t\t\t\t<radio color=\"#fbbd08\" value=\"{{item.id}}\" checked=\"{{item.check}}\" />{{item.name}}\n\t\t\t\t\t</label>\n\t\t\t\t</radio-group>\n\t\t\t</view>\n\t\t\t<block wx:if=\"{{chooseDelivery==0}}\">\n\t\t\t\t<view class=\"b_place\">\n\t\t\t\t\t<view class=\"b_plecebox\">\n\t\t\t\t\t\t<input maxlength=\"20\" placeholder=\"请输入您的详细地址\" value=\"{{place}}\" bindinput=\"placeInput\" />\n\t\t\t\t\t</view>\n\t\t\t\t</view>\n\t\t\t</block>\n\t\t\t<view class=\"b_bar\">\n\t\t\t\t<view class=\"name\">备注信息</view>\n\t\t\t\t<view class=\"b_nobi\">※必填</view>\n\t\t\t</view>\n\t\t\t<view class=\"b_notes\">\n\t\t\t\t<view class=\"b_text\">\n\t\t\t\t\t<textarea value=\"{{notes}}\" bindinput=\"noteInput\" maxlength=\"100\" placeholder=\"请补充物品相关的信息，也可填写您的微信号\"></textarea>\n\t\t\t\t\t<view class=\"b_less\">{{note_counts}}/100</view>\n\t\t\t\t</view>\n\t\t\t</view>\n\t\t\t<view class=\"b_bar\">\n\t\t\t\t<view class=\"name\">发布时长(天)</view>\n\t\t\t\t<van-stepper bind:change=\"duraChange\" value=\"{{dura}}\" min=\"1\" max=\"50\" />\n\t\t\t</view>\n\t\t\t<view class=\"b_tips\">\n\t\t\t\t<text>* </text>此时长内您的发布信息将会展示给所有同学，超时后您只需去个人中心处擦亮即可再次展示</view>\n\t\t</view>\n\t\t<view class=\"b_publish\" bindtap=\"check_pub\">马上发布</view>\n\t</view>\n</van-transition>\n<text class=\"font\" space=\"ensp\"> 如果你喜欢我们的小程序，支持我们一下，我们才有动力做出更好的功能</text>\n<ad unit-id=\"adunit-5fed763488239e91\" ad-type=\"video\" ad-theme=\"white\"></ad>\n\n<!--步骤二-->\n<van-transition show=\"{{ show_c }}\" name=\"fade-right\" custom-class=\"block\" duration=\"{{entime}}\">\n\t<view class=\"c_contain\" style=\"height:{{systeminfo.windowHeight-66.8}}px\">\n\t\t<image class=\"c_success\" src=\"/images/success.png\"></image>\n\t\t<view class=\"c_title\">恭喜您 发布成功</view>\n\t\t<view class=\"c_des\">订单的实时状态请在我的主页查看</view>\n\t\t<view class=\"c_see\" bindtap=\"detail\">查看详情</view>\n\t\t<view class=\"c_again shadow\" bindtap=\"initial\">再来一个</view>\n\t</view>\n\t<ad unit-id=\"adunit-5fed763488239e91\" ad-type=\"video\" ad-theme=\"white\"></ad>\n</van-transition>"
  },
  {
    "path": "miniprogram/pages/publish/publish.wxss",
    "content": "page {\n      background: #f6f7fa;\n}\n\n.top_steps {\n      position: fixed;\n      top: 0rpx;\n      left: 0rpx;\n      width: 100%;\n      z-index: 9;\n}\n.font{\n      font-size: 23rpx;\n      color: red;\n}\n.a_contain {\n      padding: 32rpx;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      box-sizing: border-box;\n      background: #fff;\n      box-shadow: 0 30rpx 20rpx rgb(240, 240, 240);\n}\n\n.a_inp {\n      width: 100%;\n      height: 76rpx;\n      background: #f8fafd;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      overflow: hidden;\n      border-radius: 38rpx;\n}\n\n.a_scan {\n      width: 40rpx;\n      height: 38rpx;\n      padding-left: 30rpx;\n}\n\n.a_inp input {\n      width: 420rpx;\n      font-size: 28rpx;\n      color: #aaaaab;\n      height: 100%;\n      letter-spacing: 2rpx;\n}\n\n.a_pla {\n      font-size: 27rpx;\n      color: #aaaaab;\n}\n\n.a_confirm {\n      width: 170rpx;\n      height: 100%;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background:#000;\n      border-radius: 36rpx;\n      color: #fff;\n      font-size: 28rpx;\n      letter-spacing: 4rpx;\n}\n\n.a_isbn {\n      margin-top: 40rpx;\n      width: 350rpx;\n      height: 350rpx;\n}\n\n.a_des {\n      margin-top: 30rpx;\n      font-size: 30rpx;\n      color: #aaaaab;\n      width: 450rpx;\n      text-align: center;\n      letter-spacing: 3rpx;\n      line-height: 50rpx;\n}\n\n.a_next {\n      padding-top: 20rpx;\n      width: 40rpx;\n      height: 30rpx;\n}\n\n.a_sao {\n      width: 100%;\n      padding-top: 50rpx;\n      display: flex;\n      justify-content: center;\n}\n\n.a_sao button {\n      width: 500rpx;\n      height: 80rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background: #FF6666;\n      color: #fff;\n      border-radius: 40rpx;\n      letter-spacing: 4rpx;\n      font-size: 32rpx;\n      border: none;\n      font-weight: 500;\n}\n\n.a_sao button::after {\n      border: none;\n}\n\n/*步骤二*/\n\n.b_contain {\n      padding: 32rpx;\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      box-sizing: border-box;\n      background: #fff;\n      box-shadow: 0 30rpx 20rpx rgb(240, 240, 240);\n}\n\n.b_top {\n      display: flex;\n      width: 100%;\n}\n\n.b_poster {\n      width: 270rpx;\n      display: flex;\n      justify-content: center;\n}\n\n.b_poster image {\n      width: 250rpx;\n      height: 250rpx;\n}\n\n.b_title {\n      width: 100%;\n      font-size: 32rpx;\n      line-height: 50rpx;\n      font-weight: 600;\n      letter-spacing: 2rpx;\n}\n\n.b_content {\n      width: 100%;\n      height: 250rpx;\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n}\n\n.b_dcontain {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      padding-bottom: 4rpx;\n}\n\n.b_author {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #000;\n}\n\n.b_price {\n      font-size: 30rpx;\n      color: rgb(255, 0, 0);\n      letter-spacing: 2rpx;\n      white-space: nowrap;\n}\n\n.b_des {\n      font-size: 26rpx;\n      display: -webkit-box;\n      -webkit-box-orient: vertical;\n      -webkit-line-clamp: 4;\n      overflow: hidden;\n      text-overflow: ellipsis;\n      color: #aaaaab;\n}\n\n/*步骤二输入内容*/\n\n.b_ccontain {\n      width: 100%;\n      padding: 32rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n}\n\n.b_card {\n      width: 100%;\n      padding: 40rpx 30rpx;\n      display: flex;\n      border-radius: 18rpx;\n      box-shadow: 0 0 20rpx #ebebeb;\n      flex-direction: column;\n      background: #fff;\n      box-sizing: border-box;\n}\n\n.b_border {\n      border-bottom: 1rpx solid #eee;\n      width: 100%;\n      height: 2rpx;\n}\n\n.b_bar {\n      height: 90rpx;\n      width: 100%;\n      box-sizing: border-box;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n}\n\n.kind-group {\n      display: flex;\n}\n\n.b_radio {\n      padding-left: 20rpx;\n      font-size: 28rpx;\n      display: flex;\n      align-items: center;\n}\n\n.b_radio radio {\n      transform: scale(0.8);\n}\n\n.b_name {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n}\n\n.b_picker {\n      font-size: 28rpx;\n      line-height: 30rpx;\n      display: flex;\n      align-items: center;\n      color: #8c9aa8;\n}\n\n.right {\n      padding-left: 10rpx;\n      width: 26rpx;\n      height: 26rpx;\n}\n\npicker {\n      display: flex;\n      align-items: center;\n}\n\n.b_notes {\n      width: 100%;\n      padding: 10rpx;\n      display: flex;\n      box-sizing: border-box;\n}\n\n.b_text {\n      width: 100%;\n      height: 150rpx;\n      padding: 20rpx;\n      border-radius: 10rpx;\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      box-sizing: border-box;\n      background: rgb(238, 238, 238);\n}\n\n.b_text textarea {\n      width: 100%;\n      height: 150rpx;\n      font-size: 28rpx;\n      color: #8c9aa8;\n      border-spacing: 2rpx;\n}\n\n.b_less {\n      display: flex;\n      justify-content: flex-end;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #8c9aa8;\n}\n\n.b_place {\n      width: 100%;\n      padding: 10rpx;\n      display: flex;\n      box-sizing: border-box;\n}\n\n.b_plecebox {\n      width: 100%;\n      height: 80rpx;\n      padding: 0 20rpx;\n      border-radius: 10rpx;\n      display: flex;\n      align-items: center;\n      box-sizing: border-box;\n      background: rgb(238, 238, 238);\n}\n\n.b_plecebox input {\n      width: 100%;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #8c9aa8;\n}\n\n.b_tips {\n      font-size: 26rpx;\n      line-height: 45rpx;\n      color: #8c9aa8;\n}\n\n.b_tips text {\n      color: rgb(255, 0, 0);\n      font-size: 30rpx;\n}\n\n.b_nobi {\n      font-size: 28rpx;\n      color: #8c9aa8;\n}\n\n.b_publish {\n      margin-top: 30rpx;\n      width: 100%;\n      height: 80rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background:#fbbd08;\n      color: #fff;\n      border-radius: 40rpx;\n      letter-spacing: 4rpx;\n      font-size: 32rpx;\n      border: none;\n      font-weight: 500;\n}\n\n.ban_publish {\n      margin-top: 30rpx;\n      width: 100%;\n      height: 80rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background:gray;\n      color: #fff;\n      border-radius: 40rpx;\n      letter-spacing: 4rpx;\n      font-size: 32rpx;\n      border: none;\n      font-weight: 500;\n}\n.c_contain {\n      position: relative;\n      width: 100%;\n      background: #fff;\n      display: flex;\n      align-items: center;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.c_success {\n      width: 145rpx;\n      height: 184rpx;\n      margin-top: 130rpx;\n}\n\n.c_title {\n      font-size: 40rpx;\n      margin-top: 30rpx;\n      font-weight: 600;\n}\n\n.c_des {\n      margin-top: 30rpx;\n      font-size: 28rpx;\n      line-height: 45rpx;\n      color: #898989;\n}\n\n.c_see {\n      margin-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 3rpx;\n      color: #4f93ea;\n}\n\n.c_again {\n      margin-top: 40rpx;\n      width: 500rpx;\n      height: 80rpx;\n      border-radius: 40rpx;\n      background: #fbbd08;\n      color: #fff;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 32rpx;\n      letter-spacing: 4rpx;\n}\n.title{\n\tborder-bottom: solid 2rpx #eee;\n}\n.title input{\n\tfont-size:30rpx;\n}\n.description textarea{\n\theight: 240rpx !important;\n}\n.main{\n\tposition: relative;\n\tbackground-color: white;\n\tpadding-bottom: 30rpx;\n\t/*height: 560rpx;*/\n}\n.van-icon-plus{\n\tposition: absolute !important;\n\tleft: 50%;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n}\n.upload-img{\n\tfont-size: 100rpx;\n\tcolor: gray;\n\tposition: relative;\n\t/*bottom: 25rpx;\n\tleft: 30rpx;*/\n}\n.pictures{\n      background-color: white;\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap:wrap;\n}\n.img_item{\n\tposition: relative;\n\tbackground-color: #eee;\n\twidth: 150rpx;\n\theight: 150rpx;\n\tborder-radius: 8rpx;\n\tmargin-left: 30rpx;\n      margin-block-end: 20rpx;\n}\n.img_item .van-icon-close{\n\tposition: absolute;\n\ttop:-10rpx;\n\tright:-10rpx;\n\tcolor:red;\n}\n.img_item image{\n\twidth: 150rpx;\n\theight: 150rpx;\n\tborder-radius: 8rpx;\n}\n.new_tag{\n\tmargin-left: 30rpx;\n\tmargin-top: 20rpx;\n}\n.new_tag .van-checkbox__label{\n\tfont-size: 28rpx;\n\tcolor: gray;\n}\n.sale_detail{\n\tmargin-top: 20rpx;\n}\n.publish_btn{\n\twidth: 80%;\n\tbackground-color: #0fb7e0;\n\tborder: none;\n\tcolor: white;\n\tmargin-top: 40rpx;\n}"
  },
  {
    "path": "miniprogram/pages/search/search.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            scrollTop: 0,\n            newlist: [],\n            list: [],\n            key: '',\n            blank: false,\n            hislist: [],\n            nomore:false,\n      },\n      onLoad: function(options) {\n            this.gethis();\n            this.getnew();\n      },\n      //获取本地记录\n      gethis() {\n            let that = this;\n            wx.getStorage({\n                  key: 'history',\n                  success: function(res) {\n                        let hislist = JSON.parse(res.data);\n                        //限制长度\n                        if (hislist.length > 5) {\n                              hislist.length = 5\n                        }\n                        that.setData({\n                              hislist: hislist\n                        })\n                  },\n            })\n      },\n      //选择历史搜索关键词\n      choosekey(e) {\n            this.data.key = e.currentTarget.dataset.key;\n            this.search('his');\n      },\n      //最新推荐书籍\n      getnew() {\n            let that = this;\n            db.collection('publish').where({\n                  status: 0,\n                  dura: _.gt(new Date().getTime()),\n            }).orderBy('creat', 'desc').get({\n                  success: function(res) {\n                        let newlist = res.data;\n                        //限定5个推荐内容\n                        if (newlist.length > 5) {\n                              newlist.length = 5;\n                        }\n                        that.setData({\n                              newlist: newlist,\n                        })\n                  }\n            })\n      },\n      //跳转详情\n      detail(e) {\n            let that = this;\n            wx.navigateTo({\n                  url: '/pages/detail/detail?scene=' + e.currentTarget.dataset.id,\n            })\n      },\n      //搜索结果\n      search(n) {\n            let that = this;\n            let key = that.data.key;\n            if (key == '') {\n                  wx.showToast({\n                        title: '请输入关键词',\n                        icon: 'none',\n                  })\n                  return false;\n            }\n            wx.setNavigationBarTitle({\n                  title:'\"'+ that.data.key + '\"的搜索结果',\n            })\n            wx.showLoading({\n                  title: '加载中',\n            })\n            if (n !== 'his') {\n                  that.history(key);\n            }\n            db.collection('publish').where({\n                  status: 0,\n                  dura: _.gt(new Date().getTime()),\n                  key: db.RegExp({\n                        regexp: '.*' + key + '.*',\n                        options: 'i',\n                  })\n            }).orderBy('creat', 'desc').limit(20).get({\n                  success(e) {\n                        wx.hideLoading();\n                        that.setData({\n                              blank: true,\n                              page: 0,\n                              list: e.data,\n                              nomore: false,\n                        })\n                  }\n            })\n      },\n      onReachBottom() {\n            this.more();\n      },\n      //添加到搜索历史\n      history(key) {\n            let that = this;\n            wx.getStorage({\n                  key: 'history',\n                  success(res) {\n                        let oldarr = JSON.parse(res.data); //字符串转数组\n                        let newa = [key]; //对象转为数组\n                        let newarr = JSON.stringify(newa.concat(oldarr)); //连接数组\\转字符串\n                        wx.setStorage({\n                              key: 'history',\n                              data: newarr,\n                        })\n                  },\n                  fail(res) {\n                        //第一次打开时获取为null\n                        let newa = [key]; //对象转为数组\n                        var newarr = JSON.stringify(newa); //数组转字符串\n                        wx.setStorage({\n                              key: 'history',\n                              data: newarr,\n                        })\n                  }\n            });\n      },\n      keyInput(e) {\n            this.data.key = e.detail.value\n      },\n      //至顶\n      gotop() {\n            wx.pageScrollTo({\n                  scrollTop: 0\n            })\n      },\n      //监测屏幕滚动\n      onPageScroll: function (e) {\n            this.setData({\n                  scrollTop: parseInt((e.scrollTop) * wx.getSystemInfoSync().pixelRatio)\n            })\n      },\n      //加载更多\n      more() {\n            let that = this;\n            if (that.data.nomore || that.data.list.length < 20) {\n                  return false\n            }\n            let page = that.data.page + 1;\n            if (that.data.collegeCur == -2) {\n                  var collegeid = _.neq(-2); //除-2之外所有\n            } else {\n                  var collegeid = that.data.collegeCur + '' //小程序搜索必须对应格式\n            }\n            db.collection('publish').where({\n                  status: 0,\n                  dura: _.gt(new Date().getTime()),\n                  key: db.RegExp({\n                        regexp: '.*' + that.data.key + '.*',\n                        options: 'i',\n                  })\n            }).orderBy('creat', 'desc').skip(page * 20).limit(20).get({\n                  success: function (res) {\n                        if (res.data.length == 0) {\n                              that.setData({\n                                    nomore: true\n                              })\n                              return false;\n                        }\n                        if (res.data.length < 20) {\n                              that.setData({\n                                    nomore: true\n                              })\n                        }\n                        that.setData({\n                              page: page,\n                              list: that.data.list.concat(res.data)\n                        })\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n})\n"
  },
  {
    "path": "miniprogram/pages/search/search.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/search/search.wxml",
    "content": "<wxs src=\"../../common.wxs\" module=\"morejs\" />\n<view class=\"top_contain\">\n      <view class=\"search_box\">\n            <image src=\"/images/search.png\"></image>\n            <input bindinput=\"keyInput\" bindconfirm=\"search\" placeholder=\"输入您感兴趣的内容\"></input>\n      </view>\n      <view class=\"search\" bindtap=\"search\">搜索</view>\n</view>\n\n<view class=\"contain\">\n      <block wx:if=\"{{list.length==0}}\">\n            <block wx:if=\"{{!blank}}\">\n                  <view class=\"a\">\n                        <image src=\"/images/his.png\"></image>\n                        <view>搜索历史</view>\n                  </view>\n                  <block wx:if=\"{{hislist.length==0}}\">\n                        <view class=\"nosearch\">您还没搜索过哟，赶快试试吧</view>\n                  </block>\n                  <block wx:if=\"{{hislist.length>0}}\">\n                        <block wx:for=\"{{hislist}}\" wx:key=\"*this\">\n                              <view bindtap=\"choosekey\" data-key=\"{{item}}\" class=\"hisitem\">{{index+1}}. {{item}}</view>\n                        </block>\n                  </block>\n            </block>\n            <block wx:if=\"{{blank}}\">\n                  <view class=\"a\">\n                        <image src=\"/images/result.png\"></image>\n                        <view>搜索结果</view>\n                  </view>\n                  <!--无内容显示-->\n                  <view class=\"nocontent\">\n                        <image src=\"/images/blank.png\"></image>\n                        <view class=\"blank_text\">暂无{{key}}相关物品哟~</view>\n                  </view>\n            </block>\n            <view class=\"a\">\n                  <image src=\"/images/recommend.png\"></image>\n                  <view>更多推荐</view>\n            </view>\n            <block wx:if=\"{{newlist.length==0}}\">\n                  <view class=\"nosearch\">暂无相关推荐</view>\n            </block>\n            <block wx:if=\"{{newlist.length>0}}\">\n                  <block wx:for=\"{{newlist}}\" wx:key=\"_id\">\n                        <view class=\"list_box\" bindtap=\"detail\" data-id=\"{{item._id}}\">\n                              <image class=\"list_poster\" src=\"{{item.bookinfo.pic[0]}}\"></image>\n                              <view class=\"list_content\">\n                                    <view class=\"list_word\">\n                                          <view class=\"list_title text-cut\">{{item.bookinfo.good}}\n                                          </view>\n                                          <!-- <view class=\"list_author text-cut\">{{item.bookinfo.author}}\n                                          </view> -->\n                                    </view>\n                                    <view class=\"list_between\">\n                                          <view class=\"list_price\">￥{{item.price}}元</view>\n                                          <view class=\"list_time\">{{morejs.timelog(item.creat )}}发布\n                                          </view>\n                                    </view>\n                              </view>\n                        </view>\n                  </block>\n            </block>\n      </block>\n      <block wx:if=\"{{list.length>0}}\">\n            <view class=\"a\">\n                  <image src=\"/images/result.png\"></image>\n                  <view>搜索结果</view>\n            </view>\n            <block wx:for=\"{{list}}\" wx:key=\"_id\">\n                  <view class=\"list_box\" bindtap=\"detail\" data-id=\"{{item._id}}\">\n                        <image class=\"list_poster\" src=\"{{item.bookinfo.pic[0]}}\"></image>\n                        <view class=\"list_content\">\n                              <view class=\"list_word\">\n                                    <view class=\"list_title text-cut\">{{item.bookinfo.good}}\n                                    </view>\n                              </view>\n                              <view class=\"list_between\">\n                                    <view class=\"list_price\">￥{{item.price}}元</view>\n                                    <view class=\"list_time\">{{morejs.timelog(item.creat )}}发布\n                                    </view>\n                              </view>\n                        </view>\n                  </view>\n            </block>\n      </block>\n</view>\n\n\n\n<block wx:if=\"{{list.length>10}}\">\n      <import src=\"/common.wxml\" />\n      <template is=\"loadmore\" data=\"{{nomore}}\" />\n</block>\n<van-transition show=\"{{ scrollTop>500 }}\" custom-class=\"block\" duration=\"600\">\n      <view class=\"totop\" bindtap=\"gotop\">\n            <image src=\"/images/top.png\"></image>\n      </view>\n</van-transition>"
  },
  {
    "path": "miniprogram/pages/search/search.wxss",
    "content": ".top_contain {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      padding: 20rpx 30rpx;\n      box-sizing: border-box;\n      background:   #fbbd08;\n      height: 106rpx;\n      align-items: center;\n}\n\n.search_box {\n      width: 80%;\n      height: 66rpx;\n      border-radius: 33rpx 0 0 33rpx;\n      background: #fff;\n      display: flex;\n      align-items: center;\n}\n\n.search_box image {\n      padding-left: 30rpx;\n      width: 32rpx;\n      height: 32rpx;\n}\n\n.search_box input {\n      padding-left: 10rpx;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: rgb(167, 167, 167);\n      background: #fff;\n      height: 66rpx;\n      width: 500rpx;\n}\n\n.search {\n      width: 20%;\n      height: 66rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      background:#fbbd08;\n      color: #fff;\n      font-size: 28rpx;\n      border-radius: 0 33rpx 33rpx 0;\n      letter-spacing: 4rpx;\n}\n\n.contain {\n      width: 100%;\n      padding: 0 30rpx;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n}\n\n.a {\n      display: flex;\n      align-items: center;\n      border-bottom: 1rpx solid #eee;\n      width: 100%;\n      padding: 20rpx 0;\n}\n\n.a image {\n      width: 36rpx;\n      height: 36rpx;\n}\n\n.a view {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n      padding-left: 20rpx;\n}\n\n.hisitem {\n      width: 100%;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #919191;\n      padding: 16rpx 0;\n}\n\n.list_box {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      padding: 20rpx 0;\n      box-sizing: border-box;\n      margin-top: 10rpx;\n}\n\n.list_poster {\n      width: 200rpx;\n      height: 200rpx;\n}\n\n.list_content {\n      height: 200rpx;\n      width: calc(100% - 230rpx);\n      display: flex;\n      flex-direction: column;\n      justify-content: space-between;\n      padding: 0 10rpx;\n      box-sizing: border-box;\n}\n\n.list_word {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n      box-sizing: border-box;\n}\n\n.list_title {\n      width: 100%;\n      font-size: 32rpx;\n      letter-spacing: 3rpx;\n      line-height: 45rpx;\n}\n\n.list_author {\n      padding-top: 10rpx;\n      width: 100%;\n      font-size: 27rpx;\n      letter-spacing: 3rpx;\n      line-height: 40rpx;\n      color: rgb(129, 129, 129);\n}\n\n.list_between {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: flex-end;\n      border-bottom: 1rpx solid #eee;\n      padding-bottom: 10rpx;\n}\n\n.list_price {\n      font-size: 36rpx;\n      color: rgb(255, 0, 0);\n}\n\n.list_time {\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: rgb(129, 129, 129);\n}\n\n\n.nocontent {\n      width: 100%;\n      height: 400rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.nocontent image {\n      padding-left: 80rpx;\n      width: 300rpx;\n      height: 240rpx;\n}\n.blank_text{\n      padding-top: 40rpx;\n      font-size: 28rpx;\n      letter-spacing: 2rpx;\n      color: #c6c6c8;\n}\n.nosearch{ \n      width: 100%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-size: 28rpx;\n      height: 100rpx;\n      color: #919191;\n      letter-spacing: 4rpx;\n}\n"
  },
  {
    "path": "miniprogram/pages/sell/detail/detail.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            userinfo: [],\n            creatTime: '',\n            detail: [],\n            status: Number,\n            openid: app.openid,\n      },\n      onLoad: function (e) {\n            if (app.openid) {\n                  this.setData({\n                        openid: app.openid\n                  })\n            } else {\n                  console.log(\"no openid\");\n                  wx.showModal({\n                        title: '温馨提示',\n                        content: '该功能需要注册方可使用，是否马上去注册',\n                        success(res) {\n                              if (res.confirm) {\n                                    wx.navigateTo({\n                                          url: '/pages/login/login',\n                                    })\n                              }\n                        }\n                  })\n                  return false\n            }\n            this.getdetail(e.id);\n      },\n\n      //回到首页\n      home() {\n            wx.switchTab({\n                  url: '/pages/index/index',\n            })\n      },\n      //获取订单详情,差一个获取买家昵称\n      getdetail(_id) {\n            let that = this;\n            db.collection('order').doc(_id).get({\n                  success(e) {\n                        that.setData({\n                              creatTime: config.formTime(e.data.creat),\n                              detail: e.data\n                        })\n                        that.getSeller(e.data.seller);\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败，请稍后到订单中心内查看',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n      //获取卖家信息\n      getSeller(m) {\n            let that = this;\n            db.collection('user').where({\n                  _openid: m\n            }).get({\n                  success: function (res) {\n                        wx.hideLoading();\n                        that.setData({\n                              userinfo: res.data[0]\n                        })\n                  }\n            })\n      },\n\n      //确认收货\n      confirm() {\n            let that = this;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要此条订单完成了吗？',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              wx.cloud.callFunction({\n                                    name: 'pay',\n                                    data: {\n                                          $url: \"changeP\", //云函数路由参数\n                                          _id: that.data.detail.sellid,\n                                          status: 2 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款\n                                    },\n                                    success: res => {\n                                          console.log('修改订单状态成功')\n                                          wx.cloud.callFunction({\n                                                name: 'pay',\n                                                data: {\n                                                      $url: \"changeO\", //云函数路由参数\n                                                      _id: that.data.detail._id,\n                                                      status: 2 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款\n                                                },\n                                                success: res => {\n                                                      wx.showToast({\n                                                            title: '交易成功！',\n                                                            icon: 'none'\n                                                      })\n                                                      that.getdetail(that.data.detail._id);\n                                                      wx.showModal({\n                                                            title: '打赏小程序',\n                                                            content: '请开发者喝阔落？',\n                                                            showCancel: true, \n                                                            cancelText:'下次一定',\n                                                            confirmText:'现在就去',\n                                                            confirmColor: '#fbbd08', \n                                                            success(res) {\n                                                                  if (res.confirm) {\n                                                                        wx.previewImage({\n                                                                              urls: ['https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/appreciate-code/appreciateimg.jpg?sign=b6789b4ae3b6c830689f41ddca8f183e&t=1597523262'],\n                                                                        })\n                                                                  }\n                                                            }\n                                                      })\n                                                },\n                                                fail(e) {\n                                                      wx.hideLoading();\n                                                      wx.showToast({\n                                                            title: '发生异常，请及时和管理人员联系处理',\n                                                            icon: 'none'\n                                                      })\n                                                }\n                                          })\n                                    },\n                                    fail(e) {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '发生异常，请及时和管理人员联系处理',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      //删除订单\n      delete() {\n            let that = this;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确认要删除此订单吗',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在处理',\n                              })\n                              db.collection('publish').doc(that.data.detail._id).remove({\n                                    success() {\n                                          //页面栈返回\n                                          let i = getCurrentPages()\n                                          wx.navigateBack({\n                                                success: function () {\n                                                      i[i.length - 2].getlist();\n                                                }\n                                          });\n                                    },\n                                    fail: console.error\n                              })\n                        }\n                  }\n            })\n      },\n      //复制\n      copy(e) {\n            wx.setClipboardData({\n                  data: e.currentTarget.dataset.copy,\n                  success: res => {\n                        wx.showToast({\n                              title: '复制' + e.currentTarget.dataset.name + '成功',\n                              icon: 'success',\n                              duration: 1000,\n                        })\n                  }\n            })\n      },\n\n      //历史记录\n      history(name, num, type) {\n            let that = this;\n            db.collection('history').add({\n                  data: {\n                        stamp: new Date().getTime(),\n                        type: type, //1充值2支付\n                        name: name,\n                        num: num,\n                        oid: app.openid\n                  },\n                  success: function (res) {\n                        console.log(res)\n                  },\n                  fail: console.error\n            })\n      },\n\n      goo(e) {\n            var myid = this.data.detail.buyerInfo._openid;\n            var sallerid = this.data.detail.seller;\n            wx.cloud.init({\n                  env: 'taoshaoji-46f0r',\n                  traceUser: true\n            });\n            //初始化数据库\n            const db = wx.cloud.database();\n            if (myid != sallerid) {\n                  db.collection('rooms').where({\n                        p_b: myid,\n                        p_s: sallerid,\n                        deleted :0\n                  }).get().then(res => {\n                        console.log(res.data);\n                        if (res.data.length > 0) {\n                              this.setData({\n                                    roomID: res.data[0]._id\n                              })\n                              wx.navigateTo({\n                                    url: '/pages/detail/room/room?id=' + this.data.roomID,\n                              })\n                        } else {\n                              db.collection('rooms').add({\n                                    data: {\n                                          p_b: myid,\n                                          p_s: sallerid,\n                                          deleted :0\n                                    },\n                              }).then(res => {\n                                    console.log(res)\n                                    this.setData({\n                                          roomID: res._id\n                                    })\n                                    wx.navigateTo({\n                                          url: '/pages/detail/room/room?id=' + this.data.roomID,\n                                    })\n                              })\n                        }\n                  })\n            } else {\n                  wx.showToast({\n                        title: '无法和自己建立聊天',\n                        icon: 'none',\n                        duration: 1500\n                  })\n            }\n      },\n\n})"
  },
  {
    "path": "miniprogram/pages/sell/detail/detail.json",
    "content": "{\n    \"navigationBarTitleText\": \"订单详情\"\n}"
  },
  {
    "path": "miniprogram/pages/sell/detail/detail.wxml",
    "content": "<view class=\"contain\">\n\t<view class=\"card\">\n\t\t<view class=\"goods_box\">\n\t\t\t<image class=\"goods_img\" src=\"{{detail.bookinfo.pic[0]}}\"></image>\n\t\t\t<view class=\"goods_content\">\n\t\t\t\t<view class=\"goods_title text-cut\">{{detail.bookinfo.good}}</view>\n\t\t\t\t<view class=\"goods_author text-cut\">买家：{{detail.buyerInfo.info.nickName}}</view>\n\t\t\t</view>\n\t\t\t<view class=\"goods_price\">￥{{detail.price}}元</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"list\">\n\t\t\t<view class=\"list_1\">{{detail.deliveryid==0?'需要自提':'卖家帮送'}}</view>\n\t\t\t<view class=\"list_2\">买家地址：{{detail.deliveryid==0?detail.ztplace:detail.psplace}}</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"orderfare\">ORDER FARE</view>\n\t\t<view class=\"fare_box\">\n\t\t\t<view class=\"fare_title\">下单时间</view>\n\t\t\t<view class=\"fare_des\">{{creatTime}}</view>\n\t\t</view>\n\t\t<view class=\"fare_box\">\n\t\t\t<view class=\"fare_title\">支付金额</view>\n\t\t\t<view class=\"fare_des\">￥{{detail.price}}.00元</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"orderfare\">CONTACT BUYER</view>\n\t\t<view class=\"fare_box\" bindtap=\"copy\" data-copy=\"{{userinfo.email}}\" data-name=\"邮箱\">\n\t\t\t<view class=\"fare_title\">邮箱</view>\n\t\t\t<view class=\"fare_des\">{{detail.buyerInfo.email}}</view>\n\t\t</view>\n\t\t<view class=\"fare_box\" wx:if=\"{{detail.buyerInfo.qqnum!==''}}\" bindtap=\"copy\" data-copy=\"{{userinfo.qqnum}}\" data-name=\"QQ\">\n\t\t\t<view class=\"fare_title\">QQ</view>\n\t\t\t<view class=\"fare_des\">{{detail.buyerInfo.qqnum}}</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"bot_box\" wx:if=\"{{detail.status==1}}\">\n\t\t\t<view class=\"delete\">买家未确认收货</view>\n\t\t</view>\n\t\t<view class=\"border\"></view>\n\t\t<view class=\"bot_box\" wx:if=\"{{detail.status==5}}\">\n\t\t\t<view class=\"contact\" bindtap=\"confirm\">完成交易</view>\n\t\t</view>\n\t\t<view class=\"bot_box\">\n\t\t\t<view wx:if=\"{{detail.status==2||detail.status==3}}\" class=\"delete\" bindtap=\"delete\">删除订单</view>\n\t\t</view>\n\t</view>\n</view>\n\n<!--悬浮聊天功能-->\n<view class=\"contact_box\" bindtap=\"goo\" data-id=\"{{roomID}}\">\n\t<image src=\"/images/chat.png\"></image>\n\t<view>私聊</view>\n</view>"
  },
  {
    "path": "miniprogram/pages/sell/detail/detail.wxss",
    "content": "page {\n  background-image: linear-gradient(to top, #dad4ec 0%, #dad4ec 1%, #f3e7e9 100%);\n}\n.contain {\n  display: flex;\n  padding: 20rpx 28rpx;\n  width: 100%;\n  box-sizing: border-box;\n}\n\n.card {\n  width: 100%;\n  background: #fff;\n  position: relative;\n  display: flex;\n  flex-direction: column;\n  box-sizing: border-box;\n  padding: 40rpx 25rpx;\n}\n\n.top_over {\n  width: 100%;\n  height: 20rpx;\n  position: absolute;\n  left: 0rpx;\n  top: -10rpx;\n}\n\n.bot_over {\n  width: 100%;\n  height: 20rpx;\n  position: absolute;\n  left: 0rpx;\n  bottom: -10rpx;\n}\n\n.goods_box {\n  width: 100%;\n  display: flex;\n  box-sizing: border-box;\n  align-items: center;\n  height: 100rpx;\n}\n\n.goods_img {\n  width: 90rpx;\n  height: 90rpx;\n}\n\n.goods_content {\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  padding-left: 20rpx;\n  width: calc(100% - 240rpx);\n  height: 90%;\n}\n\n.goods_title {\n  font-size: 29rpx;\n  letter-spacing: 3rpx;\n}\n\n.goods_author {\n  font-size: 26rpx;\n  letter-spacing: 2rpx;\n  color: rgb(150, 150, 150);\n}\n\n.goods_price {\n  width: 150rpx;\n  height: 100%;\n  font-size: 32rpx;\n  color: #f00;\n  white-space: nowrap;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.border {\n  width: 100%;\n  height: 20rpx;\n  border-bottom: 1rpx solid #eee;\n}\n\n.list {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  padding: 30rpx 0 10rpx 0;\n}\n\n.list_1 {\n  font-size: 26rpx;\n  color: rgb(167, 167, 167);\n  letter-spacing: 2rpx;\n}\n\n.list_2 {\n  padding-top: 10rpx;\n  font-size: 32rpx;\n  letter-spacing: 3rpx;\n}\n\n.orderfare {\n  margin-top: 28rpx;\n  font-size: 22rpx;\n  font-weight: 600;\n  letter-spacing: 2rpx;\n  color: rgb(167, 167, 167);\n  padding-bottom: 20rpx;\n}\n\n.fare_box {\n  display: flex;\n  width: 100%;\n  justify-content: space-between;\n  align-items: center;\n  padding: 10rpx 0;\n}\n\n.fare_title {\n  font-size: 28rpx;\n  letter-spacing: 2rpx;\n}\n\n.fare_des {\n  font-size: 27rpx;\n  color: rgb(167, 167, 167);\n}\n.bot_box{\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n}\n.cancel {\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #000;\n  color: #fff;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 40rpx;\n   letter-spacing: 4rpx;\n}\n\n.contact {\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #fbbd08;\n  color: #000;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 20rpx;\n  letter-spacing: 4rpx;\n}\n.delete{\n  font-size: 30rpx;\n  width: 620rpx;\n  height: 80rpx;\n  background: #adadad;\n  color: #fff;\n  border-radius: 20rpx;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-top: 20rpx;\n  letter-spacing: 4rpx;\n}\n\n\n.contact_box {\n  z-index: 9;\n  position: fixed;\n  bottom: 200rpx;\n  right: 40rpx;\n  display: flex;\n  width: 100rpx;\n  flex-direction: column;\n  align-items: center;\n  background: rgba(255, 255, 255, 0.8);\n  padding: 20rpx 0;\n  border-radius: 50rpx 50rpx 20rpx 20rpx;\n  box-shadow: 0 0 20rpx #f0f0f0 !important;\n}\n\n.contact_box image {\n  width: 80rpx;\n  height: 80rpx;\n}\n\n.contact_box view {\n  font-size: 26rpx;\n  letter-spacing: 2rpx;\n  margin-top: 10rpx;\n}"
  },
  {
    "path": "miniprogram/pages/sell/list/list.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            list: [],\n            page: 1,\n            scrollTop: 0,\n            nomore: false,\n            roomlist: [],\n            buyerInfo: [],\n            address: '',\n            sellerInfo: '',\n      },\n      /**\n       * 生命周期函数--监听页面加载\n       */\n      onLoad: function (options) {\n            wx.showLoading({\n                  title: '加载中',\n            })\n            this.getList();\n      },\n\n      /**\n       * 获取买家名字\n       */\n      getBuyerInfo(orderid) {\n            let that = this;\n            db.collection('order').where({\n                  sellid: orderid,\n            }).get({\n                  success: function (res) {\n                        that.setData({\n                              buyerInfo: res.data[0],\n                        })\n                  }\n            })\n      },\n\n      getList() {\n            let that = this;\n            db.collection('publish').where({\n                  _openid: app.openid\n            }).orderBy('creat', 'desc').limit(20).get({\n                  success: function (res) {\n                        wx.hideLoading();\n                        wx.stopPullDownRefresh(); //暂停刷新动作\n                        that.setData({\n                              list: res.data,\n                              nomore: false,\n                              page: 0,\n                        })\n                        console.log(res.data)\n                  }\n            })\n      },\n      //删除\n      del(e) {\n            let that = this;\n            let del = e.currentTarget.dataset.del;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要删除此条订单吗？',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在删除'\n                              })\n                              db.collection('publish').doc(del._id).remove({\n                                    success() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '成功删除',\n                                          })\n                                          that.getList();\n                                    },\n                                    fail() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '删除失败',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      //擦亮\n      crash(e) {\n            let that = this;\n            let crash = e.currentTarget.dataset.crash;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要擦亮此条订单吗？',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在擦亮'\n                              })\n                              db.collection('publish').doc(crash._id).update({\n                                    data: {\n                                          creat: new Date().getTime(),\n                                          dura: new Date().getTime() + 7 * (24 * 60 * 60 * 1000), //每次擦亮管7天\n                                    },\n                                    success() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '成功擦亮',\n                                          })\n                                          that.getList();\n                                    },\n                                    fail() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '操作失败',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      //取消交易\n      quxiao(e) {\n            let that = this;\n            let quxiao = e.currentTarget.dataset.quxiao;\n            that.getBuyerInfo(quxiao._id);\n            that.getSellerInfo()\n            console.log(\"sellname--->\" + that.data.sellerName)\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要取消此条订单吗？',\n                  success(res) {\n                        if (res.confirm) {\n                              that.getAddress()\n                              wx.showLoading({\n                                    title: '正在取消'\n                              })\n                              db.collection('publish').doc(quxiao._id).update({\n                                    data: {\n                                          status: 3,\n                                    },\n                                    success() {\n                                          wx.cloud.callFunction({\n                                                name: 'removeOrder',\n                                                data: {\n                                                      _id: quxiao._id,\n                                                },\n                                                success: res => {\n                                                      wx.hideLoading();\n                                                      wx.showToast({\n                                                            title: '成功取消该订单',\n                                                      })\n                                                      that.sendCancel(that.data.buyerInfo._openid)\n                                                      that.getList();\n                                                },\n                                                fail(e) {\n                                                      wx.hideLoading();\n                                                      wx.showToast({\n                                                            title: '发生异常，请及时和管理人员联系处理',\n                                                            icon: 'none'\n                                                      })\n                                                }\n                                          })\n                                    },\n                                    fail() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '操作失败',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n\n                        }\n                  }\n            })\n      },\n      //获取当前的用户昵称\n      getSellerInfo() {\n            let that = this;\n            db.collection('user').where({\n                  _openid: app.openid\n            }).get().then(res => {\n                  console.log(res.data[0]);\n                  that.setData({\n                        sellerInfo: res.data[0].info\n                  })\n            })\n      },\n      /**\n       * 获取地址\n       */\n      getAddress() {\n            let that = this;\n            if (that.data.buyerInfo.deliveryid == 0) {\n                  that.setData({\n                        address: that.data.buyerInfo.ztplace\n                  })\n            } else {\n                  that.setData({\n                        address: that.data.buyerInfo.psplace\n                  })\n            }\n      },\n      //发送模板消息到指定用户,推送之前要先获取用户的openid\n      sendCancel(openid) {\n            let that = this;\n            wx.cloud.callFunction({\n                  name: \"sendMsg\",\n                  data: {\n                        openid: openid,\n                        status: '卖家取消交易', //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；\n                        address: that.data.address,\n                        describe: that.data.buyerInfo.bookinfo.describe,\n                        good: that.data.buyerInfo.bookinfo.good,\n                        nickName: that.data.sellerInfo.nickName,\n                        color: 'yellow'\n                  }\n            }).then(res => {\n                  console.log(\"推送消息成功\", res)\n            }).catch(res => {\n                  console.log(\"推送消息失败\", res)\n            })\n      },\n      //完成交易\n      wancheng(e) {\n            let that = this;\n            let wancheng = e.currentTarget.dataset.wancheng._id;\n            console.log(\"wancheng:\" + wancheng)\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要此条订单完成了吗？',\n                  success(res) {\n                        console.log(e.currentTarget.data)\n                        db.collection('order').doc(wancheng).get({\n                              success(e) {\n                                    if (res.confirm) {\n                                          if (e.data.status == 5) {\n                                                wx.showLoading({\n                                                      title: '正在操作'\n                                                })\n                                                wx.cloud.callFunction({\n                                                      name: 'pay',\n                                                      data: {\n                                                            $url: \"changeP\", //云函数路由参数\n                                                            _id: wancheng,\n                                                            status: 2 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款；4、等待卖家确认交易\n                                                      },\n                                                      success: res => {\n                                                            console.log('修改卖家订单状态成功')\n                                                            wx.cloud.callFunction({\n                                                                  name: 'pay',\n                                                                  data: {\n                                                                        $url: \"changeO\", //云函数路由参数\n                                                                        _id: wancheng,\n                                                                        status: 2 //0在售；1买家已付款，但卖家未发货；2买家确认收获，交易完成；3、交易作废，退还买家钱款；4、等待卖家确认交易\n                                                                  },\n                                                                  success: res => {\n                                                                        wx.showToast({\n                                                                              title: '交易成功！',\n                                                                              icon: 'none'\n                                                                        })\n                                                                        that.getList();\n                                                                        wx.showModal({\n                                                                              title: '打赏小程序',\n                                                                              content: '请开发者喝阔落？',\n                                                                              showCancel: true, \n                                                                              cancelText:'下次一定',\n                                                                              confirmText:'现在就去',\n                                                                              confirmColor: '#fbbd08', \n                                                                              success(res) {\n                                                                                    if (res.confirm) {\n                                                                                          wx.previewImage({\n                                                                                                urls: ['https://7461-taoshaoji-46f0r-1302243411.tcb.qcloud.la/appreciate-code/appreciateimg.jpg?sign=b6789b4ae3b6c830689f41ddca8f183e&t=1597523262'],\n                                                                                          })\n                                                                                    }\n                                                                              }\n                                                                        })\n                                                                  },\n                                                                  fail(e) {\n                                                                        wx.hideLoading();\n                                                                        wx.showToast({\n                                                                              title: '发生异常，请及时和管理人员联系处理',\n                                                                              icon: 'none'\n                                                                        })\n                                                                  }\n                                                            })\n                                                      },\n                                                      fail(e) {\n                                                            wx.hideLoading();\n                                                            wx.showToast({\n                                                                  title: '发生异常，请及时和管理人员联系处理',\n                                                                  icon: 'none'\n                                                            })\n                                                      }\n                                                })\n                                                that.getList();\n                                          } else {\n                                                wx.hideLoading();\n                                                wx.showToast({\n                                                      title: '操作失败，买家未确认收货',\n                                                      icon: 'none'\n                                                })\n                                          }\n                                    }\n                              }\n                        })\n                  }\n            })\n      },\n      //重新上架\n      up(e) {\n            let that = this;\n            let up = e.currentTarget.dataset.up;\n            wx.showModal({\n                  title: '温馨提示',\n                  content: '您确定要重新上架该商品吗？',\n                  success(res) {\n                        if (res.confirm) {\n                              wx.showLoading({\n                                    title: '正在操作'\n                              })\n                              db.collection('publish').doc(up._id).update({\n                                    data: {\n                                          status: 0,\n                                    },\n                                    success() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '该商品成功上架',\n                                          })\n                                          that.getList();\n                                    },\n                                    fail() {\n                                          wx.hideLoading();\n                                          wx.showToast({\n                                                title: '操作失败',\n                                                icon: 'none'\n                                          })\n                                    }\n                              })\n                        }\n                  }\n            })\n      },\n      //查看详情\n      detail(e) {\n            let that = this;\n            let detail = e.currentTarget.dataset.detail;\n            if (detail.status == 0 || detail.status == 3) {\n                  wx.navigateTo({\n                        url: '/pages/detail/detail?scene=' + detail._id,\n                  })\n            } else {\n                  wx.navigateTo({\n                        url: '/pages/sell/detail/detail?id=' + detail._id,\n                  })\n            }\n\n      },\n      //下拉刷新\n      onPullDownRefresh() {\n            this.getList();\n      },\n      //至顶\n      gotop() {\n            wx.pageScrollTo({\n                  scrollTop: 0\n            })\n      },\n      //监测屏幕滚动\n      onPageScroll: function (e) {\n            this.setData({\n                  scrollTop: parseInt((e.scrollTop) * wx.getSystemInfoSync().pixelRatio)\n            })\n      },\n      onReachBottom() {\n            this.more();\n      },\n      //加载更多\n      more() {\n            let that = this;\n            if (that.data.nomore || that.data.list.length < 20) {\n                  return false\n            }\n            let page = that.data.page + 1;\n            db.collection('publish').where({\n                  _openid: app.openid\n            }).orderBy('creat', 'desc').skip(page * 20).limit(20).get({\n                  success: function (res) {\n                        if (res.data.length == 0) {\n                              that.setData({\n                                    nomore: true\n                              })\n                              return false;\n                        }\n                        if (res.data.length < 20) {\n                              that.setData({\n                                    nomore: true\n                              })\n                        }\n                        that.setData({\n                              page: page,\n                              list: that.data.list.concat(res.data)\n                        })\n                  },\n                  fail() {\n                        wx.showToast({\n                              title: '获取失败',\n                              icon: 'none'\n                        })\n                  }\n            })\n      },\n      onShow() {\n            this.getList()\n      }\n})"
  },
  {
    "path": "miniprogram/pages/sell/list/list.json",
    "content": "{\n      \"navigationBarTitleText\": \"我的发布\",\n      \"enablePullDownRefresh\": true\n}"
  },
  {
    "path": "miniprogram/pages/sell/list/list.wxml",
    "content": "<wxs src=\"../../../common.wxs\" module=\"morejs\" />\n<view class=\"contain\" wx:if=\"{{list.length!==0}}\">\n      <block wx:for=\"{{list}}\" wx:key=\"_id\">\n            <view class=\"card\" bindtap=\"detail\" data-detail=\"{{item}}\">\n                  <view class=\"a\">\n                        <view class=\"a1 {{item.status==1?'text-red':''}}\">\n                              <image lazy-load src=\"/images/onsell.png\"></image>\n                              {{item.status==0?'待出售':(item.status==1||item.status==5?'交易中':(item.status==2?'已完成':'已取消'))}}\n                        </view>\n                        <view class=\"a2\">{{morejs.timelog(item.creat)}}</view>\n                  </view>\n                  <view class=\"b\">\n                        <image lazy-load src=\"{{item.bookinfo.pic[0]}}\"></image>\n                        <view class=\"b1\">\n                              <view class=\"b11\">\n                                    <view class=\"b111 text-cut\">{{item.bookinfo.good}}</view>\n                              </view>\n                              <view class=\"b12\">￥{{item.price}}元</view>\n                        </view>\n                  </view>\n                  <view class=\"c\">\n                        <view class=\"c1 bg-grey\" catchtap=\"del\" data-del=\"{{item}}\" wx:if=\"{{item.status!=1 && item.status!=5}}\">删除</view>\n                        <view class=\"c1 bg-green\" catchtap=\"up\" data-up=\"{{item}}\" wx:if=\"{{item.status==3}}\">重新上架</view>\n                        <view class=\"c2 bg-red\" wx:if=\"{{item.status==5||item.status==1}}\" catchtap=\"quxiao\" data-quxiao=\"{{item}}\">取消交易</view>\n                        <view class=\"c2 bg-green\" wx:if=\"{{item.status==5||item.status==1}}\" catchtap=\"wancheng\" data-wancheng=\"{{item}}\">完成交易</view>\n                        <view class=\"c1 bg-yellow\" wx:if=\"{{item.status==0}}\" catchtap=\"crash\" data-crash=\"{{item}}\">擦亮</view>\n                  </view>\n            </view>\n      </block>\n      \n</view>\n\n<!--无内容显示-->\n<view class=\"nocontent\" wx:if=\"{{list.length==0}}\">\n      <image src=\"/images/blank.png\"></image>\n      <view class=\"blank_text\">这里空空如也~</view>\n</view>\n\n\n<block wx:if=\"{{list.length>10}}\">\n      <import src=\"/common.wxml\" />\n      <template is=\"loadmore\" data=\"{{nomore}}\" />\n</block>\n<van-transition show=\"{{ scrollTop>500 }}\" custom-class=\"block\" duration=\"600\">\n      <view class=\"totop\" bindtap=\"gotop\">\n            <image src=\"/images/top.png\"></image>\n      </view>\n</van-transition>"
  },
  {
    "path": "miniprogram/pages/sell/list/list.wxss",
    "content": ".contain {\n      width: 100%;\n      display: flex;\n      box-sizing: border-box;\n      flex-direction: column;\n      padding: 24rpx;\n}\n.card {\n      width: 100%;\n      display: flex;\n      flex-direction: column;\n      padding: 30rpx;\n      box-sizing: border-box;\n      box-shadow: 0 0 20rpx #eee;\n      border-radius: 16rpx;\n      margin-bottom: 30rpx;\n}\n\n.a {\n      width: 100%;\n      display: flex;\n      justify-content: space-between;\n      align-items: center;\n      border-bottom: 1rpx solid #eee;\n      padding-bottom: 24rpx;\n}\n\n.a1 {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n      display: flex;\n}\n\n.text-red {\n      color: #f80202;\n}\n\n.a1 image {\n      width: 40rpx;\n      height: 40rpx;\n      padding-right: 10rpx;\n}\n\n.a2 {\n      font-size: 28rpx;\n      color: #b2b2b2;\n      letter-spacing: 2rpx;\n}\n\n.b {\n      width: 100%;\n      display: flex;\n      align-items: center;\n      box-sizing: border-box;\n      padding: 20rpx 0;\n      border-bottom: 1rpx solid #eee;\n}\n\n.b image {\n      width: 130rpx;\n      height: 130rpx;\n}\n\n.b1 {\n      width: calc(100% - 130rpx);\n      padding: 0 20rpx;\n      height: 130rpx;\n      display: flex;\n      flex-direction: column;\n      box-sizing: border-box;\n      justify-content: space-between;\n}\n\n.b11 {\n      display: flex;\n      flex-direction: column;\n      width: 100%;\n}\n\n.b111 {\n      font-size: 30rpx;\n      letter-spacing: 2rpx;\n}\n\n.b112 {\n      padding-top: 10rpx;\n      font-size: 26rpx;\n      letter-spacing: 3rpx;\n      color: #c2c2c2;\n}\n\n.b12 {\n      display: flex;\n      justify-content: flex-end;\n      font-size: 32rpx;\n      color: #f80202;\n}\n\n.c {\n      width: 100%;\n      display: flex;\n      justify-content: flex-end;\n      padding-top: 20rpx;\n}\n\n.c1 {\n      width: 120rpx;\n      height: 50rpx;\n      border-radius: 10rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      font-size: 26rpx;\n      letter-spacing: 2rpx;\n      margin-left: 20rpx;\n}\n\n.bg-grey {\n      background: #eee;\n}\n\n.bg-yellow {\n      background: #fbbd08;\n      color: #fff;\n}\n.bg-green {\n      background:#6f86d6;\n      color: #fff;\n}\n\n.bg-red {\n      background:red;\n}\n.c2 {\n      width: 200rpx;\n      height:53rpx;\n      border-radius: 10rpx;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      font-size: 26rpx;\n      letter-spacing: 4rpx;\n      margin-left: 20rpx;\n      color: #fff;\n}\n.nocontent {\n      width: 100%;\n      height: calc(100% - 100rpx);\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      flex-direction: column;\n      box-sizing: border-box;\n}\n\n.nocontent image {\n      padding-left: 80rpx;\n      width: 340rpx;\n      height: 272rpx;\n}\n\n.blank_text {\n      padding-top: 40rpx;\n      font-size: 32rpx;\n      letter-spacing: 2rpx;\n      color: #c6c6c8;\n}\n"
  },
  {
    "path": "miniprogram/pages/start/start.js",
    "content": "const app = getApp()\nconst db = wx.cloud.database();\nconst config = require(\"../../config.js\");\nconst _ = db.command;\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n            count: 3,\n            bgurl:[]\n      },\n      onLoad(){\n            this.getimg();\n            this.countDown();\n            this.getuserdetail();\n      },\n      go() {\n            wx.switchTab({\n                  url: '/pages/index/index',\n            })\n      },\n      countDown: function() {\n            let that = this;\n             let total = 3;\n            this.interval = setInterval(function() {\n                  total > 0 && (total--, that.setData({\n                        count: total\n                  })), 0 === total && (that.setData({\n                        count: total\n                  }), wx.switchTab({\n                        url: \"/pages/index/index\"\n                  }), clearInterval(that.interval));\n            }, 1e3);\n      },\n      //为了数据安全可靠，每次进入获取一次用户信息\n      getuserdetail() {\n            if (!app.openid) {\n                  wx.cloud.callFunction({\n                        name: 'regist', // 对应云函数名\n                        data: {\n                              $url: \"getid\", //云函数路由参数\n                        },\n                        success: re => {\n                              db.collection('user').where({\n                                    _openid: re.result\n                              }).get({\n                                    success: function (res) {\n                                          if (res.data.length !== 0) {\n                                                app.openid = re.result;\n                                                app.userinfo = res.data[0];\n                                                console.log(app)\n                                          }\n                                          console.log(res)\n                                    }\n                              })\n                        }\n                  })\n            }\n      },\n      //获取背景图\n      getimg() {\n            let that = this;\n            db.collection('start').where({}).get({\n                  success: function (res) {\n                        console.log(res)\n                        that.setData({\n                              bgurl: res.data[0].url\n                        })\n                  },\n                  fail(){\n                        that.setData({\n                              bgurl: JSON.parse(config.data).bgurl,\n                        })\n                  }\n            })\n      },\n})\n"
  },
  {
    "path": "miniprogram/pages/start/start.json",
    "content": "{\n  \"navigationStyle\":\"custom\"\n}"
  },
  {
    "path": "miniprogram/pages/start/start.wxml",
    "content": "<view class=\"contain\">\n     <view class=\"go\">\n             <button  bindtap=\"go\">跳过{{count}}s</button> \n     </view>\n     <image class=\"bg\" src=\"{{bgurl}}\"></image>\n</view>"
  },
  {
    "path": "miniprogram/pages/start/start.wxss",
    "content": ".contain {\n      width: 100%;\n      height: 100%;\n      position: relative;\n}\n.bg {\n      position: absolute;\n      left: 0rpx;\n      top: 0rpx;\n      width: 100%;\n      height: 100%;\n      z-index: -1;\n}\n.go {\n      position: absolute;\n      right: 30rpx;\n      top: 150rpx;  \n      z-index: 9;\n}\n.go button {\n      font-size: 28rpx;\n      letter-spacing: 4rpx;\n      border-radius: 30rpx;\n      color: #000;\n      background: rgba(255, 255, 255, 0.781);\n       display: flex;\n      justify-content: center;\n      align-items: center;\n      text-align: center;\n      width: 160rpx;\n      height: 60rpx;\n}\n"
  },
  {
    "path": "miniprogram/pages/use/use.js",
    "content": "// miniprogram/pages/use/use.js\nPage({\n\n  /**\n   * 页面的初始数据\n   */\n  data: {\n    des:'待补充'\n  },\n\n  /**\n   * 生命周期函数--监听页面加载\n   */\n  onLoad: function (options) {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面初次渲染完成\n   */\n  onReady: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面显示\n   */\n  onShow: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面隐藏\n   */\n  onHide: function () {\n\n  },\n\n  /**\n   * 生命周期函数--监听页面卸载\n   */\n  onUnload: function () {\n\n  },\n\n  /**\n   * 页面相关事件处理函数--监听用户下拉动作\n   */\n  onPullDownRefresh: function () {\n\n  },\n\n  /**\n   * 页面上拉触底事件的处理函数\n   */\n  onReachBottom: function () {\n\n  },\n\n  /**\n   * 用户点击右上角分享\n   */\n  onShareAppMessage: function () {\n\n  }\n})\n"
  },
  {
    "path": "miniprogram/pages/use/use.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/use/use.wxml",
    "content": "\t<web-view src=\"https://mp.weixin.qq.com/s/QFM3vO7-Cl_u8SVetBME9Q\"></web-view>"
  },
  {
    "path": "miniprogram/pages/use/use.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/pages/web/web.js",
    "content": "// pages/web/web.js\nPage({\n\n      /**\n       * 页面的初始数据\n       */\n      data: {\n      },\n\n      /**\n       * 生命周期函数--监听页面加载\n       */\n      onLoad: function(e) {\n           \n            this.setData({\n                  url: e.url\n            })\n      },\n\n      /**\n       * 生命周期函数--监听页面初次渲染完成\n       */\n      onReady: function() {\n\n      },\n\n      /**\n       * 生命周期函数--监听页面显示\n       */\n      onShow: function() {\n\n      },\n\n      /**\n       * 生命周期函数--监听页面隐藏\n       */\n      onHide: function() {\n\n      },\n\n      /**\n       * 生命周期函数--监听页面卸载\n       */\n      onUnload: function() {\n\n      },\n\n      /**\n       * 页面相关事件处理函数--监听用户下拉动作\n       */\n      onPullDownRefresh: function() {\n\n      },\n\n      /**\n       * 页面上拉触底事件的处理函数\n       */\n      onReachBottom: function() {\n\n      },\n\n      /**\n       * 用户点击右上角分享\n       */\n      onShareAppMessage: function() {\n\n      }\n})\n"
  },
  {
    "path": "miniprogram/pages/web/web.json",
    "content": "{\n  \"usingComponents\": {}\n}"
  },
  {
    "path": "miniprogram/pages/web/web.wxml",
    "content": "<web-view src=\"{{url}}\"></web-view>"
  },
  {
    "path": "miniprogram/pages/web/web.wxss",
    "content": "/* pages/web/web.wxss */"
  },
  {
    "path": "miniprogram/sitemap.json",
    "content": "{\n      \"desc\": \"关于本文件的更多信息，请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html\",\n      \"rules\": [\n            {\n                  \"action\": \"allow\",\n                  \"page\": \"/pages/detail/detail\",\n                  \"params\": [\n                        \"scene\"\n                  ],\n                  \"matching\": \"exact\"\n            },\n            {\n                  \"action\": \"allow\",\n                  \"page\": \"/pages/start/start\"\n            },\n            {\n                  \"action\": \"allow\",\n                  \"page\": \"/pages/about/about\"\n            },\n            {\n                  \"action\": \"disallow\",\n                  \"page\": \"*\"\n            }\n      ]\n}"
  },
  {
    "path": "miniprogram/utils/util.js",
    "content": "function formatTime(date) {\n  var date = new Date(date);\n  var year = date.getFullYear()\n  var month = date.getMonth() + 1\n  var day = date.getDate()\n  var hour = date.getHours()\n  var minute = date.getMinutes()\n  var second = date.getSeconds()\n\n\n  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')\n}\n\nfunction formatNumber(n) {\n  n = n.toString()\n  return n[1] ? n : '0' + n\n}\n\n/** \n* 时间戳转化为年 月 日 时 分 秒 \n* number: 传入时间戳 \n* format：返回格式，支持自定义，但参数必须与formateArr里保持一致 \n*/\nfunction formatTimeTwo(number, format) {\n\n  var formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];\n  var returnArr = [];\n\n  var date = new Date(number * 1000);\n  returnArr.push(date.getFullYear());\n  returnArr.push(formatNumber(date.getMonth() + 1));\n  returnArr.push(formatNumber(date.getDate()));\n\n  returnArr.push(formatNumber(date.getHours()));\n  returnArr.push(formatNumber(date.getMinutes()));\n  returnArr.push(formatNumber(date.getSeconds()));\n\n  for (var i in returnArr) {\n      format = format.replace(formateArr[i], returnArr[i]);\n  }\n  return format;\n}\n\nmodule.exports = {\n  formatTime: formatTime,\n  formatTimeTwo: formatTimeTwo  \n}"
  },
  {
    "path": "miniprogram/vant/action-sheet/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/action-sheet/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nVantComponent({\n  mixins: [button, openType],\n  props: {\n    show: Boolean,\n    title: String,\n    cancelText: String,\n    description: String,\n    round: {\n      type: Boolean,\n      value: true,\n    },\n    zIndex: {\n      type: Number,\n      value: 100,\n    },\n    actions: {\n      type: Array,\n      value: [],\n    },\n    overlay: {\n      type: Boolean,\n      value: true,\n    },\n    closeOnClickOverlay: {\n      type: Boolean,\n      value: true,\n    },\n    closeOnClickAction: {\n      type: Boolean,\n      value: true,\n    },\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    onSelect(event) {\n      const { index } = event.currentTarget.dataset;\n      const item = this.data.actions[index];\n      if (item && !item.disabled && !item.loading) {\n        this.$emit('select', item);\n        if (this.data.closeOnClickAction) {\n          this.onClose();\n        }\n      }\n    },\n    onCancel() {\n      this.$emit('cancel');\n    },\n    onClose() {\n      this.$emit('close');\n    },\n    onClickOverlay() {\n      this.$emit('click-overlay');\n      this.onClose();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/action-sheet/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-popup\": \"../popup/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/action-sheet/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-popup\n  show=\"{{ show }}\"\n  position=\"bottom\"\n  round=\"{{ round }}\"\n  z-index=\"{{ zIndex }}\"\n  overlay=\"{{ overlay }}\"\n  custom-class=\"van-action-sheet\"\n  safe-area-inset-bottom=\"{{ safeAreaInsetBottom }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  bind:close=\"onClickOverlay\"\n>\n  <view wx:if=\"{{ title }}\" class=\"van-hairline--bottom van-action-sheet__header\">\n    {{ title }}\n    <van-icon\n      name=\"close\"\n      custom-class=\"van-action-sheet__close\"\n      bind:click=\"onClose\"\n    />\n  </view>\n  <view wx:if=\"{{ description }}\" class=\"van-action-sheet__description\">\n    {{ description }}\n  </view>\n  <view wx:if=\"{{ actions && actions.length }}\">\n    <!-- button外包一层view，防止actions动态变化，导致渲染时button被打散 -->\n    <button\n      wx:for=\"{{ actions }}\"\n      wx:key=\"index\"\n      open-type=\"{{ item.openType }}\"\n      style=\"{{ item.color ? 'color: ' + item.color : '' }}\"\n      class=\"{{ utils.bem('action-sheet__item', { disabled: item.disabled || item.loading }) }} van-hairline--top {{ item.className || '' }}\"\n      hover-class=\"van-action-sheet__item--hover\"\n      data-index=\"{{ index }}\"\n      bind:tap=\"onSelect\"\n      bindgetuserinfo=\"bindGetUserInfo\"\n      bindcontact=\"bindContact\"\n      bindgetphonenumber=\"bindGetPhoneNumber\"\n      binderror=\"bindError\"\n      bindlaunchapp=\"bindLaunchApp\"\n      bindopensetting=\"bindOpenSetting\"\n      lang=\"{{ lang }}\"\n      session-from=\"{{ sessionFrom }}\"\n      send-message-title=\"{{ sendMessageTitle }}\"\n      send-message-path=\"{{ sendMessagePath }}\"\n      send-message-img=\"{{ sendMessageImg }}\"\n      show-message-card=\"{{ showMessageCard }}\"\n      app-parameter=\"{{ appParameter }}\"\n    >\n      <block wx:if=\"{{ !item.loading }}\">\n        {{ item.name }}\n        <text wx:if=\"{{ item.subname }}\" class=\"van-action-sheet__subname\" >{{ item.subname }}</text>\n      </block>\n      <van-loading wx:else custom-class=\"van-action-sheet__loading\" size=\"20px\" />\n    </button>\n  </view>\n  <slot />\n  <view\n    wx:if=\"{{ cancelText }}\"\n    class=\"van-action-sheet__cancel\"\n    hover-class=\"van-action-sheet__cancel--hover\"\n    hover-stay-time=\"70\"\n    bind:tap=\"onCancel\"\n  >\n    {{ cancelText }}\n  </view>\n</van-popup>\n"
  },
  {
    "path": "miniprogram/vant/action-sheet/index.wxss",
    "content": "@import '../common/index.wxss';.van-action-sheet{max-height:90%!important;max-height:var(--action-sheet-max-height,90%)!important;color:#323233;color:var(--action-sheet-item-text-color,#323233)}.van-action-sheet__cancel,.van-action-sheet__item{text-align:center;font-size:16px;font-size:var(--action-sheet-item-font-size,16px);line-height:50px;line-height:var(--action-sheet-item-height,50px);background-color:#fff;background-color:var(--action-sheet-item-background,#fff)}.van-action-sheet__cancel--hover,.van-action-sheet__item--hover{background-color:#f2f3f5;background-color:var(--active-color,#f2f3f5)}.van-action-sheet__cancel:before{display:block;content:\" \";height:8px;height:var(--action-sheet-cancel-padding-top,8px);background-color:#f7f8fa;background-color:var(--action-sheet-cancel-padding-color,#f7f8fa)}.van-action-sheet__item--disabled{color:#c8c9cc;color:var(--action-sheet-item-disabled-text-color,#c8c9cc)}.van-action-sheet__item--disabled.van-action-sheet__item--hover{background-color:#fff;background-color:var(--action-sheet-item-background,#fff)}.van-action-sheet__subname{margin-left:4px;margin-left:var(--padding-base,4px);font-size:12px;font-size:var(--action-sheet-subname-font-size,12px);color:#646566;color:var(--action-sheet-subname-color,#646566)}.van-action-sheet__header{text-align:center;font-weight:500;font-weight:var(--font-weight-bold,500);font-size:16px;font-size:var(--action-sheet-header-font-size,16px);line-height:44px;line-height:var(--action-sheet-header-height,44px)}.van-action-sheet__description{text-align:center;padding:16px;padding:var(--padding-md,16px);color:#646566;color:var(--action-sheet-description-color,#646566);font-size:14px;font-size:var(--action-sheet-description-font-size,14px);line-height:20px;line-height:var(--action-sheet-description-line-height,20px)}.van-action-sheet__close{position:absolute!important;top:0;right:0;line-height:inherit!important;padding:0 12px;padding:var(--action-sheet-close-icon-padding,0 12px);font-size:18px!important;font-size:var(--action-sheet-close-icon-size,18px)!important;color:#969799;color:var(--action-sheet-close-icon-color,#969799)}.van-action-sheet__loading{display:-webkit-flex!important;display:flex!important;height:50px;height:var(--action-sheet-item-height,50px)}"
  },
  {
    "path": "miniprogram/vant/area/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/area/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { pickerProps } from '../picker/shared';\nconst COLUMNSPLACEHOLDERCODE = '000000';\nVantComponent({\n  classes: ['active-class', 'toolbar-class', 'column-class'],\n  props: Object.assign(Object.assign({}, pickerProps), {\n    value: {\n      type: String,\n      observer(value) {\n        this.code = value;\n        this.setValues();\n      },\n    },\n    areaList: {\n      type: Object,\n      value: {},\n      observer: 'setValues',\n    },\n    columnsNum: {\n      type: null,\n      value: 3,\n      observer(value) {\n        this.setData({\n          displayColumns: this.data.columns.slice(0, +value),\n        });\n      },\n    },\n    columnsPlaceholder: {\n      type: Array,\n      observer(val) {\n        this.setData({\n          typeToColumnsPlaceholder: {\n            province: val[0] || '',\n            city: val[1] || '',\n            county: val[2] || '',\n          },\n        });\n      },\n    },\n  }),\n  data: {\n    columns: [{ values: [] }, { values: [] }, { values: [] }],\n    displayColumns: [{ values: [] }, { values: [] }, { values: [] }],\n    typeToColumnsPlaceholder: {},\n  },\n  mounted() {\n    setTimeout(() => {\n      this.setValues();\n    }, 0);\n  },\n  methods: {\n    getPicker() {\n      if (this.picker == null) {\n        this.picker = this.selectComponent('.van-area__picker');\n      }\n      return this.picker;\n    },\n    onCancel(event) {\n      this.emit('cancel', event.detail);\n    },\n    onConfirm(event) {\n      const { index } = event.detail;\n      let { value } = event.detail;\n      value = this.parseOutputValues(value);\n      this.emit('confirm', { value, index });\n    },\n    emit(type, detail) {\n      detail.values = detail.value;\n      delete detail.value;\n      this.$emit(type, detail);\n    },\n    // parse output columns data\n    parseOutputValues(values) {\n      const { columnsPlaceholder } = this.data;\n      return values.map((value, index) => {\n        // save undefined value\n        if (!value) return value;\n        value = JSON.parse(JSON.stringify(value));\n        if (!value.code || value.name === columnsPlaceholder[index]) {\n          value.code = '';\n          value.name = '';\n        }\n        return value;\n      });\n    },\n    onChange(event) {\n      const { index, picker, value } = event.detail;\n      this.code = value[index].code;\n      this.setValues().then(() => {\n        this.$emit('change', {\n          picker,\n          values: this.parseOutputValues(picker.getValues()),\n          index,\n        });\n      });\n    },\n    getConfig(type) {\n      const { areaList } = this.data;\n      return (areaList && areaList[`${type}_list`]) || {};\n    },\n    getList(type, code) {\n      const { typeToColumnsPlaceholder } = this.data;\n      let result = [];\n      if (type !== 'province' && !code) {\n        return result;\n      }\n      const list = this.getConfig(type);\n      result = Object.keys(list).map((code) => ({\n        code,\n        name: list[code],\n      }));\n      if (code) {\n        // oversea code\n        if (code[0] === '9' && type === 'city') {\n          code = '9';\n        }\n        result = result.filter((item) => item.code.indexOf(code) === 0);\n      }\n      if (typeToColumnsPlaceholder[type] && result.length) {\n        // set columns placeholder\n        const codeFill =\n          type === 'province'\n            ? ''\n            : type === 'city'\n            ? COLUMNSPLACEHOLDERCODE.slice(2, 4)\n            : COLUMNSPLACEHOLDERCODE.slice(4, 6);\n        result.unshift({\n          code: `${code}${codeFill}`,\n          name: typeToColumnsPlaceholder[type],\n        });\n      }\n      return result;\n    },\n    getIndex(type, code) {\n      let compareNum = type === 'province' ? 2 : type === 'city' ? 4 : 6;\n      const list = this.getList(type, code.slice(0, compareNum - 2));\n      // oversea code\n      if (code[0] === '9' && type === 'province') {\n        compareNum = 1;\n      }\n      code = code.slice(0, compareNum);\n      for (let i = 0; i < list.length; i++) {\n        if (list[i].code.slice(0, compareNum) === code) {\n          return i;\n        }\n      }\n      return 0;\n    },\n    setValues() {\n      const county = this.getConfig('county');\n      let { code } = this;\n      if (!code) {\n        if (this.data.columnsPlaceholder.length) {\n          code = COLUMNSPLACEHOLDERCODE;\n        } else if (Object.keys(county)[0]) {\n          code = Object.keys(county)[0];\n        } else {\n          code = '';\n        }\n      }\n      const province = this.getList('province');\n      const city = this.getList('city', code.slice(0, 2));\n      const picker = this.getPicker();\n      if (!picker) {\n        return;\n      }\n      const stack = [];\n      stack.push(picker.setColumnValues(0, province, false));\n      stack.push(picker.setColumnValues(1, city, false));\n      if (city.length && code.slice(2, 4) === '00') {\n        [{ code }] = city;\n      }\n      stack.push(\n        picker.setColumnValues(\n          2,\n          this.getList('county', code.slice(0, 4)),\n          false\n        )\n      );\n      return Promise.all(stack)\n        .catch(() => {})\n        .then(() =>\n          picker.setIndexes([\n            this.getIndex('province', code),\n            this.getIndex('city', code),\n            this.getIndex('county', code),\n          ])\n        )\n        .catch(() => {});\n    },\n    getValues() {\n      const picker = this.getPicker();\n      return picker ? picker.getValues().filter((value) => !!value) : [];\n    },\n    getDetail() {\n      const values = this.getValues();\n      const area = {\n        code: '',\n        country: '',\n        province: '',\n        city: '',\n        county: '',\n      };\n      if (!values.length) {\n        return area;\n      }\n      const names = values.map((item) => item.name);\n      area.code = values[values.length - 1].code;\n      if (area.code[0] === '9') {\n        area.country = names[1] || '';\n        area.province = names[2] || '';\n      } else {\n        area.province = names[0] || '';\n        area.city = names[1] || '';\n        area.county = names[2] || '';\n      }\n      return area;\n    },\n    reset(code) {\n      this.code = code || '';\n      return this.setValues();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/area/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-picker\": \"../picker/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/area/index.wxml",
    "content": "<van-picker\n  class=\"van-area__picker\"\n  active-class=\"active-class\"\n  toolbar-class=\"toolbar-class\"\n  column-class=\"column-class\"\n  show-toolbar\n  value-key=\"name\"\n  title=\"{{ title }}\"\n  loading=\"{{ loading }}\"\n  columns=\"{{ displayColumns }}\"\n  item-height=\"{{ itemHeight }}\"\n  visible-item-count=\"{{ visibleItemCount }}\"\n  cancel-button-text=\"{{ cancelButtonText }}\"\n  confirm-button-text=\"{{ confirmButtonText }}\"\n  bind:change=\"onChange\"\n  bind:confirm=\"onConfirm\"\n  bind:cancel=\"onCancel\"\n/>\n"
  },
  {
    "path": "miniprogram/vant/area/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram/vant/button/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/button/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nVantComponent({\n  mixins: [button, openType],\n  classes: ['hover-class', 'loading-class'],\n  data: {\n    baseStyle: '',\n  },\n  props: {\n    icon: String,\n    classPrefix: {\n      type: String,\n      value: 'van-icon',\n    },\n    plain: Boolean,\n    block: Boolean,\n    round: Boolean,\n    square: Boolean,\n    loading: Boolean,\n    hairline: Boolean,\n    disabled: Boolean,\n    loadingText: String,\n    customStyle: String,\n    loadingType: {\n      type: String,\n      value: 'circular',\n    },\n    type: {\n      type: String,\n      value: 'default',\n    },\n    dataset: null,\n    size: {\n      type: String,\n      value: 'normal',\n    },\n    loadingSize: {\n      type: String,\n      value: '20px',\n    },\n    color: {\n      type: String,\n      observer(color) {\n        let style = '';\n        if (color) {\n          style += `color: ${this.data.plain ? color : 'white'};`;\n          if (!this.data.plain) {\n            // Use background instead of backgroundColor to make linear-gradient work\n            style += `background: ${color};`;\n          }\n          // hide border when color is linear-gradient\n          if (color.indexOf('gradient') !== -1) {\n            style += 'border: 0;';\n          } else {\n            style += `border-color: ${color};`;\n          }\n        }\n        if (style !== this.data.baseStyle) {\n          this.setData({ baseStyle: style });\n        }\n      },\n    },\n  },\n  methods: {\n    onClick() {\n      if (!this.data.loading) {\n        this.$emit('click');\n      }\n    },\n    noop() {},\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/button/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/button/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<button\n  id=\"{{ id }}\"\n  data-detail=\"{{ dataset }}\"\n  class=\"custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}\"\n  hover-class=\"van-button--active hover-class\"\n  lang=\"{{ lang }}\"\n  style=\"{{ baseStyle }} {{ customStyle }}\"\n  open-type=\"{{ disabled ? '' : openType }}\"\n  business-id=\"{{ businessId }}\"\n  session-from=\"{{ sessionFrom }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  app-parameter=\"{{ appParameter }}\"\n  aria-label=\"{{ ariaLabel }}\"\n  bindtap=\"{{ !disabled ? 'onClick' : 'noop' }}\"\n  bindgetuserinfo=\"bindGetUserInfo\"\n  bindcontact=\"bindContact\"\n  bindgetphonenumber=\"bindGetPhoneNumber\"\n  binderror=\"bindError\"\n  bindlaunchapp=\"bindLaunchApp\"\n  bindopensetting=\"bindOpenSetting\"\n>\n  <block wx:if=\"{{ loading }}\">\n    <van-loading\n      custom-class=\"loading-class\"\n      size=\"{{ loadingSize }}\"\n      type=\"{{ loadingType }}\"\n      color=\"{{ loadingColor(type,color,plain) }}\"\n    />\n    <view wx:if=\"{{ loadingText }}\" class=\"van-button__loading-text\">\n      {{ loadingText }}\n    </view>\n  </block>\n  <block wx:else>\n    <van-icon\n      wx:if=\"{{ icon }}\"\n      size=\"1.2em\"\n      name=\"{{ icon }}\"\n      class-prefix=\"{{ classPrefix }}\"\n      class=\"van-button__icon\"\n      custom-style=\"line-height: inherit;\"\n    />\n    <view class=\"van-button__text\">\n      <slot />\n    </view>\n  </block>\n</button>\n\n\n<wxs module=\"loadingColor\">\nfunction get(type, color,plain) {\n  if(plain) {\n    return color ? color: '#c9c9c9';\n  }\n\n  if(type === 'default') {\n    return '#c9c9c9';\n  }\n  return 'white';\n}\n\nmodule.exports = get;\n</wxs>\n"
  },
  {
    "path": "miniprogram/vant/button/index.wxss",
    "content": "@import '../common/index.wxss';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);line-height:20px;line-height:var(--button-line-height,20px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:\" \";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background:#fff;background:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:var(--button-border-width,1px) solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background:#07c160;background:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:var(--button-border-width,1px) solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background:#1989fa;background:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:var(--button-border-width,1px) solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background:#ee0a24;background:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:var(--button-border-width,1px) solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background:#ff976a;background:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:var(--button-border-width,1px) solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background:#fff;background:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0}"
  },
  {
    "path": "miniprogram/vant/calendar/calendar.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\"></wxs>\n\n<template name=\"calendar\">\n  <view class=\"van-calendar\">\n    <header\n      title=\"{{ title }}\"\n      showTitle=\"{{ showTitle }}\"\n      subtitle=\"{{ subtitle }}\"\n      showSubtitle=\"{{ showSubtitle }}\"\n    >\n      <slot name=\"title\" slot=\"title\"></slot>\n    </header>\n\n    <scroll-view class=\"van-calendar__body\" scroll-y scroll-into-view=\"{{ scrollIntoView }}\">\n      <month\n        wx:for=\"{{ computed.getMonths(minDate, maxDate) }}\"\n        wx:key=\"index\"\n        id=\"month{{ index }}\"\n        class=\"month\"\n        data-date=\"{{ item }}\"\n        date=\"{{ item }}\"\n        type=\"{{ type }}\"\n        color=\"{{ color }}\"\n        minDate=\"{{ minDate }}\"\n        maxDate=\"{{ maxDate }}\"\n        showMark=\"{{ showMark }}\"\n        formatter=\"{{ formatter }}\"\n        rowHeight=\"{{ rowHeight }}\"\n        currentDate=\"{{ currentDate }}\"\n        showSubtitle=\"{{ showSubtitle }}\"\n        allowSameDay=\"{{ allowSameDay }}\"\n        showMonthTitle=\"{{ index !== 0 || !showSubtitle }}\"\n        bind:click=\"onClickDay\"\n      />\n    </scroll-view>\n\n    <view class=\"van-calendar__footer {{ safeAreaInsetBottom ? 'van-calendar__footer--safe-area-inset-bottom' : '' }}\">\n      <slot name=\"footer\"></slot>\n    </view>\n\n    <view class=\"van-calendar__footer {{ safeAreaInsetBottom ? 'van-calendar__footer--safe-area-inset-bottom' : '' }}\">\n      <van-button\n        wx:if=\"{{ showConfirm }}\"\n        round\n        block\n        type=\"danger\"\n        color=\"{{ color }}\"\n        custom-class=\"van-calendar__confirm\"\n        disabled=\"{{ computed.getButtonDisabled(type, currentDate) }}\"\n        nativeType=\"text\"\n        bind:click=\"onConfirm\"\n      >\n        {{ computed.getButtonDisabled(type, currentDate) ? confirmDisabledText : confirmText }}\n      </van-button>\n    </view>\n  </view>\n</template>\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/header/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/header/index.js",
    "content": "import { VantComponent } from '../../../common/component';\nVantComponent({\n  props: {\n    title: {\n      type: String,\n      value: '日期选择',\n    },\n    subtitle: String,\n    showTitle: Boolean,\n    showSubtitle: Boolean,\n  },\n  data: {\n    weekdays: ['日', '一', '二', '三', '四', '五', '六'],\n  },\n  methods: {},\n});\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/header/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/header/index.wxml",
    "content": "<view class=\"van-calendar__header\">\n  <block wx:if=\"{{ showTitle }}\">\n    <view class=\"van-calendar__header-title\"><slot name=\"title\"></slot></view>\n    <view class=\"van-calendar__header-title\">{{ title }}</view>\n  </block>\n\n  <view wx:if=\"{{ showSubtitle }}\" class=\"van-calendar__header-subtitle\">\n    {{ subtitle }}\n  </view>\n\n  <view class=\"van-calendar__weekdays\">\n    <view wx:for=\"{{ weekdays }}\" wx:key=\"index\" class=\"van-calendar__weekday\">\n      {{ item }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/header/index.wxss",
    "content": "@import '../../../common/index.wxss';.van-calendar__header{-webkit-flex-shrink:0;flex-shrink:0;box-shadow:0 2px 10px rgba(125,126,128,.16);box-shadow:var(--calendar-header-box-shadow,0 2px 10px rgba(125,126,128,.16))}.van-calendar__header-subtitle,.van-calendar__header-title{text-align:center;height:44px;height:var(--calendar-header-title-height,44px);font-weight:500;font-weight:var(--font-weight-bold,500);line-height:44px;line-height:var(--calendar-header-title-height,44px)}.van-calendar__header-title+.van-calendar__header-title,.van-calendar__header-title:empty{display:none}.van-calendar__header-title:empty+.van-calendar__header-title{display:block!important}.van-calendar__weekdays{display:-webkit-flex;display:flex}.van-calendar__weekday{-webkit-flex:1;flex:1;text-align:center;font-size:12px;font-size:var(--calendar-weekdays-font-size,12px);line-height:30px;line-height:var(--calendar-weekdays-height,30px)}"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.js",
    "content": "import { VantComponent } from '../../../common/component';\nimport {\n  getMonthEndDay,\n  compareDay,\n  getPrevDay,\n  getNextDay,\n} from '../../utils';\nVantComponent({\n  props: {\n    date: {\n      type: null,\n      observer: 'setDays',\n    },\n    type: {\n      type: String,\n      observer: 'setDays',\n    },\n    color: String,\n    minDate: {\n      type: null,\n      observer: 'setDays',\n    },\n    maxDate: {\n      type: null,\n      observer: 'setDays',\n    },\n    showMark: Boolean,\n    rowHeight: [Number, String],\n    formatter: {\n      type: null,\n      observer: 'setDays',\n    },\n    currentDate: {\n      type: [null, Array],\n      observer: 'setDays',\n    },\n    allowSameDay: Boolean,\n    showSubtitle: Boolean,\n    showMonthTitle: Boolean,\n  },\n  data: {\n    visible: true,\n    days: [],\n  },\n  methods: {\n    onClick(event) {\n      const { index } = event.currentTarget.dataset;\n      const item = this.data.days[index];\n      if (item.type !== 'disabled') {\n        this.$emit('click', item);\n      }\n    },\n    setDays() {\n      const days = [];\n      const startDate = new Date(this.data.date);\n      const year = startDate.getFullYear();\n      const month = startDate.getMonth();\n      const totalDay = getMonthEndDay(\n        startDate.getFullYear(),\n        startDate.getMonth() + 1\n      );\n      for (let day = 1; day <= totalDay; day++) {\n        const date = new Date(year, month, day);\n        const type = this.getDayType(date);\n        let config = {\n          date,\n          type,\n          text: day,\n          bottomInfo: this.getBottomInfo(type),\n        };\n        if (this.data.formatter) {\n          config = this.data.formatter(config);\n        }\n        days.push(config);\n      }\n      this.setData({ days });\n    },\n    getMultipleDayType(day) {\n      const { currentDate } = this.data;\n      if (!Array.isArray(currentDate)) {\n        return '';\n      }\n      const isSelected = (date) =>\n        currentDate.some((item) => compareDay(item, date) === 0);\n      if (isSelected(day)) {\n        const prevDay = getPrevDay(day);\n        const nextDay = getNextDay(day);\n        const prevSelected = isSelected(prevDay);\n        const nextSelected = isSelected(nextDay);\n        if (prevSelected && nextSelected) {\n          return 'multiple-middle';\n        }\n        if (prevSelected) {\n          return 'end';\n        }\n        return nextSelected ? 'start' : 'multiple-selected';\n      }\n      return '';\n    },\n    getRangeDayType(day) {\n      const { currentDate, allowSameDay } = this.data;\n      if (!Array.isArray(currentDate)) {\n        return;\n      }\n      const [startDay, endDay] = currentDate;\n      if (!startDay) {\n        return;\n      }\n      const compareToStart = compareDay(day, startDay);\n      if (!endDay) {\n        return compareToStart === 0 ? 'start' : '';\n      }\n      const compareToEnd = compareDay(day, endDay);\n      if (compareToStart === 0 && compareToEnd === 0 && allowSameDay) {\n        return 'start-end';\n      }\n      if (compareToStart === 0) {\n        return 'start';\n      }\n      if (compareToEnd === 0) {\n        return 'end';\n      }\n      if (compareToStart > 0 && compareToEnd < 0) {\n        return 'middle';\n      }\n    },\n    getDayType(day) {\n      const { type, minDate, maxDate, currentDate } = this.data;\n      if (compareDay(day, minDate) < 0 || compareDay(day, maxDate) > 0) {\n        return 'disabled';\n      }\n      if (type === 'single') {\n        return compareDay(day, currentDate) === 0 ? 'selected' : '';\n      }\n      if (type === 'multiple') {\n        return this.getMultipleDayType(day);\n      }\n      /* istanbul ignore else */\n      if (type === 'range') {\n        return this.getRangeDayType(day);\n      }\n    },\n    getBottomInfo(type) {\n      if (this.data.type === 'range') {\n        if (type === 'start') {\n          return '开始';\n        }\n        if (type === 'end') {\n          return '结束';\n        }\n        if (type === 'start-end') {\n          return '开始/结束';\n        }\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\"></wxs>\n<wxs src=\"../../../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-calendar__month\" style=\"{{ computed.getMonthStyle(visible, date, rowHeight) }}\">\n  <view wx:if=\"{{ showMonthTitle }}\" class=\"van-calendar__month-title\">\n    {{ computed.formatMonthTitle(date) }}\n  </view>\n\n  <view wx:if=\"{{ visible }}\" class=\"van-calendar__days\">\n    <view wx:if=\"{{ showMark }}\" class=\"van-calendar__month-mark\">\n      {{ computed.getMark(date) }}\n    </view>\n\n    <view\n      wx:for=\"{{ days }}\"\n      wx:key=\"index\"\n      style=\"{{ computed.getDayStyle(item.type, index, date, rowHeight, color) }}\"\n      class=\"{{ utils.bem('calendar__day', [item.type]) }} {{ item.className }}\"\n      data-index=\"{{ index }}\"\n      bindtap=\"onClick\"\n    >\n      <view wx:if=\"{{ item.type === 'selected' }}\" class=\"van-calendar__selected-day\" style=\"background: {{ color }}\">\n        <view wx:if=\"{{ item.topInfo }}\" class=\"van-calendar__top-info\">{{ item.topInfo }}</view>\n        {{ item.text }}\n        <view wx:if=\"{{ item.bottomInfo }}\" class=\"van-calendar__bottom-info\">\n          {{ item.bottomInfo }}\n        </view>\n      </view>\n\n      <view wx:else>\n        <view wx:if=\"{{ item.topInfo }}\" class=\"van-calendar__top-info\">{{ item.topInfo }}</view>\n        {{ item.text }}\n        <view wx:if=\"{{ item.bottomInfo }}\" class=\"van-calendar__bottom-info\">\n          {{ item.bottomInfo }}\n        </view>\n      </view>\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../../utils.wxs');\n\nfunction getMark(date) {\n  return getDate(date).getMonth() + 1;\n}\n\nvar ROW_HEIGHT = 64;\n\nfunction getDayStyle(type, index, date, rowHeight, color) {\n  var style = [];\n  var offset = getDate(date).getDay();\n\n  if (index === 0) {\n    style.push(['margin-left', (100 * offset) / 7 + '%']);\n  }\n\n  if (rowHeight !== ROW_HEIGHT) {\n    style.push(['height', rowHeight + 'px']);\n  }\n\n  if (color) {\n    if (\n      type === 'start' ||\n      type === 'end' ||\n      type === 'multiple-selected' ||\n      type === 'multiple-middle'\n    ) {\n      style.push(['background', color]);\n    } else if (type === 'middle') {\n      style.push(['color', color]);\n    }\n  }\n\n  return style\n    .map(function(item) {\n      return item.join(':');\n    })\n    .join(';');\n}\n\nfunction formatMonthTitle(date) {\n  date = getDate(date);\n  return date.getFullYear() + '年' + (date.getMonth() + 1) + '月';\n}\n\nfunction getMonthStyle(visible, date, rowHeight) {\n  if (!visible) {\n    date = getDate(date);\n\n    var totalDay = utils.getMonthEndDay(\n      date.getFullYear(),\n      date.getMonth() + 1\n    );\n    var offset = getDate(date).getDay();\n    var padding = Math.ceil((totalDay + offset) / 7) * rowHeight;\n\n    return 'padding-bottom:' + padding + 'px';\n  }\n}\n\nmodule.exports = {\n  getMark: getMark,\n  getDayStyle: getDayStyle,\n  formatMonthTitle: formatMonthTitle,\n  getMonthStyle: getMonthStyle\n};\n"
  },
  {
    "path": "miniprogram/vant/calendar/components/month/index.wxss",
    "content": "@import '../../../common/index.wxss';.van-calendar{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:100%;background-color:#fff;background-color:var(--calendar-background-color,#fff)}.van-calendar__month-title{text-align:center;height:44px;height:var(--calendar-header-title-height,44px);font-weight:500;font-weight:var(--font-weight-bold,500);font-size:14px;font-size:var(--calendar-month-title-font-size,14px);line-height:44px;line-height:var(--calendar-header-title-height,44px)}.van-calendar__days{position:relative;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-user-select:none;user-select:none}.van-calendar__month-mark{position:absolute;top:50%;left:50%;z-index:0;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);pointer-events:none;color:rgba(242,243,245,.8);color:var(--calendar-month-mark-color,rgba(242,243,245,.8));font-size:160px;font-size:var(--calendar-month-mark-font-size,160px)}.van-calendar__day,.van-calendar__selected-day{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;text-align:center}.van-calendar__day{position:relative;width:14.285%;height:64px;height:var(--calendar-day-height,64px);font-size:16px;font-size:var(--calendar-day-font-size,16px)}.van-calendar__day--end,.van-calendar__day--multiple-middle,.van-calendar__day--multiple-selected,.van-calendar__day--start,.van-calendar__day--start-end{color:#fff;color:var(--calendar-range-edge-color,#fff);background-color:#ee0a24;background-color:var(--calendar-range-edge-background-color,#ee0a24)}.van-calendar__day--start{border-radius:4px 0 0 4px;border-radius:var(--border-radius-md,4px) 0 0 var(--border-radius-md,4px)}.van-calendar__day--end{border-radius:0 4px 4px 0;border-radius:0 var(--border-radius-md,4px) var(--border-radius-md,4px) 0}.van-calendar__day--multiple-selected,.van-calendar__day--start-end{border-radius:4px;border-radius:var(--border-radius-md,4px)}.van-calendar__day--middle{color:#ee0a24;color:var(--calendar-range-middle-color,#ee0a24)}.van-calendar__day--middle:after{position:absolute;top:0;right:0;bottom:0;left:0;background-color:currentColor;content:\"\";opacity:.1;opacity:var(--calendar-range-middle-background-opacity,.1)}.van-calendar__day--disabled{cursor:default;color:#c8c9cc;color:var(--calendar-day-disabled-color,#c8c9cc)}.van-calendar__bottom-info,.van-calendar__top-info{position:absolute;right:0;left:0;font-size:10px;font-size:var(--calendar-info-font-size,10px);line-height:14px;line-height:var(--calendar-info-line-height,14px)}@media (max-width:350px){.van-calendar__bottom-info,.van-calendar__top-info{font-size:9px}}.van-calendar__top-info{top:6px}.van-calendar__bottom-info{bottom:6px}.van-calendar__selected-day{width:54px;width:var(--calendar-selected-day-size,54px);height:54px;height:var(--calendar-selected-day-size,54px);color:#fff;color:var(--calendar-selected-day-color,#fff);background-color:#ee0a24;background-color:var(--calendar-selected-day-background-color,#ee0a24);border-radius:4px;border-radius:var(--border-radius-md,4px)}"
  },
  {
    "path": "miniprogram/vant/calendar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/calendar/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport {\n  ROW_HEIGHT,\n  getNextDay,\n  compareDay,\n  copyDates,\n  calcDateNum,\n  formatMonthTitle,\n  compareMonth,\n  getMonths,\n  getDayByOffset,\n} from './utils';\nimport Toast from '../toast/toast';\nVantComponent({\n  props: {\n    title: {\n      type: String,\n      value: '日期选择',\n    },\n    color: String,\n    show: {\n      type: Boolean,\n      observer(val) {\n        if (val) {\n          this.initRect();\n          this.scrollIntoView();\n        }\n      },\n    },\n    formatter: null,\n    confirmText: {\n      type: String,\n      value: '确定',\n    },\n    rangePrompt: String,\n    defaultDate: {\n      type: [Number, Array],\n      observer(val) {\n        this.setData({ currentDate: val });\n        this.scrollIntoView();\n      },\n    },\n    allowSameDay: Boolean,\n    confirmDisabledText: String,\n    type: {\n      type: String,\n      value: 'single',\n      observer: 'reset',\n    },\n    minDate: {\n      type: null,\n      value: Date.now(),\n    },\n    maxDate: {\n      type: null,\n      value: new Date(\n        new Date().getFullYear(),\n        new Date().getMonth() + 6,\n        new Date().getDate()\n      ).getTime(),\n    },\n    position: {\n      type: String,\n      value: 'bottom',\n    },\n    rowHeight: {\n      type: [Number, String],\n      value: ROW_HEIGHT,\n    },\n    round: {\n      type: Boolean,\n      value: true,\n    },\n    poppable: {\n      type: Boolean,\n      value: true,\n    },\n    showMark: {\n      type: Boolean,\n      value: true,\n    },\n    showTitle: {\n      type: Boolean,\n      value: true,\n    },\n    showConfirm: {\n      type: Boolean,\n      value: true,\n    },\n    showSubtitle: {\n      type: Boolean,\n      value: true,\n    },\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n    closeOnClickOverlay: {\n      type: Boolean,\n      value: true,\n    },\n    maxRange: {\n      type: [Number, String],\n      value: null,\n    },\n  },\n  data: {\n    subtitle: '',\n    currentDate: null,\n    scrollIntoView: '',\n  },\n  created() {\n    this.setData({\n      currentDate: this.getInitialDate(),\n    });\n  },\n  mounted() {\n    if (this.data.show || !this.data.poppable) {\n      this.initRect();\n      this.scrollIntoView();\n    }\n  },\n  methods: {\n    reset() {\n      this.setData({ currentDate: this.getInitialDate() });\n      this.scrollIntoView();\n    },\n    initRect() {\n      if (this.contentObserver != null) {\n        this.contentObserver.disconnect();\n      }\n      const contentObserver = this.createIntersectionObserver({\n        thresholds: [0, 0.1, 0.9, 1],\n        observeAll: true,\n      });\n      this.contentObserver = contentObserver;\n      contentObserver.relativeTo('.van-calendar__body');\n      contentObserver.observe('.month', (res) => {\n        if (res.boundingClientRect.top <= res.relativeRect.top) {\n          // @ts-ignore\n          this.setData({ subtitle: formatMonthTitle(res.dataset.date) });\n        }\n      });\n    },\n    getInitialDate() {\n      const { type, defaultDate, minDate } = this.data;\n      if (type === 'range') {\n        const [startDay, endDay] = defaultDate || [];\n        return [\n          startDay || minDate,\n          endDay || getNextDay(new Date(minDate)).getTime(),\n        ];\n      }\n      if (type === 'multiple') {\n        return [defaultDate || minDate];\n      }\n      return defaultDate || minDate;\n    },\n    scrollIntoView() {\n      setTimeout(() => {\n        const {\n          currentDate,\n          type,\n          show,\n          poppable,\n          minDate,\n          maxDate,\n        } = this.data;\n        const targetDate = type === 'single' ? currentDate : currentDate[0];\n        const displayed = show || !poppable;\n        if (!targetDate || !displayed) {\n          return;\n        }\n        const months = getMonths(minDate, maxDate);\n        months.some((month, index) => {\n          if (compareMonth(month, targetDate) === 0) {\n            this.setData({ scrollIntoView: `month${index}` });\n            return true;\n          }\n          return false;\n        });\n      }, 100);\n    },\n    onOpen() {\n      this.$emit('open');\n    },\n    onOpened() {\n      this.$emit('opened');\n    },\n    onClose() {\n      this.$emit('close');\n    },\n    onClosed() {\n      this.$emit('closed');\n    },\n    onClickDay(event) {\n      const { date } = event.detail;\n      const { type, currentDate, allowSameDay } = this.data;\n      if (type === 'range') {\n        const [startDay, endDay] = currentDate;\n        if (startDay && !endDay) {\n          const compareToStart = compareDay(date, startDay);\n          if (compareToStart === 1) {\n            this.select([startDay, date], true);\n          } else if (compareToStart === -1) {\n            this.select([date, null]);\n          } else if (allowSameDay) {\n            this.select([date, date]);\n          }\n        } else {\n          this.select([date, null]);\n        }\n      } else if (type === 'multiple') {\n        let selectedIndex;\n        const selected = currentDate.some((dateItem, index) => {\n          const equal = compareDay(dateItem, date) === 0;\n          if (equal) {\n            selectedIndex = index;\n          }\n          return equal;\n        });\n        if (selected) {\n          const cancelDate = currentDate.splice(selectedIndex, 1);\n          this.setData({ currentDate });\n          this.unselect(cancelDate);\n        } else {\n          this.select([...currentDate, date]);\n        }\n      } else {\n        this.select(date, true);\n      }\n    },\n    unselect(dateArray) {\n      const date = dateArray[0];\n      if (date) {\n        this.$emit('unselect', copyDates(date));\n      }\n    },\n    select(date, complete) {\n      if (complete && this.data.type === 'range') {\n        const valid = this.checkRange(date);\n        if (!valid) {\n          // auto selected to max range if showConfirm\n          if (this.data.showConfirm) {\n            this.emit([\n              date[0],\n              getDayByOffset(date[0], this.data.maxRange - 1),\n            ]);\n          } else {\n            this.emit(date);\n          }\n          return;\n        }\n      }\n      this.emit(date);\n      if (complete && !this.data.showConfirm) {\n        this.onConfirm();\n      }\n    },\n    emit(date) {\n      const getTime = (date) => (date instanceof Date ? date.getTime() : date);\n      this.setData({\n        currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date),\n      });\n      this.$emit('select', copyDates(date));\n    },\n    checkRange(date) {\n      const { maxRange, rangePrompt } = this.data;\n      if (maxRange && calcDateNum(date) > maxRange) {\n        Toast({\n          context: this,\n          message: rangePrompt || `选择天数不能超过 ${maxRange} 天`,\n        });\n        return false;\n      }\n      return true;\n    },\n    onConfirm() {\n      if (this.data.type === 'range' && !this.checkRange()) {\n        return;\n      }\n      wx.nextTick(() => {\n        this.$emit('confirm', copyDates(this.data.currentDate));\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/calendar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"header\": \"./components/header/index\",\n    \"month\": \"./components/month/index\",\n    \"van-button\": \"../button/index\",\n    \"van-popup\": \"../popup/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/calendar/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<import src=\"./calendar.wxml\" />\n\n<van-popup\n  wx:if=\"{{ poppable }}\"\n  custom-class=\"van-calendar__popup--{{ position }}\"\n  close-icon-class=\"van-calendar__close-icon\"\n  show=\"{{ show }}\"\n  round=\"{{ round }}\"\n  position=\"{{ position }}\"\n  closeable=\"{{ showTitle || showSubtitle }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  bind:enter=\"onOpen\"\n  bind:close=\"onClose\"\n  bind:after-enter=\"onOpened\"\n  bind:after-leave=\"onClosed\"\n>\n  <template\n    is=\"calendar\"\n    data=\"{{ title, subtitle, showTitle, showSubtitle, minDate, maxDate, type, color, showMark, formatter, rowHeight, currentDate, safeAreaInsetBottom, showConfirm, confirmDisabledText, confirmText, scrollIntoView, allowSameDay }}\"\n  />\n</van-popup>\n\n<template\n  wx:else\n  is=\"calendar\"\n  data=\"{{ title, subtitle, showTitle, showSubtitle, minDate, maxDate, type, color, showMark, formatter, rowHeight, currentDate, safeAreaInsetBottom, showConfirm, confirmDisabledText, confirmText, scrollIntoView, allowSameDay }}\"\n/>\n\n<van-toast id=\"van-toast\" />\n"
  },
  {
    "path": "miniprogram/vant/calendar/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('./utils.wxs');\n\nfunction getMonths(minDate, maxDate) {\n  var months = [];\n  var cursor = getDate(minDate);\n\n  cursor.setDate(1);\n\n  do {\n    months.push(cursor.getTime());\n    cursor.setMonth(cursor.getMonth() + 1);\n  } while (utils.compareMonth(cursor, getDate(maxDate)) !== 1);\n\n  return months;\n}\n\nfunction getButtonDisabled(type, currentDate) {\n  if (currentDate == null) {\n    return true;\n  }\n\n  if (type === 'range') {\n    return !currentDate[0] || !currentDate[1];\n  }\n\n  if (type === 'multiple') {\n    return !currentDate.length;\n  }\n\n  return !currentDate;\n}\n\nmodule.exports = {\n  getMonths: getMonths,\n  getButtonDisabled: getButtonDisabled\n};\n"
  },
  {
    "path": "miniprogram/vant/calendar/index.wxss",
    "content": "@import '../common/index.wxss';.van-calendar{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;height:100%;height:var(--calendar-height,100%);background-color:#fff;background-color:var(--calendar-background-color,#fff)}.van-calendar__close-icon{top:11px}.van-calendar__popup--bottom,.van-calendar__popup--top{height:80%;height:var(--calendar-popup-height,80%)}.van-calendar__popup--left,.van-calendar__popup--right{height:100%}.van-calendar__body{-webkit-flex:1;flex:1;overflow:auto;-webkit-overflow-scrolling:touch}.van-calendar__footer{-webkit-flex-shrink:0;flex-shrink:0;padding:0 16px;padding:0 var(--padding-md,16px)}.van-calendar__footer--safe-area-inset-bottom{padding-bottom:env(safe-area-inset-bottom)}.van-calendar__footer+.van-calendar__footer,.van-calendar__footer:empty{display:none}.van-calendar__footer:empty+.van-calendar__footer{display:block!important}.van-calendar__confirm{height:36px!important;height:var(--calendar-confirm-button-height,36px)!important;margin:7px 0!important;margin:var(--calendar-confirm-button-margin,7px 0)!important;line-height:34px!important;line-height:var(--calendar-confirm-button-line-height,34px)!important}"
  },
  {
    "path": "miniprogram/vant/calendar/utils.d.ts",
    "content": "export declare const ROW_HEIGHT = 64;\nexport declare function formatMonthTitle(date: Date): string;\nexport declare function compareMonth(\n  date1: Date | number,\n  date2: Date | number\n): 0 | 1 | -1;\nexport declare function compareDay(\n  day1: Date | number,\n  day2: Date | number\n): 0 | 1 | -1;\nexport declare function getDayByOffset(date: Date, offset: number): Date;\nexport declare function getPrevDay(date: Date): Date;\nexport declare function getNextDay(date: Date): Date;\nexport declare function calcDateNum(date: [Date, Date]): number;\nexport declare function copyDates(dates: Date | Date[]): Date | Date[];\nexport declare function getMonthEndDay(year: number, month: number): number;\nexport declare function getMonths(minDate: number, maxDate: number): any[];\n"
  },
  {
    "path": "miniprogram/vant/calendar/utils.js",
    "content": "export const ROW_HEIGHT = 64;\nexport function formatMonthTitle(date) {\n  if (!(date instanceof Date)) {\n    date = new Date(date);\n  }\n  return `${date.getFullYear()}年${date.getMonth() + 1}月`;\n}\nexport function compareMonth(date1, date2) {\n  if (!(date1 instanceof Date)) {\n    date1 = new Date(date1);\n  }\n  if (!(date2 instanceof Date)) {\n    date2 = new Date(date2);\n  }\n  const year1 = date1.getFullYear();\n  const year2 = date2.getFullYear();\n  const month1 = date1.getMonth();\n  const month2 = date2.getMonth();\n  if (year1 === year2) {\n    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;\n  }\n  return year1 > year2 ? 1 : -1;\n}\nexport function compareDay(day1, day2) {\n  if (!(day1 instanceof Date)) {\n    day1 = new Date(day1);\n  }\n  if (!(day2 instanceof Date)) {\n    day2 = new Date(day2);\n  }\n  const compareMonthResult = compareMonth(day1, day2);\n  if (compareMonthResult === 0) {\n    const date1 = day1.getDate();\n    const date2 = day2.getDate();\n    return date1 === date2 ? 0 : date1 > date2 ? 1 : -1;\n  }\n  return compareMonthResult;\n}\nexport function getDayByOffset(date, offset) {\n  date = new Date(date);\n  date.setDate(date.getDate() + offset);\n  return date;\n}\nexport function getPrevDay(date) {\n  return getDayByOffset(date, -1);\n}\nexport function getNextDay(date) {\n  return getDayByOffset(date, 1);\n}\nexport function calcDateNum(date) {\n  const day1 = new Date(date[0]).getTime();\n  const day2 = new Date(date[1]).getTime();\n  return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;\n}\nexport function copyDates(dates) {\n  if (Array.isArray(dates)) {\n    return dates.map((date) => {\n      if (date === null) {\n        return date;\n      }\n      return new Date(date);\n    });\n  }\n  return new Date(dates);\n}\nexport function getMonthEndDay(year, month) {\n  return 32 - new Date(year, month - 1, 32).getDate();\n}\nexport function getMonths(minDate, maxDate) {\n  const months = [];\n  const cursor = new Date(minDate);\n  cursor.setDate(1);\n  do {\n    months.push(cursor.getTime());\n    cursor.setMonth(cursor.getMonth() + 1);\n  } while (compareMonth(cursor, maxDate) !== 1);\n  return months;\n}\n"
  },
  {
    "path": "miniprogram/vant/calendar/utils.wxs",
    "content": "/* eslint-disable */\nfunction getMonthEndDay(year, month) {\n  return 32 -  getDate(year, month - 1, 32).getDate();\n}\n\nfunction compareMonth(date1, date2) {\n  date1 = getDate(date1);\n  date2 = getDate(date2);\n\n  var year1 = date1.getFullYear();\n  var year2 = date2.getFullYear();\n  var month1 = date1.getMonth();\n  var month2 = date2.getMonth();\n\n  if (year1 === year2) {\n    return month1 === month2 ? 0 : month1 > month2 ? 1 : -1;\n  }\n\n  return year1 > year2 ? 1 : -1;\n}\n\nmodule.exports = {\n  getMonthEndDay: getMonthEndDay,\n  compareMonth: compareMonth\n};\n"
  },
  {
    "path": "miniprogram/vant/card/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/card/index.js",
    "content": "import { link } from '../mixins/link';\nimport { VantComponent } from '../common/component';\nVantComponent({\n  classes: [\n    'num-class',\n    'desc-class',\n    'thumb-class',\n    'title-class',\n    'price-class',\n    'origin-price-class',\n  ],\n  mixins: [link],\n  props: {\n    tag: String,\n    num: String,\n    desc: String,\n    thumb: String,\n    title: String,\n    price: {\n      type: String,\n      observer: 'updatePrice',\n    },\n    centered: Boolean,\n    lazyLoad: Boolean,\n    thumbLink: String,\n    originPrice: String,\n    thumbMode: {\n      type: String,\n      value: 'aspectFit',\n    },\n    currency: {\n      type: String,\n      value: '¥',\n    },\n  },\n  methods: {\n    updatePrice() {\n      const { price } = this.data;\n      const priceArr = price.toString().split('.');\n      this.setData({\n        integerStr: priceArr[0],\n        decimalStr: priceArr[1] ? `.${priceArr[1]}` : '',\n      });\n    },\n    onClickThumb() {\n      this.jumpLink('thumbLink');\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/card/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-tag\": \"../tag/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/card/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class van-card\">\n  <view class=\"{{ utils.bem('card__header', { center: centered }) }}\">\n    <view class=\"van-card__thumb\" bind:tap=\"onClickThumb\">\n      <image\n        wx:if=\"{{ thumb }}\"\n        src=\"{{ thumb }}\"\n        mode=\"{{ thumbMode }}\"\n        lazy-load=\"{{ lazyLoad }}\"\n        class=\"van-card__img thumb-class\"\n      />\n      <slot name=\"thumb\" />\n      <van-tag\n        wx:if=\"{{ tag }}\"\n        mark\n        type=\"danger\"\n        custom-class=\"van-card__tag\"\n      >\n        {{ tag }}\n      </van-tag>\n    </view>\n\n    <view class=\"van-card__content {{ utils.bem('card__content', { center: centered }) }}\">\n      <view>\n        <view wx:if=\"{{ title }}\" class=\"van-card__title title-class\">{{ title }}</view>\n        <slot wx:else name=\"title\" />\n\n        <view wx:if=\"{{ desc }}\" class=\"van-card__desc desc-class\">{{ desc }}</view>\n        <slot wx:else name=\"desc\" />\n\n        <slot name=\"tags\" />\n      </view>\n\n      <view class=\"van-card__bottom\">\n        <slot name=\"price-top\" />\n        <view wx:if=\"{{ price || price === 0 }}\" class=\"van-card__price price-class\">{{ currency }}<text class=\"van-card__price-integer\">{{ integerStr }}</text><text class=\"van-card__price-decimal\">{{ decimalStr }}</text></view>\n        <slot wx:else name=\"price\" />\n        <view wx:if=\"{{ originPrice || originPrice === 0 }}\" class=\"van-card__origin-price origin-price-class\">{{ currency }} {{ originPrice }}</view>\n        <view wx:if=\"{{ num }}\" class=\"van-card__num num-class\">x {{ num }}</view>\n        <slot wx:else  name=\"num\" />\n        <slot name=\"bottom\" />\n      </view>\n    </view>\n  </view>\n\n  <view class=\"van-card__footer\">\n    <slot name=\"footer\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/card/index.wxss",
    "content": "@import '../common/index.wxss';.van-card{position:relative;box-sizing:border-box;padding:8px 16px;padding:var(--card-padding,8px 16px);font-size:12px;font-size:var(--card-font-size,12px);color:#323233;color:var(--card-text-color,#323233);background-color:#fafafa;background-color:var(--card-background-color,#fafafa)}.van-card__header{display:-webkit-flex;display:flex}.van-card__header--center{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.van-card__thumb{position:relative;-webkit-flex:none;flex:none;width:88px;width:var(--card-thumb-size,88px);height:88px;height:var(--card-thumb-size,88px);margin-right:8px;margin-right:var(--padding-xs,8px)}.van-card__thumb:empty{display:none}.van-card__img{width:100%;height:100%;border-radius:8px;border-radius:var(--border-radius-lg,8px)}.van-card__content{position:relative;display:-webkit-flex;display:flex;-webkit-flex:1;flex:1;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:space-between;justify-content:space-between;min-width:0;min-height:88px;min-height:var(--card-thumb-size,88px)}.van-card__content--center{-webkit-justify-content:center;justify-content:center}.van-card__desc,.van-card__title{word-wrap:break-word}.van-card__title{font-weight:700;line-height:16px;line-height:var(--card-title-line-height,16px)}.van-card__desc{line-height:20px;line-height:var(--card-desc-line-height,20px);color:#646566;color:var(--card-desc-color,#646566)}.van-card__bottom{line-height:20px}.van-card__price{display:inline-block;font-weight:700;color:#ee0a24;color:var(--card-price-color,#ee0a24);font-size:12px;font-size:var(--card-price-font-size,12px)}.van-card__price-integer{font-size:16px;font-size:var(--card-price-integer-font-size,16px)}.van-card__price-decimal,.van-card__price-integer{font-family:Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--card-price-font-family,Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif)}.van-card__origin-price{display:inline-block;margin-left:5px;text-decoration:line-through;font-size:10px;font-size:var(--card-origin-price-font-size,10px);color:#646566;color:var(--card-origin-price-color,#646566)}.van-card__num{float:right}.van-card__tag{position:absolute;top:2px;left:0}.van-card__footer{-webkit-flex:none;flex:none;width:100%;text-align:right}"
  },
  {
    "path": "miniprogram/vant/cell/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/cell/index.js",
    "content": "import { link } from '../mixins/link';\nimport { VantComponent } from '../common/component';\nVantComponent({\n  classes: [\n    'title-class',\n    'label-class',\n    'value-class',\n    'right-icon-class',\n    'hover-class',\n  ],\n  mixins: [link],\n  props: {\n    title: null,\n    value: null,\n    icon: String,\n    size: String,\n    label: String,\n    center: Boolean,\n    isLink: Boolean,\n    required: Boolean,\n    clickable: Boolean,\n    titleWidth: String,\n    customStyle: String,\n    arrowDirection: String,\n    useLabelSlot: Boolean,\n    border: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    onClick(event) {\n      this.$emit('click', event.detail);\n      this.jumpLink();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/cell/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/cell/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('cell', [size, { center, required, borderless: !border, clickable: isLink || clickable }]) }}\"\n  hover-class=\"van-cell--hover hover-class\"\n  hover-stay-time=\"70\"\n  style=\"{{ customStyle }}\"\n  bind:tap=\"onClick\"\n>\n  <van-icon\n    wx:if=\"{{ icon }}\"\n    name=\"{{ icon }}\"\n    class=\"van-cell__left-icon-wrap\"\n    custom-class=\"van-cell__left-icon\"\n  />\n  <slot wx:else name=\"icon\" />\n\n  <view\n    style=\"{{ titleWidth ? 'max-width:' + titleWidth + ';min-width:' + titleWidth : '' }}\"\n    class=\"van-cell__title title-class\"\n  >\n    <block wx:if=\"{{ title }}\">{{ title }}</block>\n    <slot wx:else name=\"title\" />\n\n    <view wx:if=\"{{ label || useLabelSlot }}\" class=\"van-cell__label label-class\">\n      <slot wx:if=\"{{ useLabelSlot }}\" name=\"label\" />\n      <block wx:elif=\"{{ label }}\">{{ label }}</block>\n    </view>\n  </view>\n\n  <view class=\"van-cell__value value-class\">\n    <block wx:if=\"{{ value || value === 0 }}\">{{ value }}</block>\n    <slot wx:else />\n  </view>\n\n  <van-icon\n    wx:if=\"{{ isLink }}\"\n    name=\"{{ arrowDirection ? 'arrow' + '-' + arrowDirection : 'arrow' }}\"\n    class=\"van-cell__right-icon-wrap right-icon-class\"\n    custom-class=\"van-cell__right-icon\"\n  />\n  <slot wx:else name=\"right-icon\" />\n\n  <slot name=\"extra\" />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/cell/index.wxss",
    "content": "@import '../common/index.wxss';.van-cell{position:relative;display:-webkit-flex;display:flex;box-sizing:border-box;width:100%;padding:10px 16px;padding:var(--cell-vertical-padding,10px) var(--cell-horizontal-padding,16px);font-size:14px;font-size:var(--cell-font-size,14px);line-height:24px;line-height:var(--cell-line-height,24px);color:#323233;color:var(--cell-text-color,#323233);background-color:#fff;background-color:var(--cell-background-color,#fff)}.van-cell:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:\" \";pointer-events:none;top:auto;right:0;bottom:0;left:16px;border-bottom:1px solid #ebedf0;-webkit-transform:scaleY(.5);transform:scaleY(.5)}.van-cell--borderless:after{display:none}.van-cell-group{background-color:#fff;background-color:var(--cell-background-color,#fff)}.van-cell__label{margin-top:3px;margin-top:var(--cell-label-margin-top,3px);font-size:12px;font-size:var(--cell-label-font-size,12px);line-height:18px;line-height:var(--cell-label-line-height,18px);color:#969799;color:var(--cell-label-color,#969799)}.van-cell__value{overflow:hidden;text-align:right;vertical-align:middle;color:#969799;color:var(--cell-value-color,#969799)}.van-cell__title,.van-cell__value{-webkit-flex:1;flex:1}.van-cell__title:empty,.van-cell__value:empty{display:none}.van-cell__left-icon-wrap,.van-cell__right-icon-wrap{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:24px;height:var(--cell-line-height,24px);font-size:16px;font-size:var(--cell-icon-size,16px)}.van-cell__left-icon-wrap{margin-right:5px}.van-cell__right-icon-wrap{margin-left:5px;color:#969799;color:var(--cell-right-icon-color,#969799)}.van-cell__left-icon{vertical-align:middle}.van-cell__left-icon,.van-cell__right-icon{line-height:24px;line-height:var(--cell-line-height,24px)}.van-cell--clickable.van-cell--hover{background-color:#f2f3f5;background-color:var(--cell-active-color,#f2f3f5)}.van-cell--required{overflow:visible}.van-cell--required:before{position:absolute;content:\"*\";left:8px;left:var(--padding-xs,8px);font-size:14px;font-size:var(--cell-font-size,14px);color:#ee0a24;color:var(--cell-required-color,#ee0a24)}.van-cell--center{-webkit-align-items:center;align-items:center}.van-cell--large{padding-top:12px;padding-top:var(--cell-large-vertical-padding,12px);padding-bottom:12px;padding-bottom:var(--cell-large-vertical-padding,12px)}.van-cell--large .van-cell__title{font-size:16px;font-size:var(--cell-large-title-font-size,16px)}.van-cell--large .van-cell__value{font-size:16px;font-size:var(--cell-large-value-font-size,16px)}.van-cell--large .van-cell__label{font-size:14px;font-size:var(--cell-large-label-font-size,14px)}"
  },
  {
    "path": "miniprogram/vant/cell-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/cell-group/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    title: String,\n    border: {\n      type: Boolean,\n      value: true,\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/cell-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/cell-group/index.wxml",
    "content": "<view\n  wx:if=\"{{ title }}\"\n  class=\"van-cell-group__title\"\n>\n  {{ title }}\n</view>\n<view class=\"custom-class van-cell-group {{ border ? 'van-hairline--top-bottom' : '' }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/cell-group/index.wxss",
    "content": "@import '../common/index.wxss';.van-cell-group__title{padding:16px 16px 8px;padding:var(--cell-group-title-padding,16px 16px 8px);font-size:14px;font-size:var(--cell-group-title-font-size,14px);line-height:16px;line-height:var(--cell-group-title-line-height,16px);color:#969799;color:var(--cell-group-title-color,#969799)}"
  },
  {
    "path": "miniprogram/vant/checkbox/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/checkbox/index.js",
    "content": "import { VantComponent } from '../common/component';\nfunction emit(target, value) {\n  target.$emit('input', value);\n  target.$emit('change', value);\n}\nVantComponent({\n  field: true,\n  relation: {\n    name: 'checkbox-group',\n    type: 'ancestor',\n    current: 'checkbox',\n  },\n  classes: ['icon-class', 'label-class'],\n  props: {\n    value: Boolean,\n    disabled: Boolean,\n    useIconSlot: Boolean,\n    checkedColor: String,\n    labelPosition: String,\n    labelDisabled: Boolean,\n    shape: {\n      type: String,\n      value: 'round',\n    },\n    iconSize: {\n      type: null,\n      value: 20,\n    },\n  },\n  data: {\n    parentDisabled: false,\n  },\n  methods: {\n    emitChange(value) {\n      if (this.parent) {\n        this.setParentValue(this.parent, value);\n      } else {\n        emit(this, value);\n      }\n    },\n    toggle() {\n      const { parentDisabled, disabled, value } = this.data;\n      if (!disabled && !parentDisabled) {\n        this.emitChange(!value);\n      }\n    },\n    onClickLabel() {\n      const { labelDisabled, parentDisabled, disabled, value } = this.data;\n      if (!disabled && !labelDisabled && !parentDisabled) {\n        this.emitChange(!value);\n      }\n    },\n    setParentValue(parent, value) {\n      const parentValue = parent.data.value.slice();\n      const { name } = this.data;\n      const { max } = parent.data;\n      if (value) {\n        if (max && parentValue.length >= max) {\n          return;\n        }\n        if (parentValue.indexOf(name) === -1) {\n          parentValue.push(name);\n          emit(parent, parentValue);\n        }\n      } else {\n        const index = parentValue.indexOf(name);\n        if (index !== -1) {\n          parentValue.splice(index, 1);\n          emit(parent, parentValue);\n        }\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/checkbox/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/checkbox/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-checkbox custom-class\">\n  <view class=\"van-checkbox__icon-wrap\" bindtap=\"toggle\">\n    <slot wx:if=\"{{ useIconSlot }}\" name=\"icon\" />\n    <van-icon\n      wx:else\n      name=\"success\"\n      size=\"0.8em\"\n      class=\"{{ utils.bem('checkbox__icon', [shape, { disabled: disabled || parentDisabled, checked: value }]) }}\"\n      style=\"{{ computed.iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) }}\"\n      custom-class=\"icon-class\"\n      custom-style=\"line-height: 1.25em;\"\n    />\n  </view>\n  <view class=\"label-class {{ utils.bem('checkbox__label', [labelPosition, { disabled: disabled || parentDisabled }]) }}\" bindtap=\"onClickLabel\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/checkbox/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../wxs/utils.wxs');\n\nfunction iconStyle(checkedColor, value, disabled, parentDisabled, iconSize) {\n  var styles = [['font-size', utils.addUnit(iconSize)]];\n  if (checkedColor && value && !disabled && !parentDisabled) {\n    styles.push(['border-color', checkedColor]);\n    styles.push(['background-color', checkedColor]);\n  }\n\n  return styles\n    .map(function(item) {\n      return item.join(':');\n    })\n    .join(';');\n}\n\nmodule.exports = {\n  iconStyle: iconStyle\n};\n"
  },
  {
    "path": "miniprogram/vant/checkbox/index.wxss",
    "content": "@import '../common/index.wxss';.van-checkbox{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;overflow:hidden;-webkit-user-select:none;user-select:none}.van-checkbox__icon-wrap,.van-checkbox__label{line-height:20px;line-height:var(--checkbox-size,20px)}.van-checkbox__icon-wrap{-webkit-flex:none;flex:none}.van-checkbox__icon{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;width:1em;height:1em;color:transparent;text-align:center;transition-property:color,border-color,background-color;font-size:20px;font-size:var(--checkbox-size,20px);border:1px solid #c8c9cc;border:1px solid var(--checkbox-border-color,#c8c9cc);transition-duration:.2s;transition-duration:var(--checkbox-transition-duration,.2s)}.van-checkbox__icon--round{border-radius:100%}.van-checkbox__icon--checked{color:#fff;color:var(--white,#fff);background-color:#1989fa;background-color:var(--checkbox-checked-icon-color,#1989fa);border-color:#1989fa;border-color:var(--checkbox-checked-icon-color,#1989fa)}.van-checkbox__icon--disabled{background-color:#ebedf0;background-color:var(--checkbox-disabled-background-color,#ebedf0);border-color:#c8c9cc;border-color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__icon--disabled.van-checkbox__icon--checked{color:#c8c9cc;color:var(--checkbox-disabled-icon-color,#c8c9cc)}.van-checkbox__label{word-wrap:break-word;margin-left:10px;margin-left:var(--checkbox-label-margin,10px);color:#323233;color:var(--checkbox-label-color,#323233)}.van-checkbox__label--left{float:left;margin:0 10px 0 0;margin:0 var(--checkbox-label-margin,10px) 0 0}.van-checkbox__label--disabled{color:#c8c9cc;color:var(--checkbox-disabled-label-color,#c8c9cc)}.van-checkbox__label:empty{margin:0}"
  },
  {
    "path": "miniprogram/vant/checkbox-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/checkbox-group/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  field: true,\n  relation: {\n    name: 'checkbox',\n    type: 'descendant',\n    current: 'checkbox-group',\n    linked(target) {\n      this.updateChild(target);\n    },\n  },\n  props: {\n    max: Number,\n    value: {\n      type: Array,\n      observer: 'updateChildren',\n    },\n    disabled: {\n      type: Boolean,\n      observer: 'updateChildren',\n    },\n  },\n  methods: {\n    updateChildren() {\n      (this.children || []).forEach((child) => this.updateChild(child));\n    },\n    updateChild(child) {\n      const { value, disabled } = this.data;\n      child.setData({\n        value: value.indexOf(child.data.name) !== -1,\n        parentDisabled: disabled,\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/checkbox-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/checkbox-group/index.wxml",
    "content": "<slot />\n"
  },
  {
    "path": "miniprogram/vant/checkbox-group/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram/vant/circle/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/circle/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isObj } from '../common/utils';\nimport { BLUE, WHITE } from '../common/color';\nfunction format(rate) {\n  return Math.min(Math.max(rate, 0), 100);\n}\nconst PERIMETER = 2 * Math.PI;\nconst BEGIN_ANGLE = -Math.PI / 2;\nconst STEP = 1;\nVantComponent({\n  props: {\n    text: String,\n    lineCap: {\n      type: String,\n      value: 'round',\n    },\n    value: {\n      type: Number,\n      value: 0,\n      observer: 'reRender',\n    },\n    speed: {\n      type: Number,\n      value: 50,\n    },\n    size: {\n      type: Number,\n      value: 100,\n    },\n    fill: String,\n    layerColor: {\n      type: String,\n      value: WHITE,\n    },\n    color: {\n      type: [String, Object],\n      value: BLUE,\n      observer: 'setHoverColor',\n    },\n    type: {\n      type: String,\n      value: '',\n    },\n    strokeWidth: {\n      type: Number,\n      value: 4,\n    },\n    clockwise: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    hoverColor: BLUE,\n  },\n  methods: {\n    getContext() {\n      if (!this.ctx) {\n        this.ctx = wx.createCanvasContext('van-circle', this);\n      }\n      return this.ctx;\n    },\n    setHoverColor() {\n      const { color, size, type } = this.data;\n      const context = type ? this.getContext(type) : this.getContext();\n      let hoverColor = color;\n      if (isObj(color)) {\n        const LinearColor = context.createLinearGradient(size, 0, 0, 0);\n        Object.keys(color)\n          .sort((a, b) => parseFloat(a) - parseFloat(b))\n          .map((key) =>\n            LinearColor.addColorStop(parseFloat(key) / 100, color[key])\n          );\n        hoverColor = LinearColor;\n      }\n      this.setData({ hoverColor });\n    },\n    presetCanvas(context, strokeStyle, beginAngle, endAngle, fill) {\n      const { strokeWidth, lineCap, clockwise, size } = this.data;\n      const position = size / 2;\n      const radius = position - strokeWidth / 2;\n      context.setStrokeStyle(strokeStyle);\n      context.setLineWidth(strokeWidth);\n      context.setLineCap(lineCap);\n      context.beginPath();\n      context.arc(position, position, radius, beginAngle, endAngle, !clockwise);\n      context.stroke();\n      if (fill) {\n        context.setFillStyle(fill);\n        context.fill();\n      }\n    },\n    renderLayerCircle(context) {\n      const { layerColor, fill } = this.data;\n      this.presetCanvas(context, layerColor, 0, PERIMETER, fill);\n    },\n    renderHoverCircle(context, formatValue) {\n      const { clockwise, hoverColor } = this.data;\n      // 结束角度\n      const progress = PERIMETER * (formatValue / 100);\n      const endAngle = clockwise\n        ? BEGIN_ANGLE + progress\n        : 3 * Math.PI - (BEGIN_ANGLE + progress);\n      this.presetCanvas(context, hoverColor, BEGIN_ANGLE, endAngle);\n    },\n    drawCircle(currentValue) {\n      const { size, type } = this.data;\n      const context = type ? this.getContext(type) : this.getContext();\n      context.clearRect(0, 0, size, size);\n      this.renderLayerCircle(context);\n      const formatValue = format(currentValue);\n      if (formatValue !== 0) {\n        this.renderHoverCircle(context, formatValue);\n      }\n      context.draw();\n    },\n    reRender() {\n      // tofector 动画暂时没有想到好的解决方案\n      const { value, speed } = this.data;\n      if (speed <= 0 || speed > 1000) {\n        this.drawCircle(value);\n        return;\n      }\n      this.clearInterval();\n      this.currentValue = this.currentValue || 0;\n      this.interval = setInterval(() => {\n        if (this.currentValue !== value) {\n          if (this.currentValue < value) {\n            this.currentValue += STEP;\n          } else {\n            this.currentValue -= STEP;\n          }\n          this.drawCircle(this.currentValue);\n        } else {\n          this.clearInterval();\n        }\n      }, 1000 / speed);\n    },\n    clearInterval() {\n      if (this.interval) {\n        clearInterval(this.interval);\n        this.interval = null;\n      }\n    },\n  },\n  created() {\n    const { value } = this.data;\n    this.currentValue = value;\n    this.drawCircle(value);\n  },\n  destroyed() {\n    this.ctx = null;\n    this.clearInterval();\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/circle/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/circle/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-circle\">\n  <canvas class=\"van-circle__canvas\" style=\"width: {{ utils.addUnit(size) }};height:{{ utils.addUnit(size) }}\" canvas-id=\"van-circle\"></canvas>\n  <view wx:if=\"{{ !text }}\" class=\"van-circle__text\">\n    <slot></slot>\n  </view>\n  <cover-view wx:else class=\"van-circle__text\">{{ text }}</cover-view>\n</view>"
  },
  {
    "path": "miniprogram/vant/circle/index.wxss",
    "content": "@import '../common/index.wxss';.van-circle{position:relative;display:inline-block;text-align:center}.van-circle__text{position:absolute;top:50%;left:0;width:100%;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#323233;color:var(--circle-text-color,#323233)}"
  },
  {
    "path": "miniprogram/vant/col/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/col/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'row',\n    type: 'ancestor',\n    current: 'col',\n  },\n  props: {\n    span: Number,\n    offset: Number,\n  },\n  data: {\n    viewStyle: '',\n  },\n  methods: {\n    setGutter(gutter) {\n      const padding = `${gutter / 2}px`;\n      const viewStyle = gutter\n        ? `padding-left: ${padding}; padding-right: ${padding};`\n        : '';\n      if (viewStyle !== this.data.viewStyle) {\n        this.setData({ viewStyle });\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/col/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/col/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('col', [span]) }} {{ offset ? 'van-col--offset-' + offset : '' }}\"\n  style=\"{{ viewStyle }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/col/index.wxss",
    "content": "@import '../common/index.wxss';.van-col{float:left;box-sizing:border-box}.van-col--1{width:4.16666667%}.van-col--offset-1{margin-left:4.16666667%}.van-col--2{width:8.33333333%}.van-col--offset-2{margin-left:8.33333333%}.van-col--3{width:12.5%}.van-col--offset-3{margin-left:12.5%}.van-col--4{width:16.66666667%}.van-col--offset-4{margin-left:16.66666667%}.van-col--5{width:20.83333333%}.van-col--offset-5{margin-left:20.83333333%}.van-col--6{width:25%}.van-col--offset-6{margin-left:25%}.van-col--7{width:29.16666667%}.van-col--offset-7{margin-left:29.16666667%}.van-col--8{width:33.33333333%}.van-col--offset-8{margin-left:33.33333333%}.van-col--9{width:37.5%}.van-col--offset-9{margin-left:37.5%}.van-col--10{width:41.66666667%}.van-col--offset-10{margin-left:41.66666667%}.van-col--11{width:45.83333333%}.van-col--offset-11{margin-left:45.83333333%}.van-col--12{width:50%}.van-col--offset-12{margin-left:50%}.van-col--13{width:54.16666667%}.van-col--offset-13{margin-left:54.16666667%}.van-col--14{width:58.33333333%}.van-col--offset-14{margin-left:58.33333333%}.van-col--15{width:62.5%}.van-col--offset-15{margin-left:62.5%}.van-col--16{width:66.66666667%}.van-col--offset-16{margin-left:66.66666667%}.van-col--17{width:70.83333333%}.van-col--offset-17{margin-left:70.83333333%}.van-col--18{width:75%}.van-col--offset-18{margin-left:75%}.van-col--19{width:79.16666667%}.van-col--offset-19{margin-left:79.16666667%}.van-col--20{width:83.33333333%}.van-col--offset-20{margin-left:83.33333333%}.van-col--21{width:87.5%}.van-col--offset-21{margin-left:87.5%}.van-col--22{width:91.66666667%}.van-col--offset-22{margin-left:91.66666667%}.van-col--23{width:95.83333333%}.van-col--offset-23{margin-left:95.83333333%}.van-col--24{width:100%}.van-col--offset-24{margin-left:100%}"
  },
  {
    "path": "miniprogram/vant/collapse/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/collapse/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'collapse-item',\n    type: 'descendant',\n    current: 'collapse',\n  },\n  props: {\n    value: {\n      type: null,\n      observer: 'updateExpanded',\n    },\n    accordion: {\n      type: Boolean,\n      observer: 'updateExpanded',\n    },\n    border: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    updateExpanded() {\n      this.children.forEach((child) => {\n        child.updateExpanded();\n      });\n    },\n    switch(name, expanded) {\n      const { accordion, value } = this.data;\n      const changeItem = name;\n      if (!accordion) {\n        name = expanded\n          ? (value || []).concat(name)\n          : (value || []).filter((activeName) => activeName !== name);\n      } else {\n        name = expanded ? name : '';\n      }\n      if (expanded) {\n        this.$emit('open', changeItem);\n      } else {\n        this.$emit('close', changeItem);\n      }\n      this.$emit('change', name);\n      this.$emit('input', name);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/collapse/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/collapse/index.wxml",
    "content": "<view class=\"custom-class van-collapse {{ border ? 'van-hairline--top-bottom' : '' }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/collapse/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram/vant/collapse-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/collapse-item/index.js",
    "content": "import { VantComponent } from '../common/component';\nconst nextTick = () => new Promise((resolve) => setTimeout(resolve, 20));\nVantComponent({\n  classes: ['title-class', 'content-class'],\n  relation: {\n    name: 'collapse',\n    type: 'ancestor',\n    current: 'collapse-item',\n  },\n  props: {\n    name: null,\n    title: null,\n    value: null,\n    icon: String,\n    label: String,\n    disabled: Boolean,\n    clickable: Boolean,\n    border: {\n      type: Boolean,\n      value: true,\n    },\n    isLink: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    contentHeight: 0,\n    expanded: false,\n    transition: false,\n  },\n  mounted() {\n    this.updateExpanded()\n      .then(nextTick)\n      .then(() => {\n        const data = { transition: true };\n        if (this.data.expanded) {\n          data.contentHeight = 'auto';\n        }\n        this.setData(data);\n      });\n  },\n  methods: {\n    updateExpanded() {\n      if (!this.parent) {\n        return Promise.resolve();\n      }\n      const { value, accordion } = this.parent.data;\n      const { children = [] } = this.parent;\n      const { name } = this.data;\n      const index = children.indexOf(this);\n      const currentName = name == null ? index : name;\n      const expanded = accordion\n        ? value === currentName\n        : (value || []).some((name) => name === currentName);\n      const stack = [];\n      if (expanded !== this.data.expanded) {\n        stack.push(this.updateStyle(expanded));\n      }\n      stack.push(this.set({ index, expanded }));\n      return Promise.all(stack);\n    },\n    updateStyle(expanded) {\n      return this.getRect('.van-collapse-item__content')\n        .then((rect) => rect.height)\n        .then((height) => {\n          if (expanded) {\n            return this.set({\n              contentHeight: height ? `${height}px` : 'auto',\n            });\n          }\n          return this.set({ contentHeight: `${height}px` })\n            .then(nextTick)\n            .then(() => this.set({ contentHeight: 0 }));\n        });\n    },\n    onClick() {\n      if (this.data.disabled) {\n        return;\n      }\n      const { name, expanded } = this.data;\n      const index = this.parent.children.indexOf(this);\n      const currentName = name == null ? index : name;\n      this.parent.switch(currentName, !expanded);\n    },\n    onTransitionEnd() {\n      if (this.data.expanded) {\n        this.setData({\n          contentHeight: 'auto',\n        });\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/collapse-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/collapse-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-collapse-item custom-class {{ index !== 0 ? 'van-hairline--top' : '' }}\">\n  <van-cell\n    title=\"{{ title }}\"\n    title-class=\"title-class\"\n    icon=\"{{ icon }}\"\n    value=\"{{ value }}\"\n    label=\"{{ label }}\"\n    is-link=\"{{ isLink }}\"\n    clickable=\"{{ clickable }}\"\n    border=\"{{ border && expanded }}\"\n    class=\"{{ utils.bem('collapse-item__title', { disabled, expanded }) }}\"\n    right-icon-class=\"van-cell__right-icon\"\n    custom-class=\"van-cell\"\n    hover-class=\"van-cell--hover\"\n    bind:click=\"onClick\"\n  >\n    <slot\n      name=\"title\"\n      slot=\"title\"\n    />\n    <slot\n      name=\"icon\"\n      slot=\"icon\"\n    />\n    <slot name=\"value\" />\n    <slot\n      name=\"right-icon\"\n      slot=\"right-icon\"\n    />\n  </van-cell>\n  <view\n    class=\"{{ utils.bem('collapse-item__wrapper', { transition }) }}\"\n    style=\"height: {{ contentHeight }};\"\n    bind:transitionend=\"onTransitionEnd\"\n  >\n    <view\n      class=\"van-collapse-item__content content-class\"\n    >\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/collapse-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-collapse-item__title .van-cell__right-icon{-webkit-transform:rotate(90deg);transform:rotate(90deg);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;transition:-webkit-transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s);transition:transform var(--collapse-item-transition-duration,.3s),-webkit-transform var(--collapse-item-transition-duration,.3s)}.van-collapse-item__title--expanded .van-cell__right-icon{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.van-collapse-item__title--disabled .van-cell,.van-collapse-item__title--disabled .van-cell__right-icon{color:#c8c9cc!important;color:var(--collapse-item-title-disabled-color,#c8c9cc)!important}.van-collapse-item__title--disabled .van-cell--hover{background-color:#fff!important;background-color:var(--white,#fff)!important}.van-collapse-item__wrapper{overflow:hidden}.van-collapse-item__wrapper--transition{transition:height .3s ease-in-out}.van-collapse-item__content{padding:15px;padding:var(--collapse-item-content-padding,15px);color:#969799;color:var(--collapse-item-content-text-color,#969799);font-size:13px;font-size:var(--collapse-item-content-font-size,13px);line-height:1.5;line-height:var(--collapse-item-content-line-height,1.5);background-color:#fff;background-color:var(--collapse-item-content-background-color,#fff)}"
  },
  {
    "path": "miniprogram/vant/common/color.d.ts",
    "content": "export declare const RED = \"#ee0a24\";\nexport declare const BLUE = \"#1989fa\";\nexport declare const WHITE = \"#fff\";\nexport declare const GREEN = \"#07c160\";\nexport declare const ORANGE = \"#ff976a\";\nexport declare const GRAY = \"#323233\";\nexport declare const GRAY_DARK = \"#969799\";\n"
  },
  {
    "path": "miniprogram/vant/common/color.js",
    "content": "export const RED = '#ee0a24';\nexport const BLUE = '#1989fa';\nexport const WHITE = '#fff';\nexport const GREEN = '#07c160';\nexport const ORANGE = '#ff976a';\nexport const GRAY = '#323233';\nexport const GRAY_DARK = '#969799';\n"
  },
  {
    "path": "miniprogram/vant/common/component.d.ts",
    "content": "import { VantComponentOptions, CombinedComponentInstance } from '../definitions/index';\ndeclare function VantComponent<Data, Props, Methods>(vantOptions?: VantComponentOptions<Data, Props, Methods, CombinedComponentInstance<Data, Props, Methods>>): void;\nexport { VantComponent };\n"
  },
  {
    "path": "miniprogram/vant/common/component.js",
    "content": "import { basic } from '../mixins/basic';\nconst relationFunctions = {\n  ancestor: {\n    linked(parent) {\n      this.parent = parent;\n    },\n    unlinked() {\n      this.parent = null;\n    },\n  },\n  descendant: {\n    linked(child) {\n      this.children = this.children || [];\n      this.children.push(child);\n    },\n    unlinked(child) {\n      this.children = (this.children || []).filter((it) => it !== child);\n    },\n  },\n};\nfunction mapKeys(source, target, map) {\n  Object.keys(map).forEach((key) => {\n    if (source[key]) {\n      target[map[key]] = source[key];\n    }\n  });\n}\nfunction makeRelation(options, vantOptions, relation) {\n  const { type, name, linked, unlinked, linkChanged } = relation;\n  const { beforeCreate, destroyed } = vantOptions;\n  if (type === 'descendant') {\n    options.created = function () {\n      beforeCreate && beforeCreate.bind(this)();\n      this.children = this.children || [];\n    };\n    options.detached = function () {\n      this.children = [];\n      destroyed && destroyed.bind(this)();\n    };\n  }\n  options.relations = Object.assign(options.relations || {}, {\n    [`../${name}/index`]: {\n      type,\n      linked(node) {\n        relationFunctions[type].linked.bind(this)(node);\n        linked && linked.bind(this)(node);\n      },\n      linkChanged(node) {\n        linkChanged && linkChanged.bind(this)(node);\n      },\n      unlinked(node) {\n        relationFunctions[type].unlinked.bind(this)(node);\n        unlinked && unlinked.bind(this)(node);\n      },\n    },\n  });\n}\nfunction VantComponent(vantOptions = {}) {\n  const options = {};\n  mapKeys(vantOptions, options, {\n    data: 'data',\n    props: 'properties',\n    mixins: 'behaviors',\n    methods: 'methods',\n    beforeCreate: 'created',\n    created: 'attached',\n    mounted: 'ready',\n    relations: 'relations',\n    destroyed: 'detached',\n    classes: 'externalClasses',\n  });\n  const { relation } = vantOptions;\n  if (relation) {\n    makeRelation(options, vantOptions, relation);\n  }\n  // add default externalClasses\n  options.externalClasses = options.externalClasses || [];\n  options.externalClasses.push('custom-class');\n  // add default behaviors\n  options.behaviors = options.behaviors || [];\n  options.behaviors.push(basic);\n  // map field to form-field behavior\n  if (vantOptions.field) {\n    options.behaviors.push('wx://form-field');\n  }\n  if (options.properties) {\n    Object.keys(options.properties).forEach((name) => {\n      if (Array.isArray(options.properties[name])) {\n        // miniprogram do not allow multi type\n        options.properties[name] = null;\n      }\n    });\n  }\n  // add default options\n  options.options = {\n    multipleSlots: true,\n    addGlobalClass: true,\n  };\n  Component(options);\n}\nexport { VantComponent };\n"
  },
  {
    "path": "miniprogram/vant/common/index.wxss",
    "content": ".van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:\"\"}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:\" \";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}"
  },
  {
    "path": "miniprogram/vant/common/style/clearfix.wxss",
    "content": ".van-clearfix:after{display:table;clear:both;content:\"\"}"
  },
  {
    "path": "miniprogram/vant/common/style/ellipsis.wxss",
    "content": ".van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}"
  },
  {
    "path": "miniprogram/vant/common/style/hairline.wxss",
    "content": ".van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:\" \";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px}"
  },
  {
    "path": "miniprogram/vant/common/style/mixins/clearfix.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/vant/common/style/mixins/ellipsis.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/vant/common/style/mixins/hairline.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/vant/common/style/theme.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/vant/common/style/var.wxss",
    "content": ""
  },
  {
    "path": "miniprogram/vant/common/utils.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport declare function isDef(value: any): boolean;\nexport declare function isObj(x: any): boolean;\nexport declare function isNumber(value: any): boolean;\nexport declare function range(num: number, min: number, max: number): number;\nexport declare function nextTick(fn: Function): void;\nexport declare function getSystemInfoSync(): WechatMiniprogram.GetSystemInfoSyncResult;\nexport declare function addUnit(value?: string | number): string | undefined;\n"
  },
  {
    "path": "miniprogram/vant/common/utils.js",
    "content": "export function isDef(value) {\n    return value !== undefined && value !== null;\n}\nexport function isObj(x) {\n    const type = typeof x;\n    return x !== null && (type === 'object' || type === 'function');\n}\nexport function isNumber(value) {\n    return /^\\d+(\\.\\d+)?$/.test(value);\n}\nexport function range(num, min, max) {\n    return Math.min(Math.max(num, min), max);\n}\nexport function nextTick(fn) {\n    setTimeout(() => {\n        fn();\n    }, 1000 / 30);\n}\nlet systemInfo = null;\nexport function getSystemInfoSync() {\n    if (systemInfo == null) {\n        systemInfo = wx.getSystemInfoSync();\n    }\n    return systemInfo;\n}\nexport function addUnit(value) {\n    if (!isDef(value)) {\n        return undefined;\n    }\n    value = String(value);\n    return isNumber(value) ? `${value}px` : value;\n}\n"
  },
  {
    "path": "miniprogram/vant/common/version.d.ts",
    "content": "export declare function canIUseModel(): boolean;\n"
  },
  {
    "path": "miniprogram/vant/common/version.js",
    "content": "import { getSystemInfoSync } from './utils';\nfunction compareVersion(v1, v2) {\n  v1 = v1.split('.');\n  v2 = v2.split('.');\n  const len = Math.max(v1.length, v2.length);\n  while (v1.length < len) {\n    v1.push('0');\n  }\n  while (v2.length < len) {\n    v2.push('0');\n  }\n  for (let i = 0; i < len; i++) {\n    const num1 = parseInt(v1[i], 10);\n    const num2 = parseInt(v2[i], 10);\n    if (num1 > num2) {\n      return 1;\n    }\n    if (num1 < num2) {\n      return -1;\n    }\n  }\n  return 0;\n}\nexport function canIUseModel() {\n  const system = getSystemInfoSync();\n  return compareVersion(system.SDKVersion, '2.9.3') >= 0;\n}\n"
  },
  {
    "path": "miniprogram/vant/count-down/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/count-down/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isSameSecond, parseFormat, parseTimeData } from './utils';\nfunction simpleTick(fn) {\n  return setTimeout(fn, 30);\n}\nVantComponent({\n  props: {\n    useSlot: Boolean,\n    millisecond: Boolean,\n    time: {\n      type: Number,\n      observer: 'reset',\n    },\n    format: {\n      type: String,\n      value: 'HH:mm:ss',\n    },\n    autoStart: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    timeData: parseTimeData(0),\n    formattedTime: '0',\n  },\n  destroyed() {\n    clearTimeout(this.tid);\n    this.tid = null;\n  },\n  methods: {\n    // 开始\n    start() {\n      if (this.counting) {\n        return;\n      }\n      this.counting = true;\n      this.endTime = Date.now() + this.remain;\n      this.tick();\n    },\n    // 暂停\n    pause() {\n      this.counting = false;\n      clearTimeout(this.tid);\n    },\n    // 重置\n    reset() {\n      this.pause();\n      this.remain = this.data.time;\n      this.setRemain(this.remain);\n      if (this.data.autoStart) {\n        this.start();\n      }\n    },\n    tick() {\n      if (this.data.millisecond) {\n        this.microTick();\n      } else {\n        this.macroTick();\n      }\n    },\n    microTick() {\n      this.tid = simpleTick(() => {\n        this.setRemain(this.getRemain());\n        if (this.remain !== 0) {\n          this.microTick();\n        }\n      });\n    },\n    macroTick() {\n      this.tid = simpleTick(() => {\n        const remain = this.getRemain();\n        if (!isSameSecond(remain, this.remain) || remain === 0) {\n          this.setRemain(remain);\n        }\n        if (this.remain !== 0) {\n          this.macroTick();\n        }\n      });\n    },\n    getRemain() {\n      return Math.max(this.endTime - Date.now(), 0);\n    },\n    setRemain(remain) {\n      this.remain = remain;\n      const timeData = parseTimeData(remain);\n      if (this.data.useSlot) {\n        this.$emit('change', timeData);\n      }\n      this.setData({\n        formattedTime: parseFormat(this.data.format, timeData),\n      });\n      if (remain === 0) {\n        this.pause();\n        this.$emit('finish');\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/count-down/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/count-down/index.wxml",
    "content": "<view class=\"van-count-down\">\n  <slot wx:if=\"{{ useSlot }}\"/>\n  <block wx:else>{{ formattedTime }}</block>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/count-down/index.wxss",
    "content": "@import '../common/index.wxss';.van-count-down{color:#323233;color:var(--count-down-text-color,#323233);font-size:14px;font-size:var(--count-down-font-size,14px);line-height:20px;line-height:var(--count-down-line-height,20px)}"
  },
  {
    "path": "miniprogram/vant/count-down/utils.d.ts",
    "content": "export declare type TimeData = {\n    days: number;\n    hours: number;\n    minutes: number;\n    seconds: number;\n    milliseconds: number;\n};\nexport declare function parseTimeData(time: number): TimeData;\nexport declare function parseFormat(format: string, timeData: TimeData): string;\nexport declare function isSameSecond(time1: number, time2: number): boolean;\n"
  },
  {
    "path": "miniprogram/vant/count-down/utils.js",
    "content": "function padZero(num, targetLength = 2) {\n  let str = num + '';\n  while (str.length < targetLength) {\n    str = '0' + str;\n  }\n  return str;\n}\nconst SECOND = 1000;\nconst MINUTE = 60 * SECOND;\nconst HOUR = 60 * MINUTE;\nconst DAY = 24 * HOUR;\nexport function parseTimeData(time) {\n  const days = Math.floor(time / DAY);\n  const hours = Math.floor((time % DAY) / HOUR);\n  const minutes = Math.floor((time % HOUR) / MINUTE);\n  const seconds = Math.floor((time % MINUTE) / SECOND);\n  const milliseconds = Math.floor(time % SECOND);\n  return {\n    days,\n    hours,\n    minutes,\n    seconds,\n    milliseconds,\n  };\n}\nexport function parseFormat(format, timeData) {\n  const { days } = timeData;\n  let { hours, minutes, seconds, milliseconds } = timeData;\n  if (format.indexOf('DD') === -1) {\n    hours += days * 24;\n  } else {\n    format = format.replace('DD', padZero(days));\n  }\n  if (format.indexOf('HH') === -1) {\n    minutes += hours * 60;\n  } else {\n    format = format.replace('HH', padZero(hours));\n  }\n  if (format.indexOf('mm') === -1) {\n    seconds += minutes * 60;\n  } else {\n    format = format.replace('mm', padZero(minutes));\n  }\n  if (format.indexOf('ss') === -1) {\n    milliseconds += seconds * 1000;\n  } else {\n    format = format.replace('ss', padZero(seconds));\n  }\n  return format.replace('SSS', padZero(milliseconds, 3));\n}\nexport function isSameSecond(time1, time2) {\n  return Math.floor(time1 / 1000) === Math.floor(time2 / 1000);\n}\n"
  },
  {
    "path": "miniprogram/vant/datetime-picker/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/datetime-picker/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isDef } from '../common/utils';\nimport { pickerProps } from '../picker/shared';\nconst currentYear = new Date().getFullYear();\nfunction isValidDate(date) {\n  return isDef(date) && !isNaN(new Date(date).getTime());\n}\nfunction range(num, min, max) {\n  return Math.min(Math.max(num, min), max);\n}\nfunction padZero(val) {\n  return `00${val}`.slice(-2);\n}\nfunction times(n, iteratee) {\n  let index = -1;\n  const result = Array(n < 0 ? 0 : n);\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\nfunction getTrueValue(formattedValue) {\n  if (!formattedValue) return;\n  while (isNaN(parseInt(formattedValue, 10))) {\n    formattedValue = formattedValue.slice(1);\n  }\n  return parseInt(formattedValue, 10);\n}\nfunction getMonthEndDay(year, month) {\n  return 32 - new Date(year, month - 1, 32).getDate();\n}\nconst defaultFormatter = (_, value) => value;\nVantComponent({\n  classes: ['active-class', 'toolbar-class', 'column-class'],\n  props: Object.assign(Object.assign({}, pickerProps), {\n    value: {\n      type: null,\n      observer: 'updateValue',\n    },\n    filter: null,\n    type: {\n      type: String,\n      value: 'datetime',\n      observer: 'updateValue',\n    },\n    showToolbar: {\n      type: Boolean,\n      value: true,\n    },\n    formatter: {\n      type: null,\n      value: defaultFormatter,\n    },\n    minDate: {\n      type: Number,\n      value: new Date(currentYear - 10, 0, 1).getTime(),\n      observer: 'updateValue',\n    },\n    maxDate: {\n      type: Number,\n      value: new Date(currentYear + 10, 11, 31).getTime(),\n      observer: 'updateValue',\n    },\n    minHour: {\n      type: Number,\n      value: 0,\n      observer: 'updateValue',\n    },\n    maxHour: {\n      type: Number,\n      value: 23,\n      observer: 'updateValue',\n    },\n    minMinute: {\n      type: Number,\n      value: 0,\n      observer: 'updateValue',\n    },\n    maxMinute: {\n      type: Number,\n      value: 59,\n      observer: 'updateValue',\n    },\n  }),\n  data: {\n    innerValue: Date.now(),\n    columns: [],\n  },\n  methods: {\n    updateValue() {\n      const { data } = this;\n      const val = this.correctValue(this.data.value);\n      const isEqual = val === data.innerValue;\n      if (!isEqual) {\n        this.updateColumnValue(val).then(() => {\n          this.$emit('input', val);\n        });\n      } else {\n        this.updateColumns();\n      }\n    },\n    getPicker() {\n      if (this.picker == null) {\n        this.picker = this.selectComponent('.van-datetime-picker');\n        const { picker } = this;\n        const { setColumnValues } = picker;\n        picker.setColumnValues = (...args) =>\n          setColumnValues.apply(picker, [...args, false]);\n      }\n      return this.picker;\n    },\n    updateColumns() {\n      const { formatter = defaultFormatter } = this.data;\n      const results = this.getOriginColumns().map((column) => ({\n        values: column.values.map((value) => formatter(column.type, value)),\n      }));\n      return this.set({ columns: results });\n    },\n    getOriginColumns() {\n      const { filter } = this.data;\n      const results = this.getRanges().map(({ type, range }) => {\n        let values = times(range[1] - range[0] + 1, (index) => {\n          let value = range[0] + index;\n          value = type === 'year' ? `${value}` : padZero(value);\n          return value;\n        });\n        if (filter) {\n          values = filter(type, values);\n        }\n        return { type, values };\n      });\n      return results;\n    },\n    getRanges() {\n      const { data } = this;\n      if (data.type === 'time') {\n        return [\n          {\n            type: 'hour',\n            range: [data.minHour, data.maxHour],\n          },\n          {\n            type: 'minute',\n            range: [data.minMinute, data.maxMinute],\n          },\n        ];\n      }\n      const {\n        maxYear,\n        maxDate,\n        maxMonth,\n        maxHour,\n        maxMinute,\n      } = this.getBoundary('max', data.innerValue);\n      const {\n        minYear,\n        minDate,\n        minMonth,\n        minHour,\n        minMinute,\n      } = this.getBoundary('min', data.innerValue);\n      const result = [\n        {\n          type: 'year',\n          range: [minYear, maxYear],\n        },\n        {\n          type: 'month',\n          range: [minMonth, maxMonth],\n        },\n        {\n          type: 'day',\n          range: [minDate, maxDate],\n        },\n        {\n          type: 'hour',\n          range: [minHour, maxHour],\n        },\n        {\n          type: 'minute',\n          range: [minMinute, maxMinute],\n        },\n      ];\n      if (data.type === 'date') result.splice(3, 2);\n      if (data.type === 'year-month') result.splice(2, 3);\n      return result;\n    },\n    correctValue(value) {\n      const { data } = this;\n      // validate value\n      const isDateType = data.type !== 'time';\n      if (isDateType && !isValidDate(value)) {\n        value = data.minDate;\n      } else if (!isDateType && !value) {\n        const { minHour } = data;\n        value = `${padZero(minHour)}:00`;\n      }\n      // time type\n      if (!isDateType) {\n        let [hour, minute] = value.split(':');\n        hour = padZero(range(hour, data.minHour, data.maxHour));\n        minute = padZero(range(minute, data.minMinute, data.maxMinute));\n        return `${hour}:${minute}`;\n      }\n      // date type\n      value = Math.max(value, data.minDate);\n      value = Math.min(value, data.maxDate);\n      return value;\n    },\n    getBoundary(type, innerValue) {\n      const value = new Date(innerValue);\n      const boundary = new Date(this.data[`${type}Date`]);\n      const year = boundary.getFullYear();\n      let month = 1;\n      let date = 1;\n      let hour = 0;\n      let minute = 0;\n      if (type === 'max') {\n        month = 12;\n        date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);\n        hour = 23;\n        minute = 59;\n      }\n      if (value.getFullYear() === year) {\n        month = boundary.getMonth() + 1;\n        if (value.getMonth() + 1 === month) {\n          date = boundary.getDate();\n          if (value.getDate() === date) {\n            hour = boundary.getHours();\n            if (value.getHours() === hour) {\n              minute = boundary.getMinutes();\n            }\n          }\n        }\n      }\n      return {\n        [`${type}Year`]: year,\n        [`${type}Month`]: month,\n        [`${type}Date`]: date,\n        [`${type}Hour`]: hour,\n        [`${type}Minute`]: minute,\n      };\n    },\n    onCancel() {\n      this.$emit('cancel');\n    },\n    onConfirm() {\n      this.$emit('confirm', this.data.innerValue);\n    },\n    onChange() {\n      const { data } = this;\n      let value;\n      const picker = this.getPicker();\n      if (data.type === 'time') {\n        const indexes = picker.getIndexes();\n        value = `${+data.columns[0].values[indexes[0]]}:${+data.columns[1]\n          .values[indexes[1]]}`;\n      } else {\n        const values = picker.getValues();\n        const year = getTrueValue(values[0]);\n        const month = getTrueValue(values[1]);\n        const maxDate = getMonthEndDay(year, month);\n        let date = getTrueValue(values[2]);\n        if (data.type === 'year-month') {\n          date = 1;\n        }\n        date = date > maxDate ? maxDate : date;\n        let hour = 0;\n        let minute = 0;\n        if (data.type === 'datetime') {\n          hour = getTrueValue(values[3]);\n          minute = getTrueValue(values[4]);\n        }\n        value = new Date(year, month - 1, date, hour, minute);\n      }\n      value = this.correctValue(value);\n      this.updateColumnValue(value).then(() => {\n        this.$emit('input', value);\n        this.$emit('change', picker);\n      });\n    },\n    updateColumnValue(value) {\n      let values = [];\n      const { type, formatter = defaultFormatter } = this.data;\n      const picker = this.getPicker();\n      if (type === 'time') {\n        const pair = value.split(':');\n        values = [formatter('hour', pair[0]), formatter('minute', pair[1])];\n      } else {\n        const date = new Date(value);\n        values = [\n          formatter('year', `${date.getFullYear()}`),\n          formatter('month', padZero(date.getMonth() + 1)),\n        ];\n        if (type === 'date') {\n          values.push(formatter('day', padZero(date.getDate())));\n        }\n        if (type === 'datetime') {\n          values.push(\n            formatter('day', padZero(date.getDate())),\n            formatter('hour', padZero(date.getHours())),\n            formatter('minute', padZero(date.getMinutes()))\n          );\n        }\n      }\n      return this.set({ innerValue: value })\n        .then(() => this.updateColumns())\n        .then(() => picker.setValues(values));\n    },\n  },\n  created() {\n    const innerValue = this.correctValue(this.data.value);\n    this.updateColumnValue(innerValue).then(() => {\n      this.$emit('input', innerValue);\n    });\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/datetime-picker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-picker\": \"../picker/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/datetime-picker/index.wxml",
    "content": "<van-picker\n  class=\"van-datetime-picker\"\n  active-class=\"active-class\"\n  toolbar-class=\"toolbar-class\"\n  column-class=\"column-class\"\n  title=\"{{ title }}\"\n  columns=\"{{ columns }}\"\n  item-height=\"{{ itemHeight }}\"\n  show-toolbar=\"{{ showToolbar }}\"\n  visible-item-count=\"{{ visibleItemCount }}\"\n  confirm-button-text=\"{{ confirmButtonText }}\"\n  cancel-button-text=\"{{ cancelButtonText }}\"\n  bind:change=\"onChange\"\n  bind:confirm=\"onConfirm\"\n  bind:cancel=\"onCancel\"\n/>\n"
  },
  {
    "path": "miniprogram/vant/datetime-picker/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram/vant/definitions/index.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nimport { Weapp } from './weapp';\ndeclare type RecordToAny<T> = {\n    [K in keyof T]: any;\n};\nexport declare type CombinedComponentInstance<Data, Props, Methods> = Methods & WechatMiniprogram.Component.TrivialInstance & Weapp.FormField & {\n    data: Data & RecordToAny<Props>;\n};\nexport interface VantComponentOptions<Data, Props, Methods, Instance> {\n    data?: Data;\n    field?: boolean;\n    classes?: string[];\n    mixins?: string[];\n    props?: Props & Weapp.PropertyOption;\n    relation?: Weapp.RelationOption<Instance> & {\n        type: 'ancestor' | 'descendant';\n        name: string;\n        current: string;\n    };\n    relations?: {\n        [componentName: string]: Weapp.RelationOption<Instance>;\n    };\n    methods?: Methods & Weapp.MethodOption<Instance>;\n    beforeCreate?: (this: Instance) => void;\n    created?: (this: Instance) => void;\n    mounted?: (this: Instance) => void;\n    destroyed?: (this: Instance) => void;\n}\nexport {};\n"
  },
  {
    "path": "miniprogram/vant/definitions/index.js",
    "content": ""
  },
  {
    "path": "miniprogram/vant/definitions/weapp.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\nexport declare namespace Weapp {\n    export interface FormField {\n        data: {\n            name: string;\n            value: any;\n        };\n    }\n    interface Target {\n        id: string;\n        tagName: string;\n        dataset: {\n            [key: string]: any;\n        };\n    }\n    export interface Event {\n        /**\n         * 代表事件的类型。\n         */\n        type: string;\n        /**\n         * 页面打开到触发事件所经过的毫秒数。\n         */\n        timeStamp: number;\n        /**\n         * 触发事件的源组件。\n         */\n        target: Target;\n        /**\n         * 事件绑定的当前组件。\n         */\n        currentTarget: Target;\n        /**\n         * 额外的信息\n         */\n        detail: any;\n    }\n    interface Touch {\n        /**\n         * 触摸点的标识符\n         */\n        identifier: number;\n        /**\n         * 距离文档左上角的距离，文档的左上角为原点 ，横向为X轴，纵向为Y轴\n         */\n        pageX: number;\n        /**\n         * 距离文档左上角的距离，文档的左上角为原点 ，横向为X轴，纵向为Y轴\n         */\n        pageY: number;\n        /**\n         * 距离页面可显示区域（屏幕除去导航条）左上角距离，横向为X轴，纵向为Y轴\n         */\n        clientX: number;\n        /**\n         * 距离页面可显示区域（屏幕除去导航条）左上角距离，横向为X轴，纵向为Y轴\n         */\n        clientY: number;\n    }\n    export interface TouchEvent extends Event {\n        touches: Array<Touch>;\n        changedTouches: Array<Touch>;\n    }\n    /**\n     * relation定义，miniprogram-api-typings缺少this定义\n     */\n    export interface RelationOption<Instance> {\n        /** 目标组件的相对关系 */\n        type: 'parent' | 'child' | 'ancestor' | 'descendant';\n        /** 关系生命周期函数，当关系被建立在页面节点树中时触发，触发时机在组件attached生命周期之后 */\n        linked?(this: Instance, target: WechatMiniprogram.Component.TrivialInstance): void;\n        /** 关系生命周期函数，当关系在页面节点树中发生改变时触发，触发时机在组件moved生命周期之后 */\n        linkChanged?(this: Instance, target: WechatMiniprogram.Component.TrivialInstance): void;\n        /** 关系生命周期函数，当关系脱离页面节点树时触发，触发时机在组件detached生命周期之后 */\n        unlinked?(this: Instance, target: WechatMiniprogram.Component.TrivialInstance): void;\n        /** 如果这一项被设置，则它表示关联的目标节点所应具有的behavior，所有拥有这一behavior的组件节点都会被关联 */\n        target?: string;\n    }\n    /**\n     * obverser定义，miniprogram-api-typings缺少this定义\n     */\n    type Observer<Instance, T> = (this: Instance, newVal: T, oldVal: T, changedPath: Array<string | number>) => void;\n    /**\n     * methods定义，miniprogram-api-typings缺少this定义\n     */\n    export interface MethodOption<Instance> {\n        [name: string]: (this: Instance, ...args: any[]) => any;\n    }\n    export interface ComputedOption<Instance> {\n        [name: string]: (this: Instance) => any;\n    }\n    type PropertyType = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor | FunctionConstructor | null;\n    export interface PropertyOption {\n        [name: string]: PropertyType | PropertyType[] | {\n            /** 属性类型 */\n            type: PropertyType | PropertyType[];\n            /** 属性初始值 */\n            value?: any;\n            /** 属性值被更改时的响应函数 */\n            observer?: string | Observer<WechatMiniprogram.Component.TrivialInstance, any>;\n            /** 属性的类型（可以指定多个） */\n            optionalTypes?: PropertyType[];\n        };\n    }\n    export {};\n}\n"
  },
  {
    "path": "miniprogram/vant/definitions/weapp.js",
    "content": ""
  },
  {
    "path": "miniprogram/vant/dialog/dialog.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ndeclare type DialogAction = 'confirm' | 'cancel';\ndeclare type DialogOptions = {\n    lang?: string;\n    show?: boolean;\n    title?: string;\n    width?: string | number;\n    zIndex?: number;\n    context?: WechatMiniprogram.Page.TrivialInstance | WechatMiniprogram.Component.TrivialInstance;\n    message?: string;\n    overlay?: boolean;\n    selector?: string;\n    ariaLabel?: string;\n    className?: string;\n    customStyle?: string;\n    transition?: string;\n    asyncClose?: boolean;\n    businessId?: number;\n    sessionFrom?: string;\n    overlayStyle?: string;\n    appParameter?: string;\n    messageAlign?: string;\n    sendMessageImg?: string;\n    showMessageCard?: boolean;\n    sendMessagePath?: string;\n    sendMessageTitle?: string;\n    confirmButtonText?: string;\n    cancelButtonText?: string;\n    showConfirmButton?: boolean;\n    showCancelButton?: boolean;\n    closeOnClickOverlay?: boolean;\n    confirmButtonOpenType?: string;\n};\ninterface Dialog {\n    (options: DialogOptions): Promise<DialogAction>;\n    alert?: (options: DialogOptions) => Promise<DialogAction>;\n    confirm?: (options: DialogOptions) => Promise<DialogAction>;\n    close?: () => void;\n    stopLoading?: () => void;\n    install?: () => void;\n    setDefaultOptions?: (options: DialogOptions) => void;\n    resetDefaultOptions?: () => void;\n    defaultOptions?: DialogOptions;\n    currentOptions?: DialogOptions;\n}\ndeclare const Dialog: Dialog;\nexport default Dialog;\n"
  },
  {
    "path": "miniprogram/vant/dialog/dialog.js",
    "content": "let queue = [];\nfunction getContext() {\n  const pages = getCurrentPages();\n  return pages[pages.length - 1];\n}\nconst Dialog = (options) => {\n  options = Object.assign(Object.assign({}, Dialog.currentOptions), options);\n  return new Promise((resolve, reject) => {\n    const context = options.context || getContext();\n    const dialog = context.selectComponent(options.selector);\n    delete options.context;\n    delete options.selector;\n    if (dialog) {\n      dialog.setData(\n        Object.assign({ onCancel: reject, onConfirm: resolve }, options)\n      );\n      queue.push(dialog);\n    } else {\n      console.warn(\n        '未找到 van-dialog 节点，请确认 selector 及 context 是否正确'\n      );\n    }\n  });\n};\nDialog.defaultOptions = {\n  show: true,\n  title: '',\n  width: null,\n  message: '',\n  zIndex: 100,\n  overlay: true,\n  selector: '#van-dialog',\n  className: '',\n  asyncClose: false,\n  transition: 'scale',\n  customStyle: '',\n  messageAlign: '',\n  overlayStyle: '',\n  confirmButtonText: '确认',\n  cancelButtonText: '取消',\n  showConfirmButton: true,\n  showCancelButton: false,\n  closeOnClickOverlay: false,\n  confirmButtonOpenType: '',\n};\nDialog.alert = Dialog;\nDialog.confirm = (options) =>\n  Dialog(Object.assign({ showCancelButton: true }, options));\nDialog.close = () => {\n  queue.forEach((dialog) => {\n    dialog.close();\n  });\n  queue = [];\n};\nDialog.stopLoading = () => {\n  queue.forEach((dialog) => {\n    dialog.stopLoading();\n  });\n};\nDialog.setDefaultOptions = (options) => {\n  Object.assign(Dialog.currentOptions, options);\n};\nDialog.resetDefaultOptions = () => {\n  Dialog.currentOptions = Object.assign({}, Dialog.defaultOptions);\n};\nDialog.resetDefaultOptions();\nexport default Dialog;\n"
  },
  {
    "path": "miniprogram/vant/dialog/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/dialog/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nimport { GRAY, BLUE } from '../common/color';\nVantComponent({\n  mixins: [button, openType],\n  props: {\n    show: {\n      type: Boolean,\n      observer(show) {\n        !show && this.stopLoading();\n      },\n    },\n    title: String,\n    message: String,\n    useSlot: Boolean,\n    className: String,\n    customStyle: String,\n    asyncClose: Boolean,\n    messageAlign: String,\n    overlayStyle: String,\n    useTitleSlot: Boolean,\n    showCancelButton: Boolean,\n    closeOnClickOverlay: Boolean,\n    confirmButtonOpenType: String,\n    width: null,\n    zIndex: {\n      type: Number,\n      value: 2000,\n    },\n    confirmButtonText: {\n      type: String,\n      value: '确认',\n    },\n    cancelButtonText: {\n      type: String,\n      value: '取消',\n    },\n    confirmButtonColor: {\n      type: String,\n      value: BLUE,\n    },\n    cancelButtonColor: {\n      type: String,\n      value: GRAY,\n    },\n    showConfirmButton: {\n      type: Boolean,\n      value: true,\n    },\n    overlay: {\n      type: Boolean,\n      value: true,\n    },\n    transition: {\n      type: String,\n      value: 'scale',\n    },\n  },\n  data: {\n    loading: {\n      confirm: false,\n      cancel: false,\n    },\n  },\n  methods: {\n    onConfirm() {\n      this.handleAction('confirm');\n    },\n    onCancel() {\n      this.handleAction('cancel');\n    },\n    onClickOverlay() {\n      this.onClose('overlay');\n    },\n    handleAction(action) {\n      if (this.data.asyncClose) {\n        this.setData({\n          [`loading.${action}`]: true,\n        });\n      }\n      this.onClose(action);\n    },\n    close() {\n      this.setData({\n        show: false,\n      });\n    },\n    stopLoading() {\n      this.setData({\n        loading: {\n          confirm: false,\n          cancel: false,\n        },\n      });\n    },\n    onClose(action) {\n      if (!this.data.asyncClose) {\n        this.close();\n      }\n      this.$emit('close', action);\n      // 把 dialog 实例传递出去，可以通过 stopLoading() 在外部关闭按钮的 loading\n      this.$emit(action, { dialog: this });\n      const callback = this.data[\n        action === 'confirm' ? 'onConfirm' : 'onCancel'\n      ];\n      if (callback) {\n        callback(this);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/dialog/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-popup\": \"../popup/index\",\n    \"van-button\": \"../button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/dialog/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-popup\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  overlay=\"{{ overlay }}\"\n  transition=\"{{ transition }}\"\n  custom-class=\"van-dialog {{ className }}\"\n  custom-style=\"width: {{ utils.addUnit(width) }};{{ customStyle }}\"\n  overlay-style=\"{{ overlayStyle }}\"\n  close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n  bind:close=\"onClickOverlay\"\n>\n  <view\n    wx:if=\"{{ title || useTitleSlot  }}\"\n    class=\"van-dialog__header {{ message || useSlot ? '' : 'van-dialog--isolated' }}\"\n  >\n    <slot wx:if=\"{{ useTitleSlot }}\" name=\"title\" />\n    <block wx:elif=\"{{ title }}\">{{ title }}</block>\n  </view>\n\n  <slot wx:if=\"{{ useSlot }}\" />\n  <view\n    wx:elif=\"{{ message }}\"\n    class=\"van-dialog__message {{ title ? 'van-dialog__message--has-title' : '' }} {{ messageAlign ? 'van-dialog__message--' + messageAlign : '' }}\"\n  >\n    <text class=\"van-dialog__message-text\">{{ message }}</text>\n  </view>\n\n  <view class=\"van-hairline--top van-dialog__footer\">\n    <van-button\n      wx:if=\"{{ showCancelButton }}\"\n      size=\"large\"\n      loading=\"{{ loading.cancel }}\"\n      class=\"van-dialog__button van-hairline--right\"\n      custom-class=\"van-dialog__cancel\"\n      custom-style=\"color: {{ cancelButtonColor }}\"\n      bind:click=\"onCancel\"\n    >\n      {{ cancelButtonText }}\n    </van-button>\n    <van-button\n      wx:if=\"{{ showConfirmButton }}\"\n      size=\"large\"\n      class=\"van-dialog__button\"\n      loading=\"{{ loading.confirm }}\"\n      custom-class=\"van-dialog__confirm\"\n      custom-style=\"color: {{ confirmButtonColor }}\"\n\n      open-type=\"{{ confirmButtonOpenType }}\"\n      lang=\"{{ lang }}\"\n      business-id=\"{{ businessId }}\"\n      session-from=\"{{ sessionFrom }}\"\n      send-message-title=\"{{ sendMessageTitle }}\"\n      send-message-path=\"{{ sendMessagePath }}\"\n      send-message-img=\"{{ sendMessageImg }}\"\n      show-message-card=\"{{ showMessageCard }}\"\n      app-parameter=\"{{ appParameter }}\"\n\n      bind:click=\"onConfirm\"\n      bindgetuserinfo=\"bindGetUserInfo\"\n      bindcontact=\"bindContact\"\n      bindgetphonenumber=\"bindGetPhoneNumber\"\n      binderror=\"bindError\"\n      bindlaunchapp=\"bindLaunchApp\"\n      bindopensetting=\"bindOpenSetting\"\n    >\n      {{ confirmButtonText }}\n    </van-button>\n  </view>\n</van-popup>\n"
  },
  {
    "path": "miniprogram/vant/dialog/index.wxss",
    "content": "@import '../common/index.wxss';.van-dialog{top:45%!important;overflow:hidden;width:320px;width:var(--dialog-width,320px);font-size:16px;font-size:var(--dialog-font-size,16px);border-radius:16px;border-radius:var(--dialog-border-radius,16px);background-color:#fff;background-color:var(--dialog-background-color,#fff)}@media (max-width:321px){.van-dialog{width:90%;width:var(--dialog-small-screen-width,90%)}}.van-dialog__header{text-align:center;padding-top:24px;padding-top:var(--dialog-header-padding-top,24px);font-weight:500;font-weight:var(--dialog-header-font-weight,500);line-height:24px;line-height:var(--dialog-header-line-height,24px)}.van-dialog__header--isolated{padding:24px 0;padding:var(--dialog-header-isolated-padding,24px 0)}.van-dialog__message{overflow-y:auto;text-align:center;-webkit-overflow-scrolling:touch;font-size:14px;font-size:var(--dialog-message-font-size,14px);line-height:20px;line-height:var(--dialog-message-line-height,20px);max-height:60vh;max-height:var(--dialog-message-max-height,60vh);padding:24px;padding:var(--dialog-message-padding,24px)}.van-dialog__message-text{word-wrap:break-word}.van-dialog__message--has-title{padding-top:12px;padding-top:var(--dialog-has-title-message-padding-top,12px);color:#646566;color:var(--dialog-has-title-message-text-color,#646566)}.van-dialog__message--left{text-align:left}.van-dialog__message--right{text-align:right}.van-dialog__footer{display:-webkit-flex;display:flex}.van-dialog__button{-webkit-flex:1;flex:1}.van-dialog__cancel,.van-dialog__confirm{border:0!important}.van-dialog-bounce-enter{-webkit-transform:translate3d(-50%,-50%,0) scale(.7);transform:translate3d(-50%,-50%,0) scale(.7);opacity:0}.van-dialog-bounce-leave-active{-webkit-transform:translate3d(-50%,-50%,0) scale(.9);transform:translate3d(-50%,-50%,0) scale(.9);opacity:0}"
  },
  {
    "path": "miniprogram/vant/divider/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/divider/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    dashed: {\n      type: Boolean,\n      value: false,\n    },\n    hairline: {\n      type: Boolean,\n      value: false,\n    },\n    contentPosition: {\n      type: String,\n      value: '',\n    },\n    fontSize: {\n      type: Number,\n      value: '',\n    },\n    borderColor: {\n      type: String,\n      value: '',\n    },\n    textColor: {\n      type: String,\n      value: '',\n    },\n    customStyle: {\n      type: String,\n      value: '',\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/divider/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/vant/divider/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('divider', [{dashed, hairline}, contentPosition]) }}\"\n  style=\"{{ borderColor  ? 'border-color: ' + borderColor + ';' : '' }}{{ textColor ? 'color: ' + textColor + ';' : '' }} {{ fontSize ? 'font-size: ' + fontSize + 'px;' : '' }} {{ customStyle }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/divider/index.wxss",
    "content": "@import '../common/index.wxss';.van-divider{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;margin:16px 0;margin:var(--divider-margin,16px 0);color:#969799;color:var(--divider-text-color,#969799);font-size:14px;font-size:var(--divider-font-size,14px);line-height:24px;line-height:var(--divider-line-height,24px);border:0 solid #ebedf0;border-color:var(--divider-border-color,#ebedf0)}.van-divider:after,.van-divider:before{display:block;-webkit-flex:1;flex:1;box-sizing:border-box;height:1px;border-color:inherit;border-style:inherit;border-width:1px 0 0}.van-divider:before{content:\"\"}.van-divider--hairline:after,.van-divider--hairline:before{-webkit-transform:scaleY(.5);transform:scaleY(.5)}.van-divider--dashed{border-style:dashed}.van-divider--center:before,.van-divider--left:before,.van-divider--right:before{margin-right:16px;margin-right:var(--divider-content-padding,16px)}.van-divider--center:after,.van-divider--left:after,.van-divider--right:after{content:\"\";margin-left:16px;margin-left:var(--divider-content-padding,16px)}.van-divider--left:before{max-width:10%;max-width:var(--divider-content-left-width,10%)}.van-divider--right:after{max-width:10%;max-width:var(--divider-content-right-width,10%)}"
  },
  {
    "path": "miniprogram/vant/dropdown-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/dropdown-item/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  field: true,\n  relation: {\n    name: 'dropdown-menu',\n    type: 'ancestor',\n    current: 'dropdown-item',\n    linked() {\n      this.updateDataFromParent();\n    },\n  },\n  props: {\n    value: {\n      type: null,\n      observer: 'rerender',\n    },\n    title: {\n      type: String,\n      observer: 'rerender',\n    },\n    disabled: Boolean,\n    titleClass: {\n      type: String,\n      observer: 'rerender',\n    },\n    options: {\n      type: Array,\n      value: [],\n      observer: 'rerender',\n    },\n    popupStyle: String,\n  },\n  data: {\n    transition: true,\n    showPopup: false,\n    showWrapper: false,\n    displayTitle: '',\n  },\n  methods: {\n    rerender() {\n      wx.nextTick(() => {\n        this.parent && this.parent.updateItemListData();\n      });\n    },\n    updateDataFromParent() {\n      if (this.parent) {\n        const {\n          overlay,\n          duration,\n          activeColor,\n          closeOnClickOverlay,\n          direction,\n        } = this.parent.data;\n        this.setData({\n          overlay,\n          duration,\n          activeColor,\n          closeOnClickOverlay,\n          direction,\n        });\n      }\n    },\n    onOpen() {\n      this.$emit('open');\n    },\n    onOpened() {\n      this.$emit('opened');\n    },\n    onClose() {\n      this.$emit('close');\n    },\n    onClosed() {\n      this.$emit('closed');\n      this.setData({ showWrapper: false });\n    },\n    onOptionTap(event) {\n      const { option } = event.currentTarget.dataset;\n      const { value } = option;\n      const shouldEmitChange = this.data.value !== value;\n      this.setData({ showPopup: false, value });\n      this.$emit('close');\n      this.rerender();\n      if (shouldEmitChange) {\n        this.$emit('change', value);\n      }\n    },\n    toggle(show, options = {}) {\n      const { showPopup } = this.data;\n      if (typeof show !== 'boolean') {\n        show = !showPopup;\n      }\n      if (show === showPopup) {\n        return;\n      }\n      this.setData({\n        transition: !options.immediate,\n        showPopup: show,\n      });\n      if (show) {\n        this.parent.getChildWrapperStyle().then((wrapperStyle) => {\n          this.setData({ wrapperStyle, showWrapper: true });\n          this.rerender();\n        });\n      } else {\n        this.rerender();\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/dropdown-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-popup\": \"../popup/index\",\n    \"van-cell\": \"../cell/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/dropdown-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ showWrapper }}\"\n  class=\"{{ utils.bem('dropdown-item', direction) }}\"\n  style=\"{{ wrapperStyle }}\"\n>\n  <van-popup\n    show=\"{{ showPopup }}\"\n    custom-style=\"position: absolute;{{ popupStyle }}\"\n    overlay-style=\"position: absolute;\"\n    overlay=\"{{ overlay }}\"\n    position=\"{{ direction === 'down' ? 'top' : 'bottom' }}\"\n    duration=\"{{ transition ? duration : 0 }}\"\n    close-on-click-overlay=\"{{ closeOnClickOverlay }}\"\n    bind:enter=\"onOpen\"\n    bind:leave=\"onClose\"\n    bind:close=\"toggle\"\n    bind:after-enter=\"onOpened\"\n    bind:after-leave=\"onClosed\"\n  >\n    <van-cell\n      wx:for=\"{{ options }}\"\n      wx:key=\"value\"\n      data-option=\"{{ item }}\"\n      class=\"{{ utils.bem('dropdown-item__option', { active: item.value === value } ) }}\"\n      clickable\n      icon=\"{{ item.icon }}\"\n      bind:tap=\"onOptionTap\"\n    >\n      <view\n        slot=\"title\"\n        class=\"van-dropdown-item__title\"\n        style=\"{{ item.value === value  ? 'color:' + activeColor : '' }}\"\n      >\n        {{ item.text }}\n      </view>\n      <van-icon\n        wx:if=\"{{ item.value === value }}\"\n        name=\"success\"\n        class=\"van-dropdown-item__icon\"\n        color=\"{{ activeColor }}\"\n      />\n    </van-cell>\n\n    <slot />\n  </van-popup>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/dropdown-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-dropdown-item{position:fixed;right:0;left:0;overflow:hidden}.van-dropdown-item__option{text-align:left}.van-dropdown-item__option--active .van-dropdown-item__icon,.van-dropdown-item__option--active .van-dropdown-item__title{color:#1989fa;color:var(--dropdown-menu-option-active-color,#1989fa)}.van-dropdown-item--up{top:0}.van-dropdown-item--down{bottom:0}.van-dropdown-item__icon{display:block;line-height:inherit}"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { addUnit } from '../common/utils';\nlet ARRAY = [];\nVantComponent({\n  field: true,\n  relation: {\n    name: 'dropdown-item',\n    type: 'descendant',\n    current: 'dropdown-menu',\n    linked() {\n      this.updateItemListData();\n    },\n    unlinked() {\n      this.updateItemListData();\n    },\n  },\n  props: {\n    activeColor: {\n      type: String,\n      observer: 'updateChildrenData',\n    },\n    overlay: {\n      type: Boolean,\n      value: true,\n      observer: 'updateChildrenData',\n    },\n    zIndex: {\n      type: Number,\n      value: 10,\n    },\n    duration: {\n      type: Number,\n      value: 200,\n      observer: 'updateChildrenData',\n    },\n    direction: {\n      type: String,\n      value: 'down',\n      observer: 'updateChildrenData',\n    },\n    closeOnClickOverlay: {\n      type: Boolean,\n      value: true,\n      observer: 'updateChildrenData',\n    },\n    closeOnClickOutside: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    itemListData: [],\n  },\n  beforeCreate() {\n    const { windowHeight } = wx.getSystemInfoSync();\n    this.windowHeight = windowHeight;\n    ARRAY.push(this);\n  },\n  destroyed() {\n    ARRAY = ARRAY.filter((item) => item !== this);\n  },\n  methods: {\n    updateItemListData() {\n      this.setData({\n        itemListData: this.children.map((child) => child.data),\n      });\n    },\n    updateChildrenData() {\n      this.children.forEach((child) => {\n        child.updateDataFromParent();\n      });\n    },\n    toggleItem(active) {\n      this.children.forEach((item, index) => {\n        const { showPopup } = item.data;\n        if (index === active) {\n          item.toggle();\n        } else if (showPopup) {\n          item.toggle(false, { immediate: true });\n        }\n      });\n    },\n    close() {\n      this.children.forEach((child) => {\n        child.toggle(false, { immediate: true });\n      });\n    },\n    getChildWrapperStyle() {\n      const { zIndex, direction } = this.data;\n      return this.getRect('.van-dropdown-menu').then((rect) => {\n        const { top = 0, bottom = 0 } = rect;\n        const offset = direction === 'down' ? bottom : this.windowHeight - top;\n        let wrapperStyle = `z-index: ${zIndex};`;\n        if (direction === 'down') {\n          wrapperStyle += `top: ${addUnit(offset)};`;\n        } else {\n          wrapperStyle += `bottom: ${addUnit(offset)};`;\n        }\n        return wrapperStyle;\n      });\n    },\n    onTitleTap(event) {\n      const { index } = event.currentTarget.dataset;\n      const child = this.children[index];\n      if (!child.data.disabled) {\n        ARRAY.forEach((menuItem) => {\n          if (\n            menuItem &&\n            menuItem.data.closeOnClickOutside &&\n            menuItem !== this\n          ) {\n            menuItem.close();\n          }\n        });\n        this.toggleItem(index);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"van-dropdown-menu van-dropdown-menu--top-bottom\">\n  <view\n    wx:for=\"{{ itemListData }}\"\n    wx:key=\"index\"\n    data-index=\"{{ index }}\"\n    class=\"{{ utils.bem('dropdown-menu__item', { disabled: item.disabled }) }}\"\n    bind:tap=\"onTitleTap\"\n  >\n    <view\n      class=\"{{ item.titleClass }} {{ utils.bem('dropdown-menu__title', { active: item.showPopup, down: item.showPopup === (direction === 'down') }) }}\"\n      style=\"{{ item.showPopup ? 'color:' + activeColor : '' }}\"\n    >\n      <view class=\"van-ellipsis\">\n        {{ computed.displayTitle(item) }}\n      </view>\n    </view>\n  </view>\n\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.wxs",
    "content": "/* eslint-disable */\nfunction displayTitle(item) {\n  if (item.title) {\n    return item.title;\n  }\n\n  var match = item.options.filter(function(option) {\n    return option.value === item.value;\n  });\n  var displayTitle = match.length ? match[0].text : '';\n  return displayTitle;\n}\n\nmodule.exports = {\n  displayTitle: displayTitle\n};\n"
  },
  {
    "path": "miniprogram/vant/dropdown-menu/index.wxss",
    "content": "@import '../common/index.wxss';.van-dropdown-menu{display:-webkit-flex;display:flex;-webkit-user-select:none;user-select:none;height:50px;height:var(--dropdown-menu-height,50px);background-color:#fff;background-color:var(--dropdown-menu-background-color,#fff)}.van-dropdown-menu__item{display:-webkit-flex;display:flex;-webkit-flex:1;flex:1;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;min-width:0}.van-dropdown-menu__item:active{opacity:.7}.van-dropdown-menu__item--disabled:active{opacity:1}.van-dropdown-menu__item--disabled .van-dropdown-menu__title{color:#969799;color:var(--dropdown-menu-title-disabled-text-color,#969799)}.van-dropdown-menu__title{position:relative;box-sizing:border-box;max-width:100%;padding:0 8px;padding:var(--dropdown-menu-title-padding,0 8px);color:#323233;color:var(--dropdown-menu-title-text-color,#323233);font-size:15px;font-size:var(--dropdown-menu-title-font-size,15px);line-height:18px;line-height:var(--dropdown-menu-title-line-height,18px)}.van-dropdown-menu__title:after{position:absolute;top:50%;right:-4px;margin-top:-5px;border-color:transparent transparent currentcolor currentcolor;border-style:solid;border-width:3px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);opacity:.8;content:\"\"}.van-dropdown-menu__title--active{color:#1989fa;color:var(--dropdown-menu-title-active-text-color,#1989fa)}.van-dropdown-menu__title--down:after{margin-top:-1px;-webkit-transform:rotate(135deg);transform:rotate(135deg)}"
  },
  {
    "path": "miniprogram/vant/field/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/field/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { commonProps, inputProps, textareaProps } from './props';\nimport { canIUseModel } from '../common/version';\nVantComponent({\n  field: true,\n  classes: ['input-class', 'right-icon-class'],\n  props: Object.assign(\n    Object.assign(\n      Object.assign(Object.assign({}, commonProps), inputProps),\n      textareaProps\n    ),\n    {\n      size: String,\n      icon: String,\n      label: String,\n      error: Boolean,\n      center: Boolean,\n      isLink: Boolean,\n      leftIcon: String,\n      rightIcon: String,\n      autosize: [Boolean, Object],\n      readonly: {\n        type: Boolean,\n        observer: 'setShowClear',\n      },\n      required: Boolean,\n      iconClass: String,\n      clearable: {\n        type: Boolean,\n        observer: 'setShowClear',\n      },\n      clickable: Boolean,\n      inputAlign: String,\n      customStyle: String,\n      errorMessage: String,\n      arrowDirection: String,\n      showWordLimit: Boolean,\n      errorMessageAlign: String,\n      border: {\n        type: Boolean,\n        value: true,\n      },\n      titleWidth: {\n        type: String,\n        value: '90px',\n      },\n    }\n  ),\n  data: {\n    focused: false,\n    innerValue: '',\n    showClear: false,\n  },\n  created() {\n    this.value = this.data.value;\n    this.setData({ innerValue: this.value });\n  },\n  methods: {\n    onInput(event) {\n      const { value = '' } = event.detail || {};\n      this.value = value;\n      this.setShowClear();\n      this.emitChange();\n    },\n    onFocus(event) {\n      this.focused = true;\n      this.setShowClear();\n      this.$emit('focus', event.detail);\n    },\n    onBlur(event) {\n      this.focused = false;\n      this.setShowClear();\n      this.$emit('blur', event.detail);\n    },\n    onClickIcon() {\n      this.$emit('click-icon');\n    },\n    onClear() {\n      this.setData({ innerValue: '' });\n      this.value = '';\n      this.setShowClear();\n      wx.nextTick(() => {\n        this.emitChange();\n        this.$emit('clear', '');\n      });\n    },\n    onConfirm(event) {\n      const { value = '' } = event.detail || {};\n      this.value = value;\n      this.setShowClear();\n      this.$emit('confirm', value);\n    },\n    setValue(value) {\n      this.value = value;\n      this.setShowClear();\n      if (value === '') {\n        this.setData({ innerValue: '' });\n      }\n      this.emitChange();\n    },\n    onLineChange(event) {\n      this.$emit('linechange', event.detail);\n    },\n    onKeyboardHeightChange(event) {\n      this.$emit('keyboardheightchange', event.detail);\n    },\n    emitChange() {\n      if (canIUseModel()) {\n        this.setData({ value: this.value });\n      }\n      wx.nextTick(() => {\n        this.$emit('input', this.value);\n        this.$emit('change', this.value);\n      });\n    },\n    setShowClear() {\n      const { clearable, readonly } = this.data;\n      const { focused, value } = this;\n      this.setData({\n        showClear: !!clearable && !!focused && !!value && !readonly,\n      });\n    },\n    noop() {},\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/field/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/field/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<van-cell\n  size=\"{{ size }}\"\n  icon=\"{{ leftIcon }}\"\n  title=\"{{ label }}\"\n  center=\"{{ center }}\"\n  border=\"{{ border }}\"\n  is-link=\"{{ isLink }}\"\n  required=\"{{ required }}\"\n  clickable=\"{{ clickable }}\"\n  title-width=\"{{ titleWidth }}\"\n  custom-style=\"{{ customStyle }}\"\n  arrow-direction=\"{{ arrowDirection }}\"\n  custom-class=\"van-field\"\n>\n  <slot name=\"left-icon\" slot=\"icon\" />\n  <slot name=\"label\" slot=\"title\" />\n  <view class=\"{{ utils.bem('field__body', [type]) }}\">\n    <textarea\n      wx:if=\"{{ type === 'textarea' }}\"\n      class=\"input-class {{ utils.bem('field__input', [inputAlign, type, { disabled, error }]) }}\"\n      fixed=\"{{ fixed }}\"\n      focus=\"{{ focus }}\"\n      cursor=\"{{ cursor }}\"\n      value=\"{{ innerValue }}\"\n      auto-focus=\"{{ autoFocus }}\"\n      disabled=\"{{ disabled || readonly }}\"\n      maxlength=\"{{ maxlength }}\"\n      placeholder=\"{{ placeholder }}\"\n      placeholder-style=\"{{ placeholderStyle }}\"\n      placeholder-class=\"{{ utils.bem('field__placeholder', { error }) }}\"\n      auto-height=\"{{ !!autosize }}\"\n      style=\"{{ computed.inputStyle(autosize) }}\"\n      cursor-spacing=\"{{ cursorSpacing }}\"\n      adjust-position=\"{{ adjustPosition }}\"\n      show-confirm-bar=\"{{ showConfirmBar }}\"\n      hold-keyboard=\"{{ holdKeyboard }}\"\n      selection-end=\"{{ selectionEnd }}\"\n      selection-start=\"{{ selectionStart }}\"\n      disable-default-padding=\"{{ disableDefaultPadding }}\"\n      bindinput=\"onInput\"\n      bindblur=\"onBlur\"\n      bindfocus=\"onFocus\"\n      bindconfirm=\"onConfirm\"\n      bindlinechange=\"onLineChange\"\n      bindkeyboardheightchange=\"onKeyboardHeightChange\"\n    >\n    </textarea>\n    <input\n      wx:else\n      class=\"input-class {{ utils.bem('field__input', [inputAlign, { disabled, error }]) }}\"\n      type=\"{{ type }}\"\n      focus=\"{{ focus }}\"\n      cursor=\"{{ cursor }}\"\n      value=\"{{ innerValue }}\"\n      auto-focus=\"{{ autoFocus }}\"\n      disabled=\"{{ disabled || readonly }}\"\n      maxlength=\"{{ maxlength }}\"\n      placeholder=\"{{ placeholder }}\"\n      placeholder-style=\"{{ placeholderStyle }}\"\n      placeholder-class=\"{{ utils.bem('field__placeholder', { error }) }}\"\n      confirm-type=\"{{ confirmType }}\"\n      confirm-hold=\"{{ confirmHold }}\"\n      hold-keyboard=\"{{ holdKeyboard }}\"\n      cursor-spacing=\"{{ cursorSpacing }}\"\n      adjust-position=\"{{ adjustPosition }}\"\n      selection-end=\"{{ selectionEnd }}\"\n      selection-start=\"{{ selectionStart }}\"\n      password=\"{{ password || type === 'password' }}\"\n      bindinput=\"onInput\"\n      bindblur=\"onBlur\"\n      bindfocus=\"onFocus\"\n      bindconfirm=\"onConfirm\"\n      bindkeyboardheightchange=\"onKeyboardHeightChange\"\n    />\n    <van-icon\n      wx:if=\"{{ showClear }}\"\n      name=\"clear\"\n      class=\"van-field__clear-root van-field__icon-root\"\n      catch:touchstart=\"onClear\"\n    />\n    <view class=\"van-field__icon-container\" bind:tap=\"onClickIcon\">\n      <van-icon\n        wx:if=\"{{ rightIcon || icon }}\"\n        name=\"{{ rightIcon || icon }}\"\n        class=\"van-field__icon-root {{ iconClass }}\"\n        custom-class=\"right-icon-class\"\n      />\n      <slot name=\"right-icon\" />\n      <slot name=\"icon\" />\n    </view>\n    <view class=\"van-field__button\">\n      <slot name=\"button\" />\n    </view>\n  </view>\n  <view wx:if=\"{{ showWordLimit && maxlength }}\" class=\"van-field__word-limit\">\n    <view class=\"{{ utils.bem('field__word-num', { full: value.length >= maxlength }) }}\">{{ value.length }}</view>/{{ maxlength }}\n  </view>\n  <view wx:if=\"{{ errorMessage }}\" class=\"{{ utils.bem('field__error-message', [errorMessageAlign, { disabled, error }]) }}\">\n    {{ errorMessage }}\n  </view>\n</van-cell>\n"
  },
  {
    "path": "miniprogram/vant/field/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../wxs/utils.wxs');\n\nfunction inputStyle(autosize) {\n  if (autosize && autosize.constructor === 'Object') {\n    var style = '';\n    if (autosize.minHeight) {\n      style += 'min-height:' + utils.addUnit(autosize.minHeight) + ';';\n    }\n    if (autosize.maxHeight) {\n      style += 'max-height:' + utils.addUnit(autosize.maxHeight) + ';';\n    }\n    return style;\n  }\n\n  return '';\n}\n\nmodule.exports = {\n  inputStyle: inputStyle\n};\n"
  },
  {
    "path": "miniprogram/vant/field/index.wxss",
    "content": "@import '../common/index.wxss';.van-field{--cell-icon-size:16px;--cell-icon-size:var(--field-icon-size,16px)}.van-field__body{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center}.van-field__body--textarea{line-height:1.2em}.van-field__body--textarea,.van-field__input{min-height:24px;min-height:var(--cell-line-height,24px)}.van-field__input{position:relative;display:block;box-sizing:border-box;width:100%;margin:0;padding:0;line-height:inherit;text-align:left;background-color:initial;border:0;resize:none;color:#323233;color:var(--field-input-text-color,#323233);height:24px;height:var(--cell-line-height,24px)}.van-field__input--textarea{height:18px;height:var(--field-text-area-min-height,18px);min-height:18px;min-height:var(--field-text-area-min-height,18px)}.van-field__input--error{color:#ee0a24;color:var(--field-input-error-text-color,#ee0a24)}.van-field__input--disabled{background-color:initial;opacity:1;color:#969799;color:var(--field-input-disabled-text-color,#969799)}.van-field__input--center{text-align:center}.van-field__input--right{text-align:right}.van-field__placeholder{position:absolute;top:0;right:0;left:0;pointer-events:none;color:#c8c9cc;color:var(--field-placeholder-text-color,#c8c9cc)}.van-field__placeholder--error{color:#ee0a24;color:var(--field-error-message-color,#ee0a24)}.van-field__icon-root{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;min-height:24px;min-height:var(--cell-line-height,24px)}.van-field__clear-root,.van-field__icon-container{line-height:inherit;vertical-align:middle;padding:0 8px;padding:0 var(--padding-xs,8px);margin-right:-8px;margin-right:-var(--padding-xs,8px)}.van-field__button,.van-field__clear-root,.van-field__icon-container{-webkit-flex-shrink:0;flex-shrink:0}.van-field__clear-root{font-size:16px;font-size:var(--field-clear-icon-size,16px);color:#c8c9cc;color:var(--field-clear-icon-color,#c8c9cc)}.van-field__icon-container{font-size:16px;font-size:var(--field-icon-size,16px);color:#969799;color:var(--field-icon-container-color,#969799)}.van-field__icon-container:empty{display:none}.van-field__button{padding-left:8px;padding-left:var(--padding-xs,8px)}.van-field__button:empty{display:none}.van-field__error-message{text-align:left;font-size:12px;font-size:var(--field-error-message-text-font-size,12px);color:#ee0a24;color:var(--field-error-message-color,#ee0a24)}.van-field__error-message--center{text-align:center}.van-field__error-message--right{text-align:right}.van-field__word-limit{text-align:right;margin-top:4px;margin-top:var(--padding-base,4px);color:#646566;color:var(--field-word-limit-color,#646566);font-size:12px;font-size:var(--field-word-limit-font-size,12px);line-height:16px;line-height:var(--field-word-limit-line-height,16px)}.van-field__word-num{display:inline}.van-field__word-num--full{color:#ee0a24;color:var(--field-word-num-full-color,#ee0a24)}"
  },
  {
    "path": "miniprogram/vant/field/props.d.ts",
    "content": "export declare const commonProps: {\n    value: {\n        type: StringConstructor;\n        observer(value: string): void;\n    };\n    placeholder: StringConstructor;\n    placeholderStyle: StringConstructor;\n    placeholderClass: StringConstructor;\n    disabled: BooleanConstructor;\n    maxlength: {\n        type: NumberConstructor;\n        value: number;\n    };\n    cursorSpacing: {\n        type: NumberConstructor;\n        value: number;\n    };\n    autoFocus: BooleanConstructor;\n    focus: BooleanConstructor;\n    cursor: {\n        type: NumberConstructor;\n        value: number;\n    };\n    selectionStart: {\n        type: NumberConstructor;\n        value: number;\n    };\n    selectionEnd: {\n        type: NumberConstructor;\n        value: number;\n    };\n    adjustPosition: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n    holdKeyboard: BooleanConstructor;\n};\nexport declare const inputProps: {\n    type: {\n        type: StringConstructor;\n        value: string;\n    };\n    password: BooleanConstructor;\n    confirmType: StringConstructor;\n    confirmHold: BooleanConstructor;\n};\nexport declare const textareaProps: {\n    autoHeight: BooleanConstructor;\n    fixed: BooleanConstructor;\n    showConfirmBar: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n    disableDefaultPadding: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n};\n"
  },
  {
    "path": "miniprogram/vant/field/props.js",
    "content": "export const commonProps = {\n  value: {\n    type: String,\n    observer(value) {\n      if (value !== this.value) {\n        this.setData({ innerValue: value });\n        this.value = value;\n      }\n    },\n  },\n  placeholder: String,\n  placeholderStyle: String,\n  placeholderClass: String,\n  disabled: Boolean,\n  maxlength: {\n    type: Number,\n    value: -1,\n  },\n  cursorSpacing: {\n    type: Number,\n    value: 50,\n  },\n  autoFocus: Boolean,\n  focus: Boolean,\n  cursor: {\n    type: Number,\n    value: -1,\n  },\n  selectionStart: {\n    type: Number,\n    value: -1,\n  },\n  selectionEnd: {\n    type: Number,\n    value: -1,\n  },\n  adjustPosition: {\n    type: Boolean,\n    value: true,\n  },\n  holdKeyboard: Boolean,\n};\nexport const inputProps = {\n  type: {\n    type: String,\n    value: 'text',\n  },\n  password: Boolean,\n  confirmType: String,\n  confirmHold: Boolean,\n};\nexport const textareaProps = {\n  autoHeight: Boolean,\n  fixed: Boolean,\n  showConfirmBar: {\n    type: Boolean,\n    value: true,\n  },\n  disableDefaultPadding: {\n    type: Boolean,\n    value: true,\n  },\n};\n"
  },
  {
    "path": "miniprogram/vant/goods-action/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/goods-action/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    type: 'descendant',\n    name: 'goods-action-button',\n    current: 'goods-action',\n    linked() {\n      this.updateStyle();\n    },\n    unlinked() {\n      this.updateStyle();\n    },\n    linkChanged() {\n      this.updateStyle();\n    },\n  },\n  props: {\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    updateStyle() {\n      wx.nextTick(() => {\n        this.children.forEach((child) => {\n          child.updateStyle();\n        });\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/goods-action/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/goods-action/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class {{ utils.bem('goods-action', { safe: safeAreaInsetBottom }) }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/goods-action/index.wxss",
    "content": "@import '../common/index.wxss';.van-goods-action{position:fixed;right:0;bottom:0;left:0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;background-color:#fff;background-color:var(--goods-action-background-color,#fff)}.van-goods-action--safe{padding-bottom:env(safe-area-inset-bottom)}"
  },
  {
    "path": "miniprogram/vant/goods-action-button/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/goods-action-button/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { link } from '../mixins/link';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nVantComponent({\n  mixins: [link, button, openType],\n  relation: {\n    type: 'ancestor',\n    name: 'goods-action',\n    current: 'goods-action-button',\n  },\n  props: {\n    text: String,\n    color: String,\n    loading: Boolean,\n    disabled: Boolean,\n    plain: Boolean,\n    type: {\n      type: String,\n      value: 'danger',\n    },\n  },\n  methods: {\n    onClick(event) {\n      this.$emit('click', event.detail);\n      this.jumpLink();\n    },\n    updateStyle() {\n      if (this.parent == null) {\n        return;\n      }\n      const { children = [] } = this.parent;\n      const { length } = children;\n      const index = children.indexOf(this);\n      this.setData({\n        isFirst: index === 0,\n        isLast: index === length - 1,\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/goods-action-button/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-button\": \"../button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/goods-action-button/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<van-button\n  id=\"{{ id }}\"\n  lang=\"{{ lang }}\"\n  type=\"{{ type }}\"\n  color=\"{{ color }}\"\n  plain=\"{{ plain }}\"\n  loading=\"{{ loading }}\"\n  disabled=\"{{ disabled }}\"\n  open-type=\"{{ openType }}\"\n  class=\"{{ utils.bem('goods-action-button', [type, { first: isFirst, last: isLast, plain: plain }])}}\"\n  custom-class=\"van-goods-action-button__inner\"\n  business-id=\"{{ businessId }}\"\n  session-from=\"{{ sessionFrom }}\"\n  app-parameter=\"{{ appParameter }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  bind:click=\"onClick\"\n  binderror=\"bindError\"\n  bindcontact=\"bindContact\"\n  bindopensetting=\"bindOpenSetting\"\n  bindgetuserinfo=\"bindGetUserInfo\"\n  bindgetphonenumber=\"bindGetPhoneNumber\"\n  bindlaunchapp=\"bindLaunchApp\"\n>\n  {{ text }}\n  <slot></slot>\n</van-button>\n"
  },
  {
    "path": "miniprogram/vant/goods-action-button/index.wxss",
    "content": "@import '../common/index.wxss';:host{-webkit-flex:1;flex:1}.van-goods-action-button{--button-warning-background-color:linear-gradient(90deg,#ffd01e,#ff8917);--button-warning-background-color:var(--goods-action-button-warning-color,linear-gradient(90deg,#ffd01e,#ff8917));--button-danger-background-color:linear-gradient(90deg,#ff6034,#ee0a24);--button-danger-background-color:var(--goods-action-button-danger-color,linear-gradient(90deg,#ff6034,#ee0a24));--button-default-height:40px;--button-default-height:var(--goods-action-button-height,40px);--button-line-height:20px;--button-line-height:var(--goods-action-button-line-height,20px);--button-plain-background-color:#fff;--button-plain-background-color:var(--goods-action-button-plain-color,#fff);display:block;--button-border-width:0}.van-goods-action-button--first{margin-left:5px;--button-border-radius:20px 0 0 20px;--button-border-radius:var(--goods-action-button-border-radius,20px) 0 0 var(--goods-action-button-border-radius,20px)}.van-goods-action-button--last{margin-right:5px;--button-border-radius:0 20px 20px 0;--button-border-radius:0 var(--goods-action-button-border-radius,20px) var(--goods-action-button-border-radius,20px) 0}.van-goods-action-button--first.van-goods-action-button--last{--button-border-radius:20px;--button-border-radius:var(--goods-action-button-border-radius,20px)}.van-goods-action-button--plain{--button-border-width:1px}.van-goods-action-button__inner{width:100%;font-weight:500!important;font-weight:var(--font-weight-bold,500)!important}@media (max-width:321px){.van-goods-action-button{font-size:13px}}"
  },
  {
    "path": "miniprogram/vant/goods-action-icon/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/goods-action-icon/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { link } from '../mixins/link';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nVantComponent({\n  classes: ['icon-class', 'text-class'],\n  mixins: [link, button, openType],\n  props: {\n    text: String,\n    dot: Boolean,\n    info: String,\n    icon: String,\n    disabled: Boolean,\n    loading: Boolean,\n  },\n  methods: {\n    onClick(event) {\n      this.$emit('click', event.detail);\n      this.jumpLink();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/goods-action-icon/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-button\": \"../button/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/goods-action-icon/index.wxml",
    "content": "<van-button\n  square\n  id=\"{{ id }}\"\n  size=\"large\"\n  lang=\"{{ lang }}\"\n  loading=\"{{ loading }}\"\n  disabled=\"{{ disabled }}\"\n  open-type=\"{{ openType }}\"\n  business-id=\"{{ businessId }}\"\n  custom-class=\"van-goods-action-icon\"\n  session-from=\"{{ sessionFrom }}\"\n  app-parameter=\"{{ appParameter }}\"\n  send-message-img=\"{{ sendMessageImg }}\"\n  send-message-path=\"{{ sendMessagePath }}\"\n  show-message-card=\"{{ showMessageCard }}\"\n  send-message-title=\"{{ sendMessageTitle }}\"\n  bind:click=\"onClick\"\n  binderror=\"bindError\"\n  bindcontact=\"bindContact\"\n  bindopensetting=\"bindOpenSetting\"\n  bindgetuserinfo=\"bindGetUserInfo\"\n  bindgetphonenumber=\"bindGetPhoneNumber\"\n  bindlaunchapp=\"bindLaunchApp\"\n>\n  <view class=\"van-goods-action-icon__content\">\n    <van-icon\n      wx:if=\"{{ icon }}\"\n      size=\"20px\"\n      name=\"{{ icon }}\"\n      dot=\"{{ dot }}\"\n      info=\"{{ info }}\"\n      class=\"van-goods-action-icon__icon\"\n      custom-class=\"icon-class\"\n    />\n    <slot name=\"icon\" />\n    <text class=\"text-class\">{{ text }}</text>\n  </view>\n</van-button>\n"
  },
  {
    "path": "miniprogram/vant/goods-action-icon/index.wxss",
    "content": "@import '../common/index.wxss';.van-goods-action-icon{border:none!important;width:50px!important;width:var(--goods-action-icon-height,50px)!important}.van-goods-action-icon__content{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:center;justify-content:center;height:100%;line-height:1;font-size:10px;font-size:var(--goods-action-icon-font-size,10px);color:#646566;color:var(--goods-action-icon-text-color,#646566)}.van-goods-action-icon__icon{margin-bottom:4px}"
  },
  {
    "path": "miniprogram/vant/grid/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/grid/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { addUnit } from '../common/utils';\nVantComponent({\n  relation: {\n    name: 'grid-item',\n    type: 'descendant',\n    current: 'grid',\n  },\n  props: {\n    square: {\n      type: Boolean,\n      observer: 'updateChildren',\n    },\n    gutter: {\n      type: [Number, String],\n      value: 0,\n      observer: 'updateChildren',\n    },\n    clickable: {\n      type: Boolean,\n      observer: 'updateChildren',\n    },\n    columnNum: {\n      type: Number,\n      value: 4,\n      observer: 'updateChildren',\n    },\n    center: {\n      type: Boolean,\n      value: true,\n      observer: 'updateChildren',\n    },\n    border: {\n      type: Boolean,\n      value: true,\n      observer: 'updateChildren',\n    },\n  },\n  data: {\n    viewStyle: '',\n  },\n  created() {\n    const { gutter } = this.data;\n    if (gutter) {\n      this.setData({\n        viewStyle: `padding-left: ${addUnit(gutter)}`,\n      });\n    }\n  },\n  methods: {\n    updateChildren() {\n      this.children.forEach((child) => {\n        child.updateStyle();\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/grid/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/grid/index.wxml",
    "content": "<view class=\"van-grid custom-class {{ border && !gutter ? 'van-hairline--top' : '' }}\" style=\"{{ viewStyle }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/grid/index.wxss",
    "content": "@import '../common/index.wxss';.van-grid{position:relative;box-sizing:border-box;overflow:hidden}"
  },
  {
    "path": "miniprogram/vant/grid-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/grid-item/index.js",
    "content": "import { link } from '../mixins/link';\nimport { VantComponent } from '../common/component';\nimport { addUnit } from '../common/utils';\nVantComponent({\n  relation: {\n    name: 'grid',\n    type: 'ancestor',\n    current: 'grid-item',\n  },\n  classes: ['content-class', 'icon-class', 'text-class'],\n  mixins: [link],\n  props: {\n    icon: String,\n    dot: Boolean,\n    info: null,\n    text: String,\n    useSlot: Boolean,\n  },\n  data: {\n    viewStyle: '',\n  },\n  mounted() {\n    this.updateStyle();\n  },\n  methods: {\n    updateStyle() {\n      if (!this.parent) {\n        return;\n      }\n      const { data, children } = this.parent;\n      const { columnNum, border, square, gutter, clickable, center } = data;\n      const width = `${100 / columnNum}%`;\n      const styleWrapper = [];\n      styleWrapper.push(`width: ${width}`);\n      if (square) {\n        styleWrapper.push(`padding-top: ${width}`);\n      }\n      if (gutter) {\n        const gutterValue = addUnit(gutter);\n        styleWrapper.push(`padding-right: ${gutterValue}`);\n        const index = children.indexOf(this);\n        if (index >= columnNum) {\n          styleWrapper.push(`margin-top: ${gutterValue}`);\n        }\n      }\n      let contentStyle = '';\n      if (square && gutter) {\n        const gutterValue = addUnit(gutter);\n        contentStyle = `\n          right: ${gutterValue};\n          bottom: ${gutterValue};\n          height: auto;\n        `;\n      }\n      this.setData({\n        viewStyle: styleWrapper.join('; '),\n        contentStyle,\n        center,\n        border,\n        square,\n        gutter,\n        clickable,\n      });\n    },\n    onClick() {\n      this.$emit('click');\n      this.jumpLink();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/grid-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/grid-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class {{ utils.bem('grid-item', { square }) }}\" style=\"{{ viewStyle }}\" bindtap=\"onClick\">\n  <view\n    class=\"content-class {{ utils.bem('grid-item__content', { center, square, clickable, surround: border && gutter }) }} {{ border ? 'van-hairline--surround' : '' }}\"\n    style=\"{{ contentStyle }}\"\n  >\n    <block wx:if=\"{{ useSlot }}\">\n      <slot />\n    </block>\n    <block wx:else>\n      <view class=\"van-grid-item__icon icon-class\">\n        <van-icon wx:if=\"{{ icon }}\" name=\"{{ icon }}\" dot=\"{{ dot }}\" info=\"{{ info }}\" />\n        <slot wx:else name=\"icon\"></slot>\n      </view>\n      <view class=\"van-grid-item__text text-class\">\n        <text wx:if=\"{{ text }}\">{{ text }}</text>\n        <slot wx:else name=\"text\"></slot>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/grid-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-grid-item{position:relative;float:left;box-sizing:border-box}.van-grid-item--square{height:0}.van-grid-item__content{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;box-sizing:border-box;height:100%;padding:16px 8px;padding:var(--grid-item-content-padding,16px 8px);background-color:#fff;background-color:var(--grid-item-content-background-color,#fff)}.van-grid-item__content:after{z-index:1;border-width:0 1px 1px 0;border-bottom-width:var(--border-width-base,1px);border-right-width:var(--border-width-base,1px);border-top-width:0}.van-grid-item__content--surround:after{border-width:1px;border-width:var(--border-width-base,1px)}.van-grid-item__content--center{-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.van-grid-item__content--square{position:absolute;top:0;right:0;left:0}.van-grid-item__content--clickable:active{background-color:#f2f3f5;background-color:var(--grid-item-content-active-color,#f2f3f5)}.van-grid-item__icon{font-size:26px;font-size:var(--grid-item-icon-size,26px)}.van-grid-item__text{word-wrap:break-word;color:#646566;color:var(--grid-item-text-color,#646566);font-size:12px;font-size:var(--grid-item-text-font-size,12px)}"
  },
  {
    "path": "miniprogram/vant/icon/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/icon/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    dot: Boolean,\n    info: null,\n    size: null,\n    color: String,\n    customStyle: String,\n    classPrefix: {\n      type: String,\n      value: 'van-icon',\n    },\n    name: {\n      type: String,\n      observer(val) {\n        this.setData({\n          isImageName: val.indexOf('/') !== -1,\n        });\n      },\n    },\n  },\n  methods: {\n    onClick() {\n      this.$emit('click');\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/icon/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/icon/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ classPrefix }} {{ isImageName ? 'van-icon--image' : classPrefix + '-' + name }}\"\n  style=\"color: {{ color }};font-size: {{ utils.addUnit(size) }};{{ customStyle }}\"\n  bind:tap=\"onClick\"\n>\n  <van-info\n    wx:if=\"{{ info !== null || dot }}\"\n    dot=\"{{ dot }}\"\n    info=\"{{ info }}\"\n    custom-class=\"van-icon__info\"\n  />\n  <image\n    wx:if=\"{{ isImageName }}\"\n    src=\"{{ name }}\"\n    mode=\"aspectFit\"\n    class=\"van-icon__image\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/icon/index.wxss",
    "content": "@import '../common/index.wxss';@font-face{font-weight:400;font-family:vant-icon;font-style:normal;font-display:auto;src:url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff2) format(\"woff2\"),url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff) format(\"woff\"),url(https://img.yzcdn.cn/vant/vant-icon-d3825a.ttf) format(\"truetype\")}.van-icon{position:relative;font:normal normal normal 14px/1 vant-icon;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased}.van-icon,.van-icon:before{display:inline-block}.van-icon-add-o:before{content:\"\\F000\"}.van-icon-add-square:before{content:\"\\F001\"}.van-icon-add:before{content:\"\\F002\"}.van-icon-after-sale:before{content:\"\\F003\"}.van-icon-aim:before{content:\"\\F004\"}.van-icon-alipay:before{content:\"\\F005\"}.van-icon-apps-o:before{content:\"\\F006\"}.van-icon-arrow-down:before{content:\"\\F007\"}.van-icon-arrow-left:before{content:\"\\F008\"}.van-icon-arrow-up:before{content:\"\\F009\"}.van-icon-arrow:before{content:\"\\F00A\"}.van-icon-ascending:before{content:\"\\F00B\"}.van-icon-audio:before{content:\"\\F00C\"}.van-icon-award-o:before{content:\"\\F00D\"}.van-icon-award:before{content:\"\\F00E\"}.van-icon-bag-o:before{content:\"\\F00F\"}.van-icon-bag:before{content:\"\\F010\"}.van-icon-balance-list-o:before{content:\"\\F011\"}.van-icon-balance-list:before{content:\"\\F012\"}.van-icon-balance-o:before{content:\"\\F013\"}.van-icon-balance-pay:before{content:\"\\F014\"}.van-icon-bar-chart-o:before{content:\"\\F015\"}.van-icon-bars:before{content:\"\\F016\"}.van-icon-bell:before{content:\"\\F017\"}.van-icon-bill-o:before{content:\"\\F018\"}.van-icon-bill:before{content:\"\\F019\"}.van-icon-birthday-cake-o:before{content:\"\\F01A\"}.van-icon-bookmark-o:before{content:\"\\F01B\"}.van-icon-bookmark:before{content:\"\\F01C\"}.van-icon-browsing-history-o:before{content:\"\\F01D\"}.van-icon-browsing-history:before{content:\"\\F01E\"}.van-icon-brush-o:before{content:\"\\F01F\"}.van-icon-bulb-o:before{content:\"\\F020\"}.van-icon-bullhorn-o:before{content:\"\\F021\"}.van-icon-calender-o:before{content:\"\\F022\"}.van-icon-card:before{content:\"\\F023\"}.van-icon-cart-circle-o:before{content:\"\\F024\"}.van-icon-cart-circle:before{content:\"\\F025\"}.van-icon-cart-o:before{content:\"\\F026\"}.van-icon-cart:before{content:\"\\F027\"}.van-icon-cash-back-record:before{content:\"\\F028\"}.van-icon-cash-on-deliver:before{content:\"\\F029\"}.van-icon-cashier-o:before{content:\"\\F02A\"}.van-icon-certificate:before{content:\"\\F02B\"}.van-icon-chart-trending-o:before{content:\"\\F02C\"}.van-icon-chat-o:before{content:\"\\F02D\"}.van-icon-chat:before{content:\"\\F02E\"}.van-icon-checked:before{content:\"\\F02F\"}.van-icon-circle:before{content:\"\\F030\"}.van-icon-clear:before{content:\"\\F031\"}.van-icon-clock-o:before{content:\"\\F032\"}.van-icon-clock:before{content:\"\\F033\"}.van-icon-close:before{content:\"\\F034\"}.van-icon-closed-eye:before{content:\"\\F035\"}.van-icon-cluster-o:before{content:\"\\F036\"}.van-icon-cluster:before{content:\"\\F037\"}.van-icon-column:before{content:\"\\F038\"}.van-icon-comment-circle-o:before{content:\"\\F039\"}.van-icon-comment-circle:before{content:\"\\F03A\"}.van-icon-comment-o:before{content:\"\\F03B\"}.van-icon-comment:before{content:\"\\F03C\"}.van-icon-completed:before{content:\"\\F03D\"}.van-icon-contact:before{content:\"\\F03E\"}.van-icon-coupon-o:before{content:\"\\F03F\"}.van-icon-coupon:before{content:\"\\F040\"}.van-icon-credit-pay:before{content:\"\\F041\"}.van-icon-cross:before{content:\"\\F042\"}.van-icon-debit-pay:before{content:\"\\F043\"}.van-icon-delete:before{content:\"\\F044\"}.van-icon-descending:before{content:\"\\F045\"}.van-icon-description:before{content:\"\\F046\"}.van-icon-desktop-o:before{content:\"\\F047\"}.van-icon-diamond-o:before{content:\"\\F048\"}.van-icon-diamond:before{content:\"\\F049\"}.van-icon-discount:before{content:\"\\F04A\"}.van-icon-down:before{content:\"\\F04B\"}.van-icon-ecard-pay:before{content:\"\\F04C\"}.van-icon-edit:before{content:\"\\F04D\"}.van-icon-ellipsis:before{content:\"\\F04E\"}.van-icon-empty:before{content:\"\\F04F\"}.van-icon-envelop-o:before{content:\"\\F050\"}.van-icon-exchange:before{content:\"\\F051\"}.van-icon-expand-o:before{content:\"\\F052\"}.van-icon-expand:before{content:\"\\F053\"}.van-icon-eye-o:before{content:\"\\F054\"}.van-icon-eye:before{content:\"\\F055\"}.van-icon-fail:before{content:\"\\F056\"}.van-icon-failure:before{content:\"\\F057\"}.van-icon-filter-o:before{content:\"\\F058\"}.van-icon-fire-o:before{content:\"\\F059\"}.van-icon-fire:before{content:\"\\F05A\"}.van-icon-flag-o:before{content:\"\\F05B\"}.van-icon-flower-o:before{content:\"\\F05C\"}.van-icon-free-postage:before{content:\"\\F05D\"}.van-icon-friends-o:before{content:\"\\F05E\"}.van-icon-friends:before{content:\"\\F05F\"}.van-icon-gem-o:before{content:\"\\F060\"}.van-icon-gem:before{content:\"\\F061\"}.van-icon-gift-card-o:before{content:\"\\F062\"}.van-icon-gift-card:before{content:\"\\F063\"}.van-icon-gift-o:before{content:\"\\F064\"}.van-icon-gift:before{content:\"\\F065\"}.van-icon-gold-coin-o:before{content:\"\\F066\"}.van-icon-gold-coin:before{content:\"\\F067\"}.van-icon-good-job-o:before{content:\"\\F068\"}.van-icon-good-job:before{content:\"\\F069\"}.van-icon-goods-collect-o:before{content:\"\\F06A\"}.van-icon-goods-collect:before{content:\"\\F06B\"}.van-icon-graphic:before{content:\"\\F06C\"}.van-icon-home-o:before{content:\"\\F06D\"}.van-icon-hot-o:before{content:\"\\F06E\"}.van-icon-hot-sale-o:before{content:\"\\F06F\"}.van-icon-hot-sale:before{content:\"\\F070\"}.van-icon-hot:before{content:\"\\F071\"}.van-icon-hotel-o:before{content:\"\\F072\"}.van-icon-idcard:before{content:\"\\F073\"}.van-icon-info-o:before{content:\"\\F074\"}.van-icon-info:before{content:\"\\F075\"}.van-icon-invition:before{content:\"\\F076\"}.van-icon-label-o:before{content:\"\\F077\"}.van-icon-label:before{content:\"\\F078\"}.van-icon-like-o:before{content:\"\\F079\"}.van-icon-like:before{content:\"\\F07A\"}.van-icon-live:before{content:\"\\F07B\"}.van-icon-location-o:before{content:\"\\F07C\"}.van-icon-location:before{content:\"\\F07D\"}.van-icon-lock:before{content:\"\\F07E\"}.van-icon-logistics:before{content:\"\\F07F\"}.van-icon-manager-o:before{content:\"\\F080\"}.van-icon-manager:before{content:\"\\F081\"}.van-icon-map-marked:before{content:\"\\F082\"}.van-icon-medal-o:before{content:\"\\F083\"}.van-icon-medal:before{content:\"\\F084\"}.van-icon-more-o:before{content:\"\\F085\"}.van-icon-more:before{content:\"\\F086\"}.van-icon-music-o:before{content:\"\\F087\"}.van-icon-music:before{content:\"\\F088\"}.van-icon-new-arrival-o:before{content:\"\\F089\"}.van-icon-new-arrival:before{content:\"\\F08A\"}.van-icon-new-o:before{content:\"\\F08B\"}.van-icon-new:before{content:\"\\F08C\"}.van-icon-newspaper-o:before{content:\"\\F08D\"}.van-icon-notes-o:before{content:\"\\F08E\"}.van-icon-orders-o:before{content:\"\\F08F\"}.van-icon-other-pay:before{content:\"\\F090\"}.van-icon-paid:before{content:\"\\F091\"}.van-icon-passed:before{content:\"\\F092\"}.van-icon-pause-circle-o:before{content:\"\\F093\"}.van-icon-pause-circle:before{content:\"\\F094\"}.van-icon-pause:before{content:\"\\F095\"}.van-icon-peer-pay:before{content:\"\\F096\"}.van-icon-pending-payment:before{content:\"\\F097\"}.van-icon-phone-circle-o:before{content:\"\\F098\"}.van-icon-phone-circle:before{content:\"\\F099\"}.van-icon-phone-o:before{content:\"\\F09A\"}.van-icon-phone:before{content:\"\\F09B\"}.van-icon-photo-o:before{content:\"\\F09C\"}.van-icon-photo:before{content:\"\\F09D\"}.van-icon-photograph:before{content:\"\\F09E\"}.van-icon-play-circle-o:before{content:\"\\F09F\"}.van-icon-play-circle:before{content:\"\\F0A0\"}.van-icon-play:before{content:\"\\F0A1\"}.van-icon-plus:before{content:\"\\F0A2\"}.van-icon-point-gift-o:before{content:\"\\F0A3\"}.van-icon-point-gift:before{content:\"\\F0A4\"}.van-icon-points:before{content:\"\\F0A5\"}.van-icon-printer:before{content:\"\\F0A6\"}.van-icon-qr-invalid:before{content:\"\\F0A7\"}.van-icon-qr:before{content:\"\\F0A8\"}.van-icon-question-o:before{content:\"\\F0A9\"}.van-icon-question:before{content:\"\\F0AA\"}.van-icon-records:before{content:\"\\F0AB\"}.van-icon-refund-o:before{content:\"\\F0AC\"}.van-icon-replay:before{content:\"\\F0AD\"}.van-icon-scan:before{content:\"\\F0AE\"}.van-icon-search:before{content:\"\\F0AF\"}.van-icon-send-gift-o:before{content:\"\\F0B0\"}.van-icon-send-gift:before{content:\"\\F0B1\"}.van-icon-service-o:before{content:\"\\F0B2\"}.van-icon-service:before{content:\"\\F0B3\"}.van-icon-setting-o:before{content:\"\\F0B4\"}.van-icon-setting:before{content:\"\\F0B5\"}.van-icon-share:before{content:\"\\F0B6\"}.van-icon-shop-collect-o:before{content:\"\\F0B7\"}.van-icon-shop-collect:before{content:\"\\F0B8\"}.van-icon-shop-o:before{content:\"\\F0B9\"}.van-icon-shop:before{content:\"\\F0BA\"}.van-icon-shopping-cart-o:before{content:\"\\F0BB\"}.van-icon-shopping-cart:before{content:\"\\F0BC\"}.van-icon-shrink:before{content:\"\\F0BD\"}.van-icon-sign:before{content:\"\\F0BE\"}.van-icon-smile-comment-o:before{content:\"\\F0BF\"}.van-icon-smile-comment:before{content:\"\\F0C0\"}.van-icon-smile-o:before{content:\"\\F0C1\"}.van-icon-smile:before{content:\"\\F0C2\"}.van-icon-star-o:before{content:\"\\F0C3\"}.van-icon-star:before{content:\"\\F0C4\"}.van-icon-stop-circle-o:before{content:\"\\F0C5\"}.van-icon-stop-circle:before{content:\"\\F0C6\"}.van-icon-stop:before{content:\"\\F0C7\"}.van-icon-success:before{content:\"\\F0C8\"}.van-icon-thumb-circle-o:before{content:\"\\F0C9\"}.van-icon-thumb-circle:before{content:\"\\F0CA\"}.van-icon-todo-list-o:before{content:\"\\F0CB\"}.van-icon-todo-list:before{content:\"\\F0CC\"}.van-icon-tosend:before{content:\"\\F0CD\"}.van-icon-tv-o:before{content:\"\\F0CE\"}.van-icon-umbrella-circle:before{content:\"\\F0CF\"}.van-icon-underway-o:before{content:\"\\F0D0\"}.van-icon-underway:before{content:\"\\F0D1\"}.van-icon-upgrade:before{content:\"\\F0D2\"}.van-icon-user-circle-o:before{content:\"\\F0D3\"}.van-icon-user-o:before{content:\"\\F0D4\"}.van-icon-video-o:before{content:\"\\F0D5\"}.van-icon-video:before{content:\"\\F0D6\"}.van-icon-vip-card-o:before{content:\"\\F0D7\"}.van-icon-vip-card:before{content:\"\\F0D8\"}.van-icon-volume-o:before{content:\"\\F0D9\"}.van-icon-volume:before{content:\"\\F0DA\"}.van-icon-wap-home-o:before{content:\"\\F0DB\"}.van-icon-wap-home:before{content:\"\\F0DC\"}.van-icon-wap-nav:before{content:\"\\F0DD\"}.van-icon-warn-o:before{content:\"\\F0DE\"}.van-icon-warning-o:before{content:\"\\F0DF\"}.van-icon-warning:before{content:\"\\F0E0\"}.van-icon-weapp-nav:before{content:\"\\F0E1\"}.van-icon-wechat:before{content:\"\\F0E2\"}.van-icon-youzan-shield:before{content:\"\\F0E3\"}:host{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center}.van-icon--image{width:1em;height:1em}.van-icon__image{width:100%;height:100%}.van-icon__info{z-index:1}"
  },
  {
    "path": "miniprogram/vant/image/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/image/index.js",
    "content": "import { addUnit, isDef } from '../common/utils';\nimport { VantComponent } from '../common/component';\nimport { button } from '../mixins/button';\nimport { openType } from '../mixins/open-type';\nconst FIT_MODE_MAP = {\n  none: 'center',\n  fill: 'scaleToFill',\n  cover: 'aspectFill',\n  contain: 'aspectFit',\n  widthFix: 'widthFix',\n  heightFix: 'heightFix',\n};\nVantComponent({\n  mixins: [button, openType],\n  classes: ['custom-class', 'loading-class', 'error-class', 'image-class'],\n  props: {\n    src: {\n      type: String,\n      observer() {\n        this.setData({\n          error: false,\n          loading: true,\n        });\n      },\n    },\n    round: Boolean,\n    width: {\n      type: null,\n      observer: 'setStyle',\n    },\n    height: {\n      type: null,\n      observer: 'setStyle',\n    },\n    radius: null,\n    lazyLoad: Boolean,\n    useErrorSlot: Boolean,\n    useLoadingSlot: Boolean,\n    showMenuByLongpress: Boolean,\n    fit: {\n      type: String,\n      value: 'fill',\n      observer: 'setMode',\n    },\n    showError: {\n      type: Boolean,\n      value: true,\n    },\n    showLoading: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    error: false,\n    loading: true,\n    viewStyle: '',\n  },\n  mounted() {\n    this.setMode();\n    this.setStyle();\n  },\n  methods: {\n    setMode() {\n      this.setData({\n        mode: FIT_MODE_MAP[this.data.fit],\n      });\n    },\n    setStyle() {\n      const { width, height, radius } = this.data;\n      let style = '';\n      if (isDef(width)) {\n        style += `width: ${addUnit(width)};`;\n      }\n      if (isDef(height)) {\n        style += `height: ${addUnit(height)};`;\n      }\n      if (isDef(radius)) {\n        style += 'overflow: hidden;';\n        style += `border-radius: ${addUnit(radius)};`;\n      }\n      this.setData({ viewStyle: style });\n    },\n    onLoad(event) {\n      this.setData({\n        loading: false,\n      });\n      this.$emit('load', event.detail);\n    },\n    onError(event) {\n      this.setData({\n        loading: false,\n        error: true,\n      });\n      this.$emit('error', event.detail);\n    },\n    onClick(event) {\n      this.$emit('click', event.detail);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/image/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/image/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  style=\"{{ viewStyle }}\"\n  class=\"custom-class {{ utils.bem('image', { round })}}\"\n  bind:tap=\"onClick\"\n>\n  <image\n    wx:if=\"{{ !error }}\"\n    src=\"{{ src }}\"\n    mode=\"{{ mode }}\"\n    lazy-load=\"{{ lazyLoad }}\"\n    class=\"image-class van-image__img\"\n    show-menu-by-longpress=\"{{ showMenuByLongpress }}\"\n    bind:load=\"onLoad\"\n    bind:error=\"onError\"\n  />\n\n  <view\n    wx:if=\"{{ loading && showLoading }}\"\n    class=\"loading-class van-image__loading\"\n  >\n    <slot wx:if=\"{{ useLoadingSlot }}\" name=\"loading\" />\n    <van-icon wx:else name=\"photo-o\" size=\"22\" />\n  </view>\n  <view\n    wx:if=\"{{ error && showError }}\"\n    class=\"error-class van-image__error\"\n  >\n    <slot wx:if=\"{{ useErrorSlot }}\" name=\"error\" />\n    <van-icon wx:else name=\"warning-o\" size=\"22\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/image/index.wxss",
    "content": "@import '../common/index.wxss';.van-image{position:relative;display:inline-block}.van-image--round{overflow:hidden;border-radius:50%}.van-image--round .van-image__img{border-radius:inherit}.van-image__error,.van-image__img,.van-image__loading{display:block;width:100%;height:100%}.van-image__error,.van-image__loading{position:absolute;top:0;left:0;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#969799;color:var(--image-placeholder-text-color,#969799);font-size:14px;font-size:var(--image-placeholder-font-size,14px);background-color:#f7f8fa;background-color:var(--image-placeholder-background-color,#f7f8fa)}"
  },
  {
    "path": "miniprogram/vant/index-anchor/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/index-anchor/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'index-bar',\n    type: 'ancestor',\n    current: 'index-anchor',\n  },\n  props: {\n    useSlot: Boolean,\n    index: null,\n  },\n  data: {\n    active: false,\n    wrapperStyle: '',\n    anchorStyle: '',\n  },\n  methods: {\n    scrollIntoView(scrollTop) {\n      this.getBoundingClientRect().then((rect) => {\n        wx.pageScrollTo({\n          duration: 0,\n          scrollTop: scrollTop + rect.top - this.parent.data.stickyOffsetTop,\n        });\n      });\n    },\n    getBoundingClientRect() {\n      return this.getRect('.van-index-anchor-wrapper');\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/index-anchor/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/index-anchor/index.wxml",
    "content": "<view\n  class=\"van-index-anchor-wrapper\"\n  style=\"{{ wrapperStyle }}\"\n>\n  <view\n    class=\"van-index-anchor {{ active ? 'van-index-anchor--active van-hairline--bottom' : '' }}\"\n    style=\"{{ anchorStyle }}\"\n  >\n    <slot wx:if=\"{{ useSlot }}\"/>\n    <block wx:else>\n      <text>{{ index }}</text>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/index-anchor/index.wxss",
    "content": "@import '../common/index.wxss';.van-index-anchor{padding:0 16px;padding:var(--index-anchor-padding,0 16px);color:#323233;color:var(--index-anchor-text-color,#323233);font-weight:500;font-weight:var(--index-anchor-font-weight,500);font-size:14px;font-size:var(--index-anchor-font-size,14px);line-height:32px;line-height:var(--index-anchor-line-height,32px);background-color:initial;background-color:var(--index-anchor-background-color,transparent)}.van-index-anchor--active{right:0;left:0;color:#07c160;color:var(--index-anchor-active-text-color,#07c160);background-color:#fff;background-color:var(--index-anchor-active-background-color,#fff)}"
  },
  {
    "path": "miniprogram/vant/index-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/index-bar/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { GREEN } from '../common/color';\nimport { pageScrollMixin } from '../mixins/page-scroll';\nconst indexList = () => {\n  const indexList = [];\n  const charCodeOfA = 'A'.charCodeAt(0);\n  for (let i = 0; i < 26; i++) {\n    indexList.push(String.fromCharCode(charCodeOfA + i));\n  }\n  return indexList;\n};\nVantComponent({\n  relation: {\n    name: 'index-anchor',\n    type: 'descendant',\n    current: 'index-bar',\n    linked() {\n      this.updateData();\n    },\n    unlinked() {\n      this.updateData();\n    },\n  },\n  props: {\n    sticky: {\n      type: Boolean,\n      value: true,\n    },\n    zIndex: {\n      type: Number,\n      value: 1,\n    },\n    highlightColor: {\n      type: String,\n      value: GREEN,\n    },\n    stickyOffsetTop: {\n      type: Number,\n      value: 0,\n    },\n    indexList: {\n      type: Array,\n      value: indexList(),\n    },\n  },\n  mixins: [\n    pageScrollMixin(function (event) {\n      this.scrollTop = event.scrollTop || 0;\n      this.onScroll();\n    }),\n  ],\n  data: {\n    activeAnchorIndex: null,\n    showSidebar: false,\n  },\n  created() {\n    this.scrollTop = 0;\n  },\n  methods: {\n    updateData() {\n      wx.nextTick(() => {\n        if (this.timer != null) {\n          clearTimeout(this.timer);\n        }\n        this.timer = setTimeout(() => {\n          this.setData({\n            showSidebar: !!this.children.length,\n          });\n          this.setRect().then(() => {\n            this.onScroll();\n          });\n        }, 0);\n      });\n    },\n    setRect() {\n      return Promise.all([\n        this.setAnchorsRect(),\n        this.setListRect(),\n        this.setSiderbarRect(),\n      ]);\n    },\n    setAnchorsRect() {\n      return Promise.all(\n        this.children.map((anchor) =>\n          anchor.getRect('.van-index-anchor-wrapper').then((rect) => {\n            Object.assign(anchor, {\n              height: rect.height,\n              top: rect.top + this.scrollTop,\n            });\n          })\n        )\n      );\n    },\n    setListRect() {\n      return this.getRect('.van-index-bar').then((rect) => {\n        Object.assign(this, {\n          height: rect.height,\n          top: rect.top + this.scrollTop,\n        });\n      });\n    },\n    setSiderbarRect() {\n      return this.getRect('.van-index-bar__sidebar').then((res) => {\n        this.sidebar = {\n          height: res.height,\n          top: res.top,\n        };\n      });\n    },\n    setDiffData({ target, data }) {\n      const diffData = {};\n      Object.keys(data).forEach((key) => {\n        if (target.data[key] !== data[key]) {\n          diffData[key] = data[key];\n        }\n      });\n      if (Object.keys(diffData).length) {\n        target.setData(diffData);\n      }\n    },\n    getAnchorRect(anchor) {\n      return anchor.getRect('.van-index-anchor-wrapper').then((rect) => ({\n        height: rect.height,\n        top: rect.top,\n      }));\n    },\n    getActiveAnchorIndex() {\n      const { children, scrollTop } = this;\n      const { sticky, stickyOffsetTop } = this.data;\n      for (let i = this.children.length - 1; i >= 0; i--) {\n        const preAnchorHeight = i > 0 ? children[i - 1].height : 0;\n        const reachTop = sticky ? preAnchorHeight + stickyOffsetTop : 0;\n        if (reachTop + scrollTop >= children[i].top) {\n          return i;\n        }\n      }\n      return -1;\n    },\n    onScroll() {\n      const { children = [], scrollTop } = this;\n      if (!children.length) {\n        return;\n      }\n      const { sticky, stickyOffsetTop, zIndex, highlightColor } = this.data;\n      const active = this.getActiveAnchorIndex();\n      this.setDiffData({\n        target: this,\n        data: {\n          activeAnchorIndex: active,\n        },\n      });\n      if (sticky) {\n        let isActiveAnchorSticky = false;\n        if (active !== -1) {\n          isActiveAnchorSticky =\n            children[active].top <= stickyOffsetTop + scrollTop;\n        }\n        children.forEach((item, index) => {\n          if (index === active) {\n            let wrapperStyle = '';\n            let anchorStyle = `\n              color: ${highlightColor};\n            `;\n            if (isActiveAnchorSticky) {\n              wrapperStyle = `\n                height: ${children[index].height}px;\n              `;\n              anchorStyle = `\n                position: fixed;\n                top: ${stickyOffsetTop}px;\n                z-index: ${zIndex};\n                color: ${highlightColor};\n              `;\n            }\n            this.setDiffData({\n              target: item,\n              data: {\n                active: true,\n                anchorStyle,\n                wrapperStyle,\n              },\n            });\n          } else if (index === active - 1) {\n            const currentAnchor = children[index];\n            const currentOffsetTop = currentAnchor.top;\n            const targetOffsetTop =\n              index === children.length - 1\n                ? this.top\n                : children[index + 1].top;\n            const parentOffsetHeight = targetOffsetTop - currentOffsetTop;\n            const translateY = parentOffsetHeight - currentAnchor.height;\n            const anchorStyle = `\n              position: relative;\n              transform: translate3d(0, ${translateY}px, 0);\n              z-index: ${zIndex};\n              color: ${highlightColor};\n            `;\n            this.setDiffData({\n              target: item,\n              data: {\n                active: true,\n                anchorStyle,\n              },\n            });\n          } else {\n            this.setDiffData({\n              target: item,\n              data: {\n                active: false,\n                anchorStyle: '',\n                wrapperStyle: '',\n              },\n            });\n          }\n        });\n      }\n    },\n    onClick(event) {\n      this.scrollToAnchor(event.target.dataset.index);\n    },\n    onTouchMove(event) {\n      const sidebarLength = this.children.length;\n      const touch = event.touches[0];\n      const itemHeight = this.sidebar.height / sidebarLength;\n      let index = Math.floor((touch.clientY - this.sidebar.top) / itemHeight);\n      if (index < 0) {\n        index = 0;\n      } else if (index > sidebarLength - 1) {\n        index = sidebarLength - 1;\n      }\n      this.scrollToAnchor(index);\n    },\n    onTouchStop() {\n      this.scrollToAnchorIndex = null;\n    },\n    scrollToAnchor(index) {\n      if (typeof index !== 'number' || this.scrollToAnchorIndex === index) {\n        return;\n      }\n      this.scrollToAnchorIndex = index;\n      const anchor = this.children.find(\n        (item) => item.data.index === this.data.indexList[index]\n      );\n      if (anchor) {\n        anchor.scrollIntoView(this.scrollTop);\n        this.$emit('select', anchor.data.index);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/index-bar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/index-bar/index.wxml",
    "content": "<view class=\"van-index-bar\">\n  <slot />\n\n  <view\n    wx:if=\"{{ showSidebar }}\"\n    class=\"van-index-bar__sidebar\"\n    catch:tap=\"onClick\"\n    catch:touchmove=\"onTouchMove\"\n    catch:touchend=\"onTouchStop\"\n    catch:touchcancel=\"onTouchStop\"\n  >\n    <view\n      wx:for=\"{{ indexList }}\"\n      wx:key=\"index\"\n      class=\"van-index-bar__index\"\n      style=\"z-index: {{ zIndex + 1 }}; color: {{ activeAnchorIndex === index ? highlightColor : '' }}\"\n      data-index=\"{{ index }}\"\n    >\n      {{ item }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/index-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-index-bar{position:relative}.van-index-bar__sidebar{position:fixed;top:50%;right:0;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%);-webkit-user-select:none;user-select:none}.van-index-bar__index{font-weight:500;padding:0 4px 0 16px;padding:0 var(--padding-base,4px) 0 var(--padding-md,16px);font-size:10px;font-size:var(--index-bar-index-font-size,10px);line-height:14px;line-height:var(--index-bar-index-line-height,14px)}"
  },
  {
    "path": "miniprogram/vant/info/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/info/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    dot: Boolean,\n    info: null,\n    customStyle: String,\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/info/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/info/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ info !== null && info !== '' || dot }}\"\n  class=\"custom-class van-info {{ utils.bem('info', { dot }) }}\"\n  style=\"{{ customStyle }}\"\n>{{ dot ? '' : info }}</view>\n"
  },
  {
    "path": "miniprogram/vant/info/index.wxss",
    "content": "@import '../common/index.wxss';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)}"
  },
  {
    "path": "miniprogram/vant/loading/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/loading/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    color: String,\n    vertical: Boolean,\n    type: {\n      type: String,\n      value: 'circular',\n    },\n    size: String,\n    textSize: String,\n  },\n  data: {\n    array12: Array.from({ length: 12 }),\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/loading/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/loading/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class van-loading {{ vertical ? 'van-loading--vertical' : '' }}\">\n  <view\n    class=\"van-loading__spinner van-loading__spinner--{{ type }}\"\n    style=\"color: {{ color }}; width: {{ utils.addUnit(size) }}; height: {{ utils.addUnit(size) }}\"\n  >\n    <view\n      wx:if=\"{{ type === 'spinner' }}\"\n      wx:for=\"{{ array12 }}\"\n      wx:key=\"index\"\n      class=\"van-loading__dot\"\n    />\n  </view>\n  <view class=\"van-loading__text\" style=\"font-size: {{ utils.addUnit(textSize) }};\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/loading/index.wxss",
    "content": "@import '../common/index.wxss';:host{font-size:0;line-height:1}.van-loading{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#c8c9cc;color:var(--loading-spinner-color,#c8c9cc)}.van-loading__spinner{position:relative;box-sizing:border-box;width:30px;width:var(--loading-spinner-size,30px);max-width:100%;max-height:100%;height:30px;height:var(--loading-spinner-size,30px);-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite;-webkit-animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-top-color:initial;border-radius:100%}.van-loading__text{margin-left:8px;margin-left:var(--padding-xs,8px);color:#969799;color:var(--loading-text-color,#969799);font-size:14px;font-size:var(--loading-text-font-size,14px);line-height:20px;line-height:var(--loading-text-line-height,20px)}.van-loading__text:empty{display:none}.van-loading--vertical{-webkit-flex-direction:column;flex-direction:column}.van-loading--vertical .van-loading__text{margin:8px 0 0;margin:var(--padding-xs,8px) 0 0}.van-loading__dot{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__dot:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:\" \"}.van-loading__dot:first-of-type{-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__dot:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__dot:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__dot:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__dot:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__dot:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__dot:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__dot:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__dot:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__dot:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__dot:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__dot:nth-of-type(12){-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:.3125}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}"
  },
  {
    "path": "miniprogram/vant/mixins/basic.d.ts",
    "content": "export declare const basic: string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/basic.js",
    "content": "export const basic = Behavior({\n  methods: {\n    $emit(...args) {\n      this.triggerEvent(...args);\n    },\n    set(data, callback) {\n      this.setData(data, callback);\n      return new Promise((resolve) => wx.nextTick(resolve));\n    },\n    getRect(selector, all) {\n      return new Promise((resolve) => {\n        wx.createSelectorQuery()\n          .in(this)\n          [all ? 'selectAll' : 'select'](selector)\n          .boundingClientRect((rect) => {\n            if (all && Array.isArray(rect) && rect.length) {\n              resolve(rect);\n            }\n            if (!all && rect) {\n              resolve(rect);\n            }\n          })\n          .exec();\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/mixins/button.d.ts",
    "content": "export declare const button: string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/button.js",
    "content": "export const button = Behavior({\n  externalClasses: ['hover-class'],\n  properties: {\n    id: String,\n    lang: String,\n    businessId: Number,\n    sessionFrom: String,\n    sendMessageTitle: String,\n    sendMessagePath: String,\n    sendMessageImg: String,\n    showMessageCard: Boolean,\n    appParameter: String,\n    ariaLabel: String,\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/mixins/link.d.ts",
    "content": "export declare const link: string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/link.js",
    "content": "export const link = Behavior({\n  properties: {\n    url: String,\n    linkType: {\n      type: String,\n      value: 'navigateTo',\n    },\n  },\n  methods: {\n    jumpLink(urlKey = 'url') {\n      const url = this.data[urlKey];\n      if (url) {\n        wx[this.data.linkType]({ url });\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/mixins/open-type.d.ts",
    "content": "export declare const openType: string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/open-type.js",
    "content": "export const openType = Behavior({\n  properties: {\n    openType: String,\n  },\n  methods: {\n    bindGetUserInfo(event) {\n      this.$emit('getuserinfo', event.detail);\n    },\n    bindContact(event) {\n      this.$emit('contact', event.detail);\n    },\n    bindGetPhoneNumber(event) {\n      this.$emit('getphonenumber', event.detail);\n    },\n    bindError(event) {\n      this.$emit('error', event.detail);\n    },\n    bindLaunchApp(event) {\n      this.$emit('launchapp', event.detail);\n    },\n    bindOpenSetting(event) {\n      this.$emit('opensetting', event.detail);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/mixins/page-scroll.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ndeclare type IPageScrollOption = WechatMiniprogram.Page.IPageScrollOption;\ndeclare type Scroller = (event: IPageScrollOption) => void;\nexport declare const pageScrollMixin: (scroller: Scroller) => string;\nexport {};\n"
  },
  {
    "path": "miniprogram/vant/mixins/page-scroll.js",
    "content": "function getCurrentPage() {\n  const pages = getCurrentPages();\n  return pages[pages.length - 1] || {};\n}\nfunction onPageScroll(event) {\n  const { vanPageScroller = [] } = getCurrentPage();\n  vanPageScroller.forEach((scroller) => {\n    if (typeof scroller === 'function') {\n      scroller(event);\n    }\n  });\n}\nexport const pageScrollMixin = (scroller) =>\n  Behavior({\n    attached() {\n      const page = getCurrentPage();\n      if (Array.isArray(page.vanPageScroller)) {\n        page.vanPageScroller.push(scroller.bind(this));\n      } else {\n        page.vanPageScroller =\n          typeof page.onPageScroll === 'function'\n            ? [page.onPageScroll.bind(page), scroller.bind(this)]\n            : [scroller.bind(this)];\n      }\n      page.onPageScroll = onPageScroll;\n    },\n    detached() {\n      const page = getCurrentPage();\n      page.vanPageScroller = (page.vanPageScroller || []).filter(\n        (item) => item !== scroller\n      );\n    },\n  });\n"
  },
  {
    "path": "miniprogram/vant/mixins/touch.d.ts",
    "content": "export declare const touch: string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/touch.js",
    "content": "const MIN_DISTANCE = 10;\nfunction getDirection(x, y) {\n  if (x > y && x > MIN_DISTANCE) {\n    return 'horizontal';\n  }\n  if (y > x && y > MIN_DISTANCE) {\n    return 'vertical';\n  }\n  return '';\n}\nexport const touch = Behavior({\n  methods: {\n    resetTouchStatus() {\n      this.direction = '';\n      this.deltaX = 0;\n      this.deltaY = 0;\n      this.offsetX = 0;\n      this.offsetY = 0;\n    },\n    touchStart(event) {\n      this.resetTouchStatus();\n      const touch = event.touches[0];\n      this.startX = touch.clientX;\n      this.startY = touch.clientY;\n    },\n    touchMove(event) {\n      const touch = event.touches[0];\n      this.deltaX = touch.clientX - this.startX;\n      this.deltaY = touch.clientY - this.startY;\n      this.offsetX = Math.abs(this.deltaX);\n      this.offsetY = Math.abs(this.deltaY);\n      this.direction =\n        this.direction || getDirection(this.offsetX, this.offsetY);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/mixins/transition.d.ts",
    "content": "export declare const transition: (showDefaultValue: boolean) => string;\n"
  },
  {
    "path": "miniprogram/vant/mixins/transition.js",
    "content": "import { isObj } from '../common/utils';\nconst getClassNames = (name) => ({\n  enter: `van-${name}-enter van-${name}-enter-active enter-class enter-active-class`,\n  'enter-to': `van-${name}-enter-to van-${name}-enter-active enter-to-class enter-active-class`,\n  leave: `van-${name}-leave van-${name}-leave-active leave-class leave-active-class`,\n  'leave-to': `van-${name}-leave-to van-${name}-leave-active leave-to-class leave-active-class`,\n});\nconst nextTick = () => new Promise((resolve) => setTimeout(resolve, 1000 / 30));\nexport const transition = function (showDefaultValue) {\n  return Behavior({\n    properties: {\n      customStyle: String,\n      // @ts-ignore\n      show: {\n        type: Boolean,\n        value: showDefaultValue,\n        observer: 'observeShow',\n      },\n      // @ts-ignore\n      duration: {\n        type: null,\n        value: 300,\n        observer: 'observeDuration',\n      },\n      name: {\n        type: String,\n        value: 'fade',\n      },\n    },\n    data: {\n      type: '',\n      inited: false,\n      display: false,\n    },\n    methods: {\n      observeShow(value, old) {\n        if (value === old) {\n          return;\n        }\n        value ? this.enter() : this.leave();\n      },\n      enter() {\n        const { duration, name } = this.data;\n        const classNames = getClassNames(name);\n        const currentDuration = isObj(duration) ? duration.enter : duration;\n        this.status = 'enter';\n        this.$emit('before-enter');\n        Promise.resolve()\n          .then(nextTick)\n          .then(() => {\n            this.checkStatus('enter');\n            this.$emit('enter');\n            this.setData({\n              inited: true,\n              display: true,\n              classes: classNames.enter,\n              currentDuration,\n            });\n          })\n          .then(nextTick)\n          .then(() => {\n            this.checkStatus('enter');\n            this.transitionEnded = false;\n            this.setData({\n              classes: classNames['enter-to'],\n            });\n          })\n          .catch(() => {});\n      },\n      leave() {\n        if (!this.data.display) {\n          return;\n        }\n        const { duration, name } = this.data;\n        const classNames = getClassNames(name);\n        const currentDuration = isObj(duration) ? duration.leave : duration;\n        this.status = 'leave';\n        this.$emit('before-leave');\n        Promise.resolve()\n          .then(nextTick)\n          .then(() => {\n            this.checkStatus('leave');\n            this.$emit('leave');\n            this.setData({\n              classes: classNames.leave,\n              currentDuration,\n            });\n          })\n          .then(nextTick)\n          .then(() => {\n            this.checkStatus('leave');\n            this.transitionEnded = false;\n            setTimeout(() => this.onTransitionEnd(), currentDuration);\n            this.setData({\n              classes: classNames['leave-to'],\n            });\n          })\n          .catch(() => {});\n      },\n      checkStatus(status) {\n        if (status !== this.status) {\n          throw new Error(`incongruent status: ${status}`);\n        }\n      },\n      onTransitionEnd() {\n        if (this.transitionEnded) {\n          return;\n        }\n        this.transitionEnded = true;\n        this.$emit(`after-${this.status}`);\n        const { show, display } = this.data;\n        if (!show && display) {\n          this.setData({ display: false });\n        }\n      },\n    },\n  });\n};\n"
  },
  {
    "path": "miniprogram/vant/nav-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/nav-bar/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: ['title-class'],\n  props: {\n    title: String,\n    fixed: {\n      type: Boolean,\n      observer: 'setHeight',\n    },\n    placeholder: {\n      type: Boolean,\n      observer: 'setHeight',\n    },\n    leftText: String,\n    rightText: String,\n    customStyle: String,\n    leftArrow: Boolean,\n    border: {\n      type: Boolean,\n      value: true,\n    },\n    zIndex: {\n      type: Number,\n      value: 1,\n    },\n    safeAreaInsetTop: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    statusBarHeight: 0,\n    height: 44,\n    baseStyle: '',\n  },\n  created() {\n    const { statusBarHeight } = wx.getSystemInfoSync();\n    const { safeAreaInsetTop, zIndex } = this.data;\n    const paddingTop = safeAreaInsetTop ? statusBarHeight : 0;\n    const baseStyle = `z-index: ${zIndex};padding-top: ${paddingTop}px;`;\n    this.setData({\n      statusBarHeight,\n      height: 44 + statusBarHeight,\n      baseStyle,\n    });\n  },\n  mounted() {\n    this.setHeight();\n  },\n  methods: {\n    onClickLeft() {\n      this.$emit('click-left');\n    },\n    onClickRight() {\n      this.$emit('click-right');\n    },\n    setHeight() {\n      if (!this.data.fixed || !this.data.placeholder) {\n        return;\n      }\n      wx.nextTick(() => {\n        this.getRect('.van-nav-bar').then((res) => {\n          this.setData({ height: res.height });\n        });\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/nav-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/nav-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view wx:if=\"{{ fixed && placeholder }}\" style=\"height: {{ height }}px;\" />\n\n<view\n  class=\"{{ utils.bem('nav-bar', { fixed }) }} custom-class {{ border ? 'van-hairline--bottom' : '' }}\"\n  style=\"{{ baseStyle }} {{ customStyle }}\"\n>\n  <view class=\"van-nav-bar__left\" bind:tap=\"onClickLeft\">\n    <block wx:if=\"{{ leftArrow || leftText }}\">\n      <van-icon\n        wx:if=\"{{ leftArrow }}\"\n        size=\"16px\"\n        name=\"arrow-left\"\n        custom-class=\"van-nav-bar__arrow\"\n      />\n      <view\n        wx:if=\"{{ leftText }}\"\n        class=\"van-nav-bar__text\"\n        hover-class=\"van-nav-bar__text--hover\"\n        hover-stay-time=\"70\"\n      >{{ leftText }}</view>\n    </block>\n    <slot wx:else name=\"left\" />\n  </view>\n  <view class=\"van-nav-bar__title title-class van-ellipsis\">\n    <block wx:if=\"{{ title }}\">{{ title }}</block>\n    <slot wx:else name=\"title\" />\n  </view>\n  <view class=\"van-nav-bar__right\" bind:tap=\"onClickRight\">\n    <view\n      wx:if=\"{{ rightText }}\"\n      class=\"van-nav-bar__text\"\n      hover-class=\"van-nav-bar__text--hover\"\n      hover-stay-time=\"70\"\n    >{{ rightText }}</view>\n    <slot wx:else name=\"right\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/nav-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-nav-bar{position:relative;text-align:center;-webkit-user-select:none;user-select:none;height:44px;height:var(--nav-bar-height,44px);line-height:44px;line-height:var(--nav-bar-height,44px);background-color:#fff;background-color:var(--nav-bar-background-color,#fff)}.van-nav-bar__text{display:inline-block;vertical-align:middle;margin:0 -16px;margin:0 -var(--padding-md,16px);padding:0 16px;padding:0 var(--padding-md,16px);color:#1989fa;color:var(--nav-bar-text-color,#1989fa)}.van-nav-bar__text--hover{background-color:#f2f3f5;background-color:var(--active-color,#f2f3f5)}.van-nav-bar__arrow{vertical-align:middle;font-size:16px;font-size:var(--nav-bar-arrow-size,16px);color:#1989fa;color:var(--nav-bar-text-color,#1989fa)}.van-nav-bar__arrow+.van-nav-bar__text{margin-left:-20px;padding-left:25px}.van-nav-bar--fixed{position:fixed;top:0;left:0;width:100%}.van-nav-bar__title{max-width:60%;margin:0 auto;color:#323233;color:var(--nav-bar-title-text-color,#323233);font-weight:500;font-weight:var(--font-weight-bold,500);font-size:16px;font-size:var(--nav-bar-title-font-size,16px)}.van-nav-bar__left,.van-nav-bar__right{position:absolute;bottom:0;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;font-size:14px;font-size:var(--font-size-md,14px)}.van-nav-bar__left{left:16px;left:var(--padding-md,16px)}.van-nav-bar__right{right:16px;right:var(--padding-md,16px)}"
  },
  {
    "path": "miniprogram/vant/notice-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/notice-bar/index.js",
    "content": "import { VantComponent } from '../common/component';\nconst FONT_COLOR = '#ed6a0c';\nconst BG_COLOR = '#fffbe8';\nVantComponent({\n  props: {\n    text: {\n      type: String,\n      value: '',\n      observer() {\n        wx.nextTick(() => {\n          this.init();\n        });\n      },\n    },\n    mode: {\n      type: String,\n      value: '',\n    },\n    url: {\n      type: String,\n      value: '',\n    },\n    openType: {\n      type: String,\n      value: 'navigate',\n    },\n    delay: {\n      type: Number,\n      value: 1,\n    },\n    speed: {\n      type: Number,\n      value: 50,\n      observer() {\n        wx.nextTick(() => {\n          this.init();\n        });\n      },\n    },\n    scrollable: {\n      type: Boolean,\n      value: true,\n    },\n    leftIcon: {\n      type: String,\n      value: '',\n    },\n    color: {\n      type: String,\n      value: FONT_COLOR,\n    },\n    backgroundColor: {\n      type: String,\n      value: BG_COLOR,\n    },\n    wrapable: Boolean,\n  },\n  data: {\n    show: true,\n  },\n  created() {\n    this.resetAnimation = wx.createAnimation({\n      duration: 0,\n      timingFunction: 'linear',\n    });\n  },\n  destroyed() {\n    this.timer && clearTimeout(this.timer);\n  },\n  methods: {\n    init() {\n      Promise.all([\n        this.getRect('.van-notice-bar__content'),\n        this.getRect('.van-notice-bar__wrap'),\n      ]).then((rects) => {\n        const [contentRect, wrapRect] = rects;\n        if (\n          contentRect == null ||\n          wrapRect == null ||\n          !contentRect.width ||\n          !wrapRect.width\n        ) {\n          return;\n        }\n        const { speed, scrollable, delay } = this.data;\n        if (scrollable && wrapRect.width < contentRect.width) {\n          const duration = (contentRect.width / speed) * 1000;\n          this.wrapWidth = wrapRect.width;\n          this.contentWidth = contentRect.width;\n          this.duration = duration;\n          this.animation = wx.createAnimation({\n            duration,\n            timingFunction: 'linear',\n            delay,\n          });\n          this.scroll();\n        }\n      });\n    },\n    scroll() {\n      this.timer && clearTimeout(this.timer);\n      this.timer = null;\n      this.setData({\n        animationData: this.resetAnimation\n          .translateX(this.wrapWidth)\n          .step()\n          .export(),\n      });\n      setTimeout(() => {\n        this.setData({\n          animationData: this.animation\n            .translateX(-this.contentWidth)\n            .step()\n            .export(),\n        });\n      }, 20);\n      this.timer = setTimeout(() => {\n        this.scroll();\n      }, this.duration);\n    },\n    onClickIcon() {\n      this.timer && clearTimeout(this.timer);\n      this.timer = null;\n      this.setData({ show: false });\n    },\n    onClick(event) {\n      this.$emit('click', event);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/notice-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/notice-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ show }}\"\n  class=\"custom-class {{ utils.bem('notice-bar', { withicon: mode, wrapable }) }}\"\n  style=\"color: {{ color }}; background-color: {{ backgroundColor }};\"\n  bind:tap=\"onClick\"\n>\n  <van-icon\n    wx:if=\"{{ leftIcon }}\"\n    size=\"16px\"\n    name=\"{{ leftIcon }}\"\n    class=\"van-notice-bar__left-icon\"\n  />\n  <slot wx:else name=\"left-icon\" />\n\n  <view class=\"van-notice-bar__wrap\">\n    <view class=\"van-notice-bar__content {{ !scrollable && !wrapable ? 'van-ellipsis' : '' }}\" animation=\"{{ animationData }}\">\n      {{ text }}\n    </view>\n  </view>\n\n  <van-icon\n    wx:if=\"{{ mode === 'closeable' }}\"\n    class=\"van-notice-bar__right-icon\"\n    name=\"cross\"\n    catch:tap=\"onClickIcon\"\n  />\n  <navigator\n    wx:elif=\"{{ mode === 'link' }}\"\n    url=\"{{ url }}\"\n    open-type=\"{{ openType }}\"\n  >\n    <van-icon class=\"van-notice-bar__right-icon\" name=\"arrow\" />\n  </navigator>\n  <slot wx:else name=\"right-icon\" />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/notice-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-notice-bar{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;height:40px;height:var(--notice-bar-height,40px);padding:0 16px;padding:var(--notice-bar-padding,0 16px);font-size:14px;font-size:var(--notice-bar-font-size,14px);color:#ed6a0c;color:var(--notice-bar-text-color,#ed6a0c);line-height:24px;line-height:var(--notice-bar-line-height,24px);background-color:#fffbe8;background-color:var(--notice-bar-background-color,#fffbe8)}.van-notice-bar--withicon{position:relative;padding-right:40px}.van-notice-bar--wrapable{height:auto;padding:8px 16px;padding:var(--notice-bar-wrapable-padding,8px 16px)}.van-notice-bar--wrapable .van-notice-bar__wrap{height:auto}.van-notice-bar--wrapable .van-notice-bar__content{position:relative;white-space:normal}.van-notice-bar__left-icon{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;margin-right:4px;vertical-align:middle}.van-notice-bar__left-icon,.van-notice-bar__right-icon{font-size:16px;font-size:var(--notice-bar-icon-size,16px);min-width:22px;min-width:var(--notice-bar-icon-min-width,22px)}.van-notice-bar__right-icon{position:absolute;top:10px;right:15px}.van-notice-bar__wrap{position:relative;-webkit-flex:1;flex:1;overflow:hidden;height:24px;height:var(--notice-bar-line-height,24px)}.van-notice-bar__content{position:absolute;white-space:nowrap}.van-notice-bar__content.van-ellipsis{max-width:100%}"
  },
  {
    "path": "miniprogram/vant/notify/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/notify/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { WHITE } from '../common/color';\nVantComponent({\n  props: {\n    message: String,\n    background: String,\n    type: {\n      type: String,\n      value: 'danger',\n    },\n    color: {\n      type: String,\n      value: WHITE,\n    },\n    duration: {\n      type: Number,\n      value: 3000,\n    },\n    zIndex: {\n      type: Number,\n      value: 110,\n    },\n    safeAreaInsetTop: {\n      type: Boolean,\n      value: false,\n    },\n    top: null,\n  },\n  data: {\n    show: false,\n  },\n  created() {\n    const { statusBarHeight } = wx.getSystemInfoSync();\n    this.setData({ statusBarHeight });\n  },\n  methods: {\n    show() {\n      const { duration, onOpened } = this.data;\n      clearTimeout(this.timer);\n      this.setData({ show: true });\n      wx.nextTick(onOpened);\n      if (duration > 0 && duration !== Infinity) {\n        this.timer = setTimeout(() => {\n          this.hide();\n        }, duration);\n      }\n    },\n    hide() {\n      const { onClose } = this.data;\n      clearTimeout(this.timer);\n      this.setData({ show: false });\n      wx.nextTick(onClose);\n    },\n    onTap(event) {\n      const { onClick } = this.data;\n      if (onClick) {\n        onClick(event.detail);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/notify/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/notify/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-transition\n  name=\"slide-down\"\n  show=\"{{ show }}\"\n  custom-class=\"van-notify__container\"\n  custom-style=\"z-index: {{ zIndex }}; top: {{ utils.addUnit(top) }}\"\n  bind:tap=\"onTap\"\n>\n  <view\n    class=\"van-notify van-notify--{{ type }}\"\n    style=\"background:{{ background }};color:{{ color }};\"\n  >\n    <view\n      wx:if=\"{{ safeAreaInsetTop }}\"\n      style=\"height: {{ statusBarHeight }}px\"\n    />\n    <text>{{ message }}</text>\n  </view>\n</van-transition>\n"
  },
  {
    "path": "miniprogram/vant/notify/index.wxss",
    "content": "@import '../common/index.wxss';.van-notify{text-align:center;word-wrap:break-word;padding:6px 15px;padding:var(--notify-padding,6px 15px);font-size:14px;font-size:var(--notify-font-size,14px);line-height:20px;line-height:var(--notify-line-height,20px)}.van-notify__container{position:fixed;top:0;box-sizing:border-box;width:100%}.van-notify--primary{background-color:#1989fa;background-color:var(--notify-primary-background-color,#1989fa)}.van-notify--success{background-color:#07c160;background-color:var(--notify-success-background-color,#07c160)}.van-notify--danger{background-color:#ee0a24;background-color:var(--notify-danger-background-color,#ee0a24)}.van-notify--warning{background-color:#ff976a;background-color:var(--notify-warning-background-color,#ff976a)}"
  },
  {
    "path": "miniprogram/vant/notify/notify.d.ts",
    "content": "interface NotifyOptions {\n    type?: 'primary' | 'success' | 'danger' | 'warning';\n    color?: string;\n    zIndex?: number;\n    top?: number;\n    message: string;\n    context?: any;\n    duration?: number;\n    selector?: string;\n    background?: string;\n    safeAreaInsetTop?: boolean;\n    onClick?: () => void;\n    onOpened?: () => void;\n    onClose?: () => void;\n}\ndeclare function Notify(options: NotifyOptions | string): any;\ndeclare namespace Notify {\n    var clear: (options?: NotifyOptions) => void;\n}\nexport default Notify;\n"
  },
  {
    "path": "miniprogram/vant/notify/notify.js",
    "content": "import { WHITE } from '../common/color';\nconst defaultOptions = {\n  selector: '#van-notify',\n  type: 'danger',\n  message: '',\n  background: '',\n  duration: 3000,\n  zIndex: 110,\n  top: 0,\n  color: WHITE,\n  safeAreaInsetTop: false,\n  onClick: () => {},\n  onOpened: () => {},\n  onClose: () => {},\n};\nfunction parseOptions(message) {\n  return typeof message === 'string' ? { message } : message;\n}\nfunction getContext() {\n  const pages = getCurrentPages();\n  return pages[pages.length - 1];\n}\nexport default function Notify(options) {\n  options = Object.assign(\n    Object.assign({}, defaultOptions),\n    parseOptions(options)\n  );\n  const context = options.context || getContext();\n  const notify = context.selectComponent(options.selector);\n  delete options.context;\n  delete options.selector;\n  if (notify) {\n    notify.setData(options);\n    notify.show();\n    return notify;\n  }\n  console.warn('未找到 van-notify 节点，请确认 selector 及 context 是否正确');\n}\nNotify.clear = function (options) {\n  options = Object.assign(\n    Object.assign({}, defaultOptions),\n    parseOptions(options)\n  );\n  const context = options.context || getContext();\n  const notify = context.selectComponent(options.selector);\n  if (notify) {\n    notify.hide();\n  }\n};\n"
  },
  {
    "path": "miniprogram/vant/overlay/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/overlay/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    show: Boolean,\n    customStyle: String,\n    duration: {\n      type: null,\n      value: 300,\n    },\n    zIndex: {\n      type: Number,\n      value: 1,\n    },\n  },\n  methods: {\n    onClick() {\n      this.$emit('click');\n    },\n    // for prevent touchmove\n    noop() {},\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/overlay/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/overlay/index.wxml",
    "content": "<van-transition\n  show=\"{{ show }}\"\n  custom-class=\"van-overlay\"\n  custom-style=\"z-index: {{ zIndex }}; {{ customStyle }}\"\n  duration=\"{{ duration }}\"\n  bind:tap=\"onClick\"\n  catch:touchmove=\"noop\"\n>\n  <slot></slot>\n</van-transition>\n"
  },
  {
    "path": "miniprogram/vant/overlay/index.wxss",
    "content": "@import '../common/index.wxss';.van-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.7);background-color:var(--overlay-background-color,rgba(0,0,0,.7))}"
  },
  {
    "path": "miniprogram/vant/panel/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/panel/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: ['header-class', 'footer-class'],\n  props: {\n    desc: String,\n    title: String,\n    status: String,\n    useFooterSlot: Boolean,\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/panel/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-cell\": \"../cell/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/panel/index.wxml",
    "content": "<view class=\"van-panel van-hairline--top-bottom custom-class\">\n  <van-cell \n    wx:if=\"{{ title || desc || status }}\"\n    title=\"{{ title }}\"\n    label=\"{{ desc }}\"\n    value=\"{{ status }}\"\n    custom-class=\"header-class\"\n    value-class=\"van-panel__header-value\"\n  />\n  <slot wx:else name=\"header\" />\n\n  <view class=\"van-panel__content\">\n    <slot />\n  </view>\n\n  <view wx:if=\"{{ useFooterSlot }}\" class=\"van-panel__footer van-hairline--top footer-class\">\n    <slot name=\"footer\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/panel/index.wxss",
    "content": "@import '../common/index.wxss';.van-panel{background:#fff;background:var(--panel-background-color,#fff)}.van-panel__header-value{color:#ee0a24;color:var(--panel-header-value-color,#ee0a24)}.van-panel__footer{padding:8px 16px;padding:var(--panel-footer-padding,8px 16px)}"
  },
  {
    "path": "miniprogram/vant/picker/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/picker/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { pickerProps } from './shared';\nVantComponent({\n  classes: ['active-class', 'toolbar-class', 'column-class'],\n  props: Object.assign(Object.assign({}, pickerProps), {\n    valueKey: {\n      type: String,\n      value: 'text',\n    },\n    toolbarPosition: {\n      type: String,\n      value: 'top',\n    },\n    defaultIndex: {\n      type: Number,\n      value: 0,\n    },\n    columns: {\n      type: Array,\n      value: [],\n      observer(columns = []) {\n        this.simple = columns.length && !columns[0].values;\n        this.children = this.selectAllComponents('.van-picker__column');\n        if (Array.isArray(this.children) && this.children.length) {\n          this.setColumns().catch(() => {});\n        }\n      },\n    },\n  }),\n  beforeCreate() {\n    this.children = [];\n  },\n  methods: {\n    noop() {},\n    setColumns() {\n      const { data } = this;\n      const columns = this.simple ? [{ values: data.columns }] : data.columns;\n      const stack = columns.map((column, index) =>\n        this.setColumnValues(index, column.values)\n      );\n      return Promise.all(stack);\n    },\n    emit(event) {\n      const { type } = event.currentTarget.dataset;\n      if (this.simple) {\n        this.$emit(type, {\n          value: this.getColumnValue(0),\n          index: this.getColumnIndex(0),\n        });\n      } else {\n        this.$emit(type, {\n          value: this.getValues(),\n          index: this.getIndexes(),\n        });\n      }\n    },\n    onChange(event) {\n      if (this.simple) {\n        this.$emit('change', {\n          picker: this,\n          value: this.getColumnValue(0),\n          index: this.getColumnIndex(0),\n        });\n      } else {\n        this.$emit('change', {\n          picker: this,\n          value: this.getValues(),\n          index: event.currentTarget.dataset.index,\n        });\n      }\n    },\n    // get column instance by index\n    getColumn(index) {\n      return this.children[index];\n    },\n    // get column value by index\n    getColumnValue(index) {\n      const column = this.getColumn(index);\n      return column && column.getValue();\n    },\n    // set column value by index\n    setColumnValue(index, value) {\n      const column = this.getColumn(index);\n      if (column == null) {\n        return Promise.reject(new Error('setColumnValue: 对应列不存在'));\n      }\n      return column.setValue(value);\n    },\n    // get column option index by column index\n    getColumnIndex(columnIndex) {\n      return (this.getColumn(columnIndex) || {}).data.currentIndex;\n    },\n    // set column option index by column index\n    setColumnIndex(columnIndex, optionIndex) {\n      const column = this.getColumn(columnIndex);\n      if (column == null) {\n        return Promise.reject(new Error('setColumnIndex: 对应列不存在'));\n      }\n      return column.setIndex(optionIndex);\n    },\n    // get options of column by index\n    getColumnValues(index) {\n      return (this.children[index] || {}).data.options;\n    },\n    // set options of column by index\n    setColumnValues(index, options, needReset = true) {\n      const column = this.children[index];\n      if (column == null) {\n        return Promise.reject(new Error('setColumnValues: 对应列不存在'));\n      }\n      const isSame =\n        JSON.stringify(column.data.options) === JSON.stringify(options);\n      if (isSame) {\n        return Promise.resolve();\n      }\n      return column.set({ options }).then(() => {\n        if (needReset) {\n          column.setIndex(0);\n        }\n      });\n    },\n    // get values of all columns\n    getValues() {\n      return this.children.map((child) => child.getValue());\n    },\n    // set values of all columns\n    setValues(values) {\n      const stack = values.map((value, index) =>\n        this.setColumnValue(index, value)\n      );\n      return Promise.all(stack);\n    },\n    // get indexes of all columns\n    getIndexes() {\n      return this.children.map((child) => child.data.currentIndex);\n    },\n    // set indexes of all columns\n    setIndexes(indexes) {\n      const stack = indexes.map((optionIndex, columnIndex) =>\n        this.setColumnIndex(columnIndex, optionIndex)\n      );\n      return Promise.all(stack);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/picker/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"picker-column\": \"../picker-column/index\",\n    \"loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/picker/index.wxml",
    "content": "<import src=\"./toolbar.wxml\" />\n\n<view class=\"van-picker custom-class\">\n  <template is=\"toolbar\" wx:if=\"{{ toolbarPosition === 'top' }}\" data=\"{{ showToolbar, cancelButtonText, title, confirmButtonText }}\"></template>\n  <view wx:if=\"{{ loading }}\" class=\"van-picker__loading\">\n    <loading color=\"#1989fa\"/>\n  </view>\n  <view\n    class=\"van-picker__columns\"\n    style=\"height: {{ itemHeight * visibleItemCount }}px\"\n    catch:touchmove=\"noop\"\n  >\n    <picker-column\n      class=\"van-picker__column\"\n      wx:for=\"{{ isSimple(columns) ? [columns] : columns }}\"\n      wx:key=\"index\"\n      data-index=\"{{ index }}\"\n      custom-class=\"column-class\"\n      value-key=\"{{ valueKey }}\"\n      initial-options=\"{{ isSimple(columns) ? item : item.values }}\"\n      default-index=\"{{ item.defaultIndex || defaultIndex }}\"\n      item-height=\"{{ itemHeight }}\"\n      visible-item-count=\"{{ visibleItemCount }}\"\n      active-class=\"active-class\"\n      bind:change=\"onChange\"\n    />\n    <view class=\"van-picker__mask\" style=\"background-size: 100% {{ (itemHeight * visibleItemCount - itemHeight) / 2 }}px\" />\n    <view\n      class=\"van-picker__frame van-hairline--top-bottom\"\n      style=\"height: {{ itemHeight }}px\"\n    />\n  </view>\n  <template is=\"toolbar\" wx:if=\"{{ toolbarPosition === 'bottom' }}\" data=\"{{ showToolbar, cancelButtonText, title, confirmButtonText }}\"></template>\n</view>\n\n<wxs module=\"isSimple\">\n  function isSimple(columns) {\n    return columns.length && !columns[0].values;\n  }\n  module.exports = isSimple;\n</wxs>\n"
  },
  {
    "path": "miniprogram/vant/picker/index.wxss",
    "content": "@import '../common/index.wxss';.van-picker{position:relative;overflow:hidden;-webkit-text-size-adjust:100%;-webkit-user-select:none;user-select:none;background-color:#fff;background-color:var(--picker-background-color,#fff)}.van-picker__toolbar{display:-webkit-flex;display:flex;-webkit-justify-content:space-between;justify-content:space-between;height:44px;height:var(--picker-toolbar-height,44px);line-height:44px;line-height:var(--picker-toolbar-height,44px)}.van-picker__cancel,.van-picker__confirm{padding:0 16px;padding:var(--picker-action-padding,0 16px);font-size:14px;font-size:var(--picker-action-font-size,14px);color:#1989fa;color:var(--picker-action-text-color,#1989fa)}.van-picker__cancel--hover,.van-picker__confirm--hover{background-color:#f2f3f5;background-color:var(--picker-action-active-color,#f2f3f5)}.van-picker__title{max-width:50%;text-align:center;font-weight:500;font-weight:var(--font-weight-bold,500);font-size:16px;font-size:var(--picker-option-font-size,16px)}.van-picker__columns{position:relative;display:-webkit-flex;display:flex}.van-picker__column{-webkit-flex:1 1;flex:1 1;width:0}.van-picker__loading{position:absolute;top:0;right:0;bottom:0;left:0;z-index:4;display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;background-color:hsla(0,0%,100%,.9);background-color:var(--picker-loading-mask-color,hsla(0,0%,100%,.9))}.van-picker__mask{position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;background-image:linear-gradient(180deg,hsla(0,0%,100%,.9),hsla(0,0%,100%,.4)),linear-gradient(0deg,hsla(0,0%,100%,.9),hsla(0,0%,100%,.4));background-repeat:no-repeat;background-position:top,bottom;-webkit-backface-visibility:hidden;backface-visibility:hidden;pointer-events:none}.van-picker__frame,.van-picker__loading .van-loading{position:absolute;top:50%;left:0;z-index:1;width:100%;-webkit-transform:translateY(-50%);transform:translateY(-50%);pointer-events:none}"
  },
  {
    "path": "miniprogram/vant/picker/shared.d.ts",
    "content": "export declare const pickerProps: {\n    title: StringConstructor;\n    loading: BooleanConstructor;\n    showToolbar: BooleanConstructor;\n    cancelButtonText: {\n        type: StringConstructor;\n        value: string;\n    };\n    confirmButtonText: {\n        type: StringConstructor;\n        value: string;\n    };\n    visibleItemCount: {\n        type: NumberConstructor;\n        value: number;\n    };\n    itemHeight: {\n        type: NumberConstructor;\n        value: number;\n    };\n};\n"
  },
  {
    "path": "miniprogram/vant/picker/shared.js",
    "content": "export const pickerProps = {\n  title: String,\n  loading: Boolean,\n  showToolbar: Boolean,\n  cancelButtonText: {\n    type: String,\n    value: '取消',\n  },\n  confirmButtonText: {\n    type: String,\n    value: '确认',\n  },\n  visibleItemCount: {\n    type: Number,\n    value: 5,\n  },\n  itemHeight: {\n    type: Number,\n    value: 44,\n  },\n};\n"
  },
  {
    "path": "miniprogram/vant/picker/toolbar.wxml",
    "content": "<template name=\"toolbar\">\n  <view\n    wx:if=\"{{ showToolbar }}\"\n    class=\"van-picker__toolbar van-hairline--top-bottom toolbar-class\"\n  >\n    <view\n      class=\"van-picker__cancel\"\n      hover-class=\"van-picker__cancel--hover\"\n      hover-stay-time=\"70\"\n      data-type=\"cancel\"\n      bindtap=\"emit\"\n    >\n      {{ cancelButtonText }}\n    </view>\n    <view wx:if=\"{{ title }}\" class=\"van-picker__title van-ellipsis\">{{\n      title\n    }}</view>\n    <view\n      class=\"van-picker__confirm\"\n      hover-class=\"van-picker__confirm--hover\"\n      hover-stay-time=\"70\"\n      data-type=\"confirm\"\n      bindtap=\"emit\"\n    >\n      {{ confirmButtonText }}\n    </view>\n  </view>\n</template>\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isObj, range } from '../common/utils';\nconst DEFAULT_DURATION = 200;\nVantComponent({\n  classes: ['active-class'],\n  props: {\n    valueKey: String,\n    className: String,\n    itemHeight: Number,\n    visibleItemCount: Number,\n    initialOptions: {\n      type: Array,\n      value: [],\n    },\n    defaultIndex: {\n      type: Number,\n      value: 0,\n      observer(value) {\n        this.setIndex(value);\n      },\n    },\n  },\n  data: {\n    startY: 0,\n    offset: 0,\n    duration: 0,\n    startOffset: 0,\n    options: [],\n    currentIndex: 0,\n  },\n  created() {\n    const { defaultIndex, initialOptions } = this.data;\n    this.set({\n      currentIndex: defaultIndex,\n      options: initialOptions,\n    }).then(() => {\n      this.setIndex(defaultIndex);\n    });\n  },\n  methods: {\n    getCount() {\n      return this.data.options.length;\n    },\n    onTouchStart(event) {\n      this.setData({\n        startY: event.touches[0].clientY,\n        startOffset: this.data.offset,\n        duration: 0,\n      });\n    },\n    onTouchMove(event) {\n      const { data } = this;\n      const deltaY = event.touches[0].clientY - data.startY;\n      this.setData({\n        offset: range(\n          data.startOffset + deltaY,\n          -(this.getCount() * data.itemHeight),\n          data.itemHeight\n        ),\n      });\n    },\n    onTouchEnd() {\n      const { data } = this;\n      if (data.offset !== data.startOffset) {\n        this.setData({ duration: DEFAULT_DURATION });\n        const index = range(\n          Math.round(-data.offset / data.itemHeight),\n          0,\n          this.getCount() - 1\n        );\n        this.setIndex(index, true);\n      }\n    },\n    onClickItem(event) {\n      const { index } = event.currentTarget.dataset;\n      this.setIndex(index, true);\n    },\n    adjustIndex(index) {\n      const { data } = this;\n      const count = this.getCount();\n      index = range(index, 0, count);\n      for (let i = index; i < count; i++) {\n        if (!this.isDisabled(data.options[i])) return i;\n      }\n      for (let i = index - 1; i >= 0; i--) {\n        if (!this.isDisabled(data.options[i])) return i;\n      }\n    },\n    isDisabled(option) {\n      return isObj(option) && option.disabled;\n    },\n    getOptionText(option) {\n      const { data } = this;\n      return isObj(option) && data.valueKey in option\n        ? option[data.valueKey]\n        : option;\n    },\n    setIndex(index, userAction) {\n      const { data } = this;\n      index = this.adjustIndex(index) || 0;\n      const offset = -index * data.itemHeight;\n      if (index !== data.currentIndex) {\n        return this.set({ offset, currentIndex: index }).then(() => {\n          userAction && this.$emit('change', index);\n        });\n      }\n      return this.set({ offset });\n    },\n    setValue(value) {\n      const { options } = this.data;\n      for (let i = 0; i < options.length; i++) {\n        if (this.getOptionText(options[i]) === value) {\n          return this.setIndex(i);\n        }\n      }\n      return Promise.resolve();\n    },\n    getValue() {\n      const { data } = this;\n      return data.options[data.currentIndex];\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.wxml",
    "content": "<wxs src=\"./index.wxs\" module=\"getOptionText\" />\n\n<view\n  class=\"van-picker-column custom-class\"\n  style=\"height: {{ itemHeight * visibleItemCount }}px\"\n  bind:touchstart=\"onTouchStart\"\n  catch:touchmove=\"onTouchMove\"\n  bind:touchend=\"onTouchEnd\"\n  bind:touchcancel=\"onTouchEnd\"\n>\n  <view style=\"transition: transform {{ duration }}ms; line-height: {{ itemHeight }}px; transform: translate3d(0, {{ offset + (itemHeight * (visibleItemCount - 1)) / 2 }}px, 0)\">\n    <view\n      wx:for=\"{{ options }}\"\n      wx:for-item=\"option\"\n      wx:key=\"index\"\n      data-index=\"{{ index }}\"\n      style=\"height: {{ itemHeight }}px\"\n      class=\"van-ellipsis van-picker-column__item {{ option && option.disabled ? 'van-picker-column__item--disabled' : '' }} {{ index === currentIndex ? 'van-picker-column__item--selected active-class' : '' }}\"\n      bindtap=\"onClickItem\"\n    >{{ getOptionText(option, valueKey) }}</view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.wxs",
    "content": "function isObj(x) {\n  var type = typeof x;\n  return x !== null && (type === 'object' || type === 'function');\n}\n\nmodule.exports = function (option, valueKey) {\n  return isObj(option) && option[valueKey] != null ? option[valueKey] : option;\n}\n"
  },
  {
    "path": "miniprogram/vant/picker-column/index.wxss",
    "content": "@import '../common/index.wxss';.van-picker-column{overflow:hidden;text-align:center;color:#000;color:var(--picker-option-text-color,#000);font-size:16px;font-size:var(--picker-option-font-size,16px)}.van-picker-column__item{padding:0 5px}.van-picker-column__item--selected{font-weight:500;font-weight:var(--font-weight-bold,500);color:#323233;color:var(--picker-option-selected-text-color,#323233)}.van-picker-column__item--disabled{opacity:.3;opacity:var(--picker-option-disabled-opacity,.3)}"
  },
  {
    "path": "miniprogram/vant/popup/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/popup/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { transition } from '../mixins/transition';\nVantComponent({\n  classes: [\n    'enter-class',\n    'enter-active-class',\n    'enter-to-class',\n    'leave-class',\n    'leave-active-class',\n    'leave-to-class',\n    'close-icon-class',\n  ],\n  mixins: [transition(false)],\n  props: {\n    round: Boolean,\n    closeable: Boolean,\n    customStyle: String,\n    overlayStyle: String,\n    transition: {\n      type: String,\n      observer: 'observeClass',\n    },\n    zIndex: {\n      type: Number,\n      value: 100,\n    },\n    overlay: {\n      type: Boolean,\n      value: true,\n    },\n    closeIcon: {\n      type: String,\n      value: 'cross',\n    },\n    closeIconPosition: {\n      type: String,\n      value: 'top-right',\n    },\n    closeOnClickOverlay: {\n      type: Boolean,\n      value: true,\n    },\n    position: {\n      type: String,\n      value: 'center',\n      observer: 'observeClass',\n    },\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n    safeAreaInsetTop: {\n      type: Boolean,\n      value: false,\n    },\n  },\n  created() {\n    this.observeClass();\n  },\n  methods: {\n    onClickCloseIcon() {\n      this.$emit('close');\n    },\n    onClickOverlay() {\n      this.$emit('click-overlay');\n      if (this.data.closeOnClickOverlay) {\n        this.$emit('close');\n      }\n    },\n    observeClass() {\n      const { transition, position } = this.data;\n      const updateData = {\n        name: transition || position,\n      };\n      if (transition === 'none') {\n        updateData.duration = 0;\n      }\n      this.setData(updateData);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/popup/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-overlay\": \"../overlay/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/popup/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<van-overlay\n  wx:if=\"{{ overlay }}\"\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  custom-style=\"{{ overlayStyle }}\"\n  duration=\"{{ duration }}\"\n  bind:click=\"onClickOverlay\"\n/>\n<view\n  wx:if=\"{{ inited }}\"\n  class=\"custom-class {{ classes }} {{ utils.bem('popup', [position, { round, safe: safeAreaInsetBottom, safeTop: safeAreaInsetTop }]) }}\"\n  style=\"z-index: {{ zIndex }}; -webkit-transition-duration:{{ currentDuration }}ms; transition-duration:{{ currentDuration }}ms; {{ display ? '' : 'display: none;' }};{{ customStyle }}\"\n  bind:transitionend=\"onTransitionEnd\"\n>\n  <slot />\n  <van-icon\n    wx:if=\"{{ closeable }}\"\n    name=\"{{ closeIcon }}\"\n    class=\"close-icon-class van-popup__close-icon van-popup__close-icon--{{ closeIconPosition }}\"\n    bind:tap=\"onClickCloseIcon\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/popup/index.wxss",
    "content": "@import '../common/index.wxss';.van-popup{position:fixed;box-sizing:border-box;max-height:100%;overflow-y:auto;transition-timing-function:ease;-webkit-animation:ease both;animation:ease both;-webkit-overflow-scrolling:touch;background-color:#fff;background-color:var(--popup-background-color,#fff)}.van-popup--center{top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.van-popup--center.van-popup--round{border-radius:20px;border-radius:var(--popup-round-border-radius,20px)}.van-popup--top{top:0;left:0;width:100%}.van-popup--top.van-popup--round{border-radius:0 0 20px 20px;border-radius:0 0 var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px)}.van-popup--right{top:50%;right:0;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.van-popup--right.van-popup--round{border-radius:20px 0 0 20px;border-radius:var(--popup-round-border-radius,20px) 0 0 var(--popup-round-border-radius,20px)}.van-popup--bottom{bottom:0;left:0;width:100%}.van-popup--bottom.van-popup--round{border-radius:20px 20px 0 0;border-radius:var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px) 0 0}.van-popup--left{top:50%;left:0;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.van-popup--left.van-popup--round{border-radius:0 20px 20px 0;border-radius:0 var(--popup-round-border-radius,20px) var(--popup-round-border-radius,20px) 0}.van-popup--bottom.van-popup--safe{padding-bottom:env(safe-area-inset-bottom)}.van-popup--safeTop{padding-top:env(safe-area-inset-top)}.van-popup__close-icon{position:absolute;z-index:1;z-index:var(--popup-close-icon-z-index,1);color:#969799;color:var(--popup-close-icon-color,#969799);font-size:18px;font-size:var(--popup-close-icon-size,18px)}.van-popup__close-icon--top-left{top:16px;top:var(--popup-close-icon-margin,16px);left:16px;left:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--top-right{top:16px;top:var(--popup-close-icon-margin,16px);right:16px;right:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-left{bottom:16px;bottom:var(--popup-close-icon-margin,16px);left:16px;left:var(--popup-close-icon-margin,16px)}.van-popup__close-icon--bottom-right{right:16px;right:var(--popup-close-icon-margin,16px);bottom:16px;bottom:var(--popup-close-icon-margin,16px)}.van-popup__close-icon:active{opacity:.6}.van-scale-enter-active,.van-scale-leave-active{transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.van-scale-enter,.van-scale-leave-to{-webkit-transform:translate3d(-50%,-50%,0) scale(.7);transform:translate3d(-50%,-50%,0) scale(.7);opacity:0}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-center-enter-active,.van-center-leave-active{transition-property:opacity}.van-center-enter,.van-center-leave-to{opacity:0}.van-bottom-enter-active,.van-bottom-leave-active,.van-left-enter-active,.van-left-leave-active,.van-right-enter-active,.van-right-leave-active,.van-top-enter-active,.van-top-leave-active{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}.van-bottom-enter,.van-bottom-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.van-top-enter,.van-top-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.van-left-enter,.van-left-leave-to{-webkit-transform:translate3d(-100%,-50%,0);transform:translate3d(-100%,-50%,0)}.van-right-enter,.van-right-leave-to{-webkit-transform:translate3d(100%,-50%,0);transform:translate3d(100%,-50%,0)}"
  },
  {
    "path": "miniprogram/vant/progress/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/progress/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { BLUE } from '../common/color';\nVantComponent({\n  props: {\n    inactive: Boolean,\n    percentage: Number,\n    pivotText: String,\n    pivotColor: String,\n    trackColor: String,\n    showPivot: {\n      type: Boolean,\n      value: true,\n    },\n    color: {\n      type: String,\n      value: BLUE,\n    },\n    textColor: {\n      type: String,\n      value: '#fff',\n    },\n    strokeWidth: {\n      type: null,\n      value: 4,\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/progress/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/progress/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"getters\" />\n\n<view\n  class=\"van-progress custom-class\"\n  style=\"height: {{ utils.addUnit(strokeWidth) }}; {{ trackColor ? 'background: ' + trackColor : '' }}\"\n>\n  <view\n    class=\"van-progress__portion\"\n    style=\"width: {{ percentage }}%; background: {{ inactive ? '#cacaca' : color }}\"\n  >\n    <view\n      wx:if=\"{{ showPivot && getters.text(pivotText, percentage) }}\"\n      style=\"color: {{ textColor }}; background: {{ pivotColor ? pivotColor : inactive ? '#cacaca' : color }}\"\n      class=\"van-progress__pivot\"\n    >\n      {{ getters.text(pivotText, percentage) }}\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/progress/index.wxs",
    "content": "module.exports = {\n  text: function(pivotText, percentage) {\n    return pivotText || percentage + '%';\n  }\n};\n"
  },
  {
    "path": "miniprogram/vant/progress/index.wxss",
    "content": "@import '../common/index.wxss';.van-progress{position:relative;height:4px;height:var(--progress-height,4px);border-radius:4px;border-radius:var(--progress-height,4px);background:#ebedf0;background:var(--progress-background-color,#ebedf0)}.van-progress__portion{position:absolute;left:0;height:100%;border-radius:inherit;background:#1989fa;background:var(--progress-color,#1989fa)}.van-progress__pivot{position:absolute;top:50%;right:0;box-sizing:border-box;min-width:2em;text-align:center;word-break:keep-all;border-radius:1em;-webkit-transform:translateY(-50%);transform:translateY(-50%);color:#fff;color:var(--progress-pivot-text-color,#fff);padding:0 5px;padding:var(--progress-pivot-padding,0 5px);font-size:10px;font-size:var(--progress-pivot-font-size,10px);line-height:1.6;line-height:var(--progress-pivot-line-height,1.6);background-color:#1989fa;background-color:var(--progress-pivot-background-color,#1989fa)}"
  },
  {
    "path": "miniprogram/vant/radio/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/radio/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  field: true,\n  relation: {\n    name: 'radio-group',\n    type: 'ancestor',\n    current: 'radio',\n  },\n  classes: ['icon-class', 'label-class'],\n  props: {\n    name: null,\n    value: null,\n    disabled: Boolean,\n    useIconSlot: Boolean,\n    checkedColor: String,\n    labelPosition: {\n      type: String,\n      value: 'right',\n    },\n    labelDisabled: Boolean,\n    shape: {\n      type: String,\n      value: 'round',\n    },\n    iconSize: {\n      type: null,\n      value: 20,\n    },\n  },\n  methods: {\n    emitChange(value) {\n      const instance = this.parent || this;\n      instance.$emit('input', value);\n      instance.$emit('change', value);\n    },\n    onChange() {\n      if (!this.data.disabled) {\n        this.emitChange(this.data.name);\n      }\n    },\n    onClickLabel() {\n      const { disabled, labelDisabled, name } = this.data;\n      if (!disabled && !labelDisabled) {\n        this.emitChange(name);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/radio/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/radio/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-radio custom-class\">\n  <view\n    wx:if=\"{{ labelPosition === 'left' }}\"\n    class=\"label-class {{ utils.bem('radio__label', [labelPosition, { disabled }]) }}\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n  <view class=\"van-radio__icon-wrap\" style=\"font-size: {{ utils.addUnit(iconSize) }};\" bindtap=\"onChange\">\n    <slot wx:if=\"{{ useIconSlot }}\" name=\"icon\" />\n    <van-icon\n      wx:else\n      name=\"success\"\n      class=\"{{ utils.bem('radio__icon', [shape, { disabled, checked: value === name }]) }}\"\n      style=\"font-size: {{ utils.addUnit(iconSize) }};{{ checkedColor && !disabled && value === name ? 'border-color:' + checkedColor + '; background-color:' + checkedColor + ';' : '' }}\"\n      custom-class=\"icon-class\"\n      custom-style=\"line-height: {{ utils.addUnit(iconSize) }};font-size: .8em;display: block;\"\n    />\n  </view>\n  <view\n    wx:if=\"{{ labelPosition === 'right' }}\"\n    class=\"label-class {{ utils.bem('radio__label', [labelPosition, { disabled }]) }}\"\n    bindtap=\"onClickLabel\"\n  >\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/radio/index.wxss",
    "content": "@import '../common/index.wxss';.van-radio{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;overflow:hidden;-webkit-user-select:none;user-select:none}.van-radio__icon-wrap{-webkit-flex:none;flex:none}.van-radio__icon{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;width:1em;height:1em;color:transparent;text-align:center;transition-property:color,border-color,background-color;border:1px solid #c8c9cc;border:1px solid var(--radio-border-color,#c8c9cc);font-size:20px;font-size:var(--radio-size,20px);transition-duration:.2s;transition-duration:var(--radio-transition-duration,.2s)}.van-radio__icon--round{border-radius:100%}.van-radio__icon--checked{color:#fff;color:var(--white,#fff);background-color:#1989fa;background-color:var(--radio-checked-icon-color,#1989fa);border-color:#1989fa;border-color:var(--radio-checked-icon-color,#1989fa)}.van-radio__icon--disabled{background-color:#ebedf0;background-color:var(--radio-disabled-background-color,#ebedf0);border-color:#c8c9cc;border-color:var(--radio-disabled-icon-color,#c8c9cc)}.van-radio__icon--disabled.van-radio__icon--checked{color:#c8c9cc;color:var(--radio-disabled-icon-color,#c8c9cc)}.van-radio__label{word-wrap:break-word;margin-left:10px;margin-left:var(--radio-label-margin,10px);color:#323233;color:var(--radio-label-color,#323233);line-height:20px;line-height:var(--radio-size,20px)}.van-radio__label--left{float:left;margin:0 10px 0 0;margin:0 var(--radio-label-margin,10px) 0 0}.van-radio__label--disabled{color:#c8c9cc;color:var(--radio-disabled-label-color,#c8c9cc)}.van-radio__label:empty{margin:0}"
  },
  {
    "path": "miniprogram/vant/radio-group/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/radio-group/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  field: true,\n  relation: {\n    name: 'radio',\n    type: 'descendant',\n    current: 'radio-group',\n    linked(target) {\n      this.updateChild(target);\n    },\n  },\n  props: {\n    value: {\n      type: null,\n      observer: 'updateChildren',\n    },\n    disabled: {\n      type: Boolean,\n      observer: 'updateChildren',\n    },\n  },\n  methods: {\n    updateChildren() {\n      (this.children || []).forEach((child) => this.updateChild(child));\n    },\n    updateChild(child) {\n      const { value, disabled } = this.data;\n      child.setData({\n        value,\n        disabled: disabled || child.data.disabled,\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/radio-group/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/radio-group/index.wxml",
    "content": "<slot />\n"
  },
  {
    "path": "miniprogram/vant/radio-group/index.wxss",
    "content": "@import '../common/index.wxss';"
  },
  {
    "path": "miniprogram/vant/rate/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/rate/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { canIUseModel } from '../common/version';\nVantComponent({\n  field: true,\n  classes: ['icon-class'],\n  props: {\n    value: {\n      type: Number,\n      observer(value) {\n        if (value !== this.data.innerValue) {\n          this.setData({ innerValue: value });\n        }\n      },\n    },\n    readonly: Boolean,\n    disabled: Boolean,\n    allowHalf: Boolean,\n    size: null,\n    icon: {\n      type: String,\n      value: 'star',\n    },\n    voidIcon: {\n      type: String,\n      value: 'star-o',\n    },\n    color: {\n      type: String,\n      value: '#ffd21e',\n    },\n    voidColor: {\n      type: String,\n      value: '#c7c7c7',\n    },\n    disabledColor: {\n      type: String,\n      value: '#bdbdbd',\n    },\n    count: {\n      type: Number,\n      value: 5,\n      observer(value) {\n        this.setData({ innerCountArray: Array.from({ length: value }) });\n      },\n    },\n    gutter: null,\n    touchable: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    innerValue: 0,\n    innerCountArray: Array.from({ length: 5 }),\n  },\n  methods: {\n    onSelect(event) {\n      const { data } = this;\n      const { score } = event.currentTarget.dataset;\n      if (!data.disabled && !data.readonly) {\n        this.setData({ innerValue: score + 1 });\n        if (canIUseModel()) {\n          this.setData({ value: score + 1 });\n        }\n        wx.nextTick(() => {\n          this.$emit('input', score + 1);\n          this.$emit('change', score + 1);\n        });\n      }\n    },\n    onTouchMove(event) {\n      const { touchable } = this.data;\n      if (!touchable) return;\n      const { clientX } = event.touches[0];\n      this.getRect('.van-rate__icon', true).then((list) => {\n        const target = list\n          .sort((item) => item.right - item.left)\n          .find((item) => clientX >= item.left && clientX <= item.right);\n        if (target != null) {\n          this.onSelect(\n            Object.assign(Object.assign({}, event), { currentTarget: target })\n          );\n        }\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/rate/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/rate/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"van-rate custom-class\"\n  bind:touchmove=\"onTouchMove\"\n>\n  <view\n    class=\"van-rate__item\"\n    wx:for=\"{{ innerCountArray }}\"\n    wx:key=\"index\"\n    style=\"padding-right: {{ index !== count - 1 ? utils.addUnit(gutter) : '' }}\"\n  >\n    <van-icon\n      name=\"{{ index + 1 <= innerValue ? icon : voidIcon }}\"\n      class=\"van-rate__icon\"\n      style=\"font-size: {{ utils.addUnit(size) }}\"\n      custom-class=\"icon-class\"\n      data-score=\"{{ index }}\"\n      color=\"{{ disabled ? disabledColor : index + 1 <= innerValue ? color : voidColor }}\"\n      bind:click=\"onSelect\"\n    />\n\n    <van-icon\n      wx:if=\"{{ allowHalf }}\"\n      name=\"{{ index + 0.5 <= innerValue ? icon : voidIcon }}\"\n      class=\"{{ utils.bem('rate__icon', ['half']) }}\"\n      style=\"font-size: {{ utils.addUnit(size) }}\"\n      custom-class=\"icon-class\"\n      data-score=\"{{ index - 0.5 }}\"\n      color=\"{{ disabled ? disabledColor : index + 0.5 <= innerValue ? color : voidColor }}\"\n      bind:click=\"onSelect\"\n    />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/rate/index.wxss",
    "content": "@import '../common/index.wxss';.van-rate{display:-webkit-inline-flex;display:inline-flex;-webkit-user-select:none;user-select:none}.van-rate__item{position:relative;padding:0 2px;padding:0 var(--rate-horizontal-padding,2px)}.van-rate__icon{display:block;height:1em;font-size:20px;font-size:var(--rate-icon-size,20px)}.van-rate__icon--half{position:absolute;top:0;width:.5em;overflow:hidden;left:2px;left:var(--rate-horizontal-padding,2px)}"
  },
  {
    "path": "miniprogram/vant/row/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/row/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'col',\n    type: 'descendant',\n    current: 'row',\n    linked(target) {\n      if (this.data.gutter) {\n        target.setGutter(this.data.gutter);\n      }\n    },\n  },\n  props: {\n    gutter: {\n      type: Number,\n      observer: 'setGutter',\n    },\n  },\n  data: {\n    viewStyle: '',\n  },\n  mounted() {\n    if (this.data.gutter) {\n      this.setGutter();\n    }\n  },\n  methods: {\n    setGutter() {\n      const { gutter } = this.data;\n      const margin = `-${Number(gutter) / 2}px`;\n      const viewStyle = gutter\n        ? `margin-right: ${margin}; margin-left: ${margin};`\n        : '';\n      this.setData({ viewStyle });\n      this.getRelationNodes('../col/index').forEach((col) => {\n        col.setGutter(this.data.gutter);\n      });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/row/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/row/index.wxml",
    "content": "<view class=\"custom-class van-row\" style=\"{{ viewStyle }}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/row/index.wxss",
    "content": "@import '../common/index.wxss';.van-row:after{display:table;clear:both;content:\"\"}"
  },
  {
    "path": "miniprogram/vant/search/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/search/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { canIUseModel } from '../common/version';\nVantComponent({\n  field: true,\n  classes: ['field-class', 'input-class', 'cancel-class'],\n  props: {\n    label: String,\n    focus: Boolean,\n    error: Boolean,\n    disabled: Boolean,\n    readonly: Boolean,\n    inputAlign: String,\n    showAction: Boolean,\n    useActionSlot: Boolean,\n    useLeftIconSlot: Boolean,\n    useRightIconSlot: Boolean,\n    leftIcon: {\n      type: String,\n      value: 'search',\n    },\n    rightIcon: String,\n    placeholder: String,\n    placeholderStyle: String,\n    actionText: {\n      type: String,\n      value: '取消',\n    },\n    background: {\n      type: String,\n      value: '#ffffff',\n    },\n    maxlength: {\n      type: Number,\n      value: -1,\n    },\n    shape: {\n      type: String,\n      value: 'square',\n    },\n    clearable: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    onChange(event) {\n      if (canIUseModel()) {\n        this.setData({ value: event.detail });\n      }\n      this.$emit('change', event.detail);\n    },\n    onCancel() {\n      /**\n       * 修复修改输入框值时，输入框失焦和赋值同时触发，赋值失效\n       * https://github.com/youzan/@vant/weapp/issues/1768\n       */\n      setTimeout(() => {\n        if (canIUseModel()) {\n          this.setData({ value: '' });\n        }\n        this.$emit('cancel');\n        this.$emit('change', '');\n      }, 200);\n    },\n    onSearch(event) {\n      this.$emit('search', event.detail);\n    },\n    onFocus(event) {\n      this.$emit('focus', event.detail);\n    },\n    onBlur(event) {\n      this.$emit('blur', event.detail);\n    },\n    onClear(event) {\n      this.$emit('clear', event.detail);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/search/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-field\": \"../field/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/search/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('search', { withaction: showAction || useActionSlot }) }} custom-class\"\n  style=\"background: {{ background }}\"\n>\n  <view class=\"{{ utils.bem('search__content', [shape]) }}\">\n    <view class=\"van-search__label\" wx:if=\"{{ label }}\">{{ label }}</view>\n    <slot wx:else name=\"label\" />\n\n    <van-field\n      type=\"search\"\n      left-icon=\"{{ !useLeftIconSlot ? leftIcon : '' }}\"\n      right-icon=\"{{ !useRightIconSlot ? rightIcon : '' }}\"\n      focus=\"{{ focus }}\"\n      error=\"{{ error }}\"\n      border=\"{{ false }}\"\n      confirm-type=\"search\"\n      class=\"van-search__field field-class\"\n      value=\"{{ value }}\"\n      disabled=\"{{ disabled }}\"\n      readonly=\"{{ readonly }}\"\n      clearable=\"{{ clearable }}\"\n      maxlength=\"{{ maxlength }}\"\n      input-align=\"{{ inputAlign }}\"\n      input-class=\"input-class\"\n      placeholder=\"{{ placeholder }}\"\n      placeholder-style=\"{{ placeholderStyle }}\"\n      custom-style=\"padding: 5px 10px 5px 0; background-color: transparent;\"\n      bind:blur=\"onBlur\"\n      bind:focus=\"onFocus\"\n      bind:change=\"onChange\"\n      bind:confirm=\"onSearch\"\n      bind:clear=\"onClear\"\n    >\n      <slot wx:if=\"{{ useLeftIconSlot }}\" name=\"left-icon\" slot=\"left-icon\" />\n      <slot wx:if=\"{{ useRightIconSlot }}\" name=\"right-icon\" slot=\"right-icon\" />\n    </van-field>\n  </view>\n\n  <view\n    wx:if=\"{{ showAction || useActionSlot }}\"\n    class=\"van-search__action\"\n    hover-class=\"van-search__action--hover\"\n    hover-stay-time=\"70\"\n  >\n    <slot wx:if=\"{{ useActionSlot }}\" name=\"action\" />\n    <view wx:else bind:tap=\"onCancel\" class=\"cancel-class\">{{ actionText }}</view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/search/index.wxss",
    "content": "@import '../common/index.wxss';.van-search{-webkit-align-items:center;align-items:center;box-sizing:border-box;padding:10px 12px;padding:var(--search-padding,10px 12px)}.van-search,.van-search__content{display:-webkit-flex;display:flex}.van-search__content{-webkit-flex:1;flex:1;padding-left:8px;padding-left:var(--padding-xs,8px);border-radius:2px;border-radius:var(--border-radius-sm,2px);background-color:#f7f8fa;background-color:var(--search-background-color,#f7f8fa)}.van-search__content--round{border-radius:17px;border-radius:calc(var(--search-input-height, 34px)/2)}.van-search__label{padding:0 5px;padding:var(--search-label-padding,0 5px);font-size:14px;font-size:var(--search-label-font-size,14px);line-height:34px;line-height:var(--search-input-height,34px);color:#323233;color:var(--search-label-color,#323233)}.van-search__field{-webkit-flex:1;flex:1}.van-search__field__left-icon{color:#969799;color:var(--search-left-icon-color,#969799)}.van-search--withaction{padding-right:0}.van-search__action{padding:0 8px;padding:var(--search-action-padding,0 8px);font-size:14px;font-size:var(--search-action-font-size,14px);line-height:34px;line-height:var(--search-input-height,34px);color:#323233;color:var(--search-action-text-color,#323233)}.van-search__action--hover{background-color:#f2f3f5;background-color:var(--active-color,#f2f3f5)}"
  },
  {
    "path": "miniprogram/vant/sidebar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/sidebar/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'sidebar-item',\n    type: 'descendant',\n    current: 'sidebar',\n    linked() {\n      this.setActive(this.data.activeKey);\n    },\n    unlinked() {\n      this.setActive(this.data.activeKey);\n    },\n  },\n  props: {\n    activeKey: {\n      type: Number,\n      value: 0,\n      observer: 'setActive',\n    },\n  },\n  beforeCreate() {\n    this.currentActive = -1;\n  },\n  methods: {\n    setActive(activeKey) {\n      const { children, currentActive } = this;\n      if (!children.length) {\n        return Promise.resolve();\n      }\n      this.currentActive = activeKey;\n      const stack = [];\n      if (currentActive !== activeKey && children[currentActive]) {\n        stack.push(children[currentActive].setActive(false));\n      }\n      if (children[activeKey]) {\n        stack.push(children[activeKey].setActive(true));\n      }\n      return Promise.all(stack);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/sidebar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/sidebar/index.wxml",
    "content": "<view class=\"van-sidebar custom-class\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/sidebar/index.wxss",
    "content": "@import '../common/index.wxss';.van-sidebar{width:85px;width:var(--sidebar-width,85px)}"
  },
  {
    "path": "miniprogram/vant/sidebar-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/sidebar-item/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: ['active-class', 'disabled-class'],\n  relation: {\n    type: 'ancestor',\n    name: 'sidebar',\n    current: 'sidebar-item',\n  },\n  props: {\n    dot: Boolean,\n    info: null,\n    title: String,\n    disabled: Boolean,\n  },\n  methods: {\n    onClick() {\n      const { parent } = this;\n      if (!parent || this.data.disabled) {\n        return;\n      }\n      const index = parent.children.indexOf(this);\n      parent.setActive(index).then(() => {\n        this.$emit('click', index);\n        parent.$emit('change', index);\n      });\n    },\n    setActive(selected) {\n      return this.setData({ selected });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/sidebar-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/sidebar-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('sidebar-item', { selected, disabled }) }} {{ selected ? 'active-class' : '' }} {{ disabled ? 'disabled-class' : '' }} custom-class\"\n  hover-class=\"van-sidebar-item--hover\"\n  hover-stay-time=\"70\"\n  bind:tap=\"onClick\"\n>\n  <view class=\"van-sidebar-item__text\">\n    <van-info\n      wx:if=\"{{ info !== null || dot }}\"\n      dot=\"{{ dot }}\"\n      info=\"{{ info }}\"\n      custom-style=\"right: 4px\"\n    />\n    <view wx:if=\"{{ title }}\">{{ title }}</view>\n    <slot wx:else name=\"title\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/sidebar-item/index.wxss",
    "content": "@import '../common/index.wxss';.van-sidebar-item{display:block;box-sizing:border-box;overflow:hidden;word-wrap:break-word;border-left:3px solid transparent;-webkit-user-select:none;user-select:none;padding:20px 12px 20px 8px;padding:var(--sidebar-padding,20px 12px 20px 8px);font-size:14px;font-size:var(--sidebar-font-size,14px);line-height:20px;line-height:var(--sidebar-line-height,20px);color:#323233;color:var(--sidebar-text-color,#323233);background-color:#f7f8fa;background-color:var(--sidebar-background-color,#f7f8fa)}.van-sidebar-item__text{position:relative;display:inline-block}.van-sidebar-item--hover:not(.van-sidebar-item--disabled){background-color:#f2f3f5;background-color:var(--sidebar-active-color,#f2f3f5)}.van-sidebar-item:after{border-bottom-width:1px}.van-sidebar-item--selected{color:#323233;color:var(--sidebar-selected-text-color,#323233);font-weight:500;font-weight:var(--sidebar-selected-font-weight,500);border-color:#ee0a24;border-color:var(--sidebar-selected-border-color,#ee0a24)}.van-sidebar-item--selected:after{border-right-width:1px}.van-sidebar-item--selected,.van-sidebar-item--selected.van-sidebar-item--hover{background-color:#fff;background-color:var(--sidebar-selected-background-color,#fff)}.van-sidebar-item--disabled{color:#c8c9cc;color:var(--sidebar-disabled-text-color,#c8c9cc)}"
  },
  {
    "path": "miniprogram/vant/skeleton/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/skeleton/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: ['avatar-class', 'title-class', 'row-class'],\n  props: {\n    row: {\n      type: Number,\n      value: 0,\n      observer(value) {\n        this.setData({ rowArray: Array.from({ length: value }) });\n      },\n    },\n    title: Boolean,\n    avatar: Boolean,\n    loading: {\n      type: Boolean,\n      value: true,\n    },\n    animate: {\n      type: Boolean,\n      value: true,\n    },\n    avatarSize: {\n      type: String,\n      value: '32px',\n    },\n    avatarShape: {\n      type: String,\n      value: 'round',\n    },\n    titleWidth: {\n      type: String,\n      value: '40%',\n    },\n    rowWidth: {\n      type: null,\n      value: '100%',\n      observer(val) {\n        this.setData({ isArray: val instanceof Array });\n      },\n    },\n  },\n  data: {\n    isArray: false,\n    rowArray: [],\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/skeleton/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {}\n}\n"
  },
  {
    "path": "miniprogram/vant/skeleton/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  wx:if=\"{{ loading }}\"\n  class=\"custom-class {{ utils.bem('skeleton', [{animate}]) }}\"\n>\n  <view\n    wx:if=\"{{ avatar }}\"\n    class=\"avatar-class {{ utils.bem('skeleton__avatar', [avatarShape])}}\"\n    style=\"{{ 'width:' + avatarSize + ';height:' + avatarSize }}\"\n  />\n  <view class=\"{{ utils.bem('skeleton__content')}}\">\n    <view\n      wx:if=\"{{ title }}\"\n      class=\"title-class {{ utils.bem('skeleton__title') }}\"\n      style=\"{{ 'width:' + titleWidth }}\"\n    />\n    <view\n      wx:for=\"{{ rowArray }}\"\n      wx:key=\"index\"\n      wx:for-index=\"index\"\n      class=\"row-class {{ utils.bem('skeleton__row') }}\"\n      style=\"{{ 'width:' + (isArray ? rowWidth[index] : rowWidth) }}\"\n    />\n  </view>\n</view>\n<view wx:else class=\"{{ utils.bem('skeleton__content')}}\">\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/skeleton/index.wxss",
    "content": "@import '../common/index.wxss';.van-skeleton{display:-webkit-flex;display:flex;box-sizing:border-box;width:100%;padding:0 16px;padding:var(--skeleton-padding,0 16px)}.van-skeleton__avatar{-webkit-flex-shrink:0;flex-shrink:0;margin-right:16px;margin-right:var(--padding-md,16px);background-color:#f2f3f5;background-color:var(--skeleton-avatar-background-color,#f2f3f5)}.van-skeleton__avatar--round{border-radius:100%}.van-skeleton__content{-webkit-flex:1;flex:1}.van-skeleton__avatar+.van-skeleton__content{padding-top:8px;padding-top:var(--padding-xs,8px)}.van-skeleton__row,.van-skeleton__title{height:16px;height:var(--skeleton-row-height,16px);background-color:#f2f3f5;background-color:var(--skeleton-row-background-color,#f2f3f5)}.van-skeleton__title{margin:0}.van-skeleton__row:not(:first-child){margin-top:12px;margin-top:var(--skeleton-row-margin-top,12px)}.van-skeleton__title+.van-skeleton__row{margin-top:20px}.van-skeleton--animate{-webkit-animation:van-skeleton-blink 1.2s ease-in-out infinite;animation:van-skeleton-blink 1.2s ease-in-out infinite}@-webkit-keyframes van-skeleton-blink{50%{opacity:.6}}@keyframes van-skeleton-blink{50%{opacity:.6}}"
  },
  {
    "path": "miniprogram/vant/slider/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/slider/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { touch } from '../mixins/touch';\nimport { canIUseModel } from '../common/version';\nVantComponent({\n  mixins: [touch],\n  props: {\n    disabled: Boolean,\n    useButtonSlot: Boolean,\n    activeColor: String,\n    inactiveColor: String,\n    max: {\n      type: Number,\n      value: 100,\n    },\n    min: {\n      type: Number,\n      value: 0,\n    },\n    step: {\n      type: Number,\n      value: 1,\n    },\n    value: {\n      type: Number,\n      value: 0,\n      observer: 'updateValue',\n    },\n    barHeight: {\n      type: null,\n      value: '2px',\n    },\n  },\n  created() {\n    this.updateValue(this.data.value);\n  },\n  methods: {\n    onTouchStart(event) {\n      if (this.data.disabled) return;\n      this.touchStart(event);\n      this.startValue = this.format(this.data.value);\n      this.dragStatus = 'start';\n    },\n    onTouchMove(event) {\n      if (this.data.disabled) return;\n      if (this.dragStatus === 'start') {\n        this.$emit('drag-start');\n      }\n      this.touchMove(event);\n      this.dragStatus = 'draging';\n      this.getRect('.van-slider').then((rect) => {\n        const diff = (this.deltaX / rect.width) * 100;\n        this.newValue = this.startValue + diff;\n        this.updateValue(this.newValue, false, true);\n      });\n    },\n    onTouchEnd() {\n      if (this.data.disabled) return;\n      if (this.dragStatus === 'draging') {\n        this.updateValue(this.newValue, true);\n        this.$emit('drag-end');\n      }\n    },\n    onClick(event) {\n      if (this.data.disabled) return;\n      const { min } = this.data;\n      this.getRect('.van-slider').then((rect) => {\n        const value =\n          ((event.detail.x - rect.left) / rect.width) * this.getRange() + min;\n        this.updateValue(value, true);\n      });\n    },\n    updateValue(value, end, drag) {\n      value = this.format(value);\n      const { min } = this.data;\n      const width = `${((value - min) * 100) / this.getRange()}%`;\n      this.setData({\n        value,\n        barStyle: `\n          width: ${width};\n          ${drag ? 'transition: none;' : ''}\n        `,\n      });\n      if (drag) {\n        this.$emit('drag', { value });\n      }\n      if (end) {\n        this.$emit('change', value);\n      }\n      if ((drag || end) && canIUseModel()) {\n        this.setData({ value });\n      }\n    },\n    getRange() {\n      const { max, min } = this.data;\n      return max - min;\n    },\n    format(value) {\n      const { max, min, step } = this.data;\n      return Math.round(Math.max(min, Math.min(value, max)) / step) * step;\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/slider/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/slider/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view\n  class=\"custom-class {{ utils.bem('slider', { disabled }) }}\"\n  style=\"{{ inactiveColor ? 'background:' + inactiveColor : '' }}\"\n  bind:tap=\"onClick\"\n>\n  <view\n    class=\"van-slider__bar\"\n    style=\"{{ barStyle }};{{ computed.barStyle(barHeight, activeColor) }}\"\n  >\n    <view\n      class=\"van-slider__button-wrapper\"\n      bind:touchstart=\"onTouchStart\"\n      catch:touchmove=\"onTouchMove\"\n      bind:touchend=\"onTouchEnd\"\n      bind:touchcancel=\"onTouchEnd\"\n    >\n      <slot\n        wx:if=\"{{ useButtonSlot }}\"\n        name=\"button\"\n      />\n      <view\n        wx:else\n        class=\"van-slider__button\"\n      />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/slider/index.wxs",
    "content": "/* eslint-disable */\nvar utils = require('../wxs/utils.wxs');\n\nfunction barStyle(barHeight, activeColor) {\n  var styles = [['height', utils.addUnit(barHeight)]];\n\n  if (activeColor) {\n    styles.push(['background', activeColor]);\n  }\n\n  return styles\n    .map(function (item) {\n      return item.join(':');\n    })\n    .join(';');\n}\n\nmodule.exports = {\n  barStyle: barStyle,\n};\n"
  },
  {
    "path": "miniprogram/vant/slider/index.wxss",
    "content": "@import '../common/index.wxss';.van-slider{position:relative;border-radius:999px;border-radius:var(--border-radius-max,999px);background-color:#ebedf0;background-color:var(--slider-inactive-background-color,#ebedf0)}.van-slider:before{position:absolute;right:0;left:0;content:\"\";top:-8px;top:-var(--padding-xs,8px);bottom:-8px;bottom:-var(--padding-xs,8px)}.van-slider__bar{position:relative;border-radius:inherit;transition:width .2s;transition:width var(--animation-duration-fast,.2s);background-color:#1989fa;background-color:var(--slider-active-background-color,#1989fa)}.van-slider__button{width:24px;height:24px;border-radius:50%;box-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#fff;background-color:var(--slider-button-background-color,#fff)}.van-slider__button-wrapper{position:absolute;top:50%;right:0;-webkit-transform:translate3d(50%,-50%,0);transform:translate3d(50%,-50%,0)}.van-slider--disabled{opacity:.5}"
  },
  {
    "path": "miniprogram/vant/stepper/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/stepper/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isDef } from '../common/utils';\nconst LONG_PRESS_START_TIME = 600;\nconst LONG_PRESS_INTERVAL = 200;\n// add num and avoid float number\nfunction add(num1, num2) {\n  const cardinal = Math.pow(10, 10);\n  return Math.round((num1 + num2) * cardinal) / cardinal;\n}\nfunction equal(value1, value2) {\n  return String(value1) === String(value2);\n}\nVantComponent({\n  field: true,\n  classes: ['input-class', 'plus-class', 'minus-class'],\n  props: {\n    value: {\n      type: null,\n      observer(value) {\n        if (!equal(value, this.data.currentValue)) {\n          this.setData({ currentValue: this.format(value) });\n        }\n      },\n    },\n    integer: {\n      type: Boolean,\n      observer: 'check',\n    },\n    disabled: Boolean,\n    inputWidth: null,\n    buttonSize: null,\n    asyncChange: Boolean,\n    disableInput: Boolean,\n    decimalLength: {\n      type: Number,\n      value: null,\n      observer: 'check',\n    },\n    min: {\n      type: null,\n      value: 1,\n      observer: 'check',\n    },\n    max: {\n      type: null,\n      value: Number.MAX_SAFE_INTEGER,\n      observer: 'check',\n    },\n    step: {\n      type: null,\n      value: 1,\n    },\n    showPlus: {\n      type: Boolean,\n      value: true,\n    },\n    showMinus: {\n      type: Boolean,\n      value: true,\n    },\n    disablePlus: Boolean,\n    disableMinus: Boolean,\n    longPress: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    currentValue: '',\n  },\n  created() {\n    this.setData({\n      currentValue: this.format(this.data.value),\n    });\n  },\n  methods: {\n    check() {\n      const val = this.format(this.data.currentValue);\n      if (!equal(val, this.data.currentValue)) {\n        this.setData({ currentValue: val });\n      }\n    },\n    isDisabled(type) {\n      if (type === 'plus') {\n        return (\n          this.data.disabled ||\n          this.data.disablePlus ||\n          this.data.currentValue >= this.data.max\n        );\n      }\n      return (\n        this.data.disabled ||\n        this.data.disableMinus ||\n        this.data.currentValue <= this.data.min\n      );\n    },\n    onFocus(event) {\n      this.$emit('focus', event.detail);\n    },\n    onBlur(event) {\n      const value = this.format(event.detail.value);\n      this.emitChange(value);\n      this.$emit(\n        'blur',\n        Object.assign(Object.assign({}, event.detail), { value })\n      );\n    },\n    // filter illegal characters\n    filter(value) {\n      value = String(value).replace(/[^0-9.-]/g, '');\n      if (this.data.integer && value.indexOf('.') !== -1) {\n        value = value.split('.')[0];\n      }\n      return value;\n    },\n    // limit value range\n    format(value) {\n      value = this.filter(value);\n      // format range\n      value = value === '' ? 0 : +value;\n      value = Math.max(Math.min(this.data.max, value), this.data.min);\n      // format decimal\n      if (isDef(this.data.decimalLength)) {\n        value = value.toFixed(this.data.decimalLength);\n      }\n      return value;\n    },\n    onInput(event) {\n      const { value = '' } = event.detail || {};\n      // allow input to be empty\n      if (value === '') {\n        return;\n      }\n      let formatted = this.filter(value);\n      // limit max decimal length\n      if (isDef(this.data.decimalLength) && formatted.indexOf('.') !== -1) {\n        const pair = formatted.split('.');\n        formatted = `${pair[0]}.${pair[1].slice(0, this.data.decimalLength)}`;\n      }\n      this.emitChange(formatted);\n    },\n    emitChange(value) {\n      if (!this.data.asyncChange) {\n        this.setData({ currentValue: value });\n      }\n      this.$emit('change', value);\n    },\n    onChange() {\n      const { type } = this;\n      if (this.isDisabled(type)) {\n        this.$emit('overlimit', type);\n        return;\n      }\n      const diff = type === 'minus' ? -this.data.step : +this.data.step;\n      const value = this.format(add(+this.data.currentValue, diff));\n      this.emitChange(value);\n      this.$emit(type);\n    },\n    longPressStep() {\n      this.longPressTimer = setTimeout(() => {\n        this.onChange();\n        this.longPressStep();\n      }, LONG_PRESS_INTERVAL);\n    },\n    onTap(event) {\n      const { type } = event.currentTarget.dataset;\n      this.type = type;\n      this.onChange();\n    },\n    onTouchStart(event) {\n      if (!this.data.longPress) {\n        return;\n      }\n      clearTimeout(this.longPressTimer);\n      const { type } = event.currentTarget.dataset;\n      this.type = type;\n      this.isLongPress = false;\n      this.longPressTimer = setTimeout(() => {\n        this.isLongPress = true;\n        this.onChange();\n        this.longPressStep();\n      }, LONG_PRESS_START_TIME);\n    },\n    onTouchEnd() {\n      if (!this.data.longPress) {\n        return;\n      }\n      clearTimeout(this.longPressTimer);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/stepper/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/stepper/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-stepper custom-class\">\n  <view\n    wx:if=\"{{ showMinus }}\"\n    data-type=\"minus\"\n    style=\"width: {{ utils.addUnit(buttonSize) }}; height: {{ utils.addUnit(buttonSize) }}\"\n    class=\"minus-class {{ utils.bem('stepper__minus', { disabled: disabled || disableMinus || currentValue <= min }) }}\"\n    hover-class=\"van-stepper__minus--hover\"\n    hover-stay-time=\"70\"\n    bind:tap=\"onTap\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchend=\"onTouchEnd\"\n  />\n  <input\n    type=\"{{ integer ? 'number' : 'digit' }}\"\n    class=\"input-class {{ utils.bem('stepper__input', { disabled: disabled || disableInput }) }}\"\n    style=\"width: {{ utils.addUnit(inputWidth) }}; height: {{ utils.addUnit(buttonSize) }}\"\n    value=\"{{ currentValue }}\"\n    focus=\"{{ focus }}\"\n    disabled=\"{{ disabled || disableInput }}\"\n    bindinput=\"onInput\"\n    bind:focus=\"onFocus\"\n    bind:blur=\"onBlur\"\n  />\n  <view\n    wx:if=\"{{ showPlus }}\"\n    data-type=\"plus\"\n    style=\"width: {{ utils.addUnit(buttonSize) }}; height: {{ utils.addUnit(buttonSize) }}\"\n    class=\"plus-class {{ utils.bem('stepper__plus', { disabled: disabled || disablePlus || currentValue >= max }) }}\"\n    hover-class=\"van-stepper__plus--hover\"\n    hover-stay-time=\"70\"\n    bind:tap=\"onTap\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchend=\"onTouchEnd\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/stepper/index.wxss",
    "content": "@import '../common/index.wxss';.van-stepper{font-size:0}.van-stepper__minus,.van-stepper__plus{position:relative;display:inline-block;box-sizing:border-box;margin:1px;vertical-align:middle;border:0;background-color:#f2f3f5;background-color:var(--stepper-background-color,#f2f3f5);color:#323233;color:var(--stepper-button-icon-color,#323233);width:28px;width:var(--stepper-input-height,28px);height:28px;height:var(--stepper-input-height,28px);padding:4px;padding:var(--padding-base,4px)}.van-stepper__minus:before,.van-stepper__plus:before{width:9px;height:1px}.van-stepper__minus:after,.van-stepper__plus:after{width:1px;height:9px}.van-stepper__minus:after,.van-stepper__minus:before,.van-stepper__plus:after,.van-stepper__plus:before{position:absolute;top:0;right:0;bottom:0;left:0;margin:auto;background-color:currentColor;content:\"\"}.van-stepper__minus--hover,.van-stepper__plus--hover{background-color:#e8e8e8;background-color:var(--stepper-active-color,#e8e8e8)}.van-stepper__minus--disabled,.van-stepper__plus--disabled{color:#c8c9cc;color:var(--stepper-button-disabled-icon-color,#c8c9cc)}.van-stepper__minus--disabled,.van-stepper__minus--disabled.van-stepper__minus--hover,.van-stepper__minus--disabled.van-stepper__plus--hover,.van-stepper__plus--disabled,.van-stepper__plus--disabled.van-stepper__minus--hover,.van-stepper__plus--disabled.van-stepper__plus--hover{background-color:#f7f8fa;background-color:var(--stepper-button-disabled-color,#f7f8fa)}.van-stepper__minus{border-radius:4px 0 0 4px;border-radius:var(--stepper-border-radius,4px) 0 0 var(--stepper-border-radius,4px)}.van-stepper__minus:after{display:none}.van-stepper__plus{border-radius:0 4px 4px 0;border-radius:0 var(--stepper-border-radius,4px) var(--stepper-border-radius,4px) 0}.van-stepper__input{display:inline-block;box-sizing:border-box;min-height:0;margin:1px;padding:1px;text-align:center;vertical-align:middle;border:0;border-width:1px 0;border-radius:0;-webkit-appearance:none;font-size:14px;font-size:var(--stepper-input-font-size,14px);color:#323233;color:var(--stepper-input-text-color,#323233);background-color:#f2f3f5;background-color:var(--stepper-background-color,#f2f3f5);width:32px;width:var(--stepper-input-width,32px);height:28px;height:var(--stepper-input-height,28px)}.van-stepper__input--disabled{color:#c8c9cc;color:var(--stepper-input-disabled-text-color,#c8c9cc);background-color:#f2f3f5;background-color:var(--stepper-input-disabled-background-color,#f2f3f5)}"
  },
  {
    "path": "miniprogram/vant/steps/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/steps/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { GREEN, GRAY_DARK } from '../common/color';\nVantComponent({\n  classes: ['desc-class'],\n  props: {\n    icon: String,\n    steps: Array,\n    active: Number,\n    direction: {\n      type: String,\n      value: 'horizontal',\n    },\n    activeColor: {\n      type: String,\n      value: GREEN,\n    },\n    inactiveColor: {\n      type: String,\n      value: GRAY_DARK,\n    },\n    activeIcon: {\n      type: String,\n      value: 'checked',\n    },\n    inactiveIcon: String,\n  },\n  methods: {\n    onClick(event) {\n      const { index } = event.currentTarget.dataset;\n      this.$emit('click-step', index);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/steps/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/steps/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"custom-class {{ utils.bem('steps', [direction]) }}\">\n  <view class=\"van-step__wrapper\">\n    <view\n      wx:for=\"{{ steps }}\"\n      wx:key=\"index\"\n      bindtap=\"onClick\"\n      data-index=\"{{ index }}\"\n      class=\"{{ utils.bem('step', [direction, status(index, active)]) }} van-hairline\"\n      style=\"{{ status(index, active) === 'inactive' ? 'color: ' + inactiveColor: '' }}\"\n    >\n      <view class=\"van-step__title\" style=\"{{ index === active ? 'color: ' + activeColor : '' }}\">\n        <view>{{ item.text }}</view>\n        <view class=\"desc-class\">{{ item.desc }}</view>\n      </view>\n      <view class=\"van-step__circle-container\">\n        <block wx:if=\"{{ index !== active }}\">\n          <van-icon\n            wx:if=\"{{ inactiveIcon }}\"\n            color=\"{{ status(index, active) === 'inactive' ? inactiveColor: activeColor }}\"\n            name=\"{{ inactiveIcon }}\"\n            custom-class=\"van-step__icon\"\n          />\n          <view\n            wx:else\n            class=\"van-step__circle\"\n            style=\"{{ 'background-color: ' + (index < active ? activeColor : inactiveColor) }}\"\n          />\n        </block>\n\n        <van-icon wx:else name=\"{{ activeIcon }}\" color=\"{{ activeColor }}\" custom-class=\"van-step__icon\" />\n      </view>\n      <view\n        wx:if=\"{{ index !== steps.length - 1 }}\"\n        class=\"van-step__line\" style=\"{{ 'background-color: ' + (index < active ? activeColor : inactiveColor) }}\"\n      />\n    </view>\n  </view>\n</view>\n\n<wxs module=\"status\">\nfunction get(index, active) {\n  if (index < active) {\n    return 'finish';\n  } else if (index === active) {\n    return 'process';\n  }\n\n  return 'inactive';\n}\n\nmodule.exports = get;\n</wxs>\n"
  },
  {
    "path": "miniprogram/vant/steps/index.wxss",
    "content": "@import '../common/index.wxss';.van-steps{overflow:hidden;background-color:#fff;background-color:var(--steps-background-color,#fff)}.van-steps--horizontal{padding:10px}.van-steps--horizontal .van-step__wrapper{position:relative;display:-webkit-flex;display:flex;overflow:hidden}.van-steps--vertical{padding-left:10px}.van-steps--vertical .van-step__wrapper{padding:0 0 0 20px}.van-step{position:relative;-webkit-flex:1;flex:1;font-size:14px;font-size:var(--step-font-size,14px);color:#969799;color:var(--step-text-color,#969799)}.van-step--finish{color:#323233;color:var(--step-finish-text-color,#323233)}.van-step__circle{border-radius:50%;width:5px;width:var(--step-circle-size,5px);height:5px;height:var(--step-circle-size,5px);background-color:#969799;background-color:var(--step-circle-color,#969799)}.van-step--horizontal{padding-bottom:14px}.van-step--horizontal:first-child .van-step__title{-webkit-transform:none;transform:none}.van-step--horizontal:first-child .van-step__circle-container{padding:0 8px 0 0;-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.van-step--horizontal:last-child{position:absolute;right:0;width:auto}.van-step--horizontal:last-child .van-step__title{text-align:right;-webkit-transform:none;transform:none}.van-step--horizontal:last-child .van-step__circle-container{right:0;padding:0 0 0 8px;-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.van-step--horizontal .van-step__circle-container{position:absolute;bottom:6px;z-index:1;-webkit-transform:translate3d(-50%,50%,0);transform:translate3d(-50%,50%,0);background-color:#fff;background-color:var(--white,#fff);padding:0 8px;padding:0 var(--padding-xs,8px)}.van-step--horizontal .van-step__title{display:inline-block;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);font-size:12px;font-size:var(--step-horizontal-title-font-size,12px)}.van-step--horizontal .van-step__line{position:absolute;right:0;bottom:6px;left:0;height:1px;-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0);background-color:#ebedf0;background-color:var(--step-line-color,#ebedf0)}.van-step--horizontal.van-step--process{color:#323233;color:var(--step-process-text-color,#323233)}.van-step--horizontal.van-step--process .van-step__icon{display:block;line-height:1;font-size:12px;font-size:var(--step-icon-size,12px)}.van-step--vertical{padding:10px 10px 10px 0;line-height:18px}.van-step--vertical:after{border-bottom-width:1px}.van-step--vertical:last-child:after{border-bottom-width:none}.van-step--vertical:first-child:before{position:absolute;top:0;left:-15px;z-index:1;width:1px;height:20px;content:\"\";background-color:#fff;background-color:var(--white,#fff)}.van-step--vertical .van-step__circle,.van-step--vertical .van-step__icon,.van-step--vertical .van-step__line{position:absolute;top:19px;left:-14px;z-index:2;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.van-step--vertical .van-step__icon{line-height:1;font-size:12px;font-size:var(--step-icon-size,12px)}.van-step--vertical .van-step__line{z-index:1;width:1px;height:100%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0);background-color:#ebedf0;background-color:var(--step-line-color,#ebedf0)}"
  },
  {
    "path": "miniprogram/vant/sticky/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/sticky/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { pageScrollMixin } from '../mixins/page-scroll';\nconst ROOT_ELEMENT = '.van-sticky';\nVantComponent({\n  props: {\n    zIndex: {\n      type: Number,\n      value: 99,\n    },\n    offsetTop: {\n      type: Number,\n      value: 0,\n      observer: 'onScroll',\n    },\n    disabled: {\n      type: Boolean,\n      observer: 'onScroll',\n    },\n    container: {\n      type: null,\n      observer: 'onScroll',\n    },\n    scrollTop: {\n      type: null,\n      observer(val) {\n        this.onScroll({ scrollTop: val });\n      },\n    },\n  },\n  mixins: [\n    pageScrollMixin(function (event) {\n      if (this.data.scrollTop != null) {\n        return;\n      }\n      this.onScroll(event);\n    }),\n  ],\n  data: {\n    height: 0,\n    fixed: false,\n    transform: 0,\n  },\n  mounted() {\n    this.onScroll();\n  },\n  methods: {\n    onScroll({ scrollTop } = {}) {\n      const { container, offsetTop, disabled } = this.data;\n      if (disabled) {\n        this.setDataAfterDiff({\n          fixed: false,\n          transform: 0,\n        });\n        return;\n      }\n      this.scrollTop = scrollTop || this.scrollTop;\n      if (typeof container === 'function') {\n        Promise.all([this.getRect(ROOT_ELEMENT), this.getContainerRect()]).then(\n          ([root, container]) => {\n            if (offsetTop + root.height > container.height + container.top) {\n              this.setDataAfterDiff({\n                fixed: false,\n                transform: container.height - root.height,\n              });\n            } else if (offsetTop >= root.top) {\n              this.setDataAfterDiff({\n                fixed: true,\n                height: root.height,\n                transform: 0,\n              });\n            } else {\n              this.setDataAfterDiff({ fixed: false, transform: 0 });\n            }\n          }\n        );\n        return;\n      }\n      this.getRect(ROOT_ELEMENT).then((root) => {\n        if (offsetTop >= root.top) {\n          this.setDataAfterDiff({ fixed: true, height: root.height });\n          this.transform = 0;\n        } else {\n          this.setDataAfterDiff({ fixed: false });\n        }\n      });\n    },\n    setDataAfterDiff(data) {\n      wx.nextTick(() => {\n        const diff = Object.keys(data).reduce((prev, key) => {\n          if (data[key] !== this.data[key]) {\n            prev[key] = data[key];\n          }\n          return prev;\n        }, {});\n        this.setData(diff);\n        this.$emit('scroll', {\n          scrollTop: this.scrollTop,\n          isFixed: data.fixed || this.data.fixed,\n        });\n      });\n    },\n    getContainerRect() {\n      const nodesRef = this.data.container();\n      return new Promise((resolve) =>\n        nodesRef.boundingClientRect(resolve).exec()\n      );\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/sticky/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/sticky/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"computed\" />\n\n<view class=\"custom-class van-sticky\" style=\"{{ computed.containerStyle({ fixed, height, zIndex }) }}\">\n  <view class=\"{{ utils.bem('sticky-wrap', { fixed }) }}\" style=\"{{ computed.wrapStyle({ fixed, offsetTop, transform, zIndex }) }}\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/sticky/index.wxs",
    "content": "/* eslint-disable */\nfunction wrapStyle(data) {\n  var style = '';\n\n  if (data.transform) {\n    style += 'transform: translate3d(0, ' + data.transform + 'px, 0);';\n  }\n\n  if (data.fixed) {\n    style += 'top: ' + data.offsetTop + 'px;';\n  }\n\n  if (data.zIndex) {\n    style += 'z-index: ' + data.zIndex + ';';\n  }\n\n  return style;\n}\n\nfunction containerStyle(data) {\n  var style = '';\n\n  if (data.fixed) {\n    style += 'height: ' + data.height + 'px;';\n  }\n\n  if (data.zIndex) {\n    style += 'z-index: ' + data.zIndex + ';';\n  }\n\n  return style;\n}\n\nmodule.exports = {\n  wrapStyle: wrapStyle,\n  containerStyle: containerStyle\n};\n"
  },
  {
    "path": "miniprogram/vant/sticky/index.wxss",
    "content": "@import '../common/index.wxss';.van-sticky{position:relative}.van-sticky-wrap--fixed{position:fixed;right:0;left:0}"
  },
  {
    "path": "miniprogram/vant/submit-bar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/submit-bar/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: ['bar-class', 'price-class', 'button-class'],\n  props: {\n    tip: {\n      type: null,\n      observer: 'updateTip',\n    },\n    tipIcon: String,\n    type: Number,\n    price: {\n      type: null,\n      observer: 'updatePrice',\n    },\n    label: String,\n    loading: Boolean,\n    disabled: Boolean,\n    buttonText: String,\n    currency: {\n      type: String,\n      value: '¥',\n    },\n    buttonType: {\n      type: String,\n      value: 'danger',\n    },\n    decimalLength: {\n      type: Number,\n      value: 2,\n      observer: 'updatePrice',\n    },\n    suffixLabel: String,\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    updatePrice() {\n      const { price, decimalLength } = this.data;\n      const priceStrArr =\n        typeof price === 'number' &&\n        (price / 100).toFixed(decimalLength).split('.');\n      this.setData({\n        hasPrice: typeof price === 'number',\n        integerStr: priceStrArr && priceStrArr[0],\n        decimalStr: decimalLength && priceStrArr ? `.${priceStrArr[1]}` : '',\n      });\n    },\n    updateTip() {\n      this.setData({ hasTip: typeof this.data.tip === 'string' });\n    },\n    onSubmit(event) {\n      this.$emit('submit', event.detail);\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/submit-bar/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-button\": \"../button/index\",\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/submit-bar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-submit-bar custom-class\">\n  <slot name=\"top\" />\n\n  <view class=\"van-submit-bar__tip\">\n    <van-icon\n      wx:if=\"{{ tipIcon }}\"\n      size=\"12px\"\n      name=\"{{ tipIcon }}\"\n      custom-class=\"van-submit-bar__tip-icon\"\n    />\n    <view wx:if=\"{{ hasTip }}\" class=\"van-submit-bar__tip-text\">\n      {{ tip }}\n    </view>\n    <slot name=\"tip\" />\n  </view>\n\n  <view class=\"bar-class van-submit-bar__bar\">\n    <slot />\n    <view wx:if=\"{{ hasPrice }}\" class=\"van-submit-bar__text\">\n      <text>{{ label || '合计：' }}</text>\n      <text class=\"van-submit-bar__price price-class\">\n        <text class=\"van-submit-bar__currency\">{{ currency }} </text>\n        <text class=\"van-submit-bar__price-integer\">{{ integerStr }}</text><text>{{decimalStr}}</text>\n      </text>\n      <text class=\"van-submit-bar__suffix-label\">{{ suffixLabel }}</text>\n    </view>\n    <van-button\n      round\n      type=\"{{ buttonType }}\"\n      loading=\"{{ loading }}\"\n      disabled=\"{{ disabled }}\"\n      class=\"van-submit-bar__button\"\n      custom-class=\"button-class\"\n      custom-style=\"width: 100%;\"\n      bind:click=\"onSubmit\"\n    >\n      {{ loading ? '' : buttonText }}\n    </van-button>\n  </view>\n\n  <view wx:if=\"{{ safeAreaInsetBottom }}\" class=\"van-submit-bar__safe\" />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/submit-bar/index.wxss",
    "content": "@import '../common/index.wxss';.van-submit-bar{position:fixed;bottom:0;left:0;width:100%;-webkit-user-select:none;user-select:none;z-index:100;z-index:var(--submit-bar-z-index,100);background-color:#fff;background-color:var(--submit-bar-background-color,#fff)}.van-submit-bar__tip{padding:10px;padding:var(--submit-bar-tip-padding,10px);color:#f56723;color:var(--submit-bar-tip-color,#f56723);font-size:12px;font-size:var(--submit-bar-tip-font-size,12px);line-height:1.5;line-height:var(--submit-bar-tip-line-height,1.5);background-color:#fff7cc;background-color:var(--submit-bar-tip-background-color,#fff7cc)}.van-submit-bar__tip:empty{display:none}.van-submit-bar__tip-icon{width:12px;height:12px;margin-right:4px;vertical-align:middle;font-size:12px;font-size:var(--submit-bar-tip-icon-size,12px);min-width:18px;min-width:calc(var(--submit-bar-tip-icon-size, 12px)*1.5)}.van-submit-bar__tip-text{display:inline;vertical-align:middle}.van-submit-bar__bar{display:-webkit-flex;display:flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:flex-end;justify-content:flex-end;padding:0 16px;padding:var(--submit-bar-padding,0 16px);height:50px;height:var(--submit-bar-height,50px);font-size:14px;font-size:var(--submit-bar-text-font-size,14px);background-color:#fff;background-color:var(--submit-bar-background-color,#fff)}.van-submit-bar__safe{height:constant(safe-area-inset-bottom);height:env(safe-area-inset-bottom)}.van-submit-bar__text{-webkit-flex:1;flex:1;text-align:right;color:#323233;color:var(--submit-bar-text-color,#323233);padding-right:12px;padding-right:var(--padding-sm,12px)}.van-submit-bar__price,.van-submit-bar__text{font-weight:500;font-weight:var(--font-weight-bold,500)}.van-submit-bar__price{color:#ee0a24;color:var(--submit-bar-price-color,#ee0a24);font-size:12px;font-size:var(--submit-bar-price-font-size,12px)}.van-submit-bar__price-integer{font-size:20px;font-family:Avenir-Heavy,PingFang SC,Helvetica Neue,Arial,sans-serif}.van-submit-bar__currency{font-size:12px;font-size:var(--submit-bar-currency-font-size,12px)}.van-submit-bar__suffix-label{margin-left:5px}.van-submit-bar__button{width:110px;width:var(--submit-bar-button-width,110px);font-weight:500;font-weight:var(--font-weight-bold,500);--button-default-height:40px!important;--button-default-height:var(--submit-bar-button-height,40px)!important;--button-line-height:40px!important;--button-line-height:var(--submit-bar-button-height,40px)!important}"
  },
  {
    "path": "miniprogram/vant/swipe-cell/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/swipe-cell/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { touch } from '../mixins/touch';\nimport { range } from '../common/utils';\nconst THRESHOLD = 0.3;\nlet ARRAY = [];\nVantComponent({\n  props: {\n    disabled: Boolean,\n    leftWidth: {\n      type: Number,\n      value: 0,\n      observer(leftWidth = 0) {\n        if (this.offset > 0) {\n          this.swipeMove(leftWidth);\n        }\n      },\n    },\n    rightWidth: {\n      type: Number,\n      value: 0,\n      observer(rightWidth = 0) {\n        if (this.offset < 0) {\n          this.swipeMove(-rightWidth);\n        }\n      },\n    },\n    asyncClose: Boolean,\n    name: {\n      type: [Number, String],\n      value: '',\n    },\n  },\n  mixins: [touch],\n  data: {\n    catchMove: false,\n  },\n  created() {\n    this.offset = 0;\n    ARRAY.push(this);\n  },\n  destroyed() {\n    ARRAY = ARRAY.filter((item) => item !== this);\n  },\n  methods: {\n    open(position) {\n      const { leftWidth, rightWidth } = this.data;\n      const offset = position === 'left' ? leftWidth : -rightWidth;\n      this.swipeMove(offset);\n      this.$emit('open', {\n        position,\n        name: this.data.name,\n      });\n    },\n    close() {\n      this.swipeMove(0);\n    },\n    swipeMove(offset = 0) {\n      this.offset = range(offset, -this.data.rightWidth, this.data.leftWidth);\n      const transform = `translate3d(${this.offset}px, 0, 0)`;\n      const transition = this.dragging\n        ? 'none'\n        : 'transform .6s cubic-bezier(0.18, 0.89, 0.32, 1)';\n      this.setData({\n        wrapperStyle: `\n        -webkit-transform: ${transform};\n        -webkit-transition: ${transition};\n        transform: ${transform};\n        transition: ${transition};\n      `,\n      });\n    },\n    swipeLeaveTransition() {\n      const { leftWidth, rightWidth } = this.data;\n      const { offset } = this;\n      if (rightWidth > 0 && -offset > rightWidth * THRESHOLD) {\n        this.open('right');\n      } else if (leftWidth > 0 && offset > leftWidth * THRESHOLD) {\n        this.open('left');\n      } else {\n        this.swipeMove(0);\n      }\n      this.setData({ catchMove: false });\n    },\n    startDrag(event) {\n      if (this.data.disabled) {\n        return;\n      }\n      this.startOffset = this.offset;\n      this.touchStart(event);\n    },\n    noop() {},\n    onDrag(event) {\n      if (this.data.disabled) {\n        return;\n      }\n      this.touchMove(event);\n      if (this.direction !== 'horizontal') {\n        return;\n      }\n      this.dragging = true;\n      ARRAY.filter((item) => item !== this).forEach((item) => item.close());\n      this.setData({ catchMove: true });\n      this.swipeMove(this.startOffset + this.deltaX);\n    },\n    endDrag() {\n      if (this.data.disabled) {\n        return;\n      }\n      this.dragging = false;\n      this.swipeLeaveTransition();\n    },\n    onClick(event) {\n      const { key: position = 'outside' } = event.currentTarget.dataset;\n      this.$emit('click', position);\n      if (!this.offset) {\n        return;\n      }\n      if (this.data.asyncClose) {\n        this.$emit('close', {\n          position,\n          instance: this,\n          name: this.data.name,\n        });\n      } else {\n        this.swipeMove(0);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/swipe-cell/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/swipe-cell/index.wxml",
    "content": "<view\n  class=\"van-swipe-cell\"\n  data-key=\"cell\"\n  catchtap=\"onClick\"\n  bindtouchstart=\"startDrag\"\n  catchtouchmove=\"{{ catchMove ? 'noop' : '' }}\"\n  capture-bind:touchmove=\"onDrag\"\n  bindtouchend=\"endDrag\"\n  bindtouchcancel=\"endDrag\"\n>\n  <view style=\"{{ wrapperStyle }}\">\n    <view wx:if=\"{{ leftWidth }}\" class=\"van-swipe-cell__left\" data-key=\"left\" catch:tap=\"onClick\">\n      <slot name=\"left\" />\n    </view>\n    <slot />\n    <view wx:if=\"{{ rightWidth }}\" class=\"van-swipe-cell__right\" data-key=\"right\" catch:tap=\"onClick\">\n      <slot name=\"right\" />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/swipe-cell/index.wxss",
    "content": "@import '../common/index.wxss';.van-swipe-cell{position:relative;overflow:hidden}.van-swipe-cell__left,.van-swipe-cell__right{position:absolute;top:0;height:100%}.van-swipe-cell__left{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.van-swipe-cell__right{right:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}"
  },
  {
    "path": "miniprogram/vant/switch/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/switch/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { BLUE, GRAY_DARK } from '../common/color';\nVantComponent({\n  field: true,\n  classes: ['node-class'],\n  props: {\n    checked: {\n      type: null,\n      observer(value) {\n        const loadingColor = this.getLoadingColor(value);\n        this.setData({ value, loadingColor });\n      },\n    },\n    loading: Boolean,\n    disabled: Boolean,\n    activeColor: String,\n    inactiveColor: String,\n    size: {\n      type: String,\n      value: '30px',\n    },\n    activeValue: {\n      type: null,\n      value: true,\n    },\n    inactiveValue: {\n      type: null,\n      value: false,\n    },\n  },\n  created() {\n    const { checked: value } = this.data;\n    const loadingColor = this.getLoadingColor(value);\n    this.setData({ value, loadingColor });\n  },\n  methods: {\n    getLoadingColor(checked) {\n      const { activeColor, inactiveColor } = this.data;\n      return checked ? activeColor || BLUE : inactiveColor || GRAY_DARK;\n    },\n    onClick() {\n      const { activeValue, inactiveValue } = this.data;\n      if (!this.data.disabled && !this.data.loading) {\n        const checked = this.data.checked === activeValue;\n        const value = checked ? inactiveValue : activeValue;\n        this.$emit('input', value);\n        this.$emit('change', value);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/switch/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/switch/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('switch', { on: value === activeValue, disabled }) }}\"\n  style=\"font-size: {{ size }}; {{ (checked ? activeColor : inactiveColor) ? 'background-color: ' + (checked ? activeColor : inactiveColor ) : '' }}\"\n  bind:tap=\"onClick\"\n>\n  <view class=\"van-switch__node node-class\">\n    <van-loading wx:if=\"{{ loading }}\" color=\"{{ loadingColor }}\" custom-class=\"van-switch__loading\" />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/switch/index.wxss",
    "content": "@import '../common/index.wxss';.van-switch{position:relative;display:inline-block;box-sizing:initial;width:2em;width:var(--switch-width,2em);height:1em;height:var(--switch-height,1em);background-color:#fff;background-color:var(--switch-background-color,#fff);border:1px solid rgba(0,0,0,.1);border:var(--switch-border,1px solid rgba(0,0,0,.1));border-radius:1em;border-radius:var(--switch-node-size,1em);transition:background-color .3s;transition:background-color var(--switch-transition-duration,.3s)}.van-switch__node{position:absolute;top:0;left:0;border-radius:100%;z-index:1;z-index:var(--switch-node-z-index,1);width:1em;width:var(--switch-node-size,1em);height:1em;height:var(--switch-node-size,1em);background-color:#fff;background-color:var(--switch-node-background-color,#fff);box-shadow:0 3px 1px 0 rgba(0,0,0,.05),0 2px 2px 0 rgba(0,0,0,.1),0 3px 3px 0 rgba(0,0,0,.05);box-shadow:var(--switch-node-box-shadow,0 3px 1px 0 rgba(0,0,0,.05),0 2px 2px 0 rgba(0,0,0,.1),0 3px 3px 0 rgba(0,0,0,.05));transition:-webkit-transform .3s cubic-bezier(.3,1.05,.4,1.05);transition:transform .3s cubic-bezier(.3,1.05,.4,1.05);transition:transform .3s cubic-bezier(.3,1.05,.4,1.05),-webkit-transform .3s cubic-bezier(.3,1.05,.4,1.05);transition:-webkit-transform var(--switch-transition-duration,.3s) cubic-bezier(.3,1.05,.4,1.05);transition:transform var(--switch-transition-duration,.3s) cubic-bezier(.3,1.05,.4,1.05);transition:transform var(--switch-transition-duration,.3s) cubic-bezier(.3,1.05,.4,1.05),-webkit-transform var(--switch-transition-duration,.3s) cubic-bezier(.3,1.05,.4,1.05)}.van-switch__loading{position:absolute!important;top:25%;left:25%;width:50%;height:50%}.van-switch--on{background-color:#1989fa;background-color:var(--switch-on-background-color,#1989fa)}.van-switch--on .van-switch__node{-webkit-transform:translateX(1em);transform:translateX(1em);-webkit-transform:translateX(calc(var(--switch-width, 2em) - var(--switch-node-size, 1em)));transform:translateX(calc(var(--switch-width, 2em) - var(--switch-node-size, 1em)))}.van-switch--disabled{opacity:.4;opacity:var(--switch-disabled-opacity,.4)}"
  },
  {
    "path": "miniprogram/vant/tab/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tab/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'tabs',\n    type: 'ancestor',\n    current: 'tab',\n  },\n  props: {\n    dot: {\n      type: Boolean,\n      observer: 'update',\n    },\n    info: {\n      type: null,\n      observer: 'update',\n    },\n    title: {\n      type: String,\n      observer: 'update',\n    },\n    disabled: {\n      type: Boolean,\n      observer: 'update',\n    },\n    titleStyle: {\n      type: String,\n      observer: 'update',\n    },\n    name: {\n      type: [Number, String],\n      value: '',\n    },\n  },\n  data: {\n    active: false,\n  },\n  methods: {\n    getComputedName() {\n      if (this.data.name !== '') {\n        return this.data.name;\n      }\n      return this.index;\n    },\n    updateRender(active, parent) {\n      const { data: parentData } = parent;\n      this.inited = this.inited || active;\n      this.setData({\n        active,\n        shouldRender: this.inited || !parentData.lazyRender,\n        shouldShow: active || parentData.animated,\n      });\n    },\n    update() {\n      if (this.parent) {\n        this.parent.updateTabs();\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tab/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/tab/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('tab__pane', { active, inactive: !active }) }}\"\n  style=\"{{ shouldShow ? '' : 'display: none;' }}\"\n>\n  <slot wx:if=\"{{ shouldRender }}\" />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tab/index.wxss",
    "content": "@import '../common/index.wxss';:host{-webkit-flex-shrink:0;flex-shrink:0;width:100%}.van-tab__pane,:host{box-sizing:border-box}.van-tab__pane{overflow-y:auto;-webkit-overflow-scrolling:touch}.van-tab__pane--active{height:auto}.van-tab__pane--inactive{height:0;overflow:visible}"
  },
  {
    "path": "miniprogram/vant/tabbar/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tabbar/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  relation: {\n    name: 'tabbar-item',\n    type: 'descendant',\n    current: 'tabbar',\n    linked(target) {\n      target.parent = this;\n      target.updateFromParent();\n    },\n    unlinked() {\n      this.updateChildren();\n    },\n  },\n  props: {\n    active: {\n      type: null,\n      observer: 'updateChildren',\n    },\n    activeColor: {\n      type: String,\n      observer: 'updateChildren',\n    },\n    inactiveColor: {\n      type: String,\n      observer: 'updateChildren',\n    },\n    fixed: {\n      type: Boolean,\n      value: true,\n    },\n    border: {\n      type: Boolean,\n      value: true,\n    },\n    zIndex: {\n      type: Number,\n      value: 1,\n    },\n    safeAreaInsetBottom: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  methods: {\n    updateChildren() {\n      const { children } = this;\n      if (!Array.isArray(children) || !children.length) {\n        return Promise.resolve();\n      }\n      return Promise.all(children.map((child) => child.updateFromParent()));\n    },\n    onChange(child) {\n      const index = this.children.indexOf(child);\n      const active = child.data.name || index;\n      if (active !== this.data.active) {\n        this.$emit('change', active);\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tabbar/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/tabbar/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ border ? 'van-hairline--top-bottom' : '' }} {{ utils.bem('tabbar', { fixed, safe: safeAreaInsetBottom }) }}\"\n  style=\"{{ zIndex ? 'z-index: ' + zIndex : '' }}\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tabbar/index.wxss",
    "content": "@import '../common/index.wxss';.van-tabbar{display:-webkit-flex;display:flex;width:100%;height:50px;height:var(--tabbar-height,50px);background-color:#fff;background-color:var(--tabbar-background-color,#fff)}.van-tabbar--fixed{position:fixed;bottom:0;left:0}.van-tabbar--safe{padding-bottom:env(safe-area-inset-bottom)}"
  },
  {
    "path": "miniprogram/vant/tabbar-item/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tabbar-item/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    info: null,\n    name: null,\n    icon: String,\n    dot: Boolean,\n  },\n  relation: {\n    name: 'tabbar',\n    type: 'ancestor',\n    current: 'tabbar-item',\n  },\n  data: {\n    active: false,\n  },\n  methods: {\n    onClick() {\n      if (this.parent) {\n        this.parent.onChange(this);\n      }\n      this.$emit('click');\n    },\n    updateFromParent() {\n      const { parent } = this;\n      if (!parent) {\n        return;\n      }\n      const index = parent.children.indexOf(this);\n      const parentData = parent.data;\n      const { data } = this;\n      const active = (data.name || index) === parentData.active;\n      const patch = {};\n      if (active !== data.active) {\n        patch.active = active;\n      }\n      if (parentData.activeColor !== data.activeColor) {\n        patch.activeColor = parentData.activeColor;\n      }\n      if (parentData.inactiveColor !== data.inactiveColor) {\n        patch.inactiveColor = parentData.inactiveColor;\n      }\n      return Object.keys(patch).length > 0\n        ? this.set(patch)\n        : Promise.resolve();\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tabbar-item/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-info\": \"../info/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/tabbar-item/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"{{ utils.bem('tabbar-item', { active }) }} custom-class\"\n  style=\"color: {{ active ? activeColor : inactiveColor }}\"\n  bind:tap=\"onClick\"\n>\n  <view class=\"van-tabbar-item__icon\">\n    <van-icon\n      wx:if=\"{{ icon }}\"\n      name=\"{{ icon }}\"\n      custom-class=\"van-tabbar-item__icon__inner\"\n    />\n    <block wx:else>\n      <slot\n        wx:if=\"{{ active }}\"\n        name=\"icon-active\"\n      />\n      <slot wx:else name=\"icon\" />\n    </block>\n    <van-info\n      dot=\"{{ dot }}\"\n      info=\"{{ info }}\"\n      custom-class=\"van-tabbar-item__info\"\n    />\n  </view>\n  <view class=\"van-tabbar-item__text\">\n    <slot />\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tabbar-item/index.wxss",
    "content": "@import '../common/index.wxss';:host{-webkit-flex:1;flex:1}.van-tabbar-item{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;height:100%;color:#646566;color:var(--tabbar-item-text-color,#646566);font-size:12px;font-size:var(--tabbar-item-font-size,12px);line-height:1;line-height:var(--tabbar-item-line-height,1)}.van-tabbar-item__icon{position:relative;margin-bottom:5px;margin-bottom:var(--tabbar-item-margin-bottom,5px);font-size:18px;font-size:var(--tabbar-item-icon-size,18px)}.van-tabbar-item__icon__inner{display:block;min-width:1em}.van-tabbar-item--active{color:#1989fa;color:var(--tabbar-item-active-color,#1989fa)}.van-tabbar-item__info{margin-top:2px}"
  },
  {
    "path": "miniprogram/vant/tabs/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tabs/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { touch } from '../mixins/touch';\nimport { isDef, addUnit } from '../common/utils';\nVantComponent({\n  mixins: [touch],\n  classes: ['nav-class', 'tab-class', 'tab-active-class', 'line-class'],\n  relation: {\n    name: 'tab',\n    type: 'descendant',\n    current: 'tabs',\n    linked(target) {\n      target.index = this.children.length - 1;\n      this.updateTabs();\n    },\n    unlinked() {\n      this.children = this.children.map((child, index) => {\n        child.index = index;\n        return child;\n      });\n      this.updateTabs();\n    },\n  },\n  props: {\n    color: {\n      type: String,\n      observer: 'setLine',\n    },\n    sticky: Boolean,\n    animated: {\n      type: Boolean,\n      observer() {\n        this.children.forEach((child, index) =>\n          child.updateRender(index === this.data.currentIndex, this)\n        );\n      },\n    },\n    swipeable: Boolean,\n    lineWidth: {\n      type: [String, Number],\n      value: -1,\n      observer: 'setLine',\n    },\n    lineHeight: {\n      type: [String, Number],\n      value: -1,\n      observer: 'setLine',\n    },\n    titleActiveColor: String,\n    titleInactiveColor: String,\n    active: {\n      type: [String, Number],\n      value: 0,\n      observer(name) {\n        if (name !== this.getCurrentName()) {\n          this.setCurrentIndexByName(name);\n        }\n      },\n    },\n    type: {\n      type: String,\n      value: 'line',\n    },\n    border: {\n      type: Boolean,\n      value: true,\n    },\n    ellipsis: {\n      type: Boolean,\n      value: true,\n    },\n    duration: {\n      type: Number,\n      value: 0.3,\n    },\n    zIndex: {\n      type: Number,\n      value: 1,\n    },\n    swipeThreshold: {\n      type: Number,\n      value: 4,\n      observer(value) {\n        this.setData({\n          scrollable: this.children.length > value || !this.data.ellipsis,\n        });\n      },\n    },\n    offsetTop: {\n      type: Number,\n      value: 0,\n    },\n    lazyRender: {\n      type: Boolean,\n      value: true,\n    },\n  },\n  data: {\n    tabs: [],\n    lineStyle: '',\n    scrollLeft: 0,\n    scrollable: false,\n    trackStyle: '',\n    currentIndex: null,\n    container: null,\n  },\n  mounted() {\n    wx.nextTick(() => {\n      this.setLine(true);\n      this.scrollIntoView();\n    });\n  },\n  methods: {\n    updateContainer() {\n      this.setData({\n        container: () => this.createSelectorQuery().select('.van-tabs'),\n      });\n    },\n    updateTabs() {\n      const { children = [], data } = this;\n      this.setData({\n        tabs: children.map((child) => child.data),\n        scrollable:\n          this.children.length > data.swipeThreshold || !data.ellipsis,\n      });\n      this.setCurrentIndexByName(this.getCurrentName() || data.active);\n    },\n    trigger(eventName, child) {\n      const { currentIndex } = this.data;\n      const currentChild = child || this.children[currentIndex];\n      if (!isDef(currentChild)) {\n        return;\n      }\n      this.$emit(eventName, {\n        index: currentChild.index,\n        name: currentChild.getComputedName(),\n        title: currentChild.data.title,\n      });\n    },\n    onTap(event) {\n      const { index } = event.currentTarget.dataset;\n      const child = this.children[index];\n      if (child.data.disabled) {\n        this.trigger('disabled', child);\n      } else {\n        this.setCurrentIndex(index);\n        wx.nextTick(() => {\n          this.trigger('click');\n        });\n      }\n    },\n    // correct the index of active tab\n    setCurrentIndexByName(name) {\n      const { children = [] } = this;\n      const matched = children.filter(\n        (child) => child.getComputedName() === name\n      );\n      if (matched.length) {\n        this.setCurrentIndex(matched[0].index);\n      }\n    },\n    setCurrentIndex(currentIndex) {\n      const { data, children = [] } = this;\n      if (\n        !isDef(currentIndex) ||\n        currentIndex >= children.length ||\n        currentIndex < 0\n      ) {\n        return;\n      }\n      children.forEach((item, index) => {\n        const active = index === currentIndex;\n        if (active !== item.data.active || !item.inited) {\n          item.updateRender(active, this);\n        }\n      });\n      if (currentIndex === data.currentIndex) {\n        return;\n      }\n      const shouldEmitChange = data.currentIndex !== null;\n      this.setData({ currentIndex });\n      wx.nextTick(() => {\n        this.setLine();\n        this.scrollIntoView();\n        this.updateContainer();\n        this.trigger('input');\n        if (shouldEmitChange) {\n          this.trigger('change');\n        }\n      });\n    },\n    getCurrentName() {\n      const activeTab = this.children[this.data.currentIndex];\n      if (activeTab) {\n        return activeTab.getComputedName();\n      }\n    },\n    setLine(skipTransition) {\n      if (this.data.type !== 'line') {\n        return;\n      }\n      const {\n        color,\n        duration,\n        currentIndex,\n        lineWidth,\n        lineHeight,\n      } = this.data;\n      this.getRect('.van-tab', true).then((rects = []) => {\n        const rect = rects[currentIndex];\n        if (rect == null) {\n          return;\n        }\n        const width = lineWidth !== -1 ? lineWidth : rect.width / 2;\n        const height =\n          lineHeight !== -1\n            ? `height: ${addUnit(lineHeight)}; border-radius: ${addUnit(\n                lineHeight\n              )};`\n            : '';\n        let left = rects\n          .slice(0, currentIndex)\n          .reduce((prev, curr) => prev + curr.width, 0);\n        left += (rect.width - width) / 2;\n        const transition = skipTransition\n          ? ''\n          : `transition-duration: ${duration}s; -webkit-transition-duration: ${duration}s;`;\n        this.setData({\n          lineStyle: `\n            ${height}\n            width: ${addUnit(width)};\n            background-color: ${color};\n            -webkit-transform: translateX(${left}px);\n            transform: translateX(${left}px);\n            ${transition}\n          `,\n        });\n      });\n    },\n    // scroll active tab into view\n    scrollIntoView() {\n      const { currentIndex, scrollable } = this.data;\n      if (!scrollable) {\n        return;\n      }\n      Promise.all([\n        this.getRect('.van-tab', true),\n        this.getRect('.van-tabs__nav'),\n      ]).then(([tabRects, navRect]) => {\n        const tabRect = tabRects[currentIndex];\n        const offsetLeft = tabRects\n          .slice(0, currentIndex)\n          .reduce((prev, curr) => prev + curr.width, 0);\n        this.setData({\n          scrollLeft: offsetLeft - (navRect.width - tabRect.width) / 2,\n        });\n      });\n    },\n    onTouchScroll(event) {\n      this.$emit('scroll', event.detail);\n    },\n    onTouchStart(event) {\n      if (!this.data.swipeable) return;\n      this.touchStart(event);\n    },\n    onTouchMove(event) {\n      if (!this.data.swipeable) return;\n      this.touchMove(event);\n    },\n    // watch swipe touch end\n    onTouchEnd() {\n      if (!this.data.swipeable) return;\n      const { tabs, currentIndex } = this.data;\n      const { direction, deltaX, offsetX } = this;\n      const minSwipeDistance = 50;\n      if (direction === 'horizontal' && offsetX >= minSwipeDistance) {\n        if (deltaX > 0 && currentIndex !== 0) {\n          this.setCurrentIndex(currentIndex - 1);\n        } else if (deltaX < 0 && currentIndex !== tabs.length - 1) {\n          this.setCurrentIndex(currentIndex + 1);\n        }\n      }\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tabs/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-info\": \"../info/index\",\n    \"van-sticky\": \"../sticky/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/tabs/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"getters\" />\n\n<view class=\"custom-class {{ utils.bem('tabs', [type]) }}\">\n  <van-sticky\n    disabled=\"{{ !sticky }}\"\n    z-index=\"{{ zIndex }}\"\n    offset-top=\"{{ offsetTop }}\"\n    container=\"{{ container }}\"\n    bind:scroll=\"onTouchScroll\"\n  >\n    <view class=\"{{ utils.bem('tabs__wrap', { scrollable }) }} {{ type === 'line' && border ? 'van-hairline--top-bottom' : '' }}\">\n      <slot name=\"nav-left\" />\n\n      <scroll-view\n        scroll-x=\"{{ scrollable }}\"\n        scroll-with-animation\n        scroll-left=\"{{ scrollLeft }}\"\n        class=\"{{ utils.bem('tabs__scroll', [type]) }}\"\n        style=\"{{ color ? 'border-color: ' + color : '' }}\"\n      >\n        <view class=\"{{ utils.bem('tabs__nav', [type]) }} nav-class\" style=\"{{ getters.tabCardTypeBorderStyle(color, type) }}\">\n          <view wx:if=\"{{ type === 'line' }}\" class=\"van-tabs__line\" style=\"{{ lineStyle }}\" />\n          <view\n            wx:for=\"{{ tabs }}\"\n            wx:key=\"index\"\n            data-index=\"{{ index }}\"\n            class=\"{{ getters.tabClass(index === currentIndex, ellipsis) }} {{ utils.bem('tab', { active: index === currentIndex, disabled: item.disabled, complete: !ellipsis }) }}\"\n            style=\"{{ getters.tabStyle(index === currentIndex, ellipsis, color, type, item.disabled, titleActiveColor, titleInactiveColor, swipeThreshold, scrollable) }}\"\n            bind:tap=\"onTap\"\n          >\n            <view class=\"{{ ellipsis ? 'van-ellipsis' : '' }}\" style=\"{{ item.titleStyle }}\">\n              {{ item.title }}\n              <van-info\n                wx:if=\"{{ item.info !== null || item.dot }}\"\n                info=\"{{ item.info }}\"\n                dot=\"{{ item.dot }}\"\n                custom-class=\"van-tab__title__info\"\n              />\n            </view>\n          </view>\n        </view>\n      </scroll-view>\n\n      <slot name=\"nav-right\" />\n    </view>\n  </van-sticky>\n\n  <view\n    class=\"van-tabs__content\"\n    bind:touchstart=\"onTouchStart\"\n    bind:touchmove=\"onTouchMove\"\n    bind:touchend=\"onTouchEnd\"\n    bind:touchcancel=\"onTouchEnd\"\n  >\n    <view\n      class=\"{{ utils.bem('tabs__track', [{ animated }]) }} van-tabs__track\"\n      style=\"{{ getters.trackStyle({ duration, currentIndex, animated }) }}\"\n    >\n      <slot />\n    </view>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tabs/index.wxs",
    "content": "/* eslint-disable */\nfunction tabClass(active, ellipsis) {\n  var classes = ['tab-class'];\n\n  if (active) {\n    classes.push('tab-active-class');\n  }\n\n  if (ellipsis) {\n    classes.push('van-ellipsis');\n  }\n\n  return classes.join(' ');\n}\n\nfunction tabStyle(\n  active,\n  ellipsis,\n  color,\n  type,\n  disabled,\n  activeColor,\n  inactiveColor,\n  swipeThreshold,\n  scrollable\n) {\n  var styles = [];\n  var isCard = type === 'card';\n  // card theme color\n  if (color && isCard) {\n    styles.push('border-color:' + color);\n\n    if (!disabled) {\n      if (active) {\n        styles.push('background-color:' + color);\n      } else {\n        styles.push('color:' + color);\n      }\n    }\n  }\n\n  var titleColor = active ? activeColor : inactiveColor;\n  if (titleColor) {\n    styles.push('color:' + titleColor);\n  }\n\n  if (scrollable && ellipsis) {\n    styles.push('flex-basis:' + 88 / swipeThreshold + '%');\n  }\n\n  return styles.join(';');\n}\n\nfunction tabCardTypeBorderStyle(color, type) {\n  var isCard = type === 'card';\n  var styles = [];\n  if (isCard && color) {\n    styles.push('border-color:' + color);\n  }\n  return styles.join(';');\n}\n\nfunction trackStyle(data) {\n  if (!data.animated) {\n    return '';\n  }\n\n  return [\n    'transform: translate3d(' + -100 * data.currentIndex + '%, 0, 0)',\n    '-webkit-transition-duration: ' + data.duration + 's',\n    'transition-duration: ' + data.duration + 's'\n  ].join(';');\n}\n\nmodule.exports.tabClass = tabClass;\nmodule.exports.tabStyle = tabStyle;\nmodule.exports.trackStyle = trackStyle;\nmodule.exports.tabCardTypeBorderStyle = tabCardTypeBorderStyle;\n"
  },
  {
    "path": "miniprogram/vant/tabs/index.wxss",
    "content": "@import '../common/index.wxss';.van-tabs{position:relative;-webkit-tap-highlight-color:transparent}.van-tabs__wrap{display:-webkit-flex;display:flex;overflow:hidden}.van-tabs__wrap--scrollable .van-tab{-webkit-flex:0 0 22%;flex:0 0 22%}.van-tabs__scroll{background-color:#fff;background-color:var(--tabs-nav-background-color,#fff)}.van-tabs__scroll--line{box-sizing:initial;height:calc(100% + 15px)}.van-tabs__scroll--card{margin:0 16px;margin:0 var(--padding-md,16px)}.van-tabs__scroll::-webkit-scrollbar{display:none}.van-tabs__nav{position:relative;display:-webkit-flex;display:flex;-webkit-user-select:none;user-select:none}.van-tabs__nav--card{box-sizing:border-box;height:30px;height:var(--tabs-card-height,30px);border:1px solid #ee0a24;border:var(--border-width-base,1px) solid var(--tabs-default-color,#ee0a24);border-radius:2px;border-radius:var(--border-radius-sm,2px)}.van-tabs__nav--card .van-tab{color:#ee0a24;color:var(--tabs-default-color,#ee0a24);line-height:28px;line-height:calc(var(--tabs-card-height, 30px) - 2*var(--border-width-base, 1px));border-right:1px solid #ee0a24;border-right:var(--border-width-base,1px) solid var(--tabs-default-color,#ee0a24)}.van-tabs__nav--card .van-tab:last-child{border-right:none}.van-tabs__nav--card .van-tab.van-tab--active{color:#fff;color:var(--white,#fff);background-color:#ee0a24;background-color:var(--tabs-default-color,#ee0a24)}.van-tabs__nav--card .van-tab--disabled{color:#c8c9cc;color:var(--tab-disabled-text-color,#c8c9cc)}.van-tabs__line{position:absolute;bottom:0;left:0;z-index:1;height:3px;height:var(--tabs-bottom-bar-height,3px);border-radius:3px;border-radius:var(--tabs-bottom-bar-height,3px);background-color:#ee0a24;background-color:var(--tabs-bottom-bar-color,#ee0a24)}.van-tabs__track{position:relative;width:100%;height:100%}.van-tabs__track--animated{display:-webkit-flex;display:flex;transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}.van-tabs__content{overflow:hidden}.van-tabs--line .van-tabs__wrap{height:44px;height:var(--tabs-line-height,44px)}.van-tabs--card .van-tabs__wrap{height:30px;height:var(--tabs-card-height,30px)}.van-tab{position:relative;-webkit-flex:1;flex:1;box-sizing:border-box;min-width:0;padding:0 5px;text-align:center;cursor:pointer;color:#646566;color:var(--tab-text-color,#646566);font-size:14px;font-size:var(--tab-font-size,14px);line-height:44px;line-height:var(--tabs-line-height,44px)}.van-tab--active{font-weight:500;font-weight:var(--font-weight-bold,500);color:#323233;color:var(--tab-active-text-color,#323233)}.van-tab--disabled{color:#c8c9cc;color:var(--tab-disabled-text-color,#c8c9cc)}.van-tab--complete{-webkit-flex:1 0 auto!important;flex:1 0 auto!important}.van-tab__title__info{position:relative!important;top:-1px!important;display:inline-block;-webkit-transform:translateX(0)!important;transform:translateX(0)!important}"
  },
  {
    "path": "miniprogram/vant/tag/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tag/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    size: String,\n    mark: Boolean,\n    color: String,\n    plain: Boolean,\n    round: Boolean,\n    textColor: String,\n    type: {\n      type: String,\n      value: 'default',\n    },\n    closeable: Boolean,\n  },\n  methods: {\n    onClose() {\n      this.$emit('close');\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tag/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/tag/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view\n  class=\"custom-class {{ utils.bem('tag', [type, size, { mark, plain, round }]) }} {{ plain ? 'van-hairline--surround' : '' }}\"\n  style=\"{{ color && !plain ? 'background-color: ' + color + ';' : '' }}{{ textColor || (color && plain) ? 'color: ' + (textColor || color) : '' }}\"\n>\n  <slot />\n  <van-icon\n    wx:if=\"{{ closeable }}\"\n    name=\"cross\"\n    custom-class=\"van-tag__close\"\n    bind:click=\"onClose\"\n  />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tag/index.wxss",
    "content": "@import '../common/index.wxss';.van-tag{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;line-height:normal;padding:.2em .5em;padding:var(--tag-padding,.2em .5em);color:#fff;color:var(--tag-text-color,#fff);font-size:10px;font-size:var(--tag-font-size,10px);border-radius:.2em;border-radius:var(--tag-border-radius,.2em)}.van-tag:after{border-color:currentColor;border-radius:.2em * 2;border-radius:var(--tag-border-radius,.2em) * 2}.van-tag--default{background-color:#969799;background-color:var(--tag-default-color,#969799)}.van-tag--default.van-tag--plain{color:#969799;color:var(--tag-default-color,#969799)}.van-tag--danger{background-color:#ee0a24;background-color:var(--tag-dander-color,#ee0a24)}.van-tag--danger.van-tag--plain{color:#ee0a24;color:var(--tag-dander-color,#ee0a24)}.van-tag--primary{background-color:#1989fa;background-color:var(--tag-primary-color,#1989fa)}.van-tag--primary.van-tag--plain{color:#1989fa;color:var(--tag-primary-color,#1989fa)}.van-tag--success{background-color:#07c160;background-color:var(--tag-success-color,#07c160)}.van-tag--success.van-tag--plain{color:#07c160;color:var(--tag-success-color,#07c160)}.van-tag--warning{background-color:#ff976a;background-color:var(--tag-warning-color,#ff976a)}.van-tag--warning.van-tag--plain{color:#ff976a;color:var(--tag-warning-color,#ff976a)}.van-tag--plain{background-color:#fff;background-color:var(--tag-plain-background-color,#fff)}.van-tag--mark{padding-right:.7em}.van-tag--mark,.van-tag--mark:after{border-radius:0 999px 999px 0;border-radius:0 var(--tag-round-border-radius,999px) var(--tag-round-border-radius,999px) 0}.van-tag--round,.van-tag--round:after{border-radius:999px;border-radius:var(--tag-round-border-radius,999px)}.van-tag--medium{font-size:12px;font-size:var(--tag-medium-font-size,12px)}.van-tag--large{font-size:14px;font-size:var(--tag-large-font-size,14px)}.van-tag__close{margin-left:2px}"
  },
  {
    "path": "miniprogram/vant/toast/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/toast/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  props: {\n    show: Boolean,\n    mask: Boolean,\n    message: String,\n    forbidClick: Boolean,\n    zIndex: {\n      type: Number,\n      value: 1000,\n    },\n    type: {\n      type: String,\n      value: 'text',\n    },\n    loadingType: {\n      type: String,\n      value: 'circular',\n    },\n    position: {\n      type: String,\n      value: 'middle',\n    },\n  },\n  methods: {\n    // for prevent touchmove\n    noop() {},\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/toast/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\",\n    \"van-overlay\": \"../overlay/index\",\n    \"van-transition\": \"../transition/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/toast/index.wxml",
    "content": "<van-overlay\n  wx:if=\"{{ mask || forbidClick }}\"\n  show=\"{{ show }}\"\n  z-index=\"{{ zIndex }}\"\n  custom-style=\"{{ mask ? '' : 'background-color: transparent;' }}\"\n/>\n<van-transition\n  show=\"{{ show }}\"\n  custom-style=\"z-index: {{ zIndex }}\"\n  custom-class=\"van-toast__container\"\n>\n  <view\n    class=\"van-toast van-toast--{{ type === 'text' ? 'text' : 'icon' }} van-toast--{{ position }}\"\n    catch:touchmove=\"noop\"\n  >\n    <!-- text only -->\n    <text wx:if=\"{{ type === 'text' }}\">{{ message }}</text>\n\n    <!-- with icon -->\n    <block wx:else>\n      <van-loading\n        wx:if=\"{{ type === 'loading' }}\"\n        color=\"white\"\n        type=\"{{ loadingType }}\"\n        custom-class=\"van-toast__loading\"\n      />\n      <van-icon wx:else class=\"van-toast__icon\" name=\"{{ type }}\" />\n      <text wx:if=\"{{ message }}\" class=\"van-toast__text\">{{ message }}</text>\n    </block>\n\n    <slot />\n  </view>\n</van-transition>\n"
  },
  {
    "path": "miniprogram/vant/toast/index.wxss",
    "content": "@import '../common/index.wxss';.van-toast{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:initial;color:#fff;color:var(--toast-text-color,#fff);font-size:14px;font-size:var(--toast-font-size,14px);line-height:20px;line-height:var(--toast-line-height,20px);white-space:pre-wrap;word-wrap:break-word;background-color:rgba(50,50,51,.88);background-color:var(--toast-background-color,rgba(50,50,51,.88));border-radius:4px;border-radius:var(--toast-border-radius,4px)}.van-toast__container{position:fixed;top:50%;left:50%;width:-webkit-fit-content;width:fit-content;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:70%;max-width:var(--toast-max-width,70%)}.van-toast--text{min-width:96px;min-width:var(--toast-text-min-width,96px);padding:8px 12px;padding:var(--toast-text-padding,8px 12px)}.van-toast--icon{width:90px;width:var(--toast-default-width,90px);min-height:90px;min-height:var(--toast-default-min-height,90px);padding:16px;padding:var(--toast-default-padding,16px)}.van-toast--icon .van-toast__icon{font-size:48px;font-size:var(--toast-icon-size,48px)}.van-toast--icon .van-toast__text{padding-top:8px}.van-toast__loading{margin:10px 0}.van-toast--top{-webkit-transform:translateY(-30vh);transform:translateY(-30vh)}.van-toast--bottom{-webkit-transform:translateY(30vh);transform:translateY(30vh)}"
  },
  {
    "path": "miniprogram/vant/toast/toast.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ndeclare type ToastMessage = string | number;\ninterface ToastOptions {\n    show?: boolean;\n    type?: string;\n    mask?: boolean;\n    zIndex?: number;\n    context?: WechatMiniprogram.Component.TrivialInstance | WechatMiniprogram.Page.TrivialInstance;\n    position?: string;\n    duration?: number;\n    selector?: string;\n    forbidClick?: boolean;\n    loadingType?: string;\n    message?: ToastMessage;\n    onClose?: () => void;\n}\ndeclare function Toast(toastOptions: ToastOptions | ToastMessage): WechatMiniprogram.Component.TrivialInstance;\ndeclare namespace Toast {\n    var loading: (options: string | number | ToastOptions) => WechatMiniprogram.Component.Instance<Record<string, any>, Record<string, any>, Record<string, any>>;\n    var success: (options: string | number | ToastOptions) => WechatMiniprogram.Component.Instance<Record<string, any>, Record<string, any>, Record<string, any>>;\n    var fail: (options: string | number | ToastOptions) => WechatMiniprogram.Component.Instance<Record<string, any>, Record<string, any>, Record<string, any>>;\n    var clear: () => void;\n    var setDefaultOptions: (options: ToastOptions) => void;\n    var resetDefaultOptions: () => void;\n}\nexport default Toast;\n"
  },
  {
    "path": "miniprogram/vant/toast/toast.js",
    "content": "import { isObj } from '../common/utils';\nconst defaultOptions = {\n  type: 'text',\n  mask: false,\n  message: '',\n  show: true,\n  zIndex: 1000,\n  duration: 2000,\n  position: 'middle',\n  forbidClick: false,\n  loadingType: 'circular',\n  selector: '#van-toast',\n};\nlet queue = [];\nlet currentOptions = Object.assign({}, defaultOptions);\nfunction parseOptions(message) {\n  return isObj(message) ? message : { message };\n}\nfunction getContext() {\n  const pages = getCurrentPages();\n  return pages[pages.length - 1];\n}\nfunction Toast(toastOptions) {\n  const options = Object.assign(\n    Object.assign({}, currentOptions),\n    parseOptions(toastOptions)\n  );\n  const context = options.context || getContext();\n  const toast = context.selectComponent(options.selector);\n  if (!toast) {\n    console.warn('未找到 van-toast 节点，请确认 selector 及 context 是否正确');\n    return;\n  }\n  delete options.context;\n  delete options.selector;\n  toast.clear = () => {\n    toast.setData({ show: false });\n    if (options.onClose) {\n      options.onClose();\n    }\n  };\n  queue.push(toast);\n  toast.setData(options);\n  clearTimeout(toast.timer);\n  if (options.duration > 0) {\n    toast.timer = setTimeout(() => {\n      toast.clear();\n      queue = queue.filter((item) => item !== toast);\n    }, options.duration);\n  }\n  return toast;\n}\nconst createMethod = (type) => (options) =>\n  Toast(Object.assign({ type }, parseOptions(options)));\nToast.loading = createMethod('loading');\nToast.success = createMethod('success');\nToast.fail = createMethod('fail');\nToast.clear = () => {\n  queue.forEach((toast) => {\n    toast.clear();\n  });\n  queue = [];\n};\nToast.setDefaultOptions = (options) => {\n  Object.assign(currentOptions, options);\n};\nToast.resetDefaultOptions = () => {\n  currentOptions = Object.assign({}, defaultOptions);\n};\nexport default Toast;\n"
  },
  {
    "path": "miniprogram/vant/transition/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/transition/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { transition } from '../mixins/transition';\nVantComponent({\n  classes: [\n    'enter-class',\n    'enter-active-class',\n    'enter-to-class',\n    'leave-class',\n    'leave-active-class',\n    'leave-to-class',\n  ],\n  mixins: [transition(true)],\n});\n"
  },
  {
    "path": "miniprogram/vant/transition/index.json",
    "content": "{\n  \"component\": true\n}\n"
  },
  {
    "path": "miniprogram/vant/transition/index.wxml",
    "content": "<view\n  wx:if=\"{{ inited }}\"\n  class=\"van-transition custom-class {{ classes }}\"\n  style=\"-webkit-transition-duration:{{ currentDuration }}ms; transition-duration:{{ currentDuration }}ms; {{ display ? '' : 'display: none;' }} {{ customStyle }}\"\n  bind:transitionend=\"onTransitionEnd\"\n>\n  <slot />\n</view>\n"
  },
  {
    "path": "miniprogram/vant/transition/index.wxss",
    "content": "@import '../common/index.wxss';.van-transition{transition-timing-function:ease}.van-fade-enter-active,.van-fade-leave-active{transition-property:opacity}.van-fade-enter,.van-fade-leave-to{opacity:0}.van-fade-down-enter-active,.van-fade-down-leave-active,.van-fade-left-enter-active,.van-fade-left-leave-active,.van-fade-right-enter-active,.van-fade-right-leave-active,.van-fade-up-enter-active,.van-fade-up-leave-active{transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.van-fade-up-enter,.van-fade-up-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);opacity:0}.van-fade-down-enter,.van-fade-down-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);opacity:0}.van-fade-left-enter,.van-fade-left-leave-to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);opacity:0}.van-fade-right-enter,.van-fade-right-leave-to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);opacity:0}.van-slide-down-enter-active,.van-slide-down-leave-active,.van-slide-left-enter-active,.van-slide-left-leave-active,.van-slide-right-enter-active,.van-slide-right-leave-active,.van-slide-up-enter-active,.van-slide-up-leave-active{transition-property:-webkit-transform;transition-property:transform;transition-property:transform,-webkit-transform}.van-slide-up-enter,.van-slide-up-leave-to{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.van-slide-down-enter,.van-slide-down-leave-to{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.van-slide-left-enter,.van-slide-left-leave-to{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.van-slide-right-enter,.van-slide-right-leave-to{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}"
  },
  {
    "path": "miniprogram/vant/tree-select/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/tree-select/index.js",
    "content": "import { VantComponent } from '../common/component';\nVantComponent({\n  classes: [\n    'main-item-class',\n    'content-item-class',\n    'main-active-class',\n    'content-active-class',\n    'main-disabled-class',\n    'content-disabled-class',\n  ],\n  props: {\n    items: {\n      type: Array,\n      observer: 'updateSubItems',\n    },\n    activeId: null,\n    mainActiveIndex: {\n      type: Number,\n      value: 0,\n      observer: 'updateSubItems',\n    },\n    height: {\n      type: [Number, String],\n      value: 300,\n    },\n    max: {\n      type: Number,\n      value: Infinity,\n    },\n  },\n  data: {\n    subItems: [],\n  },\n  methods: {\n    // 当一个子项被选择时\n    onSelectItem(event) {\n      const { item } = event.currentTarget.dataset;\n      const isArray = Array.isArray(this.data.activeId);\n      // 判断有没有超出右侧选择的最大数\n      const isOverMax = isArray && this.data.activeId.length >= this.data.max;\n      // 判断该项有没有被选中, 如果有被选中，则忽视是否超出的条件\n      const isSelected = isArray\n        ? this.data.activeId.indexOf(item.id) > -1\n        : this.data.activeId === item.id;\n      if (!item.disabled && (!isOverMax || isSelected)) {\n        this.$emit('click-item', item);\n      }\n    },\n    // 当一个导航被点击时\n    onClickNav(event) {\n      const index = event.detail;\n      const item = this.data.items[index];\n      if (!item.disabled) {\n        this.$emit('click-nav', { index });\n      }\n    },\n    // 更新子项列表\n    updateSubItems() {\n      const { items, mainActiveIndex } = this.data;\n      const { children = [] } = items[mainActiveIndex] || {};\n      return this.set({ subItems: children });\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/tree-select/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-sidebar\": \"../sidebar/index\",\n    \"van-sidebar-item\": \"../sidebar-item/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/tree-select/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n<wxs src=\"./index.wxs\" module=\"wxs\" />\n\n<view\n  class=\"van-tree-select\"\n  style=\"height: {{ utils.addUnit(height) }}\"\n>\n  <scroll-view scroll-y class=\"van-tree-select__nav\">\n    <van-sidebar active-key=\"{{ mainActiveIndex }}\" bind:change=\"onClickNav\" custom-class=\"van-tree-select__nav__inner\">\n      <van-sidebar-item\n        wx:for=\"{{ items }}\"\n        wx:key=\"index\"\n        custom-class=\"main-item-class\"\n        active-class=\"main-active-class\"\n        disabled-class=\"main-disabled-class\"\n        title=\"{{ item.text }}\"\n        disabled=\"{{ item.disabled }}\"\n      />\n    </van-sidebar>\n  </scroll-view>\n  <scroll-view scroll-y class=\"van-tree-select__content\">\n    <slot name=\"content\" />\n    <view\n      wx:for=\"{{ subItems }}\"\n      wx:key=\"id\"\n      class=\"van-ellipsis content-item-class {{ utils.bem('tree-select__item', { active: wxs.isActive(activeId, item.id), disabled: item.disabled }) }} {{ wxs.isActive(activeId, item.id) ? 'content-active-class' : '' }} {{ item.disabled ? 'content-disabled-class' : '' }}\"\n      data-item=\"{{ item }}\"\n      bind:tap=\"onSelectItem\"\n    >\n      {{ item.text }}\n      <van-icon\n        wx:if=\"{{ wxs.isActive(activeId, item.id) }}\"\n        name=\"checked\"\n        size=\"16px\"\n        class=\"van-tree-select__selected\"\n      />\n    </view>\n  </scroll-view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/tree-select/index.wxs",
    "content": "/* eslint-disable */\nvar array = require('../wxs/array.wxs');\n\nfunction isActive (activeList, itemId) {\n  if (array.isArray(activeList)) {\n    return activeList.indexOf(itemId) > -1;\n  }\n\n  return activeList === itemId;\n}\n\nmodule.exports.isActive = isActive;\n"
  },
  {
    "path": "miniprogram/vant/tree-select/index.wxss",
    "content": "@import '../common/index.wxss';.van-tree-select{position:relative;display:-webkit-flex;display:flex;-webkit-user-select:none;user-select:none;font-size:14px;font-size:var(--tree-select-font-size,14px)}.van-tree-select__nav{-webkit-flex:1;flex:1;background-color:#f7f8fa;background-color:var(--tree-select-nav-background-color,#f7f8fa);--sidebar-padding:12px 8px 12px 12px}.van-tree-select__nav__inner{width:100%!important;height:100%}.van-tree-select__content{-webkit-flex:2;flex:2;background-color:#fff;background-color:var(--tree-select-content-background-color,#fff)}.van-tree-select__item{position:relative;font-weight:700;padding:0 32px 0 16px;padding:0 32px 0 var(--padding-md,16px);line-height:44px;line-height:var(--tree-select-item-height,44px)}.van-tree-select__item--active{color:#ee0a24;color:var(--tree-select-item-active-color,#ee0a24)}.van-tree-select__item--disabled{color:#c8c9cc;color:var(--tree-select-item-disabled-color,#c8c9cc)}.van-tree-select__selected{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);right:16px;right:var(--padding-md,16px)}"
  },
  {
    "path": "miniprogram/vant/uploader/index.d.ts",
    "content": "export {};\n"
  },
  {
    "path": "miniprogram/vant/uploader/index.js",
    "content": "import { VantComponent } from '../common/component';\nimport { isImageFile, isVideo, chooseFile, isPromise } from './utils';\nimport { chooseImageProps, chooseVideoProps } from './shared';\nVantComponent({\n  props: Object.assign(\n    Object.assign(\n      {\n        disabled: Boolean,\n        multiple: Boolean,\n        uploadText: String,\n        useBeforeRead: Boolean,\n        afterRead: null,\n        beforeRead: null,\n        previewSize: {\n          type: null,\n          value: 90,\n        },\n        name: {\n          type: [Number, String],\n          value: '',\n        },\n        accept: {\n          type: String,\n          value: 'image',\n        },\n        fileList: {\n          type: Array,\n          value: [],\n          observer: 'formatFileList',\n        },\n        maxSize: {\n          type: Number,\n          value: Number.MAX_VALUE,\n        },\n        maxCount: {\n          type: Number,\n          value: 100,\n        },\n        deletable: {\n          type: Boolean,\n          value: true,\n        },\n        showUpload: {\n          type: Boolean,\n          value: true,\n        },\n        previewImage: {\n          type: Boolean,\n          value: true,\n        },\n        previewFullImage: {\n          type: Boolean,\n          value: true,\n        },\n        imageFit: {\n          type: String,\n          value: 'scaleToFill',\n        },\n        uploadIcon: {\n          type: String,\n          value: 'photograph',\n        },\n      },\n      chooseImageProps\n    ),\n    chooseVideoProps\n  ),\n  data: {\n    lists: [],\n    isInCount: true,\n  },\n  methods: {\n    formatFileList() {\n      const { fileList = [], maxCount } = this.data;\n      const lists = fileList.map((item) =>\n        Object.assign(Object.assign({}, item), {\n          isImage:\n            typeof item.isImage === 'undefined'\n              ? isImageFile(item)\n              : item.isImage,\n        })\n      );\n      this.setData({ lists, isInCount: lists.length < maxCount });\n    },\n    getDetail(index) {\n      return {\n        name: this.data.name,\n        index: index == null ? this.data.fileList.length : index,\n      };\n    },\n    startUpload() {\n      const { maxCount, multiple, accept, lists, disabled } = this.data;\n      if (disabled) return;\n      chooseFile(\n        Object.assign(Object.assign({}, this.data), {\n          maxCount: maxCount - lists.length,\n        })\n      )\n        .then((res) => {\n          let file = null;\n          if (isVideo(res, accept)) {\n            file = Object.assign({ path: res.tempFilePath }, res);\n          } else {\n            file = multiple ? res.tempFiles : res.tempFiles[0];\n          }\n          this.onBeforeRead(file);\n        })\n        .catch((error) => {\n          this.$emit('error', error);\n        });\n    },\n    onBeforeRead(file) {\n      const { beforeRead, useBeforeRead } = this.data;\n      let res = true;\n      if (typeof beforeRead === 'function') {\n        res = beforeRead(file, this.getDetail());\n      }\n      if (useBeforeRead) {\n        res = new Promise((resolve, reject) => {\n          this.$emit(\n            'before-read',\n            Object.assign(Object.assign({ file }, this.getDetail()), {\n              callback: (ok) => {\n                ok ? resolve() : reject();\n              },\n            })\n          );\n        });\n      }\n      if (!res) {\n        return;\n      }\n      if (isPromise(res)) {\n        res.then((data) => this.onAfterRead(data || file));\n      } else {\n        this.onAfterRead(file);\n      }\n    },\n    onAfterRead(file) {\n      const { maxSize } = this.data;\n      const oversize = Array.isArray(file)\n        ? file.some((item) => item.size > maxSize)\n        : file.size > maxSize;\n      if (oversize) {\n        this.$emit('oversize', Object.assign({ file }, this.getDetail()));\n        return;\n      }\n      if (typeof this.data.afterRead === 'function') {\n        this.data.afterRead(file, this.getDetail());\n      }\n      this.$emit('after-read', Object.assign({ file }, this.getDetail()));\n    },\n    deleteItem(event) {\n      const { index } = event.currentTarget.dataset;\n      this.$emit(\n        'delete',\n        Object.assign(Object.assign({}, this.getDetail(index)), {\n          file: this.data.fileList[index],\n        })\n      );\n    },\n    onPreviewImage(event) {\n      if (!this.data.previewFullImage) return;\n      const { index } = event.currentTarget.dataset;\n      const { lists } = this.data;\n      const item = lists[index];\n      wx.previewImage({\n        urls: lists\n          .filter((item) => item.isImage)\n          .map((item) => item.url || item.path),\n        current: item.url || item.path,\n        fail() {\n          wx.showToast({ title: '预览图片失败', icon: 'none' });\n        },\n      });\n    },\n    onClickPreview(event) {\n      const { index } = event.currentTarget.dataset;\n      const item = this.data.lists[index];\n      this.$emit(\n        'click-preview',\n        Object.assign(Object.assign({}, item), this.getDetail(index))\n      );\n    },\n  },\n});\n"
  },
  {
    "path": "miniprogram/vant/uploader/index.json",
    "content": "{\n  \"component\": true,\n  \"usingComponents\": {\n    \"van-icon\": \"../icon/index\",\n    \"van-loading\": \"../loading/index\"\n  }\n}\n"
  },
  {
    "path": "miniprogram/vant/uploader/index.wxml",
    "content": "<wxs src=\"../wxs/utils.wxs\" module=\"utils\" />\n\n<view class=\"van-uploader\">\n  <view class=\"van-uploader__wrapper\">\n    <!-- 预览样式 -->\n    <view\n      wx:if=\"{{ previewImage }}\"\n      wx:for=\"{{ lists }}\"\n      wx:key=\"index\"\n      class=\"van-uploader__preview\"\n      data-index=\"{{ index }}\"\n      bindtap=\"onClickPreview\"\n    >\n      <image\n        wx:if=\"{{ item.isImage }}\"\n        mode=\"{{ imageFit }}\"\n        src=\"{{ item.url || item.path }}\"\n        alt=\"{{ item.name || ('图片' + index) }}\"\n        class=\"van-uploader__preview-image\"\n        style=\"width: {{ utils.addUnit(previewSize) }}; height: {{ utils.addUnit(previewSize) }};\"\n        data-index=\"{{ index }}\"\n        bind:tap=\"onPreviewImage\"\n      />\n      <view\n        wx:else\n        class=\"van-uploader__file\"\n        style=\"width: {{ utils.addUnit(previewSize) }}; height: {{ utils.addUnit(previewSize) }};\"\n      >\n        <van-icon name=\"description\" class=\"van-uploader__file-icon\" />\n        <view class=\"van-uploader__file-name van-ellipsis\">{{ item.name || item.url || item.path }}</view>\n      </view>\n      <view\n        wx:if=\"{{ item.status === 'uploading' || item.status === 'failed' }}\"\n        class=\"van-uploader__mask\"\n      >\n       <van-icon wx:if=\"{{ item.status === 'failed' }}\" name=\"warning-o\" class=\"van-uploader__mask-icon\" />\n       <van-loading wx:else class=\"van-uploader__loading\" />\n       <text wx:if=\"{{ item.message }}\" class=\"van-uploader__upload-text\">{{ item.message }}</text>\n      </view>\n      <van-icon\n        wx:if=\"{{ deletable }}\"\n        name=\"clear\"\n        class=\"van-uploader__preview-delete\"\n        data-index=\"{{ index }}\"\n        bind:tap=\"deleteItem\"\n      />\n    </view>\n\n    <!-- 上传样式 -->\n    <block wx:if=\"{{ isInCount }}\">\n      <view class=\"van-uploader__slot\" bind:tap=\"startUpload\">\n        <slot />\n      </view>\n\n      <!-- 默认上传样式 -->\n      <view\n        wx:if=\"{{ showUpload }}\"\n        class=\"van-uploader__upload {{ disabled ? 'van-uploader__upload--disabled': ''}}\"\n        style=\"width: {{ utils.addUnit(previewSize) }}; height: {{ utils.addUnit(previewSize) }};\"\n        bind:tap=\"startUpload\"\n      >\n        <van-icon name=\"{{ uploadIcon }}\" class=\"van-uploader__upload-icon\" />\n        <text wx:if=\"{{ uploadText }}\" class=\"van-uploader__upload-text\">{{ uploadText }}</text>\n      </view>\n    </block>\n  </view>\n</view>\n"
  },
  {
    "path": "miniprogram/vant/uploader/index.wxss",
    "content": "@import '../common/index.wxss';.van-uploader{position:relative;display:inline-block}.van-uploader__wrapper{display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.van-uploader__slot:empty{display:none}.van-uploader__slot:not(:empty)+.van-uploader__upload{display:none!important}.van-uploader__upload{position:relative;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;width:80px;height:80px;margin:0 8px 8px 0;background-color:#f7f8fa;border-radius:8px}.van-uploader__upload:active{background-color:#f2f3f5}.van-uploader__upload-icon{color:#dcdee0;font-size:24px}.van-uploader__upload-text{margin-top:8px;color:#969799;font-size:12px}.van-uploader__upload--disabled{opacity:.5;opacity:var(--uploader-disabled-opacity,.5)}.van-uploader__preview{position:relative;margin:0 8px 8px 0;cursor:pointer}.van-uploader__preview-image{display:block;width:80px;height:80px;overflow:hidden;border-radius:8px}.van-uploader__preview-delete{position:absolute;top:-8px;right:-8px;color:#969799;font-size:18px;background-color:#fff;border-radius:100%}.van-uploader__file{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;width:80px;height:80px;background-color:#f7f8fa;border-radius:8px}.van-uploader__file-icon{color:#646566;font-size:20px}.van-uploader__file-name{box-sizing:border-box;width:100%;margin-top:8px;padding:0 4px;color:#646566;font-size:12px;text-align:center}.van-uploader__mask{position:absolute;top:0;right:0;bottom:0;left:0;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#fff;background-color:rgba(50,50,51,.88);border-radius:8px}.van-uploader__mask-icon{font-size:22px}.van-uploader__mask-message{margin-top:6px;padding:0 4px;font-size:12px;line-height:14px}.van-uploader__loading{width:22px;height:22px;color:#fff}"
  },
  {
    "path": "miniprogram/vant/uploader/shared.d.ts",
    "content": "export declare const chooseImageProps: {\n    sizeType: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    capture: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n};\nexport declare const chooseVideoProps: {\n    capture: {\n        type: ArrayConstructor;\n        value: string[];\n    };\n    compressed: {\n        type: BooleanConstructor;\n        value: boolean;\n    };\n    maxDuration: {\n        type: NumberConstructor;\n        value: number;\n    };\n    camera: {\n        type: StringConstructor;\n        value: string;\n    };\n};\n"
  },
  {
    "path": "miniprogram/vant/uploader/shared.js",
    "content": "// props for choose image\nexport const chooseImageProps = {\n  sizeType: {\n    type: Array,\n    value: ['original', 'compressed'],\n  },\n  capture: {\n    type: Array,\n    value: ['album', 'camera'],\n  },\n};\n// props for choose video\nexport const chooseVideoProps = {\n  capture: {\n    type: Array,\n    value: ['album', 'camera'],\n  },\n  compressed: {\n    type: Boolean,\n    value: true,\n  },\n  maxDuration: {\n    type: Number,\n    value: 60,\n  },\n  camera: {\n    type: String,\n    value: 'back',\n  },\n};\n"
  },
  {
    "path": "miniprogram/vant/uploader/utils.d.ts",
    "content": "/// <reference types=\"miniprogram-api-typings\" />\ninterface File {\n  path: string;\n  url: string;\n  size: number;\n  name: string;\n  type: string;\n  time: number;\n  image: boolean;\n}\nexport declare function isImageFile(item: File): boolean;\nexport declare function isVideo(\n  res: any,\n  accept: string\n): res is WechatMiniprogram.ChooseVideoSuccessCallbackResult;\nexport declare function chooseFile({\n  accept,\n  multiple,\n  capture,\n  compressed,\n  maxDuration,\n  sizeType,\n  camera,\n  maxCount,\n}: {\n  accept: any;\n  multiple: any;\n  capture: any;\n  compressed: any;\n  maxDuration: any;\n  sizeType: any;\n  camera: any;\n  maxCount: any;\n}): Promise<\n  | WechatMiniprogram.ChooseImageSuccessCallbackResult\n  | WechatMiniprogram.ChooseMediaSuccessCallbackResult\n  | WechatMiniprogram.ChooseVideoSuccessCallbackResult\n  | WechatMiniprogram.ChooseMessageFileSuccessCallbackResult\n>;\nexport declare function isFunction(val: unknown): val is Function;\nexport declare function isObject(val: any): val is Record<any, any>;\nexport declare function isPromise<T = any>(val: unknown): val is Promise<T>;\nexport {};\n"
  },
  {
    "path": "miniprogram/vant/uploader/utils.js",
    "content": "const IMAGE_REGEXP = /\\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i;\nfunction isImageUrl(url) {\n  return IMAGE_REGEXP.test(url);\n}\nexport function isImageFile(item) {\n  if (item.type) {\n    return item.type.indexOf('image') === 0;\n  }\n  if (item.path) {\n    return isImageUrl(item.path);\n  }\n  if (item.url) {\n    return isImageUrl(item.url);\n  }\n  return false;\n}\nexport function isVideo(res, accept) {\n  return accept === 'video';\n}\nexport function chooseFile({\n  accept,\n  multiple,\n  capture,\n  compressed,\n  maxDuration,\n  sizeType,\n  camera,\n  maxCount,\n}) {\n  switch (accept) {\n    case 'image':\n      return new Promise((resolve, reject) => {\n        wx.chooseImage({\n          count: multiple ? Math.min(maxCount, 9) : 1,\n          sourceType: capture,\n          sizeType,\n          success: resolve,\n          fail: reject,\n        });\n      });\n    case 'media':\n      return new Promise((resolve, reject) => {\n        wx.chooseMedia({\n          count: multiple ? Math.min(maxCount, 9) : 1,\n          sourceType: capture,\n          maxDuration,\n          sizeType,\n          camera,\n          success: resolve,\n          fail: reject,\n        });\n      });\n    case 'video':\n      return new Promise((resolve, reject) => {\n        wx.chooseVideo({\n          sourceType: capture,\n          compressed,\n          maxDuration,\n          camera,\n          success: resolve,\n          fail: reject,\n        });\n      });\n    default:\n      return new Promise((resolve, reject) => {\n        wx.chooseMessageFile({\n          count: multiple ? maxCount : 1,\n          type: 'file',\n          success: resolve,\n          fail: reject,\n        });\n      });\n  }\n}\nexport function isFunction(val) {\n  return typeof val === 'function';\n}\nexport function isObject(val) {\n  return val !== null && typeof val === 'object';\n}\nexport function isPromise(val) {\n  return isObject(val) && isFunction(val.then) && isFunction(val.catch);\n}\n"
  },
  {
    "path": "miniprogram/vant/wxs/add-unit.wxs",
    "content": "/* eslint-disable */\nvar REGEXP = getRegExp('^\\d+(\\.\\d+)?$');\n\nfunction addUnit(value) {\n  if (value == null) {\n    return undefined;\n  }\n\n  return REGEXP.test('' + value) ? value + 'px' : value;\n}\n\nmodule.exports = {\n  addUnit: addUnit\n};\n"
  },
  {
    "path": "miniprogram/vant/wxs/array.wxs",
    "content": "function isArray(array) {\n  return array && array.constructor === 'Array';\n}\n\nmodule.exports.isArray = isArray;\n"
  },
  {
    "path": "miniprogram/vant/wxs/bem.wxs",
    "content": "var array = require('./array.wxs');\nvar object = require('./object.wxs');\nvar PREFIX = 'van-';\n\nfunction join(name, mods) {\n  name = PREFIX + name;\n  mods = mods.map(function(mod) {\n    return name + '--' + mod;\n  });\n  mods.unshift(name);\n  return mods.join(' ');\n}\n\nfunction traversing(mods, conf) {\n  if (!conf) {\n    return;\n  }\n\n  if (typeof conf === 'string' || typeof conf === 'number') {\n    mods.push(conf);\n  } else if (array.isArray(conf)) {\n    conf.forEach(function(item) {\n      traversing(mods, item);\n    });\n  } else if (typeof conf === 'object') {\n    object.keys(conf).forEach(function(key) {\n      conf[key] && mods.push(key);\n    });\n  }\n}\n\nfunction bem(name, conf) {\n  var mods = [];\n  traversing(mods, conf);\n  return join(name, mods);\n}\n\nmodule.exports.bem = bem;\n"
  },
  {
    "path": "miniprogram/vant/wxs/memoize.wxs",
    "content": "/**\n * Simple memoize\n * wxs doesn't support fn.apply, so this memoize only support up to 2 args\n */\n\nfunction isPrimitive(value) {\n  var type = typeof value;\n  return (\n    type === 'boolean' ||\n    type === 'number' ||\n    type === 'string' ||\n    type === 'undefined' ||\n    value === null\n  );\n}\n\n// mock simple fn.call in wxs\nfunction call(fn, args) {\n  if (args.length === 2) {\n    return fn(args[0], args[1]);\n  }\n\n  if (args.length === 1) {\n    return fn(args[0]);\n  }\n\n  return fn();\n}\n\nfunction serializer(args) {\n  if (args.length === 1 && isPrimitive(args[0])) {\n    return args[0];\n  }\n  var obj = {};\n  for (var i = 0; i < args.length; i++) {\n    obj['key' + i] = args[i];\n  }\n  return JSON.stringify(obj);\n}\n\nfunction memoize(fn) {\n  var cache = {};\n\n  return function() {\n    var key = serializer(arguments);\n    if (cache[key] === undefined) {\n      cache[key] = call(fn, arguments);\n    }\n\n    return cache[key];\n  };\n}\n\nmodule.exports.memoize = memoize;\n"
  },
  {
    "path": "miniprogram/vant/wxs/object.wxs",
    "content": "/* eslint-disable */\nvar REGEXP = getRegExp('{|}|\"', 'g');\n\nfunction keys(obj) {\n  return JSON.stringify(obj)\n    .replace(REGEXP, '')\n    .split(',')\n    .map(function(item) {\n      return item.split(':')[0];\n    });\n}\n\nmodule.exports.keys = keys;\n"
  },
  {
    "path": "miniprogram/vant/wxs/utils.wxs",
    "content": "/* eslint-disable */\nvar bem = require('./bem.wxs').bem;\nvar memoize = require('./memoize.wxs').memoize;\nvar addUnit = require('./add-unit.wxs').addUnit;\n\nmodule.exports = {\n  bem: memoize(bem),\n  memoize: memoize,\n  addUnit: addUnit\n};\n"
  },
  {
    "path": "project.config.json",
    "content": "{\n  \"miniprogramRoot\": \"miniprogram/\",\n  \"cloudfunctionRoot\": \"cloudfunctions/\",\n  \"setting\": {\n    \"urlCheck\": true,\n    \"es6\": true,\n    \"enhance\": true,\n    \"postcss\": true,\n    \"preloadBackgroundData\": false,\n    \"minified\": true,\n    \"newFeature\": true,\n    \"coverView\": true,\n    \"nodeModules\": false,\n    \"autoAudits\": false,\n    \"showShadowRootInWxmlPanel\": true,\n    \"scopeDataCheck\": false,\n    \"uglifyFileName\": false,\n    \"checkInvalidKey\": true,\n    \"checkSiteMap\": true,\n    \"uploadWithSourceMap\": true,\n    \"compileHotReLoad\": false,\n    \"useMultiFrameRuntime\": false,\n    \"useApiHook\": false,\n    \"babelSetting\": {\n      \"ignore\": [],\n      \"disablePlugins\": [],\n      \"outputPath\": \"\"\n    },\n    \"useIsolateContext\": true,\n    \"useCompilerModule\": true,\n    \"userConfirmedUseCompilerModuleSwitch\": false,\n    \"packNpmManually\": false,\n    \"packNpmRelationList\": []\n  },\n  \"appid\": \"wxd6beb52c8602bff4\",\n  \"projectname\": \"%E6%A0%A1%E5%9B%AD%E4%BA%8C%E6%89%8B%E4%B9%A6\",\n  \"libVersion\": \"2.12.0\",\n  \"simulatorType\": \"wechat\",\n  \"simulatorPluginLibVersion\": {},\n  \"cloudfunctionTemplateRoot\": \"cloudfunctionTemplate\",\n  \"condition\": {\n    \"search\": {\n      \"current\": -1,\n      \"list\": []\n    },\n    \"conversation\": {\n      \"current\": -1,\n      \"list\": []\n    },\n    \"plugin\": {\n      \"current\": -1,\n      \"list\": []\n    },\n    \"game\": {\n      \"list\": []\n    },\n    \"gamePlugin\": {\n      \"current\": -1,\n      \"list\": []\n    },\n    \"miniprogram\": {\n      \"current\": 17,\n      \"list\": [\n        {\n          \"id\": -1,\n          \"name\": \"db guide\",\n          \"pathName\": \"pages/databaseGuide/databaseGuide\",\n          \"query\": \"\"\n        },\n        {\n          \"id\": -1,\n          \"name\": \"注册\",\n          \"pathName\": \"pages/login/login\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"发布\",\n          \"pathName\": \"pages/publish/publish\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": 3,\n          \"name\": \"详情页\",\n          \"pathName\": \"pages/detail/detail\",\n          \"query\": \"scene=3c4c6d855d70f8b6124543920c2934e6\",\n          \"scene\": null\n        },\n        {\n          \"id\": 4,\n          \"name\": \"支付成功\",\n          \"pathName\": \"pages/success/success\",\n          \"query\": \"id=efdeb2615d72487b1319b22650cd56cb\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"【订单】详情\",\n          \"pathName\": \"pages/order/detail/detail\",\n          \"query\": \"id=5d262bd45d7264f5134049797256c6f9\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"【订单】列表\",\n          \"pathName\": \"pages/order/list/list\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"个人中心\",\n          \"pathName\": \"pages/my/my\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"关于我们\",\n          \"pathName\": \"pages/about/about\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"钱包\",\n          \"pathName\": \"pages/parse/parse\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"充值\",\n          \"pathName\": \"pages/recharge/recharge\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"提现\",\n          \"pathName\": \"pages/reflect/reflect\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": 12,\n          \"name\": \"我的发布【列表】\",\n          \"pathName\": \"pages/sell/list/list\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": 13,\n          \"name\": \"我的发布【详情】\",\n          \"pathName\": \"pages/sell/detail/detail\",\n          \"query\": \"id=efdeb2615d70eb6012393ac94afadcf6\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"搜索\",\n          \"pathName\": \"pages/search/search\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"首页\",\n          \"pathName\": \"pages/index/index\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"【编辑资料】\",\n          \"pathName\": \"pages/edit/edit\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"帮助中心\",\n          \"pathName\": \"pages/help/help\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"pages/about/about\",\n          \"pathName\": \"pages/about/about\",\n          \"query\": \"\",\n          \"scene\": null\n        },\n        {\n          \"id\": -1,\n          \"name\": \"pages/message/message\",\n          \"pathName\": \"pages/message/message\",\n          \"scene\": null\n        }\n      ]\n    }\n  }\n}"
  }
]