diff --git a/2024-shenzhen-FinTechathon/SpotOn/README.md b/2024-shenzhen-FinTechathon/SpotOn/README.md
new file mode 100644
index 000000000..ee8fbc726
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/README.md
@@ -0,0 +1,163 @@
+# 影映: 利用生物特征构筑Web3.0的通行证
+
+## 1. 项目简介
+
+ 本项目提出了**影映**,一种去中心化隐私保护的生物信息单点登录技术。虽然单点登录具有简化用户操作、提高用户体验等优点,但是传统单点登录存在隐私泄露、中心化风险等缺点。针对上述问题,本项目提出名为影映的去中心化隐私保护的生物信息单点登录方案,结合微众区块链、Pedersen 承诺(Pedersen Commitment)和零知识证明(zk-SNARK),通过设备本地处理生物特征数据并生成 Pedersen 承诺和零知识证明,在不泄露用户隐私的情况下,允许应用提供方通过区块链的智能合约完成认证请求和验证过程,并以此提供服务。该方案解决了用户管理和记忆大量应用账号密码的困扰,同时避免了传统单点登录所带来的隐私泄露和中心化风险。
+
+## 2. 项目背景
+
+ 随着数字化转型的深入推进,互联网服务和网络应用程序的数量呈指数级增长,用户日常交互的在线平台数量也随之激增。传统上,每个应用程序都要求用户通过独立的用户名和密码进行身份认证。这种认证方式在用户体验和安全性方面都存在显著的局限性,亟需新的解决方案来提高效率和安全性。在传统的用户名和密码认证模式下,用户需要为每个应用程序创建并记忆不同的凭证。这种方式带来了以下问题:
+
+- **认知负担增加**:管理大量的用户名和密码对用户来说是一项繁琐且容易出错的任务,导致密码疲劳。
+- **安全风险提升**:为方便记忆,用户往往在多个平台重复使用相同的密码。一旦其中一个账户被攻破,其他账户也面临被侵入的风险。
+- **管理复杂性**:对于组织而言,维护大量用户凭证的存储和安全也是一项艰巨的任务,增加了管理成本。
+
+ 单点登录(SSO)允许用户通过一次身份验证,即可访问多个受信任的应用程序和服务,如图1所示。
+
+
+
+
+ 其优势包括:
+
+- **提升用户体验**:减少了多次登录的需要,简化了用户访问各种服务的流程。
+- **增强安全性**:集中管理认证过程,便于实施统一的安全策略,如复杂密码要求和多因素认证。
+- **降低管理成本**:简化了凭证管理,减少了IT部门的维护工作量。
+
+ 尽管SSO带来了便利,但传统的中心化SSO系统仍存在一些严重的缺陷:
+
+- **单点故障风险**:传统SSO系统依赖于集中式的身份提供商(IdP)来进行用户认证和身份信息管理。这种集中化使得如果 IdP 发生故障、遭受攻击或出现技术问题,所有依赖该IdP的服务将无法访问,导致业务中断。集中式 IdP 成为攻击者的重点目标,容易受到字典攻击、暴力破解和网络钓鱼等攻击方式的威胁。一旦被攻破,可能导致大量用户敏感信息泄露。在没有额外安全层的情况下,传统SSO难以有效抵御现代复杂的网络攻击。
+
+- **隐私问题**:IdP的内部运作机制对用户和服务提供商而言是黑箱,缺乏对认证过程的透明度和可验证性。用户和服务提供商必须完全信任IdP的安全实践,但无法独立验证其行为是否符合安全和隐私标准。集中式 IdP 可以轻易地追踪用户在不同服务之间的活动,收集用户数据,进行用户画像,侵犯用户隐私。用户对自己的身份数据缺乏控制权,所有信息都存储并由IdP管理,存在数据滥用的可能性。图3展示了攻击者可以获取未失效的SSO 会话令牌,进而可以进行恶意行为。
+
+- **兼容性问题**:组织内部存在各种遗留系统和新旧应用程序,集成到统一的 SSO 框架中往往面临技术兼容性问题以及成本增加。
+
+ 区块链技术以其去中心化、安全性和透明度,为 SSO 系统提供了一种革新性的解决方案,能够有效克服传统SSO 的缺陷。
+
+- **消除单点故障**:区块链的分布式架构账本技术(DLT)将数据存储在多个节点上,消除了对单一中心节点的依赖。
+
+- **提高系统可靠性**:即使部分节点出现故障,系统仍能正常运行,保证了认证服务的高可用性。
+
+- **增强安全性**:区块链上的数据一经写入,便难以修改或删除,防止了身份数据被恶意篡改的风险。利用公私钥加密和数字签名等密码学技术,提高了认证过程的安全强度,降低了密码泄露和被破解的可能性。由于没有中央服务器,分布式网络架构天然具有抵御分布式拒绝服务(DDoS)攻击的能力。去中心化的特性使得攻击者无法通过攻破单一节点获取大量用户数据,降低了攻击的诱惑力。
+
+- **改善隐私保护**:通过去中心化标识符(DID)和可验证凭证(VC),用户可以自主控制自己的身份数据,决定共享哪些信息,以及何时共享。区块链支持匿名或伪匿名的交易方式,减少了用户被跟踪和画像的可能性,保护了用户的隐私。
+
+- **增强信任与透明度**:区块链的公开账本使所有交易和操作都可被验证,增强了系统的可信度和透明度。并且通过预先定义的智能合约,自动执行认证和授权流程,减少人为干预,降低错误和欺诈的风险。
+
+- **改进兼容性**:区块链提供统一的身份认证接口,简化了不同应用和服务之间的集成过程。基于区块链的 SSO系统更容易与其他区块链应用和传统系统进行交互,具备更强的扩展性和兼容性。
+
+ 因此在区块链上实现 SSO,对于提升身份认证系统的安全性、可靠性和用户隐私保护具有重要意义。
+
+- **提高系统弹性**:去中心化架构确保了系统的高可用性和抗故障能力,避免了传统 SSO 的单点故障问题。
+- **增强用户数据主权**:赋予用户对自身身份数据的控制权,符合数据隐私保护的法律法规要求,如 GDPR 等。
+- **符合现代安全实践**:利用先进的密码学和去中心化技术,契合零信任(Zero Trust)安全模型的理念。
+- **支持数字化转型**:为组织提供一个安全、可扩展的身份认证平台,支持越来越多的数字化服务和应用程序。
+
+ 基于区块链的 SSO 系统代表了身份认证领域的重大创新,具有广泛的理论意义和实际应用价值。本项目旨在利用生物特征的去中心化身份认证,在微众区块链上结合生物认证实现单点登录,分析其对提升认证系统安全性、可靠性和隐私保护的作用,为构建新一代身份认证解决方案,提升计算效率提供实践参考。
+
+## 3. 项目方案
+
+ 本项目提出了**影映**,一种去中心化隐私保护的生物特征认证技术。传统的身份认证方法(如基于密码和生物特征的认证)虽然在用户体验上具有一定的优势,但在安全性、隐私性和可扩展性方面存在局限性。现有的去中心化认证方法通常依赖于间接身份验证(例如使用密码或数字签名作为认证凭据),容易受到女巫攻击(Sybil 攻击)等安全威胁。
+
+ 针对上述问题,本项目设计了影映方案,结合 Pedersen 承诺、同态计算和零知识证明 技术,构建了一种高效、隐私友好的生物特征认证方法。在该方案中,影映协议通过将传统的明文生物特征相似度计算,转化为基于 Pedersen 承诺形式的同态计算过程,避免了用户隐私的暴露。由于 Pedersen 承诺协议本身计算复杂度较低,该方案在保证隐私保护的同时,显著提升了认证过程的效率。
+
+ 为了适应去中心化的应用场景,影映协议采用了 Fiat-Shamir 启发式方法对扩展版 Pedersen 承诺协议进行了优化,实现了非交互式的同态计算。同时,该方案引入了 Groth16 零知识证明技术,生成证明以表明通过同态计算得到的生物特征差异小于指定的阈值。用户可以通过微众区块链上的智能合约(作为 Groth16 的验证者),安全地完成链上认证。
+
+ 影映的独特之处在于其完全去中心化设计,并通过区块链智能合约以高效方式执行认证流程。我们从理论层面对影映的安全性进行了深入分析,并在微众区块链上完成原型系统验证。实验结果表明,影映在去中心化认证场景中具备高效性、安全性和实际可行性。最后,我们基于该方案的核心技术开发了 Web 端演示平台,进一步验证了方案的适用性和可操作性。
+
+### 3.1 方案设计
+
+ 项目旨在基于微众区块链实现高效且隐私保护的生物识别认证协议。为此,项目设计了影映协议,通过严格结合 Pedersen 承诺的同态加密技术和 Groth16 zk-SNARK 零知识证明算法,构建了完整的生物识别认证框架。随后,详细介绍了影映协议中认证证明的生成和验证过程,展示了其高效性与隐私保护特性。
+
+#### 3.1.1 身份的诞生
+
+
+用户可以通过生物特征识别验证身份,并采用OCR技术获取用户的唯一性标识符,生成全网唯一的去中心化数字身份。
+
+
+#### 3.1.2 身份认证证明
+
+
+
+在身份认证过程中,用户可以在自己的本地设备生成证明,从根源上避免数据隐私泄漏,并采用微众区块链平台进行验证,依靠智能合约获取验证结果,确保验证过程的零知识性。
+
+
+
+而具体的零知识证明电路可以参考上图。
+
+
+## 4. 演示平台
+
+### 4.1 系统架构
+
+
+
+
+1) 界面层
+
+ 界面层主要是对整个系统流程的具体展现,实现用户交互界面,让用户更加清晰、便捷的来使用所设计的系统。该层使用 Vue.js 框架实现用户界面,使用 HTML 和 JavaScript 创建用户交互页面,使用 Axios 进行与后端 API 的通信,发送和接收数据与后端交互,数据通过 API 发送到后端,完成验证与存储。
+
+2) 业务逻辑层
+
+ 业务逻辑层采用Java实现核心业务逻辑,并与区块链交互。该层主要是对本系统中几个核心功能的具体实现,其中包含 FaceRecognition 模块、ZK-SNARK 模块、Pedersen 模块以及地址生成模块。FaceRecognition 模块负责检测人脸以及人脸比对;ZK-SNARK 模块负责生成人脸比对相关的零知识证明 proof 和人脸欧氏距离的pedersen 承诺值;Pedersen 模块负责生成承诺和生成提供校验的数据;地址生成模块负责将用户信息上链生成地址。
+
+3) 接口层
+
+ 接口层主要是将底层的一些功能封装成相应的接口,从而便于上层直接调用相应的接口来实现各式各样的应用场景。
+
+4) 底层
+
+ 底层是整个中心化身份体系运作的基石,也是整个方案的运行平台。演示平台主要依托底层进行用户的注册与登录、链上认证等两个功能流程。
+
+#### 4.2 环境依赖
+
+
+**集成环境**
+
+集成开发环境:IDEA+jdk14、Remix、python3.8(Anaconda)、Vscode、Remix、Neovim、Vue3
+
+区块链平台:FISCO-BCOS v2.9.1 文档
+
+软件开发工具包:Python-SDK、maven3.9.9、zokrates cli
+
+中间件平台:WeBASE
+
+操作系统:Linux Ubuntu 22.04 LTS、Windows
+
+开发语言:Solidity(智能合约)、Python+java(后端开发)、HTML+CSS+JavaScript(前端开发)
+
+#### 4.3 启动步骤
+
+**后端启动**
+
+1. 进入后端项目目录。
+
+2. 执行以下命令:
+
+ ```bash
+ mvn clean install
+ mvn spring-boot:run
+ ```
+
+3. 后端服务将启动在默认端口 `http://localhost:8080`。
+
+**前端启动**
+
+1. 进入前端项目目录。
+
+2. 执行以下命令:
+
+ ```bash
+ npm install
+ npm run serve
+ ```
+
+3. 前端服务将在 `http://localhost:8081` 启动。
+
+**区块链启动**
+
+1. 请参考微众区块链官网进行部署与智能合约部署。
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/.gitignore b/2024-shenzhen-FinTechathon/SpotOn/backend/check/.gitignore
new file mode 100644
index 000000000..549e00a2a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen.zip b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen.zip
new file mode 100644
index 000000000..e8b7dab53
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen.zip differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Homomorphic.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Homomorphic.js
new file mode 100644
index 000000000..c1116cfd9
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Homomorphic.js
@@ -0,0 +1,35 @@
+class Homomorphic {
+ //#p = 67108859;
+ #p = 67108859n;
+ Add(ComA, ComB) {
+ return ComA * ComB % this.#p
+ }
+ Pow(Com, n) {
+ let res = 1n;
+ let quot = BigInt(n);
+ let rem = 0n;
+ let table = [];
+ table.push(Com);
+ for(let i = 1; i < 64; i++) {
+ table.push(table[i - 1] * table[i - 1] % this.#p);
+ }
+ for(let j = 0; j < 64; j++) {
+ rem = quot % 2n;
+ quot = quot / 2n;
+ if(rem == 1n) {
+ res = res * table[j] % this.#p;
+ } else {}
+ }
+ return res
+ }
+ Sub(ComA, ComB, ComC) {
+ if(ComB * ComC % this.#p == ComA) {
+ return 1
+ }
+ else {
+ return 0
+ }
+ }
+}
+
+export {Homomorphic};
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen.js
new file mode 100644
index 000000000..439d70f82
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen.js
@@ -0,0 +1,61 @@
+/**
+ * File Name: Pedersen.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-10: Minor bug fixes by Norton.
+ * Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
+ * in JavaScript language.
+ * Contact Information: [None]
+ */
+
+export class Pedersen {
+ #g;
+ #h;
+ //#p = 67108859;
+ #p = 67108859n;
+ #g_table = [];
+ #h_table = [];
+ constructor(g, h) {
+ this.#g = g % this.#p;
+ this.#h = h % this.#p;
+ this.#g_table.push(this.#g)
+ this.#h_table.push(this.#h)
+ for(let i = 1; i < 64; i++) {
+ this.#g_table.push(this.#g_table[i - 1] * this.#g_table[i - 1] % this.#p);
+ this.#h_table.push(this.#h_table[i - 1] * this.#h_table[i - 1] % this.#p);
+ }
+ // bebug
+ // console.log('g:' + this.#g + ' h:' + this.#h)
+ // console.log('g_table:' + this.#g_table)
+ // console.log('h_table:' + this.#h_table)
+ }
+ Commitment(v, r) {
+ let v_quot = v;
+ let r_quot = r;
+ let v_rem = 0n;
+ let r_rem = 0n;
+ let G = 1n;
+ let H = 1n;
+ for(let i = 0; i < 64; i++) {
+ v_rem = v_quot % 2n;
+ v_quot = v_quot / 2n;
+ r_rem = r_quot % 2n;
+ r_quot = r_quot / 2n;
+ // debug
+ // console.log(i + ' v_rem:' + v_rem + ' v_qout:' + v_quot);
+ // console.log(i + ' r_rem:' + r_rem + ' r_qout:' + r_quot);
+ if(v_rem == 1n) {
+ G = G * this.#g_table[i] % this.#p;
+ } else {}
+ if(r_rem == 1n) {
+ H = H * this.#h_table[i] % this.#p;
+ } else {}
+ }
+ return G * H % this.#p
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen/yuan/proof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen/yuan/proof.json
new file mode 100644
index 000000000..549dc971e
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/Pedersen/yuan/proof.json
@@ -0,0 +1,52 @@
+{
+ "id": "User",
+ "time": "2024/11/13 19:09:43",
+ "proof": {
+ "emb": [
+ "0x0000000001af316d",
+ "0x0000000000bf27bd"
+ ],
+ "cmt": {
+ "cmt_eq_old_json": [
+ "0x00000000002ae14b",
+ "0x00000000003af9d0"
+ ],
+ "cmt_eq_new_json": [
+ "0x0000000003779991",
+ "0x000000000221d6d4"
+ ],
+ "cmt_mult_json": [
+ "0x000000000094f08e",
+ "0x00000000007b0669"
+ ]
+ },
+ "a": [
+ "0x0000000003609a0d",
+ "0x0000000002588e16"
+ ],
+ "z": [
+ "0x000000003e83836c",
+ "0x00000000175d9e71",
+ "0x000000000f45f892",
+ "0x000000002c63c4ef",
+ "0x0000000000003e81",
+ "0x000000000002a2cf",
+ "0x0000000000538850",
+ "0x0000000000278921",
+ "0x000000004a462186",
+ "0x00000000013e874e",
+ "0x000000001f9f5997",
+ "0x000000001f92827b",
+ "0x00000000000618f6",
+ "0x0000000000034e9b"
+ ],
+ "p": [
+ "0x0000000002e7386b",
+ "0x00000000003b5d6e",
+ "0x0000000001ef918f",
+ "0x0000000001101847",
+ "0x00000000039507fb",
+ "0x0000000001d2ae3e"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/generate.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/generate.js
new file mode 100644
index 000000000..24bca1085
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/generate.js
@@ -0,0 +1,82 @@
+/**
+ * File Name: generate.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-04: Minor bug fixes by Norton.
+ * Description: This module is used to simulate the process of users generating biometric encoding
+ * commitments during the registration process.
+ * Contact Information: [None]
+ */
+
+import * as fs from 'fs'
+import { Pedersen } from './Pedersen.js'
+
+function InttoHex(Value, length) {
+ // 转换为十六进制,不包括'0x'前缀
+ let hex = Value.toString(16);
+ // 计算需要填充的零的数量
+ const padding = length - hex.length;
+ // 如果需要,填充零
+ if (padding > 0) {
+ hex = '0x' + '0'.repeat(padding) + hex;
+ }
+ else {
+ hex = '0x' + hex;
+ }
+ return hex;
+}
+
+// 生物特征编码的维度
+const dim = 2
+// 承诺的生成元
+const g = 56544564n
+const h = 237684576n
+// 随机生成用的注册生物特征
+let m = new Array(dim)
+let r = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ m[i] = BigInt(Math.floor(Math.random() * 1000000))
+ r[i] = BigInt(Math.floor(Math.random() * 1000000))
+ //console.log(m[i].toString(16), r[i].toString(16)),
+}
+
+// 生成生物特征编码的承诺
+console.time('time')
+let cmt = Array(dim)
+const code = new Pedersen(g, h)
+for(let i = 0; i < dim; i++) {
+ cmt[i] = code.Commitment(m[i], r[i])
+ //console.log(cmt[i].toString())
+}
+// 数据转化
+let cmt_json = Array(dim)
+let m_json = Array(dim)
+let r_json = Array(dim)
+for(let i = 0; i < dim; i++) {
+ cmt_json[i] = InttoHex(cmt[i], 16)
+ m_json[i] = InttoHex(m[i], 16)
+ r_json[i] = InttoHex(r[i], 16)
+ //console.log(cmt_json[i], m_json[i], r_json[i])
+}
+// 数据打包
+const json = {
+ id: 'User',
+ m: m_json,
+ r: r_json,
+ cmt: cmt_json
+}
+const jsonString = JSON.stringify(json, null, 2);
+// 数据存储
+fs.writeFile('identity.json', jsonString, 'utf8', (err) => {
+ if (err) {
+ console.log("An error occured while writing JSON Object to File.");
+ return console.log(err);
+ }
+ console.log("Identity file has been saved.");
+ });
+console.timeEnd('time')
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/identity.json
new file mode 100644
index 000000000..bc2d0b042
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/identity.json
@@ -0,0 +1,6 @@
+{
+ "id" : "ca02b82d4f8abfef6186ac5b28d41a6703fe925e17c12164cbf9f634e0ffb9e2",
+ "m" : [ "895", "1085"],
+ "r" : [ "103333", "883370" ],
+ "cmt" : [ "53677044", "45537498" ]
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/.package-lock.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/.package-lock.json
new file mode 100644
index 000000000..337eb7f40
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/.package-lock.json
@@ -0,0 +1,13 @@
+{
+ "name": "pedersen",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "node_modules/crypto-js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+ }
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/CONTRIBUTING.md b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/CONTRIBUTING.md
new file mode 100644
index 000000000..09bf774aa
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# Contribution
+
+# Git Flow
+
+The crypto-js project uses [git flow](https://github.com/nvie/gitflow) to manage branches.
+Do your changes on the `develop` or even better on a `feature/*` branch. Don't do any changes on the `master` branch.
+
+# Pull request
+
+Target your pull request on `develop` branch. Other pull request won't be accepted.
+
+# How to build
+
+1. Clone
+
+2. Run
+
+ ```sh
+ npm install
+ ```
+
+3. Run
+
+ ```sh
+ npm run build
+ ```
+
+4. Check `build` folder
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/LICENSE b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/LICENSE
new file mode 100644
index 000000000..b0828e52a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/LICENSE
@@ -0,0 +1,24 @@
+# License
+
+[The MIT License (MIT)](http://opensource.org/licenses/MIT)
+
+Copyright (c) 2009-2013 Jeff Mott
+Copyright (c) 2013-2016 Evan Vosberg
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/README.md b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/README.md
new file mode 100644
index 000000000..6a9bcdf92
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/README.md
@@ -0,0 +1,275 @@
+# crypto-js
+
+JavaScript library of crypto standards.
+
+## Discontinued
+
+Active development of CryptoJS has been discontinued. This library is no longer maintained.
+
+Nowadays, NodeJS and modern browsers have a native `Crypto` module. The latest version of CryptoJS already uses the native Crypto module for random number generation, since `Math.random()` is not crypto-safe. Further development of CryptoJS would result in it only being a wrapper of native Crypto. Therefore, development and maintenance has been discontinued, it is time to go for the native `crypto` module.
+
+## Node.js (Install)
+
+Requirements:
+
+- Node.js
+- npm (Node.js package manager)
+
+```bash
+npm install crypto-js
+```
+
+### Usage
+
+ES6 import for typical API call signing use case:
+
+```javascript
+import sha256 from 'crypto-js/sha256';
+import hmacSHA512 from 'crypto-js/hmac-sha512';
+import Base64 from 'crypto-js/enc-base64';
+
+const message, nonce, path, privateKey; // ...
+const hashDigest = sha256(nonce + message);
+const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));
+```
+
+Modular include:
+
+```javascript
+var AES = require("crypto-js/aes");
+var SHA256 = require("crypto-js/sha256");
+...
+console.log(SHA256("Message"));
+```
+
+Including all libraries, for access to extra methods:
+
+```javascript
+var CryptoJS = require("crypto-js");
+console.log(CryptoJS.HmacSHA1("Message", "Key"));
+```
+
+## Client (browser)
+
+Requirements:
+
+- Node.js
+- Bower (package manager for frontend)
+
+```bash
+bower install crypto-js
+```
+
+### Usage
+
+Modular include:
+
+```javascript
+require.config({
+ packages: [
+ {
+ name: 'crypto-js',
+ location: 'path-to/bower_components/crypto-js',
+ main: 'index'
+ }
+ ]
+});
+
+require(["crypto-js/aes", "crypto-js/sha256"], function (AES, SHA256) {
+ console.log(SHA256("Message"));
+});
+```
+
+Including all libraries, for access to extra methods:
+
+```javascript
+// Above-mentioned will work or use this simple form
+require.config({
+ paths: {
+ 'crypto-js': 'path-to/bower_components/crypto-js/crypto-js'
+ }
+});
+
+require(["crypto-js"], function (CryptoJS) {
+ console.log(CryptoJS.HmacSHA1("Message", "Key"));
+});
+```
+
+### Usage without RequireJS
+
+```html
+
+
+```
+
+## API
+
+See: https://cryptojs.gitbook.io/docs/
+
+### AES Encryption
+
+#### Plain text encryption
+
+```javascript
+var CryptoJS = require("crypto-js");
+
+// Encrypt
+var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString();
+
+// Decrypt
+var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
+var originalText = bytes.toString(CryptoJS.enc.Utf8);
+
+console.log(originalText); // 'my message'
+```
+
+#### Object encryption
+
+```javascript
+var CryptoJS = require("crypto-js");
+
+var data = [{id: 1}, {id: 2}]
+
+// Encrypt
+var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123').toString();
+
+// Decrypt
+var bytes = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
+var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));
+
+console.log(decryptedData); // [{id: 1}, {id: 2}]
+```
+
+### List of modules
+
+
+- ```crypto-js/core```
+- ```crypto-js/x64-core```
+- ```crypto-js/lib-typedarrays```
+
+---
+
+- ```crypto-js/md5```
+- ```crypto-js/sha1```
+- ```crypto-js/sha256```
+- ```crypto-js/sha224```
+- ```crypto-js/sha512```
+- ```crypto-js/sha384```
+- ```crypto-js/sha3```
+- ```crypto-js/ripemd160```
+
+---
+
+- ```crypto-js/hmac-md5```
+- ```crypto-js/hmac-sha1```
+- ```crypto-js/hmac-sha256```
+- ```crypto-js/hmac-sha224```
+- ```crypto-js/hmac-sha512```
+- ```crypto-js/hmac-sha384```
+- ```crypto-js/hmac-sha3```
+- ```crypto-js/hmac-ripemd160```
+
+---
+
+- ```crypto-js/pbkdf2```
+
+---
+
+- ```crypto-js/aes```
+- ```crypto-js/tripledes```
+- ```crypto-js/rc4```
+- ```crypto-js/rabbit```
+- ```crypto-js/rabbit-legacy```
+- ```crypto-js/evpkdf```
+
+---
+
+- ```crypto-js/format-openssl```
+- ```crypto-js/format-hex```
+
+---
+
+- ```crypto-js/enc-latin1```
+- ```crypto-js/enc-utf8```
+- ```crypto-js/enc-hex```
+- ```crypto-js/enc-utf16```
+- ```crypto-js/enc-base64```
+
+---
+
+- ```crypto-js/mode-cfb```
+- ```crypto-js/mode-ctr```
+- ```crypto-js/mode-ctr-gladman```
+- ```crypto-js/mode-ofb```
+- ```crypto-js/mode-ecb```
+
+---
+
+- ```crypto-js/pad-pkcs7```
+- ```crypto-js/pad-ansix923```
+- ```crypto-js/pad-iso10126```
+- ```crypto-js/pad-iso97971```
+- ```crypto-js/pad-zeropadding```
+- ```crypto-js/pad-nopadding```
+
+
+## Release notes
+
+### 4.2.0
+
+Change default hash algorithm and iteration's for PBKDF2 to prevent weak security by using the default configuration.
+
+Custom KDF Hasher
+
+Blowfish support
+
+### 4.1.1
+
+Fix module order in bundled release.
+
+Include the browser field in the released package.json.
+
+### 4.1.0
+
+Added url safe variant of base64 encoding. [357](https://github.com/brix/crypto-js/pull/357)
+
+Avoid webpack to add crypto-browser package. [364](https://github.com/brix/crypto-js/pull/364)
+
+### 4.0.0
+
+This is an update including breaking changes for some environments.
+
+In this version `Math.random()` has been replaced by the random methods of the native crypto module.
+
+For this reason CryptoJS might not run in some JavaScript environments without native crypto module. Such as IE 10 or before or React Native.
+
+### 3.3.0
+
+Rollback, `3.3.0` is the same as `3.1.9-1`.
+
+The move of using native secure crypto module will be shifted to a new `4.x.x` version. As it is a breaking change the impact is too big for a minor release.
+
+### 3.2.1
+
+The usage of the native crypto module has been fixed. The import and access of the native crypto module has been improved.
+
+### 3.2.0
+
+In this version `Math.random()` has been replaced by the random methods of the native crypto module.
+
+For this reason CryptoJS might does not run in some JavaScript environments without native crypto module. Such as IE 10 or before.
+
+If it's absolute required to run CryptoJS in such an environment, stay with `3.1.x` version. Encrypting and decrypting stays compatible. But keep in mind `3.1.x` versions still use `Math.random()` which is cryptographically not secure, as it's not random enough.
+
+This version came along with `CRITICAL` `BUG`.
+
+DO NOT USE THIS VERSION! Please, go for a newer version!
+
+### 3.1.x
+
+The `3.1.x` are based on the original CryptoJS, wrapped in CommonJS modules.
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/aes.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/aes.js
new file mode 100644
index 000000000..166e3eac4
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/aes.js
@@ -0,0 +1,234 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Lookup tables
+ var SBOX = [];
+ var INV_SBOX = [];
+ var SUB_MIX_0 = [];
+ var SUB_MIX_1 = [];
+ var SUB_MIX_2 = [];
+ var SUB_MIX_3 = [];
+ var INV_SUB_MIX_0 = [];
+ var INV_SUB_MIX_1 = [];
+ var INV_SUB_MIX_2 = [];
+ var INV_SUB_MIX_3 = [];
+
+ // Compute lookup tables
+ (function () {
+ // Compute double table
+ var d = [];
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ d[i] = i << 1;
+ } else {
+ d[i] = (i << 1) ^ 0x11b;
+ }
+ }
+
+ // Walk GF(2^8)
+ var x = 0;
+ var xi = 0;
+ for (var i = 0; i < 256; i++) {
+ // Compute sbox
+ var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+ sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+ SBOX[x] = sx;
+ INV_SBOX[sx] = x;
+
+ // Compute multiplication
+ var x2 = d[x];
+ var x4 = d[x2];
+ var x8 = d[x4];
+
+ // Compute sub bytes, mix columns tables
+ var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+ SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+ SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+ SUB_MIX_2[x] = (t << 8) | (t >>> 24);
+ SUB_MIX_3[x] = t;
+
+ // Compute inv sub bytes, inv mix columns tables
+ var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+ INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+ INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+ INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
+ INV_SUB_MIX_3[sx] = t;
+
+ // Compute next counter
+ if (!x) {
+ x = xi = 1;
+ } else {
+ x = x2 ^ d[d[d[x8 ^ x2]]];
+ xi ^= d[d[xi]];
+ }
+ }
+ }());
+
+ // Precomputed Rcon lookup
+ var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+ /**
+ * AES block cipher algorithm.
+ */
+ var AES = C_algo.AES = BlockCipher.extend({
+ _doReset: function () {
+ var t;
+
+ // Skip reset of nRounds has been set before and key did not change
+ if (this._nRounds && this._keyPriorReset === this._key) {
+ return;
+ }
+
+ // Shortcuts
+ var key = this._keyPriorReset = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ // Compute number of rounds
+ var nRounds = this._nRounds = keySize + 6;
+
+ // Compute number of key schedule rows
+ var ksRows = (nRounds + 1) * 4;
+
+ // Compute key schedule
+ var keySchedule = this._keySchedule = [];
+ for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+ if (ksRow < keySize) {
+ keySchedule[ksRow] = keyWords[ksRow];
+ } else {
+ t = keySchedule[ksRow - 1];
+
+ if (!(ksRow % keySize)) {
+ // Rot word
+ t = (t << 8) | (t >>> 24);
+
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+ // Mix Rcon
+ t ^= RCON[(ksRow / keySize) | 0] << 24;
+ } else if (keySize > 6 && ksRow % keySize == 4) {
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+ }
+
+ keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+ }
+ }
+
+ // Compute inv key schedule
+ var invKeySchedule = this._invKeySchedule = [];
+ for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+ var ksRow = ksRows - invKsRow;
+
+ if (invKsRow % 4) {
+ var t = keySchedule[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 4];
+ }
+
+ if (invKsRow < 4 || ksRow <= 4) {
+ invKeySchedule[invKsRow] = t;
+ } else {
+ invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+ }
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+ },
+
+ decryptBlock: function (M, offset) {
+ // Swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+
+ this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+ // Inv swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+ },
+
+ _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+ // Shortcut
+ var nRounds = this._nRounds;
+
+ // Get input, add round key
+ var s0 = M[offset] ^ keySchedule[0];
+ var s1 = M[offset + 1] ^ keySchedule[1];
+ var s2 = M[offset + 2] ^ keySchedule[2];
+ var s3 = M[offset + 3] ^ keySchedule[3];
+
+ // Key schedule row counter
+ var ksRow = 4;
+
+ // Rounds
+ for (var round = 1; round < nRounds; round++) {
+ // Shift rows, sub bytes, mix columns, add round key
+ var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+ var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+ var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+ var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+ // Update state
+ s0 = t0;
+ s1 = t1;
+ s2 = t2;
+ s3 = t3;
+ }
+
+ // Shift rows, sub bytes, add round key
+ var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+ var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+ var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+ var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+ // Set output
+ M[offset] = t0;
+ M[offset + 1] = t1;
+ M[offset + 2] = t2;
+ M[offset + 3] = t3;
+ },
+
+ keySize: 256/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+ */
+ C.AES = BlockCipher._createHelper(AES);
+ }());
+
+
+ return CryptoJS.AES;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/blowfish.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/blowfish.js
new file mode 100644
index 000000000..149812ff1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/blowfish.js
@@ -0,0 +1,471 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ const N = 16;
+
+ //Origin pbox and sbox, derived from PI
+ const ORIG_P = [
+ 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
+ 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
+ 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
+ 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
+ 0x9216D5D9, 0x8979FB1B
+ ];
+
+ const ORIG_S = [
+ [ 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
+ 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
+ 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
+ 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
+ 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
+ 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
+ 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
+ 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
+ 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
+ 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
+ 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
+ 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
+ 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
+ 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
+ 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
+ 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
+ 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
+ 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
+ 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
+ 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
+ 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
+ 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
+ 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
+ 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
+ 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
+ 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
+ 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
+ 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
+ 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
+ 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
+ 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
+ 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
+ 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
+ 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
+ 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
+ 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
+ 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
+ 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
+ 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
+ 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
+ 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
+ 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
+ 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
+ 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
+ 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
+ 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
+ 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
+ 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
+ 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
+ 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
+ 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
+ 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
+ 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
+ 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
+ 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
+ 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
+ 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
+ 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
+ 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
+ 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
+ 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
+ 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
+ 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
+ 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ],
+ [ 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
+ 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
+ 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
+ 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
+ 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
+ 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
+ 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
+ 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
+ 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
+ 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
+ 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
+ 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
+ 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
+ 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
+ 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
+ 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
+ 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
+ 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
+ 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
+ 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
+ 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
+ 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
+ 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
+ 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
+ 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
+ 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
+ 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
+ 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
+ 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
+ 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
+ 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
+ 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
+ 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
+ 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
+ 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
+ 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
+ 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
+ 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
+ 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
+ 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
+ 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
+ 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
+ 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
+ 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
+ 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
+ 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
+ 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
+ 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
+ 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
+ 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
+ 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
+ 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
+ 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
+ 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
+ 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
+ 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
+ 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
+ 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
+ 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
+ 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
+ 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
+ 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
+ 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
+ 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ],
+ [ 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
+ 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
+ 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
+ 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
+ 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
+ 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
+ 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
+ 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
+ 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
+ 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
+ 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
+ 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
+ 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
+ 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
+ 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
+ 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
+ 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
+ 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
+ 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
+ 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
+ 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
+ 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
+ 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
+ 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
+ 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
+ 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
+ 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
+ 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
+ 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
+ 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
+ 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
+ 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
+ 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
+ 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
+ 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
+ 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
+ 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
+ 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
+ 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
+ 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
+ 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
+ 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
+ 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
+ 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
+ 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
+ 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
+ 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
+ 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
+ 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
+ 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
+ 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
+ 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
+ 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
+ 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
+ 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
+ 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
+ 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
+ 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
+ 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
+ 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
+ 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
+ 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
+ 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
+ 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ],
+ [ 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
+ 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
+ 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
+ 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
+ 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
+ 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
+ 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
+ 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
+ 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
+ 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
+ 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
+ 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
+ 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
+ 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
+ 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
+ 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
+ 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
+ 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
+ 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
+ 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
+ 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
+ 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
+ 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
+ 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
+ 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
+ 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
+ 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
+ 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
+ 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
+ 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
+ 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
+ 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
+ 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
+ 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
+ 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
+ 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
+ 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
+ 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
+ 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
+ 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
+ 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
+ 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
+ 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
+ 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
+ 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
+ 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
+ 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
+ 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
+ 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
+ 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
+ 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
+ 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
+ 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
+ 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
+ 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
+ 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
+ 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
+ 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
+ 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
+ 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
+ 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
+ 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
+ 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
+ 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 ]
+ ];
+
+ var BLOWFISH_CTX = {
+ pbox: [],
+ sbox: []
+ }
+
+ function F(ctx, x){
+ let a = (x >> 24) & 0xFF;
+ let b = (x >> 16) & 0xFF;
+ let c = (x >> 8) & 0xFF;
+ let d = x & 0xFF;
+
+ let y = ctx.sbox[0][a] + ctx.sbox[1][b];
+ y = y ^ ctx.sbox[2][c];
+ y = y + ctx.sbox[3][d];
+
+ return y;
+ }
+
+ function BlowFish_Encrypt(ctx, left, right){
+ let Xl = left;
+ let Xr = right;
+ let temp;
+
+ for(let i = 0; i < N; ++i){
+ Xl = Xl ^ ctx.pbox[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx.pbox[N];
+ Xl = Xl ^ ctx.pbox[N + 1];
+
+ return {left: Xl, right: Xr};
+ }
+
+ function BlowFish_Decrypt(ctx, left, right){
+ let Xl = left;
+ let Xr = right;
+ let temp;
+
+ for(let i = N + 1; i > 1; --i){
+ Xl = Xl ^ ctx.pbox[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx.pbox[1];
+ Xl = Xl ^ ctx.pbox[0];
+
+ return {left: Xl, right: Xr};
+ }
+
+ /**
+ * Initialization ctx's pbox and sbox.
+ *
+ * @param {Object} ctx The object has pbox and sbox.
+ * @param {Array} key An array of 32-bit words.
+ * @param {int} keysize The length of the key.
+ *
+ * @example
+ *
+ * BlowFishInit(BLOWFISH_CTX, key, 128/32);
+ */
+ function BlowFishInit(ctx, key, keysize)
+ {
+ for(let Row = 0; Row < 4; Row++)
+ {
+ ctx.sbox[Row] = [];
+ for(let Col = 0; Col < 256; Col++)
+ {
+ ctx.sbox[Row][Col] = ORIG_S[Row][Col];
+ }
+ }
+
+ let keyIndex = 0;
+ for(let index = 0; index < N + 2; index++)
+ {
+ ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];
+ keyIndex++;
+ if(keyIndex >= keysize)
+ {
+ keyIndex = 0;
+ }
+ }
+
+ let Data1 = 0;
+ let Data2 = 0;
+ let res = 0;
+ for(let i = 0; i < N + 2; i += 2)
+ {
+ res = BlowFish_Encrypt(ctx, Data1, Data2);
+ Data1 = res.left;
+ Data2 = res.right;
+ ctx.pbox[i] = Data1;
+ ctx.pbox[i + 1] = Data2;
+ }
+
+ for(let i = 0; i < 4; i++)
+ {
+ for(let j = 0; j < 256; j += 2)
+ {
+ res = BlowFish_Encrypt(ctx, Data1, Data2);
+ Data1 = res.left;
+ Data2 = res.right;
+ ctx.sbox[i][j] = Data1;
+ ctx.sbox[i][j + 1] = Data2;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Blowfish block cipher algorithm.
+ */
+ var Blowfish = C_algo.Blowfish = BlockCipher.extend({
+ _doReset: function () {
+ // Skip reset of nRounds has been set before and key did not change
+ if (this._keyPriorReset === this._key) {
+ return;
+ }
+
+ // Shortcuts
+ var key = this._keyPriorReset = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ //Initialization pbox and sbox
+ BlowFishInit(BLOWFISH_CTX, keyWords, keySize);
+ },
+
+ encryptBlock: function (M, offset) {
+ var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);
+ M[offset] = res.left;
+ M[offset + 1] = res.right;
+ },
+
+ decryptBlock: function (M, offset) {
+ var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);
+ M[offset] = res.left;
+ M[offset + 1] = res.right;
+ },
+
+ blockSize: 64/32,
+
+ keySize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);
+ */
+ C.Blowfish = BlockCipher._createHelper(Blowfish);
+ }());
+
+
+ return CryptoJS.Blowfish;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/bower.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/bower.json
new file mode 100644
index 000000000..4dee617cb
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/bower.json
@@ -0,0 +1,39 @@
+{
+ "name": "crypto-js",
+ "version": "4.2.0",
+ "description": "JavaScript library of crypto standards.",
+ "license": "MIT",
+ "homepage": "http://github.com/brix/crypto-js",
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/brix/crypto-js.git"
+ },
+ "keywords": [
+ "security",
+ "crypto",
+ "Hash",
+ "MD5",
+ "SHA1",
+ "SHA-1",
+ "SHA256",
+ "SHA-256",
+ "RC4",
+ "Rabbit",
+ "AES",
+ "DES",
+ "PBKDF2",
+ "HMAC",
+ "OFB",
+ "CFB",
+ "CTR",
+ "CBC",
+ "Base64",
+ "Base64url"
+ ],
+ "main": "index.js",
+ "dependencies": {},
+ "browser": {
+ "crypto": false
+ },
+ "ignore": []
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/cipher-core.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/cipher-core.js
new file mode 100644
index 000000000..903f46203
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/cipher-core.js
@@ -0,0 +1,895 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./evpkdf"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./evpkdf"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Cipher core components.
+ */
+ CryptoJS.lib.Cipher || (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var Base64 = C_enc.Base64;
+ var C_algo = C.algo;
+ var EvpKDF = C_algo.EvpKDF;
+
+ /**
+ * Abstract base cipher template.
+ *
+ * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+ * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+ * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+ * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+ */
+ var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {WordArray} iv The IV to use for this operation.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Creates this cipher in encryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createEncryptor: function (key, cfg) {
+ return this.create(this._ENC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Creates this cipher in decryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createDecryptor: function (key, cfg) {
+ return this.create(this._DEC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Initializes a newly created cipher.
+ *
+ * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+ */
+ init: function (xformMode, key, cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Store transform mode and key
+ this._xformMode = xformMode;
+ this._key = key;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this cipher to its initial state.
+ *
+ * @example
+ *
+ * cipher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-cipher logic
+ this._doReset();
+ },
+
+ /**
+ * Adds data to be encrypted or decrypted.
+ *
+ * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.process('data');
+ * var encrypted = cipher.process(wordArray);
+ */
+ process: function (dataUpdate) {
+ // Append
+ this._append(dataUpdate);
+
+ // Process available blocks
+ return this._process();
+ },
+
+ /**
+ * Finalizes the encryption or decryption process.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after final processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.finalize();
+ * var encrypted = cipher.finalize('data');
+ * var encrypted = cipher.finalize(wordArray);
+ */
+ finalize: function (dataUpdate) {
+ // Final data update
+ if (dataUpdate) {
+ this._append(dataUpdate);
+ }
+
+ // Perform concrete-cipher logic
+ var finalProcessedData = this._doFinalize();
+
+ return finalProcessedData;
+ },
+
+ keySize: 128/32,
+
+ ivSize: 128/32,
+
+ _ENC_XFORM_MODE: 1,
+
+ _DEC_XFORM_MODE: 2,
+
+ /**
+ * Creates shortcut functions to a cipher's object interface.
+ *
+ * @param {Cipher} cipher The cipher to create a helper for.
+ *
+ * @return {Object} An object with encrypt and decrypt shortcut functions.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+ */
+ _createHelper: (function () {
+ function selectCipherStrategy(key) {
+ if (typeof key == 'string') {
+ return PasswordBasedCipher;
+ } else {
+ return SerializableCipher;
+ }
+ }
+
+ return function (cipher) {
+ return {
+ encrypt: function (message, key, cfg) {
+ return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+ },
+
+ decrypt: function (ciphertext, key, cfg) {
+ return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+ }
+ };
+ };
+ }())
+ });
+
+ /**
+ * Abstract base stream cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+ */
+ var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+ _doFinalize: function () {
+ // Process partial blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 1
+ });
+
+ /**
+ * Mode namespace.
+ */
+ var C_mode = C.mode = {};
+
+ /**
+ * Abstract base block cipher mode template.
+ */
+ var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+ /**
+ * Creates this mode for encryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+ */
+ createEncryptor: function (cipher, iv) {
+ return this.Encryptor.create(cipher, iv);
+ },
+
+ /**
+ * Creates this mode for decryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+ */
+ createDecryptor: function (cipher, iv) {
+ return this.Decryptor.create(cipher, iv);
+ },
+
+ /**
+ * Initializes a newly created mode.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+ */
+ init: function (cipher, iv) {
+ this._cipher = cipher;
+ this._iv = iv;
+ }
+ });
+
+ /**
+ * Cipher Block Chaining mode.
+ */
+ var CBC = C_mode.CBC = (function () {
+ /**
+ * Abstract base CBC mode.
+ */
+ var CBC = BlockCipherMode.extend();
+
+ /**
+ * CBC encryptor.
+ */
+ CBC.Encryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // XOR and encrypt
+ xorBlock.call(this, words, offset, blockSize);
+ cipher.encryptBlock(words, offset);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ /**
+ * CBC decryptor.
+ */
+ CBC.Decryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ // Decrypt and XOR
+ cipher.decryptBlock(words, offset);
+ xorBlock.call(this, words, offset, blockSize);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function xorBlock(words, offset, blockSize) {
+ var block;
+
+ // Shortcut
+ var iv = this._iv;
+
+ // Choose mixing block
+ if (iv) {
+ block = iv;
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ block = this._prevBlock;
+ }
+
+ // XOR blocks
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= block[i];
+ }
+ }
+
+ return CBC;
+ }());
+
+ /**
+ * Padding namespace.
+ */
+ var C_pad = C.pad = {};
+
+ /**
+ * PKCS #5/7 padding strategy.
+ */
+ var Pkcs7 = C_pad.Pkcs7 = {
+ /**
+ * Pads data using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to pad.
+ * @param {number} blockSize The multiple that the data should be padded to.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+ */
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Create padding word
+ var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+ // Create padding
+ var paddingWords = [];
+ for (var i = 0; i < nPaddingBytes; i += 4) {
+ paddingWords.push(paddingWord);
+ }
+ var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+ // Add padding
+ data.concat(padding);
+ },
+
+ /**
+ * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to unpad.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.unpad(wordArray);
+ */
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+ /**
+ * Abstract base block cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+ */
+ var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Mode} mode The block mode to use. Default: CBC
+ * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+ */
+ cfg: Cipher.cfg.extend({
+ mode: CBC,
+ padding: Pkcs7
+ }),
+
+ reset: function () {
+ var modeCreator;
+
+ // Reset cipher
+ Cipher.reset.call(this);
+
+ // Shortcuts
+ var cfg = this.cfg;
+ var iv = cfg.iv;
+ var mode = cfg.mode;
+
+ // Reset block mode
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ modeCreator = mode.createEncryptor;
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ modeCreator = mode.createDecryptor;
+ // Keep at least one block in the buffer for unpadding
+ this._minBufferSize = 1;
+ }
+
+ if (this._mode && this._mode.__creator == modeCreator) {
+ this._mode.init(this, iv && iv.words);
+ } else {
+ this._mode = modeCreator.call(mode, this, iv && iv.words);
+ this._mode.__creator = modeCreator;
+ }
+ },
+
+ _doProcessBlock: function (words, offset) {
+ this._mode.processBlock(words, offset);
+ },
+
+ _doFinalize: function () {
+ var finalProcessedBlocks;
+
+ // Shortcut
+ var padding = this.cfg.padding;
+
+ // Finalize
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ // Pad data
+ padding.pad(this._data, this.blockSize);
+
+ // Process final blocks
+ finalProcessedBlocks = this._process(!!'flush');
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ // Process final blocks
+ finalProcessedBlocks = this._process(!!'flush');
+
+ // Unpad data
+ padding.unpad(finalProcessedBlocks);
+ }
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 128/32
+ });
+
+ /**
+ * A collection of cipher parameters.
+ *
+ * @property {WordArray} ciphertext The raw ciphertext.
+ * @property {WordArray} key The key to this ciphertext.
+ * @property {WordArray} iv The IV used in the ciphering operation.
+ * @property {WordArray} salt The salt used with a key derivation function.
+ * @property {Cipher} algorithm The cipher algorithm.
+ * @property {Mode} mode The block mode used in the ciphering operation.
+ * @property {Padding} padding The padding scheme used in the ciphering operation.
+ * @property {number} blockSize The block size of the cipher.
+ * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+ */
+ var CipherParams = C_lib.CipherParams = Base.extend({
+ /**
+ * Initializes a newly created cipher params object.
+ *
+ * @param {Object} cipherParams An object with any of the possible cipher parameters.
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.lib.CipherParams.create({
+ * ciphertext: ciphertextWordArray,
+ * key: keyWordArray,
+ * iv: ivWordArray,
+ * salt: saltWordArray,
+ * algorithm: CryptoJS.algo.AES,
+ * mode: CryptoJS.mode.CBC,
+ * padding: CryptoJS.pad.PKCS7,
+ * blockSize: 4,
+ * formatter: CryptoJS.format.OpenSSL
+ * });
+ */
+ init: function (cipherParams) {
+ this.mixIn(cipherParams);
+ },
+
+ /**
+ * Converts this cipher params object to a string.
+ *
+ * @param {Format} formatter (Optional) The formatting strategy to use.
+ *
+ * @return {string} The stringified cipher params.
+ *
+ * @throws Error If neither the formatter nor the default formatter is set.
+ *
+ * @example
+ *
+ * var string = cipherParams + '';
+ * var string = cipherParams.toString();
+ * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+ */
+ toString: function (formatter) {
+ return (formatter || this.formatter).stringify(this);
+ }
+ });
+
+ /**
+ * Format namespace.
+ */
+ var C_format = C.format = {};
+
+ /**
+ * OpenSSL formatting strategy.
+ */
+ var OpenSSLFormatter = C_format.OpenSSL = {
+ /**
+ * Converts a cipher params object to an OpenSSL-compatible string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The OpenSSL-compatible string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ var wordArray;
+
+ // Shortcuts
+ var ciphertext = cipherParams.ciphertext;
+ var salt = cipherParams.salt;
+
+ // Format
+ if (salt) {
+ wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+ } else {
+ wordArray = ciphertext;
+ }
+
+ return wordArray.toString(Base64);
+ },
+
+ /**
+ * Converts an OpenSSL-compatible string to a cipher params object.
+ *
+ * @param {string} openSSLStr The OpenSSL-compatible string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+ */
+ parse: function (openSSLStr) {
+ var salt;
+
+ // Parse base64
+ var ciphertext = Base64.parse(openSSLStr);
+
+ // Shortcut
+ var ciphertextWords = ciphertext.words;
+
+ // Test for salt
+ if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+ // Extract salt
+ salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+ // Remove salt from ciphertext
+ ciphertextWords.splice(0, 4);
+ ciphertext.sigBytes -= 16;
+ }
+
+ return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+ }
+ };
+
+ /**
+ * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+ */
+ var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+ */
+ cfg: Base.extend({
+ format: OpenSSLFormatter
+ }),
+
+ /**
+ * Encrypts a message.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Encrypt
+ var encryptor = cipher.createEncryptor(key, cfg);
+ var ciphertext = encryptor.finalize(message);
+
+ // Shortcut
+ var cipherCfg = encryptor.cfg;
+
+ // Create and return serializable cipher params
+ return CipherParams.create({
+ ciphertext: ciphertext,
+ key: key,
+ iv: cipherCfg.iv,
+ algorithm: cipher,
+ mode: cipherCfg.mode,
+ padding: cipherCfg.padding,
+ blockSize: cipher.blockSize,
+ formatter: cfg.format
+ });
+ },
+
+ /**
+ * Decrypts serialized ciphertext.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Decrypt
+ var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+ return plaintext;
+ },
+
+ /**
+ * Converts serialized ciphertext to CipherParams,
+ * else assumed CipherParams already and returns ciphertext unchanged.
+ *
+ * @param {CipherParams|string} ciphertext The ciphertext.
+ * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+ *
+ * @return {CipherParams} The unserialized ciphertext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+ */
+ _parse: function (ciphertext, format) {
+ if (typeof ciphertext == 'string') {
+ return format.parse(ciphertext, this);
+ } else {
+ return ciphertext;
+ }
+ }
+ });
+
+ /**
+ * Key derivation function namespace.
+ */
+ var C_kdf = C.kdf = {};
+
+ /**
+ * OpenSSL key derivation function.
+ */
+ var OpenSSLKdf = C_kdf.OpenSSL = {
+ /**
+ * Derives a key and IV from a password.
+ *
+ * @param {string} password The password to derive from.
+ * @param {number} keySize The size in words of the key to generate.
+ * @param {number} ivSize The size in words of the IV to generate.
+ * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+ *
+ * @return {CipherParams} A cipher params object with the key, IV, and salt.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+ */
+ execute: function (password, keySize, ivSize, salt, hasher) {
+ // Generate random salt
+ if (!salt) {
+ salt = WordArray.random(64/8);
+ }
+
+ // Derive key and IV
+ if (!hasher) {
+ var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+ } else {
+ var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);
+ }
+
+
+ // Separate key and IV
+ var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+ key.sigBytes = keySize * 4;
+
+ // Return params
+ return CipherParams.create({ key: key, iv: iv, salt: salt });
+ }
+ };
+
+ /**
+ * A serializable cipher wrapper that derives the key from a password,
+ * and returns ciphertext as a serializable cipher params object.
+ */
+ var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+ */
+ cfg: SerializableCipher.cfg.extend({
+ kdf: OpenSSLKdf
+ }),
+
+ /**
+ * Encrypts a message using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Encrypt
+ var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+ // Mix in derived params
+ ciphertext.mixIn(derivedParams);
+
+ return ciphertext;
+ },
+
+ /**
+ * Decrypts serialized ciphertext using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Decrypt
+ var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+ return plaintext;
+ }
+ });
+ }());
+
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/core.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/core.js
new file mode 100644
index 000000000..e3a498bc1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/core.js
@@ -0,0 +1,807 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory();
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define([], factory);
+ }
+ else {
+ // Global (browser)
+ root.CryptoJS = factory();
+ }
+}(this, function () {
+
+ /*globals window, global, require*/
+
+ /**
+ * CryptoJS core components.
+ */
+ var CryptoJS = CryptoJS || (function (Math, undefined) {
+
+ var crypto;
+
+ // Native crypto from window (Browser)
+ if (typeof window !== 'undefined' && window.crypto) {
+ crypto = window.crypto;
+ }
+
+ // Native crypto in web worker (Browser)
+ if (typeof self !== 'undefined' && self.crypto) {
+ crypto = self.crypto;
+ }
+
+ // Native crypto from worker
+ if (typeof globalThis !== 'undefined' && globalThis.crypto) {
+ crypto = globalThis.crypto;
+ }
+
+ // Native (experimental IE 11) crypto from window (Browser)
+ if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
+ crypto = window.msCrypto;
+ }
+
+ // Native crypto from global (NodeJS)
+ if (!crypto && typeof global !== 'undefined' && global.crypto) {
+ crypto = global.crypto;
+ }
+
+ // Native crypto import via require (NodeJS)
+ if (!crypto && typeof require === 'function') {
+ try {
+ crypto = require('crypto');
+ } catch (err) {}
+ }
+
+ /*
+ * Cryptographically secure pseudorandom number generator
+ *
+ * As Math.random() is cryptographically not safe to use
+ */
+ var cryptoSecureRandomInt = function () {
+ if (crypto) {
+ // Use getRandomValues method (Browser)
+ if (typeof crypto.getRandomValues === 'function') {
+ try {
+ return crypto.getRandomValues(new Uint32Array(1))[0];
+ } catch (err) {}
+ }
+
+ // Use randomBytes method (NodeJS)
+ if (typeof crypto.randomBytes === 'function') {
+ try {
+ return crypto.randomBytes(4).readInt32LE();
+ } catch (err) {}
+ }
+ }
+
+ throw new Error('Native crypto module could not be used to get secure random number.');
+ };
+
+ /*
+ * Local polyfill of Object.create
+
+ */
+ var create = Object.create || (function () {
+ function F() {}
+
+ return function (obj) {
+ var subtype;
+
+ F.prototype = obj;
+
+ subtype = new F();
+
+ F.prototype = null;
+
+ return subtype;
+ };
+ }());
+
+ /**
+ * CryptoJS namespace.
+ */
+ var C = {};
+
+ /**
+ * Library namespace.
+ */
+ var C_lib = C.lib = {};
+
+ /**
+ * Base object for prototypal inheritance.
+ */
+ var Base = C_lib.Base = (function () {
+
+
+ return {
+ /**
+ * Creates a new object that inherits from this object.
+ *
+ * @param {Object} overrides Properties to copy into the new object.
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * field: 'value',
+ *
+ * method: function () {
+ * }
+ * });
+ */
+ extend: function (overrides) {
+ // Spawn
+ var subtype = create(this);
+
+ // Augment
+ if (overrides) {
+ subtype.mixIn(overrides);
+ }
+
+ // Create default initializer
+ if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
+ subtype.init = function () {
+ subtype.$super.init.apply(this, arguments);
+ };
+ }
+
+ // Initializer's prototype is the subtype object
+ subtype.init.prototype = subtype;
+
+ // Reference supertype
+ subtype.$super = this;
+
+ return subtype;
+ },
+
+ /**
+ * Extends this object and runs the init method.
+ * Arguments to create() will be passed to init().
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var instance = MyType.create();
+ */
+ create: function () {
+ var instance = this.extend();
+ instance.init.apply(instance, arguments);
+
+ return instance;
+ },
+
+ /**
+ * Initializes a newly created object.
+ * Override this method to add some logic when your objects are created.
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * init: function () {
+ * // ...
+ * }
+ * });
+ */
+ init: function () {
+ },
+
+ /**
+ * Copies properties into this object.
+ *
+ * @param {Object} properties The properties to mix in.
+ *
+ * @example
+ *
+ * MyType.mixIn({
+ * field: 'value'
+ * });
+ */
+ mixIn: function (properties) {
+ for (var propertyName in properties) {
+ if (properties.hasOwnProperty(propertyName)) {
+ this[propertyName] = properties[propertyName];
+ }
+ }
+
+ // IE won't copy toString using the loop above
+ if (properties.hasOwnProperty('toString')) {
+ this.toString = properties.toString;
+ }
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = instance.clone();
+ */
+ clone: function () {
+ return this.init.prototype.extend(this);
+ }
+ };
+ }());
+
+ /**
+ * An array of 32-bit words.
+ *
+ * @property {Array} words The array of 32-bit words.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var WordArray = C_lib.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of 32-bit words.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.create();
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 4;
+ }
+ },
+
+ /**
+ * Converts this word array to a string.
+ *
+ * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+ *
+ * @return {string} The stringified word array.
+ *
+ * @example
+ *
+ * var string = wordArray + '';
+ * var string = wordArray.toString();
+ * var string = wordArray.toString(CryptoJS.enc.Utf8);
+ */
+ toString: function (encoder) {
+ return (encoder || Hex).stringify(this);
+ },
+
+ /**
+ * Concatenates a word array to this word array.
+ *
+ * @param {WordArray} wordArray The word array to append.
+ *
+ * @return {WordArray} This word array.
+ *
+ * @example
+ *
+ * wordArray1.concat(wordArray2);
+ */
+ concat: function (wordArray) {
+ // Shortcuts
+ var thisWords = this.words;
+ var thatWords = wordArray.words;
+ var thisSigBytes = this.sigBytes;
+ var thatSigBytes = wordArray.sigBytes;
+
+ // Clamp excess bits
+ this.clamp();
+
+ // Concat
+ if (thisSigBytes % 4) {
+ // Copy one byte at a time
+ for (var i = 0; i < thatSigBytes; i++) {
+ var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+ }
+ } else {
+ // Copy one word at a time
+ for (var j = 0; j < thatSigBytes; j += 4) {
+ thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
+ }
+ }
+ this.sigBytes += thatSigBytes;
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Removes insignificant bits.
+ *
+ * @example
+ *
+ * wordArray.clamp();
+ */
+ clamp: function () {
+ // Shortcuts
+ var words = this.words;
+ var sigBytes = this.sigBytes;
+
+ // Clamp
+ words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+ words.length = Math.ceil(sigBytes / 4);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = wordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone.words = this.words.slice(0);
+
+ return clone;
+ },
+
+ /**
+ * Creates a word array filled with random bytes.
+ *
+ * @param {number} nBytes The number of random bytes to generate.
+ *
+ * @return {WordArray} The random word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.random(16);
+ */
+ random: function (nBytes) {
+ var words = [];
+
+ for (var i = 0; i < nBytes; i += 4) {
+ words.push(cryptoSecureRandomInt());
+ }
+
+ return new WordArray.init(words, nBytes);
+ }
+ });
+
+ /**
+ * Encoder namespace.
+ */
+ var C_enc = C.enc = {};
+
+ /**
+ * Hex encoding strategy.
+ */
+ var Hex = C_enc.Hex = {
+ /**
+ * Converts a word array to a hex string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The hex string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var hexChars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ hexChars.push((bite >>> 4).toString(16));
+ hexChars.push((bite & 0x0f).toString(16));
+ }
+
+ return hexChars.join('');
+ },
+
+ /**
+ * Converts a hex string to a word array.
+ *
+ * @param {string} hexStr The hex string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Hex.parse(hexString);
+ */
+ parse: function (hexStr) {
+ // Shortcut
+ var hexStrLength = hexStr.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < hexStrLength; i += 2) {
+ words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+ }
+
+ return new WordArray.init(words, hexStrLength / 2);
+ }
+ };
+
+ /**
+ * Latin1 encoding strategy.
+ */
+ var Latin1 = C_enc.Latin1 = {
+ /**
+ * Converts a word array to a Latin1 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Latin1 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var latin1Chars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ latin1Chars.push(String.fromCharCode(bite));
+ }
+
+ return latin1Chars.join('');
+ },
+
+ /**
+ * Converts a Latin1 string to a word array.
+ *
+ * @param {string} latin1Str The Latin1 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+ */
+ parse: function (latin1Str) {
+ // Shortcut
+ var latin1StrLength = latin1Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < latin1StrLength; i++) {
+ words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+ }
+
+ return new WordArray.init(words, latin1StrLength);
+ }
+ };
+
+ /**
+ * UTF-8 encoding strategy.
+ */
+ var Utf8 = C_enc.Utf8 = {
+ /**
+ * Converts a word array to a UTF-8 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-8 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ try {
+ return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+ } catch (e) {
+ throw new Error('Malformed UTF-8 data');
+ }
+ },
+
+ /**
+ * Converts a UTF-8 string to a word array.
+ *
+ * @param {string} utf8Str The UTF-8 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+ */
+ parse: function (utf8Str) {
+ return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+ }
+ };
+
+ /**
+ * Abstract buffered block algorithm template.
+ *
+ * The property blockSize must be implemented in a concrete subtype.
+ *
+ * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+ */
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+ /**
+ * Resets this block algorithm's data buffer to its initial state.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm.reset();
+ */
+ reset: function () {
+ // Initial values
+ this._data = new WordArray.init();
+ this._nDataBytes = 0;
+ },
+
+ /**
+ * Adds new data to this block algorithm's buffer.
+ *
+ * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm._append('data');
+ * bufferedBlockAlgorithm._append(wordArray);
+ */
+ _append: function (data) {
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof data == 'string') {
+ data = Utf8.parse(data);
+ }
+
+ // Append
+ this._data.concat(data);
+ this._nDataBytes += data.sigBytes;
+ },
+
+ /**
+ * Processes available data blocks.
+ *
+ * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+ *
+ * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+ *
+ * @return {WordArray} The processed data.
+ *
+ * @example
+ *
+ * var processedData = bufferedBlockAlgorithm._process();
+ * var processedData = bufferedBlockAlgorithm._process(!!'flush');
+ */
+ _process: function (doFlush) {
+ var processedWords;
+
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var dataSigBytes = data.sigBytes;
+ var blockSize = this.blockSize;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count blocks ready
+ var nBlocksReady = dataSigBytes / blockSizeBytes;
+ if (doFlush) {
+ // Round up to include partial blocks
+ nBlocksReady = Math.ceil(nBlocksReady);
+ } else {
+ // Round down to include only full blocks,
+ // less the number of blocks that must remain in the buffer
+ nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+ }
+
+ // Count words ready
+ var nWordsReady = nBlocksReady * blockSize;
+
+ // Count bytes ready
+ var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+ // Process blocks
+ if (nWordsReady) {
+ for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+ // Perform concrete-algorithm logic
+ this._doProcessBlock(dataWords, offset);
+ }
+
+ // Remove processed words
+ processedWords = dataWords.splice(0, nWordsReady);
+ data.sigBytes -= nBytesReady;
+ }
+
+ // Return processed words
+ return new WordArray.init(processedWords, nBytesReady);
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = bufferedBlockAlgorithm.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone._data = this._data.clone();
+
+ return clone;
+ },
+
+ _minBufferSize: 0
+ });
+
+ /**
+ * Abstract hasher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+ */
+ var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Initializes a newly created hasher.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+ *
+ * @example
+ *
+ * var hasher = CryptoJS.algo.SHA256.create();
+ */
+ init: function (cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this hasher to its initial state.
+ *
+ * @example
+ *
+ * hasher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-hasher logic
+ this._doReset();
+ },
+
+ /**
+ * Updates this hasher with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {Hasher} This hasher.
+ *
+ * @example
+ *
+ * hasher.update('message');
+ * hasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ // Append
+ this._append(messageUpdate);
+
+ // Update the hash
+ this._process();
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the hash computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @example
+ *
+ * var hash = hasher.finalize();
+ * var hash = hasher.finalize('message');
+ * var hash = hasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Final message update
+ if (messageUpdate) {
+ this._append(messageUpdate);
+ }
+
+ // Perform concrete-hasher logic
+ var hash = this._doFinalize();
+
+ return hash;
+ },
+
+ blockSize: 512/32,
+
+ /**
+ * Creates a shortcut function to a hasher's object interface.
+ *
+ * @param {Hasher} hasher The hasher to create a helper for.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+ */
+ _createHelper: function (hasher) {
+ return function (message, cfg) {
+ return new hasher.init(cfg).finalize(message);
+ };
+ },
+
+ /**
+ * Creates a shortcut function to the HMAC's object interface.
+ *
+ * @param {Hasher} hasher The hasher to use in this HMAC helper.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+ */
+ _createHmacHelper: function (hasher) {
+ return function (message, key) {
+ return new C_algo.HMAC.init(hasher, key).finalize(message);
+ };
+ }
+ });
+
+ /**
+ * Algorithm namespace.
+ */
+ var C_algo = C.algo = {};
+
+ return C;
+ }(Math));
+
+
+ return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/crypto-js.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/crypto-js.js
new file mode 100644
index 000000000..958ee5339
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/crypto-js.js
@@ -0,0 +1,6657 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory();
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define([], factory);
+ }
+ else {
+ // Global (browser)
+ root.CryptoJS = factory();
+ }
+}(this, function () {
+
+ /*globals window, global, require*/
+
+ /**
+ * CryptoJS core components.
+ */
+ var CryptoJS = CryptoJS || (function (Math, undefined) {
+
+ var crypto;
+
+ // Native crypto from window (Browser)
+ if (typeof window !== 'undefined' && window.crypto) {
+ crypto = window.crypto;
+ }
+
+ // Native crypto in web worker (Browser)
+ if (typeof self !== 'undefined' && self.crypto) {
+ crypto = self.crypto;
+ }
+
+ // Native crypto from worker
+ if (typeof globalThis !== 'undefined' && globalThis.crypto) {
+ crypto = globalThis.crypto;
+ }
+
+ // Native (experimental IE 11) crypto from window (Browser)
+ if (!crypto && typeof window !== 'undefined' && window.msCrypto) {
+ crypto = window.msCrypto;
+ }
+
+ // Native crypto from global (NodeJS)
+ if (!crypto && typeof global !== 'undefined' && global.crypto) {
+ crypto = global.crypto;
+ }
+
+ // Native crypto import via require (NodeJS)
+ if (!crypto && typeof require === 'function') {
+ try {
+ crypto = require('crypto');
+ } catch (err) {}
+ }
+
+ /*
+ * Cryptographically secure pseudorandom number generator
+ *
+ * As Math.random() is cryptographically not safe to use
+ */
+ var cryptoSecureRandomInt = function () {
+ if (crypto) {
+ // Use getRandomValues method (Browser)
+ if (typeof crypto.getRandomValues === 'function') {
+ try {
+ return crypto.getRandomValues(new Uint32Array(1))[0];
+ } catch (err) {}
+ }
+
+ // Use randomBytes method (NodeJS)
+ if (typeof crypto.randomBytes === 'function') {
+ try {
+ return crypto.randomBytes(4).readInt32LE();
+ } catch (err) {}
+ }
+ }
+
+ throw new Error('Native crypto module could not be used to get secure random number.');
+ };
+
+ /*
+ * Local polyfill of Object.create
+
+ */
+ var create = Object.create || (function () {
+ function F() {}
+
+ return function (obj) {
+ var subtype;
+
+ F.prototype = obj;
+
+ subtype = new F();
+
+ F.prototype = null;
+
+ return subtype;
+ };
+ }());
+
+ /**
+ * CryptoJS namespace.
+ */
+ var C = {};
+
+ /**
+ * Library namespace.
+ */
+ var C_lib = C.lib = {};
+
+ /**
+ * Base object for prototypal inheritance.
+ */
+ var Base = C_lib.Base = (function () {
+
+
+ return {
+ /**
+ * Creates a new object that inherits from this object.
+ *
+ * @param {Object} overrides Properties to copy into the new object.
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * field: 'value',
+ *
+ * method: function () {
+ * }
+ * });
+ */
+ extend: function (overrides) {
+ // Spawn
+ var subtype = create(this);
+
+ // Augment
+ if (overrides) {
+ subtype.mixIn(overrides);
+ }
+
+ // Create default initializer
+ if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
+ subtype.init = function () {
+ subtype.$super.init.apply(this, arguments);
+ };
+ }
+
+ // Initializer's prototype is the subtype object
+ subtype.init.prototype = subtype;
+
+ // Reference supertype
+ subtype.$super = this;
+
+ return subtype;
+ },
+
+ /**
+ * Extends this object and runs the init method.
+ * Arguments to create() will be passed to init().
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var instance = MyType.create();
+ */
+ create: function () {
+ var instance = this.extend();
+ instance.init.apply(instance, arguments);
+
+ return instance;
+ },
+
+ /**
+ * Initializes a newly created object.
+ * Override this method to add some logic when your objects are created.
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * init: function () {
+ * // ...
+ * }
+ * });
+ */
+ init: function () {
+ },
+
+ /**
+ * Copies properties into this object.
+ *
+ * @param {Object} properties The properties to mix in.
+ *
+ * @example
+ *
+ * MyType.mixIn({
+ * field: 'value'
+ * });
+ */
+ mixIn: function (properties) {
+ for (var propertyName in properties) {
+ if (properties.hasOwnProperty(propertyName)) {
+ this[propertyName] = properties[propertyName];
+ }
+ }
+
+ // IE won't copy toString using the loop above
+ if (properties.hasOwnProperty('toString')) {
+ this.toString = properties.toString;
+ }
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = instance.clone();
+ */
+ clone: function () {
+ return this.init.prototype.extend(this);
+ }
+ };
+ }());
+
+ /**
+ * An array of 32-bit words.
+ *
+ * @property {Array} words The array of 32-bit words.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var WordArray = C_lib.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of 32-bit words.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.create();
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 4;
+ }
+ },
+
+ /**
+ * Converts this word array to a string.
+ *
+ * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+ *
+ * @return {string} The stringified word array.
+ *
+ * @example
+ *
+ * var string = wordArray + '';
+ * var string = wordArray.toString();
+ * var string = wordArray.toString(CryptoJS.enc.Utf8);
+ */
+ toString: function (encoder) {
+ return (encoder || Hex).stringify(this);
+ },
+
+ /**
+ * Concatenates a word array to this word array.
+ *
+ * @param {WordArray} wordArray The word array to append.
+ *
+ * @return {WordArray} This word array.
+ *
+ * @example
+ *
+ * wordArray1.concat(wordArray2);
+ */
+ concat: function (wordArray) {
+ // Shortcuts
+ var thisWords = this.words;
+ var thatWords = wordArray.words;
+ var thisSigBytes = this.sigBytes;
+ var thatSigBytes = wordArray.sigBytes;
+
+ // Clamp excess bits
+ this.clamp();
+
+ // Concat
+ if (thisSigBytes % 4) {
+ // Copy one byte at a time
+ for (var i = 0; i < thatSigBytes; i++) {
+ var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+ }
+ } else {
+ // Copy one word at a time
+ for (var j = 0; j < thatSigBytes; j += 4) {
+ thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2];
+ }
+ }
+ this.sigBytes += thatSigBytes;
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Removes insignificant bits.
+ *
+ * @example
+ *
+ * wordArray.clamp();
+ */
+ clamp: function () {
+ // Shortcuts
+ var words = this.words;
+ var sigBytes = this.sigBytes;
+
+ // Clamp
+ words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+ words.length = Math.ceil(sigBytes / 4);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = wordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone.words = this.words.slice(0);
+
+ return clone;
+ },
+
+ /**
+ * Creates a word array filled with random bytes.
+ *
+ * @param {number} nBytes The number of random bytes to generate.
+ *
+ * @return {WordArray} The random word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.random(16);
+ */
+ random: function (nBytes) {
+ var words = [];
+
+ for (var i = 0; i < nBytes; i += 4) {
+ words.push(cryptoSecureRandomInt());
+ }
+
+ return new WordArray.init(words, nBytes);
+ }
+ });
+
+ /**
+ * Encoder namespace.
+ */
+ var C_enc = C.enc = {};
+
+ /**
+ * Hex encoding strategy.
+ */
+ var Hex = C_enc.Hex = {
+ /**
+ * Converts a word array to a hex string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The hex string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var hexChars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ hexChars.push((bite >>> 4).toString(16));
+ hexChars.push((bite & 0x0f).toString(16));
+ }
+
+ return hexChars.join('');
+ },
+
+ /**
+ * Converts a hex string to a word array.
+ *
+ * @param {string} hexStr The hex string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Hex.parse(hexString);
+ */
+ parse: function (hexStr) {
+ // Shortcut
+ var hexStrLength = hexStr.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < hexStrLength; i += 2) {
+ words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+ }
+
+ return new WordArray.init(words, hexStrLength / 2);
+ }
+ };
+
+ /**
+ * Latin1 encoding strategy.
+ */
+ var Latin1 = C_enc.Latin1 = {
+ /**
+ * Converts a word array to a Latin1 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Latin1 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var latin1Chars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ latin1Chars.push(String.fromCharCode(bite));
+ }
+
+ return latin1Chars.join('');
+ },
+
+ /**
+ * Converts a Latin1 string to a word array.
+ *
+ * @param {string} latin1Str The Latin1 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+ */
+ parse: function (latin1Str) {
+ // Shortcut
+ var latin1StrLength = latin1Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < latin1StrLength; i++) {
+ words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+ }
+
+ return new WordArray.init(words, latin1StrLength);
+ }
+ };
+
+ /**
+ * UTF-8 encoding strategy.
+ */
+ var Utf8 = C_enc.Utf8 = {
+ /**
+ * Converts a word array to a UTF-8 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-8 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ try {
+ return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+ } catch (e) {
+ throw new Error('Malformed UTF-8 data');
+ }
+ },
+
+ /**
+ * Converts a UTF-8 string to a word array.
+ *
+ * @param {string} utf8Str The UTF-8 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+ */
+ parse: function (utf8Str) {
+ return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+ }
+ };
+
+ /**
+ * Abstract buffered block algorithm template.
+ *
+ * The property blockSize must be implemented in a concrete subtype.
+ *
+ * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+ */
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+ /**
+ * Resets this block algorithm's data buffer to its initial state.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm.reset();
+ */
+ reset: function () {
+ // Initial values
+ this._data = new WordArray.init();
+ this._nDataBytes = 0;
+ },
+
+ /**
+ * Adds new data to this block algorithm's buffer.
+ *
+ * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm._append('data');
+ * bufferedBlockAlgorithm._append(wordArray);
+ */
+ _append: function (data) {
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof data == 'string') {
+ data = Utf8.parse(data);
+ }
+
+ // Append
+ this._data.concat(data);
+ this._nDataBytes += data.sigBytes;
+ },
+
+ /**
+ * Processes available data blocks.
+ *
+ * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+ *
+ * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+ *
+ * @return {WordArray} The processed data.
+ *
+ * @example
+ *
+ * var processedData = bufferedBlockAlgorithm._process();
+ * var processedData = bufferedBlockAlgorithm._process(!!'flush');
+ */
+ _process: function (doFlush) {
+ var processedWords;
+
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var dataSigBytes = data.sigBytes;
+ var blockSize = this.blockSize;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count blocks ready
+ var nBlocksReady = dataSigBytes / blockSizeBytes;
+ if (doFlush) {
+ // Round up to include partial blocks
+ nBlocksReady = Math.ceil(nBlocksReady);
+ } else {
+ // Round down to include only full blocks,
+ // less the number of blocks that must remain in the buffer
+ nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+ }
+
+ // Count words ready
+ var nWordsReady = nBlocksReady * blockSize;
+
+ // Count bytes ready
+ var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+ // Process blocks
+ if (nWordsReady) {
+ for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+ // Perform concrete-algorithm logic
+ this._doProcessBlock(dataWords, offset);
+ }
+
+ // Remove processed words
+ processedWords = dataWords.splice(0, nWordsReady);
+ data.sigBytes -= nBytesReady;
+ }
+
+ // Return processed words
+ return new WordArray.init(processedWords, nBytesReady);
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = bufferedBlockAlgorithm.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone._data = this._data.clone();
+
+ return clone;
+ },
+
+ _minBufferSize: 0
+ });
+
+ /**
+ * Abstract hasher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+ */
+ var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Initializes a newly created hasher.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+ *
+ * @example
+ *
+ * var hasher = CryptoJS.algo.SHA256.create();
+ */
+ init: function (cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this hasher to its initial state.
+ *
+ * @example
+ *
+ * hasher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-hasher logic
+ this._doReset();
+ },
+
+ /**
+ * Updates this hasher with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {Hasher} This hasher.
+ *
+ * @example
+ *
+ * hasher.update('message');
+ * hasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ // Append
+ this._append(messageUpdate);
+
+ // Update the hash
+ this._process();
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the hash computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @example
+ *
+ * var hash = hasher.finalize();
+ * var hash = hasher.finalize('message');
+ * var hash = hasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Final message update
+ if (messageUpdate) {
+ this._append(messageUpdate);
+ }
+
+ // Perform concrete-hasher logic
+ var hash = this._doFinalize();
+
+ return hash;
+ },
+
+ blockSize: 512/32,
+
+ /**
+ * Creates a shortcut function to a hasher's object interface.
+ *
+ * @param {Hasher} hasher The hasher to create a helper for.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+ */
+ _createHelper: function (hasher) {
+ return function (message, cfg) {
+ return new hasher.init(cfg).finalize(message);
+ };
+ },
+
+ /**
+ * Creates a shortcut function to the HMAC's object interface.
+ *
+ * @param {Hasher} hasher The hasher to use in this HMAC helper.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+ */
+ _createHmacHelper: function (hasher) {
+ return function (message, key) {
+ return new C_algo.HMAC.init(hasher, key).finalize(message);
+ };
+ }
+ });
+
+ /**
+ * Algorithm namespace.
+ */
+ var C_algo = C.algo = {};
+
+ return C;
+ }(Math));
+
+
+ (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var X32WordArray = C_lib.WordArray;
+
+ /**
+ * x64 namespace.
+ */
+ var C_x64 = C.x64 = {};
+
+ /**
+ * A 64-bit word.
+ */
+ var X64Word = C_x64.Word = Base.extend({
+ /**
+ * Initializes a newly created 64-bit word.
+ *
+ * @param {number} high The high 32 bits.
+ * @param {number} low The low 32 bits.
+ *
+ * @example
+ *
+ * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+ */
+ init: function (high, low) {
+ this.high = high;
+ this.low = low;
+ }
+
+ /**
+ * Bitwise NOTs this word.
+ *
+ * @return {X64Word} A new x64-Word object after negating.
+ *
+ * @example
+ *
+ * var negated = x64Word.not();
+ */
+ // not: function () {
+ // var high = ~this.high;
+ // var low = ~this.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ANDs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to AND with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ANDing.
+ *
+ * @example
+ *
+ * var anded = x64Word.and(anotherX64Word);
+ */
+ // and: function (word) {
+ // var high = this.high & word.high;
+ // var low = this.low & word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to OR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ORing.
+ *
+ * @example
+ *
+ * var ored = x64Word.or(anotherX64Word);
+ */
+ // or: function (word) {
+ // var high = this.high | word.high;
+ // var low = this.low | word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise XORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to XOR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after XORing.
+ *
+ * @example
+ *
+ * var xored = x64Word.xor(anotherX64Word);
+ */
+ // xor: function (word) {
+ // var high = this.high ^ word.high;
+ // var low = this.low ^ word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the left.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftL(25);
+ */
+ // shiftL: function (n) {
+ // if (n < 32) {
+ // var high = (this.high << n) | (this.low >>> (32 - n));
+ // var low = this.low << n;
+ // } else {
+ // var high = this.low << (n - 32);
+ // var low = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the right.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftR(7);
+ */
+ // shiftR: function (n) {
+ // if (n < 32) {
+ // var low = (this.low >>> n) | (this.high << (32 - n));
+ // var high = this.high >>> n;
+ // } else {
+ // var low = this.high >>> (n - 32);
+ // var high = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Rotates this word n bits to the left.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotL(25);
+ */
+ // rotL: function (n) {
+ // return this.shiftL(n).or(this.shiftR(64 - n));
+ // },
+
+ /**
+ * Rotates this word n bits to the right.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotR(7);
+ */
+ // rotR: function (n) {
+ // return this.shiftR(n).or(this.shiftL(64 - n));
+ // },
+
+ /**
+ * Adds this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to add with this word.
+ *
+ * @return {X64Word} A new x64-Word object after adding.
+ *
+ * @example
+ *
+ * var added = x64Word.add(anotherX64Word);
+ */
+ // add: function (word) {
+ // var low = (this.low + word.low) | 0;
+ // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+ // var high = (this.high + word.high + carry) | 0;
+
+ // return X64Word.create(high, low);
+ // }
+ });
+
+ /**
+ * An array of 64-bit words.
+ *
+ * @property {Array} words The array of CryptoJS.x64.Word objects.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var X64WordArray = C_x64.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create();
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ]);
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ], 10);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 8;
+ }
+ },
+
+ /**
+ * Converts this 64-bit word array to a 32-bit word array.
+ *
+ * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+ *
+ * @example
+ *
+ * var x32WordArray = x64WordArray.toX32();
+ */
+ toX32: function () {
+ // Shortcuts
+ var x64Words = this.words;
+ var x64WordsLength = x64Words.length;
+
+ // Convert
+ var x32Words = [];
+ for (var i = 0; i < x64WordsLength; i++) {
+ var x64Word = x64Words[i];
+ x32Words.push(x64Word.high);
+ x32Words.push(x64Word.low);
+ }
+
+ return X32WordArray.create(x32Words, this.sigBytes);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {X64WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = x64WordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+
+ // Clone "words" array
+ var words = clone.words = this.words.slice(0);
+
+ // Clone each X64Word object
+ var wordsLength = words.length;
+ for (var i = 0; i < wordsLength; i++) {
+ words[i] = words[i].clone();
+ }
+
+ return clone;
+ }
+ });
+ }());
+
+
+ (function () {
+ // Check if typed arrays are supported
+ if (typeof ArrayBuffer != 'function') {
+ return;
+ }
+
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+
+ // Reference original init
+ var superInit = WordArray.init;
+
+ // Augment WordArray.init to handle typed arrays
+ var subInit = WordArray.init = function (typedArray) {
+ // Convert buffers to uint8
+ if (typedArray instanceof ArrayBuffer) {
+ typedArray = new Uint8Array(typedArray);
+ }
+
+ // Convert other array views to uint8
+ if (
+ typedArray instanceof Int8Array ||
+ (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
+ typedArray instanceof Int16Array ||
+ typedArray instanceof Uint16Array ||
+ typedArray instanceof Int32Array ||
+ typedArray instanceof Uint32Array ||
+ typedArray instanceof Float32Array ||
+ typedArray instanceof Float64Array
+ ) {
+ typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+ }
+
+ // Handle Uint8Array
+ if (typedArray instanceof Uint8Array) {
+ // Shortcut
+ var typedArrayByteLength = typedArray.byteLength;
+
+ // Extract bytes
+ var words = [];
+ for (var i = 0; i < typedArrayByteLength; i++) {
+ words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+ }
+
+ // Initialize this word array
+ superInit.call(this, words, typedArrayByteLength);
+ } else {
+ // Else call normal init
+ superInit.apply(this, arguments);
+ }
+ };
+
+ subInit.prototype = WordArray;
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * UTF-16 BE encoding strategy.
+ */
+ var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+ /**
+ * Converts a word array to a UTF-16 BE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 BE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 BE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 BE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ /**
+ * UTF-16 LE encoding strategy.
+ */
+ C_enc.Utf16LE = {
+ /**
+ * Converts a word array to a UTF-16 LE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 LE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 LE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 LE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ function swapEndian(word) {
+ return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+ }
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64 encoding strategy.
+ */
+ var Base64 = C_enc.Base64 = {
+ /**
+ * Converts a word array to a Base64 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Base64 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64 string to a word array.
+ *
+ * @param {string} base64Str The Base64 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64.parse(base64String);
+ */
+ parse: function (base64Str) {
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = this._map;
+ var reverseMap = this._reverseMap;
+
+ if (!reverseMap) {
+ reverseMap = this._reverseMap = [];
+ for (var j = 0; j < map.length; j++) {
+ reverseMap[map.charCodeAt(j)] = j;
+ }
+ }
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex !== -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ return parseLoop(base64Str, base64StrLength, reverseMap);
+
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+ };
+
+ function parseLoop(base64Str, base64StrLength, reverseMap) {
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+ var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+ var bitsCombined = bits1 | bits2;
+ words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+ return WordArray.create(words, nBytes);
+ }
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64url encoding strategy.
+ */
+ var Base64url = C_enc.Base64url = {
+ /**
+ * Converts a word array to a Base64url string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @param {boolean} urlSafe Whether to use url safe
+ *
+ * @return {string} The Base64url string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
+ */
+ stringify: function (wordArray, urlSafe) {
+ if (urlSafe === undefined) {
+ urlSafe = true
+ }
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = urlSafe ? this._safe_map : this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64url string to a word array.
+ *
+ * @param {string} base64Str The Base64url string.
+ *
+ * @param {boolean} urlSafe Whether to use url safe
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64url.parse(base64String);
+ */
+ parse: function (base64Str, urlSafe) {
+ if (urlSafe === undefined) {
+ urlSafe = true
+ }
+
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = urlSafe ? this._safe_map : this._map;
+ var reverseMap = this._reverseMap;
+
+ if (!reverseMap) {
+ reverseMap = this._reverseMap = [];
+ for (var j = 0; j < map.length; j++) {
+ reverseMap[map.charCodeAt(j)] = j;
+ }
+ }
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex !== -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ return parseLoop(base64Str, base64StrLength, reverseMap);
+
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
+ _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+ };
+
+ function parseLoop(base64Str, base64StrLength, reverseMap) {
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+ var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+ var bitsCombined = bits1 | bits2;
+ words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+ return WordArray.create(words, nBytes);
+ }
+ }());
+
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var T = [];
+
+ // Compute constants
+ (function () {
+ for (var i = 0; i < 64; i++) {
+ T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+ }
+ }());
+
+ /**
+ * MD5 hash algorithm.
+ */
+ var MD5 = C_algo.MD5 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+
+ // Shortcuts
+ var H = this._hash.words;
+
+ var M_offset_0 = M[offset + 0];
+ var M_offset_1 = M[offset + 1];
+ var M_offset_2 = M[offset + 2];
+ var M_offset_3 = M[offset + 3];
+ var M_offset_4 = M[offset + 4];
+ var M_offset_5 = M[offset + 5];
+ var M_offset_6 = M[offset + 6];
+ var M_offset_7 = M[offset + 7];
+ var M_offset_8 = M[offset + 8];
+ var M_offset_9 = M[offset + 9];
+ var M_offset_10 = M[offset + 10];
+ var M_offset_11 = M[offset + 11];
+ var M_offset_12 = M[offset + 12];
+ var M_offset_13 = M[offset + 13];
+ var M_offset_14 = M[offset + 14];
+ var M_offset_15 = M[offset + 15];
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+
+ // Computation
+ a = FF(a, b, c, d, M_offset_0, 7, T[0]);
+ d = FF(d, a, b, c, M_offset_1, 12, T[1]);
+ c = FF(c, d, a, b, M_offset_2, 17, T[2]);
+ b = FF(b, c, d, a, M_offset_3, 22, T[3]);
+ a = FF(a, b, c, d, M_offset_4, 7, T[4]);
+ d = FF(d, a, b, c, M_offset_5, 12, T[5]);
+ c = FF(c, d, a, b, M_offset_6, 17, T[6]);
+ b = FF(b, c, d, a, M_offset_7, 22, T[7]);
+ a = FF(a, b, c, d, M_offset_8, 7, T[8]);
+ d = FF(d, a, b, c, M_offset_9, 12, T[9]);
+ c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+ b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+ a = FF(a, b, c, d, M_offset_12, 7, T[12]);
+ d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+ c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+ b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+ a = GG(a, b, c, d, M_offset_1, 5, T[16]);
+ d = GG(d, a, b, c, M_offset_6, 9, T[17]);
+ c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+ b = GG(b, c, d, a, M_offset_0, 20, T[19]);
+ a = GG(a, b, c, d, M_offset_5, 5, T[20]);
+ d = GG(d, a, b, c, M_offset_10, 9, T[21]);
+ c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+ b = GG(b, c, d, a, M_offset_4, 20, T[23]);
+ a = GG(a, b, c, d, M_offset_9, 5, T[24]);
+ d = GG(d, a, b, c, M_offset_14, 9, T[25]);
+ c = GG(c, d, a, b, M_offset_3, 14, T[26]);
+ b = GG(b, c, d, a, M_offset_8, 20, T[27]);
+ a = GG(a, b, c, d, M_offset_13, 5, T[28]);
+ d = GG(d, a, b, c, M_offset_2, 9, T[29]);
+ c = GG(c, d, a, b, M_offset_7, 14, T[30]);
+ b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+ a = HH(a, b, c, d, M_offset_5, 4, T[32]);
+ d = HH(d, a, b, c, M_offset_8, 11, T[33]);
+ c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+ b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+ a = HH(a, b, c, d, M_offset_1, 4, T[36]);
+ d = HH(d, a, b, c, M_offset_4, 11, T[37]);
+ c = HH(c, d, a, b, M_offset_7, 16, T[38]);
+ b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+ a = HH(a, b, c, d, M_offset_13, 4, T[40]);
+ d = HH(d, a, b, c, M_offset_0, 11, T[41]);
+ c = HH(c, d, a, b, M_offset_3, 16, T[42]);
+ b = HH(b, c, d, a, M_offset_6, 23, T[43]);
+ a = HH(a, b, c, d, M_offset_9, 4, T[44]);
+ d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+ c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+ b = HH(b, c, d, a, M_offset_2, 23, T[47]);
+
+ a = II(a, b, c, d, M_offset_0, 6, T[48]);
+ d = II(d, a, b, c, M_offset_7, 10, T[49]);
+ c = II(c, d, a, b, M_offset_14, 15, T[50]);
+ b = II(b, c, d, a, M_offset_5, 21, T[51]);
+ a = II(a, b, c, d, M_offset_12, 6, T[52]);
+ d = II(d, a, b, c, M_offset_3, 10, T[53]);
+ c = II(c, d, a, b, M_offset_10, 15, T[54]);
+ b = II(b, c, d, a, M_offset_1, 21, T[55]);
+ a = II(a, b, c, d, M_offset_8, 6, T[56]);
+ d = II(d, a, b, c, M_offset_15, 10, T[57]);
+ c = II(c, d, a, b, M_offset_6, 15, T[58]);
+ b = II(b, c, d, a, M_offset_13, 21, T[59]);
+ a = II(a, b, c, d, M_offset_4, 6, T[60]);
+ d = II(d, a, b, c, M_offset_11, 10, T[61]);
+ c = II(c, d, a, b, M_offset_2, 15, T[62]);
+ b = II(b, c, d, a, M_offset_9, 21, T[63]);
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+ var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+ var nBitsTotalL = nBitsTotal;
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+ (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
+ );
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
+ );
+
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ function FF(a, b, c, d, x, s, t) {
+ var n = a + ((b & c) | (~b & d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function GG(a, b, c, d, x, s, t) {
+ var n = a + ((b & d) | (c & ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function HH(a, b, c, d, x, s, t) {
+ var n = a + (b ^ c ^ d) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function II(a, b, c, d, x, s, t) {
+ var n = a + (c ^ (b | ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.MD5('message');
+ * var hash = CryptoJS.MD5(wordArray);
+ */
+ C.MD5 = Hasher._createHelper(MD5);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacMD5(message, key);
+ */
+ C.HmacMD5 = Hasher._createHmacHelper(MD5);
+ }(Math));
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-1 hash algorithm.
+ */
+ var SHA1 = C_algo.SHA1 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476,
+ 0xc3d2e1f0
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+
+ // Computation
+ for (var i = 0; i < 80; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+ W[i] = (n << 1) | (n >>> 31);
+ }
+
+ var t = ((a << 5) | (a >>> 27)) + e + W[i];
+ if (i < 20) {
+ t += ((b & c) | (~b & d)) + 0x5a827999;
+ } else if (i < 40) {
+ t += (b ^ c ^ d) + 0x6ed9eba1;
+ } else if (i < 60) {
+ t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+ } else /* if (i < 80) */ {
+ t += (b ^ c ^ d) - 0x359d3e2a;
+ }
+
+ e = d;
+ d = c;
+ c = (b << 30) | (b >>> 2);
+ b = a;
+ a = t;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA1('message');
+ * var hash = CryptoJS.SHA1(wordArray);
+ */
+ C.SHA1 = Hasher._createHelper(SHA1);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA1(message, key);
+ */
+ C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+ }());
+
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Initialization and round constants tables
+ var H = [];
+ var K = [];
+
+ // Compute constants
+ (function () {
+ function isPrime(n) {
+ var sqrtN = Math.sqrt(n);
+ for (var factor = 2; factor <= sqrtN; factor++) {
+ if (!(n % factor)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function getFractionalBits(n) {
+ return ((n - (n | 0)) * 0x100000000) | 0;
+ }
+
+ var n = 2;
+ var nPrime = 0;
+ while (nPrime < 64) {
+ if (isPrime(n)) {
+ if (nPrime < 8) {
+ H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+ }
+ K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+ nPrime++;
+ }
+
+ n++;
+ }
+ }());
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-256 hash algorithm.
+ */
+ var SHA256 = C_algo.SHA256 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init(H.slice(0));
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+ var f = H[5];
+ var g = H[6];
+ var h = H[7];
+
+ // Computation
+ for (var i = 0; i < 64; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var gamma0x = W[i - 15];
+ var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
+ ((gamma0x << 14) | (gamma0x >>> 18)) ^
+ (gamma0x >>> 3);
+
+ var gamma1x = W[i - 2];
+ var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+ ((gamma1x << 13) | (gamma1x >>> 19)) ^
+ (gamma1x >>> 10);
+
+ W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+ }
+
+ var ch = (e & f) ^ (~e & g);
+ var maj = (a & b) ^ (a & c) ^ (b & c);
+
+ var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+ var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
+
+ var t1 = h + sigma1 + ch + K[i] + W[i];
+ var t2 = sigma0 + maj;
+
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ H[5] = (H[5] + f) | 0;
+ H[6] = (H[6] + g) | 0;
+ H[7] = (H[7] + h) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA256('message');
+ * var hash = CryptoJS.SHA256(wordArray);
+ */
+ C.SHA256 = Hasher._createHelper(SHA256);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA256(message, key);
+ */
+ C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+ }(Math));
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+
+ /**
+ * SHA-224 hash algorithm.
+ */
+ var SHA224 = C_algo.SHA224 = SHA256.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+ 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA256._doFinalize.call(this);
+
+ hash.sigBytes -= 4;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA224('message');
+ * var hash = CryptoJS.SHA224(wordArray);
+ */
+ C.SHA224 = SHA256._createHelper(SHA224);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA224(message, key);
+ */
+ C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+
+ function X64Word_create() {
+ return X64Word.create.apply(X64Word, arguments);
+ }
+
+ // Constants
+ var K = [
+ X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+ X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+ X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+ X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+ X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+ X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+ X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+ X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+ X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+ X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+ X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+ X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+ X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+ X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+ X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+ X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+ X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+ X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+ X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+ X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+ X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+ X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+ X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+ X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+ X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+ X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+ X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+ X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+ X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+ X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+ X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+ X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+ X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+ X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+ X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+ X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+ X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+ X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+ X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+ X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+ ];
+
+ // Reusable objects
+ var W = [];
+ (function () {
+ for (var i = 0; i < 80; i++) {
+ W[i] = X64Word_create();
+ }
+ }());
+
+ /**
+ * SHA-512 hash algorithm.
+ */
+ var SHA512 = C_algo.SHA512 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+ new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+ new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+ new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var H = this._hash.words;
+
+ var H0 = H[0];
+ var H1 = H[1];
+ var H2 = H[2];
+ var H3 = H[3];
+ var H4 = H[4];
+ var H5 = H[5];
+ var H6 = H[6];
+ var H7 = H[7];
+
+ var H0h = H0.high;
+ var H0l = H0.low;
+ var H1h = H1.high;
+ var H1l = H1.low;
+ var H2h = H2.high;
+ var H2l = H2.low;
+ var H3h = H3.high;
+ var H3l = H3.low;
+ var H4h = H4.high;
+ var H4l = H4.low;
+ var H5h = H5.high;
+ var H5l = H5.low;
+ var H6h = H6.high;
+ var H6l = H6.low;
+ var H7h = H7.high;
+ var H7l = H7.low;
+
+ // Working variables
+ var ah = H0h;
+ var al = H0l;
+ var bh = H1h;
+ var bl = H1l;
+ var ch = H2h;
+ var cl = H2l;
+ var dh = H3h;
+ var dl = H3l;
+ var eh = H4h;
+ var el = H4l;
+ var fh = H5h;
+ var fl = H5l;
+ var gh = H6h;
+ var gl = H6l;
+ var hh = H7h;
+ var hl = H7l;
+
+ // Rounds
+ for (var i = 0; i < 80; i++) {
+ var Wil;
+ var Wih;
+
+ // Shortcut
+ var Wi = W[i];
+
+ // Extend message
+ if (i < 16) {
+ Wih = Wi.high = M[offset + i * 2] | 0;
+ Wil = Wi.low = M[offset + i * 2 + 1] | 0;
+ } else {
+ // Gamma0
+ var gamma0x = W[i - 15];
+ var gamma0xh = gamma0x.high;
+ var gamma0xl = gamma0x.low;
+ var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+ var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+ // Gamma1
+ var gamma1x = W[i - 2];
+ var gamma1xh = gamma1x.high;
+ var gamma1xl = gamma1x.low;
+ var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+ var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+ // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+ var Wi7 = W[i - 7];
+ var Wi7h = Wi7.high;
+ var Wi7l = Wi7.low;
+
+ var Wi16 = W[i - 16];
+ var Wi16h = Wi16.high;
+ var Wi16l = Wi16.low;
+
+ Wil = gamma0l + Wi7l;
+ Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+ Wil = Wil + gamma1l;
+ Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+ Wil = Wil + Wi16l;
+ Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+ Wi.high = Wih;
+ Wi.low = Wil;
+ }
+
+ var chh = (eh & fh) ^ (~eh & gh);
+ var chl = (el & fl) ^ (~el & gl);
+ var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+ var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+ var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+ var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+ var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+ var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+ // t1 = h + sigma1 + ch + K[i] + W[i]
+ var Ki = K[i];
+ var Kih = Ki.high;
+ var Kil = Ki.low;
+
+ var t1l = hl + sigma1l;
+ var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+ var t1l = t1l + chl;
+ var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+ var t1l = t1l + Kil;
+ var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+ var t1l = t1l + Wil;
+ var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+ // t2 = sigma0 + maj
+ var t2l = sigma0l + majl;
+ var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+ // Update working variables
+ hh = gh;
+ hl = gl;
+ gh = fh;
+ gl = fl;
+ fh = eh;
+ fl = el;
+ el = (dl + t1l) | 0;
+ eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+ dh = ch;
+ dl = cl;
+ ch = bh;
+ cl = bl;
+ bh = ah;
+ bl = al;
+ al = (t1l + t2l) | 0;
+ ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+ }
+
+ // Intermediate hash value
+ H0l = H0.low = (H0l + al);
+ H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+ H1l = H1.low = (H1l + bl);
+ H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+ H2l = H2.low = (H2l + cl);
+ H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+ H3l = H3.low = (H3l + dl);
+ H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+ H4l = H4.low = (H4l + el);
+ H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+ H5l = H5.low = (H5l + fl);
+ H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+ H6l = H6.low = (H6l + gl);
+ H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+ H7l = H7.low = (H7l + hl);
+ H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Convert hash to 32-bit word array before returning
+ var hash = this._hash.toX32();
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ },
+
+ blockSize: 1024/32
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA512('message');
+ * var hash = CryptoJS.SHA512(wordArray);
+ */
+ C.SHA512 = Hasher._createHelper(SHA512);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA512(message, key);
+ */
+ C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+ var SHA512 = C_algo.SHA512;
+
+ /**
+ * SHA-384 hash algorithm.
+ */
+ var SHA384 = C_algo.SHA384 = SHA512.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+ new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+ new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+ new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA512._doFinalize.call(this);
+
+ hash.sigBytes -= 16;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA384('message');
+ * var hash = CryptoJS.SHA384(wordArray);
+ */
+ C.SHA384 = SHA512._createHelper(SHA384);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA384(message, key);
+ */
+ C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+ }());
+
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var C_algo = C.algo;
+
+ // Constants tables
+ var RHO_OFFSETS = [];
+ var PI_INDEXES = [];
+ var ROUND_CONSTANTS = [];
+
+ // Compute Constants
+ (function () {
+ // Compute rho offset constants
+ var x = 1, y = 0;
+ for (var t = 0; t < 24; t++) {
+ RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+ var newX = y % 5;
+ var newY = (2 * x + 3 * y) % 5;
+ x = newX;
+ y = newY;
+ }
+
+ // Compute pi index constants
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+ }
+ }
+
+ // Compute round constants
+ var LFSR = 0x01;
+ for (var i = 0; i < 24; i++) {
+ var roundConstantMsw = 0;
+ var roundConstantLsw = 0;
+
+ for (var j = 0; j < 7; j++) {
+ if (LFSR & 0x01) {
+ var bitPosition = (1 << j) - 1;
+ if (bitPosition < 32) {
+ roundConstantLsw ^= 1 << bitPosition;
+ } else /* if (bitPosition >= 32) */ {
+ roundConstantMsw ^= 1 << (bitPosition - 32);
+ }
+ }
+
+ // Compute next LFSR
+ if (LFSR & 0x80) {
+ // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+ LFSR = (LFSR << 1) ^ 0x71;
+ } else {
+ LFSR <<= 1;
+ }
+ }
+
+ ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+ }
+ }());
+
+ // Reusable objects for temporary values
+ var T = [];
+ (function () {
+ for (var i = 0; i < 25; i++) {
+ T[i] = X64Word.create();
+ }
+ }());
+
+ /**
+ * SHA-3 hash algorithm.
+ */
+ var SHA3 = C_algo.SHA3 = Hasher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} outputLength
+ * The desired number of bits in the output hash.
+ * Only values permitted are: 224, 256, 384, 512.
+ * Default: 512
+ */
+ cfg: Hasher.cfg.extend({
+ outputLength: 512
+ }),
+
+ _doReset: function () {
+ var state = this._state = []
+ for (var i = 0; i < 25; i++) {
+ state[i] = new X64Word.init();
+ }
+
+ this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var state = this._state;
+ var nBlockSizeLanes = this.blockSize / 2;
+
+ // Absorb
+ for (var i = 0; i < nBlockSizeLanes; i++) {
+ // Shortcuts
+ var M2i = M[offset + 2 * i];
+ var M2i1 = M[offset + 2 * i + 1];
+
+ // Swap endian
+ M2i = (
+ (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
+ (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
+ );
+ M2i1 = (
+ (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
+ (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
+ );
+
+ // Absorb message into state
+ var lane = state[i];
+ lane.high ^= M2i1;
+ lane.low ^= M2i;
+ }
+
+ // Rounds
+ for (var round = 0; round < 24; round++) {
+ // Theta
+ for (var x = 0; x < 5; x++) {
+ // Mix column lanes
+ var tMsw = 0, tLsw = 0;
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ tMsw ^= lane.high;
+ tLsw ^= lane.low;
+ }
+
+ // Temporary values
+ var Tx = T[x];
+ Tx.high = tMsw;
+ Tx.low = tLsw;
+ }
+ for (var x = 0; x < 5; x++) {
+ // Shortcuts
+ var Tx4 = T[(x + 4) % 5];
+ var Tx1 = T[(x + 1) % 5];
+ var Tx1Msw = Tx1.high;
+ var Tx1Lsw = Tx1.low;
+
+ // Mix surrounding columns
+ var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+ var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ lane.high ^= tMsw;
+ lane.low ^= tLsw;
+ }
+ }
+
+ // Rho Pi
+ for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+ var tMsw;
+ var tLsw;
+
+ // Shortcuts
+ var lane = state[laneIndex];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+ var rhoOffset = RHO_OFFSETS[laneIndex];
+
+ // Rotate lanes
+ if (rhoOffset < 32) {
+ tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+ tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+ } else /* if (rhoOffset >= 32) */ {
+ tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+ tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+ }
+
+ // Transpose lanes
+ var TPiLane = T[PI_INDEXES[laneIndex]];
+ TPiLane.high = tMsw;
+ TPiLane.low = tLsw;
+ }
+
+ // Rho pi at x = y = 0
+ var T0 = T[0];
+ var state0 = state[0];
+ T0.high = state0.high;
+ T0.low = state0.low;
+
+ // Chi
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ // Shortcuts
+ var laneIndex = x + 5 * y;
+ var lane = state[laneIndex];
+ var TLane = T[laneIndex];
+ var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+ var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+ // Mix rows
+ lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+ lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
+ }
+ }
+
+ // Iota
+ var lane = state[0];
+ var roundConstant = ROUND_CONSTANTS[round];
+ lane.high ^= roundConstant.high;
+ lane.low ^= roundConstant.low;
+ }
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+ var blockSizeBits = this.blockSize * 32;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+ dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var state = this._state;
+ var outputLengthBytes = this.cfg.outputLength / 8;
+ var outputLengthLanes = outputLengthBytes / 8;
+
+ // Squeeze
+ var hashWords = [];
+ for (var i = 0; i < outputLengthLanes; i++) {
+ // Shortcuts
+ var lane = state[i];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+
+ // Swap endian
+ laneMsw = (
+ (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
+ (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
+ );
+ laneLsw = (
+ (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
+ (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
+ );
+
+ // Squeeze state to retrieve hash
+ hashWords.push(laneLsw);
+ hashWords.push(laneMsw);
+ }
+
+ // Return final computed hash
+ return new WordArray.init(hashWords, outputLengthBytes);
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+
+ var state = clone._state = this._state.slice(0);
+ for (var i = 0; i < 25; i++) {
+ state[i] = state[i].clone();
+ }
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA3('message');
+ * var hash = CryptoJS.SHA3(wordArray);
+ */
+ C.SHA3 = Hasher._createHelper(SHA3);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA3(message, key);
+ */
+ C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+ }(Math));
+
+
+ /** @preserve
+ (c) 2012 by Cédric Mesnil. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var _zl = WordArray.create([
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
+ var _zr = WordArray.create([
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
+ var _sl = WordArray.create([
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
+ var _sr = WordArray.create([
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
+
+ var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+ var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+ /**
+ * RIPEMD160 hash algorithm.
+ */
+ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+ _doReset: function () {
+ this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ // Swap
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+ // Shortcut
+ var H = this._hash.words;
+ var hl = _hl.words;
+ var hr = _hr.words;
+ var zl = _zl.words;
+ var zr = _zr.words;
+ var sl = _sl.words;
+ var sr = _sr.words;
+
+ // Working variables
+ var al, bl, cl, dl, el;
+ var ar, br, cr, dr, er;
+
+ ar = al = H[0];
+ br = bl = H[1];
+ cr = cl = H[2];
+ dr = dl = H[3];
+ er = el = H[4];
+ // Computation
+ var t;
+ for (var i = 0; i < 80; i += 1) {
+ t = (al + M[offset+zl[i]])|0;
+ if (i<16){
+ t += f1(bl,cl,dl) + hl[0];
+ } else if (i<32) {
+ t += f2(bl,cl,dl) + hl[1];
+ } else if (i<48) {
+ t += f3(bl,cl,dl) + hl[2];
+ } else if (i<64) {
+ t += f4(bl,cl,dl) + hl[3];
+ } else {// if (i<80) {
+ t += f5(bl,cl,dl) + hl[4];
+ }
+ t = t|0;
+ t = rotl(t,sl[i]);
+ t = (t+el)|0;
+ al = el;
+ el = dl;
+ dl = rotl(cl, 10);
+ cl = bl;
+ bl = t;
+
+ t = (ar + M[offset+zr[i]])|0;
+ if (i<16){
+ t += f5(br,cr,dr) + hr[0];
+ } else if (i<32) {
+ t += f4(br,cr,dr) + hr[1];
+ } else if (i<48) {
+ t += f3(br,cr,dr) + hr[2];
+ } else if (i<64) {
+ t += f2(br,cr,dr) + hr[3];
+ } else {// if (i<80) {
+ t += f1(br,cr,dr) + hr[4];
+ }
+ t = t|0;
+ t = rotl(t,sr[i]) ;
+ t = (t+er)|0;
+ ar = er;
+ er = dr;
+ dr = rotl(cr, 10);
+ cr = br;
+ br = t;
+ }
+ // Intermediate hash value
+ t = (H[1] + cl + dr)|0;
+ H[1] = (H[2] + dl + er)|0;
+ H[2] = (H[3] + el + ar)|0;
+ H[3] = (H[4] + al + br)|0;
+ H[4] = (H[0] + bl + cr)|0;
+ H[0] = t;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
+ );
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 5; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ // Swap
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+
+ function f1(x, y, z) {
+ return ((x) ^ (y) ^ (z));
+
+ }
+
+ function f2(x, y, z) {
+ return (((x)&(y)) | ((~x)&(z)));
+ }
+
+ function f3(x, y, z) {
+ return (((x) | (~(y))) ^ (z));
+ }
+
+ function f4(x, y, z) {
+ return (((x) & (z)) | ((y)&(~(z))));
+ }
+
+ function f5(x, y, z) {
+ return ((x) ^ ((y) |(~(z))));
+
+ }
+
+ function rotl(x,n) {
+ return (x<>>(32-n));
+ }
+
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.RIPEMD160('message');
+ * var hash = CryptoJS.RIPEMD160(wordArray);
+ */
+ C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacRIPEMD160(message, key);
+ */
+ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+ }(Math));
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var C_algo = C.algo;
+
+ /**
+ * HMAC algorithm.
+ */
+ var HMAC = C_algo.HMAC = Base.extend({
+ /**
+ * Initializes a newly created HMAC.
+ *
+ * @param {Hasher} hasher The hash algorithm to use.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @example
+ *
+ * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+ */
+ init: function (hasher, key) {
+ // Init hasher
+ hasher = this._hasher = new hasher.init();
+
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof key == 'string') {
+ key = Utf8.parse(key);
+ }
+
+ // Shortcuts
+ var hasherBlockSize = hasher.blockSize;
+ var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+ // Allow arbitrary length keys
+ if (key.sigBytes > hasherBlockSizeBytes) {
+ key = hasher.finalize(key);
+ }
+
+ // Clamp excess bits
+ key.clamp();
+
+ // Clone key for inner and outer pads
+ var oKey = this._oKey = key.clone();
+ var iKey = this._iKey = key.clone();
+
+ // Shortcuts
+ var oKeyWords = oKey.words;
+ var iKeyWords = iKey.words;
+
+ // XOR keys with pad constants
+ for (var i = 0; i < hasherBlockSize; i++) {
+ oKeyWords[i] ^= 0x5c5c5c5c;
+ iKeyWords[i] ^= 0x36363636;
+ }
+ oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this HMAC to its initial state.
+ *
+ * @example
+ *
+ * hmacHasher.reset();
+ */
+ reset: function () {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Reset
+ hasher.reset();
+ hasher.update(this._iKey);
+ },
+
+ /**
+ * Updates this HMAC with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {HMAC} This HMAC instance.
+ *
+ * @example
+ *
+ * hmacHasher.update('message');
+ * hmacHasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ this._hasher.update(messageUpdate);
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the HMAC computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @example
+ *
+ * var hmac = hmacHasher.finalize();
+ * var hmac = hmacHasher.finalize('message');
+ * var hmac = hmacHasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Compute HMAC
+ var innerHash = hasher.finalize(messageUpdate);
+ hasher.reset();
+ var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+ return hmac;
+ }
+ });
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+ var HMAC = C_algo.HMAC;
+
+ /**
+ * Password-Based Key Derivation Function 2 algorithm.
+ */
+ var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hasher to use. Default: SHA256
+ * @property {number} iterations The number of iterations to perform. Default: 250000
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: SHA256,
+ iterations: 250000
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.PBKDF2.create();
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init HMAC
+ var hmac = HMAC.create(cfg.hasher, password);
+
+ // Initial values
+ var derivedKey = WordArray.create();
+ var blockIndex = WordArray.create([0x00000001]);
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var blockIndexWords = blockIndex.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ var block = hmac.update(salt).finalize(blockIndex);
+ hmac.reset();
+
+ // Shortcuts
+ var blockWords = block.words;
+ var blockWordsLength = blockWords.length;
+
+ // Iterations
+ var intermediate = block;
+ for (var i = 1; i < iterations; i++) {
+ intermediate = hmac.finalize(intermediate);
+ hmac.reset();
+
+ // Shortcut
+ var intermediateWords = intermediate.words;
+
+ // XOR intermediate with block
+ for (var j = 0; j < blockWordsLength; j++) {
+ blockWords[j] ^= intermediateWords[j];
+ }
+ }
+
+ derivedKey.concat(block);
+ blockIndexWords[0]++;
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.PBKDF2(password, salt);
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.PBKDF2 = function (password, salt, cfg) {
+ return PBKDF2.create(cfg).compute(password, salt);
+ };
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var MD5 = C_algo.MD5;
+
+ /**
+ * This key derivation function is meant to conform with EVP_BytesToKey.
+ * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+ */
+ var EvpKDF = C_algo.EvpKDF = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: MD5,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.EvpKDF.create();
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ var block;
+
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init hasher
+ var hasher = cfg.hasher.create();
+
+ // Initial values
+ var derivedKey = WordArray.create();
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ if (block) {
+ hasher.update(block);
+ }
+ block = hasher.update(password).finalize(salt);
+ hasher.reset();
+
+ // Iterations
+ for (var i = 1; i < iterations; i++) {
+ block = hasher.finalize(block);
+ hasher.reset();
+ }
+
+ derivedKey.concat(block);
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.EvpKDF(password, salt);
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.EvpKDF = function (password, salt, cfg) {
+ return EvpKDF.create(cfg).compute(password, salt);
+ };
+ }());
+
+
+ /**
+ * Cipher core components.
+ */
+ CryptoJS.lib.Cipher || (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var Base64 = C_enc.Base64;
+ var C_algo = C.algo;
+ var EvpKDF = C_algo.EvpKDF;
+
+ /**
+ * Abstract base cipher template.
+ *
+ * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+ * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+ * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+ * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+ */
+ var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {WordArray} iv The IV to use for this operation.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Creates this cipher in encryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createEncryptor: function (key, cfg) {
+ return this.create(this._ENC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Creates this cipher in decryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createDecryptor: function (key, cfg) {
+ return this.create(this._DEC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Initializes a newly created cipher.
+ *
+ * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+ */
+ init: function (xformMode, key, cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Store transform mode and key
+ this._xformMode = xformMode;
+ this._key = key;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this cipher to its initial state.
+ *
+ * @example
+ *
+ * cipher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-cipher logic
+ this._doReset();
+ },
+
+ /**
+ * Adds data to be encrypted or decrypted.
+ *
+ * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.process('data');
+ * var encrypted = cipher.process(wordArray);
+ */
+ process: function (dataUpdate) {
+ // Append
+ this._append(dataUpdate);
+
+ // Process available blocks
+ return this._process();
+ },
+
+ /**
+ * Finalizes the encryption or decryption process.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after final processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.finalize();
+ * var encrypted = cipher.finalize('data');
+ * var encrypted = cipher.finalize(wordArray);
+ */
+ finalize: function (dataUpdate) {
+ // Final data update
+ if (dataUpdate) {
+ this._append(dataUpdate);
+ }
+
+ // Perform concrete-cipher logic
+ var finalProcessedData = this._doFinalize();
+
+ return finalProcessedData;
+ },
+
+ keySize: 128/32,
+
+ ivSize: 128/32,
+
+ _ENC_XFORM_MODE: 1,
+
+ _DEC_XFORM_MODE: 2,
+
+ /**
+ * Creates shortcut functions to a cipher's object interface.
+ *
+ * @param {Cipher} cipher The cipher to create a helper for.
+ *
+ * @return {Object} An object with encrypt and decrypt shortcut functions.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+ */
+ _createHelper: (function () {
+ function selectCipherStrategy(key) {
+ if (typeof key == 'string') {
+ return PasswordBasedCipher;
+ } else {
+ return SerializableCipher;
+ }
+ }
+
+ return function (cipher) {
+ return {
+ encrypt: function (message, key, cfg) {
+ return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+ },
+
+ decrypt: function (ciphertext, key, cfg) {
+ return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+ }
+ };
+ };
+ }())
+ });
+
+ /**
+ * Abstract base stream cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+ */
+ var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+ _doFinalize: function () {
+ // Process partial blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 1
+ });
+
+ /**
+ * Mode namespace.
+ */
+ var C_mode = C.mode = {};
+
+ /**
+ * Abstract base block cipher mode template.
+ */
+ var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+ /**
+ * Creates this mode for encryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+ */
+ createEncryptor: function (cipher, iv) {
+ return this.Encryptor.create(cipher, iv);
+ },
+
+ /**
+ * Creates this mode for decryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+ */
+ createDecryptor: function (cipher, iv) {
+ return this.Decryptor.create(cipher, iv);
+ },
+
+ /**
+ * Initializes a newly created mode.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+ */
+ init: function (cipher, iv) {
+ this._cipher = cipher;
+ this._iv = iv;
+ }
+ });
+
+ /**
+ * Cipher Block Chaining mode.
+ */
+ var CBC = C_mode.CBC = (function () {
+ /**
+ * Abstract base CBC mode.
+ */
+ var CBC = BlockCipherMode.extend();
+
+ /**
+ * CBC encryptor.
+ */
+ CBC.Encryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // XOR and encrypt
+ xorBlock.call(this, words, offset, blockSize);
+ cipher.encryptBlock(words, offset);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ /**
+ * CBC decryptor.
+ */
+ CBC.Decryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ // Decrypt and XOR
+ cipher.decryptBlock(words, offset);
+ xorBlock.call(this, words, offset, blockSize);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function xorBlock(words, offset, blockSize) {
+ var block;
+
+ // Shortcut
+ var iv = this._iv;
+
+ // Choose mixing block
+ if (iv) {
+ block = iv;
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ block = this._prevBlock;
+ }
+
+ // XOR blocks
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= block[i];
+ }
+ }
+
+ return CBC;
+ }());
+
+ /**
+ * Padding namespace.
+ */
+ var C_pad = C.pad = {};
+
+ /**
+ * PKCS #5/7 padding strategy.
+ */
+ var Pkcs7 = C_pad.Pkcs7 = {
+ /**
+ * Pads data using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to pad.
+ * @param {number} blockSize The multiple that the data should be padded to.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+ */
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Create padding word
+ var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+ // Create padding
+ var paddingWords = [];
+ for (var i = 0; i < nPaddingBytes; i += 4) {
+ paddingWords.push(paddingWord);
+ }
+ var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+ // Add padding
+ data.concat(padding);
+ },
+
+ /**
+ * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to unpad.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.unpad(wordArray);
+ */
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+ /**
+ * Abstract base block cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+ */
+ var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Mode} mode The block mode to use. Default: CBC
+ * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+ */
+ cfg: Cipher.cfg.extend({
+ mode: CBC,
+ padding: Pkcs7
+ }),
+
+ reset: function () {
+ var modeCreator;
+
+ // Reset cipher
+ Cipher.reset.call(this);
+
+ // Shortcuts
+ var cfg = this.cfg;
+ var iv = cfg.iv;
+ var mode = cfg.mode;
+
+ // Reset block mode
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ modeCreator = mode.createEncryptor;
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ modeCreator = mode.createDecryptor;
+ // Keep at least one block in the buffer for unpadding
+ this._minBufferSize = 1;
+ }
+
+ if (this._mode && this._mode.__creator == modeCreator) {
+ this._mode.init(this, iv && iv.words);
+ } else {
+ this._mode = modeCreator.call(mode, this, iv && iv.words);
+ this._mode.__creator = modeCreator;
+ }
+ },
+
+ _doProcessBlock: function (words, offset) {
+ this._mode.processBlock(words, offset);
+ },
+
+ _doFinalize: function () {
+ var finalProcessedBlocks;
+
+ // Shortcut
+ var padding = this.cfg.padding;
+
+ // Finalize
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ // Pad data
+ padding.pad(this._data, this.blockSize);
+
+ // Process final blocks
+ finalProcessedBlocks = this._process(!!'flush');
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ // Process final blocks
+ finalProcessedBlocks = this._process(!!'flush');
+
+ // Unpad data
+ padding.unpad(finalProcessedBlocks);
+ }
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 128/32
+ });
+
+ /**
+ * A collection of cipher parameters.
+ *
+ * @property {WordArray} ciphertext The raw ciphertext.
+ * @property {WordArray} key The key to this ciphertext.
+ * @property {WordArray} iv The IV used in the ciphering operation.
+ * @property {WordArray} salt The salt used with a key derivation function.
+ * @property {Cipher} algorithm The cipher algorithm.
+ * @property {Mode} mode The block mode used in the ciphering operation.
+ * @property {Padding} padding The padding scheme used in the ciphering operation.
+ * @property {number} blockSize The block size of the cipher.
+ * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+ */
+ var CipherParams = C_lib.CipherParams = Base.extend({
+ /**
+ * Initializes a newly created cipher params object.
+ *
+ * @param {Object} cipherParams An object with any of the possible cipher parameters.
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.lib.CipherParams.create({
+ * ciphertext: ciphertextWordArray,
+ * key: keyWordArray,
+ * iv: ivWordArray,
+ * salt: saltWordArray,
+ * algorithm: CryptoJS.algo.AES,
+ * mode: CryptoJS.mode.CBC,
+ * padding: CryptoJS.pad.PKCS7,
+ * blockSize: 4,
+ * formatter: CryptoJS.format.OpenSSL
+ * });
+ */
+ init: function (cipherParams) {
+ this.mixIn(cipherParams);
+ },
+
+ /**
+ * Converts this cipher params object to a string.
+ *
+ * @param {Format} formatter (Optional) The formatting strategy to use.
+ *
+ * @return {string} The stringified cipher params.
+ *
+ * @throws Error If neither the formatter nor the default formatter is set.
+ *
+ * @example
+ *
+ * var string = cipherParams + '';
+ * var string = cipherParams.toString();
+ * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+ */
+ toString: function (formatter) {
+ return (formatter || this.formatter).stringify(this);
+ }
+ });
+
+ /**
+ * Format namespace.
+ */
+ var C_format = C.format = {};
+
+ /**
+ * OpenSSL formatting strategy.
+ */
+ var OpenSSLFormatter = C_format.OpenSSL = {
+ /**
+ * Converts a cipher params object to an OpenSSL-compatible string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The OpenSSL-compatible string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ var wordArray;
+
+ // Shortcuts
+ var ciphertext = cipherParams.ciphertext;
+ var salt = cipherParams.salt;
+
+ // Format
+ if (salt) {
+ wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+ } else {
+ wordArray = ciphertext;
+ }
+
+ return wordArray.toString(Base64);
+ },
+
+ /**
+ * Converts an OpenSSL-compatible string to a cipher params object.
+ *
+ * @param {string} openSSLStr The OpenSSL-compatible string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+ */
+ parse: function (openSSLStr) {
+ var salt;
+
+ // Parse base64
+ var ciphertext = Base64.parse(openSSLStr);
+
+ // Shortcut
+ var ciphertextWords = ciphertext.words;
+
+ // Test for salt
+ if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+ // Extract salt
+ salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+ // Remove salt from ciphertext
+ ciphertextWords.splice(0, 4);
+ ciphertext.sigBytes -= 16;
+ }
+
+ return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+ }
+ };
+
+ /**
+ * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+ */
+ var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+ */
+ cfg: Base.extend({
+ format: OpenSSLFormatter
+ }),
+
+ /**
+ * Encrypts a message.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Encrypt
+ var encryptor = cipher.createEncryptor(key, cfg);
+ var ciphertext = encryptor.finalize(message);
+
+ // Shortcut
+ var cipherCfg = encryptor.cfg;
+
+ // Create and return serializable cipher params
+ return CipherParams.create({
+ ciphertext: ciphertext,
+ key: key,
+ iv: cipherCfg.iv,
+ algorithm: cipher,
+ mode: cipherCfg.mode,
+ padding: cipherCfg.padding,
+ blockSize: cipher.blockSize,
+ formatter: cfg.format
+ });
+ },
+
+ /**
+ * Decrypts serialized ciphertext.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Decrypt
+ var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+ return plaintext;
+ },
+
+ /**
+ * Converts serialized ciphertext to CipherParams,
+ * else assumed CipherParams already and returns ciphertext unchanged.
+ *
+ * @param {CipherParams|string} ciphertext The ciphertext.
+ * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+ *
+ * @return {CipherParams} The unserialized ciphertext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+ */
+ _parse: function (ciphertext, format) {
+ if (typeof ciphertext == 'string') {
+ return format.parse(ciphertext, this);
+ } else {
+ return ciphertext;
+ }
+ }
+ });
+
+ /**
+ * Key derivation function namespace.
+ */
+ var C_kdf = C.kdf = {};
+
+ /**
+ * OpenSSL key derivation function.
+ */
+ var OpenSSLKdf = C_kdf.OpenSSL = {
+ /**
+ * Derives a key and IV from a password.
+ *
+ * @param {string} password The password to derive from.
+ * @param {number} keySize The size in words of the key to generate.
+ * @param {number} ivSize The size in words of the IV to generate.
+ * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+ *
+ * @return {CipherParams} A cipher params object with the key, IV, and salt.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+ */
+ execute: function (password, keySize, ivSize, salt, hasher) {
+ // Generate random salt
+ if (!salt) {
+ salt = WordArray.random(64/8);
+ }
+
+ // Derive key and IV
+ if (!hasher) {
+ var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+ } else {
+ var key = EvpKDF.create({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt);
+ }
+
+
+ // Separate key and IV
+ var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+ key.sigBytes = keySize * 4;
+
+ // Return params
+ return CipherParams.create({ key: key, iv: iv, salt: salt });
+ }
+ };
+
+ /**
+ * A serializable cipher wrapper that derives the key from a password,
+ * and returns ciphertext as a serializable cipher params object.
+ */
+ var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+ */
+ cfg: SerializableCipher.cfg.extend({
+ kdf: OpenSSLKdf
+ }),
+
+ /**
+ * Encrypts a message using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, cfg.salt, cfg.hasher);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Encrypt
+ var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+ // Mix in derived params
+ ciphertext.mixIn(derivedParams);
+
+ return ciphertext;
+ },
+
+ /**
+ * Decrypts serialized ciphertext using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt, cfg.hasher);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Decrypt
+ var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+ return plaintext;
+ }
+ });
+ }());
+
+
+ /**
+ * Cipher Feedback block mode.
+ */
+ CryptoJS.mode.CFB = (function () {
+ var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ CFB.Encryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ CFB.Decryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+ var keystream;
+
+ // Shortcut
+ var iv = this._iv;
+
+ // Generate keystream
+ if (iv) {
+ keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ keystream = this._prevBlock;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+
+ return CFB;
+ }());
+
+
+ /**
+ * Counter block mode.
+ */
+ CryptoJS.mode.CTR = (function () {
+ var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = CTR.Encryptor = CTR.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Increment counter
+ counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTR.Decryptor = Encryptor;
+
+ return CTR;
+ }());
+
+
+ /** @preserve
+ * Counter block mode compatible with Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+ CryptoJS.mode.CTRGladman = (function () {
+ var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+ function incWord(word)
+ {
+ if (((word >> 24) & 0xff) === 0xff) { //overflow
+ var b1 = (word >> 16)&0xff;
+ var b2 = (word >> 8)&0xff;
+ var b3 = word & 0xff;
+
+ if (b1 === 0xff) // overflow b1
+ {
+ b1 = 0;
+ if (b2 === 0xff)
+ {
+ b2 = 0;
+ if (b3 === 0xff)
+ {
+ b3 = 0;
+ }
+ else
+ {
+ ++b3;
+ }
+ }
+ else
+ {
+ ++b2;
+ }
+ }
+ else
+ {
+ ++b1;
+ }
+
+ word = 0;
+ word += (b1 << 16);
+ word += (b2 << 8);
+ word += b3;
+ }
+ else
+ {
+ word += (0x01 << 24);
+ }
+ return word;
+ }
+
+ function incCounter(counter)
+ {
+ if ((counter[0] = incWord(counter[0])) === 0)
+ {
+ // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
+ counter[1] = incWord(counter[1]);
+ }
+ return counter;
+ }
+
+ var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+
+ incCounter(counter);
+
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTRGladman.Decryptor = Encryptor;
+
+ return CTRGladman;
+ }());
+
+
+
+
+ /**
+ * Output Feedback block mode.
+ */
+ CryptoJS.mode.OFB = (function () {
+ var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = OFB.Encryptor = OFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var keystream = this._keystream;
+
+ // Generate keystream
+ if (iv) {
+ keystream = this._keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ OFB.Decryptor = Encryptor;
+
+ return OFB;
+ }());
+
+
+ /**
+ * Electronic Codebook block mode.
+ */
+ CryptoJS.mode.ECB = (function () {
+ var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+ ECB.Encryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.encryptBlock(words, offset);
+ }
+ });
+
+ ECB.Decryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.decryptBlock(words, offset);
+ }
+ });
+
+ return ECB;
+ }());
+
+
+ /**
+ * ANSI X.923 padding strategy.
+ */
+ CryptoJS.pad.AnsiX923 = {
+ pad: function (data, blockSize) {
+ // Shortcuts
+ var dataSigBytes = data.sigBytes;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+ // Compute last byte position
+ var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+ // Pad
+ data.clamp();
+ data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+ data.sigBytes += nPaddingBytes;
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+
+ /**
+ * ISO 10126 padding strategy.
+ */
+ CryptoJS.pad.Iso10126 = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Pad
+ data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+ concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+
+ /**
+ * ISO/IEC 9797-1 Padding Method 2.
+ */
+ CryptoJS.pad.Iso97971 = {
+ pad: function (data, blockSize) {
+ // Add 0x80 byte
+ data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+ // Zero pad the rest
+ CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+ },
+
+ unpad: function (data) {
+ // Remove zero padding
+ CryptoJS.pad.ZeroPadding.unpad(data);
+
+ // Remove one more byte -- the 0x80 byte
+ data.sigBytes--;
+ }
+ };
+
+
+ /**
+ * Zero padding strategy.
+ */
+ CryptoJS.pad.ZeroPadding = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Pad
+ data.clamp();
+ data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+ },
+
+ unpad: function (data) {
+ // Shortcut
+ var dataWords = data.words;
+
+ // Unpad
+ var i = data.sigBytes - 1;
+ for (var i = data.sigBytes - 1; i >= 0; i--) {
+ if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+ data.sigBytes = i + 1;
+ break;
+ }
+ }
+ }
+ };
+
+
+ /**
+ * A noop padding strategy.
+ */
+ CryptoJS.pad.NoPadding = {
+ pad: function () {
+ },
+
+ unpad: function () {
+ }
+ };
+
+
+ (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var CipherParams = C_lib.CipherParams;
+ var C_enc = C.enc;
+ var Hex = C_enc.Hex;
+ var C_format = C.format;
+
+ var HexFormatter = C_format.Hex = {
+ /**
+ * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The hexadecimally encoded string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ return cipherParams.ciphertext.toString(Hex);
+ },
+
+ /**
+ * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+ *
+ * @param {string} input The hexadecimally encoded string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.Hex.parse(hexString);
+ */
+ parse: function (input) {
+ var ciphertext = Hex.parse(input);
+ return CipherParams.create({ ciphertext: ciphertext });
+ }
+ };
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Lookup tables
+ var SBOX = [];
+ var INV_SBOX = [];
+ var SUB_MIX_0 = [];
+ var SUB_MIX_1 = [];
+ var SUB_MIX_2 = [];
+ var SUB_MIX_3 = [];
+ var INV_SUB_MIX_0 = [];
+ var INV_SUB_MIX_1 = [];
+ var INV_SUB_MIX_2 = [];
+ var INV_SUB_MIX_3 = [];
+
+ // Compute lookup tables
+ (function () {
+ // Compute double table
+ var d = [];
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ d[i] = i << 1;
+ } else {
+ d[i] = (i << 1) ^ 0x11b;
+ }
+ }
+
+ // Walk GF(2^8)
+ var x = 0;
+ var xi = 0;
+ for (var i = 0; i < 256; i++) {
+ // Compute sbox
+ var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+ sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+ SBOX[x] = sx;
+ INV_SBOX[sx] = x;
+
+ // Compute multiplication
+ var x2 = d[x];
+ var x4 = d[x2];
+ var x8 = d[x4];
+
+ // Compute sub bytes, mix columns tables
+ var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+ SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+ SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+ SUB_MIX_2[x] = (t << 8) | (t >>> 24);
+ SUB_MIX_3[x] = t;
+
+ // Compute inv sub bytes, inv mix columns tables
+ var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+ INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+ INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+ INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
+ INV_SUB_MIX_3[sx] = t;
+
+ // Compute next counter
+ if (!x) {
+ x = xi = 1;
+ } else {
+ x = x2 ^ d[d[d[x8 ^ x2]]];
+ xi ^= d[d[xi]];
+ }
+ }
+ }());
+
+ // Precomputed Rcon lookup
+ var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+ /**
+ * AES block cipher algorithm.
+ */
+ var AES = C_algo.AES = BlockCipher.extend({
+ _doReset: function () {
+ var t;
+
+ // Skip reset of nRounds has been set before and key did not change
+ if (this._nRounds && this._keyPriorReset === this._key) {
+ return;
+ }
+
+ // Shortcuts
+ var key = this._keyPriorReset = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ // Compute number of rounds
+ var nRounds = this._nRounds = keySize + 6;
+
+ // Compute number of key schedule rows
+ var ksRows = (nRounds + 1) * 4;
+
+ // Compute key schedule
+ var keySchedule = this._keySchedule = [];
+ for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+ if (ksRow < keySize) {
+ keySchedule[ksRow] = keyWords[ksRow];
+ } else {
+ t = keySchedule[ksRow - 1];
+
+ if (!(ksRow % keySize)) {
+ // Rot word
+ t = (t << 8) | (t >>> 24);
+
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+ // Mix Rcon
+ t ^= RCON[(ksRow / keySize) | 0] << 24;
+ } else if (keySize > 6 && ksRow % keySize == 4) {
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+ }
+
+ keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+ }
+ }
+
+ // Compute inv key schedule
+ var invKeySchedule = this._invKeySchedule = [];
+ for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+ var ksRow = ksRows - invKsRow;
+
+ if (invKsRow % 4) {
+ var t = keySchedule[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 4];
+ }
+
+ if (invKsRow < 4 || ksRow <= 4) {
+ invKeySchedule[invKsRow] = t;
+ } else {
+ invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+ }
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+ },
+
+ decryptBlock: function (M, offset) {
+ // Swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+
+ this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+ // Inv swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+ },
+
+ _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+ // Shortcut
+ var nRounds = this._nRounds;
+
+ // Get input, add round key
+ var s0 = M[offset] ^ keySchedule[0];
+ var s1 = M[offset + 1] ^ keySchedule[1];
+ var s2 = M[offset + 2] ^ keySchedule[2];
+ var s3 = M[offset + 3] ^ keySchedule[3];
+
+ // Key schedule row counter
+ var ksRow = 4;
+
+ // Rounds
+ for (var round = 1; round < nRounds; round++) {
+ // Shift rows, sub bytes, mix columns, add round key
+ var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+ var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+ var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+ var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+ // Update state
+ s0 = t0;
+ s1 = t1;
+ s2 = t2;
+ s3 = t3;
+ }
+
+ // Shift rows, sub bytes, add round key
+ var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+ var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+ var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+ var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+ // Set output
+ M[offset] = t0;
+ M[offset + 1] = t1;
+ M[offset + 2] = t2;
+ M[offset + 3] = t3;
+ },
+
+ keySize: 256/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+ */
+ C.AES = BlockCipher._createHelper(AES);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Permuted Choice 1 constants
+ var PC1 = [
+ 57, 49, 41, 33, 25, 17, 9, 1,
+ 58, 50, 42, 34, 26, 18, 10, 2,
+ 59, 51, 43, 35, 27, 19, 11, 3,
+ 60, 52, 44, 36, 63, 55, 47, 39,
+ 31, 23, 15, 7, 62, 54, 46, 38,
+ 30, 22, 14, 6, 61, 53, 45, 37,
+ 29, 21, 13, 5, 28, 20, 12, 4
+ ];
+
+ // Permuted Choice 2 constants
+ var PC2 = [
+ 14, 17, 11, 24, 1, 5,
+ 3, 28, 15, 6, 21, 10,
+ 23, 19, 12, 4, 26, 8,
+ 16, 7, 27, 20, 13, 2,
+ 41, 52, 31, 37, 47, 55,
+ 30, 40, 51, 45, 33, 48,
+ 44, 49, 39, 56, 34, 53,
+ 46, 42, 50, 36, 29, 32
+ ];
+
+ // Cumulative bit shift constants
+ var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+ // SBOXes and round permutation constants
+ var SBOX_P = [
+ {
+ 0x0: 0x808200,
+ 0x10000000: 0x8000,
+ 0x20000000: 0x808002,
+ 0x30000000: 0x2,
+ 0x40000000: 0x200,
+ 0x50000000: 0x808202,
+ 0x60000000: 0x800202,
+ 0x70000000: 0x800000,
+ 0x80000000: 0x202,
+ 0x90000000: 0x800200,
+ 0xa0000000: 0x8200,
+ 0xb0000000: 0x808000,
+ 0xc0000000: 0x8002,
+ 0xd0000000: 0x800002,
+ 0xe0000000: 0x0,
+ 0xf0000000: 0x8202,
+ 0x8000000: 0x0,
+ 0x18000000: 0x808202,
+ 0x28000000: 0x8202,
+ 0x38000000: 0x8000,
+ 0x48000000: 0x808200,
+ 0x58000000: 0x200,
+ 0x68000000: 0x808002,
+ 0x78000000: 0x2,
+ 0x88000000: 0x800200,
+ 0x98000000: 0x8200,
+ 0xa8000000: 0x808000,
+ 0xb8000000: 0x800202,
+ 0xc8000000: 0x800002,
+ 0xd8000000: 0x8002,
+ 0xe8000000: 0x202,
+ 0xf8000000: 0x800000,
+ 0x1: 0x8000,
+ 0x10000001: 0x2,
+ 0x20000001: 0x808200,
+ 0x30000001: 0x800000,
+ 0x40000001: 0x808002,
+ 0x50000001: 0x8200,
+ 0x60000001: 0x200,
+ 0x70000001: 0x800202,
+ 0x80000001: 0x808202,
+ 0x90000001: 0x808000,
+ 0xa0000001: 0x800002,
+ 0xb0000001: 0x8202,
+ 0xc0000001: 0x202,
+ 0xd0000001: 0x800200,
+ 0xe0000001: 0x8002,
+ 0xf0000001: 0x0,
+ 0x8000001: 0x808202,
+ 0x18000001: 0x808000,
+ 0x28000001: 0x800000,
+ 0x38000001: 0x200,
+ 0x48000001: 0x8000,
+ 0x58000001: 0x800002,
+ 0x68000001: 0x2,
+ 0x78000001: 0x8202,
+ 0x88000001: 0x8002,
+ 0x98000001: 0x800202,
+ 0xa8000001: 0x202,
+ 0xb8000001: 0x808200,
+ 0xc8000001: 0x800200,
+ 0xd8000001: 0x0,
+ 0xe8000001: 0x8200,
+ 0xf8000001: 0x808002
+ },
+ {
+ 0x0: 0x40084010,
+ 0x1000000: 0x4000,
+ 0x2000000: 0x80000,
+ 0x3000000: 0x40080010,
+ 0x4000000: 0x40000010,
+ 0x5000000: 0x40084000,
+ 0x6000000: 0x40004000,
+ 0x7000000: 0x10,
+ 0x8000000: 0x84000,
+ 0x9000000: 0x40004010,
+ 0xa000000: 0x40000000,
+ 0xb000000: 0x84010,
+ 0xc000000: 0x80010,
+ 0xd000000: 0x0,
+ 0xe000000: 0x4010,
+ 0xf000000: 0x40080000,
+ 0x800000: 0x40004000,
+ 0x1800000: 0x84010,
+ 0x2800000: 0x10,
+ 0x3800000: 0x40004010,
+ 0x4800000: 0x40084010,
+ 0x5800000: 0x40000000,
+ 0x6800000: 0x80000,
+ 0x7800000: 0x40080010,
+ 0x8800000: 0x80010,
+ 0x9800000: 0x0,
+ 0xa800000: 0x4000,
+ 0xb800000: 0x40080000,
+ 0xc800000: 0x40000010,
+ 0xd800000: 0x84000,
+ 0xe800000: 0x40084000,
+ 0xf800000: 0x4010,
+ 0x10000000: 0x0,
+ 0x11000000: 0x40080010,
+ 0x12000000: 0x40004010,
+ 0x13000000: 0x40084000,
+ 0x14000000: 0x40080000,
+ 0x15000000: 0x10,
+ 0x16000000: 0x84010,
+ 0x17000000: 0x4000,
+ 0x18000000: 0x4010,
+ 0x19000000: 0x80000,
+ 0x1a000000: 0x80010,
+ 0x1b000000: 0x40000010,
+ 0x1c000000: 0x84000,
+ 0x1d000000: 0x40004000,
+ 0x1e000000: 0x40000000,
+ 0x1f000000: 0x40084010,
+ 0x10800000: 0x84010,
+ 0x11800000: 0x80000,
+ 0x12800000: 0x40080000,
+ 0x13800000: 0x4000,
+ 0x14800000: 0x40004000,
+ 0x15800000: 0x40084010,
+ 0x16800000: 0x10,
+ 0x17800000: 0x40000000,
+ 0x18800000: 0x40084000,
+ 0x19800000: 0x40000010,
+ 0x1a800000: 0x40004010,
+ 0x1b800000: 0x80010,
+ 0x1c800000: 0x0,
+ 0x1d800000: 0x4010,
+ 0x1e800000: 0x40080010,
+ 0x1f800000: 0x84000
+ },
+ {
+ 0x0: 0x104,
+ 0x100000: 0x0,
+ 0x200000: 0x4000100,
+ 0x300000: 0x10104,
+ 0x400000: 0x10004,
+ 0x500000: 0x4000004,
+ 0x600000: 0x4010104,
+ 0x700000: 0x4010000,
+ 0x800000: 0x4000000,
+ 0x900000: 0x4010100,
+ 0xa00000: 0x10100,
+ 0xb00000: 0x4010004,
+ 0xc00000: 0x4000104,
+ 0xd00000: 0x10000,
+ 0xe00000: 0x4,
+ 0xf00000: 0x100,
+ 0x80000: 0x4010100,
+ 0x180000: 0x4010004,
+ 0x280000: 0x0,
+ 0x380000: 0x4000100,
+ 0x480000: 0x4000004,
+ 0x580000: 0x10000,
+ 0x680000: 0x10004,
+ 0x780000: 0x104,
+ 0x880000: 0x4,
+ 0x980000: 0x100,
+ 0xa80000: 0x4010000,
+ 0xb80000: 0x10104,
+ 0xc80000: 0x10100,
+ 0xd80000: 0x4000104,
+ 0xe80000: 0x4010104,
+ 0xf80000: 0x4000000,
+ 0x1000000: 0x4010100,
+ 0x1100000: 0x10004,
+ 0x1200000: 0x10000,
+ 0x1300000: 0x4000100,
+ 0x1400000: 0x100,
+ 0x1500000: 0x4010104,
+ 0x1600000: 0x4000004,
+ 0x1700000: 0x0,
+ 0x1800000: 0x4000104,
+ 0x1900000: 0x4000000,
+ 0x1a00000: 0x4,
+ 0x1b00000: 0x10100,
+ 0x1c00000: 0x4010000,
+ 0x1d00000: 0x104,
+ 0x1e00000: 0x10104,
+ 0x1f00000: 0x4010004,
+ 0x1080000: 0x4000000,
+ 0x1180000: 0x104,
+ 0x1280000: 0x4010100,
+ 0x1380000: 0x0,
+ 0x1480000: 0x10004,
+ 0x1580000: 0x4000100,
+ 0x1680000: 0x100,
+ 0x1780000: 0x4010004,
+ 0x1880000: 0x10000,
+ 0x1980000: 0x4010104,
+ 0x1a80000: 0x10104,
+ 0x1b80000: 0x4000004,
+ 0x1c80000: 0x4000104,
+ 0x1d80000: 0x4010000,
+ 0x1e80000: 0x4,
+ 0x1f80000: 0x10100
+ },
+ {
+ 0x0: 0x80401000,
+ 0x10000: 0x80001040,
+ 0x20000: 0x401040,
+ 0x30000: 0x80400000,
+ 0x40000: 0x0,
+ 0x50000: 0x401000,
+ 0x60000: 0x80000040,
+ 0x70000: 0x400040,
+ 0x80000: 0x80000000,
+ 0x90000: 0x400000,
+ 0xa0000: 0x40,
+ 0xb0000: 0x80001000,
+ 0xc0000: 0x80400040,
+ 0xd0000: 0x1040,
+ 0xe0000: 0x1000,
+ 0xf0000: 0x80401040,
+ 0x8000: 0x80001040,
+ 0x18000: 0x40,
+ 0x28000: 0x80400040,
+ 0x38000: 0x80001000,
+ 0x48000: 0x401000,
+ 0x58000: 0x80401040,
+ 0x68000: 0x0,
+ 0x78000: 0x80400000,
+ 0x88000: 0x1000,
+ 0x98000: 0x80401000,
+ 0xa8000: 0x400000,
+ 0xb8000: 0x1040,
+ 0xc8000: 0x80000000,
+ 0xd8000: 0x400040,
+ 0xe8000: 0x401040,
+ 0xf8000: 0x80000040,
+ 0x100000: 0x400040,
+ 0x110000: 0x401000,
+ 0x120000: 0x80000040,
+ 0x130000: 0x0,
+ 0x140000: 0x1040,
+ 0x150000: 0x80400040,
+ 0x160000: 0x80401000,
+ 0x170000: 0x80001040,
+ 0x180000: 0x80401040,
+ 0x190000: 0x80000000,
+ 0x1a0000: 0x80400000,
+ 0x1b0000: 0x401040,
+ 0x1c0000: 0x80001000,
+ 0x1d0000: 0x400000,
+ 0x1e0000: 0x40,
+ 0x1f0000: 0x1000,
+ 0x108000: 0x80400000,
+ 0x118000: 0x80401040,
+ 0x128000: 0x0,
+ 0x138000: 0x401000,
+ 0x148000: 0x400040,
+ 0x158000: 0x80000000,
+ 0x168000: 0x80001040,
+ 0x178000: 0x40,
+ 0x188000: 0x80000040,
+ 0x198000: 0x1000,
+ 0x1a8000: 0x80001000,
+ 0x1b8000: 0x80400040,
+ 0x1c8000: 0x1040,
+ 0x1d8000: 0x80401000,
+ 0x1e8000: 0x400000,
+ 0x1f8000: 0x401040
+ },
+ {
+ 0x0: 0x80,
+ 0x1000: 0x1040000,
+ 0x2000: 0x40000,
+ 0x3000: 0x20000000,
+ 0x4000: 0x20040080,
+ 0x5000: 0x1000080,
+ 0x6000: 0x21000080,
+ 0x7000: 0x40080,
+ 0x8000: 0x1000000,
+ 0x9000: 0x20040000,
+ 0xa000: 0x20000080,
+ 0xb000: 0x21040080,
+ 0xc000: 0x21040000,
+ 0xd000: 0x0,
+ 0xe000: 0x1040080,
+ 0xf000: 0x21000000,
+ 0x800: 0x1040080,
+ 0x1800: 0x21000080,
+ 0x2800: 0x80,
+ 0x3800: 0x1040000,
+ 0x4800: 0x40000,
+ 0x5800: 0x20040080,
+ 0x6800: 0x21040000,
+ 0x7800: 0x20000000,
+ 0x8800: 0x20040000,
+ 0x9800: 0x0,
+ 0xa800: 0x21040080,
+ 0xb800: 0x1000080,
+ 0xc800: 0x20000080,
+ 0xd800: 0x21000000,
+ 0xe800: 0x1000000,
+ 0xf800: 0x40080,
+ 0x10000: 0x40000,
+ 0x11000: 0x80,
+ 0x12000: 0x20000000,
+ 0x13000: 0x21000080,
+ 0x14000: 0x1000080,
+ 0x15000: 0x21040000,
+ 0x16000: 0x20040080,
+ 0x17000: 0x1000000,
+ 0x18000: 0x21040080,
+ 0x19000: 0x21000000,
+ 0x1a000: 0x1040000,
+ 0x1b000: 0x20040000,
+ 0x1c000: 0x40080,
+ 0x1d000: 0x20000080,
+ 0x1e000: 0x0,
+ 0x1f000: 0x1040080,
+ 0x10800: 0x21000080,
+ 0x11800: 0x1000000,
+ 0x12800: 0x1040000,
+ 0x13800: 0x20040080,
+ 0x14800: 0x20000000,
+ 0x15800: 0x1040080,
+ 0x16800: 0x80,
+ 0x17800: 0x21040000,
+ 0x18800: 0x40080,
+ 0x19800: 0x21040080,
+ 0x1a800: 0x0,
+ 0x1b800: 0x21000000,
+ 0x1c800: 0x1000080,
+ 0x1d800: 0x40000,
+ 0x1e800: 0x20040000,
+ 0x1f800: 0x20000080
+ },
+ {
+ 0x0: 0x10000008,
+ 0x100: 0x2000,
+ 0x200: 0x10200000,
+ 0x300: 0x10202008,
+ 0x400: 0x10002000,
+ 0x500: 0x200000,
+ 0x600: 0x200008,
+ 0x700: 0x10000000,
+ 0x800: 0x0,
+ 0x900: 0x10002008,
+ 0xa00: 0x202000,
+ 0xb00: 0x8,
+ 0xc00: 0x10200008,
+ 0xd00: 0x202008,
+ 0xe00: 0x2008,
+ 0xf00: 0x10202000,
+ 0x80: 0x10200000,
+ 0x180: 0x10202008,
+ 0x280: 0x8,
+ 0x380: 0x200000,
+ 0x480: 0x202008,
+ 0x580: 0x10000008,
+ 0x680: 0x10002000,
+ 0x780: 0x2008,
+ 0x880: 0x200008,
+ 0x980: 0x2000,
+ 0xa80: 0x10002008,
+ 0xb80: 0x10200008,
+ 0xc80: 0x0,
+ 0xd80: 0x10202000,
+ 0xe80: 0x202000,
+ 0xf80: 0x10000000,
+ 0x1000: 0x10002000,
+ 0x1100: 0x10200008,
+ 0x1200: 0x10202008,
+ 0x1300: 0x2008,
+ 0x1400: 0x200000,
+ 0x1500: 0x10000000,
+ 0x1600: 0x10000008,
+ 0x1700: 0x202000,
+ 0x1800: 0x202008,
+ 0x1900: 0x0,
+ 0x1a00: 0x8,
+ 0x1b00: 0x10200000,
+ 0x1c00: 0x2000,
+ 0x1d00: 0x10002008,
+ 0x1e00: 0x10202000,
+ 0x1f00: 0x200008,
+ 0x1080: 0x8,
+ 0x1180: 0x202000,
+ 0x1280: 0x200000,
+ 0x1380: 0x10000008,
+ 0x1480: 0x10002000,
+ 0x1580: 0x2008,
+ 0x1680: 0x10202008,
+ 0x1780: 0x10200000,
+ 0x1880: 0x10202000,
+ 0x1980: 0x10200008,
+ 0x1a80: 0x2000,
+ 0x1b80: 0x202008,
+ 0x1c80: 0x200008,
+ 0x1d80: 0x0,
+ 0x1e80: 0x10000000,
+ 0x1f80: 0x10002008
+ },
+ {
+ 0x0: 0x100000,
+ 0x10: 0x2000401,
+ 0x20: 0x400,
+ 0x30: 0x100401,
+ 0x40: 0x2100401,
+ 0x50: 0x0,
+ 0x60: 0x1,
+ 0x70: 0x2100001,
+ 0x80: 0x2000400,
+ 0x90: 0x100001,
+ 0xa0: 0x2000001,
+ 0xb0: 0x2100400,
+ 0xc0: 0x2100000,
+ 0xd0: 0x401,
+ 0xe0: 0x100400,
+ 0xf0: 0x2000000,
+ 0x8: 0x2100001,
+ 0x18: 0x0,
+ 0x28: 0x2000401,
+ 0x38: 0x2100400,
+ 0x48: 0x100000,
+ 0x58: 0x2000001,
+ 0x68: 0x2000000,
+ 0x78: 0x401,
+ 0x88: 0x100401,
+ 0x98: 0x2000400,
+ 0xa8: 0x2100000,
+ 0xb8: 0x100001,
+ 0xc8: 0x400,
+ 0xd8: 0x2100401,
+ 0xe8: 0x1,
+ 0xf8: 0x100400,
+ 0x100: 0x2000000,
+ 0x110: 0x100000,
+ 0x120: 0x2000401,
+ 0x130: 0x2100001,
+ 0x140: 0x100001,
+ 0x150: 0x2000400,
+ 0x160: 0x2100400,
+ 0x170: 0x100401,
+ 0x180: 0x401,
+ 0x190: 0x2100401,
+ 0x1a0: 0x100400,
+ 0x1b0: 0x1,
+ 0x1c0: 0x0,
+ 0x1d0: 0x2100000,
+ 0x1e0: 0x2000001,
+ 0x1f0: 0x400,
+ 0x108: 0x100400,
+ 0x118: 0x2000401,
+ 0x128: 0x2100001,
+ 0x138: 0x1,
+ 0x148: 0x2000000,
+ 0x158: 0x100000,
+ 0x168: 0x401,
+ 0x178: 0x2100400,
+ 0x188: 0x2000001,
+ 0x198: 0x2100000,
+ 0x1a8: 0x0,
+ 0x1b8: 0x2100401,
+ 0x1c8: 0x100401,
+ 0x1d8: 0x400,
+ 0x1e8: 0x2000400,
+ 0x1f8: 0x100001
+ },
+ {
+ 0x0: 0x8000820,
+ 0x1: 0x20000,
+ 0x2: 0x8000000,
+ 0x3: 0x20,
+ 0x4: 0x20020,
+ 0x5: 0x8020820,
+ 0x6: 0x8020800,
+ 0x7: 0x800,
+ 0x8: 0x8020000,
+ 0x9: 0x8000800,
+ 0xa: 0x20800,
+ 0xb: 0x8020020,
+ 0xc: 0x820,
+ 0xd: 0x0,
+ 0xe: 0x8000020,
+ 0xf: 0x20820,
+ 0x80000000: 0x800,
+ 0x80000001: 0x8020820,
+ 0x80000002: 0x8000820,
+ 0x80000003: 0x8000000,
+ 0x80000004: 0x8020000,
+ 0x80000005: 0x20800,
+ 0x80000006: 0x20820,
+ 0x80000007: 0x20,
+ 0x80000008: 0x8000020,
+ 0x80000009: 0x820,
+ 0x8000000a: 0x20020,
+ 0x8000000b: 0x8020800,
+ 0x8000000c: 0x0,
+ 0x8000000d: 0x8020020,
+ 0x8000000e: 0x8000800,
+ 0x8000000f: 0x20000,
+ 0x10: 0x20820,
+ 0x11: 0x8020800,
+ 0x12: 0x20,
+ 0x13: 0x800,
+ 0x14: 0x8000800,
+ 0x15: 0x8000020,
+ 0x16: 0x8020020,
+ 0x17: 0x20000,
+ 0x18: 0x0,
+ 0x19: 0x20020,
+ 0x1a: 0x8020000,
+ 0x1b: 0x8000820,
+ 0x1c: 0x8020820,
+ 0x1d: 0x20800,
+ 0x1e: 0x820,
+ 0x1f: 0x8000000,
+ 0x80000010: 0x20000,
+ 0x80000011: 0x800,
+ 0x80000012: 0x8020020,
+ 0x80000013: 0x20820,
+ 0x80000014: 0x20,
+ 0x80000015: 0x8020000,
+ 0x80000016: 0x8000000,
+ 0x80000017: 0x8000820,
+ 0x80000018: 0x8020820,
+ 0x80000019: 0x8000020,
+ 0x8000001a: 0x8000800,
+ 0x8000001b: 0x0,
+ 0x8000001c: 0x20800,
+ 0x8000001d: 0x820,
+ 0x8000001e: 0x20020,
+ 0x8000001f: 0x8020800
+ }
+ ];
+
+ // Masks that select the SBOX input
+ var SBOX_MASK = [
+ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+ 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+ ];
+
+ /**
+ * DES block cipher algorithm.
+ */
+ var DES = C_algo.DES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Select 56 bits according to PC1
+ var keyBits = [];
+ for (var i = 0; i < 56; i++) {
+ var keyBitPos = PC1[i] - 1;
+ keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+ }
+
+ // Assemble 16 subkeys
+ var subKeys = this._subKeys = [];
+ for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+ // Create subkey
+ var subKey = subKeys[nSubKey] = [];
+
+ // Shortcut
+ var bitShift = BIT_SHIFTS[nSubKey];
+
+ // Select 48 bits according to PC2
+ for (var i = 0; i < 24; i++) {
+ // Select from the left 28 key bits
+ subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+ // Select from the right 28 key bits
+ subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+ }
+
+ // Since each subkey is applied to an expanded 32-bit input,
+ // the subkey can be broken into 8 values scaled to 32-bits,
+ // which allows the key to be used without expansion
+ subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+ for (var i = 1; i < 7; i++) {
+ subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+ }
+ subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+ }
+
+ // Compute inverse subkeys
+ var invSubKeys = this._invSubKeys = [];
+ for (var i = 0; i < 16; i++) {
+ invSubKeys[i] = subKeys[15 - i];
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._subKeys);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._invSubKeys);
+ },
+
+ _doCryptBlock: function (M, offset, subKeys) {
+ // Get input
+ this._lBlock = M[offset];
+ this._rBlock = M[offset + 1];
+
+ // Initial permutation
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeLR.call(this, 1, 0x55555555);
+
+ // Rounds
+ for (var round = 0; round < 16; round++) {
+ // Shortcuts
+ var subKey = subKeys[round];
+ var lBlock = this._lBlock;
+ var rBlock = this._rBlock;
+
+ // Feistel function
+ var f = 0;
+ for (var i = 0; i < 8; i++) {
+ f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+ }
+ this._lBlock = rBlock;
+ this._rBlock = lBlock ^ f;
+ }
+
+ // Undo swap from last round
+ var t = this._lBlock;
+ this._lBlock = this._rBlock;
+ this._rBlock = t;
+
+ // Final permutation
+ exchangeLR.call(this, 1, 0x55555555);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+
+ // Set output
+ M[offset] = this._lBlock;
+ M[offset + 1] = this._rBlock;
+ },
+
+ keySize: 64/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ // Swap bits across the left and right words
+ function exchangeLR(offset, mask) {
+ var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+ this._rBlock ^= t;
+ this._lBlock ^= t << offset;
+ }
+
+ function exchangeRL(offset, mask) {
+ var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+ this._lBlock ^= t;
+ this._rBlock ^= t << offset;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+ */
+ C.DES = BlockCipher._createHelper(DES);
+
+ /**
+ * Triple-DES block cipher algorithm.
+ */
+ var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ // Make sure the key length is valid (64, 128 or >= 192 bit)
+ if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
+ throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
+ }
+
+ // Extend the key according to the keying options defined in 3DES standard
+ var key1 = keyWords.slice(0, 2);
+ var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
+ var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
+
+ // Create DES instances
+ this._des1 = DES.createEncryptor(WordArray.create(key1));
+ this._des2 = DES.createEncryptor(WordArray.create(key2));
+ this._des3 = DES.createEncryptor(WordArray.create(key3));
+ },
+
+ encryptBlock: function (M, offset) {
+ this._des1.encryptBlock(M, offset);
+ this._des2.decryptBlock(M, offset);
+ this._des3.encryptBlock(M, offset);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._des3.decryptBlock(M, offset);
+ this._des2.encryptBlock(M, offset);
+ this._des1.decryptBlock(M, offset);
+ },
+
+ keySize: 192/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+ */
+ C.TripleDES = BlockCipher._createHelper(TripleDES);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ /**
+ * RC4 stream cipher algorithm.
+ */
+ var RC4 = C_algo.RC4 = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySigBytes = key.sigBytes;
+
+ // Init sbox
+ var S = this._S = [];
+ for (var i = 0; i < 256; i++) {
+ S[i] = i;
+ }
+
+ // Key setup
+ for (var i = 0, j = 0; i < 256; i++) {
+ var keyByteIndex = i % keySigBytes;
+ var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+ j = (j + S[i] + keyByte) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+ }
+
+ // Counters
+ this._i = this._j = 0;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ M[offset] ^= generateKeystreamWord.call(this);
+ },
+
+ keySize: 256/32,
+
+ ivSize: 0
+ });
+
+ function generateKeystreamWord() {
+ // Shortcuts
+ var S = this._S;
+ var i = this._i;
+ var j = this._j;
+
+ // Generate keystream word
+ var keystreamWord = 0;
+ for (var n = 0; n < 4; n++) {
+ i = (i + 1) % 256;
+ j = (j + S[i]) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+
+ keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+ }
+
+ // Update counters
+ this._i = i;
+ this._j = j;
+
+ return keystreamWord;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4 = StreamCipher._createHelper(RC4);
+
+ /**
+ * Modified RC4 stream cipher algorithm.
+ */
+ var RC4Drop = C_algo.RC4Drop = RC4.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} drop The number of keystream words to drop. Default 192
+ */
+ cfg: RC4.cfg.extend({
+ drop: 192
+ }),
+
+ _doReset: function () {
+ RC4._doReset.call(this);
+
+ // Drop
+ for (var i = this.cfg.drop; i > 0; i--) {
+ generateKeystreamWord.call(this);
+ }
+ }
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm
+ */
+ var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
+ (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
+ }
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+ */
+ C.Rabbit = StreamCipher._createHelper(Rabbit);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm.
+ *
+ * This is a legacy version that neglected to convert the key to little-endian.
+ * This error doesn't affect the cipher's security,
+ * but it does affect its compatibility with other implementations.
+ */
+ var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+ */
+ C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+ }());
+
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ const N = 16;
+
+ //Origin pbox and sbox, derived from PI
+ const ORIG_P = [
+ 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
+ 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
+ 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
+ 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
+ 0x9216D5D9, 0x8979FB1B
+ ];
+
+ const ORIG_S = [
+ [ 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
+ 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
+ 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
+ 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
+ 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
+ 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
+ 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
+ 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
+ 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
+ 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
+ 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
+ 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
+ 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
+ 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
+ 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
+ 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
+ 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
+ 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
+ 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
+ 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
+ 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
+ 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
+ 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
+ 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
+ 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
+ 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
+ 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
+ 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
+ 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
+ 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
+ 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
+ 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
+ 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
+ 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
+ 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
+ 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
+ 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
+ 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
+ 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
+ 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
+ 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
+ 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
+ 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
+ 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
+ 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
+ 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
+ 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
+ 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
+ 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
+ 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
+ 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
+ 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
+ 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
+ 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
+ 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
+ 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
+ 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
+ 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
+ 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
+ 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
+ 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
+ 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
+ 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
+ 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ],
+ [ 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
+ 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
+ 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
+ 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
+ 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
+ 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
+ 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
+ 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
+ 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
+ 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
+ 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
+ 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
+ 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
+ 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
+ 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
+ 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
+ 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
+ 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
+ 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
+ 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
+ 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
+ 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
+ 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
+ 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
+ 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
+ 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
+ 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
+ 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
+ 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
+ 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
+ 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
+ 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
+ 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
+ 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
+ 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
+ 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
+ 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
+ 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
+ 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
+ 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
+ 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
+ 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
+ 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
+ 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
+ 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
+ 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
+ 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
+ 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
+ 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
+ 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
+ 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
+ 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
+ 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
+ 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
+ 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
+ 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
+ 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
+ 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
+ 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
+ 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
+ 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
+ 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
+ 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
+ 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ],
+ [ 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
+ 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
+ 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
+ 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
+ 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
+ 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
+ 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
+ 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
+ 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
+ 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
+ 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
+ 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
+ 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
+ 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
+ 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
+ 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
+ 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
+ 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
+ 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
+ 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
+ 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
+ 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
+ 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
+ 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
+ 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
+ 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
+ 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
+ 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
+ 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
+ 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
+ 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
+ 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
+ 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
+ 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
+ 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
+ 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
+ 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
+ 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
+ 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
+ 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
+ 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
+ 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
+ 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
+ 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
+ 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
+ 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
+ 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
+ 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
+ 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
+ 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
+ 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
+ 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
+ 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
+ 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
+ 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
+ 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
+ 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
+ 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
+ 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
+ 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
+ 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
+ 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
+ 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
+ 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ],
+ [ 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
+ 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
+ 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
+ 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
+ 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
+ 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
+ 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
+ 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
+ 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
+ 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
+ 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
+ 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
+ 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
+ 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
+ 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
+ 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
+ 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
+ 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
+ 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
+ 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
+ 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
+ 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
+ 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
+ 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
+ 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
+ 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
+ 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
+ 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
+ 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
+ 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
+ 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
+ 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
+ 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
+ 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
+ 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
+ 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
+ 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
+ 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
+ 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
+ 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
+ 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
+ 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
+ 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
+ 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
+ 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
+ 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
+ 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
+ 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
+ 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
+ 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
+ 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
+ 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
+ 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
+ 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
+ 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
+ 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
+ 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
+ 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
+ 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
+ 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
+ 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
+ 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
+ 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
+ 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 ]
+ ];
+
+ var BLOWFISH_CTX = {
+ pbox: [],
+ sbox: []
+ }
+
+ function F(ctx, x){
+ let a = (x >> 24) & 0xFF;
+ let b = (x >> 16) & 0xFF;
+ let c = (x >> 8) & 0xFF;
+ let d = x & 0xFF;
+
+ let y = ctx.sbox[0][a] + ctx.sbox[1][b];
+ y = y ^ ctx.sbox[2][c];
+ y = y + ctx.sbox[3][d];
+
+ return y;
+ }
+
+ function BlowFish_Encrypt(ctx, left, right){
+ let Xl = left;
+ let Xr = right;
+ let temp;
+
+ for(let i = 0; i < N; ++i){
+ Xl = Xl ^ ctx.pbox[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx.pbox[N];
+ Xl = Xl ^ ctx.pbox[N + 1];
+
+ return {left: Xl, right: Xr};
+ }
+
+ function BlowFish_Decrypt(ctx, left, right){
+ let Xl = left;
+ let Xr = right;
+ let temp;
+
+ for(let i = N + 1; i > 1; --i){
+ Xl = Xl ^ ctx.pbox[i];
+ Xr = F(ctx, Xl) ^ Xr;
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+ }
+
+ temp = Xl;
+ Xl = Xr;
+ Xr = temp;
+
+ Xr = Xr ^ ctx.pbox[1];
+ Xl = Xl ^ ctx.pbox[0];
+
+ return {left: Xl, right: Xr};
+ }
+
+ /**
+ * Initialization ctx's pbox and sbox.
+ *
+ * @param {Object} ctx The object has pbox and sbox.
+ * @param {Array} key An array of 32-bit words.
+ * @param {int} keysize The length of the key.
+ *
+ * @example
+ *
+ * BlowFishInit(BLOWFISH_CTX, key, 128/32);
+ */
+ function BlowFishInit(ctx, key, keysize)
+ {
+ for(let Row = 0; Row < 4; Row++)
+ {
+ ctx.sbox[Row] = [];
+ for(let Col = 0; Col < 256; Col++)
+ {
+ ctx.sbox[Row][Col] = ORIG_S[Row][Col];
+ }
+ }
+
+ let keyIndex = 0;
+ for(let index = 0; index < N + 2; index++)
+ {
+ ctx.pbox[index] = ORIG_P[index] ^ key[keyIndex];
+ keyIndex++;
+ if(keyIndex >= keysize)
+ {
+ keyIndex = 0;
+ }
+ }
+
+ let Data1 = 0;
+ let Data2 = 0;
+ let res = 0;
+ for(let i = 0; i < N + 2; i += 2)
+ {
+ res = BlowFish_Encrypt(ctx, Data1, Data2);
+ Data1 = res.left;
+ Data2 = res.right;
+ ctx.pbox[i] = Data1;
+ ctx.pbox[i + 1] = Data2;
+ }
+
+ for(let i = 0; i < 4; i++)
+ {
+ for(let j = 0; j < 256; j += 2)
+ {
+ res = BlowFish_Encrypt(ctx, Data1, Data2);
+ Data1 = res.left;
+ Data2 = res.right;
+ ctx.sbox[i][j] = Data1;
+ ctx.sbox[i][j + 1] = Data2;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Blowfish block cipher algorithm.
+ */
+ var Blowfish = C_algo.Blowfish = BlockCipher.extend({
+ _doReset: function () {
+ // Skip reset of nRounds has been set before and key did not change
+ if (this._keyPriorReset === this._key) {
+ return;
+ }
+
+ // Shortcuts
+ var key = this._keyPriorReset = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ //Initialization pbox and sbox
+ BlowFishInit(BLOWFISH_CTX, keyWords, keySize);
+ },
+
+ encryptBlock: function (M, offset) {
+ var res = BlowFish_Encrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);
+ M[offset] = res.left;
+ M[offset + 1] = res.right;
+ },
+
+ decryptBlock: function (M, offset) {
+ var res = BlowFish_Decrypt(BLOWFISH_CTX, M[offset], M[offset + 1]);
+ M[offset] = res.left;
+ M[offset + 1] = res.right;
+ },
+
+ blockSize: 64/32,
+
+ keySize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Blowfish.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Blowfish.decrypt(ciphertext, key, cfg);
+ */
+ C.Blowfish = BlockCipher._createHelper(Blowfish);
+ }());
+
+
+ return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/docs/QuickStartGuide.wiki b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/docs/QuickStartGuide.wiki
new file mode 100644
index 000000000..6b2019976
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/docs/QuickStartGuide.wiki
@@ -0,0 +1,470 @@
+
+
+----
+
+= Quick-start Guide =
+
+== Hashers ==
+
+=== The Hasher Algorithms ===
+
+==== MD5 ====
+
+MD5 is a widely used hash function. It's been used in a variety of security applications and is also commonly used to check the integrity of files. Though, MD5 is not collision resistant, and it isn't suitable for applications like SSL certificates or digital signatures that rely on this property.
+
+{{{
+
+
+}}}
+
+==== SHA-1 ====
+
+The SHA hash functions were designed by the National Security Agency (NSA). SHA-1 is the most established of the existing SHA hash functions, and it's used in a variety of security applications and protocols. Though, SHA-1's collision resistance has been weakening as new attacks are discovered or improved.
+
+{{{
+
+
+}}}
+
+==== SHA-2 ====
+
+SHA-256 is one of the four variants in the SHA-2 set. It isn't as widely used as SHA-1, though it appears to provide much better security.
+
+{{{
+
+
+}}}
+
+SHA-512 is largely identical to SHA-256 but operates on 64-bit words rather than 32.
+
+{{{
+
+
+}}}
+
+CryptoJS also supports SHA-224 and SHA-384, which are largely identical but truncated versions of SHA-256 and SHA-512 respectively.
+
+==== SHA-3 ====
+
+SHA-3 is the winner of a five-year competition to select a new cryptographic hash algorithm where 64 competing designs were evaluated.
+
+{{{
+
+
+}}}
+
+SHA-3 can be configured to output hash lengths of one of 224, 256, 384, or 512 bits. The default is 512 bits.
+
+{{{
+
+
+}}}
+
+==== RIPEMD-160 ====
+
+{{{
+
+
+}}}
+
+=== The Hasher Input ===
+
+The hash algorithms accept either strings or instances of CryptoJS.lib.WordArray. A WordArray object represents an array of 32-bit words. When you pass a string, it's automatically converted to a WordArray encoded as UTF-8.
+
+=== The Hasher Output ===
+
+The hash you get back isn't a string yet. It's a WordArray object. When you use a WordArray object in a string context, it's automatically converted to a hex string.
+
+{{{
+
+
+}}}
+
+You can convert a WordArray object to other formats by explicitly calling the toString method and passing an encoder.
+
+{{{
+
+
+
+}}}
+
+=== Progressive Hashing ===
+
+{{{
+
+
+}}}
+
+== HMAC ==
+
+Keyed-hash message authentication codes (HMAC) is a mechanism for message authentication using cryptographic hash functions.
+
+HMAC can be used in combination with any iterated cryptographic hash function.
+
+{{{
+
+
+
+
+
+}}}
+
+=== Progressive HMAC Hashing ===
+
+{{{
+
+
+}}}
+
+== PBKDF2 ==
+
+PBKDF2 is a password-based key derivation function. In many applications of cryptography, user security is ultimately dependent on a password, and because a password usually can't be used directly as a cryptographic key, some processing is required.
+
+A salt provides a large set of keys for any given password, and an iteration count increases the cost of producing keys from a password, thereby also increasing the difficulty of attack.
+
+{{{
+
+
+}}}
+
+== Ciphers ==
+
+=== The Cipher Algorithms ===
+
+==== AES ====
+
+The Advanced Encryption Standard (AES) is a U.S. Federal Information Processing Standard (FIPS). It was selected after a 5-year process where 15 competing designs were evaluated.
+
+{{{
+
+
+}}}
+
+CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
+
+==== DES, Triple DES ====
+
+DES is a previously dominant algorithm for encryption, and was published as an official Federal Information Processing Standard (FIPS). DES is now considered to be insecure due to the small key size.
+
+{{{
+
+
+}}}
+
+Triple DES applies DES three times to each block to increase the key size. The algorithm is believed to be secure in this form.
+
+{{{
+
+
+}}}
+
+==== Rabbit ====
+
+Rabbit is a high-performance stream cipher and a finalist in the eSTREAM Portfolio. It is one of the four designs selected after a 3 1/2-year process where 22 designs were evaluated.
+
+{{{
+
+
+}}}
+
+==== RC4, RC4Drop ====
+
+RC4 is a widely-used stream cipher. It's used in popular protocols such as SSL and WEP. Although remarkable for its simplicity and speed, the algorithm's history doesn't inspire confidence in its security.
+
+{{{
+
+
+}}}
+
+It was discovered that the first few bytes of keystream are strongly non-random and leak information about the key. We can defend against this attack by discarding the initial portion of the keystream. This modified algorithm is traditionally called RC4-drop.
+
+By default, 192 words (768 bytes) are dropped, but you can configure the algorithm to drop any number of words.
+
+{{{
+
+
+}}}
+
+=== Custom Key and IV ===
+
+{{{
+
+
+}}}
+
+=== Block Modes and Padding ===
+
+{{{
+
+
+
+
+}}}
+
+CryptoJS supports the following modes:
+
+ * CBC (the default)
+ * CFB
+ * CTR
+ * OFB
+ * ECB
+
+And CryptoJS supports the following padding schemes:
+
+ * Pkcs7 (the default)
+ * Iso97971
+ * AnsiX923
+ * Iso10126
+ * ZeroPadding
+ * NoPadding
+
+=== The Cipher Input ===
+
+For the plaintext message, the cipher algorithms accept either strings or instances of CryptoJS.lib.WordArray.
+
+For the key, when you pass a string, it's treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key. If you pass the actual key, you must also pass the actual IV.
+
+For the ciphertext, the cipher algorithms accept either strings or instances of CryptoJS.lib.CipherParams. A CipherParams object represents a collection of parameters such as the IV, a salt, and the raw ciphertext itself. When you pass a string, it's automatically converted to a CipherParams object according to a configurable format strategy.
+
+=== The Cipher Output ===
+
+The plaintext you get back after decryption is a WordArray object. See Hashers' Output for more detail.
+
+The ciphertext you get back after encryption isn't a string yet. It's a CipherParams object. A CipherParams object gives you access to all the parameters used during encryption. When you use a CipherParams object in a string context, it's automatically converted to a string according to a format strategy. The default is an OpenSSL-compatible format.
+
+{{{
+
+
+}}}
+
+You can define your own formats in order to be compatible with other crypto implementations. A format is an object with two methods—stringify and parse—that converts between CipherParams objects and ciphertext strings.
+
+Here's how you might write a JSON formatter:
+
+{{{
+
+
+}}}
+
+=== Progressive Ciphering ===
+
+{{{
+
+
+}}}
+
+=== Interoperability ===
+
+==== With OpenSSL ====
+
+Encrypt with OpenSSL:
+
+{{{
+openssl enc -aes-256-cbc -in infile -out outfile -pass pass:"Secret Passphrase" -e -base64
+}}}
+
+Decrypt with CryptoJS:
+
+{{{
+
+
+}}}
+
+== Encoders ==
+
+CryptoJS can convert from encoding formats such as Base64, Latin1 or Hex to WordArray objects and vica versa.
+
+{{{
+
+
+
+
+}}}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64.js
new file mode 100644
index 000000000..0ffcd53ca
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64.js
@@ -0,0 +1,136 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64 encoding strategy.
+ */
+ var Base64 = C_enc.Base64 = {
+ /**
+ * Converts a word array to a Base64 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Base64 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64 string to a word array.
+ *
+ * @param {string} base64Str The Base64 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64.parse(base64String);
+ */
+ parse: function (base64Str) {
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = this._map;
+ var reverseMap = this._reverseMap;
+
+ if (!reverseMap) {
+ reverseMap = this._reverseMap = [];
+ for (var j = 0; j < map.length; j++) {
+ reverseMap[map.charCodeAt(j)] = j;
+ }
+ }
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex !== -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ return parseLoop(base64Str, base64StrLength, reverseMap);
+
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+ };
+
+ function parseLoop(base64Str, base64StrLength, reverseMap) {
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+ var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+ var bitsCombined = bits1 | bits2;
+ words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+ return WordArray.create(words, nBytes);
+ }
+ }());
+
+
+ return CryptoJS.enc.Base64;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64url.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64url.js
new file mode 100644
index 000000000..af682e332
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-base64url.js
@@ -0,0 +1,148 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64url encoding strategy.
+ */
+ var Base64url = C_enc.Base64url = {
+ /**
+ * Converts a word array to a Base64url string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @param {boolean} urlSafe Whether to use url safe
+ *
+ * @return {string} The Base64url string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64url.stringify(wordArray);
+ */
+ stringify: function (wordArray, urlSafe) {
+ if (urlSafe === undefined) {
+ urlSafe = true
+ }
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = urlSafe ? this._safe_map : this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64url string to a word array.
+ *
+ * @param {string} base64Str The Base64url string.
+ *
+ * @param {boolean} urlSafe Whether to use url safe
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64url.parse(base64String);
+ */
+ parse: function (base64Str, urlSafe) {
+ if (urlSafe === undefined) {
+ urlSafe = true
+ }
+
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = urlSafe ? this._safe_map : this._map;
+ var reverseMap = this._reverseMap;
+
+ if (!reverseMap) {
+ reverseMap = this._reverseMap = [];
+ for (var j = 0; j < map.length; j++) {
+ reverseMap[map.charCodeAt(j)] = j;
+ }
+ }
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex !== -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ return parseLoop(base64Str, base64StrLength, reverseMap);
+
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',
+ _safe_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_',
+ };
+
+ function parseLoop(base64Str, base64StrLength, reverseMap) {
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
+ var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
+ var bitsCombined = bits1 | bits2;
+ words[nBytes >>> 2] |= bitsCombined << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+ return WordArray.create(words, nBytes);
+ }
+ }());
+
+
+ return CryptoJS.enc.Base64url;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-hex.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-hex.js
new file mode 100644
index 000000000..88161ff5f
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-hex.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.enc.Hex;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-latin1.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-latin1.js
new file mode 100644
index 000000000..ade56dcd4
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-latin1.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.enc.Latin1;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf16.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf16.js
new file mode 100644
index 000000000..7de62457a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf16.js
@@ -0,0 +1,149 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * UTF-16 BE encoding strategy.
+ */
+ var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+ /**
+ * Converts a word array to a UTF-16 BE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 BE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 BE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 BE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ /**
+ * UTF-16 LE encoding strategy.
+ */
+ C_enc.Utf16LE = {
+ /**
+ * Converts a word array to a UTF-16 LE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 LE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 LE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 LE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ function swapEndian(word) {
+ return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+ }
+ }());
+
+
+ return CryptoJS.enc.Utf16;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf8.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf8.js
new file mode 100644
index 000000000..e7a251d88
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/enc-utf8.js
@@ -0,0 +1,18 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.enc.Utf8;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/evpkdf.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/evpkdf.js
new file mode 100644
index 000000000..578974aa3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/evpkdf.js
@@ -0,0 +1,134 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha1", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var MD5 = C_algo.MD5;
+
+ /**
+ * This key derivation function is meant to conform with EVP_BytesToKey.
+ * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+ */
+ var EvpKDF = C_algo.EvpKDF = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: MD5,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.EvpKDF.create();
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ var block;
+
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init hasher
+ var hasher = cfg.hasher.create();
+
+ // Initial values
+ var derivedKey = WordArray.create();
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ if (block) {
+ hasher.update(block);
+ }
+ block = hasher.update(password).finalize(salt);
+ hasher.reset();
+
+ // Iterations
+ for (var i = 1; i < iterations; i++) {
+ block = hasher.finalize(block);
+ hasher.reset();
+ }
+
+ derivedKey.concat(block);
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.EvpKDF(password, salt);
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.EvpKDF = function (password, salt, cfg) {
+ return EvpKDF.create(cfg).compute(password, salt);
+ };
+ }());
+
+
+ return CryptoJS.EvpKDF;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-hex.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-hex.js
new file mode 100644
index 000000000..2e9a861f0
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-hex.js
@@ -0,0 +1,66 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var CipherParams = C_lib.CipherParams;
+ var C_enc = C.enc;
+ var Hex = C_enc.Hex;
+ var C_format = C.format;
+
+ var HexFormatter = C_format.Hex = {
+ /**
+ * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The hexadecimally encoded string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ return cipherParams.ciphertext.toString(Hex);
+ },
+
+ /**
+ * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+ *
+ * @param {string} input The hexadecimally encoded string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.Hex.parse(hexString);
+ */
+ parse: function (input) {
+ var ciphertext = Hex.parse(input);
+ return CipherParams.create({ ciphertext: ciphertext });
+ }
+ };
+ }());
+
+
+ return CryptoJS.format.Hex;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-openssl.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-openssl.js
new file mode 100644
index 000000000..3373edc6a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/format-openssl.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.format.OpenSSL;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-md5.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-md5.js
new file mode 100644
index 000000000..ad7a90adc
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-md5.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./md5"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./md5", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacMD5;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-ripemd160.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-ripemd160.js
new file mode 100644
index 000000000..73d55a770
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-ripemd160.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./ripemd160"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./ripemd160", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacRIPEMD160;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha1.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha1.js
new file mode 100644
index 000000000..0b570cbc3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha1.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha1", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA1;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha224.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha224.js
new file mode 100644
index 000000000..3778863ac
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha224.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha256"), require("./sha224"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha256", "./sha224", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA224;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha256.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha256.js
new file mode 100644
index 000000000..33b0c9fec
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha256.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha256", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA256;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha3.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha3.js
new file mode 100644
index 000000000..124880496
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha3.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha3"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core", "./sha3", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA3;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha384.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha384.js
new file mode 100644
index 000000000..0036e2b88
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha384.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./sha384"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core", "./sha512", "./sha384", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA384;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha512.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha512.js
new file mode 100644
index 000000000..c1005b6ac
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac-sha512.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core", "./sha512", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.HmacSHA512;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac.js
new file mode 100644
index 000000000..8c0985114
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/hmac.js
@@ -0,0 +1,143 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var C_algo = C.algo;
+
+ /**
+ * HMAC algorithm.
+ */
+ var HMAC = C_algo.HMAC = Base.extend({
+ /**
+ * Initializes a newly created HMAC.
+ *
+ * @param {Hasher} hasher The hash algorithm to use.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @example
+ *
+ * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+ */
+ init: function (hasher, key) {
+ // Init hasher
+ hasher = this._hasher = new hasher.init();
+
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof key == 'string') {
+ key = Utf8.parse(key);
+ }
+
+ // Shortcuts
+ var hasherBlockSize = hasher.blockSize;
+ var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+ // Allow arbitrary length keys
+ if (key.sigBytes > hasherBlockSizeBytes) {
+ key = hasher.finalize(key);
+ }
+
+ // Clamp excess bits
+ key.clamp();
+
+ // Clone key for inner and outer pads
+ var oKey = this._oKey = key.clone();
+ var iKey = this._iKey = key.clone();
+
+ // Shortcuts
+ var oKeyWords = oKey.words;
+ var iKeyWords = iKey.words;
+
+ // XOR keys with pad constants
+ for (var i = 0; i < hasherBlockSize; i++) {
+ oKeyWords[i] ^= 0x5c5c5c5c;
+ iKeyWords[i] ^= 0x36363636;
+ }
+ oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this HMAC to its initial state.
+ *
+ * @example
+ *
+ * hmacHasher.reset();
+ */
+ reset: function () {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Reset
+ hasher.reset();
+ hasher.update(this._iKey);
+ },
+
+ /**
+ * Updates this HMAC with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {HMAC} This HMAC instance.
+ *
+ * @example
+ *
+ * hmacHasher.update('message');
+ * hmacHasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ this._hasher.update(messageUpdate);
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the HMAC computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @example
+ *
+ * var hmac = hmacHasher.finalize();
+ * var hmac = hmacHasher.finalize('message');
+ * var hmac = hmacHasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Compute HMAC
+ var innerHash = hasher.finalize(messageUpdate);
+ hasher.reset();
+ var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+ return hmac;
+ }
+ });
+ }());
+
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/index.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/index.js
new file mode 100644
index 000000000..b69664622
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/index.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./enc-base64url"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"), require("./blowfish"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./enc-base64url", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy", "./blowfish"], factory);
+ }
+ else {
+ // Global (browser)
+ root.CryptoJS = factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/lib-typedarrays.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/lib-typedarrays.js
new file mode 100644
index 000000000..264b21074
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/lib-typedarrays.js
@@ -0,0 +1,76 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Check if typed arrays are supported
+ if (typeof ArrayBuffer != 'function') {
+ return;
+ }
+
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+
+ // Reference original init
+ var superInit = WordArray.init;
+
+ // Augment WordArray.init to handle typed arrays
+ var subInit = WordArray.init = function (typedArray) {
+ // Convert buffers to uint8
+ if (typedArray instanceof ArrayBuffer) {
+ typedArray = new Uint8Array(typedArray);
+ }
+
+ // Convert other array views to uint8
+ if (
+ typedArray instanceof Int8Array ||
+ (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
+ typedArray instanceof Int16Array ||
+ typedArray instanceof Uint16Array ||
+ typedArray instanceof Int32Array ||
+ typedArray instanceof Uint32Array ||
+ typedArray instanceof Float32Array ||
+ typedArray instanceof Float64Array
+ ) {
+ typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+ }
+
+ // Handle Uint8Array
+ if (typedArray instanceof Uint8Array) {
+ // Shortcut
+ var typedArrayByteLength = typedArray.byteLength;
+
+ // Extract bytes
+ var words = [];
+ for (var i = 0; i < typedArrayByteLength; i++) {
+ words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+ }
+
+ // Initialize this word array
+ superInit.call(this, words, typedArrayByteLength);
+ } else {
+ // Else call normal init
+ superInit.apply(this, arguments);
+ }
+ };
+
+ subInit.prototype = WordArray;
+ }());
+
+
+ return CryptoJS.lib.WordArray;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/md5.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/md5.js
new file mode 100644
index 000000000..72fce03ad
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/md5.js
@@ -0,0 +1,268 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var T = [];
+
+ // Compute constants
+ (function () {
+ for (var i = 0; i < 64; i++) {
+ T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+ }
+ }());
+
+ /**
+ * MD5 hash algorithm.
+ */
+ var MD5 = C_algo.MD5 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+
+ // Shortcuts
+ var H = this._hash.words;
+
+ var M_offset_0 = M[offset + 0];
+ var M_offset_1 = M[offset + 1];
+ var M_offset_2 = M[offset + 2];
+ var M_offset_3 = M[offset + 3];
+ var M_offset_4 = M[offset + 4];
+ var M_offset_5 = M[offset + 5];
+ var M_offset_6 = M[offset + 6];
+ var M_offset_7 = M[offset + 7];
+ var M_offset_8 = M[offset + 8];
+ var M_offset_9 = M[offset + 9];
+ var M_offset_10 = M[offset + 10];
+ var M_offset_11 = M[offset + 11];
+ var M_offset_12 = M[offset + 12];
+ var M_offset_13 = M[offset + 13];
+ var M_offset_14 = M[offset + 14];
+ var M_offset_15 = M[offset + 15];
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+
+ // Computation
+ a = FF(a, b, c, d, M_offset_0, 7, T[0]);
+ d = FF(d, a, b, c, M_offset_1, 12, T[1]);
+ c = FF(c, d, a, b, M_offset_2, 17, T[2]);
+ b = FF(b, c, d, a, M_offset_3, 22, T[3]);
+ a = FF(a, b, c, d, M_offset_4, 7, T[4]);
+ d = FF(d, a, b, c, M_offset_5, 12, T[5]);
+ c = FF(c, d, a, b, M_offset_6, 17, T[6]);
+ b = FF(b, c, d, a, M_offset_7, 22, T[7]);
+ a = FF(a, b, c, d, M_offset_8, 7, T[8]);
+ d = FF(d, a, b, c, M_offset_9, 12, T[9]);
+ c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+ b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+ a = FF(a, b, c, d, M_offset_12, 7, T[12]);
+ d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+ c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+ b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+ a = GG(a, b, c, d, M_offset_1, 5, T[16]);
+ d = GG(d, a, b, c, M_offset_6, 9, T[17]);
+ c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+ b = GG(b, c, d, a, M_offset_0, 20, T[19]);
+ a = GG(a, b, c, d, M_offset_5, 5, T[20]);
+ d = GG(d, a, b, c, M_offset_10, 9, T[21]);
+ c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+ b = GG(b, c, d, a, M_offset_4, 20, T[23]);
+ a = GG(a, b, c, d, M_offset_9, 5, T[24]);
+ d = GG(d, a, b, c, M_offset_14, 9, T[25]);
+ c = GG(c, d, a, b, M_offset_3, 14, T[26]);
+ b = GG(b, c, d, a, M_offset_8, 20, T[27]);
+ a = GG(a, b, c, d, M_offset_13, 5, T[28]);
+ d = GG(d, a, b, c, M_offset_2, 9, T[29]);
+ c = GG(c, d, a, b, M_offset_7, 14, T[30]);
+ b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+ a = HH(a, b, c, d, M_offset_5, 4, T[32]);
+ d = HH(d, a, b, c, M_offset_8, 11, T[33]);
+ c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+ b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+ a = HH(a, b, c, d, M_offset_1, 4, T[36]);
+ d = HH(d, a, b, c, M_offset_4, 11, T[37]);
+ c = HH(c, d, a, b, M_offset_7, 16, T[38]);
+ b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+ a = HH(a, b, c, d, M_offset_13, 4, T[40]);
+ d = HH(d, a, b, c, M_offset_0, 11, T[41]);
+ c = HH(c, d, a, b, M_offset_3, 16, T[42]);
+ b = HH(b, c, d, a, M_offset_6, 23, T[43]);
+ a = HH(a, b, c, d, M_offset_9, 4, T[44]);
+ d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+ c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+ b = HH(b, c, d, a, M_offset_2, 23, T[47]);
+
+ a = II(a, b, c, d, M_offset_0, 6, T[48]);
+ d = II(d, a, b, c, M_offset_7, 10, T[49]);
+ c = II(c, d, a, b, M_offset_14, 15, T[50]);
+ b = II(b, c, d, a, M_offset_5, 21, T[51]);
+ a = II(a, b, c, d, M_offset_12, 6, T[52]);
+ d = II(d, a, b, c, M_offset_3, 10, T[53]);
+ c = II(c, d, a, b, M_offset_10, 15, T[54]);
+ b = II(b, c, d, a, M_offset_1, 21, T[55]);
+ a = II(a, b, c, d, M_offset_8, 6, T[56]);
+ d = II(d, a, b, c, M_offset_15, 10, T[57]);
+ c = II(c, d, a, b, M_offset_6, 15, T[58]);
+ b = II(b, c, d, a, M_offset_13, 21, T[59]);
+ a = II(a, b, c, d, M_offset_4, 6, T[60]);
+ d = II(d, a, b, c, M_offset_11, 10, T[61]);
+ c = II(c, d, a, b, M_offset_2, 15, T[62]);
+ b = II(b, c, d, a, M_offset_9, 21, T[63]);
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+ var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+ var nBitsTotalL = nBitsTotal;
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+ (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
+ );
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
+ );
+
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ function FF(a, b, c, d, x, s, t) {
+ var n = a + ((b & c) | (~b & d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function GG(a, b, c, d, x, s, t) {
+ var n = a + ((b & d) | (c & ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function HH(a, b, c, d, x, s, t) {
+ var n = a + (b ^ c ^ d) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function II(a, b, c, d, x, s, t) {
+ var n = a + (c ^ (b | ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.MD5('message');
+ * var hash = CryptoJS.MD5(wordArray);
+ */
+ C.MD5 = Hasher._createHelper(MD5);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacMD5(message, key);
+ */
+ C.HmacMD5 = Hasher._createHmacHelper(MD5);
+ }(Math));
+
+
+ return CryptoJS.MD5;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-cfb.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-cfb.js
new file mode 100644
index 000000000..444c9cb9a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-cfb.js
@@ -0,0 +1,80 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Cipher Feedback block mode.
+ */
+ CryptoJS.mode.CFB = (function () {
+ var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ CFB.Encryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ CFB.Decryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+ var keystream;
+
+ // Shortcut
+ var iv = this._iv;
+
+ // Generate keystream
+ if (iv) {
+ keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ keystream = this._prevBlock;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+
+ return CFB;
+ }());
+
+
+ return CryptoJS.mode.CFB;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr-gladman.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr-gladman.js
new file mode 100644
index 000000000..bbc56876e
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr-gladman.js
@@ -0,0 +1,116 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /** @preserve
+ * Counter block mode compatible with Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+ CryptoJS.mode.CTRGladman = (function () {
+ var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+ function incWord(word)
+ {
+ if (((word >> 24) & 0xff) === 0xff) { //overflow
+ var b1 = (word >> 16)&0xff;
+ var b2 = (word >> 8)&0xff;
+ var b3 = word & 0xff;
+
+ if (b1 === 0xff) // overflow b1
+ {
+ b1 = 0;
+ if (b2 === 0xff)
+ {
+ b2 = 0;
+ if (b3 === 0xff)
+ {
+ b3 = 0;
+ }
+ else
+ {
+ ++b3;
+ }
+ }
+ else
+ {
+ ++b2;
+ }
+ }
+ else
+ {
+ ++b1;
+ }
+
+ word = 0;
+ word += (b1 << 16);
+ word += (b2 << 8);
+ word += b3;
+ }
+ else
+ {
+ word += (0x01 << 24);
+ }
+ return word;
+ }
+
+ function incCounter(counter)
+ {
+ if ((counter[0] = incWord(counter[0])) === 0)
+ {
+ // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
+ counter[1] = incWord(counter[1]);
+ }
+ return counter;
+ }
+
+ var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+
+ incCounter(counter);
+
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTRGladman.Decryptor = Encryptor;
+
+ return CTRGladman;
+ }());
+
+
+
+
+ return CryptoJS.mode.CTRGladman;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr.js
new file mode 100644
index 000000000..c3d470a6f
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ctr.js
@@ -0,0 +1,58 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Counter block mode.
+ */
+ CryptoJS.mode.CTR = (function () {
+ var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = CTR.Encryptor = CTR.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Increment counter
+ counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTR.Decryptor = Encryptor;
+
+ return CTR;
+ }());
+
+
+ return CryptoJS.mode.CTR;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ecb.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ecb.js
new file mode 100644
index 000000000..ff0692175
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ecb.js
@@ -0,0 +1,40 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Electronic Codebook block mode.
+ */
+ CryptoJS.mode.ECB = (function () {
+ var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+ ECB.Encryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.encryptBlock(words, offset);
+ }
+ });
+
+ ECB.Decryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.decryptBlock(words, offset);
+ }
+ });
+
+ return ECB;
+ }());
+
+
+ return CryptoJS.mode.ECB;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ofb.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ofb.js
new file mode 100644
index 000000000..c01314c22
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/mode-ofb.js
@@ -0,0 +1,54 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Output Feedback block mode.
+ */
+ CryptoJS.mode.OFB = (function () {
+ var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = OFB.Encryptor = OFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var keystream = this._keystream;
+
+ // Generate keystream
+ if (iv) {
+ keystream = this._keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ OFB.Decryptor = Encryptor;
+
+ return OFB;
+ }());
+
+
+ return CryptoJS.mode.OFB;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/package.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/package.json
new file mode 100644
index 000000000..4b9a8e286
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/package.json
@@ -0,0 +1,42 @@
+{
+ "name": "crypto-js",
+ "version": "4.2.0",
+ "description": "JavaScript library of crypto standards.",
+ "license": "MIT",
+ "author": {
+ "name": "Evan Vosberg",
+ "url": "http://github.com/evanvosberg"
+ },
+ "homepage": "http://github.com/brix/crypto-js",
+ "repository": {
+ "type": "git",
+ "url": "http://github.com/brix/crypto-js.git"
+ },
+ "keywords": [
+ "security",
+ "crypto",
+ "Hash",
+ "MD5",
+ "SHA1",
+ "SHA-1",
+ "SHA256",
+ "SHA-256",
+ "RC4",
+ "Rabbit",
+ "AES",
+ "DES",
+ "PBKDF2",
+ "HMAC",
+ "OFB",
+ "CFB",
+ "CTR",
+ "CBC",
+ "Base64",
+ "Base64url"
+ ],
+ "main": "index.js",
+ "dependencies": {},
+ "browser": {
+ "crypto": false
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-ansix923.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-ansix923.js
new file mode 100644
index 000000000..f01f21e45
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-ansix923.js
@@ -0,0 +1,49 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * ANSI X.923 padding strategy.
+ */
+ CryptoJS.pad.AnsiX923 = {
+ pad: function (data, blockSize) {
+ // Shortcuts
+ var dataSigBytes = data.sigBytes;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+ // Compute last byte position
+ var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+ // Pad
+ data.clamp();
+ data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+ data.sigBytes += nPaddingBytes;
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+
+ return CryptoJS.pad.Ansix923;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso10126.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso10126.js
new file mode 100644
index 000000000..6e2aefd83
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso10126.js
@@ -0,0 +1,44 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * ISO 10126 padding strategy.
+ */
+ CryptoJS.pad.Iso10126 = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Pad
+ data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+ concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+
+ return CryptoJS.pad.Iso10126;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso97971.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso97971.js
new file mode 100644
index 000000000..41049b45f
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-iso97971.js
@@ -0,0 +1,40 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * ISO/IEC 9797-1 Padding Method 2.
+ */
+ CryptoJS.pad.Iso97971 = {
+ pad: function (data, blockSize) {
+ // Add 0x80 byte
+ data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+ // Zero pad the rest
+ CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+ },
+
+ unpad: function (data) {
+ // Remove zero padding
+ CryptoJS.pad.ZeroPadding.unpad(data);
+
+ // Remove one more byte -- the 0x80 byte
+ data.sigBytes--;
+ }
+ };
+
+
+ return CryptoJS.pad.Iso97971;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-nopadding.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-nopadding.js
new file mode 100644
index 000000000..c7787c94d
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-nopadding.js
@@ -0,0 +1,30 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * A noop padding strategy.
+ */
+ CryptoJS.pad.NoPadding = {
+ pad: function () {
+ },
+
+ unpad: function () {
+ }
+ };
+
+
+ return CryptoJS.pad.NoPadding;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-pkcs7.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-pkcs7.js
new file mode 100644
index 000000000..355516856
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-pkcs7.js
@@ -0,0 +1,18 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ return CryptoJS.pad.Pkcs7;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-zeropadding.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-zeropadding.js
new file mode 100644
index 000000000..a1a459ef3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pad-zeropadding.js
@@ -0,0 +1,47 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /**
+ * Zero padding strategy.
+ */
+ CryptoJS.pad.ZeroPadding = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Pad
+ data.clamp();
+ data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+ },
+
+ unpad: function (data) {
+ // Shortcut
+ var dataWords = data.words;
+
+ // Unpad
+ var i = data.sigBytes - 1;
+ for (var i = data.sigBytes - 1; i >= 0; i--) {
+ if (((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+ data.sigBytes = i + 1;
+ break;
+ }
+ }
+ }
+ };
+
+
+ return CryptoJS.pad.ZeroPadding;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pbkdf2.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pbkdf2.js
new file mode 100644
index 000000000..6850934c3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/pbkdf2.js
@@ -0,0 +1,145 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha256"), require("./hmac"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha256", "./hmac"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+ var HMAC = C_algo.HMAC;
+
+ /**
+ * Password-Based Key Derivation Function 2 algorithm.
+ */
+ var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hasher to use. Default: SHA256
+ * @property {number} iterations The number of iterations to perform. Default: 250000
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: SHA256,
+ iterations: 250000
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.PBKDF2.create();
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init HMAC
+ var hmac = HMAC.create(cfg.hasher, password);
+
+ // Initial values
+ var derivedKey = WordArray.create();
+ var blockIndex = WordArray.create([0x00000001]);
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var blockIndexWords = blockIndex.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ var block = hmac.update(salt).finalize(blockIndex);
+ hmac.reset();
+
+ // Shortcuts
+ var blockWords = block.words;
+ var blockWordsLength = blockWords.length;
+
+ // Iterations
+ var intermediate = block;
+ for (var i = 1; i < iterations; i++) {
+ intermediate = hmac.finalize(intermediate);
+ hmac.reset();
+
+ // Shortcut
+ var intermediateWords = intermediate.words;
+
+ // XOR intermediate with block
+ for (var j = 0; j < blockWordsLength; j++) {
+ blockWords[j] ^= intermediateWords[j];
+ }
+ }
+
+ derivedKey.concat(block);
+ blockIndexWords[0]++;
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.PBKDF2(password, salt);
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.PBKDF2 = function (password, salt, cfg) {
+ return PBKDF2.create(cfg).compute(password, salt);
+ };
+ }());
+
+
+ return CryptoJS.PBKDF2;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit-legacy.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit-legacy.js
new file mode 100644
index 000000000..e118b6b6a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit-legacy.js
@@ -0,0 +1,190 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm.
+ *
+ * This is a legacy version that neglected to convert the key to little-endian.
+ * This error doesn't affect the cipher's security,
+ * but it does affect its compatibility with other implementations.
+ */
+ var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+ */
+ C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+ }());
+
+
+ return CryptoJS.RabbitLegacy;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit.js
new file mode 100644
index 000000000..1b0683362
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rabbit.js
@@ -0,0 +1,192 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm
+ */
+ var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
+ (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
+ }
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+ */
+ C.Rabbit = StreamCipher._createHelper(Rabbit);
+ }());
+
+
+ return CryptoJS.Rabbit;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rc4.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rc4.js
new file mode 100644
index 000000000..0e4bdff51
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/rc4.js
@@ -0,0 +1,139 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ /**
+ * RC4 stream cipher algorithm.
+ */
+ var RC4 = C_algo.RC4 = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySigBytes = key.sigBytes;
+
+ // Init sbox
+ var S = this._S = [];
+ for (var i = 0; i < 256; i++) {
+ S[i] = i;
+ }
+
+ // Key setup
+ for (var i = 0, j = 0; i < 256; i++) {
+ var keyByteIndex = i % keySigBytes;
+ var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+ j = (j + S[i] + keyByte) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+ }
+
+ // Counters
+ this._i = this._j = 0;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ M[offset] ^= generateKeystreamWord.call(this);
+ },
+
+ keySize: 256/32,
+
+ ivSize: 0
+ });
+
+ function generateKeystreamWord() {
+ // Shortcuts
+ var S = this._S;
+ var i = this._i;
+ var j = this._j;
+
+ // Generate keystream word
+ var keystreamWord = 0;
+ for (var n = 0; n < 4; n++) {
+ i = (i + 1) % 256;
+ j = (j + S[i]) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+
+ keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+ }
+
+ // Update counters
+ this._i = i;
+ this._j = j;
+
+ return keystreamWord;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4 = StreamCipher._createHelper(RC4);
+
+ /**
+ * Modified RC4 stream cipher algorithm.
+ */
+ var RC4Drop = C_algo.RC4Drop = RC4.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} drop The number of keystream words to drop. Default 192
+ */
+ cfg: RC4.cfg.extend({
+ drop: 192
+ }),
+
+ _doReset: function () {
+ RC4._doReset.call(this);
+
+ // Drop
+ for (var i = this.cfg.drop; i > 0; i--) {
+ generateKeystreamWord.call(this);
+ }
+ }
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+ }());
+
+
+ return CryptoJS.RC4;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/ripemd160.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/ripemd160.js
new file mode 100644
index 000000000..24feb47c7
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/ripemd160.js
@@ -0,0 +1,267 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ /** @preserve
+ (c) 2012 by Cédric Mesnil. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var _zl = WordArray.create([
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
+ var _zr = WordArray.create([
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
+ var _sl = WordArray.create([
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
+ var _sr = WordArray.create([
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
+
+ var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+ var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+ /**
+ * RIPEMD160 hash algorithm.
+ */
+ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+ _doReset: function () {
+ this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ // Swap
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+ // Shortcut
+ var H = this._hash.words;
+ var hl = _hl.words;
+ var hr = _hr.words;
+ var zl = _zl.words;
+ var zr = _zr.words;
+ var sl = _sl.words;
+ var sr = _sr.words;
+
+ // Working variables
+ var al, bl, cl, dl, el;
+ var ar, br, cr, dr, er;
+
+ ar = al = H[0];
+ br = bl = H[1];
+ cr = cl = H[2];
+ dr = dl = H[3];
+ er = el = H[4];
+ // Computation
+ var t;
+ for (var i = 0; i < 80; i += 1) {
+ t = (al + M[offset+zl[i]])|0;
+ if (i<16){
+ t += f1(bl,cl,dl) + hl[0];
+ } else if (i<32) {
+ t += f2(bl,cl,dl) + hl[1];
+ } else if (i<48) {
+ t += f3(bl,cl,dl) + hl[2];
+ } else if (i<64) {
+ t += f4(bl,cl,dl) + hl[3];
+ } else {// if (i<80) {
+ t += f5(bl,cl,dl) + hl[4];
+ }
+ t = t|0;
+ t = rotl(t,sl[i]);
+ t = (t+el)|0;
+ al = el;
+ el = dl;
+ dl = rotl(cl, 10);
+ cl = bl;
+ bl = t;
+
+ t = (ar + M[offset+zr[i]])|0;
+ if (i<16){
+ t += f5(br,cr,dr) + hr[0];
+ } else if (i<32) {
+ t += f4(br,cr,dr) + hr[1];
+ } else if (i<48) {
+ t += f3(br,cr,dr) + hr[2];
+ } else if (i<64) {
+ t += f2(br,cr,dr) + hr[3];
+ } else {// if (i<80) {
+ t += f1(br,cr,dr) + hr[4];
+ }
+ t = t|0;
+ t = rotl(t,sr[i]) ;
+ t = (t+er)|0;
+ ar = er;
+ er = dr;
+ dr = rotl(cr, 10);
+ cr = br;
+ br = t;
+ }
+ // Intermediate hash value
+ t = (H[1] + cl + dr)|0;
+ H[1] = (H[2] + dl + er)|0;
+ H[2] = (H[3] + el + ar)|0;
+ H[3] = (H[4] + al + br)|0;
+ H[4] = (H[0] + bl + cr)|0;
+ H[0] = t;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
+ );
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 5; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ // Swap
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+
+ function f1(x, y, z) {
+ return ((x) ^ (y) ^ (z));
+
+ }
+
+ function f2(x, y, z) {
+ return (((x)&(y)) | ((~x)&(z)));
+ }
+
+ function f3(x, y, z) {
+ return (((x) | (~(y))) ^ (z));
+ }
+
+ function f4(x, y, z) {
+ return (((x) & (z)) | ((y)&(~(z))));
+ }
+
+ function f5(x, y, z) {
+ return ((x) ^ ((y) |(~(z))));
+
+ }
+
+ function rotl(x,n) {
+ return (x<>>(32-n));
+ }
+
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.RIPEMD160('message');
+ * var hash = CryptoJS.RIPEMD160(wordArray);
+ */
+ C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacRIPEMD160(message, key);
+ */
+ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+ }(Math));
+
+
+ return CryptoJS.RIPEMD160;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha1.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha1.js
new file mode 100644
index 000000000..669114962
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha1.js
@@ -0,0 +1,150 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-1 hash algorithm.
+ */
+ var SHA1 = C_algo.SHA1 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476,
+ 0xc3d2e1f0
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+
+ // Computation
+ for (var i = 0; i < 80; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+ W[i] = (n << 1) | (n >>> 31);
+ }
+
+ var t = ((a << 5) | (a >>> 27)) + e + W[i];
+ if (i < 20) {
+ t += ((b & c) | (~b & d)) + 0x5a827999;
+ } else if (i < 40) {
+ t += (b ^ c ^ d) + 0x6ed9eba1;
+ } else if (i < 60) {
+ t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+ } else /* if (i < 80) */ {
+ t += (b ^ c ^ d) - 0x359d3e2a;
+ }
+
+ e = d;
+ d = c;
+ c = (b << 30) | (b >>> 2);
+ b = a;
+ a = t;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA1('message');
+ * var hash = CryptoJS.SHA1(wordArray);
+ */
+ C.SHA1 = Hasher._createHelper(SHA1);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA1(message, key);
+ */
+ C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+ }());
+
+
+ return CryptoJS.SHA1;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha224.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha224.js
new file mode 100644
index 000000000..d8ce98852
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha224.js
@@ -0,0 +1,80 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./sha256"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./sha256"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+
+ /**
+ * SHA-224 hash algorithm.
+ */
+ var SHA224 = C_algo.SHA224 = SHA256.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+ 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA256._doFinalize.call(this);
+
+ hash.sigBytes -= 4;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA224('message');
+ * var hash = CryptoJS.SHA224(wordArray);
+ */
+ C.SHA224 = SHA256._createHelper(SHA224);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA224(message, key);
+ */
+ C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+ }());
+
+
+ return CryptoJS.SHA224;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha256.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha256.js
new file mode 100644
index 000000000..de2d7fca1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha256.js
@@ -0,0 +1,199 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Initialization and round constants tables
+ var H = [];
+ var K = [];
+
+ // Compute constants
+ (function () {
+ function isPrime(n) {
+ var sqrtN = Math.sqrt(n);
+ for (var factor = 2; factor <= sqrtN; factor++) {
+ if (!(n % factor)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function getFractionalBits(n) {
+ return ((n - (n | 0)) * 0x100000000) | 0;
+ }
+
+ var n = 2;
+ var nPrime = 0;
+ while (nPrime < 64) {
+ if (isPrime(n)) {
+ if (nPrime < 8) {
+ H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+ }
+ K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+ nPrime++;
+ }
+
+ n++;
+ }
+ }());
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-256 hash algorithm.
+ */
+ var SHA256 = C_algo.SHA256 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init(H.slice(0));
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+ var f = H[5];
+ var g = H[6];
+ var h = H[7];
+
+ // Computation
+ for (var i = 0; i < 64; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var gamma0x = W[i - 15];
+ var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
+ ((gamma0x << 14) | (gamma0x >>> 18)) ^
+ (gamma0x >>> 3);
+
+ var gamma1x = W[i - 2];
+ var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+ ((gamma1x << 13) | (gamma1x >>> 19)) ^
+ (gamma1x >>> 10);
+
+ W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+ }
+
+ var ch = (e & f) ^ (~e & g);
+ var maj = (a & b) ^ (a & c) ^ (b & c);
+
+ var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+ var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
+
+ var t1 = h + sigma1 + ch + K[i] + W[i];
+ var t2 = sigma0 + maj;
+
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ H[5] = (H[5] + f) | 0;
+ H[6] = (H[6] + g) | 0;
+ H[7] = (H[7] + h) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA256('message');
+ * var hash = CryptoJS.SHA256(wordArray);
+ */
+ C.SHA256 = Hasher._createHelper(SHA256);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA256(message, key);
+ */
+ C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+ }(Math));
+
+
+ return CryptoJS.SHA256;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha3.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha3.js
new file mode 100644
index 000000000..34ad86c97
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha3.js
@@ -0,0 +1,326 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var C_algo = C.algo;
+
+ // Constants tables
+ var RHO_OFFSETS = [];
+ var PI_INDEXES = [];
+ var ROUND_CONSTANTS = [];
+
+ // Compute Constants
+ (function () {
+ // Compute rho offset constants
+ var x = 1, y = 0;
+ for (var t = 0; t < 24; t++) {
+ RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+ var newX = y % 5;
+ var newY = (2 * x + 3 * y) % 5;
+ x = newX;
+ y = newY;
+ }
+
+ // Compute pi index constants
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+ }
+ }
+
+ // Compute round constants
+ var LFSR = 0x01;
+ for (var i = 0; i < 24; i++) {
+ var roundConstantMsw = 0;
+ var roundConstantLsw = 0;
+
+ for (var j = 0; j < 7; j++) {
+ if (LFSR & 0x01) {
+ var bitPosition = (1 << j) - 1;
+ if (bitPosition < 32) {
+ roundConstantLsw ^= 1 << bitPosition;
+ } else /* if (bitPosition >= 32) */ {
+ roundConstantMsw ^= 1 << (bitPosition - 32);
+ }
+ }
+
+ // Compute next LFSR
+ if (LFSR & 0x80) {
+ // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+ LFSR = (LFSR << 1) ^ 0x71;
+ } else {
+ LFSR <<= 1;
+ }
+ }
+
+ ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+ }
+ }());
+
+ // Reusable objects for temporary values
+ var T = [];
+ (function () {
+ for (var i = 0; i < 25; i++) {
+ T[i] = X64Word.create();
+ }
+ }());
+
+ /**
+ * SHA-3 hash algorithm.
+ */
+ var SHA3 = C_algo.SHA3 = Hasher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} outputLength
+ * The desired number of bits in the output hash.
+ * Only values permitted are: 224, 256, 384, 512.
+ * Default: 512
+ */
+ cfg: Hasher.cfg.extend({
+ outputLength: 512
+ }),
+
+ _doReset: function () {
+ var state = this._state = []
+ for (var i = 0; i < 25; i++) {
+ state[i] = new X64Word.init();
+ }
+
+ this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var state = this._state;
+ var nBlockSizeLanes = this.blockSize / 2;
+
+ // Absorb
+ for (var i = 0; i < nBlockSizeLanes; i++) {
+ // Shortcuts
+ var M2i = M[offset + 2 * i];
+ var M2i1 = M[offset + 2 * i + 1];
+
+ // Swap endian
+ M2i = (
+ (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
+ (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
+ );
+ M2i1 = (
+ (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
+ (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
+ );
+
+ // Absorb message into state
+ var lane = state[i];
+ lane.high ^= M2i1;
+ lane.low ^= M2i;
+ }
+
+ // Rounds
+ for (var round = 0; round < 24; round++) {
+ // Theta
+ for (var x = 0; x < 5; x++) {
+ // Mix column lanes
+ var tMsw = 0, tLsw = 0;
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ tMsw ^= lane.high;
+ tLsw ^= lane.low;
+ }
+
+ // Temporary values
+ var Tx = T[x];
+ Tx.high = tMsw;
+ Tx.low = tLsw;
+ }
+ for (var x = 0; x < 5; x++) {
+ // Shortcuts
+ var Tx4 = T[(x + 4) % 5];
+ var Tx1 = T[(x + 1) % 5];
+ var Tx1Msw = Tx1.high;
+ var Tx1Lsw = Tx1.low;
+
+ // Mix surrounding columns
+ var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+ var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ lane.high ^= tMsw;
+ lane.low ^= tLsw;
+ }
+ }
+
+ // Rho Pi
+ for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+ var tMsw;
+ var tLsw;
+
+ // Shortcuts
+ var lane = state[laneIndex];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+ var rhoOffset = RHO_OFFSETS[laneIndex];
+
+ // Rotate lanes
+ if (rhoOffset < 32) {
+ tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+ tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+ } else /* if (rhoOffset >= 32) */ {
+ tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+ tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+ }
+
+ // Transpose lanes
+ var TPiLane = T[PI_INDEXES[laneIndex]];
+ TPiLane.high = tMsw;
+ TPiLane.low = tLsw;
+ }
+
+ // Rho pi at x = y = 0
+ var T0 = T[0];
+ var state0 = state[0];
+ T0.high = state0.high;
+ T0.low = state0.low;
+
+ // Chi
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ // Shortcuts
+ var laneIndex = x + 5 * y;
+ var lane = state[laneIndex];
+ var TLane = T[laneIndex];
+ var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+ var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+ // Mix rows
+ lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+ lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
+ }
+ }
+
+ // Iota
+ var lane = state[0];
+ var roundConstant = ROUND_CONSTANTS[round];
+ lane.high ^= roundConstant.high;
+ lane.low ^= roundConstant.low;
+ }
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+ var blockSizeBits = this.blockSize * 32;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+ dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var state = this._state;
+ var outputLengthBytes = this.cfg.outputLength / 8;
+ var outputLengthLanes = outputLengthBytes / 8;
+
+ // Squeeze
+ var hashWords = [];
+ for (var i = 0; i < outputLengthLanes; i++) {
+ // Shortcuts
+ var lane = state[i];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+
+ // Swap endian
+ laneMsw = (
+ (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
+ (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
+ );
+ laneLsw = (
+ (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
+ (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
+ );
+
+ // Squeeze state to retrieve hash
+ hashWords.push(laneLsw);
+ hashWords.push(laneMsw);
+ }
+
+ // Return final computed hash
+ return new WordArray.init(hashWords, outputLengthBytes);
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+
+ var state = clone._state = this._state.slice(0);
+ for (var i = 0; i < 25; i++) {
+ state[i] = state[i].clone();
+ }
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA3('message');
+ * var hash = CryptoJS.SHA3(wordArray);
+ */
+ C.SHA3 = Hasher._createHelper(SHA3);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA3(message, key);
+ */
+ C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+ }(Math));
+
+
+ return CryptoJS.SHA3;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha384.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha384.js
new file mode 100644
index 000000000..a0b95bf63
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha384.js
@@ -0,0 +1,83 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core", "./sha512"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+ var SHA512 = C_algo.SHA512;
+
+ /**
+ * SHA-384 hash algorithm.
+ */
+ var SHA384 = C_algo.SHA384 = SHA512.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+ new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+ new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+ new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA512._doFinalize.call(this);
+
+ hash.sigBytes -= 16;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA384('message');
+ * var hash = CryptoJS.SHA384(wordArray);
+ */
+ C.SHA384 = SHA512._createHelper(SHA384);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA384(message, key);
+ */
+ C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+ }());
+
+
+ return CryptoJS.SHA384;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha512.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha512.js
new file mode 100644
index 000000000..d274ab0de
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/sha512.js
@@ -0,0 +1,326 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./x64-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./x64-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+
+ function X64Word_create() {
+ return X64Word.create.apply(X64Word, arguments);
+ }
+
+ // Constants
+ var K = [
+ X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+ X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+ X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+ X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+ X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+ X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+ X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+ X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+ X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+ X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+ X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+ X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+ X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+ X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+ X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+ X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+ X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+ X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+ X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+ X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+ X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+ X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+ X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+ X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+ X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+ X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+ X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+ X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+ X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+ X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+ X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+ X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+ X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+ X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+ X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+ X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+ X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+ X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+ X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+ X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+ ];
+
+ // Reusable objects
+ var W = [];
+ (function () {
+ for (var i = 0; i < 80; i++) {
+ W[i] = X64Word_create();
+ }
+ }());
+
+ /**
+ * SHA-512 hash algorithm.
+ */
+ var SHA512 = C_algo.SHA512 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+ new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+ new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+ new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var H = this._hash.words;
+
+ var H0 = H[0];
+ var H1 = H[1];
+ var H2 = H[2];
+ var H3 = H[3];
+ var H4 = H[4];
+ var H5 = H[5];
+ var H6 = H[6];
+ var H7 = H[7];
+
+ var H0h = H0.high;
+ var H0l = H0.low;
+ var H1h = H1.high;
+ var H1l = H1.low;
+ var H2h = H2.high;
+ var H2l = H2.low;
+ var H3h = H3.high;
+ var H3l = H3.low;
+ var H4h = H4.high;
+ var H4l = H4.low;
+ var H5h = H5.high;
+ var H5l = H5.low;
+ var H6h = H6.high;
+ var H6l = H6.low;
+ var H7h = H7.high;
+ var H7l = H7.low;
+
+ // Working variables
+ var ah = H0h;
+ var al = H0l;
+ var bh = H1h;
+ var bl = H1l;
+ var ch = H2h;
+ var cl = H2l;
+ var dh = H3h;
+ var dl = H3l;
+ var eh = H4h;
+ var el = H4l;
+ var fh = H5h;
+ var fl = H5l;
+ var gh = H6h;
+ var gl = H6l;
+ var hh = H7h;
+ var hl = H7l;
+
+ // Rounds
+ for (var i = 0; i < 80; i++) {
+ var Wil;
+ var Wih;
+
+ // Shortcut
+ var Wi = W[i];
+
+ // Extend message
+ if (i < 16) {
+ Wih = Wi.high = M[offset + i * 2] | 0;
+ Wil = Wi.low = M[offset + i * 2 + 1] | 0;
+ } else {
+ // Gamma0
+ var gamma0x = W[i - 15];
+ var gamma0xh = gamma0x.high;
+ var gamma0xl = gamma0x.low;
+ var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+ var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+ // Gamma1
+ var gamma1x = W[i - 2];
+ var gamma1xh = gamma1x.high;
+ var gamma1xl = gamma1x.low;
+ var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+ var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+ // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+ var Wi7 = W[i - 7];
+ var Wi7h = Wi7.high;
+ var Wi7l = Wi7.low;
+
+ var Wi16 = W[i - 16];
+ var Wi16h = Wi16.high;
+ var Wi16l = Wi16.low;
+
+ Wil = gamma0l + Wi7l;
+ Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+ Wil = Wil + gamma1l;
+ Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+ Wil = Wil + Wi16l;
+ Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+ Wi.high = Wih;
+ Wi.low = Wil;
+ }
+
+ var chh = (eh & fh) ^ (~eh & gh);
+ var chl = (el & fl) ^ (~el & gl);
+ var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+ var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+ var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+ var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+ var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+ var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+ // t1 = h + sigma1 + ch + K[i] + W[i]
+ var Ki = K[i];
+ var Kih = Ki.high;
+ var Kil = Ki.low;
+
+ var t1l = hl + sigma1l;
+ var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+ var t1l = t1l + chl;
+ var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+ var t1l = t1l + Kil;
+ var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+ var t1l = t1l + Wil;
+ var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+ // t2 = sigma0 + maj
+ var t2l = sigma0l + majl;
+ var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+ // Update working variables
+ hh = gh;
+ hl = gl;
+ gh = fh;
+ gl = fl;
+ fh = eh;
+ fl = el;
+ el = (dl + t1l) | 0;
+ eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+ dh = ch;
+ dl = cl;
+ ch = bh;
+ cl = bl;
+ bh = ah;
+ bl = al;
+ al = (t1l + t2l) | 0;
+ ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+ }
+
+ // Intermediate hash value
+ H0l = H0.low = (H0l + al);
+ H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+ H1l = H1.low = (H1l + bl);
+ H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+ H2l = H2.low = (H2l + cl);
+ H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+ H3l = H3.low = (H3l + dl);
+ H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+ H4l = H4.low = (H4l + el);
+ H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+ H5l = H5.low = (H5l + fl);
+ H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+ H6l = H6.low = (H6l + gl);
+ H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+ H7l = H7.low = (H7l + hl);
+ H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Convert hash to 32-bit word array before returning
+ var hash = this._hash.toX32();
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ },
+
+ blockSize: 1024/32
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA512('message');
+ * var hash = CryptoJS.SHA512(wordArray);
+ */
+ C.SHA512 = Hasher._createHelper(SHA512);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA512(message, key);
+ */
+ C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+ }());
+
+
+ return CryptoJS.SHA512;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/tripledes.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/tripledes.js
new file mode 100644
index 000000000..1a9247725
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/tripledes.js
@@ -0,0 +1,779 @@
+;(function (root, factory, undef) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Permuted Choice 1 constants
+ var PC1 = [
+ 57, 49, 41, 33, 25, 17, 9, 1,
+ 58, 50, 42, 34, 26, 18, 10, 2,
+ 59, 51, 43, 35, 27, 19, 11, 3,
+ 60, 52, 44, 36, 63, 55, 47, 39,
+ 31, 23, 15, 7, 62, 54, 46, 38,
+ 30, 22, 14, 6, 61, 53, 45, 37,
+ 29, 21, 13, 5, 28, 20, 12, 4
+ ];
+
+ // Permuted Choice 2 constants
+ var PC2 = [
+ 14, 17, 11, 24, 1, 5,
+ 3, 28, 15, 6, 21, 10,
+ 23, 19, 12, 4, 26, 8,
+ 16, 7, 27, 20, 13, 2,
+ 41, 52, 31, 37, 47, 55,
+ 30, 40, 51, 45, 33, 48,
+ 44, 49, 39, 56, 34, 53,
+ 46, 42, 50, 36, 29, 32
+ ];
+
+ // Cumulative bit shift constants
+ var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+ // SBOXes and round permutation constants
+ var SBOX_P = [
+ {
+ 0x0: 0x808200,
+ 0x10000000: 0x8000,
+ 0x20000000: 0x808002,
+ 0x30000000: 0x2,
+ 0x40000000: 0x200,
+ 0x50000000: 0x808202,
+ 0x60000000: 0x800202,
+ 0x70000000: 0x800000,
+ 0x80000000: 0x202,
+ 0x90000000: 0x800200,
+ 0xa0000000: 0x8200,
+ 0xb0000000: 0x808000,
+ 0xc0000000: 0x8002,
+ 0xd0000000: 0x800002,
+ 0xe0000000: 0x0,
+ 0xf0000000: 0x8202,
+ 0x8000000: 0x0,
+ 0x18000000: 0x808202,
+ 0x28000000: 0x8202,
+ 0x38000000: 0x8000,
+ 0x48000000: 0x808200,
+ 0x58000000: 0x200,
+ 0x68000000: 0x808002,
+ 0x78000000: 0x2,
+ 0x88000000: 0x800200,
+ 0x98000000: 0x8200,
+ 0xa8000000: 0x808000,
+ 0xb8000000: 0x800202,
+ 0xc8000000: 0x800002,
+ 0xd8000000: 0x8002,
+ 0xe8000000: 0x202,
+ 0xf8000000: 0x800000,
+ 0x1: 0x8000,
+ 0x10000001: 0x2,
+ 0x20000001: 0x808200,
+ 0x30000001: 0x800000,
+ 0x40000001: 0x808002,
+ 0x50000001: 0x8200,
+ 0x60000001: 0x200,
+ 0x70000001: 0x800202,
+ 0x80000001: 0x808202,
+ 0x90000001: 0x808000,
+ 0xa0000001: 0x800002,
+ 0xb0000001: 0x8202,
+ 0xc0000001: 0x202,
+ 0xd0000001: 0x800200,
+ 0xe0000001: 0x8002,
+ 0xf0000001: 0x0,
+ 0x8000001: 0x808202,
+ 0x18000001: 0x808000,
+ 0x28000001: 0x800000,
+ 0x38000001: 0x200,
+ 0x48000001: 0x8000,
+ 0x58000001: 0x800002,
+ 0x68000001: 0x2,
+ 0x78000001: 0x8202,
+ 0x88000001: 0x8002,
+ 0x98000001: 0x800202,
+ 0xa8000001: 0x202,
+ 0xb8000001: 0x808200,
+ 0xc8000001: 0x800200,
+ 0xd8000001: 0x0,
+ 0xe8000001: 0x8200,
+ 0xf8000001: 0x808002
+ },
+ {
+ 0x0: 0x40084010,
+ 0x1000000: 0x4000,
+ 0x2000000: 0x80000,
+ 0x3000000: 0x40080010,
+ 0x4000000: 0x40000010,
+ 0x5000000: 0x40084000,
+ 0x6000000: 0x40004000,
+ 0x7000000: 0x10,
+ 0x8000000: 0x84000,
+ 0x9000000: 0x40004010,
+ 0xa000000: 0x40000000,
+ 0xb000000: 0x84010,
+ 0xc000000: 0x80010,
+ 0xd000000: 0x0,
+ 0xe000000: 0x4010,
+ 0xf000000: 0x40080000,
+ 0x800000: 0x40004000,
+ 0x1800000: 0x84010,
+ 0x2800000: 0x10,
+ 0x3800000: 0x40004010,
+ 0x4800000: 0x40084010,
+ 0x5800000: 0x40000000,
+ 0x6800000: 0x80000,
+ 0x7800000: 0x40080010,
+ 0x8800000: 0x80010,
+ 0x9800000: 0x0,
+ 0xa800000: 0x4000,
+ 0xb800000: 0x40080000,
+ 0xc800000: 0x40000010,
+ 0xd800000: 0x84000,
+ 0xe800000: 0x40084000,
+ 0xf800000: 0x4010,
+ 0x10000000: 0x0,
+ 0x11000000: 0x40080010,
+ 0x12000000: 0x40004010,
+ 0x13000000: 0x40084000,
+ 0x14000000: 0x40080000,
+ 0x15000000: 0x10,
+ 0x16000000: 0x84010,
+ 0x17000000: 0x4000,
+ 0x18000000: 0x4010,
+ 0x19000000: 0x80000,
+ 0x1a000000: 0x80010,
+ 0x1b000000: 0x40000010,
+ 0x1c000000: 0x84000,
+ 0x1d000000: 0x40004000,
+ 0x1e000000: 0x40000000,
+ 0x1f000000: 0x40084010,
+ 0x10800000: 0x84010,
+ 0x11800000: 0x80000,
+ 0x12800000: 0x40080000,
+ 0x13800000: 0x4000,
+ 0x14800000: 0x40004000,
+ 0x15800000: 0x40084010,
+ 0x16800000: 0x10,
+ 0x17800000: 0x40000000,
+ 0x18800000: 0x40084000,
+ 0x19800000: 0x40000010,
+ 0x1a800000: 0x40004010,
+ 0x1b800000: 0x80010,
+ 0x1c800000: 0x0,
+ 0x1d800000: 0x4010,
+ 0x1e800000: 0x40080010,
+ 0x1f800000: 0x84000
+ },
+ {
+ 0x0: 0x104,
+ 0x100000: 0x0,
+ 0x200000: 0x4000100,
+ 0x300000: 0x10104,
+ 0x400000: 0x10004,
+ 0x500000: 0x4000004,
+ 0x600000: 0x4010104,
+ 0x700000: 0x4010000,
+ 0x800000: 0x4000000,
+ 0x900000: 0x4010100,
+ 0xa00000: 0x10100,
+ 0xb00000: 0x4010004,
+ 0xc00000: 0x4000104,
+ 0xd00000: 0x10000,
+ 0xe00000: 0x4,
+ 0xf00000: 0x100,
+ 0x80000: 0x4010100,
+ 0x180000: 0x4010004,
+ 0x280000: 0x0,
+ 0x380000: 0x4000100,
+ 0x480000: 0x4000004,
+ 0x580000: 0x10000,
+ 0x680000: 0x10004,
+ 0x780000: 0x104,
+ 0x880000: 0x4,
+ 0x980000: 0x100,
+ 0xa80000: 0x4010000,
+ 0xb80000: 0x10104,
+ 0xc80000: 0x10100,
+ 0xd80000: 0x4000104,
+ 0xe80000: 0x4010104,
+ 0xf80000: 0x4000000,
+ 0x1000000: 0x4010100,
+ 0x1100000: 0x10004,
+ 0x1200000: 0x10000,
+ 0x1300000: 0x4000100,
+ 0x1400000: 0x100,
+ 0x1500000: 0x4010104,
+ 0x1600000: 0x4000004,
+ 0x1700000: 0x0,
+ 0x1800000: 0x4000104,
+ 0x1900000: 0x4000000,
+ 0x1a00000: 0x4,
+ 0x1b00000: 0x10100,
+ 0x1c00000: 0x4010000,
+ 0x1d00000: 0x104,
+ 0x1e00000: 0x10104,
+ 0x1f00000: 0x4010004,
+ 0x1080000: 0x4000000,
+ 0x1180000: 0x104,
+ 0x1280000: 0x4010100,
+ 0x1380000: 0x0,
+ 0x1480000: 0x10004,
+ 0x1580000: 0x4000100,
+ 0x1680000: 0x100,
+ 0x1780000: 0x4010004,
+ 0x1880000: 0x10000,
+ 0x1980000: 0x4010104,
+ 0x1a80000: 0x10104,
+ 0x1b80000: 0x4000004,
+ 0x1c80000: 0x4000104,
+ 0x1d80000: 0x4010000,
+ 0x1e80000: 0x4,
+ 0x1f80000: 0x10100
+ },
+ {
+ 0x0: 0x80401000,
+ 0x10000: 0x80001040,
+ 0x20000: 0x401040,
+ 0x30000: 0x80400000,
+ 0x40000: 0x0,
+ 0x50000: 0x401000,
+ 0x60000: 0x80000040,
+ 0x70000: 0x400040,
+ 0x80000: 0x80000000,
+ 0x90000: 0x400000,
+ 0xa0000: 0x40,
+ 0xb0000: 0x80001000,
+ 0xc0000: 0x80400040,
+ 0xd0000: 0x1040,
+ 0xe0000: 0x1000,
+ 0xf0000: 0x80401040,
+ 0x8000: 0x80001040,
+ 0x18000: 0x40,
+ 0x28000: 0x80400040,
+ 0x38000: 0x80001000,
+ 0x48000: 0x401000,
+ 0x58000: 0x80401040,
+ 0x68000: 0x0,
+ 0x78000: 0x80400000,
+ 0x88000: 0x1000,
+ 0x98000: 0x80401000,
+ 0xa8000: 0x400000,
+ 0xb8000: 0x1040,
+ 0xc8000: 0x80000000,
+ 0xd8000: 0x400040,
+ 0xe8000: 0x401040,
+ 0xf8000: 0x80000040,
+ 0x100000: 0x400040,
+ 0x110000: 0x401000,
+ 0x120000: 0x80000040,
+ 0x130000: 0x0,
+ 0x140000: 0x1040,
+ 0x150000: 0x80400040,
+ 0x160000: 0x80401000,
+ 0x170000: 0x80001040,
+ 0x180000: 0x80401040,
+ 0x190000: 0x80000000,
+ 0x1a0000: 0x80400000,
+ 0x1b0000: 0x401040,
+ 0x1c0000: 0x80001000,
+ 0x1d0000: 0x400000,
+ 0x1e0000: 0x40,
+ 0x1f0000: 0x1000,
+ 0x108000: 0x80400000,
+ 0x118000: 0x80401040,
+ 0x128000: 0x0,
+ 0x138000: 0x401000,
+ 0x148000: 0x400040,
+ 0x158000: 0x80000000,
+ 0x168000: 0x80001040,
+ 0x178000: 0x40,
+ 0x188000: 0x80000040,
+ 0x198000: 0x1000,
+ 0x1a8000: 0x80001000,
+ 0x1b8000: 0x80400040,
+ 0x1c8000: 0x1040,
+ 0x1d8000: 0x80401000,
+ 0x1e8000: 0x400000,
+ 0x1f8000: 0x401040
+ },
+ {
+ 0x0: 0x80,
+ 0x1000: 0x1040000,
+ 0x2000: 0x40000,
+ 0x3000: 0x20000000,
+ 0x4000: 0x20040080,
+ 0x5000: 0x1000080,
+ 0x6000: 0x21000080,
+ 0x7000: 0x40080,
+ 0x8000: 0x1000000,
+ 0x9000: 0x20040000,
+ 0xa000: 0x20000080,
+ 0xb000: 0x21040080,
+ 0xc000: 0x21040000,
+ 0xd000: 0x0,
+ 0xe000: 0x1040080,
+ 0xf000: 0x21000000,
+ 0x800: 0x1040080,
+ 0x1800: 0x21000080,
+ 0x2800: 0x80,
+ 0x3800: 0x1040000,
+ 0x4800: 0x40000,
+ 0x5800: 0x20040080,
+ 0x6800: 0x21040000,
+ 0x7800: 0x20000000,
+ 0x8800: 0x20040000,
+ 0x9800: 0x0,
+ 0xa800: 0x21040080,
+ 0xb800: 0x1000080,
+ 0xc800: 0x20000080,
+ 0xd800: 0x21000000,
+ 0xe800: 0x1000000,
+ 0xf800: 0x40080,
+ 0x10000: 0x40000,
+ 0x11000: 0x80,
+ 0x12000: 0x20000000,
+ 0x13000: 0x21000080,
+ 0x14000: 0x1000080,
+ 0x15000: 0x21040000,
+ 0x16000: 0x20040080,
+ 0x17000: 0x1000000,
+ 0x18000: 0x21040080,
+ 0x19000: 0x21000000,
+ 0x1a000: 0x1040000,
+ 0x1b000: 0x20040000,
+ 0x1c000: 0x40080,
+ 0x1d000: 0x20000080,
+ 0x1e000: 0x0,
+ 0x1f000: 0x1040080,
+ 0x10800: 0x21000080,
+ 0x11800: 0x1000000,
+ 0x12800: 0x1040000,
+ 0x13800: 0x20040080,
+ 0x14800: 0x20000000,
+ 0x15800: 0x1040080,
+ 0x16800: 0x80,
+ 0x17800: 0x21040000,
+ 0x18800: 0x40080,
+ 0x19800: 0x21040080,
+ 0x1a800: 0x0,
+ 0x1b800: 0x21000000,
+ 0x1c800: 0x1000080,
+ 0x1d800: 0x40000,
+ 0x1e800: 0x20040000,
+ 0x1f800: 0x20000080
+ },
+ {
+ 0x0: 0x10000008,
+ 0x100: 0x2000,
+ 0x200: 0x10200000,
+ 0x300: 0x10202008,
+ 0x400: 0x10002000,
+ 0x500: 0x200000,
+ 0x600: 0x200008,
+ 0x700: 0x10000000,
+ 0x800: 0x0,
+ 0x900: 0x10002008,
+ 0xa00: 0x202000,
+ 0xb00: 0x8,
+ 0xc00: 0x10200008,
+ 0xd00: 0x202008,
+ 0xe00: 0x2008,
+ 0xf00: 0x10202000,
+ 0x80: 0x10200000,
+ 0x180: 0x10202008,
+ 0x280: 0x8,
+ 0x380: 0x200000,
+ 0x480: 0x202008,
+ 0x580: 0x10000008,
+ 0x680: 0x10002000,
+ 0x780: 0x2008,
+ 0x880: 0x200008,
+ 0x980: 0x2000,
+ 0xa80: 0x10002008,
+ 0xb80: 0x10200008,
+ 0xc80: 0x0,
+ 0xd80: 0x10202000,
+ 0xe80: 0x202000,
+ 0xf80: 0x10000000,
+ 0x1000: 0x10002000,
+ 0x1100: 0x10200008,
+ 0x1200: 0x10202008,
+ 0x1300: 0x2008,
+ 0x1400: 0x200000,
+ 0x1500: 0x10000000,
+ 0x1600: 0x10000008,
+ 0x1700: 0x202000,
+ 0x1800: 0x202008,
+ 0x1900: 0x0,
+ 0x1a00: 0x8,
+ 0x1b00: 0x10200000,
+ 0x1c00: 0x2000,
+ 0x1d00: 0x10002008,
+ 0x1e00: 0x10202000,
+ 0x1f00: 0x200008,
+ 0x1080: 0x8,
+ 0x1180: 0x202000,
+ 0x1280: 0x200000,
+ 0x1380: 0x10000008,
+ 0x1480: 0x10002000,
+ 0x1580: 0x2008,
+ 0x1680: 0x10202008,
+ 0x1780: 0x10200000,
+ 0x1880: 0x10202000,
+ 0x1980: 0x10200008,
+ 0x1a80: 0x2000,
+ 0x1b80: 0x202008,
+ 0x1c80: 0x200008,
+ 0x1d80: 0x0,
+ 0x1e80: 0x10000000,
+ 0x1f80: 0x10002008
+ },
+ {
+ 0x0: 0x100000,
+ 0x10: 0x2000401,
+ 0x20: 0x400,
+ 0x30: 0x100401,
+ 0x40: 0x2100401,
+ 0x50: 0x0,
+ 0x60: 0x1,
+ 0x70: 0x2100001,
+ 0x80: 0x2000400,
+ 0x90: 0x100001,
+ 0xa0: 0x2000001,
+ 0xb0: 0x2100400,
+ 0xc0: 0x2100000,
+ 0xd0: 0x401,
+ 0xe0: 0x100400,
+ 0xf0: 0x2000000,
+ 0x8: 0x2100001,
+ 0x18: 0x0,
+ 0x28: 0x2000401,
+ 0x38: 0x2100400,
+ 0x48: 0x100000,
+ 0x58: 0x2000001,
+ 0x68: 0x2000000,
+ 0x78: 0x401,
+ 0x88: 0x100401,
+ 0x98: 0x2000400,
+ 0xa8: 0x2100000,
+ 0xb8: 0x100001,
+ 0xc8: 0x400,
+ 0xd8: 0x2100401,
+ 0xe8: 0x1,
+ 0xf8: 0x100400,
+ 0x100: 0x2000000,
+ 0x110: 0x100000,
+ 0x120: 0x2000401,
+ 0x130: 0x2100001,
+ 0x140: 0x100001,
+ 0x150: 0x2000400,
+ 0x160: 0x2100400,
+ 0x170: 0x100401,
+ 0x180: 0x401,
+ 0x190: 0x2100401,
+ 0x1a0: 0x100400,
+ 0x1b0: 0x1,
+ 0x1c0: 0x0,
+ 0x1d0: 0x2100000,
+ 0x1e0: 0x2000001,
+ 0x1f0: 0x400,
+ 0x108: 0x100400,
+ 0x118: 0x2000401,
+ 0x128: 0x2100001,
+ 0x138: 0x1,
+ 0x148: 0x2000000,
+ 0x158: 0x100000,
+ 0x168: 0x401,
+ 0x178: 0x2100400,
+ 0x188: 0x2000001,
+ 0x198: 0x2100000,
+ 0x1a8: 0x0,
+ 0x1b8: 0x2100401,
+ 0x1c8: 0x100401,
+ 0x1d8: 0x400,
+ 0x1e8: 0x2000400,
+ 0x1f8: 0x100001
+ },
+ {
+ 0x0: 0x8000820,
+ 0x1: 0x20000,
+ 0x2: 0x8000000,
+ 0x3: 0x20,
+ 0x4: 0x20020,
+ 0x5: 0x8020820,
+ 0x6: 0x8020800,
+ 0x7: 0x800,
+ 0x8: 0x8020000,
+ 0x9: 0x8000800,
+ 0xa: 0x20800,
+ 0xb: 0x8020020,
+ 0xc: 0x820,
+ 0xd: 0x0,
+ 0xe: 0x8000020,
+ 0xf: 0x20820,
+ 0x80000000: 0x800,
+ 0x80000001: 0x8020820,
+ 0x80000002: 0x8000820,
+ 0x80000003: 0x8000000,
+ 0x80000004: 0x8020000,
+ 0x80000005: 0x20800,
+ 0x80000006: 0x20820,
+ 0x80000007: 0x20,
+ 0x80000008: 0x8000020,
+ 0x80000009: 0x820,
+ 0x8000000a: 0x20020,
+ 0x8000000b: 0x8020800,
+ 0x8000000c: 0x0,
+ 0x8000000d: 0x8020020,
+ 0x8000000e: 0x8000800,
+ 0x8000000f: 0x20000,
+ 0x10: 0x20820,
+ 0x11: 0x8020800,
+ 0x12: 0x20,
+ 0x13: 0x800,
+ 0x14: 0x8000800,
+ 0x15: 0x8000020,
+ 0x16: 0x8020020,
+ 0x17: 0x20000,
+ 0x18: 0x0,
+ 0x19: 0x20020,
+ 0x1a: 0x8020000,
+ 0x1b: 0x8000820,
+ 0x1c: 0x8020820,
+ 0x1d: 0x20800,
+ 0x1e: 0x820,
+ 0x1f: 0x8000000,
+ 0x80000010: 0x20000,
+ 0x80000011: 0x800,
+ 0x80000012: 0x8020020,
+ 0x80000013: 0x20820,
+ 0x80000014: 0x20,
+ 0x80000015: 0x8020000,
+ 0x80000016: 0x8000000,
+ 0x80000017: 0x8000820,
+ 0x80000018: 0x8020820,
+ 0x80000019: 0x8000020,
+ 0x8000001a: 0x8000800,
+ 0x8000001b: 0x0,
+ 0x8000001c: 0x20800,
+ 0x8000001d: 0x820,
+ 0x8000001e: 0x20020,
+ 0x8000001f: 0x8020800
+ }
+ ];
+
+ // Masks that select the SBOX input
+ var SBOX_MASK = [
+ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+ 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+ ];
+
+ /**
+ * DES block cipher algorithm.
+ */
+ var DES = C_algo.DES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Select 56 bits according to PC1
+ var keyBits = [];
+ for (var i = 0; i < 56; i++) {
+ var keyBitPos = PC1[i] - 1;
+ keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+ }
+
+ // Assemble 16 subkeys
+ var subKeys = this._subKeys = [];
+ for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+ // Create subkey
+ var subKey = subKeys[nSubKey] = [];
+
+ // Shortcut
+ var bitShift = BIT_SHIFTS[nSubKey];
+
+ // Select 48 bits according to PC2
+ for (var i = 0; i < 24; i++) {
+ // Select from the left 28 key bits
+ subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+ // Select from the right 28 key bits
+ subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+ }
+
+ // Since each subkey is applied to an expanded 32-bit input,
+ // the subkey can be broken into 8 values scaled to 32-bits,
+ // which allows the key to be used without expansion
+ subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+ for (var i = 1; i < 7; i++) {
+ subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+ }
+ subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+ }
+
+ // Compute inverse subkeys
+ var invSubKeys = this._invSubKeys = [];
+ for (var i = 0; i < 16; i++) {
+ invSubKeys[i] = subKeys[15 - i];
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._subKeys);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._invSubKeys);
+ },
+
+ _doCryptBlock: function (M, offset, subKeys) {
+ // Get input
+ this._lBlock = M[offset];
+ this._rBlock = M[offset + 1];
+
+ // Initial permutation
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeLR.call(this, 1, 0x55555555);
+
+ // Rounds
+ for (var round = 0; round < 16; round++) {
+ // Shortcuts
+ var subKey = subKeys[round];
+ var lBlock = this._lBlock;
+ var rBlock = this._rBlock;
+
+ // Feistel function
+ var f = 0;
+ for (var i = 0; i < 8; i++) {
+ f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+ }
+ this._lBlock = rBlock;
+ this._rBlock = lBlock ^ f;
+ }
+
+ // Undo swap from last round
+ var t = this._lBlock;
+ this._lBlock = this._rBlock;
+ this._rBlock = t;
+
+ // Final permutation
+ exchangeLR.call(this, 1, 0x55555555);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+
+ // Set output
+ M[offset] = this._lBlock;
+ M[offset + 1] = this._rBlock;
+ },
+
+ keySize: 64/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ // Swap bits across the left and right words
+ function exchangeLR(offset, mask) {
+ var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+ this._rBlock ^= t;
+ this._lBlock ^= t << offset;
+ }
+
+ function exchangeRL(offset, mask) {
+ var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+ this._lBlock ^= t;
+ this._rBlock ^= t << offset;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+ */
+ C.DES = BlockCipher._createHelper(DES);
+
+ /**
+ * Triple-DES block cipher algorithm.
+ */
+ var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ // Make sure the key length is valid (64, 128 or >= 192 bit)
+ if (keyWords.length !== 2 && keyWords.length !== 4 && keyWords.length < 6) {
+ throw new Error('Invalid key length - 3DES requires the key length to be 64, 128, 192 or >192.');
+ }
+
+ // Extend the key according to the keying options defined in 3DES standard
+ var key1 = keyWords.slice(0, 2);
+ var key2 = keyWords.length < 4 ? keyWords.slice(0, 2) : keyWords.slice(2, 4);
+ var key3 = keyWords.length < 6 ? keyWords.slice(0, 2) : keyWords.slice(4, 6);
+
+ // Create DES instances
+ this._des1 = DES.createEncryptor(WordArray.create(key1));
+ this._des2 = DES.createEncryptor(WordArray.create(key2));
+ this._des3 = DES.createEncryptor(WordArray.create(key3));
+ },
+
+ encryptBlock: function (M, offset) {
+ this._des1.encryptBlock(M, offset);
+ this._des2.decryptBlock(M, offset);
+ this._des3.encryptBlock(M, offset);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._des3.decryptBlock(M, offset);
+ this._des2.encryptBlock(M, offset);
+ this._des1.decryptBlock(M, offset);
+ },
+
+ keySize: 192/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+ */
+ C.TripleDES = BlockCipher._createHelper(TripleDES);
+ }());
+
+
+ return CryptoJS.TripleDES;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/x64-core.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/x64-core.js
new file mode 100644
index 000000000..57dcc144b
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/node_modules/crypto-js/x64-core.js
@@ -0,0 +1,304 @@
+;(function (root, factory) {
+ if (typeof exports === "object") {
+ // CommonJS
+ module.exports = exports = factory(require("./core"));
+ }
+ else if (typeof define === "function" && define.amd) {
+ // AMD
+ define(["./core"], factory);
+ }
+ else {
+ // Global (browser)
+ factory(root.CryptoJS);
+ }
+}(this, function (CryptoJS) {
+
+ (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var X32WordArray = C_lib.WordArray;
+
+ /**
+ * x64 namespace.
+ */
+ var C_x64 = C.x64 = {};
+
+ /**
+ * A 64-bit word.
+ */
+ var X64Word = C_x64.Word = Base.extend({
+ /**
+ * Initializes a newly created 64-bit word.
+ *
+ * @param {number} high The high 32 bits.
+ * @param {number} low The low 32 bits.
+ *
+ * @example
+ *
+ * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+ */
+ init: function (high, low) {
+ this.high = high;
+ this.low = low;
+ }
+
+ /**
+ * Bitwise NOTs this word.
+ *
+ * @return {X64Word} A new x64-Word object after negating.
+ *
+ * @example
+ *
+ * var negated = x64Word.not();
+ */
+ // not: function () {
+ // var high = ~this.high;
+ // var low = ~this.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ANDs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to AND with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ANDing.
+ *
+ * @example
+ *
+ * var anded = x64Word.and(anotherX64Word);
+ */
+ // and: function (word) {
+ // var high = this.high & word.high;
+ // var low = this.low & word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to OR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ORing.
+ *
+ * @example
+ *
+ * var ored = x64Word.or(anotherX64Word);
+ */
+ // or: function (word) {
+ // var high = this.high | word.high;
+ // var low = this.low | word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise XORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to XOR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after XORing.
+ *
+ * @example
+ *
+ * var xored = x64Word.xor(anotherX64Word);
+ */
+ // xor: function (word) {
+ // var high = this.high ^ word.high;
+ // var low = this.low ^ word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the left.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftL(25);
+ */
+ // shiftL: function (n) {
+ // if (n < 32) {
+ // var high = (this.high << n) | (this.low >>> (32 - n));
+ // var low = this.low << n;
+ // } else {
+ // var high = this.low << (n - 32);
+ // var low = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the right.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftR(7);
+ */
+ // shiftR: function (n) {
+ // if (n < 32) {
+ // var low = (this.low >>> n) | (this.high << (32 - n));
+ // var high = this.high >>> n;
+ // } else {
+ // var low = this.high >>> (n - 32);
+ // var high = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Rotates this word n bits to the left.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotL(25);
+ */
+ // rotL: function (n) {
+ // return this.shiftL(n).or(this.shiftR(64 - n));
+ // },
+
+ /**
+ * Rotates this word n bits to the right.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotR(7);
+ */
+ // rotR: function (n) {
+ // return this.shiftR(n).or(this.shiftL(64 - n));
+ // },
+
+ /**
+ * Adds this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to add with this word.
+ *
+ * @return {X64Word} A new x64-Word object after adding.
+ *
+ * @example
+ *
+ * var added = x64Word.add(anotherX64Word);
+ */
+ // add: function (word) {
+ // var low = (this.low + word.low) | 0;
+ // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+ // var high = (this.high + word.high + carry) | 0;
+
+ // return X64Word.create(high, low);
+ // }
+ });
+
+ /**
+ * An array of 64-bit words.
+ *
+ * @property {Array} words The array of CryptoJS.x64.Word objects.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var X64WordArray = C_x64.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create();
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ]);
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ], 10);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 8;
+ }
+ },
+
+ /**
+ * Converts this 64-bit word array to a 32-bit word array.
+ *
+ * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+ *
+ * @example
+ *
+ * var x32WordArray = x64WordArray.toX32();
+ */
+ toX32: function () {
+ // Shortcuts
+ var x64Words = this.words;
+ var x64WordsLength = x64Words.length;
+
+ // Convert
+ var x32Words = [];
+ for (var i = 0; i < x64WordsLength; i++) {
+ var x64Word = x64Words[i];
+ x32Words.push(x64Word.high);
+ x32Words.push(x64Word.low);
+ }
+
+ return X32WordArray.create(x32Words, this.sigBytes);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {X64WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = x64WordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+
+ // Clone "words" array
+ var words = clone.words = this.words.slice(0);
+
+ // Clone each X64Word object
+ var wordsLength = words.length;
+ for (var i = 0; i < wordsLength; i++) {
+ words[i] = words[i].clone();
+ }
+
+ return clone;
+ }
+ });
+ }());
+
+
+ return CryptoJS;
+
+}));
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package-lock.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package-lock.json
new file mode 100644
index 000000000..32fcba9dc
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package-lock.json
@@ -0,0 +1,21 @@
+{
+ "name": "pedersen",
+ "version": "1.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "pedersen",
+ "version": "1.0.0",
+ "license": "ISC",
+ "dependencies": {
+ "crypto-js": "^4.2.0"
+ }
+ },
+ "node_modules/crypto-js": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz",
+ "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="
+ }
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package.json
new file mode 100644
index 000000000..11c36735c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "pedersen",
+ "version": "1.0.0",
+ "description": "",
+ "main": "test.js",
+ "type": "module",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "crypto-js": "^4.2.0"
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/prove.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/prove.js
new file mode 100644
index 000000000..d5862f2d4
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/prove.js
@@ -0,0 +1,307 @@
+/**
+ * File Name: prove.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-10: Minor bug fixes by Norton.
+ * Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
+ * in JavaScript language.
+ * Contact Information: [None]
+ */
+
+import * as fs from 'fs'
+import CryptoJS from 'crypto-js'
+import { Pedersen } from './Pedersen.js'
+import * as path from 'path' // 添加这一行
+
+function InttoHex(Value, length) {
+ // 转换为十六进制,不包括'0x'前缀
+ let hex = Value.toString(16);
+ // 计算需要填充的零的数量
+ const padding = length - hex.length;
+ // 如果需要,填充零
+ if (padding > 0) {
+ hex = '0x' + '0'.repeat(padding) + hex;
+ }
+ else {
+ hex = '0x' + hex;
+ }
+ return hex;
+}
+
+// 生物特征编码的维度
+const dim = 2
+// 承诺的生成元
+const g = 56544564n
+const h = 237684576n
+let json; // 在 try 块外定义 json 变量
+// 读取用户身份信息
+try {
+ // 使用绝对路径读取文件内容
+const data = fs.readFileSync('identity.json', 'utf8')
+// 将字符串转换为JSON对象
+
+json = JSON.parse(data); // 添加这一行
+} catch (err) {
+ console.error("An error occurred while reading the JSON File.", err)
+}
+// 获取用户身份信息
+const id = json.id
+console.log("id: " + id)
+let emb_old = new Array(dim)
+let rand_old = new Array(dim)
+let cmt_old = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_old[i] = BigInt(json.m[i])
+ rand_old[i] = BigInt(json.r[i])
+ cmt_old[i] = BigInt(json.cmt[i])
+ //console.log(emb_old[i], rand_old[i], cmt_old[i])
+}
+
+
+// 打印数组
+console.log("emb_old: " + emb_old.toString());
+console.log("old_cmt: " + cmt_old.toString());
+console.log("rand_old: " + rand_old.toString());
+
+
+
+console.time('time')
+// 随机生成认证生物特征向量
+const code = new Pedersen(g, h)
+let emb_new = new Array(dim)
+let rand_new = new Array(dim)
+let cmt_new = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_new[i] = BigInt(Math.floor(Math.random() * 1000))
+ rand_new[i] = BigInt(Math.floor(Math.random() * 10000))
+ cmt_new[i] = code.Commitment(emb_new[i], rand_new[i])
+ //console.log(emb_new[i], rand_new[i], cmt_new[i])
+}
+
+
+// 打印数组
+console.log("emb_new: " + emb_new.toString())
+console.log("rand_new: " + rand_new.toString())
+console.log("cmt_new: " + cmt_new.toString())
+
+// 生成前后生物特征元素的平方的承诺
+let emb_eq_old = new Array(dim)
+let emb_eq_new = new Array(dim)
+let rand_eq_old = new Array(dim)
+let rand_eq_new = new Array(dim)
+let cmt_eq_old = new Array(dim)
+let cmt_eq_new = new Array(dim)
+let emb_mult = new Array(dim)
+let rand_mult = new Array(dim)
+let cmt_mult = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_eq_old[i] = emb_old[i] * emb_old[i]
+ emb_eq_new[i] = emb_new[i] * emb_new[i]
+ emb_mult[i] = emb_old[i] * emb_new[i]
+ // 生成随机数
+ const randomEqOld = Math.floor(Math.random() * 1000000);
+ const randomEqNew = Math.floor(Math.random() * 1000000);
+ const randomMult = Math.floor(Math.random() * 1000);
+
+ // 打印随机数
+ console.log("Random for rand_eq_old[" + i + "]: " + randomEqOld);
+ console.log("Random for rand_eq_new[" + i + "]: " + randomEqNew);
+ console.log("Random for rand_mult[" + i + "]: " + randomMult);
+
+ // 进行运算
+ rand_eq_old[i] = emb_old[i] * rand_old[i] + BigInt(randomEqOld);
+ rand_eq_new[i] = emb_new[i] * rand_new[i] + BigInt(randomEqNew);
+ rand_mult[i] = emb_new[i] * rand_old[i] + BigInt(randomMult);
+ //console.log(emb_eq_old[i], emb_eq_new[i], emb_mult[i], rand_eq_old[i], rand_eq_new[i], rand_mult[i])
+ cmt_eq_old[i] = code.Commitment(emb_eq_old[i], rand_eq_old[i])
+ cmt_eq_new[i] = code.Commitment(emb_eq_new[i], rand_eq_new[i])
+ cmt_mult[i] = code.Commitment(emb_mult[i], rand_mult[i])
+ //console.log(cmt_eq_old[i], cmt_eq_new[i])
+}
+
+
+// 打印所有数组的内容
+console.log("emb_eq_old: " + emb_eq_old.toString());
+console.log("emb_eq_new: " + emb_eq_new.toString());
+console.log("emb_mult: " + emb_mult.toString());
+console.log("rand_eq_old: " + rand_eq_old.toString());
+console.log("rand_eq_new: " + rand_eq_new.toString());
+console.log("rand_mult: " + rand_mult.toString());
+console.log("cmt_eq_old: " + cmt_eq_old.toString());
+console.log("cmt_eq_new: " + cmt_eq_new.toString());
+console.log("cmt_mult: " + cmt_mult.toString());
+
+// 构造乘法同态的验证因子
+const b1 = BigInt(Math.floor(Math.random() * 10000))
+const b2 = BigInt(Math.floor(Math.random() * 10000))
+const b3 = BigInt(Math.floor(Math.random() * 10000))
+const b4 = BigInt(Math.floor(Math.random() * 10000))
+const b5 = BigInt(Math.floor(Math.random() * 10000))
+const b6 = BigInt(Math.floor(Math.random() * 10000))
+const b7 = BigInt(Math.floor(Math.random() * 10000))
+const a1 = code.Commitment(b1, b2)
+const a2 = code.Commitment(b3, b4)
+
+
+
+// 打印验证因子
+console.log("b1: ", b1);
+console.log("b2: ", b2);
+console.log("b3: ", b3);
+console.log("b4: ", b4);
+console.log("b5: ", b5);
+console.log("b6: ", b6);
+console.log("b7: ", b7);
+console.log("a1: ", a1);
+console.log("a2: ", a2);
+
+let p1 = new Array(dim)
+let p2 = new Array(dim)
+let p3 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ let temp_eq_old = new Pedersen(cmt_old[i], h)
+ p1[i] = temp_eq_old.Commitment(b1, b5)
+ let temp_eq_new = new Pedersen(cmt_new[i], h)
+ p2[i] = temp_eq_new.Commitment(b3, b6)
+ p3[i] = temp_eq_old.Commitment(b3, b7)
+ //console.log(p1[i], p2[i], p3[i])
+}
+
+
+// 打印数组
+console.log("p1: " + p1.toString());
+console.log("p2: " + p2.toString());
+console.log("p3: " + p3.toString());
+// 生成挑战因子
+let cmt_old_json = Array(dim)
+let cmt_new_json = Array(dim)
+let cmt_eq_old_json = Array(dim)
+let cmt_eq_new_json = Array(dim)
+let cmt_mult_json = Array(dim)
+for(let i = 0; i < dim; i++) {
+ cmt_old_json[i] = InttoHex(cmt_old[i], 16)
+ cmt_new_json[i] = InttoHex(cmt_new[i], 16)
+ cmt_eq_old_json[i] = InttoHex(cmt_eq_old[i], 16)
+ cmt_eq_new_json[i] = InttoHex(cmt_eq_new[i], 16)
+ cmt_mult_json[i] = InttoHex(cmt_mult[i], 16)
+ //console.log(cmt_old_json[i], cmt_new_json[i], cmt_eq_old_json[i], cmt_eq_new_json[i], cmt_mult_json[i])
+}
+
+// 打印数组
+console.log("cmt_old_json: " + cmt_old_json.toString());
+console.log("cmt_new_json: " + cmt_new_json.toString());
+console.log("cmt_eq_old_json: " + cmt_eq_old_json.toString());
+console.log("cmt_eq_new_json: " + cmt_eq_new_json.toString());
+console.log("cmt_mult_json: " + cmt_mult_json.toString());
+
+var t = new Date().toLocaleString();
+const challenge = {cmt_old_json, cmt_new_json, cmt_eq_old_json, cmt_eq_new_json, cmt_mult_json, id, t}
+// e -> hash
+
+const test = JSON.stringify(challenge)
+console.log("challenge:"+challenge.toString())
+console.log("test:"+test.toString())
+const hash = CryptoJS.SHA256(test.toString()).toString()
+console.log("hash:"+hash)
+const e = BigInt('0x' + hash) % 5000n
+console.log("e:"+e)
+// 生成其余辅助证明因子
+let z1 = new Array(dim)
+let z2 = new Array(dim)
+let z3 = new Array(dim)
+let z4 = new Array(dim)
+let z5 = new Array(dim)
+let z6 = new Array(dim)
+let z7 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ z1[i] = b1 + e * emb_old[i]
+ z2[i] = b2 + e * rand_old[i]
+ z3[i] = b3 + e * emb_new[i]
+ z4[i] = b4 + e * rand_new[i]
+ z5[i] = b5 + e * (rand_eq_old[i] - emb_old[i] * rand_old[i])
+ z6[i] = b6 + e * (rand_eq_new[i] - emb_new[i] * rand_new[i])
+ z7[i] = b7 + e * (rand_mult[i] - emb_new[i] * rand_old[i])
+ //console.log(z1[i], z2[i], z3[i], z4[i], z5[i], z6[i], z7[i])
+}
+
+// 打印数组
+console.log("z1: " + z1.toString());
+console.log("z2: " + z2.toString());
+console.log("z3: " + z3.toString());
+console.log("z4: " + z4.toString());
+console.log("z5: " + z5.toString());
+console.log("z6: " + z6.toString());
+console.log("z7: " + z7.toString());
+
+// 计算生物特征编码间的欧式距离
+let emb_dist = 0n
+let rand_dist = 0n
+for(let i = 0; i < dim; i++) {
+ emb_dist = emb_dist + (emb_new[i] - emb_old[i]) * (emb_new[i] - emb_old[i])
+ rand_dist = rand_dist + (rand_eq_new[i] + rand_eq_old[i] - 2n * rand_mult[i])
+}
+
+// 打印变量
+console.log("emb_dist: ", emb_dist);
+console.log("rand_dist: ", rand_dist);
+
+//console.log(emb_dist, rand_dist)
+const cmt_dist = code.Commitment(emb_dist, rand_dist)
+//console.log(t);
+// 数据打包
+let a_json = new Array(2)
+a_json[0] = InttoHex(a1, 16)
+a_json[1] = InttoHex(a2, 16)
+
+// 打印数组
+console.log("a_json: " + a_json.toString());
+
+let z_json = new Array(dim * 7)
+let p_json = new Array(dim * 3)
+for(let i = 0; i < dim; i++) {
+ z_json[i] = InttoHex(z1[i], 16)
+ z_json[dim + i] = InttoHex(z2[i], 16)
+ z_json[2 * dim + i] = InttoHex(z3[i], 16)
+ z_json[3 * dim + i] = InttoHex(z4[i], 16)
+ z_json[4 * dim + i] = InttoHex(z5[i], 16)
+ z_json[5 * dim + i] = InttoHex(z6[i], 16)
+ z_json[6 * dim + i] = InttoHex(z7[i], 16)
+ p_json[i] = InttoHex(p1[i], 16)
+ p_json[dim + i] = InttoHex(p2[i], 16)
+ p_json[2 * dim + i] = InttoHex(p3[i], 16)
+}
+
+// 打印数组
+console.log("z_json: " + z_json.toString());
+console.log("p_json: " + p_json.toString());
+
+//console.log(a_json, z_json, p_json)
+//console.log(cmt_dist)
+var proof = {
+ "id": id,
+ "time": t,
+ "proof": {
+ "emb": cmt_new_json,
+ "cmt": {cmt_eq_old_json, cmt_eq_new_json, cmt_mult_json},
+ "a": a_json,
+ "z": z_json,
+ "p": p_json
+ }
+}
+//var json = JSON.stringify(proof)
+//console.log(json)
+const proofString = JSON.stringify(proof, null, 2);
+// 数据存储
+fs.writeFile('proof.json', proofString, 'utf8', (err) => {
+ if (err) {
+ console.log("An error occured while writing JSON Object to File.");
+ return console.log(err);
+ }
+ console.log("Proof file has been saved.");
+ });
+console.timeEnd('time')
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/test.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/test.js
new file mode 100644
index 000000000..9ac2f2d47
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/test.js
@@ -0,0 +1,242 @@
+// 引入第三方库
+import CryptoJS from 'crypto-js'
+import { Pedersen } from './Pedersen.js'
+import { Homomorphic } from './Homomorphic.js'
+
+// // 同态减法的验证
+// const g = 56544564
+// const h = 237684576
+// let a = new Pedersen(g, h)
+// const test1 = a.Commitment(800, 1000)
+// const test2 = a.Commitment(400, 600)
+// const test3 = a.Commitment(400, 400)
+// let b = new Homomorphic()
+// console.log(b.VerifySub(test1, test2, test3) == 1)
+// // 测试逆元
+// const test2_in = b.Pow(test2, 67108857)
+// const test3_in = b.Add(test1, test2_in)
+// console.log(test3_in == test3)
+
+// ZeroID
+
+// 生物特征编码的维度
+const dim = 512
+// 承诺的生成元
+const g = 56544564n
+const h = 237684576n
+// 随机生成注册生物特征与认证生物特征向量
+let emb_old = new Array(dim)
+let emb_new = new Array(dim)
+let rand_old = new Array(dim)
+let rand_new = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_old[i] = BigInt(Math.floor(Math.random() * 1000))
+ emb_new[i] = BigInt(Math.floor(Math.random() * 1000))
+ rand_old[i] = BigInt(Math.floor(Math.random() * 1000))
+ rand_new[i] = BigInt(Math.floor(Math.random() * 10000))
+ //console.log(emb_old[i], emb_new[i], rand_old[i], rand_new[i])
+}
+// 初始化注册生物特征承诺
+console.time('time11')
+let a = new Pedersen(g, h)
+console.timeEnd('time11')
+let cmt_old = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ cmt_old[i] = a.Commitment(emb_old[i], rand_old[i])
+ //console.log(cmt_old[i])
+}
+
+// 生成身份认证所需要的证明
+console.time('time')
+// 生成认证用生物特征承诺
+let b = new Pedersen(g, h)
+let cmt_new = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ cmt_new[i] = b.Commitment(emb_new[i], rand_new[i])
+ //console.log(cmt_new[i])
+}
+// 生成前后生物特征元素的平方的承诺
+let emb_eq_old = new Array(dim)
+let emb_eq_new = new Array(dim)
+let rand_eq_old = new Array(dim)
+let rand_eq_new = new Array(dim)
+let cmt_eq_old = new Array(dim)
+let cmt_eq_new = new Array(dim)
+let emb_mult = new Array(dim)
+let rand_mult = new Array(dim)
+let cmt_mult = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_eq_old[i] = emb_old[i] * emb_old[i]
+ emb_eq_new[i] = emb_new[i] * emb_new[i]
+ emb_mult[i] = emb_old[i] * emb_new[i]
+ rand_eq_old[i] = emb_old[i] * rand_old[i] + BigInt(Math.floor(Math.random() * 1000000))
+ rand_eq_new[i] = emb_new[i] * rand_new[i] + BigInt(Math.floor(Math.random() * 1000000))
+ rand_mult[i] = emb_new[i] * rand_old[i] + BigInt(Math.floor(Math.random() * 1000))
+ console.log(emb_eq_old[i], emb_eq_new[i], emb_mult[i], rand_eq_old[i], rand_eq_new[i], rand_mult[i])
+ cmt_eq_old[i] = b.Commitment(emb_eq_old[i], rand_eq_old[i])
+ cmt_eq_new[i] = b.Commitment(emb_eq_new[i], rand_eq_new[i])
+ cmt_mult[i] = b.Commitment(emb_mult[i], rand_mult[i])
+ //console.log(cmt_eq_old[i], cmt_eq_new[i])
+}
+// 构造乘法同态的验证因子
+const b1 = BigInt(Math.floor(Math.random() * 10000))
+const b2 = BigInt(Math.floor(Math.random() * 10000))
+const b3 = BigInt(Math.floor(Math.random() * 10000))
+const b4 = BigInt(Math.floor(Math.random() * 10000))
+const b5 = BigInt(Math.floor(Math.random() * 10000))
+const b6 = BigInt(Math.floor(Math.random() * 10000))
+const b7 = BigInt(Math.floor(Math.random() * 10000))
+const a1 = b.Commitment(b1, b2)
+const a2 = b.Commitment(b3, b4)
+let p1 = new Array(dim)
+let p2 = new Array(dim)
+let p3 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ let c = new Pedersen(cmt_old[i], h)
+ p1[i] = c.Commitment(b1, b5)
+ let d = new Pedersen(cmt_new[i], h)
+ p2[i] = d.Commitment(b3, b6)
+ p3[i] = c.Commitment(b3, b7)
+ //console.log(p1[i], p2[i], p3[i])
+}
+// 生成挑战因子
+const e = 1464n
+//const msg = JSON.stringify(cmt_old, cmt_new, cmt_eq_old, cmt_eq_new, cmt_mult)
+// e -> hash
+//const hash = CryptoJS.SHA256(msg).toString()
+//console.log(hash)
+// 生成其余辅助证明因子
+let z1 = new Array(dim)
+let z2 = new Array(dim)
+let z3 = new Array(dim)
+let z4 = new Array(dim)
+let z5 = new Array(dim)
+let z6 = new Array(dim)
+let z7 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ z1[i] = b1 + e * emb_old[i]
+ z2[i] = b2 + e * rand_old[i]
+ z3[i] = b3 + e * emb_new[i]
+ z4[i] = b4 + e * rand_new[i]
+ z5[i] = b5 + e * (rand_eq_old[i] - emb_old[i] * rand_old[i])
+ z6[i] = b6 + e * (rand_eq_new[i] - emb_new[i] * rand_new[i])
+ z7[i] = b7 + e * (rand_mult[i] - emb_new[i] * rand_old[i])
+ console.log(z1[i], z2[i], z3[i], z4[i], z5[i], z6[i], z7[i])
+}
+// 计算生物特征编码间的欧式距离
+let emb_dist = 0n
+let rand_dist = 0n
+for(let i = 0; i < dim; i++) {
+ emb_dist = emb_dist + (emb_new[i] - emb_old[i]) * (emb_new[i] - emb_old[i])
+ rand_dist = rand_dist + (rand_eq_new[i] + rand_eq_old[i] - 2n * rand_mult[i])
+}
+console.log(emb_dist, rand_dist)
+const cmt_dist = b.Commitment(emb_dist, rand_dist)
+// 打包需要使用的证明
+var proof = {
+ "g": g,
+ "h": h,
+ "p": 67108859,
+ "proof": {
+ "facecode": cmt_new,
+ "commitment": {cmt_eq_old, cmt_eq_new, cmt_mult},
+ "a": {a1, a2},
+ "z": {z1, z2, z3, z4, z5, z6, z7}
+ }
+}
+//var json = JSON.stringify(proof)
+//console.log(json)
+console.timeEnd('time')
+
+
+// 开始验证
+console.time('verify')
+let pass = 1
+// 自行生成挑战e
+
+// 验证乘法同态的准确性
+let d1 = new Array(dim)
+let d2 = new Array(dim)
+let d3 = new Array(dim)
+let d4 = new Array(dim)
+let d5 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ d1[i] = b.Commitment(z1[i], z2[i])
+ let f = new Pedersen(cmt_old[i], h)
+ d2[i] = f.Commitment(z1[i], z5[i])
+ d3[i] = b.Commitment(z3[i], z4[i])
+ let ff = new Pedersen(cmt_new[i], h)
+ d4[i] = ff.Commitment(z3[i], z6[i])
+ d5[i] = f.Commitment(z3[i], z7[i])
+}
+// 注册用生物特征编码的平方项的准确性验证
+const hp = new Homomorphic()
+for(let i = 0; i < dim; i++) {
+ if(d1[i] == hp.Add(a1, hp.Pow(cmt_old[i], e)) && d2[i] == hp.Add(p1[i], hp.Pow(cmt_eq_old[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+console.log("m->m^2: ", pass == 1)
+// 验证用生物特征编码的平方项的准确性验证
+for(let i = 0; i < dim; i++) {
+ if(d3[i] == hp.Add(a2, hp.Pow(cmt_new[i], e)) && d4[i] == hp.Add(p2[i], hp.Pow(cmt_eq_new[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+console.log("m‘->m’^2: ", pass == 1)
+// 不同生物特征编码的乘积项的准确性验证
+for(let i = 0; i < dim; i++) {
+ if(d5[i] == hp.Add(p3[i], hp.Pow(cmt_mult[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+console.log("mm‘->mm’^2: ", pass == 1)
+// 自行计算生物特征间欧式距离的承诺
+let sum_old = 1n
+let sum_new = 1n
+let sum_mult = 1n
+for(let i = 0; i < dim; i++) {
+ sum_old = hp.Add(sum_old, cmt_eq_old[i])
+ sum_new = hp.Add(sum_new, cmt_eq_new[i])
+ sum_mult = hp.Add(sum_mult, cmt_mult[i])
+}
+console.log(sum_old, sum_new, sum_mult)
+const cmt_sum = hp.Add(hp.Add(sum_old, sum_new), hp.Pow(hp.Add(sum_mult, sum_mult), 67108857))
+if(cmt_dist == cmt_sum) {
+ console.log('Verify: Pass')
+}
+else {
+ console.log('Verify: Flase')
+}
+// for(let i = 0; i < dim; i++) {
+// if(flag128[i] == 1) {
+// pass = pass * b.VerifySub(emb[i], emb_new[i], emb_dif[i])
+// //console.log(pass)
+// }
+// else {
+// pass = pass * b.VerifySub(emb_new[i], emb[i], emb_dif[i])
+// //console.log(pass)
+// }
+// }
+// // 验证欧式距离的承诺
+// let cmt_sum = 1
+// for(let i = 0; i < 128; i++) {
+// cmt_sum = cmt_sum * emb_sq[i] % 67108859 // p
+// }
+// if(pass == 1) {
+// console.log('Verify: Pass')
+// }
+// else {
+// console.log('Verify: Flase')
+// }
+// console.log(cmt_sum)
+console.timeEnd('verify')
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/verify.js b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/verify.js
new file mode 100644
index 000000000..64299a52e
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/Pedersen/verify.js
@@ -0,0 +1,234 @@
+/**
+ * File Name: verify.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-10: Minor bug fixes by Norton.
+ * Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
+ * in JavaScript language.
+ * Contact Information: [None]
+ */
+
+import * as fs from 'fs'
+import CryptoJS from 'crypto-js'
+import { Pedersen } from './Pedersen.js'
+import { Homomorphic } from './Homomorphic.js'
+
+// 生物特征编码的维度
+const dim = 128
+// 承诺的生成元
+const g = 56544564n
+const h = 237684576n
+// 假设所有变量都已定义并赋值
+console.log("G: " + g);
+console.log("h: " + h);
+
+// 读取数据
+try {
+ // 同步读取文件内容
+ //const data = fs.readFileSync(path.resolve('D:/java/code/check/Pedersen/identity.json'), 'utf8')
+ const data_user = fs.readFileSync('identity.json', 'utf8')
+ const data_proof = fs.readFileSync('proof.json', 'utf8')
+ // 将字符串转换为JSON对象
+ var json_user = JSON.parse(data_user)
+ var json_proof = JSON.parse(data_proof)
+} catch (err) {
+ console.error("An error occurred while reading the JSON File.", err)
+}
+
+// 开始验证
+console.time('time')
+let pass = 1
+// 获取用户身份信息
+const id = json_proof.id
+const t = json_proof.time
+const cmt_old_json = json_user.cmt//有点问题
+const cmt_new_json = json_proof.proof.emb
+const cmt_eq_old_json = json_proof.proof.cmt.cmt_eq_old_json
+const cmt_eq_new_json = json_proof.proof.cmt.cmt_eq_new_json
+const cmt_mult_json = json_proof.proof.cmt.cmt_mult_json
+const a_json = json_proof.proof.a
+const z_json = json_proof.proof.z
+const p_json = json_proof.proof.p
+
+
+
+console.log("ID: " + id);
+console.log("Time: " + t); // 使用JavaScript变量名
+console.log("cmtOldJson: ", cmt_old_json); // 使用JavaScript变量名
+console.log("cmtNewJson: ", cmt_new_json); // 使用JavaScript变量名
+console.log("cmtEqOldJson: ", cmt_eq_old_json); // 使用JavaScript变量名
+console.log("cmtEqNewJson: ", cmt_eq_new_json); // 使用JavaScript变量名
+console.log("cmtMultJson: ", cmt_mult_json); // 使用JavaScript变量名
+console.log("aJson: ", a_json); // 使用JavaScript变量名
+console.log("zJson: ", z_json); // 使用JavaScript变量名
+// 打印 z_json 的长度
+
+console.log("pJson: ", p_json); // 使用JavaScript变量名
+// 时间有效性判断
+var t_end = new Date()
+var t_start = new Date(t)
+// 打印时间信息
+console.log("Start Time: " + t_start);
+console.log("End Time: " + t_end);
+console.log("Time Difference (ms): " + (t_end - t_start));
+if(t_end - t_start <= 3600000000) {
+ pass = 1 * pass
+}
+else {
+ pass = 0 * pass
+}
+// 自行生成挑战e
+const challenge = {cmt_old_json, cmt_new_json, cmt_eq_old_json, cmt_eq_new_json, cmt_mult_json, id, t}
+// e -> hash
+
+const test = JSON.stringify(challenge)
+const hash = CryptoJS.SHA256(test.toString()).toString()
+const e = BigInt('0x' + hash) % 5000n
+// 打印挑战信息
+console.log("Challenge: ", challenge);
+console.log("e: " + e);
+//console.log(e)
+// 数据整理
+let cmt_old = new Array(dim)
+let cmt_new = new Array(dim)
+let cmt_eq_old = new Array(dim)
+let cmt_eq_new = new Array(dim)
+let cmt_mult = new Array(dim)
+let z1 = new Array(dim)
+let z2 = new Array(dim)
+let z3 = new Array(dim)
+let z4 = new Array(dim)
+let z5 = new Array(dim)
+let z6 = new Array(dim)
+let z7 = new Array(dim)
+let p1 = new Array(dim)
+let p2 = new Array(dim)
+let p3 = new Array(dim)
+const a1 = BigInt(a_json[0])
+const a2 = BigInt(a_json[1])
+
+for(let i = 0; i < dim; i++) {
+ cmt_old[i] = BigInt(cmt_old_json[i])
+ cmt_new[i] = BigInt(cmt_new_json[i])
+ cmt_eq_old[i] = BigInt(cmt_eq_old_json[i])
+ cmt_eq_new[i] = BigInt(cmt_eq_new_json[i])
+ cmt_mult[i] = BigInt(cmt_mult_json[i])
+ z1[i] = BigInt(z_json[i])
+ z2[i] = BigInt(z_json[dim + i])
+ z3[i] = BigInt(z_json[2 * dim + i])
+ z4[i] = BigInt(z_json[3 * dim + i])
+ z5[i] = BigInt(z_json[4 * dim + i])
+ z6[i] = BigInt(z_json[5 * dim + i])
+ z7[i] = BigInt(z_json[6 * dim + i])
+ p1[i] = BigInt(p_json[i])
+ p2[i] = BigInt(p_json[dim + i])
+ p3[i] = BigInt(p_json[2 * dim + i])
+ //console.log(emb_old[i], rand_old[i], cmt_old[i])
+}
+
+console.log("a1 :", a1);
+console.log("a2: ", a2);
+
+// 打印BigInteger数组
+console.log("cmtOld: ", cmt_old);
+console.log("cmtNew: ", cmt_new);
+console.log("cmtEqOld: ", cmt_eq_old);
+console.log("cmtEqNew: ", cmt_eq_new);
+console.log("cmtMult: ", cmt_mult);
+console.log("z1: ", z1);
+console.log("z2: ", z2);
+console.log("z3: ", z3);
+console.log("z4: ", z4);
+console.log("z5: ", z5);
+console.log("z6: ", z6);
+console.log("z7: ", z7);
+console.log("p1: ", p1);
+console.log("p2: ", p2);
+console.log("p3: ", p3);
+
+
+// 验证乘法同态的准确性
+const code = new Pedersen(g, h)
+let d1 = new Array(dim)
+let d2 = new Array(dim)
+let d3 = new Array(dim)
+let d4 = new Array(dim)
+let d5 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ d1[i] = code.Commitment(z1[i], z2[i])
+ let f = new Pedersen(cmt_old[i], h)
+ d2[i] = f.Commitment(z1[i], z5[i])
+ d3[i] = code.Commitment(z3[i], z4[i])
+ let ff = new Pedersen(cmt_new[i], h)
+ d4[i] = ff.Commitment(z3[i], z6[i])
+ d5[i] = f.Commitment(z3[i], z7[i])
+}
+
+
+// 打印验证结果数组
+console.log("d1: ", d1);
+console.log("d2: ", d2);
+console.log("d3: ", d3);
+console.log("d4: ", d4);
+console.log("d5: ", d5);
+
+// 注册用生物特征编码的平方项的准确性验证
+const hp = new Homomorphic()
+for(let i = 0; i < dim; i++) {
+ if(d1[i] == hp.Add(a1, hp.Pow(cmt_old[i], e)) && d2[i] == hp.Add(p1[i], hp.Pow(cmt_eq_old[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+//console.log("m->m^2: ", pass == 1)
+// 验证用生物特征编码的平方项的准确性验证
+for(let i = 0; i < dim; i++) {
+ if(d3[i] == hp.Add(a2, hp.Pow(cmt_new[i], e)) && d4[i] == hp.Add(p2[i], hp.Pow(cmt_eq_new[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+//console.log("m‘->m’^2: ", pass == 1)
+// 不同生物特征编码的乘积项的准确性验证
+for(let i = 0; i < dim; i++) {
+ if(d5[i] == hp.Add(p3[i], hp.Pow(cmt_mult[i], e))) {
+ pass = pass * 1
+ }
+ else {
+ pass = pass * 0
+ }
+}
+//console.log("mm‘->mm’^2: ", pass == 1)
+// 自行计算生物特征间欧式距离的承诺
+let sum_old = 1n
+let sum_new = 1n
+let sum_mult = 1n
+for(let i = 0; i < dim; i++) {
+ sum_old = hp.Add(sum_old, cmt_eq_old[i])
+ sum_new = hp.Add(sum_new, cmt_eq_new[i])
+ sum_mult = hp.Add(sum_mult, cmt_mult[i])
+}
+
+
+// 打印欧式距离的承诺
+console.log("sumOld: " + sum_old);
+console.log("sumNew: " + sum_new);
+console.log("sumMult: " + sum_mult);
+//console.log(sum_old, sum_new, sum_mult)
+const cmt_sum = hp.Add(hp.Add(sum_old, sum_new), hp.Pow(hp.Add(sum_mult, sum_mult), 67108857))
+if(pass == 1) {
+ console.log('Verify: Pass')
+}
+else {
+ console.log('Verify: Flase')
+}
+console.timeEnd('time')
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/identity.json
new file mode 100644
index 000000000..bc2d0b042
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/identity.json
@@ -0,0 +1,6 @@
+{
+ "id" : "ca02b82d4f8abfef6186ac5b28d41a6703fe925e17c12164cbf9f634e0ffb9e2",
+ "m" : [ "895", "1085"],
+ "r" : [ "103333", "883370" ],
+ "cmt" : [ "53677044", "45537498" ]
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/proof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/proof.json
new file mode 100644
index 000000000..8b3c20dd7
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/data/proof.json
@@ -0,0 +1,52 @@
+{
+ "id": "ca02b82d4f8abfef6186ac5b28d41a6703fe925e17c12164cbf9f634e0ffb9e2",
+ "time": "2024/11/17 13:26:54",
+ "proof": {
+ "emb": [
+ "0x0000000002259ecd",
+ "0x0000000000be4182"
+ ],
+ "cmt": {
+ "cmt_eq_old_json": [
+ "0x0000000000422fc6",
+ "0x00000000006d5032"
+ ],
+ "cmt_eq_new_json": [
+ "0x000000000064fd76",
+ "0x0000000002bb39cc"
+ ],
+ "cmt_mult_json": [
+ "0x0000000002e5f87e",
+ "0x0000000000afe5ed"
+ ]
+ },
+ "a": [
+ "0x0000000000d9f472",
+ "0x0000000003d99dfb"
+ ],
+ "z": [
+ "0x0000000000437128",
+ "0x000000000051bfda",
+ "0x000000001e6547ef",
+ "0x0000000103d7b952",
+ "0x000000000037cee9",
+ "0x00000000001430ba",
+ "0x0000000002ade381",
+ "0x0000000001537fb9",
+ "0x00000001170d7101",
+ "0x00000000fc918a15",
+ "0x0000000049dc5fae",
+ "0x00000001021eadb0",
+ "0x00000000000aea59",
+ "0x00000000003d5e2b"
+ ],
+ "p": [
+ "0x0000000001cc8f1e",
+ "0x0000000003081cef",
+ "0x00000000018bac29",
+ "0x00000000031ca575",
+ "0x00000000036ca08a",
+ "0x00000000005e327f"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/identity.json
new file mode 100644
index 000000000..4e6cddc58
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/identity.json
@@ -0,0 +1,8 @@
+{
+ "id" : "f867c3e52db66b36ccbe611c70ae48e1ba9461fa67b0cc4addb36624604cd38c",
+ "oldfaceinfo" : [ "-0.044624410569667816", "0.09657693654298782", "0.016005249693989754", "-0.018798457458615303", "-0.07379105687141418", "-0.033922478556632996", "-0.09693005681037903", "-0.18550069630146027", "0.14357616007328033", "-0.08320024609565735", "0.2198302447795868", "-0.03479602187871933", "-0.23184633255004883", "-0.13480915129184723", "-0.05413493514060974", "0.20706981420516968", "-0.17806805670261383", "-0.12622494995594025", "-0.047978177666664124", "-0.01943199150264263", "0.06182115897536278", "-0.03802347183227539", "0.06640246510505676", "0.04908988997340202", "-0.058496277779340744", "-0.37473419308662415", "-0.09329261630773544", "-0.0859874039888382", "0.0394413098692894", "-0.035673562437295914", "-0.07115890085697174", "0.07867569476366043", "-0.12072289735078812", "-0.0475163534283638", "0.05093972757458687", "0.12072206288576126", "-0.008720842190086842", "-0.0885813757777214", "0.22838683426380157", "-0.056269485503435135", "-0.26269617676734924", "-0.005965381860733032", "0.049722399562597275", "0.22683076560497284", "0.2336418181657791", "0.02266509458422661", "0.06805307418107986", "-0.1521545946598053", "0.1355907917022705", "-0.12210093438625336", "0.04458560049533844", "0.17726780474185944", "0.04663337022066116", "0.049533624202013016", "-0.01688079722225666", "-0.11569336801767349", "0.03356001526117325", "0.13222692906856537", "-0.10257861018180847", "-0.016239728778600693", "0.14475862681865692", "-0.15841960906982422", "-0.03545062243938446", "-0.05768396705389023", "0.21532583236694336", "0.08399569243192673", "-0.12695826590061188", "-0.17300766706466675", "0.1049598678946495", "-0.16392716765403748", "-0.1022259071469307", "0.0020198605488985777", "-0.20254354178905487", "-0.15410302579402924", "-0.36465615034103394", "-0.010066408663988113", "0.43738600611686707", "0.10700320452451706", "-0.16321244835853577", "0.06759016960859299", "-0.021966611966490746", "0.02264627069234848", "0.1915184110403061", "0.20365005731582642", "-0.041526976972818375", "0.0016802281606942415", "-0.1025092676281929", "-0.008861896581947803", "0.22937186062335968", "-0.05403587594628334", "-0.03936901316046715", "0.18726816773414612", "-0.044354427605867386", "0.11466075479984283", "0.01880282163619995", "0.05887799710035324", "-0.042007945477962494", "0.05663762241601944", "-0.12250345200300217", "0.0015693811001256108", "0.07870519161224365", "-0.03696271777153015", "0.06360838562250137", "0.10736482590436935", "-0.13984598219394684", "0.06623932719230652", "-0.001503022387623787", "0.11760078370571136", "0.1149514764547348", "-0.012941024266183376", "-0.10543396323919296", "-0.09945926815271378", "0.16770663857460022", "-0.16607356071472168", "0.2046438604593277", "0.1852855086326599", "0.09063348174095154", "0.0951027125120163", "0.1879235804080963", "0.1450633853673935", "-0.007619215175509453", "-0.04929599538445473", "-0.22217117249965668", "0.024054747074842453", "0.09056460112333298", "0.013782543130218983", "0.11150285601615906", "0.0049945940263569355" ],
+ "randomnumbers" : [ "158329", "511490", "177636", "825463", "140035", "904722", "174991", "602101", "648904", "467317", "101317", "892429", "609153", "243708", "122687", "299377", "179959", "376640", "52086", "921140", "390715", "554273", "196652", "112355", "99999", "894779", "509073", "844417", "508563", "117276", "628553", "217539", "427598", "269764", "510408", "331304", "881022", "120997", "138355", "316831", "611156", "971016", "593975", "770649", "133430", "883395", "939120", "320265", "34384", "886025", "487187", "918945", "305498", "822718", "917724", "966919", "307354", "238502", "849901", "744502", "126781", "591358", "487923", "761198", "836610", "230118", "558482", "977648", "465085", "747247", "197438", "307273", "870505", "859616", "192204", "830392", "974843", "167898", "305665", "113027", "259002", "482106", "768614", "165901", "880818", "421495", "27588", "327793", "560520", "368042", "831820", "589334", "265384", "845316", "189071", "224154", "267080", "207409", "774629", "193239", "135950", "830293", "297558", "707656", "281384", "741642", "16457", "17806", "304001", "639487", "436953", "589150", "682214", "303944", "66954", "77341", "797983", "632046", "415784", "117558", "30997", "743047", "919038", "108287", "630735", "909084", "934035", "66197" ],
+ "commitment" : [ "16180205", "49724491", "2925692", "25271774", "54634612", "52888439", "48471149", "23446693", "64659441", "66904956", "32415233", "62723377", "40451546", "8897585", "28426413", "52135089", "8160607", "43688117", "742048", "40938529", "33704975", "1516366", "30424190", "14436287", "57259063", "35866719", "36004767", "49764733", "1202002", "17158518", "13485026", "44443535", "59154018", "36684204", "61228708", "3075497", "11524005", "27757412", "48933341", "18659946", "37733746", "20855107", "12371113", "2509904", "39926739", "33865561", "41590209", "2233679", "66469079", "5233136", "35381555", "39107696", "31927393", "39934411", "46497617", "52958982", "2153713", "5091327", "18285449", "43847638", "59218549", "2366496", "33815774", "33496011", "52195921", "3239317", "28477542", "18727030", "38614061", "59549429", "5965079", "40387994", "19675122", "37150866", "12455529", "61334439", "28979621", "51441462", "51770027", "39790814", "26194646", "39362208", "63421473", "36670845", "12944702", "30989852", "24783975", "5359536", "39762874", "33920077", "45746160", "18177383", "57513109", "29808227", "8520288", "54505670", "40418609", "8271119", "37667812", "41962526", "40719174", "43732140", "54000517", "7365567", "56091113", "30232074", "40806335", "65168087", "28708985", "13180748", "44391454", "32185926", "33192224", "22074439", "49564916", "41802226", "14058751", "12841011", "33737273", "8769551", "17239917", "39999081", "40807404", "36104923", "46129374", "60799727", "46801148", "25971614" ],
+ "cmt" : [ "0x0000000000f6e3ed", "0x0000000002f6bc4b", "0x00000000002ca47c", "0x0000000001819dde", "0x000000000341a874", "0x0000000003270377", "0x0000000002e39c6d", "0x000000000165c4a5", "0x0000000003da9ff1", "0x0000000003fce37c", "0x0000000001ee9e01", "0x0000000003bd1531", "0x0000000002693dda", "0x000000000087c431", "0x0000000001b1c0ad", "0x00000000031b84b1", "0x00000000007c855f", "0x00000000029aa0b5", "0x00000000000b52a0", "0x000000000270ac21", "0x0000000002024c0f", "0x000000000017234e", "0x0000000001d03c7e", "0x0000000000dc47bf", "0x000000000369b437", "0x000000000223485f", "0x000000000225639f", "0x0000000002f7597d", "0x0000000000125752", "0x000000000105d176", "0x0000000000cdc3e2", "0x0000000002a6278f", "0x0000000003869e62", "0x00000000022fc1ac", "0x0000000003a646a4", "0x00000000002eeda9", "0x0000000000afd7a5", "0x0000000001a78b64", "0x0000000002eaa9dd", "0x00000000011cba6a", "0x00000000023fc572", "0x00000000013e3943", "0x0000000000bcc4a9", "0x0000000000264c50", "0x0000000002613bd3", "0x000000000204bf59", "0x00000000027a9dc1", "0x000000000022154f", "0x0000000003f63cd7", "0x00000000004fd9f0", "0x00000000021be133", "0x000000000254bc70", "0x0000000001e72c61", "0x00000000026159cb", "0x0000000002c57f51", "0x0000000003281706", "0x000000000020dcf1", "0x00000000004dafff", "0x0000000001170389", "0x00000000029d0fd6", "0x0000000003879a75", "0x0000000000241c20", "0x000000000203fcde", "0x0000000001ff1bcb", "0x00000000031c7251", "0x0000000000316d95", "0x0000000001b28866", "0x00000000011dc076", "0x00000000024d342d", "0x00000000038ca6f5", "0x00000000005b0517", "0x000000000268459a", "0x00000000012c37f2", "0x000000000236e092", "0x0000000000be0e69", "0x0000000003a7e3a7", "0x0000000001ba31a5", "0x000000000310ef36", "0x000000000315f2ab", "0x00000000025f28de", "0x00000000018fb2d6", "0x0000000002589ea0", "0x0000000003c7bc21", "0x00000000022f8d7d", "0x0000000000c5853e", "0x0000000001d8de1c", "0x00000000017a2c67", "0x000000000051c7b0", "0x00000000025ebbba", "0x000000000205944d", "0x0000000002ba07f0", "0x0000000001155d67", "0x00000000036d9495", "0x0000000001c6d663", "0x0000000000820260", "0x00000000033fb0c6", "0x000000000268bd31", "0x00000000007e350f", "0x00000000023ec3e4", "0x0000000002804c1e", "0x00000000026d5346", "0x00000000029b4cac", "0x000000000337fb85", "0x00000000007063bf", "0x000000000357e1e9", "0x0000000001cd4e0a", "0x00000000026ea7bf", "0x0000000003e262d7", "0x0000000001b61079", "0x0000000000c91f4c", "0x0000000002a55c1e", "0x0000000001eb1e46", "0x0000000001fa7920", "0x000000000150d447", "0x0000000002f44cf4", "0x00000000027dd9f2", "0x0000000000d684ff", "0x0000000000c3f033", "0x000000000202ca39", "0x000000000085d00f", "0x0000000001070f6d", "0x0000000002625669", "0x00000000026eabec", "0x000000000226eadb", "0x0000000002bfe0de", "0x00000000039fbaef", "0x0000000002ca20fc", "0x00000000018c4b9e" ],
+ "appnames" : [ ]
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar2/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar2/check.jar
new file mode 100644
index 000000000..c98c2a506
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar2/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar5/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar5/check.jar
new file mode 100644
index 000000000..21f7cdf5a
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar5/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar6/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar6/check.jar
new file mode 100644
index 000000000..24c8eea59
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar6/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar7/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar7/check.jar
new file mode 100644
index 000000000..598a2425a
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar7/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar8/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar8/check.jar
new file mode 100644
index 000000000..b2c556094
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar8/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar9/check.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar9/check.jar
new file mode 100644
index 000000000..0a6739fb2
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/check/out/artifacts/check_jar9/check.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pom.xml b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pom.xml
new file mode 100644
index 000000000..9cce4d74f
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pom.xml
@@ -0,0 +1,149 @@
+
+
+ 4.0.0
+ szu.blockchain
+ check
+ 0.0.1-SNAPSHOT
+ check
+ check
+
+ 21
+ UTF-8
+ UTF-8
+ 3.2.0
+
+
+
+
+ com.alibaba.edas.acm
+ acm-sdk
+ 1.0.9
+
+
+
+
+ org.web3j
+ core
+ 5.0.0
+
+
+ org.web3j
+ codegen
+ 5.0.0
+
+
+ org.web3j
+ crypto
+ 5.0.0
+
+
+
+ org.fisco-bcos
+ solcJ
+ 0.5.2.0
+
+
+
+ commons-io
+ commons-io
+ 2.4
+
+
+
+ com.squareup.okhttp3
+ okhttp
+ 4.4.0
+
+
+ com.squareup.okhttp3
+ okhttp-ws
+ 3.4.2
+
+
+
+ org.json
+ json
+ 20231013
+
+
+ org.web3j
+ geth
+ 4.8.7
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.15.0
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.15.0
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.0
+
+
+
+ commons-codec
+ commons-codec
+ 1.16.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 16
+ 16
+ UTF-8
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/proof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/proof.json
new file mode 100644
index 000000000..4965717eb
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/proof.json
@@ -0,0 +1,16 @@
+{
+ "oldcmt" : [ "0x0000000000f6e3ed", "0x0000000002f6bc4b", "0x00000000002ca47c", "0x0000000001819dde", "0x000000000341a874", "0x0000000003270377", "0x0000000002e39c6d", "0x000000000165c4a5", "0x0000000003da9ff1", "0x0000000003fce37c", "0x0000000001ee9e01", "0x0000000003bd1531", "0x0000000002693dda", "0x000000000087c431", "0x0000000001b1c0ad", "0x00000000031b84b1", "0x00000000007c855f", "0x00000000029aa0b5", "0x00000000000b52a0", "0x000000000270ac21", "0x0000000002024c0f", "0x000000000017234e", "0x0000000001d03c7e", "0x0000000000dc47bf", "0x000000000369b437", "0x000000000223485f", "0x000000000225639f", "0x0000000002f7597d", "0x0000000000125752", "0x000000000105d176", "0x0000000000cdc3e2", "0x0000000002a6278f", "0x0000000003869e62", "0x00000000022fc1ac", "0x0000000003a646a4", "0x00000000002eeda9", "0x0000000000afd7a5", "0x0000000001a78b64", "0x0000000002eaa9dd", "0x00000000011cba6a", "0x00000000023fc572", "0x00000000013e3943", "0x0000000000bcc4a9", "0x0000000000264c50", "0x0000000002613bd3", "0x000000000204bf59", "0x00000000027a9dc1", "0x000000000022154f", "0x0000000003f63cd7", "0x00000000004fd9f0", "0x00000000021be133", "0x000000000254bc70", "0x0000000001e72c61", "0x00000000026159cb", "0x0000000002c57f51", "0x0000000003281706", "0x000000000020dcf1", "0x00000000004dafff", "0x0000000001170389", "0x00000000029d0fd6", "0x0000000003879a75", "0x0000000000241c20", "0x000000000203fcde", "0x0000000001ff1bcb", "0x00000000031c7251", "0x0000000000316d95", "0x0000000001b28866", "0x00000000011dc076", "0x00000000024d342d", "0x00000000038ca6f5", "0x00000000005b0517", "0x000000000268459a", "0x00000000012c37f2", "0x000000000236e092", "0x0000000000be0e69", "0x0000000003a7e3a7", "0x0000000001ba31a5", "0x000000000310ef36", "0x000000000315f2ab", "0x00000000025f28de", "0x00000000018fb2d6", "0x0000000002589ea0", "0x0000000003c7bc21", "0x00000000022f8d7d", "0x0000000000c5853e", "0x0000000001d8de1c", "0x00000000017a2c67", "0x000000000051c7b0", "0x00000000025ebbba", "0x000000000205944d", "0x0000000002ba07f0", "0x0000000001155d67", "0x00000000036d9495", "0x0000000001c6d663", "0x0000000000820260", "0x00000000033fb0c6", "0x000000000268bd31", "0x00000000007e350f", "0x00000000023ec3e4", "0x0000000002804c1e", "0x00000000026d5346", "0x00000000029b4cac", "0x000000000337fb85", "0x00000000007063bf", "0x000000000357e1e9", "0x0000000001cd4e0a", "0x00000000026ea7bf", "0x0000000003e262d7", "0x0000000001b61079", "0x0000000000c91f4c", "0x0000000002a55c1e", "0x0000000001eb1e46", "0x0000000001fa7920", "0x000000000150d447", "0x0000000002f44cf4", "0x00000000027dd9f2", "0x0000000000d684ff", "0x0000000000c3f033", "0x000000000202ca39", "0x000000000085d00f", "0x0000000001070f6d", "0x0000000002625669", "0x00000000026eabec", "0x000000000226eadb", "0x0000000002bfe0de", "0x00000000039fbaef", "0x0000000002ca20fc", "0x00000000018c4b9e" ],
+ "id" : "f867c3e52db66b36ccbe611c70ae48e1ba9461fa67b0cc4addb36624604cd38c",
+ "time" : "2024/11/18 14:03:30",
+ "proof" : {
+ "p" : [ "0x000000000290e172", "0x0000000002e9197b", "0x0000000000382d35", "0x0000000003ae2b1a", "0x0000000001e9d39d", "0x000000000033ff34", "0x00000000035829d1", "0x0000000001f5d38f", "0x00000000008f15f5", "0x000000000191c101", "0x00000000008a97b6", "0x00000000025e1d73", "0x0000000001bf2b3b", "0x0000000003c95265", "0x0000000001489d78", "0x0000000002976abe", "0x0000000003312f6a", "0x00000000031b0680", "0x000000000155b63b", "0x00000000003909dc", "0x000000000102b4de", "0x00000000038e07b0", "0x00000000013eb5dd", "0x0000000000971acf", "0x0000000000683c09", "0x0000000002449543", "0x00000000026b8ac5", "0x00000000028410c8", "0x0000000002a78be5", "0x0000000001e5ca48", "0x0000000002c26f14", "0x000000000150e6d7", "0x000000000354b4ae", "0x0000000001fca6d1", "0x000000000223e70f", "0x000000000037e472", "0x00000000003289aa", "0x0000000001cbb66a", "0x0000000003461c2b", "0x00000000025d2fcb", "0x0000000003a2621a", "0x0000000001933d69", "0x0000000000065365", "0x0000000000c9b98b", "0x0000000000df484d", "0x000000000265a721", "0x000000000109a1cb", "0x0000000001a8b4c9", "0x00000000010cb81b", "0x000000000065dd40", "0x000000000040d6a4", "0x000000000326c08b", "0x0000000000a5ca0b", "0x00000000025a0f53", "0x0000000001f09ed5", "0x00000000038192bc", "0x00000000029ad132", "0x00000000001156c5", "0x0000000001c6baa4", "0x0000000002730d44", "0x00000000004aebd0", "0x0000000003a8b02e", "0x00000000025b2186", "0x0000000001d7bc41", "0x0000000000209995", "0x000000000216c453", "0x00000000024eab81", "0x0000000003082e91", "0x0000000001826f1b", "0x0000000002248981", "0x0000000003ad1f6e", "0x0000000002d4a6a5", "0x0000000000a896f4", "0x0000000002aa9d11", "0x0000000001079229", "0x0000000000f6b33b", "0x00000000037af781", "0x00000000039d653c", "0x0000000003b49ea8", "0x0000000001946abc", "0x0000000003f521f3", "0x0000000002136cc0", "0x00000000011c8ef5", "0x0000000001c35137", "0x0000000000aafb4a", "0x00000000005e85c7", "0x000000000370fe83", "0x00000000025942d2", "0x00000000015335f1", "0x00000000015b9232", "0x0000000003574765", "0x00000000023eb3bd", "0x0000000002336a62", "0x00000000027efc1c", "0x00000000011697d6", "0x0000000001b197df", "0x0000000000badf0e", "0x00000000036961f6", "0x0000000001c004e7", "0x0000000003f04980", "0x00000000015c37c5", "0x000000000052981e", "0x00000000007417b9", "0x0000000003a81e5c", "0x0000000001d1e25f", "0x0000000003fe8a92", "0x0000000003cfe156", "0x00000000002b108f", "0x0000000002522c92", "0x0000000000e4b163", "0x0000000001530cea", "0x0000000000df4cf0", "0x0000000001683885", "0x0000000001698345", "0x00000000020c7828", "0x0000000002cf7af9", "0x00000000008ff3e4", "0x00000000002d076d", "0x0000000003011443", "0x00000000006d3c7e", "0x00000000021de978", "0x0000000003e227c9", "0x00000000001776e6", "0x0000000003e8f63b", "0x0000000003c537b1", "0x00000000033ceb12", "0x000000000122a2c8", "0x0000000003e4464d", "0x000000000304deba", "0x0000000003d1093c", "0x0000000003915420", "0x00000000016d595a", "0x00000000034ad9ec", "0x0000000002650eb4", "0x0000000000721899", "0x000000000264d138", "0x0000000000ea0c3c", "0x0000000003d9020a", "0x00000000026da76c", "0x00000000008b8660", "0x0000000002dfea9f", "0x00000000006e2ab3", "0x00000000001c0792", "0x0000000000adafb1", "0x0000000001372f3f", "0x00000000007ffb12", "0x0000000001eecd94", "0x00000000029baace", "0x00000000022aea85", "0x000000000003ed15", "0x0000000002389c37", "0x0000000002231507", "0x00000000027effd1", "0x0000000000e3c35e", "0x0000000003cef642", "0x0000000003affbc2", "0x000000000244207d", "0x000000000158645a", "0x00000000038ae35e", "0x00000000038beb58", "0x000000000097b9ba", "0x0000000000dca750", "0x0000000003f52932", "0x00000000017550df", "0x00000000031d6402", "0x0000000000985e29", "0x0000000002507946", "0x0000000003684ab2", "0x0000000003c5fc24", "0x0000000001bd0395", "0x000000000288841e", "0x0000000003519177", "0x00000000017a2261", "0x000000000087cf27", "0x0000000002fb46d0", "0x0000000002af5a17", "0x0000000001225c11", "0x0000000003ba35b7", "0x00000000036351a8", "0x0000000001a1908e", "0x0000000000143ef9", "0x000000000190913a", "0x0000000002e76b88", "0x0000000000b0891c", "0x000000000207d819", "0x0000000003ef1ce6", "0x0000000003ba93a4", "0x0000000002f1bf83", "0x00000000008ea020", "0x0000000002273fcb", "0x000000000048c8af", "0x0000000000764b57", "0x00000000026e2fec", "0x0000000000460048", "0x0000000002c3abc8", "0x00000000002b440d", "0x0000000001529f41", "0x0000000001944ace", "0x00000000023567a6", "0x0000000002252ede", "0x0000000001d2e721", "0x00000000022d74bb", "0x0000000002f61509", "0x000000000003f77e", "0x0000000003a316c2", "0x0000000001f7052d", "0x000000000008d45e", "0x0000000000332548", "0x00000000028e4a56", "0x0000000003f98f45", "0x0000000003305169", "0x00000000028ab8d2", "0x0000000000afa94b", "0x0000000003bc304f", "0x0000000001edd9d4", "0x00000000015ab2ac", "0x00000000007d4e9d", "0x000000000229b1ce", "0x00000000030425c5", "0x0000000003a15b74", "0x0000000001e37c57", "0x00000000024b1046", "0x000000000051d203", "0x000000000216d59b", "0x0000000002b2493e", "0x00000000037073e4", "0x0000000002367cd4", "0x000000000276f992", "0x00000000039cbb0a", "0x0000000000919480", "0x0000000002c3720a", "0x0000000002de8ebc", "0x0000000000f6d34b", "0x000000000287d01b", "0x0000000003c02265", "0x0000000001d11f88", "0x00000000018a66a3", "0x0000000000f3a65a", "0x0000000000281682", "0x0000000001cc0396", "0x0000000001354b3d", "0x0000000001f83ece", "0x000000000308166a", "0x0000000003ba7b83", "0x00000000001486b0", "0x000000000058a98a", "0x0000000002e78743", "0x000000000206bfd4", "0x000000000075f977", "0x0000000000cb5254", "0x00000000027f7e47", "0x00000000034240b4", "0x00000000027e4993", "0x000000000394ef9f", "0x00000000022e5f44", "0x00000000035f3502", "0x0000000001314fcb", "0x000000000091b599", "0x000000000341ebaa", "0x0000000003bd80e3", "0x00000000032fea0b", "0x0000000001ba2f02", "0x0000000003befe07", "0x0000000003b6a9e8", "0x000000000194b235", "0x000000000005afb4", "0x00000000035f7477", "0x0000000001fcf9e3", "0x0000000002ee4649", "0x00000000038630e4", "0x0000000000f3797f", "0x0000000002ca90cf", "0x000000000350a002", "0x00000000028e6890", "0x00000000038006bc", "0x0000000000cf290d", "0x000000000277bcdc", "0x0000000002061b7f", "0x0000000002fa0d0d", "0x0000000001cf145a", "0x00000000035a5dcb", "0x0000000003b98013", "0x00000000030513bf", "0x00000000025e45b4", "0x0000000002cf48de", "0x000000000255dad1", "0x00000000026cb187", "0x0000000000994f75", "0x00000000014a0f4f", "0x00000000005d9718", "0x00000000027028f4", "0x0000000003c4fcd0", "0x00000000003f0a6a", "0x00000000033b85b0", "0x00000000015e2174", "0x00000000037d266a", "0x00000000018ba2cb", "0x00000000017cb197", "0x00000000022f1e70", "0x00000000035a1113", "0x00000000014c9821", "0x0000000000ef15ec", "0x00000000005b0538", "0x0000000002776977", "0x000000000386ec2a", "0x000000000098eeab", "0x0000000002feba1b", "0x0000000000ff3768", "0x0000000001d23c62", "0x00000000017f6c26", "0x0000000000cbbfcc", "0x00000000004fa6d4", "0x00000000025d6faa", "0x00000000037f5d97", "0x00000000029d5903", "0x000000000284f44a", "0x000000000028eeea", "0x0000000002d4340d", "0x0000000000ad2d4c", "0x00000000027e0d1e", "0x00000000030367f3", "0x000000000090e1dc", "0x00000000034909ec", "0x000000000113aaa3", "0x0000000001ad2a0c", "0x00000000033d0295", "0x0000000002a0c8d6", "0x0000000000d5ac24", "0x00000000037ac6a7", "0x0000000002254a60", "0x0000000000a4a081", "0x0000000002d10ec7", "0x0000000000c967c0", "0x00000000017671d7", "0x0000000001f13b43", "0x0000000002b6b565", "0x0000000001a7c9a3", "0x000000000397151c", "0x000000000226c97a", "0x00000000038a0f9a", "0x0000000002279e65", "0x00000000005c3286", "0x00000000003acc9f", "0x00000000032d9769", "0x0000000003d9caa5", "0x0000000003d3ec6d", "0x00000000023910b3", "0x000000000149a59c", "0x0000000001946399", "0x000000000376d9b4", "0x0000000002d68716", "0x000000000388516a", "0x0000000002bcfcb9", "0x0000000001f972f8", "0x0000000003adb794", "0x00000000011dad6a", "0x0000000003cc067a", "0x0000000001e999d1", "0x000000000279121c", "0x0000000002058b7b", "0x00000000027a2c10", "0x0000000001f447da", "0x0000000002cb7f81", "0x0000000002755333", "0x00000000003ff20b", "0x00000000007246b5", "0x0000000002acb694", "0x000000000115c1a6", "0x0000000000a4f113", "0x0000000000d5f3f4", "0x00000000001ffde0", "0x00000000033dcbd9", "0x0000000002e8d6f3", "0x0000000001d0a062", "0x0000000001aa718b", "0x0000000000243469", "0x0000000001251a39", "0x0000000003b804fb", "0x00000000003612c1", "0x0000000003682a97", "0x0000000002657cc0", "0x000000000339fecc", "0x000000000289edba", "0x000000000177ab0a" ],
+ "a" : [ "0x00000000022741f5", "0x000000000167aecc" ],
+ "z" : [ "0x000000000035ebce", "0x00000000003def98", "0x0000000000395d35", "0x000000000037637c", "0x00000000003448c7", "0x0000000000368abf", "0x000000000032fc72", "0x00000000002df677", "0x00000000004096b5", "0x000000000033c6bc", "0x000000000044e0d9", "0x0000000000367c4c", "0x00000000002b5dcd", "0x000000000030d760", "0x00000000003569c3", "0x0000000000442502", "0x00000000002e6a0f", "0x000000000031596b", "0x000000000035c075", "0x000000000037637c", "0x00000000003bf5df", "0x00000000003650f3", "0x00000000003c2fab", "0x00000000003b3a08", "0x0000000000352ff7", "0x0000000000234b90", "0x000000000033363e", "0x0000000000339b63", "0x00000000003aa98a", "0x0000000000366dd9", "0x0000000000347420", "0x00000000003ceb82", "0x000000000031a1aa", "0x000000000035c075", "0x00000000003b56ee", "0x00000000003f4a60", "0x000000000037f3fa", "0x000000000033700a", "0x0000000000455471", "0x0000000000354cdd", "0x0000000000299de0", "0x0000000000381f53", "0x00000000003b487b", "0x00000000004545fe", "0x000000000045ab23", "0x000000000039c25a", "0x00000000003c4c91", "0x00000000002fe1bd", "0x000000000040231d", "0x0000000000319337", "0x00000000003b003c", "0x0000000000427388", "0x00000000003b1d22", "0x00000000003b487b", "0x0000000000378062", "0x000000000031e9e9", "0x00000000003a614b", "0x00000000003fe951", "0x000000000032a5c0", "0x0000000000378ed5", "0x000000000040a528", "0x00000000002f8b0b", "0x0000000000367c4c", "0x0000000000352ff7", "0x000000000044989a", "0x00000000003d33c1", "0x0000000000314af8", "0x00000000002eb24e", "0x00000000003e6330", "0x00000000002f3459", "0x000000000032b433", "0x00000000003892eb", "0x00000000002d00d4", "0x00000000002fc4d7", "0x000000000023dc0e", "0x000000000037e587", "0x0000000000512054", "0x00000000003e8016", "0x00000000002f42cc", "0x00000000003c4c91", "0x0000000000373823", "0x000000000039c25a", "0x0000000000434c45", "0x000000000043f9a9", "0x0000000000361727", "0x00000000003892eb", "0x000000000032a5c0", "0x000000000037f3fa", "0x00000000004562e4", "0x00000000003569c3", "0x0000000000364280", "0x0000000000430406", "0x000000000035fa41", "0x00000000003ef3ae", "0x000000000039888e", "0x00000000003bca86", "0x0000000000361727", "0x00000000003bada0", "0x00000000003184c4", "0x00000000003892eb", "0x00000000003ceb82", "0x0000000000365f66", "0x00000000003c12c5", "0x00000000003e8016", "0x0000000000308f21", "0x00000000003c2fab", "0x000000000038591f", "0x00000000003f1f07", "0x00000000003ef3ae", "0x000000000037ba2e", "0x00000000003288da", "0x000000000032df8c", "0x000000000041f17d", "0x00000000002f1773", "0x000000000044081c", "0x000000000042e720", "0x00000000003d98e6", "0x00000000003dd2b2", "0x0000000000431279", "0x000000000040a528", "0x000000000038026d", "0x000000000035b202", "0x00000000002bee4b", "0x000000000039d0cd", "0x00000000003d98e6", "0x000000000039404f", "0x00000000003ec855", "0x000000000038be44", "0x0000000022e88d28", "0x0000000070c5c1b3", "0x00000000272a4839", "0x00000000b5ff1a42", "0x000000001edfff26", "0x00000000c778a8e3", "0x000000002694fe0a", "0x0000000084c00bdc", "0x000000008f11b6a5", "0x000000006708885c", "0x000000001656aa4c", "0x00000000c4c2d0a4", "0x00000000864e13c0", "0x0000000035bb8901", "0x000000001b0cd61a", "0x0000000042019e90", "0x0000000027ad65c2", "0x00000000530a848d", "0x000000000b7bf4cf", "0x00000000cb175429", "0x000000005624f14e", "0x000000007a3486a0", "0x000000002b5b9691", "0x0000000018c5acc6", "0x00000000160c463a", "0x00000000c547744e", "0x00000000703d55f0", "0x00000000ba2ce8c0", "0x0000000070208cd6", "0x0000000019db6d61", "0x000000008a950e98", "0x000000002ff67f66", "0x000000005e46b3d7", "0x000000003b7a31d9", "0x000000007088afa5", "0x00000000490ba6c5", "0x00000000c23efa67", "0x000000001aad72ec", "0x000000001e812c76", "0x0000000045dac33a", "0x0000000086bf2189", "0x00000000d6167165", "0x0000000082f56582", "0x00000000a9e946c8", "0x000000001d6b320f", "0x00000000c2c4ea66", "0x00000000cf0e291d", "0x00000000469c95d8", "0x000000000794d0bd", "0x00000000c3595bd8", "0x000000006b6a0a56", "0x00000000ca9b7020", "0x00000000435b1a3b", "0x00000000b5642b27", "0x00000000ca5685a1", "0x00000000d52f32f2", "0x0000000043c3dbfb", "0x000000003495b25f", "0x00000000bb627044", "0x00000000a4257b0f", "0x000000001bf3e934", "0x000000008261afe7", "0x000000006b9394f6", "0x00000000a7d3d737", "0x00000000b87443b3", "0x0000000032bc7c1f", "0x000000007b221763", "0x00000000d78cc49d", "0x00000000668a8db4", "0x00000000a4c06a2a", "0x000000002b87f3a7", "0x0000000043bf4998", "0x00000000bfed5ff8", "0x00000000bd86c66d", "0x000000002a608871", "0x00000000b7154e75", "0x00000000d6ee728e", "0x000000002504a5bb", "0x0000000043648740", "0x0000000018eb9aa6", "0x00000000391ac35b", "0x000000006a4b41db", "0x00000000a9766a9f", "0x000000002493eea4", "0x00000000c23376c3", "0x000000005cee3c42", "0x0000000006153bd9", "0x0000000048457b90", "0x000000007b951ee5", "0x0000000051253a2b", "0x00000000b765e7f1", "0x0000000081ef72af", "0x000000003a82fa45", "0x00000000ba5fa699", "0x0000000029afb30a", "0x00000000316bdcfb", "0x000000003ae2b425", "0x000000002dbabcd0", "0x00000000aac9eaac", "0x000000002a9af362", "0x000000001df96e17", "0x00000000b70fb7fc", "0x00000000419af36f", "0x000000009c05cf25", "0x000000003e0a0dc5", "0x00000000a3840e4b", "0x0000000003a0f998", "0x0000000003ed1d97", "0x0000000043069bc0", "0x000000008cfe325a", "0x000000006056b848", "0x0000000081e51007", "0x000000009669ce1f", "0x0000000043036425", "0x000000000ec323cb", "0x00000000110d67d4", "0x00000000aff011ba", "0x000000008b5a35b7", "0x000000005babe4c5", "0x0000000019eb580f", "0x0000000006d5a53c", "0x00000000a3d35b72", "0x00000000caa0afe7", "0x0000000017e0115a", "0x000000008b1036ca", "0x00000000c86edc61", "0x00000000cdef26d6", "0x000000000e9869bc", "0x000000000030c15f", "0x00000000003bdfde", "0x000000000038d39c", "0x00000000003311ca", "0x00000000002f91f0", "0x000000000033dc14", "0x00000000003691a4", "0x000000000033bf2e", "0x00000000003df67d", "0x0000000000372222", "0x00000000004448cd", "0x0000000000375bee", "0x00000000002d4185", "0x000000000031f0ce", "0x000000000036bcfd", "0x0000000000438cf6", "0x00000000002e6281", "0x00000000002e1a42", "0x000000000033dc14", "0x00000000003a8516", "0x00000000003a9389", "0x0000000000387cea", "0x00000000003bdfde", "0x00000000003d3aa6", "0x0000000000300588", "0x000000000026fda8", "0x0000000000347b05", "0x0000000000342453", "0x0000000000378747", "0x0000000000362c7f", "0x0000000000375bee", "0x00000000003d3aa6", "0x00000000002d249f", "0x0000000000356235", "0x00000000003d3aa6", "0x00000000003d9158", "0x0000000000386004", "0x000000000035aa74", "0x000000000042ee05", "0x0000000000373095", "0x0000000000260805", "0x00000000003abee2", "0x00000000003cc70e", "0x00000000004810e6", "0x000000000045783c", "0x00000000003b327a", "0x0000000000399de6", "0x000000000030c15f", "0x00000000003ea3e1", "0x000000000030c15f", "0x00000000003bee51", "0x000000000041be96", "0x00000000003cb89b", "0x0000000000392a4e", "0x0000000000372222", "0x000000000031ff41", "0x00000000003c61e9", "0x000000000040e5d9", "0x00000000002fa063", "0x00000000003570a8", "0x00000000003ea3e1", "0x00000000003778d4", "0x000000000037ddf9", "0x00000000002f91f0", "0x000000000044bc65", "0x00000000003adbc8", "0x00000000002ff715", "0x00000000002e0bcf", "0x00000000003f7c9e", "0x00000000003030e1", "0x0000000000335a09", "0x00000000003f6e2b", "0x00000000002cf946", "0x00000000002d5e6b", "0x00000000002624eb", "0x0000000000373095", "0x00000000004d98ec", "0x000000000041e9ef", "0x00000000002cdc60", "0x0000000000392a4e", "0x000000000035e440", "0x00000000003bdfde", "0x00000000003e3ebc", "0x0000000000403875", "0x00000000003570a8", "0x00000000003b5dd3", "0x000000000032390d", "0x0000000000372222", "0x000000000045c07b", "0x0000000000373095", "0x000000000035b8e7", "0x000000000044bc65", "0x00000000003bfcc4", "0x00000000003a76a3", "0x0000000000399de6", "0x0000000000392a4e", "0x000000000036a017", "0x00000000003a76a3", "0x00000000002f1e58", "0x000000000037c113", "0x0000000000388b5d", "0x000000000038b6b6", "0x0000000000398f73", "0x000000000041933d", "0x000000000031ff41", "0x00000000003f9984", "0x00000000003955a7", "0x00000000003d82e5", "0x000000000036d9e3", "0x00000000003acd55", "0x000000000034ee9d", "0x000000000031e25b", "0x00000000003d4919", "0x00000000002e0bcf", "0x000000000042ee05", "0x000000000042df92", "0x00000000003e21d6", "0x00000000003bb485", "0x000000000040ba80", "0x00000000003cd581", "0x000000000034a65e", "0x000000000038431e", "0x00000000002d4185", "0x00000000003955a7", "0x0000000000417657", "0x000000000034076d", "0x0000000000438cf6", "0x000000000039bacc", "0x000000000150dce6", "0x000000000023db37", "0x00000000014fd8d0", "0x0000000000859d43", "0x0000000000b5b3ff", "0x0000000000b950bf", "0x0000000001a4d956", "0x00000000000b5c41", "0x0000000000567c2a", "0x000000000117e9a3", "0x0000000000dfec03", "0x00000000016b0d56", "0x0000000001539276", "0x0000000001158ac5", "0x00000000019bc303", "0x00000000021396b4", "0x0000000000e7991b", "0x000000000179ba22", "0x00000000020c14f5", "0x000000000201a3da", "0x000000000095dea3", "0x00000000007e1b84", "0x00000000002d907b", "0x00000000008d3be8", "0x0000000001533bc4", "0x000000000095313f", "0x0000000000a33f1a", "0x0000000001703eaa", "0x000000000233a5dc", "0x0000000001c29813", "0x0000000001b9c9ff", "0x0000000000e3a5a9", "0x00000000005cce7a", "0x0000000002081310", "0x0000000001572f36", "0x000000000050808c", "0x0000000000b36394", "0x00000000007513a4", "0x0000000000bb0239", "0x000000000105ae8a", "0x0000000001664127", "0x0000000000507219", "0x0000000001c0c9b3", "0x0000000000709e27", "0x0000000000c11abd", "0x0000000000a9ae50", "0x000000000030b9a3", "0x0000000000d7d9c6", "0x00000000017c613f", "0x00000000019691af", "0x00000000011dd6ce", "0x0000000001c6ff1d", "0x0000000001314fc9", "0x0000000000432015", "0x0000000000cb26b3", "0x000000000226f2c9", "0x00000000006e6aa2", "0x0000000000e68692", "0x00000000013115fd", "0x000000000168f6b7", "0x00000000010ee1c3", "0x0000000000aa21e8", "0x000000000202f02f", "0x0000000001f330da", "0x000000000079dfd3", "0x0000000001e06543", "0x00000000011d9d02", "0x000000000175c6b0", "0x00000000002086b6", "0x000000000008eef0", "0x00000000011aada6", "0x0000000000ee2537", "0x0000000001b76b21", "0x00000000016c59ab", "0x000000000118fc2c", "0x0000000001638b97", "0x00000000005f01ff", "0x000000000157a2ce", "0x0000000000699e73", "0x0000000001280e1d", "0x0000000000d01e3b", "0x0000000000c581c7", "0x0000000000ec8230", "0x000000000175f209", "0x00000000001b5562", "0x00000000000b3f5b", "0x0000000001ac77fb", "0x000000000119c676", "0x0000000001da2166", "0x00000000000becbf", "0x0000000000b4db42", "0x0000000001dd5901", "0x0000000002273b08", "0x000000000141f64e", "0x0000000000ce2482", "0x000000000127d451", "0x00000000004adba0", "0x000000000032b35c", "0x00000000003f1e30", "0x0000000001729d88", "0x00000000005cb194", "0x000000000154a4ff", "0x000000000165cd8f", "0x00000000013e598e", "0x00000000020f2faa", "0x0000000000d72c62", "0x0000000000fad84a", "0x0000000001e458b5", "0x0000000000825735", "0x00000000011b2fb1", "0x00000000016fbc9f", "0x0000000001b498ab", "0x00000000012fe68e", "0x0000000001408d13", "0x0000000000a99fdd", "0x000000000092ef47", "0x000000000128f54d", "0x00000000003cbf52", "0x00000000012ec592", "0x0000000002025fb1", "0x00000000001ed53c", "0x00000000008c295f", "0x000000000124c80f", "0x0000000002221827", "0x000000000148826a", "0x0000000001d29fa7", "0x0000000000d05807", "0x0000000000b812dd", "0x0000000022b83a74", "0x000000003d407d70", "0x00000000579fa964", "0x0000000092ae00e1", "0x000000003be9d43b", "0x000000005214d0ee", "0x000000006257e268", "0x0000000070b88a69", "0x00000000b2eed431", "0x000000006e6a9b2d", "0x0000000031893467", "0x00000000835a79e3", "0x00000000800dc2e1", "0x00000000a9533023", "0x000000008febbdce", "0x0000000039523cc4", "0x000000001a11d441", "0x0000000012636fec", "0x0000000021c9fc4d", "0x00000000bd547a00", "0x000000007e9d317b", "0x00000000b43f7355", "0x00000000c3e84318", "0x00000000976bf6ad", "0x00000000799aa7e2", "0x000000000389f024", "0x00000000cfd00802", "0x000000004431110c", "0x00000000cf46161e", "0x00000000c5cfa419", "0x00000000b2e06fa4", "0x0000000098d9ef69", "0x0000000058e95747", "0x00000000d711ff64", "0x00000000348e59cd", "0x00000000b68bbf8a", "0x000000001eee9b53", "0x0000000050d745a0", "0x00000000d0c57fa9", "0x00000000c779aacd", "0x00000000bed55b39", "0x000000008bf4a09b", "0x000000002800a42f", "0x00000000858a2857", "0x00000000846f534e", "0x00000000cf83282c", "0x0000000026c9147f", "0x0000000088c62a61", "0x00000000c187a52b", "0x0000000036e7e993", "0x000000009d2806db", "0x0000000026d4e062", "0x00000000413db327", "0x00000000cb8b06e3", "0x00000000b6da6dc0", "0x000000001bb4be5b", "0x000000000da60a9e", "0x00000000366401c0", "0x0000000066091106", "0x00000000d9d265a4", "0x0000000027677501", "0x0000000020c89bdd", "0x00000000594ac2a1", "0x000000003ef1924b", "0x0000000046a4d142", "0x00000000b20b4f64", "0x000000004f6bf401", "0x000000007b86a9b9", "0x0000000021a82d38", "0x00000000a64b46ba", "0x0000000024a28ad1", "0x0000000080fef064", "0x00000000cb182aba", "0x0000000090ee4dad", "0x000000004cdc2688", "0x000000007153ed1c", "0x000000007684a22b", "0x000000001a5e407f", "0x000000001daada9b", "0x0000000008472a19", "0x000000001f991e6a", "0x000000007b76bf0b", "0x00000000ba8a24b0", "0x0000000004f260da", "0x00000000320d8fd2", "0x00000000827647b2", "0x0000000034af07e6", "0x0000000089ed78b1", "0x00000000b24a8684", "0x00000000344d0c0e", "0x00000000b842a4aa", "0x000000006865e6da", "0x00000000d99fb63e", "0x00000000ba716bee", "0x000000008b34f30f", "0x000000002b10ae48", "0x000000003c0aca93", "0x0000000099a3ff9d", "0x000000009f72ccef", "0x000000005562523a", "0x000000008332587e", "0x00000000d9b24809", "0x000000005f652374", "0x00000000d5f53f15", "0x0000000099c288a4", "0x000000002c00c942", "0x000000004cb62a35", "0x00000000c243c46a", "0x00000000a96d353a", "0x00000000a66f663a", "0x000000005c58259d", "0x0000000016fe841a", "0x00000000978cd01f", "0x000000004c10e6e5", "0x00000000ad219b73", "0x0000000031cfed46", "0x00000000121dbb23", "0x000000005cffb958", "0x000000005a74d4f4", "0x00000000cee51e5c", "0x00000000847d7e0f", "0x0000000001a0a3dd", "0x00000000b60578d9", "0x000000003f164249", "0x000000004776d6cd", "0x00000000395f1b30", "0x0000000052c07501", "0x00000000c30ee727", "0x0000000093a73801", "0x000000009334c0fd", "0x00000000599f9da1", "0x00000000896352d4", "0x00000000972807a4", "0x0000000045b8109c", "0x0000000003a0e059", "0x0000000009d11905", "0x0000000015cadf3c", "0x00000000481ab6b5", "0x000000000d1d87c8", "0x000000005d2e246d", "0x000000003ffa9733", "0x0000000040f5fc05", "0x000000001f36d1b3", "0x00000000b0d8a029", "0x0000000010515aaf", "0x000000006292619f", "0x0000000029dd51a9", "0x0000000083ae6db3", "0x00000000d868d9c5", "0x0000000065d19b44", "0x000000007567cac9", "0x00000000c0fb4bc9", "0x00000000a7c25b9c", "0x00000000d3bd022c", "0x00000000ba4739bd", "0x0000000034c48ee0", "0x0000000003ab348e", "0x0000000091aa8132", "0x000000000b08d40e", "0x000000001e6ab953", "0x000000001ebcbc0a", "0x000000007e48c746", "0x000000005a421cee", "0x00000000543bb721", "0x00000000dbbee0e6", "0x00000000529400d8", "0x00000000accbb990", "0x0000000062b87ad8", "0x000000003be06d09", "0x000000002bf3c550", "0x0000000054270044", "0x00000000ad4176a2", "0x00000000ba4c4e2b", "0x000000006f6a4ff6", "0x0000000035655cb3", "0x00000000b9d72197", "0x00000000303af9f4", "0x0000000069898fca", "0x00000000314e957d", "0x00000000b6ef55c9", "0x0000000094b2de33", "0x00000000790dbe02", "0x0000000055d02e3b", "0x0000000061ce86d5", "0x000000008f9fcafb", "0x000000000e62eb87", "0x00000000561237d1", "0x00000000a9b0cac4", "0x000000009d280cae", "0x00000000dac8e734", "0x00000000a6ba609d", "0x00000000621b9204", "0x0000000061f7559e", "0x000000008f12db48", "0x00000000c56a2e3a", "0x00000000c0ea2339", "0x000000009b18507c", "0x0000000000ff0320", "0x000000001882eb00", "0x00000000b8b8db27", "0x00000000b064a304", "0x00000000c6950ad7", "0x0000000003912f77", "0x000000002d4b1be9", "0x0000000063322b5c", "0x00000000a5411e09", "0x000000005b7bd1b0", "0x00000000a4236817", "0x0000000098f8b80f", "0x00000000af0f293e", "0x00000000dba057df", "0x0000000008c64b90", "0x000000005d04f07f", "0x00000000c48b0204", "0x0000000009ede21f", "0x000000006f8bc859", "0x00000000968a9cc5", "0x0000000000312ad3", "0x00000000bafa995b", "0x000000003026094b", "0x000000008247ae77", "0x000000001a18cb55", "0x000000007223c4f5", "0x00000000c812891c", "0x000000005222f30f", "0x0000000044c877ad", "0x000000008786f36c", "0x00000000c8cc8349", "0x00000000c95de879", "0x00000000a740085d", "0x000000002986f65b", "0x000000002773639d", "0x000000001276b4ee", "0x000000003db6df46", "0x00000000988bac2b", "0x000000007dc9f3e1", "0x000000001c77274a", "0x00000000b34f2462", "0x0000000091cbce3c", "0x0000000090df07c3", "0x0000000070efd205", "0x0000000075f1f679", "0x000000000f604a12", "0x0000000013a40d4f", "0x00000000af043618", "0x00000000d8140498", "0x00000000c3edb40b", "0x00000000363857e1", "0x000000005dbba49e", "0x0000000068259491", "0x0000000083b0f7ea", "0x000000005a4e4df6", "0x000000009cff4c58", "0x000000006c58690a", "0x0000000029d37f7f", "0x000000000dc6be8a", "0x00000000002463c1", "0x00000000001b2215", "0x0000000000114feb", "0x00000000002e2778", "0x0000000000266bed", "0x0000000000024c6d", "0x00000000002f0ea8", "0x000000000021cb17", "0x0000000000022114", "0x00000000000903e2", "0x00000000000e521c", "0x0000000000380815", "0x0000000000066b38", "0x00000000001495f9", "0x000000000003e101", "0x0000000000321aea", "0x0000000000287419", "0x0000000000049cd8", "0x0000000000145c2d", "0x00000000001e8509", "0x00000000000b0c0e", "0x00000000002f3a01", "0x000000000036d8a6", "0x00000000001d8f66", "0x00000000002342c5", "0x00000000002e2778", "0x00000000000b62c0", "0x000000000000b7d9", "0x0000000000014857", "0x00000000002babb4", "0x00000000001e2e57", "0x000000000028f624", "0x0000000000006f9a", "0x00000000001cd38f", "0x000000000005e92d", "0x00000000001a3ae5", "0x00000000001c349e", "0x000000000020e3e7", "0x000000000008ad30", "0x00000000001e2e57", "0x0000000000095a94", "0x00000000000baaff", "0x000000000020d574", "0x0000000000076f4e", "0x00000000000d143a", "0x0000000000010018", "0x000000000034d07a", "0x000000000010bf6d", "0x0000000000036d69", "0x00000000003012be", "0x00000000002986a2", "0x00000000000316b7", "0x00000000001aae7d", "0x00000000001d8f66", "0x000000000035b7aa", "0x0000000000022114", "0x0000000000100396", "0x000000000014de38", "0x0000000000264094", "0x000000000005f7a0", "0x00000000002cf809", "0x00000000000c49f0", "0x0000000000259330", "0x000000000012f2f2", "0x000000000008480b", "0x00000000001c5ff7", "0x000000000011982a", "0x000000000009b146", "0x000000000014de38", "0x0000000000114feb", "0x00000000003639b5", "0x00000000001f40e0", "0x0000000000338425", "0x000000000011d1f6", "0x0000000000023dfa", "0x00000000001a2c72", "0x000000000035a937", "0x0000000000373dcb", "0x00000000001b2215", "0x00000000001e1171", "0x000000000017cd94", "0x00000000001e3cca", "0x00000000000ca0a2", "0x000000000009f985", "0x0000000000011cfe", "0x000000000002dceb", "0x00000000000d22ad", "0x0000000000056722", "0x0000000000235138", "0x00000000000920c8", "0x00000000001abcf0", "0x00000000003841e1", "0x000000000025764a", "0x00000000003518b9", "0x0000000000240d0f", "0x0000000000372f58", "0x00000000002d31d5", "0x0000000000377797", "0x000000000004c831", "0x000000000009777a", "0x0000000000064e52", "0x0000000000293e63", "0x00000000001c6e6a", "0x00000000000212a1", "0x000000000018896b", "0x000000000035e303", "0x00000000000b45da", "0x00000000000679ab", "0x00000000000294ac", "0x0000000000158b9c", "0x000000000020c701", "0x00000000002f90b3", "0x0000000000038a4f", "0x00000000002061dc", "0x00000000001d9dd9", "0x00000000002f73cd", "0x00000000000501fd", "0x000000000015d3db", "0x0000000000278ce9", "0x00000000000018e8", "0x00000000001fdfd1", "0x000000000026edf8", "0x00000000002567d7", "0x0000000000212c26", "0x0000000000056722", "0x00000000001672cc", "0x00000000002463c1", "0x00000000002f0ea8" ],
+ "emb" : [ "0x00000000006eb150", "0x000000000398e074", "0x00000000034c4a83", "0x0000000001dc61a4", "0x00000000036d4d57", "0x000000000022c8a6", "0x000000000338ae3d", "0x0000000000a26256", "0x0000000000e20e33", "0x0000000001119d18", "0x0000000003cda41f", "0x0000000002791ad7", "0x0000000003539048", "0x00000000006029d6", "0x0000000000eba983", "0x0000000001e1bac5", "0x0000000003a9f330", "0x00000000019cd574", "0x00000000000826b7", "0x00000000005ab357", "0x0000000001b04824", "0x0000000000fc0c57", "0x00000000027371f0", "0x000000000173fefe", "0x00000000007b423f", "0x00000000013b6d42", "0x000000000172d6f9", "0x00000000034ec957", "0x0000000003f664fc", "0x0000000002fe828a", "0x0000000001df6413", "0x0000000000b344ed", "0x0000000000d8edf2", "0x0000000001d4209f", "0x0000000000b48f82", "0x00000000024d8cb1", "0x0000000001047b07", "0x0000000003745716", "0x00000000000034fa", "0x0000000002a2a95d", "0x0000000000e5580b", "0x0000000002a52ba0", "0x0000000002216191", "0x00000000024436b2", "0x0000000003f5c65e", "0x0000000000b192fe", "0x0000000001091af9", "0x0000000003da5e46", "0x0000000000f3e4e5", "0x000000000291136e", "0x0000000003e856d6", "0x0000000003025dab", "0x0000000000fd9548", "0x00000000007af56c", "0x00000000035c2572", "0x0000000000ac426d", "0x00000000006c06b6", "0x0000000002b8b31a", "0x00000000015e8f12", "0x0000000003d36a5c", "0x00000000020a9df2", "0x0000000000827952", "0x000000000274e40d", "0x0000000000c43c51", "0x000000000067e124", "0x00000000019347b8", "0x00000000022e859b", "0x00000000004c918d", "0x0000000003f859e8", "0x0000000000b0253c", "0x00000000005476e2", "0x00000000021da410", "0x0000000003cfe3a7", "0x0000000002df4586", "0x000000000294c11c", "0x000000000298d4dd", "0x0000000000ef7550", "0x00000000033572c7", "0x0000000001be6053", "0x0000000002135567", "0x0000000001c9790d", "0x00000000036dc32c", "0x0000000001da4b64", "0x0000000001f63ea4", "0x00000000006e3bad", "0x0000000001c4bfd9", "0x0000000002668e4d", "0x00000000031d3c5b", "0x00000000007b8e04", "0x00000000008aed58", "0x0000000003916045", "0x00000000036b1dc8", "0x00000000014c0043", "0x0000000003d86af0", "0x0000000001a6faa4", "0x0000000002c5373f", "0x0000000001982753", "0x00000000032a7962", "0x0000000000c458ec", "0x00000000020465db", "0x0000000001cda9be", "0x0000000001d39d76", "0x00000000014cf9f8", "0x0000000002b5cc33", "0x00000000005cd7e8", "0x0000000003f85677", "0x00000000012e71b4", "0x0000000002cafce0", "0x000000000110cc9a", "0x00000000006a5590", "0x00000000005a573b", "0x0000000001c4e2de", "0x000000000399d936", "0x00000000031f756c", "0x00000000011c96f0", "0x00000000022dce5e", "0x0000000001bc173b", "0x0000000001976251", "0x00000000038287f8", "0x0000000000df4b6d", "0x0000000002022bda", "0x0000000000709a7e", "0x0000000002a17218", "0x00000000005dd58e", "0x00000000010995dc", "0x0000000000f7d447", "0x00000000027a4ef3", "0x0000000002e62ffc" ],
+ "cmt" : {
+ "cmt_eq_new_json" : [ "0x00000000000c8bea", "0x000000000141570f", "0x0000000002faf70e", "0x0000000000638242", "0x0000000002ddef52", "0x0000000002e70f0b", "0x0000000000efd181", "0x000000000276d717", "0x0000000003f8041e", "0x00000000009c6067", "0x00000000004da33a", "0x00000000028b6251", "0x00000000004c0e10", "0x0000000001fa0421", "0x0000000001e58e1c", "0x00000000007526fd", "0x0000000000968d1c", "0x000000000035007a", "0x0000000001952acc", "0x000000000133bf87", "0x0000000002114337", "0x000000000156a5e5", "0x0000000001206fa7", "0x000000000363ea85", "0x0000000002f2b419", "0x0000000001689a67", "0x0000000002bcbe2d", "0x0000000000705bd0", "0x00000000000568fc", "0x000000000121ee7c", "0x0000000002663388", "0x0000000000a5399d", "0x0000000002d32c35", "0x000000000218ba0e", "0x0000000000f858fc", "0x00000000000f7e32", "0x0000000003d1b682", "0x0000000000046620", "0x0000000002718b87", "0x00000000029d1c50", "0x0000000001bcac91", "0x0000000000a04c1f", "0x0000000001e10deb", "0x0000000002cf860e", "0x00000000036befcd", "0x000000000352b03d", "0x0000000003696df6", "0x00000000028b27af", "0x0000000003557c12", "0x0000000002ff3191", "0x0000000001d9fdb4", "0x0000000001aca113", "0x00000000028cd2d2", "0x00000000009749a6", "0x00000000025e97e6", "0x0000000000ebc659", "0x0000000002bf7357", "0x00000000000cb1d5", "0x0000000002f15773", "0x0000000002f993fd", "0x000000000059133b", "0x00000000010b4c73", "0x00000000013ea2f0", "0x0000000000d8367f", "0x0000000002611be7", "0x000000000302d962", "0x000000000154b2a8", "0x0000000001b3398b", "0x0000000001ffe06f", "0x0000000000d9e28f", "0x00000000022d32d1", "0x0000000001199d60", "0x00000000014b9bdd", "0x0000000000fa065b", "0x0000000003452bfc", "0x0000000003bcec7a", "0x000000000114ab37", "0x0000000000a86f99", "0x00000000036de613", "0x00000000013ad5da", "0x00000000027d763b", "0x000000000341b50f", "0x00000000032525d1", "0x0000000001bd17e4", "0x0000000003df9108", "0x00000000037de190", "0x00000000024b37bc", "0x0000000003cb5752", "0x00000000008d9a25", "0x0000000003d68b6a", "0x0000000000bd8579", "0x0000000003104e76", "0x00000000020db1dc", "0x00000000014c8d8a", "0x0000000001278652", "0x0000000001194c7c", "0x00000000021a3915", "0x00000000037d6650", "0x00000000014cfdb4", "0x0000000003ad0423", "0x000000000380b322", "0x000000000394583f", "0x00000000031ed665", "0x000000000169feb3", "0x0000000002b3c884", "0x0000000001cf80c2", "0x000000000097927d", "0x00000000027fe551", "0x0000000003876456", "0x0000000000f65662", "0x000000000235d043", "0x00000000025fed9b", "0x000000000321ebbf", "0x0000000002c44336", "0x0000000000689473", "0x00000000026b86bd", "0x00000000017911af", "0x00000000030d71bc", "0x0000000001f7fdf4", "0x0000000003ba4164", "0x000000000393aa65", "0x0000000003770290", "0x0000000003cde5da", "0x0000000000940e70", "0x0000000002033034", "0x000000000389639e", "0x00000000008fa0f6", "0x0000000001449392" ],
+ "cmt_eq_old_json" : [ "0x0000000000c42308", "0x0000000002cbad06", "0x0000000003a28525", "0x00000000024112ba", "0x0000000000dbbed7", "0x0000000001196ac2", "0x0000000000c7d33b", "0x00000000017b8f27", "0x0000000001ee0422", "0x0000000000725037", "0x0000000000c0049b", "0x0000000003b9a47b", "0x00000000015874d9", "0x00000000027480bc", "0x000000000016a7a9", "0x00000000038fcff0", "0x00000000006be4c6", "0x0000000003ea72b0", "0x0000000001e81b39", "0x00000000003b6aba", "0x00000000002a215d", "0x0000000003abe939", "0x0000000002834db7", "0x00000000006ec2a1", "0x0000000003b4c8ea", "0x00000000016b7fe1", "0x0000000002de9ed0", "0x00000000017ac583", "0x0000000002d5bb9e", "0x00000000010abb84", "0x0000000000234e9a", "0x00000000023bf5e8", "0x0000000003c497ea", "0x0000000000db7fa1", "0x0000000002e2b507", "0x00000000006ae660", "0x000000000154b30b", "0x00000000009993e4", "0x0000000001dffcdd", "0x000000000041ba0d", "0x00000000000b28a8", "0x0000000000c391ed", "0x0000000000e4cd4b", "0x0000000000e96862", "0x0000000001be5801", "0x0000000000e267e5", "0x0000000003dd7f11", "0x0000000002deebd3", "0x00000000021ff23c", "0x0000000003b9c6fa", "0x00000000016b9a52", "0x000000000049af79", "0x00000000035e27f8", "0x0000000001e1ae59", "0x00000000005d874c", "0x00000000021c7f79", "0x0000000000074924", "0x00000000037f8cdb", "0x00000000032668ee", "0x00000000019727a2", "0x0000000001a18853", "0x0000000002419204", "0x0000000002c514a2", "0x0000000002c3676c", "0x00000000027a8c9b", "0x000000000261177c", "0x00000000034cd3f5", "0x000000000071d5d6", "0x0000000000658587", "0x0000000001fb7ffc", "0x00000000003d2531", "0x0000000000fd8715", "0x0000000001f1f366", "0x00000000002d3d8b", "0x00000000023545b8", "0x0000000001117c88", "0x0000000001ca6ada", "0x0000000003355973", "0x0000000002338d4a", "0x00000000017b9576", "0x00000000035648ed", "0x0000000003ec8481", "0x00000000028be71b", "0x0000000003affec6", "0x00000000001559da", "0x0000000003b06b07", "0x00000000029c1958", "0x0000000001a50a50", "0x00000000033ad622", "0x000000000293b674", "0x0000000001367c72", "0x00000000004188fa", "0x0000000002d187bb", "0x00000000023de62f", "0x00000000034a8869", "0x0000000003e6754c", "0x0000000001aaf634", "0x0000000000851787", "0x0000000002c29908", "0x00000000003ec8d3", "0x0000000001a05f7b", "0x0000000000807d72", "0x0000000002cf9f71", "0x0000000000cbf299", "0x00000000033eace7", "0x0000000000beac37", "0x0000000001dd2478", "0x0000000000b42ca8", "0x0000000001b1cd78", "0x0000000000626fae", "0x00000000033538a9", "0x00000000008aef64", "0x0000000003f15048", "0x000000000332e580", "0x0000000002f04f85", "0x000000000006962b", "0x00000000011c6150", "0x00000000005231ce", "0x0000000003959804", "0x00000000018f342f", "0x000000000234610d", "0x0000000003dcef10", "0x0000000002eef75a", "0x000000000099eb1e", "0x0000000003e04d1d", "0x000000000164376d", "0x0000000003b5b2e0", "0x0000000001d1ce19" ],
+ "cmt_mult_json" : [ "0x00000000009af483", "0x0000000002203423", "0x00000000007102f3", "0x000000000330dc35", "0x00000000014e4ef1", "0x0000000002dcc1bf", "0x00000000023c71cc", "0x00000000013ae7b1", "0x0000000002fab392", "0x00000000002c98e4", "0x0000000001648da4", "0x0000000000589b2a", "0x0000000001cce07c", "0x0000000000afdf6e", "0x0000000001b6b562", "0x0000000000761a66", "0x00000000014f9d06", "0x0000000003e88f8d", "0x0000000001e04bfa", "0x000000000044664e", "0x00000000012a4f9f", "0x0000000000839eee", "0x0000000000ad5b4f", "0x00000000015b54b0", "0x000000000195b523", "0x0000000000294d2b", "0x0000000002047559", "0x00000000032dfea4", "0x00000000037218bb", "0x0000000002d8e2e3", "0x0000000003c68ab9", "0x00000000029730d3", "0x0000000001da30a4", "0x00000000035a97d0", "0x0000000001ba24a9", "0x00000000031f2869", "0x00000000031ffe19", "0x00000000004692da", "0x0000000001d678ae", "0x0000000003f14f6a", "0x0000000002a8dd47", "0x0000000000289a6e", "0x00000000039327d6", "0x00000000022b5c9f", "0x0000000002c5bfa2", "0x00000000011b603a", "0x0000000002295a12", "0x000000000218c599", "0x0000000001aaf2c4", "0x0000000003f5318f", "0x000000000050d3e9", "0x00000000032b79ea", "0x00000000011c812f", "0x0000000003ec5b34", "0x00000000024236ec", "0x00000000026806ab", "0x00000000012296b6", "0x00000000030f0aa8", "0x00000000007d4ad1", "0x00000000000e00bb", "0x0000000003acc38b", "0x00000000012da3f5", "0x0000000002cf93b7", "0x0000000003c8a0f5", "0x000000000113adc0", "0x00000000028a082d", "0x000000000223dbcc", "0x000000000011b09d", "0x00000000008a1a9e", "0x00000000024cb9c0", "0x00000000006dd8dc", "0x00000000015ae006", "0x0000000002730288", "0x0000000002087674", "0x00000000038c2585", "0x00000000002fdf7a", "0x00000000012efd5f", "0x0000000003fc15f8", "0x0000000003718c02", "0x0000000001288042", "0x00000000027f7b96", "0x000000000089aa5c", "0x00000000002bf67b", "0x0000000000ac0b25", "0x00000000030b689a", "0x0000000003e3e780", "0x0000000000ea119a", "0x00000000035531eb", "0x00000000028c27fd", "0x00000000007444cd", "0x0000000002bfa817", "0x0000000000d70e0b", "0x0000000002ca7caf", "0x0000000002c312c3", "0x000000000162f762", "0x00000000022af827", "0x0000000000f691a4", "0x0000000003861540", "0x0000000001f281ad", "0x0000000003187c50", "0x0000000003d1005e", "0x00000000009a1f85", "0x00000000015a98ef", "0x0000000001488454", "0x0000000001d2da8e", "0x00000000015e8204", "0x0000000000a0f951", "0x0000000000635551", "0x00000000001aa526", "0x0000000003d2e2ed", "0x0000000002ac8c25", "0x000000000303ef40", "0x0000000003231552", "0x0000000003dd37e4", "0x00000000032a185a", "0x00000000001a099e", "0x00000000014c53c6", "0x0000000000593597", "0x00000000012b8a23", "0x0000000002dfe85e", "0x00000000021c9c21", "0x0000000000f42a19", "0x0000000003b628f3", "0x0000000003f7fc37", "0x00000000021409f6", "0x0000000000af7eea", "0x00000000024cf62c", "0x000000000226b34d" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedersenUpload.py b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedersenUpload.py
new file mode 100644
index 000000000..c99815b8b
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedersenUpload.py
@@ -0,0 +1,79 @@
+
+from web3 import Web3
+import time
+import csv
+
+#将proof.txt格式的文件保存在本地,这样就能直接调用该py
+filename = r'D:\java\check\pythonverify\pedsen'
+
+# 用于存储数据的列表
+data = []
+hex=[]
+# 打开文件并读取数据
+with open(filename, mode='r', encoding='utf-8') as file:
+ csv_reader = csv.reader(file, delimiter=',')
+ headers = next(csv_reader) # 读取标题行
+
+ # 打印标题行
+ print("Headers:", headers)
+
+ # 读取并打印每一行数据
+ for row in csv_reader:
+ data.append(row)
+ print(row)
+headers=headers[:143]
+for head in headers:
+ integer_value = int(head, 16)
+ hex.append(integer_value)
+tuple = []
+
+# 使用循环来添加元素到列表中
+for h in hex: # range的结束索引是不包含的,所以要写13而不是12的下一个数字
+ tuple.append(h)
+tuple=tuple[:129]
+# 连接到Infura节点(替换为你的Infura项目ID和节点URL)
+web3 = Web3(Web3.HTTPProvider('http://172.31.100.87:7545'))
+# # 设置账户和私钥
+# private_key = '0xca4d44e3fa4942e41555095e11d65585567b2af7c5ec32d6f29324d0f034a5e7' # 请确保私钥的安全
+# account=Account.from_key(private_key)
+contract_address = '0xE803b2180a4c0825F8C9500C7CE3a30d5b182377'
+contract_abi = [
+ {
+ "inputs": [],
+ "name": "retrieve",
+ "outputs": [
+ {
+ "internalType": "uint256[129]",
+ "name": "",
+ "type": "uint256[129]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256[129]",
+ "name": "num",
+ "type": "uint256[129]"
+ }
+ ],
+ "name": "store",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+ ]
+contract = web3.eth.contract(address=contract_address, abi=contract_abi)
+
+print("start")
+t=time.time()*1000
+try:
+ tx = contract.functions.store(tuple).call()
+ print("succeed")
+except:
+ print("false")
+end=time.time()*1000
+execution_time = end - t
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedsen b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedsen
new file mode 100644
index 000000000..c6191275a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/pedsen
@@ -0,0 +1 @@
+0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5,
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/proof.txt b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/proof.txt
new file mode 100644
index 000000000..f13b222f5
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/proof.txt
@@ -0,0 +1 @@
+0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,0x00000000000000000000000000000000000000000000000000000000035ecd34,0x000000000000000000000000000000000000000000000000000000000e2ac760,0x0000000000000000000000000000000000000000000000000000000000001f40,0x0000000000000000000000000000000000000000000000000000000003fffffb,0x0000000000000000000000000000000000000000000000000000000000d71bc5
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/verify.py b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/verify.py
new file mode 100644
index 000000000..12e49c8b8
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/verify.py
@@ -0,0 +1,181 @@
+import json
+import sys
+
+from web3 import Web3
+import time
+def hex_to_uint256(hex_str):
+ return int(hex_str, 16)
+def verify(data):
+ # 连接到Infura节点(替换为你的Infura项目ID和节点URL)
+ web3 = Web3(Web3.HTTPProvider('http://localhost:7545'))
+ # # 设置账户和私钥
+ # private_key = '0xca4d44e3fa4942e41555095e11d65585567b2af7c5ec32d6f29324d0f034a5e7' # 请确保私钥的安全
+ # account=Account.from_key(private_key)
+ contract_address = '0x2335Efa031Ffa51bd618E5097C8e11B1090f1Cb9'
+ contract_abi = [
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "a",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256[2]",
+ "name": "X",
+ "type": "uint256[2]"
+ },
+ {
+ "internalType": "uint256[2]",
+ "name": "Y",
+ "type": "uint256[2]"
+ }
+ ],
+ "internalType": "struct Pairing.G2Point",
+ "name": "b",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "c",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct Verifier.Proof",
+ "name": "proof",
+ "type": "tuple"
+ },
+ {
+ "internalType": "uint256[5]",
+ "name": "input",
+ "type": "uint256[5]"
+ }
+ ],
+ "name": "verifyTx",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "r",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ]
+ contract = web3.eth.contract(address=contract_address, abi=contract_abi)
+ print("start")
+ t = time.time() * 1000
+
+ if data:
+ # 访问字典中的值
+ scheme = data.get("scheme", "")
+ curve = data.get("curve", "")
+ proof = data.get("proof", {})
+ cmt_zk = data.get("cmt_zk", "")
+ inputs = data.get("inputs", [])
+
+ # 打印访问到的值
+ print(f"Scheme: {scheme}")
+ print(f"Curve: {curve}")
+ print(f"Proof: {proof}")
+ print(f"Cmt_zk: {cmt_zk}")
+ print(f"Inputs: {inputs}")
+
+ # 访问嵌套字典中的值
+ if proof:
+ a= proof.get("a", [])
+ b = proof.get("b", [])
+ c = proof.get("c", [])
+
+ try:
+ # 将十六进制字符串转换为整数
+ a = (int(a[0], 16), int(a[1], 16))
+ b = ((int(b[0][0], 16), int(b[0][1], 16)), (int(b[1][0], 16), int(b[1][1], 16)))
+ c = (int(c[0], 16), int(c[1], 16))
+ inputs = [int(i, 16) for i in inputs]
+ except (ValueError, IndexError) as e:
+ print(f"Error during conversion: {e}")
+ # 处理错误,例如返回错误信息或默认值
+ a = (0, 0)
+ b = ((0, 0), (0, 0))
+ c = (0, 0)
+ inputs = [0, 0, 0, 0, 0]
+
+ print(f"Proof A (after conversion): {a}")
+ print(f"Proof B (after conversion): {b}")
+ print(f"Proof C (after conversion): {c}")
+ print(f"Inputs (after conversion): {inputs}")
+
+ try:
+ # tx = contract.functions.verifyTx([[0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,
+ # 0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5], [
+ # [0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,
+ # 0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2],
+ # [0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,
+ # 0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50]],
+ # [0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf2039532e1b344c3ad75d3,
+ # 0x2303807a23a73d6ed97b93acda1473d131c02c6454d4a803117d8a302565dec8]],
+ # [0x00000000000000000000000000000000000000000000000000000000035ecd34,
+ # 0x000000000000000000000000000000000000000000000000000000000e2ac760,
+ # 0x0000000000000000000000000000000000000000000000000000000000001f40,
+ # 0x0000000000000000000000000000000000000000000000000000000003fffffb,
+ # 0x0000000000000000000000000000000000000000000000000000000000d71bc5]).call()
+ # 调用 verifyTx 函数
+ tx = contract.functions.verifyTx((a, b, c), inputs).call()
+ print("true")
+ # 处理交易结果...
+ except Exception as e:
+ print(f"调用合约函数时发生错误: {e}")
+ print("false")
+
+ end = time.time() * 1000
+ execution_time = end - t
+ print(f"执行时间: {execution_time} 毫秒")
+
+
+if __name__ == '__main__':
+ filepath = "C:\check\zkproof.json"
+ try:
+ # 打开并读取 JSON 文件
+ with open(filepath, 'r', encoding='utf-8') as file:
+ data = json.load(file)
+ verify(data)
+ print(data)
+
+ # 返回解析后的字典
+
+ except FileNotFoundError:
+ print(f"File not found: {filepath}")
+ except json.JSONDecodeError as e:
+ print(f"Error decoding JSON from file: {filepath} - {e}")
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkproof.txt b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkproof.txt
new file mode 100644
index 000000000..13065ad1a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkproof.txt
@@ -0,0 +1,13 @@
+0x1428d5fdc489be4b8692cd407a867100278f3d5c1579f458c3d03f89dd640512,
+0x1e368f825fb1d61ac66aaf025326cb2cdfcada82bd00f11a2ec631ba12be25b5,
+0x0d9be9a5b6e2b946bd18c81024f516c86c71c55021f801ca3770832a13483b4f,
+0x155bc3458a57232501798ad6b61b10fc9ac0e4d5dc3d626c5563580262c3e8d2,
+0x144486387954a932966fc0719e845dce8a58ed426d7434fa4faa816bded27fc6,
+0x136e84b9edc202108695522de08ec7daa9038bc76c05a86c3e72b18a1eae1d50,
+0x0ebf676e85b86bab3a9978a35b6e224638fb0134fdf203c532e1b344c3ad75d3,
+0x2303807a23a73d6ed97b93acda1473d131c62c6454d4a803117d8a302565dec8,
+0x00000000000000000000000000000000000000000000000000000000035ecd34,
+0x000000000000000000000000000000000000000000000000000000000e2ac760,
+0x0000000000000000000000000000000000000000000000000000000000001f40,
+0x0000000000000000000000000000000000000000000000000000000003fffffb,
+0x0000000000000000000000000000000000000000000000000000000000d71bc5
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkvierfier.py b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkvierfier.py
new file mode 100644
index 000000000..5c5e8fec6
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/pythonverify/zkvierfier.py
@@ -0,0 +1,128 @@
+
+from web3 import Web3
+import time
+import csv
+
+#将proof.txt格式的文件保存在本地,这样就能直接调用该py
+filename = r'D:\java\check\pythonverify\proof.txt'
+
+# 用于存储数据的列表
+data = []
+hex=[]
+# 打开文件并读取数据
+with open(filename, mode='r', encoding='utf-8') as file:
+ csv_reader = csv.reader(file, delimiter=',')
+ headers = next(csv_reader) # 读取标题行
+
+ # 打印标题行
+ print("Headers:", headers)
+
+ # 读取并打印每一行数据
+ for row in csv_reader:
+ data.append(row[0])
+ print(row)
+for head in headers:
+ integer_value = int(head, 16)
+ hex.append(integer_value)
+# 打印整个数据列表
+for h in hex:
+ print(h)
+param1=((hex[0],hex[1]),((hex[2],hex[3]),(hex[4],hex[5])),(hex[6],hex[7]))
+param2=(hex[8],hex[9],hex[10],hex[11],hex[12])
+# 连接到Infura节点(替换为你的Infura项目ID和节点URL)
+web3 = Web3(Web3.HTTPProvider('172.31.100.87:7545'))
+# # 设置账户和私钥
+# private_key = '0xca4d44e3fa4942e41555095e11d65585567b2af7c5ec32d6f29324d0f034a5e7' # 请确保私钥的安全
+# account=Account.from_key(private_key)
+contract_address = '0x5fbBa33568AACe8e59bD9940316bccF8EC01820c'
+contract_abi = [
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "a",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256[2]",
+ "name": "X",
+ "type": "uint256[2]"
+ },
+ {
+ "internalType": "uint256[2]",
+ "name": "Y",
+ "type": "uint256[2]"
+ }
+ ],
+ "internalType": "struct Pairing.G2Point",
+ "name": "b",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "c",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct Verifier.Proof",
+ "name": "proof",
+ "type": "tuple"
+ },
+ {
+ "internalType": "uint256[5]",
+ "name": "input",
+ "type": "uint256[5]"
+ }
+ ],
+ "name": "verifyTx",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "r",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+ ]
+contract = web3.eth.contract(address=contract_address, abi=contract_abi)
+
+print("start")
+t=time.time()*1000
+try:
+ tx = contract.functions.verifyTx(param1,param2).call()
+ print("true")
+except:
+ print("false")
+end=time.time()*1000
+execution_time = end - t
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/qodana.yaml b/2024-shenzhen-FinTechathon/SpotOn/backend/check/qodana.yaml
new file mode 100644
index 000000000..ebc500e01
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/qodana.yaml
@@ -0,0 +1,31 @@
+#-------------------------------------------------------------------------------#
+# Qodana analysis is configured by qodana.yaml file #
+# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
+#-------------------------------------------------------------------------------#
+version: "1.0"
+
+#Specify inspection profile for code analysis
+profile:
+ name: qodana.starter
+
+#Enable inspections
+#include:
+# - name:
+
+#Disable inspections
+#exclude:
+# - name:
+# paths:
+# -
+
+projectJDK: 21 #(Applied in CI/CD pipeline)
+
+#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
+#bootstrap: sh ./prepare-qodana.sh
+
+#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
+#plugins:
+# - id: #(plugin id can be found at https://plugins.jetbrains.com)
+
+#Specify Qodana linter for analysis (Applied in CI/CD pipeline)
+linter: jetbrains/qodana-jvm:latest
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/META-INF/MANIFEST.MF b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..37740b3a3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: szu.blockchain.check.CheckApplication
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/META-INF/MANIFEST.MF b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..37740b3a3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: szu.blockchain.check.CheckApplication
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/CheckApplication.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/CheckApplication.java
new file mode 100644
index 000000000..40b5ab320
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/CheckApplication.java
@@ -0,0 +1,18 @@
+package szu.blockchain.check;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class
+
+
+CheckApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(CheckApplication.class, args);
+ System.out.println("Hello, World!");
+
+ }
+
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/Config/EthConfig.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/Config/EthConfig.java
new file mode 100644
index 000000000..d2c8aa9d8
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/Config/EthConfig.java
@@ -0,0 +1,65 @@
+//package szu.blockchain.check.Config;
+//
+//
+//import lombok.Value;
+//import okhttp3.OkHttpClient;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.web3j.protocol.Web3j;
+//import org.web3j.protocol.admin.Admin;
+//import org.web3j.protocol.geth.Geth;
+//import org.web3j.protocol.http.HttpService;
+//
+//import java.util.concurrent.TimeUnit;
+//
+///**
+// * @author deray.wang
+// * @date 2024/04/20 17:18
+// */
+//@Configuration
+//public class EthConfig {
+// @Value("${web3j.client-address}")
+// private String rpc;
+//
+// @Bean
+// public Web3j web3j() {
+// OkHttpClient.Builder builder = new OkHttpClient.Builder();
+// builder.connectTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.writeTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.readTimeout(30*1000, TimeUnit.MILLISECONDS);
+// OkHttpClient httpClient = builder.build();
+// Web3j web3j = Web3j.build(new HttpService(rpc,httpClient,false));
+// return web3j;
+// }
+//
+// /**
+// * 初始化admin级别操作的对象
+// * @return Admin
+// */
+// @Bean
+// public Admin admin() {
+// OkHttpClient.Builder builder = new OkHttpClient.Builder();
+// builder.connectTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.writeTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.readTimeout(30*1000, TimeUnit.MILLISECONDS);
+// OkHttpClient httpClient = builder.build();
+// Admin admin = Admin.build(new HttpService(rpc,httpClient,false));
+// return admin;
+// }
+//
+// /**
+// * 初始化personal级别操作的对象
+// * @return Geth
+// */
+// @Bean
+// public Geth geth() {
+// OkHttpClient.Builder builder = new OkHttpClient.Builder();
+// builder.connectTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.writeTimeout(30*1000, TimeUnit.MILLISECONDS);
+// builder.readTimeout(30*1000, TimeUnit.MILLISECONDS);
+// OkHttpClient httpClient = builder.build();
+// Geth geth = Geth.build(new HttpService(rpc,httpClient,false));
+// return geth;
+// }
+//
+//}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/controller/UserController.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/controller/UserController.java
new file mode 100644
index 000000000..9c6838b3c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/controller/UserController.java
@@ -0,0 +1,44 @@
+package szu.blockchain.check.controller;
+
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import szu.blockchain.check.entity.ProofData;
+import szu.blockchain.check.entity.ZkProofData;
+import szu.blockchain.check.service.CheckService;
+
+
+
+@RestController
+public class UserController {
+
+ @Autowired
+ private CheckService checkService;
+
+ @PostMapping("/check")
+ public boolean Check(@RequestBody ProofData proofData) {
+ boolean result1 = new CheckService().check(proofData);
+ return result1;
+
+
+ }
+
+ @PostMapping("/zkcheck")
+ public boolean ZkCheck(@RequestBody ZkProofData zkproofData) {
+ System.out.println("zkproofData");
+ boolean result2 = new CheckService().zkcheck(zkproofData);
+ System.out.println(result2);
+ return result2;
+
+
+ }
+ @GetMapping("/test")
+ public String test(){
+ return "hello";
+ }
+
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/Pedersen.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/Pedersen.java
new file mode 100644
index 000000000..fba730e7b
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/Pedersen.java
@@ -0,0 +1,46 @@
+package szu.blockchain.check.entity; // 定义包名
+
+import java.math.BigInteger; // 导入BigInteger类,用于大整数运算
+import java.util.ArrayList; // 导入ArrayList类,用于动态数组
+import java.util.List; // 导入List接口
+
+public class Pedersen { // 定义Pedersen类
+ private BigInteger g; // 定义私有成员变量g,表示生成元g
+ private BigInteger h; // 定义私有成员变量h,表示生成元h
+ private final BigInteger p = new BigInteger("67108859"); // 定义常量p,表示大素数
+ private List gTable = new ArrayList<>(); // 定义gTable列表,用于存储g的幂次
+ private List hTable = new ArrayList<>(); // 定义hTable列表,用于存储h的幂次
+
+ public Pedersen(BigInteger g, BigInteger h) { // 构造函数,初始化g和h
+ this.g = g.mod(p); // 将g取模p,确保g在有限域内
+ this.h = h.mod(p); // 将h取模p,确保h在有限域内
+ gTable.add(this.g); // 将g添加到gTable中
+ hTable.add(this.h); // 将h添加到hTable中
+ for (int i = 1; i < 64; i++) { // 循环计算g和h的幂次
+ gTable.add(gTable.get(i - 1).multiply(gTable.get(i - 1)).mod(p)); // 计算g的平方并取模p,添加到gTable
+ hTable.add(hTable.get(i - 1).multiply(hTable.get(i - 1)).mod(p)); // 计算h的平方并取模p,添加到hTable
+ }
+ }
+
+ public BigInteger commitment(BigInteger v, BigInteger r) { // 定义commitment方法,计算承诺值
+ BigInteger vQuot = v; // 初始化vQuot为v,用于计算v的二进制位
+ BigInteger rQuot = r; // 初始化rQuot为r,用于计算r的二进制位
+ BigInteger vRem; // 定义vRem,用于存储v的当前二进制位
+ BigInteger rRem; // 定义rRem,用于存储r的当前二进制位
+ BigInteger G = BigInteger.ONE; // 初始化G为1,用于存储g的幂次乘积
+ BigInteger H = BigInteger.ONE; // 初始化H为1,用于存储h的幂次乘积
+ for (int i = 0; i < 64; i++) { // 循环64次,处理v和r的每一位
+ vRem = vQuot.mod(BigInteger.TWO); // 计算v的当前位(0或1)
+ vQuot = vQuot.divide(BigInteger.TWO); // 将v右移一位
+ rRem = rQuot.mod(BigInteger.TWO); // 计算r的当前位(0或1)
+ rQuot = rQuot.divide(BigInteger.TWO); // 将r右移一位
+ if (vRem.equals(BigInteger.ONE)) { // 如果v的当前位为1
+ G = G.multiply(gTable.get(i)).mod(p); // 将当前g的幂次乘到G上并取模p
+ }
+ if (rRem.equals(BigInteger.ONE)) { // 如果r的当前位为1
+ H = H.multiply(hTable.get(i)).mod(p); // 将当前h的幂次乘到H上并取模p
+ }
+ }
+ return G.multiply(H).mod(p); // 返回G和H的乘积并取模p,作为承诺值
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ProofData.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ProofData.java
new file mode 100644
index 000000000..7345f42fc
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ProofData.java
@@ -0,0 +1,36 @@
+package szu.blockchain.check.entity;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import java.util.List;
+
+@Data
+public class ProofData {
+
+ private String id;
+ private String time;
+ private List oldcmt; // 如果需要映射 oldcmt 字段
+ private ProofDetails proof;
+ private String cmt_dist ;
+
+ @Data
+ public static class ProofDetails {
+ private List emb;
+ private Cmt cmt; // 嵌套的 Cmt 类
+ private List a;
+ private List z;
+ private List p;
+ }
+
+ @Data
+ public static class Cmt {
+ @JsonProperty("cmt_eq_old_json")
+ private List cmtEqOldJson; // 对应 cmt_eq_old_json
+
+ @JsonProperty("cmt_eq_new_json")
+ private List cmtEqNewJson; // 对应 cmt_eq_new_json
+
+ @JsonProperty("cmt_mult_json")
+ private List cmtMultJson;
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkProofData.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkProofData.java
new file mode 100644
index 000000000..e0fb7ce6e
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkProofData.java
@@ -0,0 +1,22 @@
+package szu.blockchain.check.entity;
+
+import lombok.Data;
+import java.math.BigInteger;
+import java.util.List;
+
+@Data
+public class ZkProofData {
+
+ private String scheme;
+ private String curve;
+ private Proof proof;
+ private List inputs;
+ private String cmt_zk;
+
+ @Data
+ public static class Proof {
+ private List a;
+ private List> b;
+ private List c;
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkSolidityData.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkSolidityData.java
new file mode 100644
index 000000000..9bf018d7a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/entity/ZkSolidityData.java
@@ -0,0 +1,31 @@
+package szu.blockchain.check.entity;
+
+import lombok.Data;
+import java.math.BigInteger;
+import java.util.List;
+
+@Data
+public class ZkSolidityData {
+
+ private Proof proof;
+ private List input;
+
+ @Data
+ public static class Proof {
+ private G1Point a;
+ private G2Point b;
+ private G1Point c;
+ }
+
+ @Data
+ public static class G1Point {
+ private BigInteger X;
+ private BigInteger Y;
+ }
+
+ @Data
+ public static class G2Point {
+ private List X;
+ private List Y;
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/service/CheckService.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/service/CheckService.java
new file mode 100644
index 000000000..7d4ecbd85
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/service/CheckService.java
@@ -0,0 +1,96 @@
+package szu.blockchain.check.service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import szu.blockchain.check.entity.ProofData;
+import szu.blockchain.check.entity.ZkProofData;
+import szu.blockchain.check.utils.ReadFile;
+import szu.blockchain.check.utils.ToHex;
+import szu.blockchain.check.utils.Verify;
+import szu.blockchain.check.utils.ZKVerify;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.Objects;
+
+@Service
+@Component
+public class CheckService {
+ public boolean check(ProofData proofData) {
+
+
+ String jsonFilePath = "C:/check/proof.json";
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ try {
+ // 将实体类转换为JSON文件
+ objectMapper.writeValue(new File(jsonFilePath), proofData);
+ System.out.println("JSON文件已创建");
+ }catch (IOException e){
+ e.printStackTrace();
+ }
+ Verify verify = new Verify();
+ boolean result = verify.verify(proofData);
+ if (result) {
+ return true;
+ //并且上链吗
+ } else {
+ return false;
+ }
+ }
+
+ public boolean zkcheck(ZkProofData zkProofData) {
+ boolean result = false;
+
+ String jsonFilePath = "C:/check/zkproof.json";
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ try {
+ // 将实体类转换为JSON文件
+ objectMapper.writeValue(new File(jsonFilePath), zkProofData);
+ System.out.println("JSON文件已创建");
+ ZKVerify zkVerify = new ZKVerify();
+ result = zkVerify.verify();
+ //读取cmt
+ ReadFile readFile = new ReadFile();
+ HashMap map = readFile.readJsonFileToMap("C:/check/proof.json");
+
+ // 将十进制字符串转换为 BigInteger
+ BigInteger cmtDistBigInt = new BigInteger(String.valueOf(map.get("cmt_dist")));
+
+ // 将 BigInteger 转换为十六进制字符串,并确保长度为 16 位
+ ToHex toHex = new ToHex();
+ String cmtdist = toHex.intToHex(cmtDistBigInt,16);
+ System.out.println(cmtdist);
+ System.out.println("CMT对比"+zkProofData.getCmt_zk());
+ System.out.println("zk验证结果"+result);
+
+ String stringWithQuotes = zkProofData.getCmt_zk();
+ String stringWithoutQuotes = stringWithQuotes.replace("\"", "");
+ if(result&& Objects.equals(cmtdist, stringWithoutQuotes)){
+ System.out.println("zk验证通过");
+ return result;
+
+ }
+ else {
+ return false;
+ }
+
+
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+
+
+ }
+
+ }
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/BlogException.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/BlogException.java
new file mode 100644
index 000000000..7c146089b
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/BlogException.java
@@ -0,0 +1,31 @@
+package szu.blockchain.check.utils;
+
+
+
+
+
+
+// 自定义异常类 BlogException
+public class BlogException extends Exception {
+ private final int errorCode; // 错误代码
+
+ // 构造函数,接受错误代码和错误消息
+ public BlogException(int errorCode, String message) {
+ super(message);
+ this.errorCode = errorCode;
+ }
+
+ // 获取错误代码的方法
+ public int getErrorCode() {
+ return errorCode;
+ }
+
+ // 重写 toString 方法,提供更详细的异常信息
+ @Override
+ public String toString() {
+ return "BlogException{" +
+ "errorCode=" + errorCode +
+ ", message=" + getMessage() +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Homomorphic.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Homomorphic.java
new file mode 100644
index 000000000..f5c8ed78c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Homomorphic.java
@@ -0,0 +1,84 @@
+package szu.blockchain.check.utils;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+
+/**
+ * 同态加密运算类
+ * 实现了基于模运算的加法同态、幂运算和验证功能
+ */
+public class Homomorphic {
+ // 模数 p,用于所有模运算
+ private final BigInteger p = new BigInteger("67108859"); // 定义常量p,表示大素数
+
+ /**
+ * 同态加法运算
+ * 通过将两个承诺值相乘后取模实现加法同态
+ *
+ * @param ComA 第一个承诺值
+ * @param ComB 第二个承诺值
+ * @return 两个承诺的同态加法结果 (ComA * ComB) mod p
+ */
+ public BigInteger Add(BigInteger ComA, BigInteger ComB) {
+ return ComA.multiply(ComB).mod(p);
+ }
+
+ /**
+ * 同态幂运算
+ * 使用查找表优化的快速幂算法,计算承诺值的n次幂
+ *
+ * @param Com 基础承诺值
+ * @param n 指数
+ * @return Com^n mod p
+ */
+ public BigInteger Pow(BigInteger Com, BigInteger n) {
+ // 初始化结果为1
+ BigInteger res = BigInteger.ONE;
+ // 用于存储商的临时变量
+ BigInteger quot = n;
+ // 用于存储余数的临时变量
+ BigInteger rem;
+
+ // 创建幂次方查找表,用于优化计算
+ ArrayList table = new ArrayList<>();
+ // 将基础值添加到表中
+ table.add(Com);
+
+ // 预计算并填充查找表
+ // table[i] 存储 Com^(2^i) mod p
+ for (int i = 1; i < 64; i++) {
+ // 计算下一个幂次方:将前一个值平方并取模
+ table.add(table.get(i - 1).multiply(table.get(i - 1)).mod(p));
+ }
+
+ // 使用二进制分解进行幂运算
+ for (int j = 0; j < 64; j++) {
+ // 获取当前位的值(0或1)
+ rem = quot.mod(BigInteger.TWO);
+ // 商除以2,准备处理下一位
+ quot = quot.divide(BigInteger.TWO);
+
+ // 如果当前位为1,则将对应的幂次方乘入结果
+ if (rem.equals(BigInteger.ONE)) {
+ res = res.multiply(table.get(j)).mod(p);
+ }
+ }
+
+ return res;
+ }
+
+ /**
+ * 同态验证运算
+ * 验证三个承诺值是否满足特定的关系:ComA = ComB * ComC mod p
+ *
+ * @param ComA 待验证的承诺值
+ * @param ComB 第一个验证因子
+ * @param ComC 第二个验证因子
+ * @return 如果验证通过返回1,否则返回0
+ */
+ public int Sub(BigInteger ComA, BigInteger ComB, BigInteger ComC) {
+ // 计算 ComB * ComC mod p 并与 ComA 比较
+ BigInteger result = ComB.multiply(ComC).mod(p);
+ return result.equals(ComA) ? 1 : 0;
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ReadFile.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ReadFile.java
new file mode 100644
index 000000000..c21cfd7d1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ReadFile.java
@@ -0,0 +1,65 @@
+package szu.blockchain.check.utils; // 定义包名,表示该类属于 szu.zhl.test1.utils 包
+
+import com.fasterxml.jackson.core.type.TypeReference; // 导入 TypeReference 类,用于泛型类型引用
+import com.fasterxml.jackson.databind.ObjectMapper; // 导入 ObjectMapper 类,用于 JSON 解析
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Value; // 导入 Value 注解,用于从配置文件中注入属性值
+import org.springframework.stereotype.Component;
+
+import java.io.File; // 导入 File 类,用于文件操作
+import java.io.FileNotFoundException;
+import java.io.IOException; // 导入 IOException 类,用于处理 IO 异常
+import java.math.BigInteger; // 导入 BigInteger 类,用于大整数运算
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap; // 导入 HashMap 类,用于存储键值对
+import java.util.List; // 导入 List 接口,用于列表操作
+import java.util.Map;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+@Component
+public class ReadFile { // 定义 ReadFile 类
+
+
+
+
+
+ // 定义一个方法,用于读取 JSON 文件并将其内容转换为 HashMap
+
+ public HashMap readJsonFileToMap(String filePath) {
+ ObjectMapper objectMapper = new ObjectMapper();
+ try {
+ // 确保 filePath 不为 null
+ if (filePath == null) {
+ throw new IllegalArgumentException("File path cannot be null");
+ }
+
+ // 使用 ObjectMapper 读取 JSON 文件并转换为 HashMap
+ File file = new File(filePath);
+ if (!file.exists()) {
+ throw new FileNotFoundException("File not found: " + filePath);
+ }
+
+ HashMap map = objectMapper.readValue(file, new TypeReference>() {});
+
+
+
+
+
+ return map;
+ } catch (IOException e) {
+ System.err.println("An error occurred while reading the JSON File.");
+ e.printStackTrace();
+ } catch (Exception e) {
+ System.err.println("An error occurred while parsing the JSON data.");
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ToHex.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ToHex.java
new file mode 100644
index 000000000..ba9865460
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ToHex.java
@@ -0,0 +1,16 @@
+package szu.blockchain.check.utils;
+
+import java.math.BigInteger;
+
+public class ToHex {
+ public String intToHex(BigInteger value, int length) {
+ String hex = value.toString(16); // 将大整数转换为十六进制字符串
+ int padding = length - hex.length(); // 计算需要填充的零的数量
+ if (padding > 0) {
+ hex = "0x" + "0".repeat(padding) + hex; // 如果需要,填充零
+ } else {
+ hex = "0x" + hex; // 否则直接加上前缀
+ }
+ return hex; // 返回十六进制字符串
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Verify.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Verify.java
new file mode 100644
index 000000000..ce34c2f75
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/Verify.java
@@ -0,0 +1,264 @@
+package szu.blockchain.check.utils;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import szu.blockchain.check.entity.ProofData;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.commons.codec.digest.DigestUtils;
+import szu.blockchain.check.entity.ProofData;
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import szu.blockchain.check.entity.Pedersen;
+
+public class Verify {
+ // 生物特征编码的维度
+ private static final int DIM = 128;
+ // 承诺的生成元
+ private static final BigInteger g = new BigInteger("56544564");
+
+ private static final BigInteger h = new BigInteger("237684576");
+ public boolean verify(ProofData proofData) {
+ int pass = 1;
+ System.out.println("G:" + g);
+ System.out.println("h:" + h);
+
+
+
+ // 获取用户身份信息
+ String id = proofData.getId();
+ String time = proofData.getTime();
+ List cmtOldJson = proofData.getOldcmt(); // 有点问题
+
+ List cmtNewJson = proofData.getProof().getEmb();
+ List cmtEqOldJson = proofData.getProof().getCmt().getCmtEqOldJson();
+ List cmtEqNewJson = proofData.getProof().getCmt().getCmtEqNewJson();
+ List cmtMultJson = proofData.getProof().getCmt().getCmtMultJson();
+ List aJson = proofData.getProof().getA();
+
+ List zJson = proofData.getProof().getZ();
+ List pJson = proofData.getProof().getP();
+
+ // 打印数据
+ System.out.println("ID: " + id);
+ System.out.println("Time: " + time);
+ System.out.println("cmtOldJson: " + cmtOldJson);
+ System.out.println("cmtNewJson: " + cmtNewJson);
+ System.out.println("cmtEqOldJson: " + cmtEqOldJson);
+ System.out.println("cmtEqNewJson: " + cmtEqNewJson);
+ System.out.println("cmtMultJson: " + cmtMultJson);
+ System.out.println("aJson: " + aJson);
+ System.out.println("zJson: " + zJson);
+ System.out.println("pJson: " + pJson);
+
+
+ // 将字符串时间转换为Date对象
+ Date tStart = new Date(time);
+ Date tEnd = new Date();
+ System.out.println("Start Time: " + tStart);
+ System.out.println("End Time: " + tEnd);
+ System.out.println("Time Difference (ms): " + (tEnd.getTime() - tStart.getTime()));
+
+ // 计算时间差
+ long timeDifference = tEnd.getTime() - tStart.getTime();
+
+ // 时间有效性判断
+
+ if (timeDifference <= 3600000000L) {
+ pass = pass;
+ } else {
+ pass = 0;
+ }
+
+
+ // 自行生成挑战e
+ Map challenge = new LinkedHashMap<>();
+ challenge.put("cmt_old_json", cmtOldJson);
+ challenge.put("cmt_new_json", cmtNewJson);
+ challenge.put("cmt_eq_old_json", cmtEqOldJson);
+ challenge.put("cmt_eq_new_json", cmtEqNewJson);
+ challenge.put("cmt_mult_json", cmtMultJson);
+ challenge.put("id", id);
+ challenge.put("t", time);
+ System.out.println("Challenge: " + challenge);
+ BigInteger e;
+ try {
+ ObjectMapper objectMapper = new ObjectMapper();
+ String test = objectMapper.writeValueAsString(challenge);
+ String hash = DigestUtils.sha256Hex(test.getBytes("UTF-8"));
+ System.out.println("Hash: " + hash);
+ e = new BigInteger(hash, 16).mod(BigInteger.valueOf(5000));
+ System.out.println("e: " + e);
+ // 这里可以继续使用e进行后续的验证逻辑
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return false;
+ }
+
+ // 数据整理
+ BigInteger[] cmtOld = new BigInteger[DIM];
+ BigInteger[] cmtNew = new BigInteger[DIM];
+ BigInteger[] cmtEqOld = new BigInteger[DIM];
+ BigInteger[] cmtEqNew = new BigInteger[DIM];
+ BigInteger[] cmtMult = new BigInteger[DIM];
+ BigInteger[] z1 = new BigInteger[DIM];
+ BigInteger[] z2 = new BigInteger[DIM];
+ BigInteger[] z3 = new BigInteger[DIM];
+ BigInteger[] z4 = new BigInteger[DIM];
+ BigInteger[] z5 = new BigInteger[DIM];
+ BigInteger[] z6 = new BigInteger[DIM];
+ BigInteger[] z7 = new BigInteger[DIM];
+ BigInteger[] p1 = new BigInteger[DIM];
+ BigInteger[] p2 = new BigInteger[DIM];
+ BigInteger[] p3 = new BigInteger[DIM];
+//你尝试将一个以"0x"开头的十六进制字符串直接转换为BigInteger,而没有指定基数为16。为了正确解析这些十六进制字符串,你需要去掉"0x"前缀并指定基数为16。
+ BigInteger a1 = new BigInteger(aJson.get(0).substring(2), 16);
+ BigInteger a2 = new BigInteger(aJson.get(1).substring(2), 16);
+
+ // 打印BigInteger值
+ System.out.println("a1: " + a1);
+ System.out.println("a2: " + a2);
+
+ for (int i = 0; i < DIM; i++) {
+ cmtOld[i] = new BigInteger(cmtOldJson.get(i).substring(2), 16);
+ cmtNew[i] = new BigInteger(cmtNewJson.get(i).substring(2), 16);
+ cmtEqOld[i] = new BigInteger(cmtEqOldJson.get(i).substring(2), 16);
+ cmtEqNew[i] = new BigInteger(cmtEqNewJson.get(i).substring(2), 16);
+ cmtMult[i] = new BigInteger(cmtMultJson.get(i).substring(2), 16);
+ z1[i] = new BigInteger(zJson.get(i).substring(2), 16);
+ z2[i] = new BigInteger(zJson.get(DIM + i).substring(2), 16);
+ z3[i] = new BigInteger(zJson.get(2 * DIM + i).substring(2), 16);
+ z4[i] = new BigInteger(zJson.get(3 * DIM + i).substring(2), 16);
+ z5[i] = new BigInteger(zJson.get(4 * DIM + i).substring(2), 16);
+ z6[i] = new BigInteger(zJson.get(5 * DIM + i).substring(2), 16);
+ z7[i] = new BigInteger(zJson.get(6 * DIM + i).substring(2), 16);
+ p1[i] = new BigInteger(pJson.get(i).substring(2), 16);
+ p2[i] = new BigInteger(pJson.get(DIM + i).substring(2), 16);
+ p3[i] = new BigInteger(pJson.get(2 * DIM + i).substring(2), 16);
+ }
+
+ // 打印整个BigInteger数组
+ System.out.println("cmtOld: " + Arrays.toString(cmtOld));
+ System.out.println("cmtNew: " + Arrays.toString(cmtNew));
+ System.out.println("cmtEqOld: " + Arrays.toString(cmtEqOld));
+ System.out.println("cmtEqNew: " + Arrays.toString(cmtEqNew));
+ System.out.println("cmtMult: " + Arrays.toString(cmtMult));
+ System.out.println("z1: " + Arrays.toString(z1));
+ System.out.println("z2: " + Arrays.toString(z2));
+ System.out.println("z3: " + Arrays.toString(z3));
+ System.out.println("z4: " + Arrays.toString(z4));
+ System.out.println("z5: " + Arrays.toString(z5));
+ System.out.println("z6: " + Arrays.toString(z6));
+ System.out.println("z7: " + Arrays.toString(z7));
+ System.out.println("p1: " + Arrays.toString(p1));
+ System.out.println("p2: " + Arrays.toString(p2));
+ System.out.println("p3: " + Arrays.toString(p3));
+
+
+
+ // 验证乘法同态的准确性
+ Pedersen code = new Pedersen(g, h);
+ BigInteger[] d1 = new BigInteger[DIM];
+ BigInteger[] d2 = new BigInteger[DIM];
+ BigInteger[] d3 = new BigInteger[DIM];
+ BigInteger[] d4 = new BigInteger[DIM];
+ BigInteger[] d5 = new BigInteger[DIM];
+
+ for (int i = 0; i < DIM; i++) {
+ d1[i] = code.commitment(z1[i], z2[i]);
+ Pedersen f = new Pedersen(cmtOld[i], h);
+ d2[i] = f.commitment(z1[i], z5[i]);
+ d3[i] = code.commitment(z3[i], z4[i]);
+ Pedersen ff = new Pedersen(cmtNew[i], h);
+ d4[i] = ff.commitment(z3[i], z6[i]);
+ d5[i] = f.commitment(z3[i], z7[i]);
+ }
+
+ // 打印整个BigInteger数组
+ System.out.println("d1: " + Arrays.toString(d1));
+ System.out.println("d2: " + Arrays.toString(d2));
+ System.out.println("d3: " + Arrays.toString(d3));
+ System.out.println("d4: " + Arrays.toString(d4));
+ System.out.println("d5: " + Arrays.toString(d5));
+
+
+
+
+ // 注册用生物特征编码的平方项的准确性验证
+ Homomorphic hp = new Homomorphic();
+ for (int i = 0; i < DIM; i++) {
+ if (d1[i].equals(hp.Add(a1, hp.Pow(cmtOld[i], e))) && d2[i].equals(hp.Add(p1[i], hp.Pow(cmtEqOld[i], e)))) {
+ pass = pass;
+ } else {
+ pass = 0;
+ }
+ }
+
+ // 验证用生物特征编码的平方项的准确性验证
+ for (int i = 0; i < DIM; i++) {
+ if (d3[i].equals(hp.Add(a2, hp.Pow(cmtNew[i], e))) && d4[i].equals(hp.Add(p2[i], hp.Pow(cmtEqNew[i], e)))) {
+ pass = pass;
+ } else {
+ pass = 0;
+
+ }
+ }
+
+ // 不同生物特征编码的乘积项的准确性验证
+ for (int i = 0; i < DIM; i++) {
+ if (d5[i].equals(hp.Add(p3[i], hp.Pow(cmtMult[i], e)))) {
+ pass = pass;
+ } else {
+ pass = 0;
+ }
+ }
+ // 自行计算生物特征间欧式距离的承诺
+ BigInteger sumOld = BigInteger.ONE;
+ BigInteger sumNew = BigInteger.ONE;
+ BigInteger sumMult = BigInteger.ONE;
+ for (int i = 0; i < DIM; i++) {
+ sumOld = hp.Add(sumOld, cmtEqOld[i]);
+ sumNew = hp.Add(sumNew, cmtEqNew[i]);
+ sumMult = hp.Add(sumMult, cmtMult[i]);
+ }
+// 打印BigInteger变量
+ System.out.println("sumOld: " + sumOld);
+ System.out.println("sumNew: " + sumNew);
+ System.out.println("sumMult: " + sumMult);
+
+
+
+ BigInteger cmtSum = hp.Add(hp.Add(sumOld, sumNew), hp.Pow(hp.Add(sumMult, sumMult), new BigInteger("67108857")));
+
+
+
+
+
+
+ return pass==1;
+ }
+ //测试用
+
+ public static void main(String[] args) {
+ ObjectMapper objectMapper = new ObjectMapper();
+
+ try {
+ // 读取 proof.json 文件并转换为 ProofData 对象
+ ProofData proofData = objectMapper.readValue(new File("C:\\example/proof.json"), ProofData.class);
+
+
+ Verify verifier = new Verify();
+ boolean result = verifier.verify(proofData);
+ System.out.println("Verification result: " + result);
+ // 继续处理其他数据
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ZKVerify.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ZKVerify.java
new file mode 100644
index 000000000..e5c4fa30c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/java/szu/blockchain/check/utils/ZKVerify.java
@@ -0,0 +1,95 @@
+package szu.blockchain.check.utils;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public class ZKVerify {
+ public boolean verify() throws Exception{
+ AtomicBoolean result = new AtomicBoolean(false);
+
+
+ Process process = null;
+
+ try {
+ // 使用 Python 解释器来运行脚本
+ String[] cmd = {
+ "C:\\Users\\zzzzz\\.conda\\envs\\did\\python.exe", // Python 解释器路径
+ "D:\\java\\code\\check\\pythonverify\\verify.py" // Python 脚本路径
+ };
+ process = Runtime.getRuntime().exec(cmd);
+
+ // 获取进程的标准输入流和错误流
+ final InputStream is1 = process.getInputStream();
+ final InputStream is2 = process.getErrorStream();
+
+ // 启动线程读取标准输出流
+ Thread outputThread = new Thread(() -> {
+ try (BufferedReader br1 = new BufferedReader(new InputStreamReader(is1, "GBK"))) {
+ String line;
+ while ((line = br1.readLine()) != null) {
+ System.out.println("Output Stream: " + line);
+ if(line.contains("false")){
+ result.set(false);
+
+ }
+ if (line.contains("true")){
+ result.set(true);
+ }
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+
+ // 启动线程读取标准错误流
+ Thread errorThread = new Thread(() -> {
+ try (BufferedReader br2 = new BufferedReader(new InputStreamReader(is2, "GBK"))) {
+ String line;
+ while ((line = br2.readLine()) != null) {
+ System.err.println("Error Stream: " + line);
+
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ });
+
+ outputThread.start();
+ errorThread.start();
+
+ // 等待进程完成
+ int re = process.waitFor();
+ outputThread.join(); // 确保线程在主线程结束前完成
+ errorThread.join();
+
+ if (re == 0) {
+ System.out.println("调用脚本成功");
+ } else {
+ System.out.println("调用失败");
+ }
+
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ } finally {
+ if (process != null) {
+ try {
+ process.getErrorStream().close();
+ process.getInputStream().close();
+ process.getOutputStream().close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ System.out.println("result"+result.get());
+ return result.get();
+
+ }
+ public static void main(String[] args) throws Exception {
+ ZKVerify zkVerify = new ZKVerify();
+ zkVerify.verify();
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/META-INF/MANIFEST.MF b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/META-INF/MANIFEST.MF
new file mode 100644
index 000000000..37740b3a3
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: szu.blockchain.check.CheckApplication
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/application.properties b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/application.properties
new file mode 100644
index 000000000..22404978c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/application.properties
@@ -0,0 +1,4 @@
+# 应用服务 WEB 访问端口
+server.port=8081
+server.address= 0.0.0.0
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.abi b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.abi
new file mode 100644
index 000000000..b8c1c58ff
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.abi
@@ -0,0 +1,79 @@
+[
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "a",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256[2]",
+ "name": "X",
+ "type": "uint256[2]"
+ },
+ {
+ "internalType": "uint256[2]",
+ "name": "Y",
+ "type": "uint256[2]"
+ }
+ ],
+ "internalType": "struct Pairing.G2Point",
+ "name": "b",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "X",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "Y",
+ "type": "uint256"
+ }
+ ],
+ "internalType": "struct Pairing.G1Point",
+ "name": "c",
+ "type": "tuple"
+ }
+ ],
+ "internalType": "struct Verifier.Proof",
+ "name": "proof",
+ "type": "tuple"
+ },
+ {
+ "internalType": "uint256[5]",
+ "name": "input",
+ "type": "uint256[5]"
+ }
+ ],
+ "name": "verifyTx",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "r",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ }
+]
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.bin b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.bin
new file mode 100644
index 000000000..9c84a7dd1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/leaveMsg.bin
@@ -0,0 +1,6 @@
+{
+ "linkReferences": {},
+ "object": "60566050600b82828239805160001a6073146043577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600080fdfea26469706673582212208433ae7af547af01235d84870239593aa5fe9ff26e4dfa92c1885c496db1e8b564736f6c63430008000033",
+ "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x55E DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN STOP PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x4B JUMPI PUSH4 0xFFFFFFFF PUSH29 0x100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 CALLDATALOAD DIV AND PUSH4 0x8C595A95 DUP2 EQ PUSH2 0x50 JUMPI DUP1 PUSH4 0xCC76B911 EQ PUSH2 0xE9 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x4 DUP1 CALLDATALOAD DUP1 DUP3 ADD CALLDATALOAD PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP6 ADD DUP5 ADD SWAP1 SWAP6 MSTORE DUP5 DUP5 MSTORE PUSH2 0xE7 SWAP5 CALLDATASIZE SWAP5 SWAP3 SWAP4 PUSH1 0x24 SWAP4 SWAP3 DUP5 ADD SWAP2 SWAP1 DUP2 SWAP1 DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP POP PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x1F DUP10 CALLDATALOAD DUP12 ADD DUP1 CALLDATALOAD SWAP2 DUP3 ADD DUP4 SWAP1 DIV DUP4 MUL DUP5 ADD DUP4 ADD SWAP1 SWAP5 MSTORE DUP1 DUP4 MSTORE SWAP8 SWAP11 SWAP10 SWAP9 DUP2 ADD SWAP8 SWAP2 SWAP7 POP SWAP2 DUP3 ADD SWAP5 POP SWAP3 POP DUP3 SWAP2 POP DUP5 ADD DUP4 DUP3 DUP1 DUP3 DUP5 CALLDATACOPY POP SWAP5 SWAP8 POP PUSH2 0x219 SWAP7 POP POP POP POP POP POP POP JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xF5 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x101 PUSH1 0x4 CALLDATALOAD PUSH2 0x2E0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP6 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH1 0x20 ADD DUP4 DUP2 SUB DUP4 MSTORE DUP7 DUP2 DUP2 MLOAD DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x17A JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x162 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x1A7 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP DUP4 DUP2 SUB DUP3 MSTORE DUP5 MLOAD DUP2 MSTORE DUP5 MLOAD PUSH1 0x20 SWAP2 DUP3 ADD SWAP2 DUP7 ADD SWAP1 DUP1 DUP4 DUP4 PUSH1 0x0 JUMPDEST DUP4 DUP2 LT ISZERO PUSH2 0x1DA JUMPI DUP2 DUP2 ADD MLOAD DUP4 DUP3 ADD MSTORE PUSH1 0x20 ADD PUSH2 0x1C2 JUMP JUMPDEST POP POP POP POP SWAP1 POP SWAP1 DUP2 ADD SWAP1 PUSH1 0x1F AND DUP1 ISZERO PUSH2 0x207 JUMPI DUP1 DUP3 SUB DUP1 MLOAD PUSH1 0x1 DUP4 PUSH1 0x20 SUB PUSH2 0x100 EXP SUB NOT AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP JUMPDEST POP SWAP7 POP POP POP POP POP POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x40 DUP1 MLOAD PUSH1 0x60 DUP2 ADD DUP3 MSTORE DUP4 DUP2 MSTORE CALLER PUSH1 0x20 DUP1 DUP4 ADD SWAP2 SWAP1 SWAP2 MSTORE SWAP2 DUP2 ADD DUP4 SWAP1 MSTORE PUSH1 0x0 DUP1 SLOAD PUSH1 0x1 DUP2 ADD DUP1 DUP4 SSTORE SWAP2 DUP1 MSTORE DUP3 MLOAD DUP1 MLOAD SWAP3 SWAP5 PUSH1 0x3 SWAP1 SWAP3 MUL PUSH32 0x290DECD9548B62A8D60345A988386FC84BA6BC95484008F6362F93160EF3E563 ADD SWAP3 PUSH2 0x27F SWAP3 DUP5 SWAP3 ADD SWAP1 PUSH2 0x497 JUMP JUMPDEST POP PUSH1 0x20 DUP3 DUP2 ADD MLOAD PUSH1 0x1 DUP4 ADD DUP1 SLOAD PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF NOT AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE PUSH1 0x40 DUP4 ADD MLOAD DUP1 MLOAD PUSH2 0x2D8 SWAP3 PUSH1 0x2 DUP6 ADD SWAP3 ADD SWAP1 PUSH2 0x497 JUMP JUMPDEST POP POP POP POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 PUSH1 0x60 PUSH1 0x0 DUP1 DUP1 SLOAD SWAP1 POP PUSH1 0x0 EQ ISZERO PUSH2 0x321 JUMPI PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 DUP2 DUP2 ADD DUP4 MSTORE PUSH1 0x0 DUP1 DUP4 MSTORE DUP4 MLOAD SWAP2 DUP3 ADD SWAP1 SWAP4 MSTORE DUP3 DUP2 MSTORE SWAP2 SWAP7 POP SWAP5 POP CALLER SWAP4 POP SWAP2 POP PUSH2 0x48F JUMP JUMPDEST PUSH1 0x0 DUP1 SLOAD DUP8 SWAP1 DUP2 LT PUSH2 0x32F JUMPI INVALID JUMPDEST PUSH1 0x0 SWAP2 DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 KECCAK256 SWAP3 SLOAD PUSH1 0x1 PUSH1 0x3 SWAP1 SWAP4 MUL SWAP1 SWAP4 ADD DUP3 DUP2 ADD SLOAD DUP2 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x1F PUSH1 0x2 PUSH1 0x0 NOT SWAP9 DUP6 AND ISZERO PUSH2 0x100 MUL SWAP9 SWAP1 SWAP9 ADD SWAP1 SWAP4 AND DUP8 SWAP1 DIV SWAP3 DUP4 ADD DUP7 SWAP1 DIV DUP7 MUL DUP2 ADD DUP7 ADD SWAP1 SWAP2 MSTORE DUP2 DUP2 MSTORE SWAP3 SWAP7 POP DUP7 SWAP5 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF SWAP1 SWAP3 AND SWAP4 SWAP2 DUP6 ADD SWAP3 SWAP2 DUP6 SWAP2 SWAP1 DUP4 ADD DUP3 DUP3 DUP1 ISZERO PUSH2 0x3F1 JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x3C6 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x3F1 JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x3D4 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP DUP5 SLOAD PUSH1 0x40 DUP1 MLOAD PUSH1 0x20 PUSH1 0x2 PUSH1 0x1 DUP6 AND ISZERO PUSH2 0x100 MUL PUSH1 0x0 NOT ADD SWAP1 SWAP5 AND SWAP4 SWAP1 SWAP4 DIV PUSH1 0x1F DUP2 ADD DUP5 SWAP1 DIV DUP5 MUL DUP3 ADD DUP5 ADD SWAP1 SWAP3 MSTORE DUP2 DUP2 MSTORE SWAP6 SWAP9 POP DUP7 SWAP5 POP SWAP3 POP DUP5 ADD SWAP1 POP DUP3 DUP3 DUP1 ISZERO PUSH2 0x47F JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x454 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x47F JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x462 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP5 POP SWAP5 POP SWAP5 POP SWAP5 POP JUMPDEST POP SWAP2 SWAP4 POP SWAP2 SWAP4 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH1 0x1 DUP2 PUSH1 0x1 AND ISZERO PUSH2 0x100 MUL SUB AND PUSH1 0x2 SWAP1 DIV SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH1 0x1F LT PUSH2 0x4D8 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH2 0x505 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH2 0x505 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH2 0x505 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH2 0x4EA JUMP JUMPDEST POP PUSH2 0x511 SWAP3 SWAP2 POP PUSH2 0x515 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST PUSH2 0x52F SWAP2 SWAP1 JUMPDEST DUP1 DUP3 GT ISZERO PUSH2 0x511 JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH2 0x51B JUMP JUMPDEST SWAP1 JUMP STOP LOG1 PUSH6 0x627A7A723058 KECCAK256 SUB MULMOD MUL CALLCODE PUSH16 0x4EC7FC7F27262B5556AE47E4E6D2CA8B 0xc9 POP MULMOD 0xb6 0xbe DUP5 CREATE 0xdf 0xb9 ORIGIN PUSH12 0x2900000000000000000000 ",
+ "sourceMap": "28:871:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28:871:0;;;;;;;"
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/static/index.html b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/static/index.html
new file mode 100644
index 000000000..89bb8ba4f
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/main/resources/static/index.html
@@ -0,0 +1,6 @@
+
+
+hello word!!!
+this is a html page
+
+
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/test/java/szu/blockchain/check/CheckApplicationTests.java b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/test/java/szu/blockchain/check/CheckApplicationTests.java
new file mode 100644
index 000000000..f4b92b11c
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/src/test/java/szu/blockchain/check/CheckApplicationTests.java
@@ -0,0 +1,35 @@
+package szu.blockchain.check;
+import org.web3j.crypto.Credentials;
+import org.web3j.protocol.Web3j;
+import org.web3j.protocol.core.methods.response.Web3ClientVersion;
+import org.web3j.protocol.http.HttpService;
+import org.web3j.tx.gas.StaticGasProvider;
+
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.math.BigInteger;
+
+@SpringBootTest
+class CheckApplicationTests {
+
+ @Test
+ void contextLoads() {
+ }
+
+
+
+//
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/identity.json
new file mode 100644
index 000000000..b9d7d1ced
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/identity.json
@@ -0,0 +1,6 @@
+{
+ "id" : "ca02b82d4f8abfef6186ac5b28d41a6703fe925e17c12164cbf9f634e0ffb9e2",
+ "oldfaceinfo" : [ "-0.10487865656614304", "0.0852711871266365", "0.01343359425663948", "-0.026514234021306038", "-0.09037215262651443", "-0.14224164187908173", "-0.019824570044875145", "-0.13559222221374512", "0.10630497336387634", "-0.07222873717546463", "0.27000048756599426", "-0.08750853687524796", "-0.20784015953540802", "-0.14196254312992096", "-0.04657711833715439", "0.17270295321941376", "-0.18870946764945984", "-0.13795392215251923", "-0.09144388139247894", "0.03241229057312012", "0.11960862576961517", "-0.04864194989204407", "0.06043597310781479", "0.046097952872514725", "-0.09027547389268875", "-0.34077778458595276", "-0.11637051403522491", "-0.06728749722242355", "-0.028718028217554092", "-0.06630808860063553", "-0.021875424310564995", "0.01324629969894886", "-0.2131715714931488", "-0.103278249502182", "0.011676130816340446", "0.053619664162397385", "-0.018512334674596786", "-0.06625743955373764", "0.20800428092479706", "-0.07438163459300995", "-0.25634950399398804", "-0.02843162789940834", "0.06997054070234299", "0.23881840705871582", "0.19208870828151703", "0.04429474472999573", "0.014795529656112194", "-0.14061707258224487", "0.10202997177839279", "-0.1565093845129013", "0.0017689416417852044", "0.14999383687973022", "0.05554674193263054", "0.07280758768320084", "-0.053895242512226105", "-0.08303919434547424", "0.07766128331422806", "0.13891392946243286", "-0.1505676656961441", "-0.05990879237651825", "0.12618683278560638", "-0.11451473832130432", "-0.07017488032579422", "-0.0806252509355545", "0.2637837529182434", "0.05301433429121971", "-0.13837134838104248", "-0.16468848288059235", "0.12375886738300323", "-0.138880655169487", "-0.07429234683513641", "0.062423039227724075", "-0.16374938189983368", "-0.19859528541564941", "-0.3407801389694214", "-0.015096389688551426", "0.4187159240245819", "0.07421891391277313", "-0.19991475343704224", "0.025428853929042816", "-0.11233330518007278", "0.05854640156030655", "0.15308310091495514", "0.12079044431447983", "-0.0010580950183793902", "0.060106828808784485", "-0.18215329945087433", "0.017814356833696365", "0.20504145324230194", "-0.10190994292497635", "-0.03667020425200462", "0.19033151865005493", "0.03188537061214447", "0.07963605225086212", "0.048415374010801315", "0.044156238436698914", "-0.040122367441654205", "0.05760466307401657", "-0.15466377139091492", "0.058469291776418686", "0.07053293287754059", "0.0006032180972397327", "-0.023554250597953796", "0.08931277692317963", "-0.06842118501663208", "0.10881128162145615", "0.043429184705019", "0.06209086254239082", "-0.006437378469854593", "-0.06939125806093216", "-0.08476616442203522", "-0.11816184967756271", "0.0705469399690628", "-0.20658858120441437", "0.18673326075077057", "0.15472882986068726", "0.04719597473740578", "0.13084854185581207", "0.10535703599452972", "0.11605439335107803", "-0.0656786635518074", "-0.034816090017557144", "-0.2339829057455063", "0.014889654703438282", "0.12042585760354996", "0.021806826815009117", "0.13547347486019135", "-0.017292527481913567" ],
+ "randomnumbers" : [ "103333", "883370", "61717", "691256", "470493", "81988", "61901", "358054", "581198", "322967", "626364", "609535", "272080", "594529", "271303", "673564", "272244", "642809", "969846", "49480", "211828", "727795", "796796", "735444", "873222", "158208", "275702", "865558", "350276", "478785", "892480", "340004", "853563", "327979", "165407", "102523", "344224", "611562", "38441", "515233", "897542", "200834", "9166", "207024", "720001", "385237", "490158", "749909", "611288", "218826", "879066", "546823", "797949", "257081", "997808", "450735", "63119", "184720", "834031", "382702", "85920", "558243", "618560", "700750", "212619", "301463", "905098", "353106", "212083", "19770", "394378", "720410", "841680", "810257", "542855", "944316", "810262", "304565", "98373", "715098", "846721", "114430", "241216", "802837", "972590", "734469", "56720", "565516", "819427", "241713", "683679", "155947", "147060", "350527", "135366", "953778", "102029", "37123", "790758", "509528", "346785", "585202", "998650", "870614", "519185", "974754", "902050", "518918", "657115", "884070", "26610", "98221", "995332", "458458", "70254", "488861", "998469", "918562", "306530", "547176", "227873", "567399", "179682", "593688", "108379", "802493", "580277", "899957" ],
+ "commitment" : [ "53677044", "45537498", "13939998", "59836509", "14618174", "11568522", "63254352", "11727974", "55337279", "8030029", "10230075", "47154988", "60345624", "65922850", "9445101", "6733811", "45718817", "46389480", "15719454", "33644608", "63145447", "10017296", "566577", "22450439", "16587763", "13561345", "20863264", "63145576", "3081468", "37234852", "57467154", "52751102", "19442057", "10188327", "23916225", "43046375", "39572684", "41939615", "36299873", "40634183", "5905981", "42799137", "53742100", "9694998", "56193017", "30130603", "4696287", "9153816", "56239117", "13455302", "44335135", "55715675", "30002739", "42561095", "49281610", "61595712", "41770749", "20262507", "55358913", "13249539", "25542690", "26136582", "40977034", "57095506", "32700264", "35519418", "55982911", "14512678", "60026926", "50204673", "48813202", "31630684", "26621666", "45438833", "36280884", "2743690", "1808919", "55125845", "20541226", "3982900", "62662296", "20246827", "29929493", "57397934", "49243911", "21190277", "49884072", "7798953", "67018757", "11834158", "46291601", "35003480", "15609338", "25729314", "32115784", "24456023", "39808609", "15843700", "61617028", "42836613", "29750031", "41908017", "49947282", "13317418", "44681215", "65967030", "34301287", "27764748", "51102430", "53259064", "39076472", "50696700", "24203918", "48576947", "11276610", "29899724", "65424667", "39611965", "40155763", "16185283", "55576012", "40814575", "2480795", "60113788", "5012714", "35886152", "31682369", "18462038" ]
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/proof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/proof.json
new file mode 100644
index 000000000..57950f2fb
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/test_data/proof.json
@@ -0,0 +1,50 @@
+{
+ "id": "User",
+ "time": "2024/2/15 01:08:23",
+ "oldcmt": ["0x000000000127040a",
+"0x000000000354eff8"
+],
+ "proof": {
+ "emb": [
+ "0x000000000251c15a",
+ "0x00000000030f67b7" ],
+ "cmt": {
+ "cmt_eq_old_json": [
+ "0x000000000094cab6",
+ "0x00000000011a1499"],
+ "cmt_eq_new_json": [
+ "0x0000000000e6c93d",
+ "0x00000000018cb23b"],
+ "cmt_mult_json": [
+ "0x000000000392d55d",
+ "0x00000000010246e9"]
+ },
+ "a": [
+ "0x0000000001494bcc",
+ "0x000000000397770b"
+ ],
+ "z": [
+ "0x0000000000005edb",
+ "0x0000000000002ffb",
+ "0x000000000002339b",
+ "0x0000000000031eeb",
+ "0x00000000000120eb",
+ "0x0000000000013c1b",
+ "0x00000000000298db",
+ "0x000000000000845b",
+ "0x000000000001547b",
+ "0x00000000000396eb",
+ "0x00000000000198eb",
+ "0x000000000000ed5b",
+ "0x000000000001f1fb",
+ "0x0000000000021a4b" ],
+ "p": [
+ "0x000000000020f57f",
+ "0x0000000000fe582d",
+ "0x00000000038f81b4",
+ "0x0000000000e87317",
+ "0x000000000237d405",
+ "0x0000000003fb4a42"
+ ]
+ }
+ }
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/check/zkproof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/check/zkproof.json
new file mode 100644
index 000000000..6d165d931
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/check/zkproof.json
@@ -0,0 +1 @@
+{"scheme":"g16","curve":"bn128","proof":{"a":["0x0083e527ee94f589f2dd305cd21fc931237f31fee19f47ff024cd43097fb3844","0x0ec3528fcf3e1ee50ec75dda594e327b6ba5756ef530418302c3ff0c81fa4c39"],"b":[["0x2c34355f804201dc566446b97734b0ca867646f4aef6ca6d9513452be36b8ee0","0x0b92d776c8653c1bf7aa1ce96ec3cd63982921a01bee5d98addfe6aac45fa39c"],["0x24c3e205551ac7ff2b93de05dadf3d3c36d35a3747185c4061ddabf075ab760c","0x2006b5ad61714a10a0cebd9a178d381dff00bd8173b45756b7bc030e988bc46e"]],"c":["0x1a8c1a783c59c435f4b7844fc4b51ad71dc4c007bf3614453786a3441ae4b578","0x23264ee50cd62787e624ab9cf18350e345a9fafb9d6a7ecffc069fb04b647d90"]},"inputs":["0x00000000000000000000000000000000000000000000000000000000035ecd34","0x000000000000000000000000000000000000000000000000000000000e2ac760","0x00000000000000000000000000000000000000000000000000000000000c3500","0x0000000000000000000000000000000000000000000000000000000003fffffb","0x0000000000000000000000000000000000000000000000000000000002b2c637"],"cmt_zk":"\"0x0000000002b2c637\""}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/.gitignore b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/.gitignore
new file mode 100755
index 000000000..549e00a2a
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/CreateProofFile.java b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/CreateProofFile.java
new file mode 100755
index 000000000..4c0ca3137
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/CreateProofFile.java
@@ -0,0 +1,510 @@
+package szu.zhl.test1.utils; // 定义包名
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import org.apache.commons.codec.digest.DigestUtils;
+import szu.zhl.test1.entity.LoginData;
+import szu.zhl.test1.entity.Pedersen; // 导入Pedersen类
+
+import java.io.FileWriter;
+import java.io.IOException; // 导入IOException类,用于处理IO异常
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files; // 导入Files类,用于文件操作
+import java.nio.file.Paths; // 导入Paths类,用于路径操作
+import java.math.BigInteger; // 导入BigInteger类,用于大整数运算
+import java.security.MessageDigest;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import org.json.JSONObject; // 导入JSONObject类,用于JSON操作
+import szu.zhl.test1.entity.ReceiveLoginData;
+
+//
+public class CreateProofFile { // 定义CreateProofFile类
+ private String filepath = "C:/example/proof.json";
+
+ private int DIM = 128; // 定义常量DIM,表示维度大小
+ private final BigInteger G = new BigInteger("56544564"); // 定义常量G,作为大整数
+ private final BigInteger H = new BigInteger("237684576"); // 定义常量H,作为大整数
+
+ private Random RANDOM = new Random(); // 创建Random对象,用于生成随机数
+
+ // 将大整数转换为指定长度的十六进制字符串
+ public String intToHex(BigInteger value, int length) {
+ String hex = value.toString(16); // 将大整数转换为十六进制字符串
+ int padding = length - hex.length(); // 计算需要填充的零的数量
+ if (padding > 0) {
+ hex = "0x" + "0".repeat(padding) + hex; // 如果需要,填充零
+ } else {
+ hex = "0x" + hex; // 否则直接加上前缀
+ }
+ return hex; // 返回十六进制字符串
+ }
+
+
+ // 生成包含新嵌入、随机数和承诺的JSON字符串
+ public Map> getRandomNewFeatures(ReceiveLoginData loginData) {
+ System.out.println("G:" + G);
+ System.out.println("H:" + H);
+ Pedersen code = new Pedersen(G, H); // 创建Pedersen对象
+ List embNewStr = loginData.getNewfaceinfo(); // 使用LoginData中的newfaceinfo
+ List embNew = embNewStr.stream()
+ .map(Double::parseDouble) // 将字符串转换为Double
+ .map(d -> BigInteger.valueOf(Math.round(d))) // 转换为BigInteger
+ .collect(Collectors.toList());
+
+ List randNew = new ArrayList<>(DIM); // 创建randNew列表
+ List cmtNew = new ArrayList<>(DIM); // 创建cmtNew列表
+ //测试
+// randNew.add(BigInteger.valueOf(9108));
+// randNew.add(BigInteger.valueOf(4508));
+
+ for (int i = 0; i < DIM; i++) { // 遍历DIM次
+ randNew.add(BigInteger.valueOf(RANDOM.nextInt(10000))); // 生成随机数并添加到 randNew randNew.add(BigInteger.valueOf(RANDOM.nextInt(10000)));
+ cmtNew.add(code.commitment(embNew.get(i), randNew.get(i))); // 计算承诺并添加到cmtNew
+ }
+
+ // 将数据转换为HashMap
+ Map> resultMap = new HashMap<>();
+ resultMap.put("embNew", embNew);
+ resultMap.put("randNew", randNew);
+ resultMap.put("cmtNew", cmtNew);
+
+ // 打印数组
+ System.out.println("embNew: " + embNew);
+ System.out.println("randNew: " + randNew);
+ System.out.println("cmtNew: " + cmtNew);
+
+ return resultMap;
+ }
+
+ // 生成证明文件
+
+
+
+
+
+ public Map GenerateProofString(Map olddata, ReceiveLoginData logindata) {
+ // 初始化数组
+ BigInteger[] emb_eq_old = new BigInteger[DIM];
+ BigInteger[] emb_eq_new = new BigInteger[DIM];
+ BigInteger[] rand_eq_old = new BigInteger[DIM];
+ BigInteger[] rand_eq_new = new BigInteger[DIM];
+ BigInteger[] cmt_eq_old = new BigInteger[DIM];
+ BigInteger[] cmt_eq_new = new BigInteger[DIM];
+ BigInteger[] emb_mult = new BigInteger[DIM];
+ BigInteger[] rand_mult = new BigInteger[DIM];
+ BigInteger[] cmt_mult = new BigInteger[DIM];
+
+ // 获取旧数据
+
+ List> oldfaceinfoRaw = (List>) olddata.get("oldfaceinfo");
+BigInteger[] emb_old = oldfaceinfoRaw.stream()
+ .map(obj -> new BigInteger(obj.toString())) // 直接转换为 BigInteger
+ .toArray(BigInteger[]::new);
+
+List> randomnumbersRaw = (List>) olddata.get("randomnumbers");
+BigInteger[] rand_old = randomnumbersRaw.stream()
+ .map(obj -> new BigInteger(obj.toString())) // 直接转换为 BigInteger
+ .toArray(BigInteger[]::new);
+
+List> commitmentsRaw = (List>) olddata.get("commitment");
+BigInteger[] old_cmt = commitmentsRaw.stream()
+ .map(obj -> new BigInteger(obj.toString())) // 直接转换为 BigInteger
+ .toArray(BigInteger[]::new);
+
+ String id = (String) olddata.get("id");
+
+ // 假设已经有了新生成的emb_new和rand_new数组
+ Map> proof = getRandomNewFeatures(logindata);
+ BigInteger[] emb_new = proof.get("embNew").toArray(new BigInteger[0]);
+ BigInteger[] rand_new = proof.get("randNew").toArray(new BigInteger[0]);
+ BigInteger[] cmt_new = proof.get("cmtNew").toArray(new BigInteger[0]);
+ // Print arrays
+ System.out.println("emb_old: " + Arrays.toString(emb_old));
+ System.out.println("old_cmt: " + Arrays.toString(old_cmt));
+ System.out.println("rand_old: " + Arrays.toString(rand_old));
+
+
+
+ Random random = new Random();
+ Pedersen code = new Pedersen(G, H); // g和h需要预先定义
+ //测试
+// BigInteger[] randValue1 = new BigInteger[DIM];
+// BigInteger[] randValue2 = new BigInteger[DIM];
+// BigInteger[] randValue3 = new BigInteger[DIM];
+// randValue1[0] = BigInteger.valueOf(948676);
+// randValue2[0] = BigInteger.valueOf(251100);
+// randValue3[0] = BigInteger.valueOf(144);
+// randValue1[1] = BigInteger.valueOf(858640);
+// randValue2[1] = BigInteger.valueOf(877514);
+// randValue3[1] = BigInteger.valueOf(814);
+
+
+
+ // 生成证明
+ for(int i = 0; i < DIM; i++) {
+ // 计算平方和乘积
+ emb_eq_old[i] = emb_old[i].multiply(emb_old[i]);
+ emb_eq_new[i] = emb_new[i].multiply(emb_new[i]);
+ emb_mult[i] = emb_old[i].multiply(emb_new[i]);
+
+ //生成随机数并计算随机因子
+ BigInteger randValue1 = BigInteger.valueOf((long) Math.floor(Math.random() * 1000000));
+ BigInteger randValue2 = BigInteger.valueOf((long) Math.floor(Math.random() * 1000000));
+ BigInteger randValue3 = BigInteger.valueOf((long) Math.floor(Math.random() * 1000));
+
+
+ rand_eq_old[i] = emb_old[i].multiply(rand_old[i]).add(randValue1);
+ rand_eq_new[i] = emb_new[i].multiply(rand_new[i]).add(randValue2);
+ rand_mult[i] = emb_new[i].multiply(rand_old[i]).add(randValue3);
+
+
+
+ //测试
+// rand_eq_old[i] = emb_old[i].multiply(rand_old[i]).add(randValue1[i]);
+// rand_eq_new[i] = emb_new[i].multiply(rand_new[i]).add(randValue2[i]);
+// rand_mult[i] = emb_new[i].multiply(rand_old[i]).add(randValue3[i]);
+
+
+ // 计算承诺
+ // PedersenCommitment是一个实现承诺算法的类
+
+ cmt_eq_old[i] = code.commitment(emb_eq_old[i], rand_eq_old[i]);
+ cmt_eq_new[i] = code.commitment(emb_eq_new[i], rand_eq_new[i]);
+ cmt_mult[i] = code.commitment(emb_mult[i], rand_mult[i]);
+ }
+
+
+ // 打印所有数组的内容
+ System.out.println("emb_eq_old: " + Arrays.toString(emb_eq_old));
+ System.out.println("emb_eq_new: " + Arrays.toString(emb_eq_new));
+ System.out.println("emb_mult: " + Arrays.toString(emb_mult));
+ System.out.println("rand_eq_old: " + Arrays.toString(rand_eq_old));
+ System.out.println("rand_eq_new: " + Arrays.toString(rand_eq_new));
+ System.out.println("rand_mult: " + Arrays.toString(rand_mult));
+ System.out.println("cmt_eq_old: " + Arrays.toString(cmt_eq_old));
+ System.out.println("cmt_eq_new: " + Arrays.toString(cmt_eq_new));
+ System.out.println("cmt_mult: " + Arrays.toString(cmt_mult));
+
+
+// // 构造乘法同态的验证因子
+ BigInteger b1 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b2 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b3 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b4 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b5 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b6 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger b7 = BigInteger.valueOf((long) Math.floor(Math.random() * 10000));
+ BigInteger a1 = code.commitment(b1, b2);
+ BigInteger a2 = code.commitment(b3, b4);
+
+
+ //测试
+// BigInteger b1 = BigInteger.valueOf(3055);
+// BigInteger b2 = BigInteger.valueOf(5676);
+// BigInteger b3 = BigInteger.valueOf(614);
+// BigInteger b4 = BigInteger.valueOf(2421);
+// BigInteger b5 = BigInteger.valueOf(8101);
+// BigInteger b6 = BigInteger.valueOf(682);
+// BigInteger b7 = BigInteger.valueOf(4713);
+// BigInteger a1 = code.commitment(b1, b2);
+// BigInteger a2 = code.commitment(b3, b4);
+
+ // 打印验证因子
+ System.out.println("b1: " + b1);
+ System.out.println("b2: " + b2);
+ System.out.println("b3: " + b3);
+ System.out.println("b4: " + b4);
+ System.out.println("b5: " + b5);
+ System.out.println("b6: " + b6);
+ System.out.println("b7: " + b7);
+ System.out.println("a1: " + a1);
+ System.out.println("a2: " + a2);
+
+
+ // 初始化数组用于存储承诺值
+ BigInteger[] p1 = new BigInteger[DIM];
+ BigInteger[] p2 = new BigInteger[DIM];
+ BigInteger[] p3 = new BigInteger[DIM];
+
+
+ // 生成承诺验证值
+ for(int i = 0; i < DIM; i++) {
+ // 使用旧承诺值创建Pedersen实例
+ Pedersen temp_eq_old = new Pedersen(old_cmt[i], H);
+ p1[i] = temp_eq_old.commitment(b1, b5);
+
+ // 使用新承诺值创建Pedersen实例
+ Pedersen temp_eq_new = new Pedersen(cmt_new[i], H);
+ p2[i] = temp_eq_new.commitment(b3, b6);
+
+ // 复用旧承诺实例生成p3
+ p3[i] = temp_eq_old.commitment(b3, b7);
+
+ // 调试输出
+ // logger.debug("p1: {}, p2: {}, p3: {}", p1[i], p2[i], p3[i]);
+ }
+
+
+ // 打印数组
+ System.out.println("p1: " + Arrays.toString(p1));
+ System.out.println("p2: " + Arrays.toString(p2));
+ System.out.println("p3: " + Arrays.toString(p3));
+
+ // 初始化十六进制字符串数组
+ String[] cmt_old_json = new String[DIM];
+ String[] cmt_new_json = new String[DIM];
+ String[] cmt_eq_old_json = new String[DIM];
+ String[] cmt_eq_new_json = new String[DIM];
+ String[] cmt_mult_json = new String[DIM];
+
+// 转换所有承诺值为十六进制字符串
+ for(int i = 0; i < DIM; i++) {
+ // 使用intToHex方法转换每个BigInteger值为十六进制字符串
+ cmt_old_json[i] = intToHex(old_cmt[i], 16);
+ cmt_new_json[i] = intToHex(cmt_new[i], 16);
+ cmt_eq_old_json[i] = intToHex(cmt_eq_old[i], 16);
+ cmt_eq_new_json[i] = intToHex(cmt_eq_new[i], 16);
+ cmt_mult_json[i] = intToHex(cmt_mult[i], 16);
+ }
+
+ // 使用 Arrays.toString() 打印数组
+ System.out.println("cmt_old_json: " + Arrays.toString(cmt_old_json));
+ System.out.println("cmt_new_json: " + Arrays.toString(cmt_new_json));
+ System.out.println("cmt_eq_old_json: " + Arrays.toString(cmt_eq_old_json));
+ System.out.println("cmt_eq_new_json: " + Arrays.toString(cmt_eq_new_json));
+ System.out.println("cmt_mult_json: " + Arrays.toString(cmt_mult_json));
+
+
+ // 创建 SimpleDateFormat 对象,指定所需的日期格式
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
+ // 测试:使用 Calendar 设置特定的日期和时间
+// Calendar calendar = Calendar.getInstance();
+// calendar.set(Calendar.YEAR, 2024);
+// calendar.set(Calendar.MONTH, Calendar.NOVEMBER); // 月份从0开始,11表示12月
+// calendar.set(Calendar.DAY_OF_MONTH, 17);
+// calendar.set(Calendar.HOUR_OF_DAY, 13);
+// calendar.set(Calendar.MINUTE, 26);
+// calendar.set(Calendar.SECOND, 54);
+//
+// // 获取指定日期的 Date 对象
+// Date specificDate = calendar.getTime();
+
+ // 格式化指定日期
+ String t = sdf.format(new Date());
+
+ //String t = sdf.format(new Date());
+
+
+/// 构建challenge对象
+ // 使用 LinkedHashMap 保持顺序
+ Map map = new LinkedHashMap<>();
+ map.put("cmt_old_json", Arrays.asList(cmt_old_json));
+ map.put("cmt_new_json", Arrays.asList(cmt_new_json));
+ map.put("cmt_eq_old_json", Arrays.asList(cmt_eq_old_json));
+ map.put("cmt_eq_new_json", Arrays.asList(cmt_eq_new_json));
+ map.put("cmt_mult_json", Arrays.asList(cmt_mult_json));
+ map.put("id", id);
+ map.put("t", t);
+
+ // 打印 LinkedHashMap 内容以验证顺序
+ System.out.println("LinkedHashMap content: " + map);
+
+ // 使用 Jackson 序列化为 JSON 字符串
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, false);
+ String test = null;
+ try {
+ test = objectMapper.writeValueAsString(map);
+ System.out.println("JSON String: " + test);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException(e);
+ }
+
+ // 打印 JSON 字符串
+ System.out.println("challenge: " + test);
+
+ // 计算 SHA-256 哈希
+ String hash = DigestUtils.sha256Hex(test);
+ System.out.println("hash: " + hash);
+
+
+
+// // 转换为JSON字符串
+// String test = challenge.toString(2);
+
+
+// 计算SHA256哈希
+// String hash = DigestUtils.sha256Hex(test);
+// System.out.println("SHA-256 Hash: " + hash);
+
+// 计算最终的e值
+ BigInteger e = new BigInteger(hash, 16).mod(BigInteger.valueOf(5000));
+ System.out.println("e: " + e);
+
+
+ // 初始化辅助证明因子数组
+ BigInteger[] z1 = new BigInteger[DIM];
+ BigInteger[] z2 = new BigInteger[DIM];
+ BigInteger[] z3 = new BigInteger[DIM];
+ BigInteger[] z4 = new BigInteger[DIM];
+ BigInteger[] z5 = new BigInteger[DIM];
+ BigInteger[] z6 = new BigInteger[DIM];
+ BigInteger[] z7 = new BigInteger[DIM];
+
+// 生成辅助证明因子
+ for(int i = 0; i < DIM; i++) {
+ z1[i] = b1.add(e.multiply(emb_old[i]));
+ z2[i] = b2.add(e.multiply(rand_old[i]));
+ z3[i] = b3.add(e.multiply(emb_new[i]));
+ z4[i] = b4.add(e.multiply(rand_new[i]));
+
+ // 计算z5: b5 + e * (rand_eq_old[i] - emb_old[i] * rand_old[i])
+ BigInteger temp5 = emb_old[i].multiply(rand_old[i]);
+ z5[i] = b5.add(e.multiply(rand_eq_old[i].subtract(temp5)));
+
+ // 计算z6: b6 + e * (rand_eq_new[i] - emb_new[i] * rand_new[i])
+ BigInteger temp6 = emb_new[i].multiply(rand_new[i]);
+ z6[i] = b6.add(e.multiply(rand_eq_new[i].subtract(temp6)));
+
+ // 计算z7: b7 + e * (rand_mult[i] - emb_new[i] * rand_old[i])
+ BigInteger temp7 = emb_new[i].multiply(rand_old[i]);
+ z7[i] = b7.add(e.multiply(rand_mult[i].subtract(temp7)));
+ }
+
+ // 使用 Arrays.toString() 打印数组
+ System.out.println("z1: " + Arrays.toString(z1));
+ System.out.println("z2: " + Arrays.toString(z2));
+ System.out.println("z3: " + Arrays.toString(z3));
+ System.out.println("z4: " + Arrays.toString(z4));
+ System.out.println("z5: " + Arrays.toString(z5));
+ System.out.println("z6: " + Arrays.toString(z6));
+ System.out.println("z7: " + Arrays.toString(z7));
+
+
+
+ // 计算生物特征编码间的欧式距离
+ BigInteger emb_dist = BigInteger.ZERO;
+ BigInteger rand_dist = BigInteger.ZERO;
+ for (int i = 0; i < DIM; i++) {
+ // 计算特征向量的欧氏距离
+ BigInteger diff = emb_new[i].subtract(emb_old[i]);
+ emb_dist = emb_dist.add(diff.multiply(diff));
+
+ // 计算随机数的距离
+ rand_dist = rand_dist.add(
+ rand_eq_new[i].add(rand_eq_old[i]).subtract(
+ rand_mult[i].multiply(BigInteger.valueOf(2))
+ )
+ );
+ }
+
+ // 打印 BigInteger 变量
+ System.out.println("emb_dist: " + emb_dist);
+ System.out.println("rand_dist: " + rand_dist);
+// 生成距离的承诺
+ BigInteger cmt_dist = code.commitment(emb_dist, rand_dist);
+ System.out.println("cmt_dist: " + cmt_dist);
+
+
+
+ // 创建数组存储十六进制字符串
+ String[] a_json = new String[2];
+ a_json[0] = intToHex(a1, 16);
+ a_json[1] = intToHex(a2, 16);
+ System.out.println("a_json: " + Arrays.toString(a_json));
+
+ String[] z_json = new String[DIM * 7];
+ String[] p_json = new String[DIM * 3];
+
+
+// 填充数组
+ for (int i = 0; i < DIM; i++) {
+ // z 数组的七个部分
+ z_json[i] = intToHex(z1[i], 16);
+ z_json[DIM + i] = intToHex(z2[i], 16);
+ z_json[2 * DIM + i] = intToHex(z3[i], 16);
+ z_json[3 * DIM + i] = intToHex(z4[i], 16);
+ z_json[4 * DIM + i] = intToHex(z5[i], 16);
+ z_json[5 * DIM + i] = intToHex(z6[i], 16);
+ z_json[6 * DIM + i] = intToHex(z7[i], 16);
+
+ // p 数组的三个部分
+ p_json[i] = intToHex(p1[i], 16);
+ p_json[DIM + i] = intToHex(p2[i], 16);
+ p_json[2 * DIM + i] = intToHex(p3[i], 16);
+ }
+ System.out.println("z_json: " + Arrays.toString(z_json));
+ System.out.println("p_json: " + Arrays.toString(p_json));
+
+
+ Map new_proofs = new HashMap<>();
+ Map proofInner = new HashMap<>();
+ Map cmt = new HashMap<>();
+
+// 填充cmt对象
+ cmt.put("cmt_eq_old_json", cmt_eq_old_json);
+ cmt.put("cmt_eq_new_json", cmt_eq_new_json);
+ cmt.put("cmt_mult_json", cmt_mult_json);
+
+// 填充内部proof对象
+ proofInner.put("emb", cmt_new_json);
+ proofInner.put("cmt", cmt);
+ proofInner.put("a", a_json);
+ proofInner.put("z", z_json);
+ proofInner.put("p", p_json);
+
+// 填充主proof对象
+ new_proofs.put("id", id);
+ new_proofs.put("time", t);
+ new_proofs.put("proof", proofInner);
+ System.out.println("new_proofs: " + new_proofs);
+ System.out.println("cmt: " + cmt);
+ System.out.println("proofInner: " + proofInner);
+
+
+ return new_proofs;
+
+ }
+
+
+ // 保存证明到文件
+ // 版本2:更灵活的版本,可以指定文件名和格式化选项
+ public void saveToJsonFile(Map data, boolean prettyPrint) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ if (prettyPrint) {
+ mapper.enable(SerializationFeature.INDENT_OUTPUT);
+ }
+ String jsonString = mapper.writeValueAsString(data);
+
+ try (FileWriter file = new FileWriter(filepath)) {
+ file.write(jsonString);
+ System.out.println("JSON file has been saved: " + filepath);
+ }
+ } catch (IOException e) {
+ System.out.println("An error occurred while writing JSON Object to File.");
+ e.printStackTrace();
+ }
+ }
+
+ public static void main(String[] args) {
+ CreateProofFile proofFile = new CreateProofFile();
+ ReadFile readFile = new ReadFile();
+ HashMap oldmap = readFile.readJsonFileToMap();
+ for (Map.Entry entry : oldmap.entrySet()) {
+ // 打印每个键值对
+ System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
+ }
+
+ ReceiveLoginData loginData = new ReceiveLoginData();
+ loginData.setNewfaceinfo(Arrays.asList("741", "268"));
+ Map proofjson = proofFile.GenerateProofString(oldmap, loginData);
+ proofFile.saveToJsonFile(proofjson, true);
+
+
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/Pedersen.js b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/Pedersen.js
new file mode 100755
index 000000000..439d70f82
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/Pedersen.js
@@ -0,0 +1,61 @@
+/**
+ * File Name: Pedersen.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-10: Minor bug fixes by Norton.
+ * Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
+ * in JavaScript language.
+ * Contact Information: [None]
+ */
+
+export class Pedersen {
+ #g;
+ #h;
+ //#p = 67108859;
+ #p = 67108859n;
+ #g_table = [];
+ #h_table = [];
+ constructor(g, h) {
+ this.#g = g % this.#p;
+ this.#h = h % this.#p;
+ this.#g_table.push(this.#g)
+ this.#h_table.push(this.#h)
+ for(let i = 1; i < 64; i++) {
+ this.#g_table.push(this.#g_table[i - 1] * this.#g_table[i - 1] % this.#p);
+ this.#h_table.push(this.#h_table[i - 1] * this.#h_table[i - 1] % this.#p);
+ }
+ // bebug
+ // console.log('g:' + this.#g + ' h:' + this.#h)
+ // console.log('g_table:' + this.#g_table)
+ // console.log('h_table:' + this.#h_table)
+ }
+ Commitment(v, r) {
+ let v_quot = v;
+ let r_quot = r;
+ let v_rem = 0n;
+ let r_rem = 0n;
+ let G = 1n;
+ let H = 1n;
+ for(let i = 0; i < 64; i++) {
+ v_rem = v_quot % 2n;
+ v_quot = v_quot / 2n;
+ r_rem = r_quot % 2n;
+ r_quot = r_quot / 2n;
+ // debug
+ // console.log(i + ' v_rem:' + v_rem + ' v_qout:' + v_quot);
+ // console.log(i + ' r_rem:' + r_rem + ' r_qout:' + r_quot);
+ if(v_rem == 1n) {
+ G = G * this.#g_table[i] % this.#p;
+ } else {}
+ if(r_rem == 1n) {
+ H = H * this.#h_table[i] % this.#p;
+ } else {}
+ }
+ return G * H % this.#p
+ }
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/data/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/data/identity.json
new file mode 100755
index 000000000..e4761eaa1
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/data/identity.json
@@ -0,0 +1,1545 @@
+{
+ "id": "User",
+ "m": [
+ "0x000000000005c4e4",
+ "0x0000000000025f54",
+ "0x000000000000ac56",
+ "0x000000000007bb75",
+ "0x0000000000068c8c",
+ "0x00000000000ddb83",
+ "0x00000000000e84dc",
+ "0x000000000002c46a",
+ "0x00000000000e126b",
+ "0x000000000005fb73",
+ "0x00000000000cd2ea",
+ "0x000000000003da11",
+ "0x00000000000525d2",
+ "0x000000000003c254",
+ "0x000000000008a3eb",
+ "0x000000000007f6b6",
+ "0x00000000000b2305",
+ "0x000000000005a8fb",
+ "0x0000000000039460",
+ "0x00000000000e4a27",
+ "0x00000000000114f1",
+ "0x00000000000b16dc",
+ "0x00000000000b090b",
+ "0x00000000000671e2",
+ "0x0000000000004ae3",
+ "0x000000000009638a",
+ "0x00000000000d394f",
+ "0x0000000000094b37",
+ "0x00000000000d8143",
+ "0x000000000009d76c",
+ "0x000000000002864e",
+ "0x00000000000b3683",
+ "0x0000000000027e4e",
+ "0x00000000000dce7d",
+ "0x0000000000037626",
+ "0x00000000000b515d",
+ "0x000000000007e5dd",
+ "0x00000000000d9b3d",
+ "0x000000000001290b",
+ "0x00000000000a1400",
+ "0x000000000004ac4f",
+ "0x0000000000054364",
+ "0x00000000000784f0",
+ "0x000000000001543f",
+ "0x0000000000022c64",
+ "0x000000000007986b",
+ "0x0000000000039a07",
+ "0x00000000000cc6d8",
+ "0x00000000000f0787",
+ "0x00000000000ef5f6",
+ "0x00000000000ad614",
+ "0x00000000000c48b1",
+ "0x000000000008e5cd",
+ "0x00000000000613eb",
+ "0x00000000000c7b79",
+ "0x000000000001d27b",
+ "0x000000000007275c",
+ "0x000000000008ab6a",
+ "0x0000000000001b79",
+ "0x000000000002a17a",
+ "0x000000000001189e",
+ "0x000000000000fdbf",
+ "0x00000000000d6781",
+ "0x0000000000080304",
+ "0x00000000000b5c1e",
+ "0x0000000000036f71",
+ "0x00000000000d641f",
+ "0x00000000000e6549",
+ "0x0000000000027389",
+ "0x00000000000d65df",
+ "0x0000000000082295",
+ "0x0000000000093fc5",
+ "0x000000000005198e",
+ "0x0000000000099217",
+ "0x00000000000becef",
+ "0x00000000000290f7",
+ "0x000000000007852b",
+ "0x000000000002432c",
+ "0x00000000000c6613",
+ "0x0000000000017c0f",
+ "0x0000000000089bab",
+ "0x00000000000e9acc",
+ "0x00000000000b91ac",
+ "0x00000000000efcf0",
+ "0x00000000000e5e12",
+ "0x0000000000082fed",
+ "0x00000000000cb271",
+ "0x000000000007347a",
+ "0x00000000000968f0",
+ "0x00000000000ed37d",
+ "0x0000000000000c43",
+ "0x0000000000091313",
+ "0x00000000000651e6",
+ "0x00000000000b521b",
+ "0x000000000005685d",
+ "0x000000000006cc03",
+ "0x000000000006d78e",
+ "0x00000000000e2b25",
+ "0x000000000009f690",
+ "0x00000000000ec47e",
+ "0x00000000000d5253",
+ "0x0000000000079c88",
+ "0x000000000009f20b",
+ "0x00000000000d9d08",
+ "0x00000000000c8823",
+ "0x000000000003c291",
+ "0x000000000007101d",
+ "0x00000000000ec3e0",
+ "0x0000000000099e7b",
+ "0x0000000000031fac",
+ "0x000000000008ccf7",
+ "0x0000000000087644",
+ "0x00000000000ed794",
+ "0x00000000000c701c",
+ "0x0000000000043e23",
+ "0x0000000000090a90",
+ "0x00000000000e1501",
+ "0x0000000000085e78",
+ "0x000000000006e059",
+ "0x0000000000008160",
+ "0x000000000009f0fe",
+ "0x00000000000d6791",
+ "0x00000000000efab1",
+ "0x000000000005bdb4",
+ "0x0000000000064025",
+ "0x00000000000a3e51",
+ "0x0000000000078111",
+ "0x000000000004f3e5",
+ "0x000000000000939a",
+ "0x000000000004c9b4",
+ "0x00000000000795bf",
+ "0x000000000002316b",
+ "0x0000000000034b7d",
+ "0x00000000000cd487",
+ "0x00000000000c48b9",
+ "0x00000000000c8a15",
+ "0x000000000000168a",
+ "0x00000000000eb3c6",
+ "0x00000000000e092e",
+ "0x000000000006404e",
+ "0x000000000005fa90",
+ "0x000000000000e751",
+ "0x00000000000b24fb",
+ "0x00000000000c36d2",
+ "0x00000000000b28c4",
+ "0x0000000000009355",
+ "0x00000000000a987b",
+ "0x00000000000860c3",
+ "0x00000000000a7d7c",
+ "0x000000000004684f",
+ "0x0000000000001ccb",
+ "0x000000000002eb30",
+ "0x00000000000f3b3a",
+ "0x00000000000600b2",
+ "0x000000000001764b",
+ "0x0000000000017ad8",
+ "0x00000000000e2946",
+ "0x000000000007d09c",
+ "0x00000000000578e7",
+ "0x000000000004161c",
+ "0x00000000000f2564",
+ "0x00000000000b3c29",
+ "0x00000000000780c1",
+ "0x000000000009379d",
+ "0x000000000006e9d5",
+ "0x00000000000e149c",
+ "0x00000000000d3378",
+ "0x00000000000b0e65",
+ "0x00000000000c7ca5",
+ "0x00000000000b4abb",
+ "0x000000000002db63",
+ "0x0000000000099980",
+ "0x00000000000beb1f",
+ "0x0000000000020c60",
+ "0x000000000002a603",
+ "0x000000000003f823",
+ "0x0000000000034d1d",
+ "0x00000000000bf82f",
+ "0x00000000000f17ef",
+ "0x0000000000034e85",
+ "0x0000000000042090",
+ "0x000000000001bd99",
+ "0x0000000000025754",
+ "0x000000000008358b",
+ "0x00000000000d5888",
+ "0x0000000000051656",
+ "0x00000000000af9cf",
+ "0x000000000004a74c",
+ "0x00000000000bc1ec",
+ "0x0000000000044ca9",
+ "0x0000000000071a02",
+ "0x0000000000024878",
+ "0x0000000000019470",
+ "0x0000000000032cc6",
+ "0x000000000000c269",
+ "0x0000000000072cef",
+ "0x00000000000b8fb4",
+ "0x00000000000bfb9d",
+ "0x0000000000059eac",
+ "0x000000000003c4a4",
+ "0x00000000000886d8",
+ "0x00000000000b26c7",
+ "0x00000000000b6599",
+ "0x000000000004f4b9",
+ "0x00000000000bf154",
+ "0x00000000000e4e3b",
+ "0x000000000006b92d",
+ "0x00000000000d43ab",
+ "0x0000000000001bdd",
+ "0x0000000000031e14",
+ "0x000000000000c6c3",
+ "0x00000000000a4485",
+ "0x000000000000c77b",
+ "0x00000000000167a3",
+ "0x000000000008cfcb",
+ "0x0000000000060d84",
+ "0x000000000003fa29",
+ "0x00000000000b3e74",
+ "0x00000000000b0dd3",
+ "0x00000000000dc94c",
+ "0x000000000008b033",
+ "0x0000000000012e57",
+ "0x000000000005bd3d",
+ "0x000000000005d1f5",
+ "0x00000000000525cf",
+ "0x00000000000abc9b",
+ "0x0000000000086825",
+ "0x0000000000071ea2",
+ "0x00000000000a4013",
+ "0x00000000000a8921",
+ "0x00000000000764fd",
+ "0x00000000000e0219",
+ "0x00000000000b688d",
+ "0x0000000000034e19",
+ "0x00000000000d712d",
+ "0x000000000008ed98",
+ "0x00000000000024ca",
+ "0x0000000000005395",
+ "0x000000000004201b",
+ "0x000000000008e5bc",
+ "0x0000000000033aae",
+ "0x00000000000c9d36",
+ "0x000000000002e925",
+ "0x00000000000d282c",
+ "0x00000000000bd9fa",
+ "0x000000000000ffdc",
+ "0x0000000000005bdd",
+ "0x00000000000346f1",
+ "0x000000000009cbef",
+ "0x00000000000e292b",
+ "0x0000000000025c9b",
+ "0x000000000002721e",
+ "0x0000000000026f88",
+ "0x00000000000697f4",
+ "0x000000000005e4f0",
+ "0x00000000000b0e3e",
+ "0x000000000008cd45",
+ "0x000000000004cf84",
+ "0x000000000003b056",
+ "0x000000000003feb1",
+ "0x000000000002f5ca",
+ "0x00000000000ae6f8",
+ "0x000000000007d574",
+ "0x0000000000069758",
+ "0x000000000004ff61",
+ "0x000000000003c6a7",
+ "0x00000000000bc11c",
+ "0x00000000000b3895",
+ "0x00000000000ba876",
+ "0x0000000000087a9d",
+ "0x0000000000008d44",
+ "0x00000000000078d1",
+ "0x0000000000008de8",
+ "0x00000000000ebc54",
+ "0x000000000008b23d",
+ "0x000000000005e1ac",
+ "0x00000000000b6570",
+ "0x0000000000044649",
+ "0x00000000000873b0",
+ "0x000000000006dad3",
+ "0x000000000001f418",
+ "0x00000000000bc2ad",
+ "0x00000000000afa94",
+ "0x00000000000bec4e",
+ "0x000000000001d70e",
+ "0x000000000005c446",
+ "0x00000000000e3634",
+ "0x0000000000075835",
+ "0x000000000002daa8",
+ "0x0000000000013167",
+ "0x00000000000e5b17",
+ "0x000000000004ea52",
+ "0x00000000000b6069",
+ "0x0000000000004643",
+ "0x000000000001b846",
+ "0x000000000006037a",
+ "0x00000000000210db",
+ "0x00000000000388ff",
+ "0x000000000002c190",
+ "0x00000000000656a5",
+ "0x00000000000f1161",
+ "0x00000000000cf2c8",
+ "0x00000000000b34c8",
+ "0x00000000000609ed",
+ "0x00000000000e4d92",
+ "0x0000000000099731",
+ "0x000000000002e439",
+ "0x00000000000232e9",
+ "0x000000000004d955",
+ "0x000000000003d7d5",
+ "0x000000000009c0fb",
+ "0x00000000000b5ffe",
+ "0x00000000000c19cb",
+ "0x00000000000ac084",
+ "0x000000000005f7bd",
+ "0x00000000000e57b9",
+ "0x00000000000b505d",
+ "0x0000000000071d03",
+ "0x000000000003bcbc",
+ "0x000000000001e2e8",
+ "0x000000000005d6d4",
+ "0x000000000009add0",
+ "0x00000000000b7cd0",
+ "0x0000000000082986",
+ "0x0000000000039b49",
+ "0x00000000000d8926",
+ "0x000000000008f1a3",
+ "0x00000000000afce2",
+ "0x0000000000063160",
+ "0x000000000003f165",
+ "0x00000000000c1f36",
+ "0x00000000000055aa",
+ "0x00000000000d4931",
+ "0x00000000000c1780",
+ "0x00000000000b80bf",
+ "0x0000000000033cd3",
+ "0x000000000003f041",
+ "0x00000000000ca151",
+ "0x00000000000525df",
+ "0x0000000000001810",
+ "0x000000000005746b",
+ "0x00000000000a9a9a",
+ "0x0000000000055e86",
+ "0x00000000000efca5",
+ "0x000000000004f851",
+ "0x00000000000c821c",
+ "0x00000000000b6a59",
+ "0x00000000000dff17",
+ "0x000000000008223b",
+ "0x0000000000013e95",
+ "0x000000000004192a",
+ "0x00000000000de472",
+ "0x000000000007dff6",
+ "0x000000000005adcc",
+ "0x000000000002fc5f",
+ "0x00000000000360b7",
+ "0x00000000000238ce",
+ "0x0000000000057438",
+ "0x0000000000056cfc",
+ "0x000000000002f4cf",
+ "0x00000000000771c2",
+ "0x000000000002fda4",
+ "0x0000000000068f19",
+ "0x00000000000bd541",
+ "0x000000000001f6db",
+ "0x000000000009041e",
+ "0x00000000000edc19",
+ "0x00000000000eceb0",
+ "0x000000000003008e",
+ "0x000000000002ba9a",
+ "0x0000000000010db1",
+ "0x00000000000de8ba",
+ "0x00000000000a3c9b",
+ "0x00000000000bfa4a",
+ "0x00000000000be6c0",
+ "0x00000000000e8c71",
+ "0x00000000000a9921",
+ "0x00000000000cee0b",
+ "0x00000000000ca443",
+ "0x00000000000d7f02",
+ "0x000000000003ac5f",
+ "0x00000000000bf01b",
+ "0x00000000000c20fa",
+ "0x00000000000d380f",
+ "0x00000000000c9e4d",
+ "0x00000000000180cd",
+ "0x00000000000e8905",
+ "0x000000000001f93f",
+ "0x0000000000089cdf",
+ "0x00000000000e547a",
+ "0x00000000000b1a50",
+ "0x000000000008be1a",
+ "0x00000000000f30ee",
+ "0x0000000000086cc8",
+ "0x0000000000094518",
+ "0x00000000000d791a",
+ "0x0000000000048c3e",
+ "0x00000000000de4af",
+ "0x000000000008df9d",
+ "0x000000000006ae5e",
+ "0x00000000000a14d5",
+ "0x000000000006d962",
+ "0x0000000000047205",
+ "0x000000000004c899",
+ "0x00000000000a8798",
+ "0x000000000007ad56",
+ "0x0000000000014460",
+ "0x00000000000c3e10",
+ "0x00000000000f2420",
+ "0x000000000009acb4",
+ "0x00000000000087bb",
+ "0x00000000000603ec",
+ "0x000000000006a0b1",
+ "0x000000000001da42",
+ "0x0000000000034c9c",
+ "0x00000000000caff6",
+ "0x00000000000354f9",
+ "0x0000000000096c46",
+ "0x0000000000057083",
+ "0x0000000000079cd9",
+ "0x00000000000b5e9a",
+ "0x00000000000e0db3",
+ "0x00000000000aa55d",
+ "0x00000000000974c2",
+ "0x0000000000049e3f",
+ "0x00000000000c359e",
+ "0x000000000008d01b",
+ "0x00000000000835b0",
+ "0x00000000000af0e8",
+ "0x00000000000e0d05",
+ "0x00000000000be58a",
+ "0x00000000000cdbc9",
+ "0x000000000007ca54",
+ "0x0000000000039c11",
+ "0x00000000000e87c0",
+ "0x00000000000c4b1e",
+ "0x00000000000c8658",
+ "0x00000000000a9f72",
+ "0x00000000000a7aa4",
+ "0x00000000000b9110",
+ "0x000000000007ce2b",
+ "0x0000000000053d7d",
+ "0x000000000003b078",
+ "0x000000000000bcda",
+ "0x000000000002a09b",
+ "0x000000000001db0e",
+ "0x0000000000067991",
+ "0x0000000000003fe9",
+ "0x00000000000415f9",
+ "0x000000000003e506",
+ "0x0000000000056e5f",
+ "0x00000000000d8fe4",
+ "0x0000000000051e74",
+ "0x0000000000098f8a",
+ "0x0000000000013f2a",
+ "0x00000000000d4d5a",
+ "0x0000000000012153",
+ "0x00000000000db604",
+ "0x00000000000ee9a5",
+ "0x000000000009040e",
+ "0x00000000000912b8",
+ "0x000000000005f9bd",
+ "0x000000000001302b",
+ "0x0000000000035e26",
+ "0x00000000000cf5ba",
+ "0x00000000000894a3",
+ "0x00000000000dcc46",
+ "0x0000000000039919",
+ "0x00000000000b9c18",
+ "0x00000000000f3214",
+ "0x00000000000e8b22",
+ "0x0000000000032bea",
+ "0x00000000000e7f8d",
+ "0x00000000000596ca",
+ "0x0000000000062482",
+ "0x000000000004628a",
+ "0x0000000000055c65",
+ "0x00000000000379e9",
+ "0x000000000007dbc1",
+ "0x0000000000079900",
+ "0x00000000000735ee",
+ "0x00000000000b2c09",
+ "0x00000000000a8df2",
+ "0x000000000008dabc",
+ "0x0000000000025a6c",
+ "0x0000000000022e94",
+ "0x00000000000ba9b4",
+ "0x0000000000021f4f",
+ "0x000000000006d53c",
+ "0x0000000000002342",
+ "0x00000000000e2e9b",
+ "0x0000000000016994",
+ "0x00000000000c9e77",
+ "0x00000000000d15e5",
+ "0x00000000000c24ae",
+ "0x0000000000025dd9",
+ "0x0000000000018e04",
+ "0x000000000007cb13",
+ "0x0000000000049278",
+ "0x00000000000c0f05",
+ "0x000000000004fc18",
+ "0x000000000002478f",
+ "0x000000000000b0b8",
+ "0x000000000009ee4d",
+ "0x0000000000020f64",
+ "0x0000000000025419",
+ "0x0000000000048471",
+ "0x000000000009e94b",
+ "0x0000000000034384",
+ "0x00000000000c199a",
+ "0x000000000002c655",
+ "0x000000000004608d"
+ ],
+ "r": [
+ "0x0000000000013542",
+ "0x00000000000ad2e5",
+ "0x00000000000529de",
+ "0x00000000000b1eef",
+ "0x0000000000039784",
+ "0x000000000004aa38",
+ "0x000000000002616b",
+ "0x000000000000e5a0",
+ "0x00000000000edb83",
+ "0x0000000000037b8e",
+ "0x00000000000c69c2",
+ "0x000000000007cd19",
+ "0x000000000007f3df",
+ "0x00000000000c9f93",
+ "0x0000000000086bc7",
+ "0x00000000000d7e6a",
+ "0x00000000000f17a7",
+ "0x00000000000ccef7",
+ "0x0000000000007644",
+ "0x00000000000c8a55",
+ "0x000000000002101a",
+ "0x000000000007241d",
+ "0x000000000003f823",
+ "0x000000000008e79a",
+ "0x00000000000cca62",
+ "0x0000000000021e6a",
+ "0x00000000000b17b1",
+ "0x000000000001775b",
+ "0x00000000000161f5",
+ "0x000000000007c42d",
+ "0x0000000000053d2e",
+ "0x00000000000d9fdf",
+ "0x000000000002d6f4",
+ "0x0000000000048152",
+ "0x00000000000e3587",
+ "0x000000000003dd2f",
+ "0x000000000007caae",
+ "0x000000000006b785",
+ "0x0000000000097274",
+ "0x0000000000082b7f",
+ "0x000000000000a78c",
+ "0x0000000000073edd",
+ "0x00000000000ea545",
+ "0x00000000000c2bc3",
+ "0x0000000000063129",
+ "0x00000000000337e0",
+ "0x000000000003c1dc",
+ "0x000000000008570e",
+ "0x00000000000825df",
+ "0x000000000007f5af",
+ "0x00000000000633a4",
+ "0x00000000000a2b76",
+ "0x00000000000b6e78",
+ "0x000000000007933a",
+ "0x00000000000199cb",
+ "0x000000000008a5bd",
+ "0x00000000000763d7",
+ "0x00000000000428c8",
+ "0x00000000000ee791",
+ "0x00000000000547e6",
+ "0x00000000000b106c",
+ "0x000000000007eccb",
+ "0x00000000000aea76",
+ "0x000000000006ac56",
+ "0x00000000000ef447",
+ "0x00000000000bbc10",
+ "0x00000000000d8885",
+ "0x00000000000f34a7",
+ "0x0000000000081d2f",
+ "0x000000000002e1ac",
+ "0x00000000000dc39d",
+ "0x000000000002cd5f",
+ "0x00000000000ce2c7",
+ "0x00000000000c8123",
+ "0x000000000004a047",
+ "0x00000000000a6ef2",
+ "0x00000000000bb829",
+ "0x00000000000980b2",
+ "0x000000000001985f",
+ "0x0000000000077952",
+ "0x00000000000af351",
+ "0x00000000000376c2",
+ "0x00000000000c84c1",
+ "0x000000000001c7e5",
+ "0x0000000000047239",
+ "0x0000000000021a8f",
+ "0x000000000006c9c3",
+ "0x0000000000016767",
+ "0x00000000000a8687",
+ "0x00000000000966a9",
+ "0x0000000000057de0",
+ "0x00000000000c6ccb",
+ "0x00000000000df1a8",
+ "0x000000000003179c",
+ "0x00000000000dd3b1",
+ "0x00000000000029f3",
+ "0x00000000000db26c",
+ "0x000000000002459b",
+ "0x00000000000e880b",
+ "0x00000000000d1c38",
+ "0x00000000000e3caa",
+ "0x0000000000062958",
+ "0x000000000005e6b5",
+ "0x00000000000e6b19",
+ "0x0000000000038511",
+ "0x00000000000160c2",
+ "0x00000000000a55d5",
+ "0x0000000000096035",
+ "0x00000000000e0d3e",
+ "0x000000000004e3c9",
+ "0x00000000000d4d8b",
+ "0x00000000000a32f7",
+ "0x00000000000cbafa",
+ "0x000000000007934a",
+ "0x00000000000da9c3",
+ "0x000000000001db26",
+ "0x00000000000b9219",
+ "0x0000000000023f4d",
+ "0x00000000000eba12",
+ "0x00000000000a487c",
+ "0x000000000000ce8b",
+ "0x00000000000bed48",
+ "0x000000000000484e",
+ "0x000000000001c043",
+ "0x00000000000cd6b8",
+ "0x00000000000644ec",
+ "0x000000000000bcfd",
+ "0x0000000000072b4a",
+ "0x00000000000dd374",
+ "0x0000000000042ea7",
+ "0x0000000000057760",
+ "0x0000000000021331",
+ "0x00000000000175d3",
+ "0x000000000002a5dd",
+ "0x0000000000029cdb",
+ "0x00000000000b2f3b",
+ "0x00000000000a5e5d",
+ "0x00000000000a6990",
+ "0x00000000000e0565",
+ "0x000000000006c147",
+ "0x000000000009dfed",
+ "0x000000000009b856",
+ "0x00000000000a87f5",
+ "0x00000000000bbc9e",
+ "0x000000000006a832",
+ "0x00000000000dcc7f",
+ "0x0000000000001f32",
+ "0x00000000000b6d58",
+ "0x00000000000a1298",
+ "0x00000000000daec3",
+ "0x00000000000854f5",
+ "0x00000000000541ba",
+ "0x0000000000063711",
+ "0x000000000006209e",
+ "0x000000000005171f",
+ "0x000000000001a862",
+ "0x00000000000d5c4f",
+ "0x0000000000061632",
+ "0x0000000000061938",
+ "0x00000000000573ee",
+ "0x00000000000bb0c0",
+ "0x0000000000066fbc",
+ "0x000000000006ee80",
+ "0x00000000000237af",
+ "0x00000000000c506f",
+ "0x00000000000cb5d5",
+ "0x0000000000045b85",
+ "0x0000000000095fc3",
+ "0x00000000000c7798",
+ "0x000000000006d637",
+ "0x00000000000146e5",
+ "0x00000000000de3a5",
+ "0x0000000000068ef1",
+ "0x00000000000be748",
+ "0x0000000000072806",
+ "0x00000000000e12f8",
+ "0x00000000000abbb2",
+ "0x0000000000067ec8",
+ "0x0000000000049426",
+ "0x0000000000056f1c",
+ "0x0000000000005db4",
+ "0x00000000000cc020",
+ "0x000000000009f59b",
+ "0x0000000000086d6b",
+ "0x0000000000010ccd",
+ "0x0000000000082eed",
+ "0x00000000000b9457",
+ "0x00000000000efe5e",
+ "0x00000000000d6eb7",
+ "0x000000000007f5ee",
+ "0x00000000000bae4d",
+ "0x00000000000f2f05",
+ "0x0000000000013c53",
+ "0x00000000000d636f",
+ "0x000000000003729b",
+ "0x00000000000da293",
+ "0x000000000005f1ce",
+ "0x00000000000f2593",
+ "0x000000000009d988",
+ "0x00000000000ca090",
+ "0x000000000001b663",
+ "0x000000000004b931",
+ "0x00000000000545b0",
+ "0x00000000000a0d90",
+ "0x0000000000062025",
+ "0x000000000009d11b",
+ "0x00000000000bd8f4",
+ "0x00000000000edb5b",
+ "0x0000000000061607",
+ "0x000000000005e874",
+ "0x0000000000085bd9",
+ "0x00000000000e369d",
+ "0x00000000000c82f6",
+ "0x000000000002ea2b",
+ "0x0000000000065035",
+ "0x0000000000001f4e",
+ "0x00000000000916f8",
+ "0x00000000000a8d60",
+ "0x000000000003b625",
+ "0x00000000000cdc0b",
+ "0x00000000000b12b8",
+ "0x0000000000085ffc",
+ "0x0000000000045c64",
+ "0x00000000000e2c97",
+ "0x000000000009fff1",
+ "0x0000000000077ba7",
+ "0x0000000000064fcc",
+ "0x00000000000e7dbb",
+ "0x00000000000abc1b",
+ "0x000000000001da23",
+ "0x00000000000e2bc5",
+ "0x0000000000055774",
+ "0x0000000000061ca6",
+ "0x00000000000d9147",
+ "0x0000000000034012",
+ "0x000000000006ac8a",
+ "0x000000000003beb5",
+ "0x0000000000067ec7",
+ "0x000000000009a4d8",
+ "0x0000000000041fcb",
+ "0x0000000000037b61",
+ "0x000000000008edc7",
+ "0x000000000006edbc",
+ "0x0000000000046535",
+ "0x0000000000085499",
+ "0x0000000000006ffe",
+ "0x000000000005166e",
+ "0x00000000000f1017",
+ "0x00000000000548a6",
+ "0x0000000000039891",
+ "0x00000000000b541a",
+ "0x000000000007ec23",
+ "0x00000000000baa0b",
+ "0x00000000000a277b",
+ "0x0000000000067f05",
+ "0x0000000000088f67",
+ "0x0000000000004198",
+ "0x00000000000f23d7",
+ "0x0000000000092510",
+ "0x00000000000ba052",
+ "0x00000000000630d4",
+ "0x0000000000072639",
+ "0x000000000009dc04",
+ "0x0000000000097556",
+ "0x00000000000ba6f6",
+ "0x00000000000d262e",
+ "0x00000000000bb96d",
+ "0x000000000003fde5",
+ "0x00000000000b047d",
+ "0x00000000000caef9",
+ "0x0000000000092430",
+ "0x00000000000aa112",
+ "0x000000000004e09e",
+ "0x00000000000476bc",
+ "0x0000000000026eb9",
+ "0x0000000000047b4e",
+ "0x0000000000091ea5",
+ "0x00000000000cb6fa",
+ "0x000000000000ebc6",
+ "0x000000000000f4da",
+ "0x000000000002f42c",
+ "0x000000000006b56a",
+ "0x0000000000061b14",
+ "0x000000000006daf1",
+ "0x0000000000047a3e",
+ "0x00000000000bc567",
+ "0x000000000008fd3e",
+ "0x00000000000c2df0",
+ "0x0000000000052288",
+ "0x0000000000087464",
+ "0x000000000009fb81",
+ "0x000000000007cafb",
+ "0x0000000000042dcc",
+ "0x000000000009efa1",
+ "0x000000000003bf23",
+ "0x0000000000043cee",
+ "0x00000000000d9ae2",
+ "0x00000000000919b9",
+ "0x0000000000033adb",
+ "0x00000000000cf195",
+ "0x00000000000a6dd1",
+ "0x000000000005b716",
+ "0x00000000000c2d1b",
+ "0x000000000003e668",
+ "0x000000000008521c",
+ "0x0000000000099f77",
+ "0x00000000000a7da5",
+ "0x0000000000006e80",
+ "0x000000000002e1dc",
+ "0x0000000000069146",
+ "0x00000000000171d3",
+ "0x000000000008057c",
+ "0x00000000000af9f6",
+ "0x00000000000ec7ab",
+ "0x00000000000d24e6",
+ "0x00000000000ca25d",
+ "0x0000000000005e2e",
+ "0x00000000000dcb6f",
+ "0x0000000000094197",
+ "0x00000000000dba04",
+ "0x00000000000ec4c1",
+ "0x00000000000a86eb",
+ "0x0000000000077de6",
+ "0x00000000000a3c77",
+ "0x0000000000041d4e",
+ "0x00000000000159a3",
+ "0x000000000008121a",
+ "0x00000000000552b3",
+ "0x000000000008012f",
+ "0x00000000000cf7d0",
+ "0x00000000000a2eb6",
+ "0x0000000000061d26",
+ "0x00000000000d4678",
+ "0x000000000007815f",
+ "0x000000000002c0bd",
+ "0x000000000003c3d9",
+ "0x0000000000083dad",
+ "0x00000000000c8676",
+ "0x0000000000074cc9",
+ "0x00000000000e2ba3",
+ "0x00000000000f1131",
+ "0x0000000000041aaf",
+ "0x00000000000982b3",
+ "0x00000000000bdfba",
+ "0x00000000000acd42",
+ "0x0000000000070646",
+ "0x000000000004a882",
+ "0x0000000000045a23",
+ "0x00000000000a6120",
+ "0x00000000000bdb7d",
+ "0x000000000007cec2",
+ "0x000000000008bd22",
+ "0x000000000001e972",
+ "0x000000000002c34c",
+ "0x000000000000b23d",
+ "0x000000000002a57f",
+ "0x0000000000030bd3",
+ "0x00000000000c3bf2",
+ "0x00000000000ad827",
+ "0x00000000000eee59",
+ "0x00000000000dd88f",
+ "0x0000000000051292",
+ "0x000000000009f5b9",
+ "0x00000000000cc1dc",
+ "0x000000000008dbcb",
+ "0x000000000009c87c",
+ "0x00000000000ec71e",
+ "0x000000000004e18c",
+ "0x0000000000094e92",
+ "0x00000000000f354f",
+ "0x000000000008b225",
+ "0x000000000005562c",
+ "0x0000000000017b04",
+ "0x00000000000476e6",
+ "0x00000000000c7077",
+ "0x00000000000b0abe",
+ "0x000000000002335f",
+ "0x00000000000243bc",
+ "0x00000000000c7738",
+ "0x00000000000120fa",
+ "0x00000000000a36ff",
+ "0x00000000000a6578",
+ "0x0000000000075edf",
+ "0x000000000000783c",
+ "0x00000000000efc70",
+ "0x0000000000028047",
+ "0x000000000008a347",
+ "0x000000000004360c",
+ "0x00000000000d31a6",
+ "0x0000000000041414",
+ "0x0000000000081002",
+ "0x0000000000043f8f",
+ "0x00000000000e70cc",
+ "0x0000000000040a2e",
+ "0x00000000000b84bb",
+ "0x00000000000c127a",
+ "0x000000000009dad1",
+ "0x000000000009dec8",
+ "0x00000000000e4c2f",
+ "0x000000000009bd43",
+ "0x000000000006ccaf",
+ "0x000000000003d3eb",
+ "0x000000000004bddd",
+ "0x0000000000074ed4",
+ "0x00000000000ca40f",
+ "0x000000000007dff4",
+ "0x000000000008c1e7",
+ "0x00000000000dac42",
+ "0x000000000008bd20",
+ "0x00000000000988c0",
+ "0x000000000008ae86",
+ "0x000000000001809b",
+ "0x00000000000e7ffe",
+ "0x00000000000541b0",
+ "0x00000000000df5b5",
+ "0x0000000000038148",
+ "0x000000000004deb1",
+ "0x000000000006e8db",
+ "0x0000000000067114",
+ "0x000000000001c63a",
+ "0x00000000000c5883",
+ "0x00000000000628d8",
+ "0x00000000000ce34f",
+ "0x00000000000cc0a2",
+ "0x0000000000076c1a",
+ "0x00000000000a8124",
+ "0x00000000000691d1",
+ "0x0000000000022a17",
+ "0x000000000004f7e3",
+ "0x0000000000081ed8",
+ "0x00000000000bee69",
+ "0x000000000002b0e3",
+ "0x000000000007e1ac",
+ "0x00000000000d1b1f",
+ "0x00000000000e9596",
+ "0x0000000000019fe7",
+ "0x000000000009a063",
+ "0x0000000000079068",
+ "0x00000000000be032",
+ "0x00000000000a1f89",
+ "0x0000000000090b6e",
+ "0x000000000004616b",
+ "0x00000000000c74b4",
+ "0x0000000000065964",
+ "0x00000000000251aa",
+ "0x0000000000032489",
+ "0x000000000009370d",
+ "0x000000000005183f",
+ "0x0000000000008129",
+ "0x0000000000000c5b",
+ "0x00000000000259dc",
+ "0x0000000000091623",
+ "0x0000000000036a50",
+ "0x000000000004c7f9",
+ "0x00000000000b0acd",
+ "0x00000000000315d6",
+ "0x00000000000c0d08",
+ "0x00000000000d8699",
+ "0x0000000000035870",
+ "0x00000000000af7af",
+ "0x0000000000028f55",
+ "0x00000000000acf38",
+ "0x00000000000f05c6",
+ "0x0000000000052cd5",
+ "0x00000000000b2d16",
+ "0x000000000006577e",
+ "0x000000000005b3c6",
+ "0x00000000000ae11f",
+ "0x0000000000091196",
+ "0x000000000001bbca",
+ "0x000000000009dca0",
+ "0x00000000000cacda",
+ "0x00000000000f2719",
+ "0x0000000000036804",
+ "0x000000000007c41c",
+ "0x0000000000092c2e",
+ "0x00000000000cc7d9",
+ "0x00000000000e5d9a",
+ "0x0000000000099681",
+ "0x00000000000df992",
+ "0x00000000000b03d3",
+ "0x0000000000075454",
+ "0x0000000000070a12",
+ "0x000000000003e7d2",
+ "0x00000000000ca0b0",
+ "0x000000000008623e",
+ "0x0000000000057c0a",
+ "0x00000000000056c5",
+ "0x000000000001f93b",
+ "0x0000000000040199",
+ "0x00000000000a63bb",
+ "0x0000000000029100",
+ "0x0000000000036d0b",
+ "0x000000000008b191",
+ "0x00000000000a291c",
+ "0x0000000000024ae6",
+ "0x0000000000007810",
+ "0x00000000000953ac",
+ "0x0000000000068286",
+ "0x00000000000717dd",
+ "0x00000000000e7e8c",
+ "0x00000000000dc946",
+ "0x0000000000064e1f",
+ "0x000000000002c8ba",
+ "0x0000000000081902",
+ "0x0000000000066ff7",
+ "0x00000000000daef4",
+ "0x0000000000066a5b",
+ "0x0000000000037ff5",
+ "0x00000000000a0694",
+ "0x0000000000097a5c",
+ "0x000000000005a5b5"
+ ],
+ "cmt": [
+ "0x0000000001d9d72a",
+ "0x0000000003b2cf63",
+ "0x00000000031a68da",
+ "0x0000000003b9ea28",
+ "0x00000000016199db",
+ "0x0000000003c9962b",
+ "0x00000000008d648c",
+ "0x00000000003d93f3",
+ "0x0000000001ab1913",
+ "0x0000000003bcdcc7",
+ "0x00000000018e3f2c",
+ "0x00000000018f83c9",
+ "0x000000000358e2ac",
+ "0x000000000342a59a",
+ "0x0000000000061a16",
+ "0x0000000003cf3ab1",
+ "0x00000000024cd0b2",
+ "0x0000000000d5ef8d",
+ "0x0000000002b94cca",
+ "0x000000000125a568",
+ "0x0000000001e1102d",
+ "0x0000000002c2fa51",
+ "0x0000000000be838a",
+ "0x0000000000bffd8a",
+ "0x0000000001657b4b",
+ "0x0000000001e34ca4",
+ "0x0000000000db9e46",
+ "0x00000000001294d2",
+ "0x00000000023c8195",
+ "0x0000000000f1838c",
+ "0x0000000002313875",
+ "0x0000000003709060",
+ "0x0000000001f3be45",
+ "0x000000000386e2ad",
+ "0x0000000002d11a85",
+ "0x000000000348b022",
+ "0x0000000001586a12",
+ "0x0000000003722637",
+ "0x00000000002c97fa",
+ "0x0000000002695db5",
+ "0x00000000037455f9",
+ "0x00000000010851dd",
+ "0x0000000001a59e3a",
+ "0x0000000000dc4633",
+ "0x00000000035c052b",
+ "0x0000000002a64244",
+ "0x00000000032acdd2",
+ "0x000000000379fb38",
+ "0x0000000001f653ed",
+ "0x0000000001996a28",
+ "0x000000000269b8de",
+ "0x0000000001d4dd34",
+ "0x0000000003dcb1c3",
+ "0x0000000003c66ffe",
+ "0x00000000036b501c",
+ "0x000000000224b8fa",
+ "0x000000000101b7e6",
+ "0x000000000181cf8e",
+ "0x0000000001c23f8e",
+ "0x00000000007b010f",
+ "0x000000000311e2d4",
+ "0x00000000005c1d5b",
+ "0x00000000034bb51a",
+ "0x00000000033d43f2",
+ "0x0000000000462d23",
+ "0x0000000003992bcd",
+ "0x000000000029f415",
+ "0x0000000002de2911",
+ "0x0000000002b5fea9",
+ "0x00000000035c1c73",
+ "0x00000000009bbb40",
+ "0x000000000116133e",
+ "0x0000000002985ddc",
+ "0x00000000015b221c",
+ "0x00000000019f7519",
+ "0x000000000266135c",
+ "0x0000000001ba518a",
+ "0x0000000000b98b18",
+ "0x00000000011b820d",
+ "0x000000000109f894",
+ "0x000000000125c04c",
+ "0x00000000039296d5",
+ "0x00000000018a033a",
+ "0x0000000003b3e59b",
+ "0x00000000037e146d",
+ "0x0000000001d9e305",
+ "0x00000000036026c5",
+ "0x000000000014d1b3",
+ "0x0000000003c4dffd",
+ "0x00000000029f0686",
+ "0x000000000049e89f",
+ "0x00000000021ad896",
+ "0x00000000018a57da",
+ "0x000000000001af03",
+ "0x0000000001c5207f",
+ "0x00000000037d7e63",
+ "0x00000000006df84c",
+ "0x000000000090e91e",
+ "0x00000000028d58af",
+ "0x00000000002456e5",
+ "0x000000000388b986",
+ "0x000000000294c92f",
+ "0x00000000025030db",
+ "0x0000000000c8259e",
+ "0x0000000003860b61",
+ "0x000000000137749c",
+ "0x00000000038c0840",
+ "0x00000000003c0e8b",
+ "0x000000000296bb94",
+ "0x0000000003719217",
+ "0x000000000274a569",
+ "0x00000000028f87b7",
+ "0x00000000037297de",
+ "0x0000000001f3cc7b",
+ "0x000000000261294b",
+ "0x0000000000a3ea3e",
+ "0x0000000003a93b43",
+ "0x0000000003442a75",
+ "0x0000000002e4cc20",
+ "0x000000000289c7bf",
+ "0x000000000190422e",
+ "0x000000000132767c",
+ "0x00000000030979eb",
+ "0x000000000288e35f",
+ "0x000000000291a21c",
+ "0x00000000021f9f91",
+ "0x00000000009714c3",
+ "0x000000000129d15a",
+ "0x000000000363221f",
+ "0x000000000200421b",
+ "0x0000000002a639a1",
+ "0x00000000001b49cd",
+ "0x0000000001ae45f0",
+ "0x0000000001d2a2f2",
+ "0x0000000003891d46",
+ "0x00000000035ef922",
+ "0x0000000000d2dba5",
+ "0x00000000008a7373",
+ "0x000000000034f59e",
+ "0x000000000356b73a",
+ "0x0000000000229977",
+ "0x0000000002f30602",
+ "0x0000000002404d35",
+ "0x00000000026325ad",
+ "0x00000000023a3e2b",
+ "0x00000000019b5765",
+ "0x0000000000b9f06a",
+ "0x00000000024dca88",
+ "0x000000000192fd7e",
+ "0x00000000005d9ac6",
+ "0x0000000003e8c66d",
+ "0x00000000023a08c4",
+ "0x0000000001727a0b",
+ "0x0000000000e834e7",
+ "0x00000000018590e9",
+ "0x0000000002a88978",
+ "0x00000000017fb425",
+ "0x0000000001ade22c",
+ "0x00000000009aa2b9",
+ "0x0000000003f6850a",
+ "0x0000000002d1e513",
+ "0x0000000001312eb5",
+ "0x0000000001a58926",
+ "0x0000000003892d27",
+ "0x00000000020d2ec0",
+ "0x00000000026a960f",
+ "0x0000000002287230",
+ "0x0000000002dec6dc",
+ "0x0000000001929f68",
+ "0x0000000002986779",
+ "0x00000000005e54bb",
+ "0x00000000016ab5cc",
+ "0x000000000142a3cc",
+ "0x0000000003705056",
+ "0x00000000002e7e0d",
+ "0x0000000002929400",
+ "0x000000000260bf78",
+ "0x0000000003298bad",
+ "0x0000000002fec9e8",
+ "0x0000000003ee71ea",
+ "0x00000000038c8329",
+ "0x0000000001652a4e",
+ "0x0000000000bad4e7",
+ "0x0000000003a510fc",
+ "0x00000000009ffef5",
+ "0x0000000001827072",
+ "0x0000000000a0694c",
+ "0x0000000001a262e7",
+ "0x0000000002ae9382",
+ "0x0000000002ce85cf",
+ "0x0000000000cd92a0",
+ "0x0000000003bf3871",
+ "0x0000000002917fdb",
+ "0x00000000025f904c",
+ "0x00000000025d22ec",
+ "0x0000000003fba152",
+ "0x0000000003b49cca",
+ "0x0000000000b796d4",
+ "0x000000000277ca65",
+ "0x00000000027d6c99",
+ "0x00000000012d30a7",
+ "0x0000000000edb229",
+ "0x0000000001d7631e",
+ "0x0000000001bb1243",
+ "0x000000000394df70",
+ "0x0000000002399e1a",
+ "0x000000000109f947",
+ "0x0000000002a46f53",
+ "0x0000000002579138",
+ "0x000000000106bf0b",
+ "0x0000000003b9f55a",
+ "0x0000000003124f39",
+ "0x00000000018a1efb",
+ "0x0000000002218999",
+ "0x00000000021f1119",
+ "0x00000000023aec5d",
+ "0x00000000033b4628",
+ "0x0000000000f7c8b0",
+ "0x0000000000075391",
+ "0x00000000000f7926",
+ "0x0000000000f7c0df",
+ "0x0000000002a722ad",
+ "0x0000000000cc9dc3",
+ "0x00000000019a9fe7",
+ "0x0000000001891d39",
+ "0x0000000002c8b2f9",
+ "0x0000000002bb97d9",
+ "0x00000000028192ca",
+ "0x00000000018c7dee",
+ "0x0000000001456d31",
+ "0x000000000111ac00",
+ "0x0000000000501a86",
+ "0x000000000225dcd9",
+ "0x00000000020a4126",
+ "0x0000000002ad0c68",
+ "0x0000000003b96979",
+ "0x00000000022e82fd",
+ "0x0000000002b042fc",
+ "0x000000000137db8d",
+ "0x0000000003cc94e3",
+ "0x0000000001f01f75",
+ "0x0000000003169a44",
+ "0x000000000284260e",
+ "0x0000000001df6f86",
+ "0x00000000030bf851",
+ "0x0000000002697d99",
+ "0x0000000003867cf3",
+ "0x00000000018a7d66",
+ "0x0000000001f70459",
+ "0x0000000003725dfa",
+ "0x00000000000be667",
+ "0x00000000028ba780",
+ "0x00000000016bf4ad",
+ "0x00000000003a9b5d",
+ "0x00000000009f7f1e",
+ "0x000000000150c9eb",
+ "0x0000000002b33d5f",
+ "0x00000000030d5137",
+ "0x00000000021cf355",
+ "0x0000000002619cdb",
+ "0x0000000000c45a51",
+ "0x00000000034c73b6",
+ "0x0000000003303179",
+ "0x0000000002e03b78",
+ "0x0000000000368b0c",
+ "0x000000000347e0df",
+ "0x0000000003d64ae3",
+ "0x00000000023afa66",
+ "0x00000000033f6f05",
+ "0x000000000216540a",
+ "0x00000000024739b6",
+ "0x0000000002fab297",
+ "0x0000000001cede16",
+ "0x000000000043fa72",
+ "0x000000000280104f",
+ "0x00000000021c26f2",
+ "0x0000000000427c80",
+ "0x00000000010444ec",
+ "0x0000000003b097af",
+ "0x000000000060e784",
+ "0x000000000085be8d",
+ "0x000000000261dfa9",
+ "0x0000000003424ad6",
+ "0x0000000000868d8e",
+ "0x0000000002afcb1c",
+ "0x0000000002cd5253",
+ "0x00000000036e4375",
+ "0x000000000395e988",
+ "0x0000000002c93271",
+ "0x0000000003abc61d",
+ "0x0000000001bfff51",
+ "0x00000000000e1767",
+ "0x000000000389f314",
+ "0x0000000003d7bd1e",
+ "0x000000000146653e",
+ "0x0000000000ffac4b",
+ "0x0000000001fcf239",
+ "0x0000000003bf7965",
+ "0x000000000358a3c3",
+ "0x0000000002070b58",
+ "0x000000000392460d",
+ "0x000000000033222b",
+ "0x000000000251d069",
+ "0x0000000003adc099",
+ "0x0000000000893704",
+ "0x0000000002645665",
+ "0x0000000001c24920",
+ "0x0000000003c0d2f8",
+ "0x000000000396a04b",
+ "0x0000000000de6c39",
+ "0x0000000003467df4",
+ "0x00000000017d6f44",
+ "0x00000000026c9f37",
+ "0x00000000022d22f3",
+ "0x000000000140825b",
+ "0x00000000028320f2",
+ "0x0000000001559bac",
+ "0x0000000000371aa6",
+ "0x00000000017d9f03",
+ "0x00000000034be911",
+ "0x0000000003f6e611",
+ "0x0000000001b7abbb",
+ "0x0000000003d474be",
+ "0x000000000361fe09",
+ "0x00000000012310c1",
+ "0x00000000034853cc",
+ "0x000000000350c65f",
+ "0x000000000367361f",
+ "0x0000000003c229e6",
+ "0x00000000021d4085",
+ "0x0000000002c5ecd0",
+ "0x00000000031f85b1",
+ "0x00000000005c8257",
+ "0x0000000002ee523a",
+ "0x00000000022d309c",
+ "0x0000000000ff8433",
+ "0x000000000217eabb",
+ "0x0000000001f23a93",
+ "0x00000000006ff4a3",
+ "0x000000000086abb9",
+ "0x00000000001f987f",
+ "0x00000000002e803a",
+ "0x0000000002a0ff9c",
+ "0x00000000004500d3",
+ "0x0000000002d49698",
+ "0x00000000005f2294",
+ "0x000000000063ecea",
+ "0x0000000002ca41ab",
+ "0x0000000000770898",
+ "0x000000000198b1dc",
+ "0x00000000023b8a5b",
+ "0x0000000000798018",
+ "0x0000000002eaa119",
+ "0x0000000002af19ed",
+ "0x0000000000bc9509",
+ "0x0000000000429d10",
+ "0x0000000002d89d98",
+ "0x0000000000b3d183",
+ "0x000000000129a0a3",
+ "0x0000000001f84459",
+ "0x00000000030e587b",
+ "0x0000000001999259",
+ "0x00000000002ff2ed",
+ "0x00000000038435d3",
+ "0x0000000003082be3",
+ "0x00000000000a39e8",
+ "0x00000000036294f5",
+ "0x00000000018eb425",
+ "0x0000000000b1cbee",
+ "0x0000000001d56423",
+ "0x00000000002f7e8b",
+ "0x00000000039ff6b5",
+ "0x00000000005b8283",
+ "0x000000000261232c",
+ "0x0000000002ef64c3",
+ "0x0000000000619bff",
+ "0x0000000003fdec5b",
+ "0x0000000001a02c79",
+ "0x00000000014e4273",
+ "0x0000000001b6a6fa",
+ "0x000000000077e5d0",
+ "0x00000000013d8442",
+ "0x0000000002b9eb0a",
+ "0x000000000071a339",
+ "0x00000000012bf7b5",
+ "0x0000000002b2c0a9",
+ "0x00000000011af0c1",
+ "0x0000000001d83544",
+ "0x0000000003e4b888",
+ "0x0000000003612795",
+ "0x00000000028cefde",
+ "0x0000000001a94b47",
+ "0x00000000029319a9",
+ "0x000000000258ab86",
+ "0x00000000023c4fab",
+ "0x00000000007757a4",
+ "0x00000000030cb14a",
+ "0x0000000000f52ecb",
+ "0x000000000190c62c",
+ "0x000000000360dfed",
+ "0x00000000035b8a44",
+ "0x0000000000723abc",
+ "0x000000000042b9c4",
+ "0x000000000102fa17",
+ "0x000000000131975b",
+ "0x000000000310cf9c",
+ "0x0000000000e0cefb",
+ "0x000000000170af19",
+ "0x000000000157bed4",
+ "0x000000000291182f",
+ "0x0000000000110469",
+ "0x0000000000265609",
+ "0x000000000356cb6a",
+ "0x0000000003c86adc",
+ "0x0000000003ada58a",
+ "0x000000000259ca76",
+ "0x0000000000c2f38c",
+ "0x00000000014b9b32",
+ "0x00000000013cf555",
+ "0x0000000001542dc9",
+ "0x00000000011a38a6",
+ "0x0000000002ba5cdd",
+ "0x000000000066d3da",
+ "0x0000000000f21df5",
+ "0x0000000001d0129a",
+ "0x0000000002a3133e",
+ "0x0000000000db60df",
+ "0x000000000201a92a",
+ "0x0000000001230984",
+ "0x00000000018961c3",
+ "0x0000000000403176",
+ "0x0000000001105939",
+ "0x0000000003f248da",
+ "0x000000000082c03f",
+ "0x0000000001f6bad5",
+ "0x0000000002b62345",
+ "0x0000000000c33fc5",
+ "0x0000000002fda9d5",
+ "0x00000000000fda28",
+ "0x0000000003f2610c",
+ "0x00000000019ee0bc",
+ "0x0000000003ea038f",
+ "0x00000000033bafe2",
+ "0x0000000003096f10",
+ "0x00000000013096d5",
+ "0x00000000035d92fc",
+ "0x000000000035c642",
+ "0x0000000002386da1",
+ "0x0000000001b70815",
+ "0x00000000012929b1",
+ "0x0000000000fc7c69",
+ "0x0000000003655134",
+ "0x00000000007d6761",
+ "0x00000000009ea37e",
+ "0x0000000000077952",
+ "0x00000000006da5c5",
+ "0x00000000027f7cea",
+ "0x00000000007ade04",
+ "0x000000000268a9b6",
+ "0x00000000027d34b8",
+ "0x00000000011126bb",
+ "0x0000000000e77508",
+ "0x0000000002f32043",
+ "0x0000000001e27737",
+ "0x0000000000746198",
+ "0x0000000000a1e62a",
+ "0x0000000001eccff7",
+ "0x0000000000d91619",
+ "0x0000000003020489",
+ "0x00000000025e77ee",
+ "0x00000000007d45f7",
+ "0x0000000002daa299",
+ "0x0000000003ea44bf",
+ "0x00000000003817dd",
+ "0x00000000029ba0d6",
+ "0x000000000150cc62",
+ "0x000000000073a5d0",
+ "0x00000000038dd891",
+ "0x0000000002b29b65",
+ "0x0000000000a89c72",
+ "0x0000000002d69714",
+ "0x00000000033fd89e",
+ "0x0000000000d83847",
+ "0x00000000005433d7",
+ "0x000000000245246f",
+ "0x0000000002a7a6f6",
+ "0x0000000000a70a3b",
+ "0x0000000003e5e1b3",
+ "0x0000000000440766",
+ "0x00000000032ef0cd",
+ "0x000000000378f969",
+ "0x000000000075b8d1",
+ "0x00000000018d4010",
+ "0x00000000015a331c",
+ "0x0000000003aecf55",
+ "0x0000000002ccbaa9",
+ "0x000000000117247b",
+ "0x00000000026e3566",
+ "0x0000000001fbae70",
+ "0x000000000361c1fd",
+ "0x00000000000cd5f6",
+ "0x0000000003b9cf01",
+ "0x000000000258771d",
+ "0x00000000021db004",
+ "0x0000000001382f9a",
+ "0x00000000028ca5ce",
+ "0x00000000011bdf90",
+ "0x0000000003080db1",
+ "0x0000000001d70b86",
+ "0x000000000295b5fe",
+ "0x000000000127040a",
+ "0x000000000354eff8"
+ ]
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/face_login.vue b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/face_login.vue
new file mode 100755
index 000000000..a205e18da
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/face_login.vue
@@ -0,0 +1,25 @@
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/identity.json b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/identity.json
new file mode 100755
index 000000000..fb3c8cf95
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/identity.json
@@ -0,0 +1 @@
+{"id":"User","m":[87263709234,22585841512],"r":[388267467432066,2572889205348118],"cmt":[951254810963968,4545760428364837],"appname":["douyin","bibi","aaa","bbb"]}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar2/test1.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar2/test1.jar
new file mode 100755
index 000000000..52ee03b05
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar2/test1.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar3/test1.jar b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar3/test1.jar
new file mode 100755
index 000000000..91e5183a5
Binary files /dev/null and b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/out/artifacts/test1_jar3/test1.jar differ
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/pom.xml b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/pom.xml
new file mode 100755
index 000000000..841117fad
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/pom.xml
@@ -0,0 +1,125 @@
+
+
+ 4.0.0
+ szu.zhl
+ test1
+ 0.0.1-SNAPSHOT
+ test1
+ test1
+
+ 21
+ UTF-8
+ UTF-8
+ 3.0.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.13
+
+
+
+ com.fasterxml.jackson.core
+ jackson-core
+ 2.15.0
+
+
+ com.fasterxml.jackson.core
+ jackson-annotations
+ 2.15.0
+
+
+ commons-codec
+ commons-codec
+ 1.15
+
+
+
+
+ com.google.code.gson
+ gson
+ 2.8.9
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.15.0
+
+
+ org.json
+ json
+ 20231013
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-dependencies
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+ 16
+ 16
+ UTF-8
+
+
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proof.json b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proof.json
new file mode 100755
index 000000000..ce1900491
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proof.json
@@ -0,0 +1,7192 @@
+{
+ "id": "User",
+ "time": "2024/2/15 01:08:23",
+ "proof": {
+ "emb": [
+ "0x000000000251c15a",
+ "0x00000000030f67b7",
+ "0x00000000000966f8",
+ "0x0000000002c48140",
+ "0x0000000003ac3bc5",
+ "0x0000000001c735be",
+ "0x0000000003afb555",
+ "0x0000000002752ad3",
+ "0x0000000002b55aa0",
+ "0x00000000039ba246",
+ "0x00000000012305db",
+ "0x00000000006de4a4",
+ "0x0000000001865b68",
+ "0x0000000003ab17b9",
+ "0x000000000112dfde",
+ "0x000000000156814d",
+ "0x0000000003a293b3",
+ "0x0000000001295744",
+ "0x00000000012b3409",
+ "0x00000000002091fe",
+ "0x0000000001050893",
+ "0x00000000039bb4b3",
+ "0x000000000274a91b",
+ "0x0000000001506164",
+ "0x0000000001775a5d",
+ "0x0000000000c3a4a4",
+ "0x0000000000bee015",
+ "0x00000000010b70d0",
+ "0x0000000000b7dd0a",
+ "0x00000000020f27fe",
+ "0x00000000000aa133",
+ "0x0000000001028f76",
+ "0x0000000003628573",
+ "0x000000000331a585",
+ "0x0000000002543906",
+ "0x0000000002a00276",
+ "0x0000000001af2daa",
+ "0x00000000013a02dd",
+ "0x000000000089dc3e",
+ "0x0000000001fc6864",
+ "0x0000000002f4d707",
+ "0x00000000011d3f24",
+ "0x0000000003fbbb86",
+ "0x0000000001656de1",
+ "0x000000000026343d",
+ "0x000000000063dec9",
+ "0x0000000002c19586",
+ "0x0000000003862b0c",
+ "0x000000000242d820",
+ "0x0000000003a81f6e",
+ "0x0000000002445658",
+ "0x00000000025ab483",
+ "0x0000000003a069a8",
+ "0x0000000000ad947a",
+ "0x0000000003efe6ab",
+ "0x0000000002da212a",
+ "0x0000000003ab80c7",
+ "0x0000000003c4d100",
+ "0x0000000003a03d58",
+ "0x00000000031337d4",
+ "0x0000000002eab496",
+ "0x00000000008f9bea",
+ "0x0000000001545f2d",
+ "0x0000000002d96fdf",
+ "0x000000000001e36e",
+ "0x000000000390992f",
+ "0x0000000002438cb5",
+ "0x0000000003c6b182",
+ "0x0000000002020e2d",
+ "0x0000000002f41d73",
+ "0x0000000001fa32ac",
+ "0x0000000000a35faa",
+ "0x00000000017bfbc2",
+ "0x000000000050d0b7",
+ "0x0000000002344a58",
+ "0x0000000000cb1ff8",
+ "0x00000000018c40d3",
+ "0x0000000001607df1",
+ "0x00000000015fa672",
+ "0x0000000000b94a11",
+ "0x00000000035ac708",
+ "0x0000000003e7ac1a",
+ "0x00000000028fc04e",
+ "0x0000000002feaf17",
+ "0x000000000074aafa",
+ "0x0000000001c3708b",
+ "0x0000000001a7253b",
+ "0x0000000002eb1d0b",
+ "0x0000000002d307e4",
+ "0x0000000002aa841c",
+ "0x00000000028b5183",
+ "0x00000000003c193e",
+ "0x000000000252096b",
+ "0x00000000039b4018",
+ "0x000000000010e255",
+ "0x0000000003ffa03f",
+ "0x0000000000833b6a",
+ "0x00000000011d6ed9",
+ "0x0000000000057440",
+ "0x0000000002e2947b",
+ "0x0000000000d12648",
+ "0x000000000319a94e",
+ "0x00000000027ea557",
+ "0x000000000009ef81",
+ "0x00000000027c418b",
+ "0x00000000006a1ebc",
+ "0x0000000001fd0f8c",
+ "0x00000000000aa00d",
+ "0x0000000002fbf390",
+ "0x0000000001a07da7",
+ "0x00000000030d202d",
+ "0x00000000022f6f5e",
+ "0x0000000003c913c7",
+ "0x0000000002412f4f",
+ "0x0000000003ef3874",
+ "0x00000000009180bc",
+ "0x000000000278d4ba",
+ "0x0000000003b9e528",
+ "0x00000000014a9b31",
+ "0x00000000015bc7ff",
+ "0x00000000021d448e",
+ "0x00000000022f0a44",
+ "0x0000000003c49cf6",
+ "0x000000000011072a",
+ "0x000000000237deb3",
+ "0x0000000002d68bbf",
+ "0x00000000033474de",
+ "0x0000000002353213",
+ "0x0000000002498574",
+ "0x0000000000d53793",
+ "0x00000000015d3a5f",
+ "0x00000000023c2f45",
+ "0x000000000389f667",
+ "0x00000000005cd678",
+ "0x0000000000c1aa06",
+ "0x0000000000096d0f",
+ "0x00000000005c391c",
+ "0x00000000004f5e33",
+ "0x00000000036b42f7",
+ "0x000000000239441b",
+ "0x0000000003cbc3e0",
+ "0x00000000019e9171",
+ "0x0000000000947df2",
+ "0x0000000000dde384",
+ "0x000000000128a1d5",
+ "0x00000000004e5763",
+ "0x00000000005081dd",
+ "0x0000000000cef893",
+ "0x0000000001809e07",
+ "0x0000000001b186cc",
+ "0x0000000003c92b56",
+ "0x0000000000e9b822",
+ "0x0000000001a20af5",
+ "0x00000000027b847c",
+ "0x0000000000e00ba7",
+ "0x000000000044f3bd",
+ "0x00000000016bc7ca",
+ "0x000000000395203d",
+ "0x0000000001b64435",
+ "0x000000000286b559",
+ "0x0000000000eac99b",
+ "0x0000000000330d13",
+ "0x0000000000dcc753",
+ "0x000000000265b821",
+ "0x0000000002246847",
+ "0x0000000003375727",
+ "0x0000000001b39355",
+ "0x0000000003ae3927",
+ "0x00000000025a4589",
+ "0x0000000003f2cc13",
+ "0x0000000002b4d3d8",
+ "0x0000000002addf53",
+ "0x00000000006de00b",
+ "0x0000000001c116fc",
+ "0x0000000001fe1f77",
+ "0x0000000002558249",
+ "0x00000000012e0623",
+ "0x00000000031009b7",
+ "0x000000000128f06a",
+ "0x0000000000e2f4e3",
+ "0x0000000002f7492f",
+ "0x000000000248d7f2",
+ "0x00000000030441cd",
+ "0x00000000024fb01e",
+ "0x0000000000581661",
+ "0x0000000002becd1a",
+ "0x0000000001cfa884",
+ "0x000000000382f75c",
+ "0x0000000003903f0a",
+ "0x0000000003587b83",
+ "0x0000000001c82fe9",
+ "0x0000000003c42370",
+ "0x0000000000c802a1",
+ "0x00000000000d73fb",
+ "0x00000000014f0cb2",
+ "0x0000000001f23ec3",
+ "0x0000000003a6e1f1",
+ "0x000000000249a2d6",
+ "0x0000000002880786",
+ "0x000000000006498c",
+ "0x0000000002f69453",
+ "0x0000000000255cbd",
+ "0x000000000290756a",
+ "0x0000000003688b44",
+ "0x00000000027cdef8",
+ "0x00000000016f60ce",
+ "0x0000000001140773",
+ "0x000000000182cf37",
+ "0x00000000002b858e",
+ "0x000000000363a037",
+ "0x00000000022dfd4c",
+ "0x0000000003f23a3e",
+ "0x0000000000779a4a",
+ "0x0000000003ef3870",
+ "0x0000000003b44569",
+ "0x00000000035c8906",
+ "0x0000000000a6e456",
+ "0x0000000001661277",
+ "0x0000000002679684",
+ "0x0000000000365e62",
+ "0x00000000037e9877",
+ "0x0000000003aab6ce",
+ "0x0000000001426950",
+ "0x00000000032d793c",
+ "0x00000000014642d0",
+ "0x000000000114b415",
+ "0x0000000002ed998e",
+ "0x00000000012bf6ed",
+ "0x0000000002aa8d0e",
+ "0x0000000000af27ee",
+ "0x00000000024a1db1",
+ "0x00000000024c4c30",
+ "0x0000000003faef17",
+ "0x0000000002f74d34",
+ "0x0000000000aa1d46",
+ "0x000000000387d163",
+ "0x00000000020b87bb",
+ "0x0000000003e762c4",
+ "0x0000000003478c0c",
+ "0x00000000003b0f59",
+ "0x0000000002f9dc81",
+ "0x000000000061a77c",
+ "0x000000000055f04e",
+ "0x0000000000c84afc",
+ "0x00000000006d6993",
+ "0x0000000002b069ae",
+ "0x000000000162a030",
+ "0x0000000003bce02d",
+ "0x0000000001c4a3f7",
+ "0x00000000017812a6",
+ "0x0000000001925a85",
+ "0x0000000001a98683",
+ "0x0000000001eda377",
+ "0x0000000001640d50",
+ "0x0000000000b236ad",
+ "0x0000000002c6b3d5",
+ "0x000000000100a5ca",
+ "0x0000000001bf59ed",
+ "0x0000000003a04dde",
+ "0x000000000357e661",
+ "0x000000000173864d",
+ "0x00000000009e791d",
+ "0x0000000002b5c65a",
+ "0x00000000025adc89",
+ "0x0000000003944c71",
+ "0x0000000002ea3433",
+ "0x0000000001bbe554",
+ "0x000000000197379f",
+ "0x0000000002a2ef6f",
+ "0x0000000001d91b9c",
+ "0x0000000002292f87",
+ "0x000000000129cb2d",
+ "0x00000000017d36b0",
+ "0x0000000001fbfd80",
+ "0x000000000117004f",
+ "0x0000000002f6f812",
+ "0x0000000000b0f1a8",
+ "0x0000000002c6d4a7",
+ "0x000000000157f4a8",
+ "0x000000000310c729",
+ "0x00000000017a22f9",
+ "0x00000000031ef6ee",
+ "0x00000000030f34a7",
+ "0x0000000002e7fb28",
+ "0x000000000203a47e",
+ "0x000000000071599e",
+ "0x000000000260d9bf",
+ "0x00000000021b7c02",
+ "0x000000000177b181",
+ "0x0000000001fbbe2b",
+ "0x000000000178bfb5",
+ "0x0000000003a622d2",
+ "0x0000000001819ad9",
+ "0x0000000000f5015b",
+ "0x00000000016c1cc4",
+ "0x0000000003d0a258",
+ "0x000000000250b8da",
+ "0x0000000000433e5e",
+ "0x000000000339ee08",
+ "0x0000000002bf4273",
+ "0x000000000087e9d5",
+ "0x00000000035dc7cd",
+ "0x00000000031f92e0",
+ "0x000000000090f6a8",
+ "0x000000000090cd2a",
+ "0x0000000002a27e2d",
+ "0x0000000000025b08",
+ "0x0000000003c319e0",
+ "0x0000000000394a59",
+ "0x0000000002d2f8d2",
+ "0x00000000005bf406",
+ "0x0000000003a00063",
+ "0x00000000029c9069",
+ "0x00000000036e7194",
+ "0x0000000000a0f476",
+ "0x00000000037f7091",
+ "0x0000000001a5398d",
+ "0x00000000027674d0",
+ "0x00000000023b87e5",
+ "0x000000000170b278",
+ "0x0000000001632ae6",
+ "0x00000000018efaf2",
+ "0x0000000003f6a403",
+ "0x00000000005ed209",
+ "0x0000000003620b9a",
+ "0x0000000001f59769",
+ "0x00000000025246fd",
+ "0x00000000022fb5b2",
+ "0x00000000028754ed",
+ "0x000000000238f2f2",
+ "0x00000000018c0d39",
+ "0x00000000035f63a4",
+ "0x00000000023114c8",
+ "0x00000000019d1065",
+ "0x000000000016071d",
+ "0x0000000001e788e7",
+ "0x00000000027286a3",
+ "0x00000000013af493",
+ "0x0000000001175c9f",
+ "0x00000000014d9d56",
+ "0x000000000374b553",
+ "0x00000000026d8505",
+ "0x00000000037e1813",
+ "0x000000000279041e",
+ "0x000000000020ed34",
+ "0x0000000000deca97",
+ "0x00000000004c7f22",
+ "0x00000000024a094d",
+ "0x0000000000b47cf5",
+ "0x0000000002174cdb",
+ "0x0000000002a4d4f4",
+ "0x0000000001221a34",
+ "0x00000000020b4f7b",
+ "0x00000000000e4a3c",
+ "0x0000000000fc9da9",
+ "0x0000000003282ca5",
+ "0x000000000372e677",
+ "0x0000000000644e42",
+ "0x0000000003954417",
+ "0x000000000268cbd7",
+ "0x0000000000c0246c",
+ "0x0000000003be4323",
+ "0x0000000002c277ea",
+ "0x0000000000e2d6a9",
+ "0x00000000030c355d",
+ "0x00000000033a521f",
+ "0x0000000001b26614",
+ "0x0000000003da08b6",
+ "0x0000000001203ea4",
+ "0x0000000003ab078d",
+ "0x0000000001491ee2",
+ "0x0000000000a8e0be",
+ "0x00000000028e1ba0",
+ "0x0000000003b53d65",
+ "0x00000000000aecda",
+ "0x00000000018d15b2",
+ "0x000000000365b17b",
+ "0x00000000030662e8",
+ "0x0000000001b834f7",
+ "0x0000000002bbe3e9",
+ "0x000000000230a57c",
+ "0x0000000002fd7e4c",
+ "0x0000000000a73eef",
+ "0x000000000214c79a",
+ "0x0000000001025a5c",
+ "0x0000000001831b35",
+ "0x0000000003d91cdd",
+ "0x0000000001b54e8a",
+ "0x0000000001f0b6ba",
+ "0x0000000000949887",
+ "0x0000000001e12f84",
+ "0x0000000000f692d5",
+ "0x00000000003a112e",
+ "0x000000000328e7d6",
+ "0x0000000002a60449",
+ "0x00000000027eb8d5",
+ "0x0000000002aada48",
+ "0x00000000036b0d8c",
+ "0x000000000121400c",
+ "0x0000000001517660",
+ "0x0000000000c1717a",
+ "0x0000000003364bbb",
+ "0x0000000000ea1e2b",
+ "0x00000000020edd26",
+ "0x0000000001beae4d",
+ "0x00000000022073ed",
+ "0x0000000000b08044",
+ "0x0000000000e6ebb9",
+ "0x0000000002650a88",
+ "0x000000000116b8c2",
+ "0x00000000025e89dc",
+ "0x00000000024b0bdc",
+ "0x00000000002b1d8b",
+ "0x00000000012aa1f3",
+ "0x00000000009575a4",
+ "0x00000000006fd69e",
+ "0x00000000027081f6",
+ "0x0000000001143f85",
+ "0x00000000036f52fa",
+ "0x0000000002e7826a",
+ "0x000000000193d1a8",
+ "0x00000000003833d5",
+ "0x0000000002eeba97",
+ "0x000000000005ca4b",
+ "0x00000000006dc9ea",
+ "0x0000000002269d14",
+ "0x0000000000229b1b",
+ "0x0000000000f099a2",
+ "0x0000000001b0d267",
+ "0x0000000000e647d1",
+ "0x0000000002456bad",
+ "0x000000000030feab",
+ "0x0000000003914e35",
+ "0x0000000003de614a",
+ "0x00000000020e69ba",
+ "0x0000000003597a98",
+ "0x00000000036f6563",
+ "0x0000000002ce3cc3",
+ "0x00000000001a9476",
+ "0x0000000003cb5344",
+ "0x0000000001e2b573",
+ "0x00000000020065c6",
+ "0x00000000036a1cbc",
+ "0x0000000000e2bcbd",
+ "0x00000000022892c4",
+ "0x00000000034c2ca1",
+ "0x00000000033fa449",
+ "0x0000000000d40948",
+ "0x0000000002af2f71",
+ "0x0000000003c2bf3e",
+ "0x0000000000f64967",
+ "0x0000000001799a02",
+ "0x00000000025eb797",
+ "0x0000000002a1c4d0",
+ "0x0000000000af9df2",
+ "0x00000000030c8164",
+ "0x0000000003bbe2aa",
+ "0x00000000033e44f2",
+ "0x0000000001203983",
+ "0x00000000032da5d8",
+ "0x0000000001124ce9",
+ "0x00000000004bf41e",
+ "0x000000000030ab65",
+ "0x000000000310f2e3",
+ "0x0000000002bfe0cb",
+ "0x0000000003e96536",
+ "0x0000000002065ed3",
+ "0x00000000026d86aa",
+ "0x00000000039505cb",
+ "0x000000000137630d",
+ "0x00000000018419c3",
+ "0x0000000001a73de5",
+ "0x000000000299dedf",
+ "0x0000000001570074",
+ "0x000000000123176e",
+ "0x0000000001f81c20",
+ "0x00000000018961d1",
+ "0x0000000002bbb1e0",
+ "0x0000000001add9b2",
+ "0x0000000000d906a6",
+ "0x000000000251133c",
+ "0x0000000001ca3003",
+ "0x00000000018ca6a1",
+ "0x00000000036f3a36",
+ "0x00000000001cec7a",
+ "0x000000000341e8f5",
+ "0x0000000000f9a36a",
+ "0x0000000003107d79",
+ "0x0000000002f4b896",
+ "0x0000000002a29107",
+ "0x0000000002f04dce",
+ "0x0000000000591bad",
+ "0x0000000002e0b039",
+ "0x0000000003ee41c8",
+ "0x00000000037ac148",
+ "0x0000000002ab8a0d",
+ "0x0000000002cd59e9",
+ "0x0000000002f1987c",
+ "0x00000000012897c3",
+ "0x0000000001f41c09",
+ "0x0000000000a6b88c",
+ "0x000000000315c89e",
+ "0x0000000001e91f3b",
+ "0x0000000001a042c8",
+ "0x0000000003587141",
+ "0x0000000002d31468",
+ "0x0000000001001bfc",
+ "0x000000000185feb6",
+ "0x0000000002f28b53",
+ "0x0000000000bc728a",
+ "0x00000000000353b3",
+ "0x0000000002729d6a"
+ ],
+ "cmt": {
+ "cmt_eq_old_json": [
+ "0x000000000094cab6",
+ "0x00000000011a1499",
+ "0x000000000333e9bb",
+ "0x0000000000a60872",
+ "0x00000000010b774c",
+ "0x0000000002447580",
+ "0x00000000011a0bae",
+ "0x00000000008777bc",
+ "0x000000000008299e",
+ "0x000000000130b8ab",
+ "0x0000000002df96bd",
+ "0x0000000003fa90f6",
+ "0x0000000000fbac57",
+ "0x00000000037a26b0",
+ "0x00000000009d8e27",
+ "0x00000000020c2c6e",
+ "0x0000000003cf2c1d",
+ "0x000000000200ac6b",
+ "0x000000000107bd61",
+ "0x00000000003b224a",
+ "0x000000000218b709",
+ "0x0000000001f74bf2",
+ "0x0000000002a899ae",
+ "0x0000000002a87c4a",
+ "0x00000000007bf09d",
+ "0x00000000011e09f3",
+ "0x00000000001fcb1e",
+ "0x0000000003c8ea6f",
+ "0x0000000003f4917a",
+ "0x0000000000cab6de",
+ "0x00000000013d2642",
+ "0x0000000000d72eb9",
+ "0x000000000069a738",
+ "0x0000000002da579b",
+ "0x0000000000192726",
+ "0x0000000001c9a8da",
+ "0x0000000002c31f70",
+ "0x00000000014deb2a",
+ "0x000000000240555b",
+ "0x000000000202f4cc",
+ "0x0000000000d14060",
+ "0x0000000002df6ed7",
+ "0x00000000008b04d6",
+ "0x0000000001e21617",
+ "0x0000000001e65725",
+ "0x000000000192d0f2",
+ "0x00000000009259e1",
+ "0x00000000014b3d90",
+ "0x0000000001c49c13",
+ "0x00000000020f4e1e",
+ "0x0000000001bb6ac9",
+ "0x000000000343be7f",
+ "0x000000000047f1e7",
+ "0x0000000000a3cf20",
+ "0x0000000001149704",
+ "0x00000000025eb6da",
+ "0x00000000031ab141",
+ "0x000000000091ac8e",
+ "0x0000000002586e27",
+ "0x0000000000dc8b29",
+ "0x00000000031f6291",
+ "0x0000000000004413",
+ "0x00000000007cef89",
+ "0x00000000008d14c2",
+ "0x000000000364eb0c",
+ "0x000000000198cc4d",
+ "0x0000000002bb5f79",
+ "0x0000000000cb6464",
+ "0x0000000000d4dc77",
+ "0x0000000003e67218",
+ "0x00000000010238a6",
+ "0x00000000027c1223",
+ "0x0000000001d2a4f1",
+ "0x00000000006b36ef",
+ "0x0000000003f7beda",
+ "0x00000000029207ef",
+ "0x0000000003121aea",
+ "0x0000000003a88a93",
+ "0x00000000030cfe19",
+ "0x0000000000e133e0",
+ "0x00000000000f1b63",
+ "0x0000000002f0833d",
+ "0x000000000312d89a",
+ "0x00000000039e3efb",
+ "0x0000000002cabb14",
+ "0x000000000389b9d4",
+ "0x000000000105aba0",
+ "0x0000000001fd16dd",
+ "0x0000000002456a2e",
+ "0x0000000000d29058",
+ "0x0000000003732dc3",
+ "0x00000000005c557b",
+ "0x00000000032a3e95",
+ "0x00000000034a5220",
+ "0x0000000003aab3e4",
+ "0x00000000014ea8f4",
+ "0x00000000035806be",
+ "0x000000000330aee0",
+ "0x00000000000b2612",
+ "0x000000000112f760",
+ "0x000000000243b888",
+ "0x000000000308fec0",
+ "0x00000000016d8f47",
+ "0x000000000315af8b",
+ "0x000000000347b7c2",
+ "0x000000000140befc",
+ "0x0000000002dc1136",
+ "0x0000000001c532a4",
+ "0x000000000117b434",
+ "0x000000000365c201",
+ "0x0000000002992b60",
+ "0x0000000003e900b7",
+ "0x00000000017339e3",
+ "0x0000000002587c43",
+ "0x00000000003a983e",
+ "0x0000000001058dfc",
+ "0x000000000214bedd",
+ "0x000000000200aacf",
+ "0x000000000133094a",
+ "0x0000000002876e1c",
+ "0x000000000255f770",
+ "0x00000000033d9ecb",
+ "0x000000000389c36f",
+ "0x0000000002e60213",
+ "0x0000000000d9ca1f",
+ "0x000000000278af15",
+ "0x0000000000c239bb",
+ "0x0000000002d4d44b",
+ "0x0000000002011cc1",
+ "0x0000000002e0b9d1",
+ "0x0000000001dc009a",
+ "0x000000000312dd6b",
+ "0x0000000000d2c6f7",
+ "0x000000000151cb42",
+ "0x0000000001aa4042",
+ "0x000000000076e338",
+ "0x0000000000939338",
+ "0x0000000000fb2c4c",
+ "0x000000000358b410",
+ "0x0000000002de5011",
+ "0x00000000003728b4",
+ "0x00000000005b581f",
+ "0x000000000270b6c1",
+ "0x0000000000bccbef",
+ "0x0000000003e9e4e2",
+ "0x0000000001a46467",
+ "0x000000000008a053",
+ "0x0000000001b00266",
+ "0x0000000002596ca9",
+ "0x00000000027bf5fe",
+ "0x0000000000a74a31",
+ "0x0000000001c0a762",
+ "0x0000000001068df0",
+ "0x000000000142e56c",
+ "0x00000000022ae9c5",
+ "0x0000000002f9b223",
+ "0x000000000356fbff",
+ "0x00000000016827c3",
+ "0x000000000110ab34",
+ "0x0000000003e601da",
+ "0x0000000002adf9ce",
+ "0x00000000023a5852",
+ "0x00000000021fc9b7",
+ "0x0000000000a63501",
+ "0x0000000001bf6b72",
+ "0x000000000195abb3",
+ "0x00000000030d589b",
+ "0x0000000000980923",
+ "0x0000000001ec0fa7",
+ "0x000000000161bd0c",
+ "0x0000000003775139",
+ "0x000000000102d2c3",
+ "0x0000000003303bdd",
+ "0x00000000012afe04",
+ "0x00000000004f620b",
+ "0x0000000001cad7a0",
+ "0x000000000319a590",
+ "0x0000000000113352",
+ "0x000000000206ef33",
+ "0x0000000003eea034",
+ "0x0000000001bc7e81",
+ "0x00000000006e5ace",
+ "0x0000000001bcd422",
+ "0x0000000000550ec0",
+ "0x0000000003b17f8a",
+ "0x0000000001d99fc6",
+ "0x00000000025a89b0",
+ "0x0000000003fa4d93",
+ "0x000000000199f191",
+ "0x00000000017a4f70",
+ "0x0000000003d7db85",
+ "0x000000000066409f",
+ "0x00000000013431e8",
+ "0x00000000006f9fa4",
+ "0x0000000002b629c5",
+ "0x000000000007ce40",
+ "0x0000000003cb7281",
+ "0x00000000023020dd",
+ "0x000000000194ad81",
+ "0x00000000023b04b7",
+ "0x0000000003214de4",
+ "0x00000000033354b5",
+ "0x0000000002e99338",
+ "0x00000000038fbbce",
+ "0x00000000024d0980",
+ "0x0000000000160efd",
+ "0x0000000002be22e4",
+ "0x0000000000626cc8",
+ "0x0000000001eb3ce6",
+ "0x000000000126219f",
+ "0x0000000002d1cb68",
+ "0x0000000003e536cd",
+ "0x000000000315d237",
+ "0x0000000002f192e5",
+ "0x000000000054cb1b",
+ "0x0000000002878d1e",
+ "0x0000000002713af9",
+ "0x0000000002ced326",
+ "0x000000000118cfce",
+ "0x00000000014be90f",
+ "0x0000000001605361",
+ "0x000000000219b198",
+ "0x000000000120d51c",
+ "0x00000000013d646d",
+ "0x000000000008355d",
+ "0x0000000000c405c0",
+ "0x0000000003089a22",
+ "0x00000000039b0095",
+ "0x0000000001ae782f",
+ "0x0000000002381f44",
+ "0x0000000003bcb0d4",
+ "0x000000000272b0c1",
+ "0x000000000300be25",
+ "0x00000000004b17ba",
+ "0x000000000173b6f5",
+ "0x0000000002b43fde",
+ "0x00000000003634aa",
+ "0x0000000003af9e35",
+ "0x0000000002565b0e",
+ "0x0000000000e1569f",
+ "0x0000000001dd1cb6",
+ "0x000000000371129e",
+ "0x000000000303a87d",
+ "0x000000000216842a",
+ "0x00000000028b1230",
+ "0x0000000001d6a137",
+ "0x0000000000d8ec2f",
+ "0x000000000169ae67",
+ "0x00000000036d9d30",
+ "0x000000000121b4a9",
+ "0x0000000000ba2bc4",
+ "0x00000000004a4e15",
+ "0x0000000003d560b8",
+ "0x00000000004f6517",
+ "0x0000000001c37f6f",
+ "0x0000000001898b8c",
+ "0x00000000010f227a",
+ "0x00000000003733b5",
+ "0x0000000002248d13",
+ "0x0000000003ac5d54",
+ "0x0000000001e647fc",
+ "0x0000000000d68bf6",
+ "0x00000000005755de",
+ "0x000000000124be00",
+ "0x00000000021f7027",
+ "0x00000000002a4178",
+ "0x00000000031e1ca7",
+ "0x0000000000bac712",
+ "0x00000000014809e4",
+ "0x0000000000f2302b",
+ "0x0000000002443445",
+ "0x00000000033aa7b4",
+ "0x0000000003a4a099",
+ "0x000000000008002f",
+ "0x000000000060a015",
+ "0x0000000002ee206d",
+ "0x0000000000590347",
+ "0x00000000016e774e",
+ "0x00000000014a6ab4",
+ "0x0000000002cf9e7f",
+ "0x0000000000ddd70e",
+ "0x00000000020e9fec",
+ "0x0000000001484043",
+ "0x0000000003104099",
+ "0x00000000024a8678",
+ "0x000000000100ffc8",
+ "0x00000000023fa59c",
+ "0x0000000001fa592a",
+ "0x0000000000fa2a88",
+ "0x00000000011a1f41",
+ "0x0000000003665be3",
+ "0x0000000003b6aa8e",
+ "0x00000000020e5b9c",
+ "0x00000000000cdb95",
+ "0x0000000003c77386",
+ "0x00000000004d8924",
+ "0x0000000000764f4d",
+ "0x00000000008619ab",
+ "0x0000000003df9695",
+ "0x00000000027c9ce9",
+ "0x0000000001122deb",
+ "0x000000000192de2e",
+ "0x00000000024b710f",
+ "0x0000000000e45f49",
+ "0x0000000002d77e28",
+ "0x000000000282f986",
+ "0x0000000002263763",
+ "0x00000000001b1e26",
+ "0x0000000001a0913a",
+ "0x0000000003bff5c5",
+ "0x000000000299ef5f",
+ "0x0000000003b5be18",
+ "0x0000000001814398",
+ "0x000000000254090b",
+ "0x0000000001358dba",
+ "0x0000000000d7a81b",
+ "0x000000000352dd57",
+ "0x0000000002f58c3c",
+ "0x00000000007f7d96",
+ "0x0000000000b6b461",
+ "0x00000000039c65f1",
+ "0x000000000054f05f",
+ "0x0000000000b48189",
+ "0x0000000003b1835f",
+ "0x00000000033b1d76",
+ "0x000000000128c56f",
+ "0x0000000001c015fa",
+ "0x0000000000c88807",
+ "0x0000000001d64a39",
+ "0x0000000001dd865b",
+ "0x0000000003e2eb75",
+ "0x0000000002418a7f",
+ "0x0000000003908ae3",
+ "0x0000000002e134d0",
+ "0x000000000328d9d2",
+ "0x0000000001fa38d4",
+ "0x0000000002e96dd1",
+ "0x0000000000ba09ae",
+ "0x0000000003323e7e",
+ "0x0000000003c96f4a",
+ "0x0000000003f0f99f",
+ "0x0000000003fcc50a",
+ "0x0000000003dc9d31",
+ "0x00000000036192df",
+ "0x0000000002495897",
+ "0x00000000015dab0d",
+ "0x00000000018ad99c",
+ "0x00000000011b1971",
+ "0x0000000000e3ef3d",
+ "0x000000000171ddcb",
+ "0x0000000001e14ecc",
+ "0x0000000003a820a5",
+ "0x00000000014041f6",
+ "0x000000000339724b",
+ "0x00000000005a822f",
+ "0x00000000036b3358",
+ "0x0000000001ca5cea",
+ "0x0000000001c6cbeb",
+ "0x0000000002449e2d",
+ "0x00000000027b5b00",
+ "0x0000000000700cab",
+ "0x000000000077e8e2",
+ "0x0000000002105808",
+ "0x00000000014bbe49",
+ "0x00000000022a9af0",
+ "0x0000000001b35bb0",
+ "0x0000000000f57739",
+ "0x0000000002831ab7",
+ "0x00000000032c0d9f",
+ "0x00000000003fee4c",
+ "0x0000000002317985",
+ "0x00000000017232d6",
+ "0x0000000003d58d81",
+ "0x0000000000d881ee",
+ "0x0000000003daf30e",
+ "0x00000000010f8e21",
+ "0x0000000003fe6169",
+ "0x0000000000f21359",
+ "0x000000000334efd6",
+ "0x00000000011efd79",
+ "0x000000000301f0df",
+ "0x0000000003a80878",
+ "0x0000000001d663c2",
+ "0x00000000001a751f",
+ "0x000000000041c5af",
+ "0x000000000224cc0e",
+ "0x000000000325c971",
+ "0x0000000001428c38",
+ "0x0000000001f5bd4a",
+ "0x000000000399b002",
+ "0x000000000225da1c",
+ "0x0000000000ecf047",
+ "0x0000000002d2cdf5",
+ "0x0000000003d038c0",
+ "0x0000000003eb4c6d",
+ "0x0000000002ce2c23",
+ "0x00000000021ccd39",
+ "0x0000000003035bf8",
+ "0x0000000001d0e02b",
+ "0x00000000001cb5d9",
+ "0x00000000003eba88",
+ "0x000000000097c38b",
+ "0x00000000001c90e1",
+ "0x00000000039346ef",
+ "0x00000000007a2360",
+ "0x0000000002094101",
+ "0x0000000002a10f40",
+ "0x00000000011df38d",
+ "0x00000000000ff5d5",
+ "0x0000000000a115d0",
+ "0x000000000063dadb",
+ "0x00000000017a2aa7",
+ "0x00000000017ce02c",
+ "0x000000000269848e",
+ "0x0000000001438c10",
+ "0x0000000002acb49e",
+ "0x00000000016daca4",
+ "0x00000000025f8f99",
+ "0x0000000003de2beb",
+ "0x0000000003a34581",
+ "0x0000000002d049f0",
+ "0x00000000005e6432",
+ "0x000000000090e007",
+ "0x0000000002eccde8",
+ "0x00000000039b1501",
+ "0x0000000001f3b702",
+ "0x00000000011425e4",
+ "0x00000000025f3271",
+ "0x0000000002eae7ed",
+ "0x00000000027fceb1",
+ "0x0000000001dca469",
+ "0x0000000001fa3cd6",
+ "0x00000000026c4440",
+ "0x00000000031aa82c",
+ "0x000000000043a63a",
+ "0x00000000004eb037",
+ "0x0000000000232439",
+ "0x000000000194383b",
+ "0x0000000001564215",
+ "0x0000000001090788",
+ "0x0000000000d65289",
+ "0x0000000002c766fb",
+ "0x00000000033a418d",
+ "0x000000000104fc9f",
+ "0x000000000209b768",
+ "0x0000000000a40973",
+ "0x0000000000ff9935",
+ "0x0000000001922f08",
+ "0x00000000023cb09a",
+ "0x00000000020e3add",
+ "0x00000000014af445",
+ "0x0000000001e2230c",
+ "0x0000000002654ab8",
+ "0x000000000330cc5d",
+ "0x00000000027c8e1b",
+ "0x00000000003b6682",
+ "0x0000000003e7910a",
+ "0x0000000002eba32f",
+ "0x0000000002dc8261",
+ "0x00000000015b37a0",
+ "0x000000000239eade",
+ "0x0000000002835b57",
+ "0x00000000000879cc",
+ "0x000000000121ec9e",
+ "0x0000000003f02373",
+ "0x0000000001423d14",
+ "0x0000000001744cea",
+ "0x00000000005398f9",
+ "0x0000000003224f58",
+ "0x000000000324b403",
+ "0x00000000033c1d58",
+ "0x0000000003ca1c34",
+ "0x0000000001b6bed8",
+ "0x0000000001249860",
+ "0x000000000344b2f2",
+ "0x0000000003fb26e6",
+ "0x0000000002638346",
+ "0x0000000001d8a482",
+ "0x0000000001993742",
+ "0x0000000001f30188",
+ "0x000000000135f582",
+ "0x00000000001ac582",
+ "0x0000000003aeecce",
+ "0x0000000001d1d70f",
+ "0x0000000002cc6267",
+ "0x000000000076a2d4",
+ "0x0000000003a81479",
+ "0x0000000003a6f5a3",
+ "0x0000000001076c8f",
+ "0x00000000012d901e",
+ "0x00000000037fe5bf",
+ "0x00000000017e29e6",
+ "0x0000000001d6afe5",
+ "0x0000000003ee4048",
+ "0x0000000001fc0a2b",
+ "0x0000000003078301",
+ "0x0000000003dbe473",
+ "0x00000000027ca6b9",
+ "0x00000000003e5fec",
+ "0x0000000002abe257",
+ "0x0000000000f146c6",
+ "0x00000000011d8b41",
+ "0x000000000224504a",
+ "0x000000000141215e",
+ "0x00000000028a5f01",
+ "0x00000000037b06f1",
+ "0x0000000000b8dc6c",
+ "0x00000000037f5c43",
+ "0x0000000003d4ea94",
+ "0x00000000014228ef",
+ "0x0000000003d609cc",
+ "0x000000000352a283"
+ ],
+ "cmt_eq_new_json": [
+ "0x0000000000e6c93d",
+ "0x00000000018cb23b",
+ "0x0000000001232845",
+ "0x0000000002db59f0",
+ "0x000000000230aa05",
+ "0x000000000359dd53",
+ "0x00000000014410b7",
+ "0x00000000028cdf02",
+ "0x000000000275eea4",
+ "0x0000000000cbb27a",
+ "0x0000000001928c5f",
+ "0x0000000003a5fd92",
+ "0x00000000025c2fa8",
+ "0x000000000009d62f",
+ "0x00000000017fb436",
+ "0x0000000001a2cc65",
+ "0x0000000003ad48d4",
+ "0x0000000000121f7f",
+ "0x0000000000b361ce",
+ "0x000000000098df5e",
+ "0x000000000369cee9",
+ "0x00000000033fa3e3",
+ "0x0000000003b0af1d",
+ "0x0000000002c30c6c",
+ "0x00000000027b9cbc",
+ "0x00000000001b97d6",
+ "0x0000000003e8c62a",
+ "0x00000000003258da",
+ "0x00000000022587e8",
+ "0x00000000018db066",
+ "0x0000000001e74a95",
+ "0x0000000002a1fcb7",
+ "0x000000000134cf3b",
+ "0x00000000016d8887",
+ "0x00000000019b9ffb",
+ "0x0000000000308612",
+ "0x00000000011b6589",
+ "0x00000000036f7d6f",
+ "0x000000000045c607",
+ "0x0000000002acf4a1",
+ "0x0000000002b6770f",
+ "0x0000000003516e69",
+ "0x0000000002eae779",
+ "0x0000000000a670cb",
+ "0x000000000096d743",
+ "0x0000000003545935",
+ "0x0000000002412ebc",
+ "0x0000000000a48075",
+ "0x00000000014fac1d",
+ "0x0000000001344203",
+ "0x00000000030e7644",
+ "0x0000000001accfec",
+ "0x0000000000bc4ee2",
+ "0x0000000000f2dd68",
+ "0x00000000036dffe5",
+ "0x0000000000bdff86",
+ "0x000000000069aeff",
+ "0x0000000003cf4154",
+ "0x0000000003aae916",
+ "0x000000000256996a",
+ "0x000000000061b93d",
+ "0x0000000001b6cd83",
+ "0x0000000003a84010",
+ "0x00000000019d333e",
+ "0x00000000021cf265",
+ "0x0000000002c5c1eb",
+ "0x0000000003543c5a",
+ "0x00000000033731b2",
+ "0x000000000255779c",
+ "0x00000000007af600",
+ "0x000000000295e183",
+ "0x00000000032da1c0",
+ "0x0000000002ae3645",
+ "0x00000000034ce120",
+ "0x0000000000cf640a",
+ "0x0000000001a287e8",
+ "0x0000000001bbcf6e",
+ "0x00000000031d6dd6",
+ "0x0000000000f86cce",
+ "0x0000000003c995c2",
+ "0x00000000024d3d83",
+ "0x0000000002249655",
+ "0x000000000027085b",
+ "0x000000000390c7f9",
+ "0x0000000000a833c6",
+ "0x0000000001fa161d",
+ "0x000000000357f224",
+ "0x0000000001a55251",
+ "0x00000000025fff30",
+ "0x0000000003ed48ce",
+ "0x000000000346d02f",
+ "0x0000000002355824",
+ "0x0000000002736767",
+ "0x00000000004d0abb",
+ "0x000000000341971c",
+ "0x000000000002cced",
+ "0x0000000003840e16",
+ "0x0000000000e9cd00",
+ "0x000000000342cfe5",
+ "0x0000000001218606",
+ "0x000000000237413f",
+ "0x000000000318e42c",
+ "0x00000000019efa46",
+ "0x000000000093f99e",
+ "0x0000000001319ad3",
+ "0x0000000000887f7b",
+ "0x000000000093f2c2",
+ "0x00000000005c49c3",
+ "0x0000000001993f6f",
+ "0x00000000001f26b2",
+ "0x0000000003cfd1ed",
+ "0x000000000171ad86",
+ "0x0000000002a95d8d",
+ "0x00000000038eabb2",
+ "0x000000000334c5b6",
+ "0x0000000000215146",
+ "0x00000000031e5e3d",
+ "0x0000000001cc9291",
+ "0x000000000162e34f",
+ "0x00000000003ac8c7",
+ "0x0000000002611269",
+ "0x00000000006f80b2",
+ "0x0000000003d350ab",
+ "0x00000000007efc7d",
+ "0x00000000022f1155",
+ "0x00000000007e1ce4",
+ "0x0000000000b90833",
+ "0x0000000000df5f23",
+ "0x00000000001e2ef5",
+ "0x00000000003a7096",
+ "0x0000000002303cba",
+ "0x000000000215e641",
+ "0x00000000033c3961",
+ "0x0000000003959acd",
+ "0x0000000001dcb85e",
+ "0x0000000001a257cf",
+ "0x0000000000c6952e",
+ "0x00000000001c498f",
+ "0x0000000000174613",
+ "0x0000000000222d5d",
+ "0x0000000002ceb4d2",
+ "0x000000000251bda7",
+ "0x000000000215977d",
+ "0x000000000249d691",
+ "0x0000000000f291b8",
+ "0x00000000031ee408",
+ "0x000000000346c61a",
+ "0x00000000017e513b",
+ "0x000000000080d679",
+ "0x00000000014c16d9",
+ "0x0000000001becb71",
+ "0x0000000001eb3d45",
+ "0x000000000237cd18",
+ "0x0000000001e43aaf",
+ "0x00000000038ac03c",
+ "0x00000000021a1e69",
+ "0x000000000108e98e",
+ "0x000000000187a223",
+ "0x000000000243eaa8",
+ "0x00000000017e9cdd",
+ "0x0000000003e2c26d",
+ "0x000000000102a463",
+ "0x0000000001d17882",
+ "0x0000000003c7c5d1",
+ "0x0000000001fed920",
+ "0x00000000011baf3c",
+ "0x0000000003946b85",
+ "0x0000000001c024ca",
+ "0x0000000000a38a6c",
+ "0x00000000004e217b",
+ "0x00000000023e2ac1",
+ "0x0000000002955544",
+ "0x0000000001ef9faf",
+ "0x000000000314ed01",
+ "0x000000000113f58e",
+ "0x0000000003318d4b",
+ "0x0000000000039dda",
+ "0x00000000033e4dac",
+ "0x0000000001b63530",
+ "0x0000000003aa8e41",
+ "0x00000000035e1434",
+ "0x0000000002866c07",
+ "0x00000000001d94f2",
+ "0x0000000001f8ed1a",
+ "0x0000000001f0e19c",
+ "0x00000000031fd805",
+ "0x0000000000adfd32",
+ "0x0000000002d24bd6",
+ "0x0000000001939d9b",
+ "0x00000000027ba5d4",
+ "0x000000000351120b",
+ "0x000000000267becd",
+ "0x000000000050c38d",
+ "0x0000000003d9ae20",
+ "0x000000000222b993",
+ "0x0000000002f0339b",
+ "0x0000000000f0b3ce",
+ "0x0000000001085e16",
+ "0x00000000037b210f",
+ "0x000000000370f57a",
+ "0x0000000000aef6b4",
+ "0x0000000003db8ec0",
+ "0x00000000010c7656",
+ "0x00000000016e3871",
+ "0x0000000003fdf861",
+ "0x00000000038bc7d1",
+ "0x0000000003b2c771",
+ "0x0000000000728005",
+ "0x00000000034e889b",
+ "0x00000000014833be",
+ "0x00000000001a4431",
+ "0x0000000002fa2faf",
+ "0x000000000341d217",
+ "0x00000000019dc852",
+ "0x0000000000f8c23f",
+ "0x0000000002c3dd2f",
+ "0x0000000000808310",
+ "0x0000000002d65398",
+ "0x0000000000a51462",
+ "0x000000000343fd1b",
+ "0x00000000001f0787",
+ "0x0000000003bea6fa",
+ "0x0000000003a417ed",
+ "0x00000000039b6c5c",
+ "0x00000000034eb615",
+ "0x0000000000ab58e3",
+ "0x0000000000c57ecd",
+ "0x0000000000050695",
+ "0x0000000003336c74",
+ "0x0000000002fdff2e",
+ "0x00000000027e548c",
+ "0x00000000001bd6ef",
+ "0x000000000089d57f",
+ "0x00000000004f190f",
+ "0x00000000007dd58e",
+ "0x00000000019bb2ee",
+ "0x000000000329c1c6",
+ "0x0000000001c19323",
+ "0x00000000001e4d02",
+ "0x0000000001de2458",
+ "0x0000000000009c7c",
+ "0x0000000000ab7cde",
+ "0x0000000000ec5dd5",
+ "0x00000000030348b2",
+ "0x0000000003e37f69",
+ "0x00000000030c975d",
+ "0x0000000001749f31",
+ "0x000000000041f2c0",
+ "0x0000000003f73fa4",
+ "0x0000000002eeb886",
+ "0x0000000002f61050",
+ "0x00000000031047c9",
+ "0x0000000002c616b2",
+ "0x000000000149cd50",
+ "0x0000000001e636b3",
+ "0x0000000002be649b",
+ "0x0000000000d36e00",
+ "0x000000000057886e",
+ "0x0000000002ebf174",
+ "0x0000000000e82e3e",
+ "0x0000000002181252",
+ "0x0000000000c31e0d",
+ "0x000000000081b638",
+ "0x00000000020d8489",
+ "0x00000000035564a4",
+ "0x0000000001ed4843",
+ "0x0000000001c7fc41",
+ "0x0000000000e3522b",
+ "0x0000000001572e96",
+ "0x0000000002dbbd1a",
+ "0x0000000000f50614",
+ "0x0000000003ad7c84",
+ "0x000000000269587d",
+ "0x000000000316a4fc",
+ "0x0000000001493239",
+ "0x00000000007d6979",
+ "0x000000000256734b",
+ "0x0000000002de7225",
+ "0x0000000002eb7553",
+ "0x0000000002a7aef7",
+ "0x000000000104a21e",
+ "0x0000000002867661",
+ "0x0000000002612cb5",
+ "0x0000000002ecc0ed",
+ "0x00000000030c00d3",
+ "0x0000000000642998",
+ "0x00000000003d8703",
+ "0x0000000000d428c0",
+ "0x00000000014ef218",
+ "0x00000000019970db",
+ "0x00000000033abca5",
+ "0x0000000002ec43af",
+ "0x0000000003ee38b6",
+ "0x0000000002c6eb0c",
+ "0x0000000002e2c0a7",
+ "0x00000000032306ff",
+ "0x000000000028b35d",
+ "0x0000000003853d76",
+ "0x00000000019985d5",
+ "0x00000000003ff34f",
+ "0x0000000000bb02b9",
+ "0x0000000002053527",
+ "0x000000000298116e",
+ "0x0000000001d66881",
+ "0x00000000012e7143",
+ "0x000000000325131d",
+ "0x000000000023ddcc",
+ "0x00000000013e88f5",
+ "0x00000000014effd9",
+ "0x00000000001589d0",
+ "0x00000000023ad23e",
+ "0x000000000202b8f6",
+ "0x00000000026983aa",
+ "0x00000000027291ce",
+ "0x0000000002ab0ff2",
+ "0x000000000058c781",
+ "0x0000000001ff739e",
+ "0x00000000030a5b72",
+ "0x00000000023a965d",
+ "0x00000000004952a5",
+ "0x00000000011dffb8",
+ "0x0000000002791c47",
+ "0x00000000019fb5d2",
+ "0x00000000021d22fe",
+ "0x0000000003bf196a",
+ "0x0000000003d8afb4",
+ "0x0000000000cf8ecb",
+ "0x0000000001cc91e7",
+ "0x00000000016aeb3f",
+ "0x0000000001e13931",
+ "0x000000000167e880",
+ "0x000000000341384a",
+ "0x0000000003d77e04",
+ "0x0000000002df677d",
+ "0x000000000057cf7d",
+ "0x0000000000a8c3e8",
+ "0x0000000002d463d9",
+ "0x0000000002a5be2c",
+ "0x000000000127c474",
+ "0x000000000246422c",
+ "0x000000000352a637",
+ "0x0000000000fd1921",
+ "0x0000000000474f46",
+ "0x000000000318198a",
+ "0x0000000000e5eda5",
+ "0x00000000011ef92a",
+ "0x0000000002d56d14",
+ "0x000000000388340c",
+ "0x0000000003d68f02",
+ "0x000000000281d761",
+ "0x00000000026da198",
+ "0x00000000021a465e",
+ "0x00000000010b311e",
+ "0x00000000015e9a1c",
+ "0x000000000189e4ee",
+ "0x0000000001b6232b",
+ "0x000000000209b83c",
+ "0x00000000021ab81b",
+ "0x00000000024a8e63",
+ "0x00000000008632dc",
+ "0x00000000023cfa12",
+ "0x000000000236c0f7",
+ "0x0000000002d005bf",
+ "0x00000000000b4ba3",
+ "0x0000000000415d6b",
+ "0x00000000028d108f",
+ "0x0000000001c719bb",
+ "0x00000000020647a8",
+ "0x0000000002a53fda",
+ "0x00000000005c501f",
+ "0x00000000029a4540",
+ "0x00000000033df3bd",
+ "0x0000000003596db2",
+ "0x00000000000f00f2",
+ "0x00000000025ebdb1",
+ "0x000000000257426d",
+ "0x000000000196896b",
+ "0x00000000005e02ae",
+ "0x00000000000c8778",
+ "0x0000000003e525bd",
+ "0x0000000001f90080",
+ "0x0000000000c1f774",
+ "0x000000000301c587",
+ "0x00000000021667fc",
+ "0x000000000395ac5f",
+ "0x0000000003480210",
+ "0x000000000129eab3",
+ "0x0000000000314db3",
+ "0x0000000003a4f3f5",
+ "0x0000000001518e98",
+ "0x000000000350cd18",
+ "0x000000000347ca06",
+ "0x0000000001036b48",
+ "0x000000000375d6ad",
+ "0x000000000276d722",
+ "0x0000000002c17c25",
+ "0x0000000000307039",
+ "0x0000000003bdf0bf",
+ "0x000000000023b505",
+ "0x0000000001040116",
+ "0x00000000006438e3",
+ "0x000000000322a5eb",
+ "0x0000000000b97bf0",
+ "0x0000000001ea6410",
+ "0x0000000002a1da48",
+ "0x0000000001dc1846",
+ "0x0000000000046f88",
+ "0x00000000010be557",
+ "0x0000000000540a69",
+ "0x0000000003ba63da",
+ "0x000000000282a80b",
+ "0x0000000003d3dddf",
+ "0x0000000001e080ad",
+ "0x00000000035b50ee",
+ "0x0000000000fa1a24",
+ "0x0000000003bdb890",
+ "0x0000000001990326",
+ "0x0000000003e69aec",
+ "0x00000000021fd436",
+ "0x0000000001ad9c09",
+ "0x00000000039f1cb9",
+ "0x0000000002d497e4",
+ "0x0000000003f55af3",
+ "0x000000000109f5c4",
+ "0x0000000003f13bf8",
+ "0x0000000002fee5c7",
+ "0x00000000000049b4",
+ "0x00000000010f2d0d",
+ "0x00000000014d1039",
+ "0x000000000328b9b4",
+ "0x0000000003a6ec0f",
+ "0x00000000024ec9de",
+ "0x00000000022e96e2",
+ "0x0000000002a2bf2a",
+ "0x0000000003cfa228",
+ "0x00000000027dcfd0",
+ "0x0000000003722f7f",
+ "0x000000000335bd7e",
+ "0x00000000009b7df5",
+ "0x00000000004152a3",
+ "0x0000000002ed4d88",
+ "0x000000000353e0f3",
+ "0x00000000018fc461",
+ "0x000000000335add8",
+ "0x0000000003605c2e",
+ "0x0000000003cdcb39",
+ "0x0000000000960de1",
+ "0x0000000003250652",
+ "0x0000000001a90472",
+ "0x000000000104a170",
+ "0x0000000002db9ad2",
+ "0x0000000002a76c4d",
+ "0x000000000113211a",
+ "0x0000000003c45783",
+ "0x000000000120c35a",
+ "0x0000000000b75034",
+ "0x00000000031388e1",
+ "0x0000000003fcce93",
+ "0x0000000002cb8a5c",
+ "0x0000000002685289",
+ "0x0000000000af5c9d",
+ "0x0000000003a9c311",
+ "0x0000000003cb80c4",
+ "0x000000000318cc75",
+ "0x0000000000b09b4c",
+ "0x0000000001793e8d",
+ "0x0000000002455945",
+ "0x0000000003fc4e38",
+ "0x0000000001a00475",
+ "0x00000000009c4399",
+ "0x0000000000a51901",
+ "0x000000000328e7d4",
+ "0x00000000019c2571",
+ "0x0000000003ff2d0c",
+ "0x00000000032d0900",
+ "0x0000000001e04e2c",
+ "0x000000000238a79d",
+ "0x00000000029b3527",
+ "0x0000000001244ad6",
+ "0x0000000002a7bbb4",
+ "0x0000000003af49f3",
+ "0x0000000002b3bfd1",
+ "0x0000000002516a26",
+ "0x0000000000d3ec14",
+ "0x0000000001643bbe",
+ "0x00000000024994f7",
+ "0x0000000001484346",
+ "0x0000000000a53fa9",
+ "0x00000000037791ef",
+ "0x0000000000eea0fc",
+ "0x00000000039996de",
+ "0x000000000052c3fd",
+ "0x00000000017df744",
+ "0x0000000003bf83dd",
+ "0x0000000001dcca86",
+ "0x000000000323216f",
+ "0x0000000000d69355",
+ "0x000000000028f100",
+ "0x0000000002b9a877",
+ "0x00000000003b0e66",
+ "0x0000000001658668",
+ "0x00000000014539f0",
+ "0x000000000137815a",
+ "0x0000000000b374a8",
+ "0x00000000028ef4b6",
+ "0x00000000011d0cf9",
+ "0x00000000036a59a8",
+ "0x00000000032971b6",
+ "0x00000000007d6bc1",
+ "0x000000000033e9c4",
+ "0x0000000001c11a1e",
+ "0x000000000160df35"
+ ],
+ "cmt_mult_json": [
+ "0x000000000392d55d",
+ "0x00000000010246e9",
+ "0x0000000001041afa",
+ "0x00000000013ff755",
+ "0x00000000007bfdeb",
+ "0x0000000002694216",
+ "0x0000000001e9cfe2",
+ "0x00000000015c851a",
+ "0x0000000002cac503",
+ "0x000000000274bf93",
+ "0x0000000002bafab8",
+ "0x0000000000c9ebfd",
+ "0x00000000021a7adc",
+ "0x000000000356d5d9",
+ "0x0000000003c77647",
+ "0x0000000003e69711",
+ "0x00000000031bdb53",
+ "0x0000000003448557",
+ "0x00000000001a4192",
+ "0x0000000000046f5f",
+ "0x000000000390d46f",
+ "0x0000000003ffac3f",
+ "0x0000000000766d53",
+ "0x0000000002c5880e",
+ "0x0000000001e7c127",
+ "0x0000000002258f88",
+ "0x0000000003fee089",
+ "0x0000000003943083",
+ "0x0000000000d989c6",
+ "0x000000000055f535",
+ "0x000000000080adf1",
+ "0x00000000025bff70",
+ "0x0000000003c3874f",
+ "0x0000000000feb077",
+ "0x0000000001eaba17",
+ "0x000000000038ee35",
+ "0x00000000024778ba",
+ "0x0000000002f247d1",
+ "0x00000000017afe29",
+ "0x0000000003d7dc7b",
+ "0x00000000014c326d",
+ "0x00000000028869d1",
+ "0x0000000000fb1b0a",
+ "0x000000000137c04f",
+ "0x00000000034727c2",
+ "0x0000000003aa0fdf",
+ "0x000000000080bf2c",
+ "0x0000000002a95c33",
+ "0x00000000021148ee",
+ "0x0000000000c15137",
+ "0x000000000067104c",
+ "0x0000000003ba2ea3",
+ "0x00000000005893b2",
+ "0x00000000025e96fb",
+ "0x000000000094a349",
+ "0x00000000019c7e44",
+ "0x000000000388666a",
+ "0x00000000027799f7",
+ "0x0000000000a64804",
+ "0x000000000289cd51",
+ "0x00000000005f4d33",
+ "0x0000000000795460",
+ "0x000000000239b71a",
+ "0x00000000009b8d9f",
+ "0x00000000021b1c18",
+ "0x0000000003848026",
+ "0x00000000035082b8",
+ "0x0000000000ac193b",
+ "0x0000000001a8bc00",
+ "0x0000000000936c60",
+ "0x0000000000e78048",
+ "0x0000000002db32cc",
+ "0x00000000039c692a",
+ "0x0000000002a41d48",
+ "0x0000000001b6e50e",
+ "0x0000000003cb40f6",
+ "0x000000000334c65c",
+ "0x000000000132ed90",
+ "0x0000000000072fa3",
+ "0x00000000019833ae",
+ "0x00000000036fedd3",
+ "0x0000000002be70df",
+ "0x0000000001dd7b7a",
+ "0x0000000002ecaa5d",
+ "0x00000000027ed427",
+ "0x000000000073dae4",
+ "0x00000000000a96c1",
+ "0x0000000000c5bb88",
+ "0x00000000034fd24b",
+ "0x000000000086bf3b",
+ "0x000000000091ac5e",
+ "0x00000000021915d4",
+ "0x00000000031f274c",
+ "0x0000000000a56024",
+ "0x0000000001b23175",
+ "0x0000000003fa4023",
+ "0x0000000001e25d84",
+ "0x0000000002d7e898",
+ "0x0000000001445419",
+ "0x0000000000b4cb7e",
+ "0x0000000002d2b85d",
+ "0x00000000001c6710",
+ "0x0000000001572771",
+ "0x0000000002d47f28",
+ "0x00000000035cdcc8",
+ "0x000000000018ac68",
+ "0x0000000000b63b7e",
+ "0x00000000035f1154",
+ "0x00000000025d6125",
+ "0x000000000288fa4f",
+ "0x0000000002d00512",
+ "0x0000000001445d9d",
+ "0x0000000001f31dae",
+ "0x000000000173aa38",
+ "0x0000000003a20d04",
+ "0x000000000336cca4",
+ "0x0000000002955543",
+ "0x00000000038a1057",
+ "0x0000000000693437",
+ "0x00000000019e4402",
+ "0x0000000003881313",
+ "0x00000000031ab0ff",
+ "0x0000000001ff410b",
+ "0x0000000001fe422e",
+ "0x0000000003b62542",
+ "0x00000000007a80a4",
+ "0x0000000001f4d53e",
+ "0x000000000254b33c",
+ "0x0000000001b35318",
+ "0x0000000000cb3627",
+ "0x00000000024f0817",
+ "0x00000000009c6d3c",
+ "0x0000000001d81536",
+ "0x0000000002a294fb",
+ "0x0000000003c8e2fa",
+ "0x00000000015f6b73",
+ "0x000000000090da97",
+ "0x0000000002428ca3",
+ "0x00000000007aefb9",
+ "0x00000000027926ec",
+ "0x0000000002b3f13d",
+ "0x0000000000a835ad",
+ "0x0000000002701cc9",
+ "0x0000000001b03cbb",
+ "0x00000000018e3669",
+ "0x000000000153359d",
+ "0x0000000002ca8324",
+ "0x00000000039db3f5",
+ "0x000000000061ff02",
+ "0x0000000003f6186e",
+ "0x00000000036a8f6e",
+ "0x00000000006b7349",
+ "0x0000000001bb3dd5",
+ "0x00000000009af684",
+ "0x000000000331faa7",
+ "0x000000000339c428",
+ "0x000000000186654a",
+ "0x00000000019e98fd",
+ "0x00000000032dd376",
+ "0x0000000002682cd1",
+ "0x0000000002b01595",
+ "0x0000000003949fe7",
+ "0x0000000001831800",
+ "0x00000000028c09e2",
+ "0x0000000003abafcd",
+ "0x000000000314027a",
+ "0x000000000223257d",
+ "0x00000000020e82a2",
+ "0x000000000329c964",
+ "0x0000000003368263",
+ "0x000000000358682b",
+ "0x000000000293cec1",
+ "0x0000000002ef6b31",
+ "0x000000000357113d",
+ "0x00000000034bf44f",
+ "0x00000000029df95f",
+ "0x0000000001d8099b",
+ "0x00000000038d58e3",
+ "0x000000000333a630",
+ "0x0000000000c6c527",
+ "0x0000000000deac2f",
+ "0x0000000003465706",
+ "0x000000000386db5a",
+ "0x0000000000f957bf",
+ "0x0000000000c2224b",
+ "0x00000000037d2561",
+ "0x0000000003120721",
+ "0x0000000003ef0383",
+ "0x000000000195195c",
+ "0x00000000028f594b",
+ "0x000000000275b5cb",
+ "0x000000000340be23",
+ "0x0000000003959354",
+ "0x0000000003b43756",
+ "0x0000000000f1dbe4",
+ "0x00000000013eec97",
+ "0x00000000027edaeb",
+ "0x0000000003b52fbd",
+ "0x000000000024e750",
+ "0x0000000003349a4f",
+ "0x00000000034a9e09",
+ "0x0000000001d3007e",
+ "0x0000000002de4649",
+ "0x00000000036c5e4f",
+ "0x000000000070bcef",
+ "0x00000000031fc8da",
+ "0x00000000027ddaac",
+ "0x00000000022b1bee",
+ "0x00000000002c55ec",
+ "0x000000000249463a",
+ "0x0000000002809723",
+ "0x0000000002f48c1f",
+ "0x00000000003dbdb0",
+ "0x0000000000cb9c3c",
+ "0x0000000001661213",
+ "0x0000000002cc5cf6",
+ "0x0000000002e335e3",
+ "0x0000000000c331fc",
+ "0x00000000034f3cfc",
+ "0x00000000004abecf",
+ "0x000000000228a7d2",
+ "0x0000000000e0eefe",
+ "0x00000000009ef160",
+ "0x000000000393d84d",
+ "0x000000000307c68a",
+ "0x000000000395d572",
+ "0x0000000001dd85f9",
+ "0x00000000000235f7",
+ "0x0000000001563e85",
+ "0x000000000244f70b",
+ "0x000000000306b707",
+ "0x0000000003b66f22",
+ "0x00000000012b2758",
+ "0x00000000011378f9",
+ "0x00000000012f455b",
+ "0x0000000001ac2229",
+ "0x000000000069a0f4",
+ "0x00000000003f9bdb",
+ "0x000000000146383b",
+ "0x00000000027a8016",
+ "0x0000000003b1fcd7",
+ "0x0000000000008c1f",
+ "0x00000000031197b1",
+ "0x0000000000a5b48b",
+ "0x0000000001e107da",
+ "0x00000000014fb439",
+ "0x000000000071007b",
+ "0x000000000310892c",
+ "0x00000000027712aa",
+ "0x0000000002ec9f5d",
+ "0x0000000001b92a2e",
+ "0x0000000003d90571",
+ "0x0000000003555179",
+ "0x0000000001d0fd7b",
+ "0x0000000003772d46",
+ "0x0000000003dd5eee",
+ "0x00000000008f3bb2",
+ "0x00000000015b9b1d",
+ "0x00000000015b5326",
+ "0x00000000032485b3",
+ "0x0000000002648258",
+ "0x000000000256d83c",
+ "0x0000000000ef8fac",
+ "0x000000000202479f",
+ "0x0000000003294951",
+ "0x00000000018c5372",
+ "0x0000000000826f0d",
+ "0x000000000073cc38",
+ "0x0000000002dfeb22",
+ "0x00000000024a6781",
+ "0x0000000002bd5623",
+ "0x0000000003a7c4a2",
+ "0x0000000001a3a7f4",
+ "0x00000000038a3a85",
+ "0x0000000001f60b63",
+ "0x000000000291f88d",
+ "0x0000000003a937db",
+ "0x00000000023dbdaf",
+ "0x00000000010ab31a",
+ "0x0000000001a96991",
+ "0x0000000002b9b4f9",
+ "0x0000000003e162a9",
+ "0x00000000037133e4",
+ "0x0000000003bbf4f5",
+ "0x0000000003f884c3",
+ "0x000000000107f2f0",
+ "0x0000000003a8a597",
+ "0x00000000004a7fc7",
+ "0x0000000000e4dc28",
+ "0x00000000010017c0",
+ "0x0000000001664006",
+ "0x0000000000fc93df",
+ "0x00000000018d2c01",
+ "0x0000000001235018",
+ "0x0000000000c24679",
+ "0x00000000000e3420",
+ "0x0000000002a3f714",
+ "0x00000000009a0e03",
+ "0x00000000010c16c5",
+ "0x0000000001b3f84f",
+ "0x000000000381fc99",
+ "0x00000000033dab47",
+ "0x0000000000f03539",
+ "0x000000000003a927",
+ "0x0000000002e4b665",
+ "0x00000000037edb03",
+ "0x0000000002a4538c",
+ "0x0000000001ce6598",
+ "0x0000000001654deb",
+ "0x0000000002b70773",
+ "0x000000000175fee0",
+ "0x000000000240b38a",
+ "0x000000000237a17e",
+ "0x0000000003f33726",
+ "0x00000000010d4588",
+ "0x0000000001ac07d6",
+ "0x0000000001fccc8b",
+ "0x00000000038a3a91",
+ "0x0000000001f0c743",
+ "0x0000000000cda2aa",
+ "0x0000000002e8e0be",
+ "0x0000000001e9b3be",
+ "0x0000000002d9101c",
+ "0x00000000029f1a7f",
+ "0x000000000286faba",
+ "0x00000000033fa1f1",
+ "0x0000000003a26c73",
+ "0x00000000018537f4",
+ "0x00000000001d8af2",
+ "0x00000000027ee5f9",
+ "0x00000000032fbba5",
+ "0x0000000000fee565",
+ "0x0000000003393cd2",
+ "0x0000000002fedfc2",
+ "0x00000000030bf39b",
+ "0x00000000014c1247",
+ "0x0000000002d5f859",
+ "0x0000000000704da8",
+ "0x000000000324f664",
+ "0x0000000003f160c5",
+ "0x0000000000799c22",
+ "0x00000000019083f3",
+ "0x0000000003d4fa43",
+ "0x00000000004b625c",
+ "0x000000000016bd29",
+ "0x0000000001f8d26a",
+ "0x00000000039f7297",
+ "0x00000000021b0c8a",
+ "0x00000000006a97c0",
+ "0x00000000012174aa",
+ "0x00000000034394fc",
+ "0x0000000002b63eab",
+ "0x0000000002952282",
+ "0x0000000002021a1e",
+ "0x00000000015c21e8",
+ "0x0000000001fb5d3d",
+ "0x000000000237f5b3",
+ "0x00000000007af1ed",
+ "0x00000000019fad10",
+ "0x00000000022b757d",
+ "0x0000000001234e32",
+ "0x0000000003996a19",
+ "0x000000000189550e",
+ "0x0000000001ed1b61",
+ "0x00000000036a37ec",
+ "0x0000000001f95c1a",
+ "0x000000000075c54c",
+ "0x0000000001993af9",
+ "0x00000000009c6d41",
+ "0x00000000002e08d5",
+ "0x0000000002c987d3",
+ "0x00000000025eb72e",
+ "0x0000000001780af8",
+ "0x000000000158c42c",
+ "0x000000000136344b",
+ "0x000000000238774e",
+ "0x0000000001ec236e",
+ "0x000000000358d4cb",
+ "0x000000000340f5b3",
+ "0x0000000001000af1",
+ "0x000000000162464f",
+ "0x0000000001c97479",
+ "0x00000000025dd7c6",
+ "0x000000000022daf8",
+ "0x000000000322d838",
+ "0x0000000003e136a2",
+ "0x0000000002175512",
+ "0x0000000000a857a9",
+ "0x0000000000d9c55a",
+ "0x0000000002819e76",
+ "0x0000000000ebd58e",
+ "0x0000000003b0feb4",
+ "0x00000000025659a4",
+ "0x0000000000151d74",
+ "0x0000000002e83098",
+ "0x0000000000fcca3c",
+ "0x0000000002efacbc",
+ "0x000000000025e5f3",
+ "0x000000000301a391",
+ "0x0000000003b55dc3",
+ "0x0000000003e74929",
+ "0x0000000002c2e434",
+ "0x00000000020766ff",
+ "0x0000000003f90447",
+ "0x0000000001dc1bbb",
+ "0x00000000034acbd7",
+ "0x0000000000e76298",
+ "0x0000000003569d13",
+ "0x00000000015ebea1",
+ "0x0000000000abb65f",
+ "0x00000000001688f3",
+ "0x0000000001823ea8",
+ "0x000000000020247c",
+ "0x000000000263335f",
+ "0x000000000026b1f2",
+ "0x00000000035c02fe",
+ "0x0000000001820f9d",
+ "0x00000000012b4484",
+ "0x0000000000390fec",
+ "0x0000000001629bb0",
+ "0x0000000003ac5ed5",
+ "0x00000000008cf517",
+ "0x0000000003465142",
+ "0x0000000003f48bd1",
+ "0x0000000003729f58",
+ "0x0000000000946b2b",
+ "0x00000000010a292d",
+ "0x0000000000026899",
+ "0x000000000162f67c",
+ "0x0000000002407a58",
+ "0x0000000002650257",
+ "0x00000000011374e2",
+ "0x00000000033fd37b",
+ "0x00000000005324f3",
+ "0x00000000011db2df",
+ "0x0000000001de18aa",
+ "0x000000000189d25f",
+ "0x00000000034ae84f",
+ "0x000000000031279e",
+ "0x0000000001e59bbd",
+ "0x0000000001212827",
+ "0x0000000000f8243b",
+ "0x0000000000b56829",
+ "0x000000000323fea9",
+ "0x0000000000746b81",
+ "0x0000000001ed3568",
+ "0x0000000000703a7f",
+ "0x0000000002002e11",
+ "0x0000000002d8b2c3",
+ "0x000000000085ad90",
+ "0x00000000036bf8f5",
+ "0x000000000178a9d7",
+ "0x00000000015905cc",
+ "0x0000000001dda83e",
+ "0x00000000030445c9",
+ "0x000000000281b9d8",
+ "0x0000000001cc9efa",
+ "0x0000000000029c9a",
+ "0x0000000000489162",
+ "0x00000000005f4ecf",
+ "0x00000000009d3943",
+ "0x000000000210aeaa",
+ "0x0000000003864752",
+ "0x0000000002fc8d8d",
+ "0x0000000000ca1ecd",
+ "0x000000000063c766",
+ "0x000000000388b655",
+ "0x0000000001851ac6",
+ "0x0000000000c1a14c",
+ "0x0000000001bc65f3",
+ "0x00000000015d853f",
+ "0x0000000002af0816",
+ "0x0000000002ef1b71",
+ "0x00000000013d3368",
+ "0x0000000002df2a5b",
+ "0x0000000000ad2331",
+ "0x0000000002483082",
+ "0x00000000005bb5f0",
+ "0x0000000000bc6658",
+ "0x0000000001db8fdd",
+ "0x0000000003509d1b",
+ "0x0000000003bd2b7c",
+ "0x00000000030ee2cc",
+ "0x0000000003ff1cdf",
+ "0x0000000002ef2d40",
+ "0x0000000003b914b8",
+ "0x00000000002e0ad8",
+ "0x0000000003d15fd3",
+ "0x00000000026c688a",
+ "0x0000000000402383",
+ "0x00000000035215c6",
+ "0x0000000000def848",
+ "0x0000000002b2c725",
+ "0x0000000002148433",
+ "0x0000000003fb5911",
+ "0x0000000000ed7ef6",
+ "0x000000000135725b",
+ "0x0000000000bb6252",
+ "0x00000000023e160f",
+ "0x000000000181d9aa",
+ "0x0000000000d9b7a6",
+ "0x0000000003ccb713",
+ "0x00000000003754f0",
+ "0x000000000398fa2b",
+ "0x0000000001748546",
+ "0x000000000019d7d4",
+ "0x0000000000a99a9f",
+ "0x0000000000fdee96",
+ "0x000000000295d72a",
+ "0x0000000003ab0786",
+ "0x0000000000d97172",
+ "0x0000000002e34206"
+ ]
+ },
+ "a": [
+ "0x0000000001494bcc",
+ "0x000000000397770b"
+ ],
+ "z": [
+ "0x000000000568bcbe",
+ "0x00000000023985be",
+ "0x0000000000a1b79e",
+ "0x00000000073fe4ae",
+ "0x000000000623ea3e",
+ "0x000000000cfdf1ce",
+ "0x000000000d9cb53e",
+ "0x0000000002984a5e",
+ "0x000000000d316b4e",
+ "0x00000000059be2ce",
+ "0x000000000c05e25e",
+ "0x00000000039c96ee",
+ "0x0000000004d39bde",
+ "0x00000000038655be",
+ "0x000000000819d34e",
+ "0x000000000777719e",
+ "0x000000000a70fbae",
+ "0x00000000054e924e",
+ "0x00000000035b40fe",
+ "0x000000000d65ab8e",
+ "0x000000000103c8ee",
+ "0x000000000a65953e",
+ "0x000000000a58a14e",
+ "0x00000000060aeade",
+ "0x0000000000465bce",
+ "0x0000000008cd785e",
+ "0x000000000c65e10e",
+ "0x0000000008b6aa8e",
+ "0x000000000ca955ce",
+ "0x00000000093a1c3e",
+ "0x00000000025e101e",
+ "0x000000000a8341ce",
+ "0x000000000256901e",
+ "0x000000000cf1bc2e",
+ "0x00000000033eea9e",
+ "0x000000000a9c6e2e",
+ "0x000000000767a62e",
+ "0x000000000cc1b02e",
+ "0x000000000116a14e",
+ "0x000000000972e6fe",
+ "0x000000000461b10e",
+ "0x0000000004ef54be",
+ "0x00000000070cc7fe",
+ "0x00000000013f220e",
+ "0x000000000209c4be",
+ "0x00000000071f0b4e",
+ "0x0000000003608d8e",
+ "0x000000000bfa917e",
+ "0x000000000e17358e",
+ "0x000000000e06bd9e",
+ "0x000000000a28d9be",
+ "0x000000000b844cee",
+ "0x000000000857972e",
+ "0x0000000005b2d34e",
+ "0x000000000bb3e86e",
+ "0x0000000001b57a4e",
+ "0x0000000006b50d3e",
+ "0x000000000820da5e",
+ "0x000000000019e86e",
+ "0x000000000277895e",
+ "0x0000000001073b1e",
+ "0x0000000000ee0a0e",
+ "0x000000000c912fee",
+ "0x000000000782fabe",
+ "0x000000000aa6831e",
+ "0x000000000338a0ee",
+ "0x000000000c8e040e",
+ "0x000000000d7f1b6e",
+ "0x00000000024c776e",
+ "0x000000000c8fa80e",
+ "0x0000000007a092ae",
+ "0x0000000008abefae",
+ "0x0000000004c81c1e",
+ "0x0000000008f91c8e",
+ "0x000000000b2e470e",
+ "0x0000000002680e8e",
+ "0x00000000070cff4e",
+ "0x00000000021f203e",
+ "0x000000000b9fd8ce",
+ "0x000000000164750e",
+ "0x000000000812174e",
+ "0x000000000db1463e",
+ "0x000000000ad8b83e",
+ "0x000000000e0d47fe",
+ "0x000000000d7857de",
+ "0x0000000007ad152e",
+ "0x000000000be770ee",
+ "0x0000000006c1595e",
+ "0x0000000008d287fe",
+ "0x000000000de66c2e",
+ "0x00000000000ba5ce",
+ "0x00000000088208ce",
+ "0x0000000005ecee9e",
+ "0x000000000a9d204e",
+ "0x000000000511fe2e",
+ "0x00000000065f69ce",
+ "0x00000000066a3c1e",
+ "0x000000000d4899ae",
+ "0x0000000009574dfe",
+ "0x000000000dd85d1e",
+ "0x000000000c7d54ce",
+ "0x000000000722e67e",
+ "0x000000000953114e",
+ "0x000000000cc35e7e",
+ "0x000000000bbfc7ce",
+ "0x0000000003868eee",
+ "0x00000000069f422e",
+ "0x000000000dd7c8fe",
+ "0x000000000904ba4e",
+ "0x0000000002edd83e",
+ "0x0000000008404e8e",
+ "0x0000000007ef06be",
+ "0x000000000dea41be",
+ "0x000000000ba9413e",
+ "0x0000000003fa67ce",
+ "0x00000000087a0dfe",
+ "0x000000000d33d7ee",
+ "0x0000000007d8b77e",
+ "0x0000000006727a6e",
+ "0x00000000007970fe",
+ "0x000000000952151e",
+ "0x000000000c913eee",
+ "0x000000000e0b2cee",
+ "0x000000000561ffbe",
+ "0x0000000005dc49ae",
+ "0x00000000099a92ee",
+ "0x00000000070926ee",
+ "0x0000000004a4cdae",
+ "0x00000000008a875e",
+ "0x00000000047d3fbe",
+ "0x00000000071c8a0e",
+ "0x00000000020e7b4e",
+ "0x000000000316ec2e",
+ "0x000000000c07658e",
+ "0x000000000b84546e",
+ "0x000000000bc19aae",
+ "0x000000000015485e",
+ "0x000000000dc8b09e",
+ "0x000000000d28c21e",
+ "0x0000000005dc701e",
+ "0x00000000059b0dfe",
+ "0x0000000000d902ee",
+ "0x000000000a72d24e",
+ "0x000000000b738bde",
+ "0x000000000a765ebe",
+ "0x00000000008a46ae",
+ "0x0000000009ef1a4e",
+ "0x0000000007daddce",
+ "0x0000000009d5cb3e",
+ "0x000000000421f10e",
+ "0x00000000001b254e",
+ "0x0000000002bca3fe",
+ "0x000000000e47ad5e",
+ "0x0000000005a0cdde",
+ "0x00000000015f0d4e",
+ "0x000000000163517e",
+ "0x000000000d46d89e",
+ "0x000000000753b93e",
+ "0x0000000005217f8e",
+ "0x0000000003d4e13e",
+ "0x000000000e3334be",
+ "0x000000000a888d6e",
+ "0x000000000708dbee",
+ "0x0000000008a44a2e",
+ "0x00000000067b5eae",
+ "0x000000000d33793e",
+ "0x000000000c60677e",
+ "0x000000000a5da5ae",
+ "0x000000000bb501ae",
+ "0x000000000a96364e",
+ "0x0000000002add3ce",
+ "0x0000000009000efe",
+ "0x000000000b2c940e",
+ "0x0000000001ebc0fe",
+ "0x00000000027bc9ce",
+ "0x0000000003b8c7ce",
+ "0x000000000318722e",
+ "0x000000000b38d30e",
+ "0x000000000e26970e",
+ "0x000000000319c3ae",
+ "0x0000000003deadfe",
+ "0x0000000001a1e66e",
+ "0x00000000023205be",
+ "0x0000000007b2594e",
+ "0x000000000c83267e",
+ "0x0000000004c5179e",
+ "0x000000000a4a590e",
+ "0x00000000045cfe3e",
+ "0x000000000b05f43e",
+ "0x000000000408056e",
+ "0x0000000006a888de",
+ "0x000000000224177e",
+ "0x00000000017b4ffe",
+ "0x0000000002fa209e",
+ "0x0000000000b6696e",
+ "0x0000000006ba470e",
+ "0x000000000ad6dfbe",
+ "0x000000000b3c0a2e",
+ "0x000000000544e83e",
+ "0x00000000038880be",
+ "0x0000000007fe917e",
+ "0x000000000a74818e",
+ "0x000000000aaf666e",
+ "0x0000000004a5946e",
+ "0x000000000b3265be",
+ "0x000000000d697e4e",
+ "0x00000000064dc12e",
+ "0x000000000c6f974e",
+ "0x00000000001a462e",
+ "0x0000000002ec59be",
+ "0x0000000000ba7dce",
+ "0x0000000009a063ae",
+ "0x0000000000bb2a4e",
+ "0x0000000001514fce",
+ "0x000000000842f54e",
+ "0x0000000005acd2be",
+ "0x0000000003baad6e",
+ "0x000000000a8ab3be",
+ "0x000000000a5d1cce",
+ "0x000000000cecde3e",
+ "0x00000000082556ce",
+ "0x00000000011b988e",
+ "0x000000000561902e",
+ "0x000000000574fcae",
+ "0x0000000004d3990e",
+ "0x000000000a10f84e",
+ "0x0000000007e1c9ae",
+ "0x0000000006acdede",
+ "0x00000000099c38ce",
+ "0x0000000009e0b5ee",
+ "0x0000000006eed42e",
+ "0x000000000d221e6e",
+ "0x000000000ab22b2e",
+ "0x0000000003195e6e",
+ "0x000000000c9a412e",
+ "0x00000000085ee57e",
+ "0x000000000022a45e",
+ "0x00000000004e82ae",
+ "0x0000000003de404e",
+ "0x000000000857873e",
+ "0x0000000003072a1e",
+ "0x000000000bd3899e",
+ "0x0000000002bab9ae",
+ "0x000000000c55d03e",
+ "0x000000000b1c815e",
+ "0x0000000000f0053e",
+ "0x000000000056462e",
+ "0x000000000312a8ee",
+ "0x00000000092f570e",
+ "0x000000000d46bf4e",
+ "0x000000000236f84e",
+ "0x00000000024b231e",
+ "0x000000000248b67e",
+ "0x00000000062e9bbe",
+ "0x000000000586c7fe",
+ "0x000000000a5d811e",
+ "0x00000000084097ae",
+ "0x000000000482b2be",
+ "0x000000000375779e",
+ "0x0000000003beecee",
+ "0x0000000002c6945e",
+ "0x000000000a38af7e",
+ "0x00000000075843be",
+ "0x00000000062e097e",
+ "0x0000000004af91ee",
+ "0x00000000038a638e",
+ "0x000000000b05313e",
+ "0x000000000a8532ae",
+ "0x000000000aee159e",
+ "0x0000000007f31a2e",
+ "0x00000000008496be",
+ "0x0000000000716aee",
+ "0x000000000085307e",
+ "0x000000000dd0b5be",
+ "0x000000000827402e",
+ "0x000000000583b83e",
+ "0x000000000aaf3ffe",
+ "0x0000000004020b6e",
+ "0x0000000007ec9bfe",
+ "0x00000000066d4cce",
+ "0x0000000001d4fd7e",
+ "0x000000000b06a92e",
+ "0x000000000a4b11be",
+ "0x000000000b2db01e",
+ "0x0000000001b9c41e",
+ "0x000000000568289e",
+ "0x000000000d52f7be",
+ "0x0000000006e2d8ae",
+ "0x0000000002ad247e",
+ "0x00000000011e778e",
+ "0x000000000d758c8e",
+ "0x00000000049bd3de",
+ "0x000000000aaa896e",
+ "0x00000000004205ce",
+ "0x00000000019ce89e",
+ "0x0000000005a3695e",
+ "0x0000000001eff44e",
+ "0x000000000350960e",
+ "0x0000000002959dfe",
+ "0x0000000005f161ae",
+ "0x000000000e2071ee",
+ "0x000000000c23c27e",
+ "0x000000000a81a27e",
+ "0x0000000005a9752e",
+ "0x000000000d68dfde",
+ "0x0000000008fde4ee",
+ "0x0000000002b61c6e",
+ "0x00000000020fe16e",
+ "0x00000000048be6ae",
+ "0x00000000039a7eae",
+ "0x000000000925124e",
+ "0x000000000aaa251e",
+ "0x000000000b58554e",
+ "0x000000000a14a2be",
+ "0x000000000598682e",
+ "0x000000000d72646e",
+ "0x000000000a9b7e2e",
+ "0x0000000006ab59ce",
+ "0x000000000381173e",
+ "0x0000000001c4e07e",
+ "0x0000000005798dbe",
+ "0x00000000091319fe",
+ "0x000000000ac529fe",
+ "0x0000000007a7149e",
+ "0x000000000361bb6e",
+ "0x000000000cb0ba9e",
+ "0x000000000862afce",
+ "0x000000000a4d3ade",
+ "0x0000000005ce70fe",
+ "0x0000000003b275ae",
+ "0x000000000b5d699e",
+ "0x000000000050765e",
+ "0x000000000c74c4ee",
+ "0x000000000b562efe",
+ "0x000000000ac8da0e",
+ "0x0000000003092cce",
+ "0x0000000003b163ee",
+ "0x000000000bd762ee",
+ "0x0000000004d3a80e",
+ "0x000000000016b5fe",
+ "0x00000000051d4b4e",
+ "0x0000000009f1175e",
+ "0x000000000508c49e",
+ "0x000000000e0d01ae",
+ "0x0000000004a8f2ee",
+ "0x000000000bba213e",
+ "0x000000000ab3da6e",
+ "0x000000000d1f4c8e",
+ "0x0000000007a03e4e",
+ "0x00000000012ad2ae",
+ "0x0000000003d7be5e",
+ "0x000000000d0651de",
+ "0x0000000007621d9e",
+ "0x000000000553163e",
+ "0x0000000002ccc00e",
+ "0x00000000032ad28e",
+ "0x000000000215681e",
+ "0x00000000051d1b7e",
+ "0x000000000516533e",
+ "0x0000000002c5a90e",
+ "0x0000000006faccde",
+ "0x0000000002cdf0be",
+ "0x0000000006264e6e",
+ "0x000000000b1813ee",
+ "0x0000000001d7944e",
+ "0x000000000874031e",
+ "0x000000000dee7e6e",
+ "0x000000000de1ebfe",
+ "0x0000000002d0ac1e",
+ "0x00000000028f175e",
+ "0x0000000000fcfcee",
+ "0x000000000d0a555e",
+ "0x000000000998f84e",
+ "0x000000000b3acc5e",
+ "0x000000000b287afe",
+ "0x000000000da3d0ee",
+ "0x0000000009efb5ee",
+ "0x000000000c1f514e",
+ "0x000000000bda25ce",
+ "0x000000000ca738de",
+ "0x000000000371c00e",
+ "0x000000000b31404e",
+ "0x000000000b5f115e",
+ "0x000000000c64b50e",
+ "0x000000000bd48f2e",
+ "0x000000000168e72e",
+ "0x000000000da09bae",
+ "0x0000000001d9d20e",
+ "0x000000000813380e",
+ "0x000000000d6f595e",
+ "0x000000000a68d1fe",
+ "0x0000000008325f5e",
+ "0x000000000e3e061e",
+ "0x0000000007e6227e",
+ "0x0000000008b0ed7e",
+ "0x000000000ca1af5e",
+ "0x000000000443a11e",
+ "0x000000000d068b0e",
+ "0x000000000851ca2e",
+ "0x0000000006439f1e",
+ "0x000000000973aeae",
+ "0x00000000066bf2de",
+ "0x00000000042b0bae",
+ "0x00000000047c366e",
+ "0x0000000009df457e",
+ "0x000000000732a79e",
+ "0x00000000013040fe",
+ "0x000000000b7a55fe",
+ "0x000000000e3204fe",
+ "0x0000000009120fbe",
+ "0x00000000007f664e",
+ "0x0000000005a3d43e",
+ "0x000000000636ccee",
+ "0x0000000001bcc4de",
+ "0x000000000317f93e",
+ "0x000000000be51d9e",
+ "0x00000000031fd06e",
+ "0x0000000008d5a89e",
+ "0x000000000519a1ce",
+ "0x000000000723326e",
+ "0x000000000aa8d75e",
+ "0x000000000d2cfece",
+ "0x0000000009fb2e2e",
+ "0x0000000008dd9cde",
+ "0x000000000454820e",
+ "0x000000000b726b1e",
+ "0x000000000843404e",
+ "0x0000000007b27bfe",
+ "0x000000000a42007e",
+ "0x000000000d2c5bae",
+ "0x000000000b27585e",
+ "0x000000000c0e336e",
+ "0x00000000074dd5be",
+ "0x00000000036276ee",
+ "0x000000000d9f6afe",
+ "0x000000000b86931e",
+ "0x000000000bbe197e",
+ "0x0000000009f5a1de",
+ "0x0000000009d320be",
+ "0x000000000ad825fe",
+ "0x0000000007516f4e",
+ "0x0000000004e9cc2e",
+ "0x000000000375977e",
+ "0x0000000000b1335e",
+ "0x000000000276b84e",
+ "0x0000000001bd841e",
+ "0x0000000006121eee",
+ "0x00000000003c116e",
+ "0x0000000003d4c06e",
+ "0x0000000003a6dc9e",
+ "0x000000000517a00e",
+ "0x000000000cb70cbe",
+ "0x0000000004ccb3be",
+ "0x0000000008f6b85e",
+ "0x00000000012b5e5e",
+ "0x000000000c78ab5e",
+ "0x00000000010f64ce",
+ "0x000000000cdacabe",
+ "0x000000000dfb31ae",
+ "0x000000000873f41e",
+ "0x000000000881b37e",
+ "0x00000000059a482e",
+ "0x00000000011d4f4e",
+ "0x0000000003286a9e",
+ "0x000000000c26855e",
+ "0x00000000080b7fce",
+ "0x000000000cefa89e",
+ "0x00000000035fae6e",
+ "0x000000000ae27d7e",
+ "0x000000000e3f19be",
+ "0x000000000da296de",
+ "0x0000000002f9525e",
+ "0x000000000d97bb2e",
+ "0x00000000053d845e",
+ "0x0000000005c260de",
+ "0x00000000041c885e",
+ "0x000000000506c5ae",
+ "0x000000000342716e",
+ "0x00000000075e2bee",
+ "0x00000000071f96fe",
+ "0x0000000006c2b61e",
+ "0x000000000a796f6e",
+ "0x0000000009e539de",
+ "0x00000000084d373e",
+ "0x000000000234ec3e",
+ "0x00000000020bd1be",
+ "0x000000000aef3fbe",
+ "0x0000000001fd810e",
+ "0x0000000006680f3e",
+ "0x00000000002134de",
+ "0x000000000d4bd84e",
+ "0x00000000015321be",
+ "0x000000000bd4b68e",
+ "0x000000000c44adae",
+ "0x000000000b628a1e",
+ "0x000000000238226e",
+ "0x0000000001754abe",
+ "0x00000000074e88ce",
+ "0x000000000449777e",
+ "0x000000000b4e3bae",
+ "0x0000000004ac7d7e",
+ "0x0000000002233d0e",
+ "0x0000000000a5d37e",
+ "0x00000000094f8f2e",
+ "0x0000000001ee94be",
+ "0x00000000022efe6e",
+ "0x00000000043c50ee",
+ "0x00000000094add4e",
+ "0x00000000030f72be",
+ "0x000000000b58275e",
+ "0x00000000029a16ae",
+ "0x00000000041aab2e",
+ "0x0000000001220465",
+ "0x000000000a25cd35",
+ "0x0000000004d756a5",
+ "0x000000000a6d1695",
+ "0x00000000035e2245",
+ "0x00000000045fab05",
+ "0x00000000023b6ad5",
+ "0x0000000000d75c85",
+ "0x000000000dede155",
+ "0x000000000343eba5",
+ "0x000000000ba33c65",
+ "0x0000000007505df5",
+ "0x000000000774b795",
+ "0x000000000bd5b055",
+ "0x0000000007e52115",
+ "0x000000000ca699e5",
+ "0x000000000e264315",
+ "0x000000000c021e15",
+ "0x00000000006ef645",
+ "0x000000000bc1c635",
+ "0x0000000001ef2ee5",
+ "0x0000000006b1f1b5",
+ "0x0000000003b8b755",
+ "0x00000000085936e5",
+ "0x000000000bfdd265",
+ "0x0000000001fc99e5",
+ "0x000000000a664c75",
+ "0x00000000015ffbd5",
+ "0x00000000014bec35",
+ "0x00000000074800b5",
+ "0x0000000004e971a5",
+ "0x000000000cc5f795",
+ "0x0000000002a99b45",
+ "0x0000000004395365",
+ "0x000000000d524515",
+ "0x00000000039f7295",
+ "0x00000000074e19a5",
+ "0x00000000064c2335",
+ "0x0000000008db6345",
+ "0x0000000007a8dd95",
+ "0x00000000009d29c5",
+ "0x0000000006cb05b5",
+ "0x000000000dbb0735",
+ "0x000000000b691d55",
+ "0x0000000005ce2cf5",
+ "0x0000000003047885",
+ "0x000000000385d4c5",
+ "0x0000000007d1b3a5",
+ "0x0000000007a39795",
+ "0x0000000007766a95",
+ "0x0000000005d08045",
+ "0x000000000988d525",
+ "0x000000000ab7a705",
+ "0x00000000071a1ce5",
+ "0x00000000018044d5",
+ "0x00000000081b77b5",
+ "0x0000000006edb015",
+ "0x0000000003e65205",
+ "0x000000000df92e75",
+ "0x0000000004f37e25",
+ "0x000000000a5f7bc5",
+ "0x00000000076e14d5",
+ "0x000000000a3be525",
+ "0x000000000641a725",
+ "0x000000000e051915",
+ "0x000000000b006585",
+ "0x000000000cb01335",
+ "0x000000000e417315",
+ "0x00000000079b7295",
+ "0x0000000002b3a7c5",
+ "0x000000000ce779b5",
+ "0x0000000002a09f95",
+ "0x000000000c14b115",
+ "0x000000000bb92755",
+ "0x0000000004565915",
+ "0x0000000009c81965",
+ "0x000000000afcbcf5",
+ "0x0000000008e8bd65",
+ "0x00000000017eef95",
+ "0x000000000701d365",
+ "0x000000000a443275",
+ "0x00000000033f6c65",
+ "0x000000000bbc8b75",
+ "0x0000000001ab7d35",
+ "0x00000000042b2bf5",
+ "0x0000000001f8fc95",
+ "0x00000000065d3d55",
+ "0x0000000001510715",
+ "0x0000000009de3515",
+ "0x0000000008d054f5",
+ "0x0000000005261885",
+ "0x000000000ba614d5",
+ "0x000000000d12a405",
+ "0x0000000002e638c5",
+ "0x000000000cf68c75",
+ "0x0000000000276a55",
+ "0x000000000cd75bc5",
+ "0x00000000022157d5",
+ "0x000000000d9fa0d5",
+ "0x000000000c4a8b05",
+ "0x000000000d58f5e5",
+ "0x0000000005c6d905",
+ "0x0000000005886035",
+ "0x000000000d847df5",
+ "0x00000000034cd675",
+ "0x00000000014acc65",
+ "0x0000000009b08e35",
+ "0x0000000008ca4835",
+ "0x000000000d2c80a5",
+ "0x000000000495a2f5",
+ "0x000000000c78c8d5",
+ "0x00000000098fde15",
+ "0x000000000bef60e5",
+ "0x00000000071a2be5",
+ "0x000000000ccf3d55",
+ "0x0000000001bd8a25",
+ "0x000000000ad90df5",
+ "0x00000000021b6eb5",
+ "0x000000000dce8765",
+ "0x0000000009a40ac5",
+ "0x0000000000c1b8d5",
+ "0x000000000b2e8a05",
+ "0x000000000043dfa5",
+ "0x0000000001a45555",
+ "0x000000000c096305",
+ "0x0000000005e0b3c5",
+ "0x0000000000b143b5",
+ "0x0000000006b8abe5",
+ "0x000000000cf65345",
+ "0x0000000003ebd315",
+ "0x0000000005200085",
+ "0x0000000001f21475",
+ "0x00000000015e8c55",
+ "0x00000000027b95b5",
+ "0x00000000027323d5",
+ "0x000000000a7c5dd5",
+ "0x0000000009b88db5",
+ "0x0000000009c30d85",
+ "0x000000000d252535",
+ "0x0000000006554915",
+ "0x00000000094204b5",
+ "0x00000000091ce725",
+ "0x0000000009df8c35",
+ "0x000000000b00eaa5",
+ "0x00000000063dc565",
+ "0x000000000cefcd95",
+ "0x00000000001d5565",
+ "0x000000000ab69905",
+ "0x0000000009718505",
+ "0x000000000cd3ed55",
+ "0x0000000007cfbc35",
+ "0x0000000004edb4e5",
+ "0x0000000005d3b675",
+ "0x0000000005beaaa5",
+ "0x0000000004c5c395",
+ "0x00000000018df265",
+ "0x000000000c86a095",
+ "0x0000000005b4e565",
+ "0x0000000005b7bb05",
+ "0x00000000051cc5a5",
+ "0x000000000af5ca85",
+ "0x000000000608d6c5",
+ "0x00000000067fae85",
+ "0x0000000002144a95",
+ "0x000000000b8b7e95",
+ "0x000000000bea8e35",
+ "0x000000000415e335",
+ "0x0000000008c9dd55",
+ "0x000000000bb03505",
+ "0x000000000668ea15",
+ "0x0000000001328d35",
+ "0x000000000d058135",
+ "0x0000000006261875",
+ "0x000000000b28ea05",
+ "0x0000000006b59c25",
+ "0x000000000d31df05",
+ "0x000000000a100d65",
+ "0x000000000616f205",
+ "0x00000000044afa25",
+ "0x00000000051840c5",
+ "0x000000000057ef45",
+ "0x000000000bf43485",
+ "0x00000000095657d5",
+ "0x0000000007e6aad5",
+ "0x0000000000fc16b5",
+ "0x0000000007ac14b5",
+ "0x000000000adb2815",
+ "0x000000000e0e8ea5",
+ "0x000000000c97e215",
+ "0x000000000776a5a5",
+ "0x000000000af37eb5",
+ "0x000000000e3c2b35",
+ "0x000000000128a455",
+ "0x000000000c8d4e95",
+ "0x00000000033b87d5",
+ "0x000000000cc88055",
+ "0x000000000592c7a5",
+ "0x000000000e335055",
+ "0x00000000093c0605",
+ "0x000000000bd69d85",
+ "0x00000000019b1355",
+ "0x00000000046db475",
+ "0x0000000004f16b85",
+ "0x00000000096ccd85",
+ "0x0000000005be3935",
+ "0x0000000009341fd5",
+ "0x000000000b1b7b45",
+ "0x000000000dedbbd5",
+ "0x0000000005b4bd15",
+ "0x00000000058a0345",
+ "0x0000000007d631f5",
+ "0x000000000d5349b5",
+ "0x000000000bbadd25",
+ "0x0000000002bb9ed5",
+ "0x0000000005eb4835",
+ "0x00000000001d6fa5",
+ "0x0000000008859f05",
+ "0x0000000009e4a085",
+ "0x00000000037ad935",
+ "0x000000000c0e60d5",
+ "0x000000000a61a305",
+ "0x0000000007da12c5",
+ "0x000000000416b445",
+ "0x000000000d49e415",
+ "0x0000000009600875",
+ "0x0000000007040315",
+ "0x0000000005eae5c5",
+ "0x000000000d95f5d5",
+ "0x000000000a106fd5",
+ "0x0000000001bc9755",
+ "0x000000000d491f35",
+ "0x0000000005021345",
+ "0x0000000005baf225",
+ "0x000000000cb84915",
+ "0x00000000030c2765",
+ "0x000000000641d7e5",
+ "0x000000000382e035",
+ "0x000000000616f115",
+ "0x00000000090aa105",
+ "0x0000000003dde4d5",
+ "0x000000000343c175",
+ "0x00000000085f0115",
+ "0x00000000067ef6c5",
+ "0x00000000041ef835",
+ "0x0000000007cf65f5",
+ "0x00000000006914a5",
+ "0x0000000004c51da5",
+ "0x000000000e1f2c15",
+ "0x0000000004f43225",
+ "0x00000000035f1e75",
+ "0x000000000a9eeee5",
+ "0x00000000076d7755",
+ "0x000000000aef80d5",
+ "0x00000000098519d5",
+ "0x0000000006172b35",
+ "0x0000000008068715",
+ "0x00000000003d9505",
+ "0x000000000e31b015",
+ "0x000000000892d585",
+ "0x000000000ae66365",
+ "0x0000000005cddd45",
+ "0x0000000006b3ebf5",
+ "0x00000000093e5a45",
+ "0x0000000008de1725",
+ "0x000000000aec9d25",
+ "0x000000000c53e1a5",
+ "0x000000000afdecb5",
+ "0x0000000003be1d35",
+ "0x000000000a544bb5",
+ "0x000000000be41ff5",
+ "0x0000000008920385",
+ "0x0000000009f71765",
+ "0x000000000492aaa5",
+ "0x00000000042f66c5",
+ "0x000000000247e3f5",
+ "0x000000000433afa5",
+ "0x00000000088cd135",
+ "0x000000000beba0e5",
+ "0x0000000000dd2025",
+ "0x0000000000e5a2e5",
+ "0x0000000002c4ffc5",
+ "0x00000000064a29e5",
+ "0x0000000005b97945",
+ "0x00000000066d5875",
+ "0x000000000432b0a5",
+ "0x000000000b092715",
+ "0x00000000086d80a5",
+ "0x000000000b6b2785",
+ "0x0000000004d07605",
+ "0x0000000007ed3445",
+ "0x00000000095bdf75",
+ "0x00000000074e61d5",
+ "0x0000000003eb05c5",
+ "0x000000000950bd75",
+ "0x0000000003834755",
+ "0x0000000003f935a5",
+ "0x000000000cc14a65",
+ "0x00000000088833f5",
+ "0x00000000030743d5",
+ "0x000000000c229235",
+ "0x0000000009c70a75",
+ "0x00000000055bbb25",
+ "0x000000000b6a5fd5",
+ "0x0000000003a81805",
+ "0x0000000007cd10c5",
+ "0x0000000009059615",
+ "0x0000000009d5e135",
+ "0x000000000067ae85",
+ "0x0000000002b3d4c5",
+ "0x0000000006284825",
+ "0x00000000015acc55",
+ "0x0000000007853ac5",
+ "0x000000000a4a6d25",
+ "0x000000000ddb46d5",
+ "0x000000000c52ae25",
+ "0x000000000bd84db5",
+ "0x00000000005861a5",
+ "0x000000000ceece95",
+ "0x0000000008ad9415",
+ "0x000000000cde7a45",
+ "0x000000000dd88b75",
+ "0x0000000009de92d5",
+ "0x0000000007061e25",
+ "0x000000000998c615",
+ "0x0000000003db8fa5",
+ "0x0000000001441f55",
+ "0x0000000007910ee5",
+ "0x0000000004fd9e55",
+ "0x0000000007813295",
+ "0x000000000c286985",
+ "0x00000000098be125",
+ "0x0000000005bb6a25",
+ "0x000000000c722705",
+ "0x0000000007095f95",
+ "0x000000000294c7b5",
+ "0x000000000387b1f5",
+ "0x0000000007b9e8b5",
+ "0x000000000bbe2525",
+ "0x0000000006d812f5",
+ "0x000000000d48ff55",
+ "0x000000000e203475",
+ "0x0000000003d91a95",
+ "0x0000000008ea9e55",
+ "0x000000000b21d4e5",
+ "0x000000000a208465",
+ "0x000000000695f825",
+ "0x00000000045e1065",
+ "0x0000000004149755",
+ "0x0000000009bb2485",
+ "0x000000000b1ddbb5",
+ "0x000000000751ec65",
+ "0x0000000008316665",
+ "0x0000000001caf165",
+ "0x0000000002972dc5",
+ "0x0000000000a72fb5",
+ "0x00000000027b3d95",
+ "0x0000000002db2c55",
+ "0x000000000b784965",
+ "0x000000000a2abb15",
+ "0x000000000dff89f5",
+ "0x000000000cfb1c95",
+ "0x0000000004c17f65",
+ "0x00000000095673f5",
+ "0x000000000bf5d4c5",
+ "0x00000000084e24d5",
+ "0x00000000092c0ac5",
+ "0x000000000ddac2a5",
+ "0x00000000049389c5",
+ "0x0000000008b9bf65",
+ "0x000000000e421095",
+ "0x0000000008271935",
+ "0x000000000500dfc5",
+ "0x0000000001636a45",
+ "0x00000000042f8e25",
+ "0x000000000ba98615",
+ "0x000000000a5a28a5",
+ "0x0000000002103f95",
+ "0x00000000021f96c5",
+ "0x000000000bafdb05",
+ "0x00000000010f00e5",
+ "0x000000000993a595",
+ "0x0000000009bf3705",
+ "0x0000000006e90795",
+ "0x000000000070cec5",
+ "0x000000000e0cbf85",
+ "0x0000000002585915",
+ "0x0000000008192915",
+ "0x0000000003f2c1c5",
+ "0x000000000c5ea225",
+ "0x0000000003d2e945",
+ "0x00000000078f1865",
+ "0x0000000003fbac95",
+ "0x000000000d89d5c5",
+ "0x0000000003c9a1a5",
+ "0x000000000acc85d5",
+ "0x000000000b5168e5",
+ "0x00000000093d3a75",
+ "0x000000000940f205",
+ "0x000000000d678295",
+ "0x0000000009218555",
+ "0x00000000065ffa95",
+ "0x000000000396c2d5",
+ "0x00000000047215b5",
+ "0x0000000006d9fd45",
+ "0x000000000bd9e495",
+ "0x0000000007620b45",
+ "0x000000000835df15",
+ "0x000000000cd19465",
+ "0x0000000008316485",
+ "0x0000000008f04a85",
+ "0x000000000823b425",
+ "0x000000000168a7d5",
+ "0x000000000d9814a5",
+ "0x0000000004edab85",
+ "0x000000000d167035",
+ "0x0000000003494a05",
+ "0x000000000490dc75",
+ "0x00000000067a63d5",
+ "0x00000000060a1945",
+ "0x0000000001a9ece5",
+ "0x000000000b931155",
+ "0x0000000005c66105",
+ "0x000000000c153095",
+ "0x000000000bf4ae65",
+ "0x0000000006f56ee5",
+ "0x0000000009d92845",
+ "0x000000000628ca75",
+ "0x0000000002078c15",
+ "0x0000000004a87b55",
+ "0x00000000079d0105",
+ "0x000000000b2f98f5",
+ "0x000000000285eb55",
+ "0x000000000763a7c5",
+ "0x000000000c498395",
+ "0x000000000dac5325",
+ "0x000000000185ff15",
+ "0x0000000009067355",
+ "0x0000000007177805",
+ "0x000000000b224565",
+ "0x00000000097da6f5",
+ "0x00000000087acda5",
+ "0x00000000041b6ad5",
+ "0x000000000bad7f45",
+ "0x0000000005f3e445",
+ "0x00000000022ca5e5",
+ "0x0000000002f256f5",
+ "0x0000000008a3b2b5",
+ "0x0000000004c6d195",
+ "0x0000000000792cf5",
+ "0x00000000000babd5",
+ "0x00000000023454c5",
+ "0x000000000884d755",
+ "0x000000000333c185",
+ "0x00000000047b8ff5",
+ "0x000000000a5a36b5",
+ "0x0000000002e48f25",
+ "0x000000000b4c4e05",
+ "0x000000000cae45f5",
+ "0x000000000322ff85",
+ "0x000000000a484a95",
+ "0x0000000002667635",
+ "0x000000000a225b05",
+ "0x000000000e158025",
+ "0x0000000004da1e35",
+ "0x000000000a7a5b25",
+ "0x0000000005f21ca5",
+ "0x000000000558a025",
+ "0x000000000a332395",
+ "0x0000000008809325",
+ "0x0000000001a023e5",
+ "0x00000000093eec85",
+ "0x000000000be222e5",
+ "0x000000000e34bdf5",
+ "0x0000000003319a45",
+ "0x000000000747f0c5",
+ "0x00000000089981a5",
+ "0x000000000bfb71f5",
+ "0x000000000d77d6e5",
+ "0x0000000008fd2f75",
+ "0x000000000d1a0f65",
+ "0x000000000a53ac55",
+ "0x0000000006df2545",
+ "0x0000000006998765",
+ "0x0000000003a96b65",
+ "0x000000000bd6bb85",
+ "0x0000000007dc30a5",
+ "0x0000000005245fe5",
+ "0x0000000000516f35",
+ "0x0000000001d9bdd5",
+ "0x0000000003c195f5",
+ "0x0000000009bd95d5",
+ "0x0000000002680685",
+ "0x00000000033650d5",
+ "0x0000000008268e75",
+ "0x000000000986a0c5",
+ "0x0000000002264e25",
+ "0x000000000070a585",
+ "0x0000000008be87c5",
+ "0x00000000061a7425",
+ "0x0000000006a675b5",
+ "0x000000000d96b9c5",
+ "0x000000000cecc825",
+ "0x0000000005e95395",
+ "0x00000000029c44e5",
+ "0x0000000007978865",
+ "0x0000000006090e15",
+ "0x000000000cd41b45",
+ "0x000000000603cbd5",
+ "0x0000000003480c35",
+ "0x0000000009664145",
+ "0x0000000008e2ccc5",
+ "0x00000000054b7035",
+ "0x00000000000363c9",
+ "0x00000000000360f9",
+ "0x0000000000022239",
+ "0x00000000000325e9",
+ "0x000000000002b929",
+ "0x000000000001deb9",
+ "0x00000000000137d9",
+ "0x0000000000026019",
+ "0x000000000002f619",
+ "0x0000000000037689",
+ "0x000000000003beb9",
+ "0x000000000002aed9",
+ "0x0000000000025209",
+ "0x000000000001f089",
+ "0x000000000000bee9",
+ "0x0000000000006309",
+ "0x000000000003abf9",
+ "0x0000000000004f59",
+ "0x000000000002ead9",
+ "0x00000000000293a9",
+ "0x00000000000248a9",
+ "0x0000000000015999",
+ "0x0000000000011e89",
+ "0x00000000000155d9",
+ "0x000000000000ca29",
+ "0x0000000000023b89",
+ "0x000000000000aa49",
+ "0x000000000002ac09",
+ "0x000000000000dec9",
+ "0x0000000000030f69",
+ "0x000000000000ca29",
+ "0x000000000001c659",
+ "0x0000000000027d29",
+ "0x0000000000036e19",
+ "0x000000000000eeb9",
+ "0x0000000000006f39",
+ "0x00000000000162f9",
+ "0x00000000000343e9",
+ "0x0000000000003249",
+ "0x000000000002ccd9",
+ "0x000000000000e199",
+ "0x0000000000003339",
+ "0x000000000001f269",
+ "0x0000000000039de9",
+ "0x0000000000030ba9",
+ "0x00000000000234f9",
+ "0x000000000000bd09",
+ "0x00000000000235e9",
+ "0x0000000000008d39",
+ "0x00000000000237c9",
+ "0x0000000000038df9",
+ "0x000000000002f709",
+ "0x0000000000001f89",
+ "0x0000000000005c79",
+ "0x0000000000031b99",
+ "0x00000000000364b9",
+ "0x00000000000158a9",
+ "0x00000000000372c9",
+ "0x0000000000003c99",
+ "0x000000000000e559",
+ "0x000000000000c489",
+ "0x0000000000030609",
+ "0x000000000000f099",
+ "0x000000000000a4a9",
+ "0x00000000000283b9",
+ "0x0000000000013f59",
+ "0x000000000002fd99",
+ "0x0000000000035979",
+ "0x000000000000ced9",
+ "0x0000000000019a49",
+ "0x00000000000262e9",
+ "0x00000000000064e9",
+ "0x0000000000018699",
+ "0x000000000003b199",
+ "0x000000000003ace9",
+ "0x0000000000034989",
+ "0x00000000000345c9",
+ "0x0000000000015219",
+ "0x0000000000032e59",
+ "0x000000000000c1b9",
+ "0x000000000001d0a9",
+ "0x0000000000033b79",
+ "0x00000000000392a9",
+ "0x0000000000033c69",
+ "0x000000000001d289",
+ "0x00000000000086a9",
+ "0x0000000000027c39",
+ "0x0000000000019689",
+ "0x00000000000327c9",
+ "0x000000000000c579",
+ "0x0000000000039c09",
+ "0x000000000000ba39",
+ "0x00000000000290d9",
+ "0x000000000001ef99",
+ "0x000000000000fbd9",
+ "0x000000000001bcf9",
+ "0x0000000000021069",
+ "0x000000000001b1b9",
+ "0x0000000000026c49",
+ "0x0000000000011349",
+ "0x000000000001fbc9",
+ "0x0000000000020d99",
+ "0x000000000003a569",
+ "0x000000000002f709",
+ "0x00000000000308d9",
+ "0x000000000002ca09",
+ "0x000000000001a769",
+ "0x0000000000021f69",
+ "0x0000000000026f19",
+ "0x0000000000033309",
+ "0x0000000000002619",
+ "0x000000000002aa29",
+ "0x000000000002f439",
+ "0x0000000000010269",
+ "0x00000000000293a9",
+ "0x0000000000027879",
+ "0x0000000000013e69",
+ "0x0000000000004419",
+ "0x0000000000032e59",
+ "0x0000000000039cf9",
+ "0x0000000000026c49",
+ "0x00000000000354c9",
+ "0x000000000000d299",
+ "0x00000000000284a9",
+ "0x00000000000095a9",
+ "0x0000000000022d79",
+ "0x00000000000345c9",
+ "0x0000000000004059",
+ "0x0000000000017979",
+ "0x0000000000021429",
+ "0x0000000000016899",
+ "0x000000000001cec9",
+ "0x0000000000018d29",
+ "0x0000000000028869",
+ "0x00000000000363c9",
+ "0x000000000002c289",
+ "0x0000000000028fe9",
+ "0x0000000000026019",
+ "0x00000000000175b9",
+ "0x0000000000025989",
+ "0x000000000000d1a9",
+ "0x0000000000013c89",
+ "0x000000000002f079",
+ "0x000000000000d1a9",
+ "0x0000000000014e59",
+ "0x000000000002e449",
+ "0x0000000000029ee9",
+ "0x00000000000183c9",
+ "0x00000000000075c9",
+ "0x0000000000037e09",
+ "0x00000000000153f9",
+ "0x0000000000012069",
+ "0x0000000000014319",
+ "0x0000000000011e89",
+ "0x0000000000014409",
+ "0x00000000000172e9",
+ "0x00000000000252f9",
+ "0x000000000001bed9",
+ "0x0000000000016119",
+ "0x000000000000bee9",
+ "0x00000000000336c9",
+ "0x0000000000020079",
+ "0x0000000000018789",
+ "0x000000000003add9",
+ "0x0000000000022059",
+ "0x000000000003a1a9",
+ "0x0000000000028e09",
+ "0x000000000000ecd9",
+ "0x000000000001daf9",
+ "0x00000000000048c9",
+ "0x0000000000015219",
+ "0x0000000000029fd9",
+ "0x0000000000013c89",
+ "0x0000000000015219",
+ "0x0000000000006c69",
+ "0x0000000000035019",
+ "0x000000000002c0a9",
+ "0x0000000000025a79",
+ "0x00000000000183c9",
+ "0x0000000000038df9",
+ "0x0000000000014b89",
+ "0x00000000000257a9",
+ "0x0000000000008d39",
+ "0x000000000002a849",
+ "0x0000000000023319",
+ "0x0000000000037869",
+ "0x0000000000032049",
+ "0x00000000000318c9",
+ "0x000000000001c749",
+ "0x000000000002d909",
+ "0x0000000000012ab9",
+ "0x0000000000039939",
+ "0x000000000002d639",
+ "0x0000000000037869",
+ "0x0000000000035a69",
+ "0x0000000000001e99",
+ "0x0000000000034899",
+ "0x0000000000006129",
+ "0x000000000000ccf9",
+ "0x0000000000037869",
+ "0x0000000000024b79",
+ "0x000000000000f639",
+ "0x0000000000037c29",
+ "0x0000000000026109",
+ "0x0000000000030069",
+ "0x000000000003a389",
+ "0x000000000001f629",
+ "0x00000000000316e9",
+ "0x000000000001e279",
+ "0x0000000000026889",
+ "0x000000000003a1a9",
+ "0x0000000000019779",
+ "0x0000000000016f29",
+ "0x000000000000fea9",
+ "0x0000000000034209",
+ "0x0000000000039579",
+ "0x000000000001fbc9",
+ "0x00000000000270f9",
+ "0x000000000000b2b9",
+ "0x0000000000021069",
+ "0x000000000001a1c9",
+ "0x000000000001f8f9",
+ "0x00000000000337b9",
+ "0x000000000003beb9",
+ "0x0000000000008b59",
+ "0x0000000000025029",
+ "0x0000000000037869",
+ "0x0000000000014319",
+ "0x000000000001cdd9",
+ "0x0000000000037779",
+ "0x000000000002a759",
+ "0x000000000000d929",
+ "0x0000000000035019",
+ "0x0000000000012d89",
+ "0x00000000000153f9",
+ "0x0000000000035799",
+ "0x000000000001a499",
+ "0x0000000000011bb9",
+ "0x00000000000246c9",
+ "0x0000000000018969",
+ "0x00000000000370e9",
+ "0x000000000001aa39",
+ "0x000000000002f169",
+ "0x00000000000264c9",
+ "0x000000000000c2a9",
+ "0x00000000000155d9",
+ "0x000000000003a569",
+ "0x000000000002c379",
+ "0x000000000003b0a9",
+ "0x00000000000262e9",
+ "0x000000000002b749",
+ "0x0000000000035799",
+ "0x0000000000031329",
+ "0x0000000000025b69",
+ "0x000000000002fbb9",
+ "0x000000000002a939",
+ "0x0000000000029a39",
+ "0x00000000000324f9",
+ "0x0000000000038769",
+ "0x0000000000004b99",
+ "0x0000000000027ff9",
+ "0x0000000000035c49",
+ "0x000000000000a689",
+ "0x000000000000a869",
+ "0x000000000000ae09",
+ "0x0000000000034209",
+ "0x0000000000032409",
+ "0x000000000000b1c9",
+ "0x000000000002fe89",
+ "0x00000000000154e9",
+ "0x000000000000f639",
+ "0x000000000002bec9",
+ "0x000000000002a0c9",
+ "0x0000000000002529",
+ "0x0000000000027009",
+ "0x00000000000352e9",
+ "0x0000000000032f49",
+ "0x00000000000153f9",
+ "0x00000000000218d9",
+ "0x00000000000128d9",
+ "0x000000000002c289",
+ "0x000000000000c399",
+ "0x000000000001a769",
+ "0x000000000000d569",
+ "0x000000000002e359",
+ "0x00000000000325e9",
+ "0x0000000000003159",
+ "0x000000000000c939",
+ "0x0000000000033c69",
+ "0x000000000003a749",
+ "0x0000000000023319",
+ "0x0000000000035019",
+ "0x0000000000035109",
+ "0x0000000000035109",
+ "0x000000000000b3a9",
+ "0x000000000001b399",
+ "0x00000000000086a9",
+ "0x00000000000144f9",
+ "0x00000000000174c9",
+ "0x0000000000021519",
+ "0x000000000000f639",
+ "0x00000000000148b9",
+ "0x0000000000009ff9",
+ "0x000000000000dce9",
+ "0x000000000001a859",
+ "0x0000000000020259",
+ "0x000000000002f349",
+ "0x000000000002fbb9",
+ "0x0000000000023e59",
+ "0x00000000000193b9",
+ "0x0000000000030069",
+ "0x0000000000039579",
+ "0x0000000000012609",
+ "0x00000000000063f9",
+ "0x000000000000d839",
+ "0x0000000000028779",
+ "0x000000000002b1a9",
+ "0x000000000001f089",
+ "0x0000000000032139",
+ "0x00000000000360f9",
+ "0x00000000000058b9",
+ "0x0000000000016c59",
+ "0x0000000000010539",
+ "0x00000000000271e9",
+ "0x0000000000004329",
+ "0x0000000000007e39",
+ "0x0000000000017889",
+ "0x00000000000166b9",
+ "0x00000000000065d9",
+ "0x000000000003b469",
+ "0x00000000000148b9",
+ "0x0000000000006a89",
+ "0x00000000000236d9",
+ "0x00000000000252f9",
+ "0x0000000000014049",
+ "0x000000000002fd99",
+ "0x000000000000e469",
+ "0x00000000000171f9",
+ "0x000000000002f709",
+ "0x0000000000022aa9",
+ "0x0000000000026d39",
+ "0x000000000003a659",
+ "0x0000000000017f19",
+ "0x0000000000009e19",
+ "0x000000000000c849",
+ "0x000000000001f809",
+ "0x000000000002bce9",
+ "0x0000000000021249",
+ "0x00000000000380d9",
+ "0x0000000000036879",
+ "0x00000000000158a9",
+ "0x000000000002c379",
+ "0x000000000002f7f9",
+ "0x000000000000cfc9",
+ "0x000000000002f8e9",
+ "0x000000000001fe99",
+ "0x00000000000054f9",
+ "0x000000000001edb9",
+ "0x0000000000032e59",
+ "0x000000000000e379",
+ "0x0000000000009969",
+ "0x0000000000030ba9",
+ "0x0000000000005c79",
+ "0x0000000000019689",
+ "0x00000000000066c9",
+ "0x000000000001a499",
+ "0x0000000000010bc9",
+ "0x0000000000031509",
+ "0x0000000000029df9",
+ "0x00000000000038d9",
+ "0x0000000000018789",
+ "0x0000000000026019",
+ "0x000000000000e0a9",
+ "0x00000000000238b9",
+ "0x0000000000007e39",
+ "0x0000000000036ff9",
+ "0x000000000002ca09",
+ "0x0000000000010e99",
+ "0x000000000002c469",
+ "0x0000000000003ab9",
+ "0x0000000000008019",
+ "0x0000000000015e49",
+ "0x000000000003b739",
+ "0x0000000000022e69",
+ "0x000000000002c469",
+ "0x000000000001d919",
+ "0x000000000001e189",
+ "0x000000000001f809",
+ "0x00000000000365a9",
+ "0x00000000000165c9",
+ "0x0000000000011439",
+ "0x0000000000028c29",
+ "0x000000000002fca9",
+ "0x0000000000023139",
+ "0x0000000000029859",
+ "0x000000000003ab09",
+ "0x0000000000025899",
+ "0x00000000000256b9",
+ "0x000000000001fbc9",
+ "0x0000000000026799",
+ "0x00000000000173d9",
+ "0x00000000000234f9",
+ "0x0000000000011ac9",
+ "0x000000000000e199",
+ "0x0000000000011619",
+ "0x000000000002ac09",
+ "0x0000000000028a49",
+ "0x0000000000022419",
+ "0x00000000000345c9",
+ "0x00000000000306f9",
+ "0x000000000001e099",
+ "0x0000000000013b99",
+ "0x000000000001d559",
+ "0x0000000000002079",
+ "0x000000000000aa49",
+ "0x000000000001b939",
+ "0x00000000000391b9",
+ "0x0000000000016f29",
+ "0x0000000000033f39",
+ "0x000000000000f099",
+ "0x000000000002d279",
+ "0x0000000000003ba9",
+ "0x0000000000025119",
+ "0x00000000000355b9",
+ "0x00000000000347a9",
+ "0x0000000000011ac9",
+ "0x000000000002f9d9",
+ "0x00000000000336c9",
+ "0x0000000000011d99",
+ "0x000000000003bdc9",
+ "0x000000000000bdf9",
+ "0x0000000000035d39",
+ "0x0000000000035e29",
+ "0x000000000001daf9",
+ "0x000000000001e639",
+ "0x00000000000334e9",
+ "0x000000000001f8f9",
+ "0x000000000002b389",
+ "0x000000000002cfa9",
+ "0x0000000000014d69",
+ "0x0000000000016119",
+ "0x00000000000317d9",
+ "0x0000000000039489",
+ "0x0000000000014c79",
+ "0x0000000000008109",
+ "0x000000000002e8f9",
+ "0x0000000000024f39",
+ "0x000000000002afc9",
+ "0x000000000003b739",
+ "0x00000000000094b9",
+ "0x0000000000025029",
+ "0x0000000000039489",
+ "0x00000000000090f9",
+ "0x0000000000025899",
+ "0x0000000000017889",
+ "0x0000000000015b79",
+ "0x0000000000011f79",
+ "0x000000000003a0b9",
+ "0x000000000001fbc9",
+ "0x0000000000006a89",
+ "0x0000000000020bb9",
+ "0x000000000000eaf9",
+ "0x000000000001d919",
+ "0x000000000000a4a9",
+ "0x00000000000058b9",
+ "0x000000000001bde9",
+ "0x00000000000117f9",
+ "0x0000000000006999",
+ "0x0000000000027f09",
+ "0x000000000003a929",
+ "0x000000000002b389",
+ "0x00000000000092d9",
+ "0x000000000001a2b9",
+ "0x0000000000039fc9",
+ "0x0000000000023c79",
+ "0x0000000000013e69",
+ "0x000000000000d0b9",
+ "0x0000000000035979",
+ "0x0000000000006309",
+ "0x0000000000008f19",
+ "0x0000000000014b89",
+ "0x0000000000030e79",
+ "0x000000000001e9f9",
+ "0x0000000000003609",
+ "0x0000000000038769",
+ "0x000000000000e469",
+ "0x0000000000023c79",
+ "0x0000000000019869",
+ "0x000000000003add9",
+ "0x0000000000018c39",
+ "0x000000000001a1c9",
+ "0x0000000000031329",
+ "0x0000000000024999",
+ "0x0000000000024219",
+ "0x000000000000a2c9",
+ "0x0000000000020259",
+ "0x000000000000fea9",
+ "0x0000000000024129",
+ "0x0000000000015999",
+ "0x00000000000244e9",
+ "0x0000000000003429",
+ "0x000000000002b569",
+ "0x0000000000025209",
+ "0x000000000001f179",
+ "0x00000000000219c9",
+ "0x00000000000190e9",
+ "0x0000000000011e89",
+ "0x0000000000006129",
+ "0x000000000002caf9",
+ "0x000000000000bd09",
+ "0x0000000000019e09",
+ "0x000000000003a479",
+ "0x000000000003d9c4",
+ "0x0000000000059804",
+ "0x000000000015f014",
+ "0x00000000000b1fa4",
+ "0x00000000001fe254",
+ "0x0000000000209834",
+ "0x000000000002a374",
+ "0x000000000013dc84",
+ "0x000000000020a284",
+ "0x00000000001c0814",
+ "0x000000000022b704",
+ "0x00000000000febc4",
+ "0x00000000001e6e24",
+ "0x00000000001f0604",
+ "0x00000000000fa754",
+ "0x00000000000730c4",
+ "0x00000000001a9f24",
+ "0x0000000000038a14",
+ "0x0000000000085f94",
+ "0x00000000001a96b4",
+ "0x000000000006bb94",
+ "0x000000000010cdb4",
+ "0x000000000023bd84",
+ "0x00000000001ac0e4",
+ "0x00000000000eca14",
+ "0x00000000000a0cf4",
+ "0x00000000000f9fd4",
+ "0x000000000018b114",
+ "0x000000000021b444",
+ "0x00000000001ff424",
+ "0x00000000001f37b4",
+ "0x00000000000bdd04",
+ "0x0000000000003224",
+ "0x00000000000b6144",
+ "0x00000000000b4344",
+ "0x00000000001207c4",
+ "0x00000000000750a4",
+ "0x000000000007df24",
+ "0x00000000000da4a4",
+ "0x000000000010e614",
+ "0x0000000000102314",
+ "0x0000000000157f94",
+ "0x00000000000227b4",
+ "0x0000000000172394",
+ "0x000000000020c354",
+ "0x00000000001a92f4",
+ "0x0000000000205a54",
+ "0x00000000000fbb04",
+ "0x0000000000213f14",
+ "0x000000000022daa4",
+ "0x0000000000249524",
+ "0x0000000000190574",
+ "0x00000000000cf464",
+ "0x0000000000030404",
+ "0x000000000007ba94",
+ "0x00000000001416a4",
+ "0x0000000000220e44",
+ "0x000000000002b634",
+ "0x00000000002217a4",
+ "0x00000000001be834",
+ "0x00000000000b9c54",
+ "0x000000000004e224",
+ "0x00000000001e55c4",
+ "0x00000000000c0914",
+ "0x00000000000c3254",
+ "0x000000000022a714",
+ "0x00000000001b4d84",
+ "0x00000000001d48b4",
+ "0x000000000007a054",
+ "0x00000000000f83b4",
+ "0x000000000020e514",
+ "0x00000000001cf904",
+ "0x0000000000204f14",
+ "0x0000000000213014",
+ "0x00000000001b00a4",
+ "0x0000000000104d44",
+ "0x0000000000185624",
+ "0x00000000002154a4",
+ "0x000000000014e994",
+ "0x00000000001eef84",
+ "0x0000000000181c04",
+ "0x00000000000697f4",
+ "0x0000000000180df4",
+ "0x0000000000179c84",
+ "0x0000000000091a24",
+ "0x00000000000599e4",
+ "0x00000000001630c4",
+ "0x0000000000050114",
+ "0x00000000000e6114",
+ "0x000000000006e6b4",
+ "0x000000000011ce94",
+ "0x000000000015c044",
+ "0x0000000000087254",
+ "0x0000000000065924",
+ "0x000000000004bbb4",
+ "0x000000000017c7a4",
+ "0x00000000000c00a4",
+ "0x0000000000058904",
+ "0x0000000000191fb4",
+ "0x00000000001dab24",
+ "0x000000000005d134",
+ "0x00000000001958e4",
+ "0x0000000000194624",
+ "0x0000000000204a64",
+ "0x00000000000711d4",
+ "0x00000000001514b4",
+ "0x00000000001b2444",
+ "0x000000000002b814",
+ "0x0000000000232c34",
+ "0x00000000000903a4",
+ "0x00000000001b1364",
+ "0x00000000001db574",
+ "0x00000000001baff4",
+ "0x000000000007a504",
+ "0x00000000000be664",
+ "0x000000000015ef24",
+ "0x000000000016cc64",
+ "0x000000000010ebb4",
+ "0x00000000000d2704",
+ "0x00000000000540d4",
+ "0x000000000004e8b4",
+ "0x000000000019b014",
+ "0x000000000013b164",
+ "0x0000000000228fa4",
+ "0x0000000000153494",
+ "0x00000000001febb4",
+ "0x000000000004f5d4",
+ "0x00000000000b1a04",
+ "0x00000000000897d4",
+ "0x0000000000183cd4",
+ "0x00000000001461a4",
+ "0x000000000013ee54",
+ "0x00000000001f17d4",
+ "0x00000000000ead04",
+ "0x000000000003c704",
+ "0x0000000000157634",
+ "0x0000000000046cf4",
+ "0x00000000000f91c4",
+ "0x0000000000184184",
+ "0x000000000022bbb4",
+ "0x00000000001edbd4",
+ "0x0000000000149444",
+ "0x000000000012b084",
+ "0x00000000000f1f64",
+ "0x00000000001c8e24",
+ "0x00000000001de544",
+ "0x0000000000184ae4",
+ "0x00000000001ed454",
+ "0x000000000006c224",
+ "0x0000000000186bb4",
+ "0x0000000000066464",
+ "0x000000000017f954",
+ "0x000000000001a564",
+ "0x0000000000191474",
+ "0x00000000000cf194",
+ "0x000000000012e9b4",
+ "0x0000000000214784",
+ "0x0000000000202124",
+ "0x00000000000ac874",
+ "0x000000000004d6e4",
+ "0x000000000007e3d4",
+ "0x00000000000abd34",
+ "0x00000000001d0f84",
+ "0x000000000000a934",
+ "0x00000000001f0514",
+ "0x00000000000e8ff4",
+ "0x00000000000abd34",
+ "0x00000000001bc2b4",
+ "0x0000000000181fc4",
+ "0x0000000000150794",
+ "0x0000000000119924",
+ "0x0000000000201b84",
+ "0x0000000000221024",
+ "0x000000000023da94",
+ "0x00000000001ce194",
+ "0x00000000000b79a4",
+ "0x000000000007ab94",
+ "0x0000000000248084",
+ "0x00000000000bf474",
+ "0x00000000000254b4",
+ "0x0000000000218564",
+ "0x0000000000114794",
+ "0x000000000001f154",
+ "0x000000000011bea4",
+ "0x00000000000f4d54",
+ "0x0000000000236fb4",
+ "0x000000000009f674",
+ "0x000000000015a424",
+ "0x00000000001c63f4",
+ "0x000000000016a5f4",
+ "0x0000000000128924",
+ "0x00000000000ef444",
+ "0x0000000000054944",
+ "0x000000000023a7f4",
+ "0x0000000000152d14",
+ "0x000000000006b054",
+ "0x00000000001fed94",
+ "0x00000000001e6c44",
+ "0x0000000000082484",
+ "0x0000000000056dd4",
+ "0x0000000000119654",
+ "0x000000000011b814",
+ "0x00000000001f80d4",
+ "0x00000000001c75c4",
+ "0x000000000015ce54",
+ "0x000000000022fd54",
+ "0x000000000008c984",
+ "0x00000000001e8ef4",
+ "0x00000000001c56d4",
+ "0x000000000021f9a4",
+ "0x0000000000201a94",
+ "0x000000000015c314",
+ "0x00000000001987c4",
+ "0x000000000000cbe4",
+ "0x00000000001820b4",
+ "0x0000000000125d14",
+ "0x00000000000138a4",
+ "0x000000000010abf4",
+ "0x00000000001cd1a4",
+ "0x00000000000fc194",
+ "0x0000000000058bd4",
+ "0x0000000000106ff4",
+ "0x00000000000f62e4",
+ "0x000000000004f4e4",
+ "0x00000000000d1084",
+ "0x0000000000194f84",
+ "0x00000000001501f4",
+ "0x00000000000282a4",
+ "0x000000000018d874",
+ "0x00000000000bc684",
+ "0x000000000022df54",
+ "0x000000000010dda4",
+ "0x000000000018f764",
+ "0x0000000000217c04",
+ "0x000000000007aaa4",
+ "0x000000000022a624",
+ "0x000000000016c214",
+ "0x0000000000180c14",
+ "0x000000000001f154",
+ "0x000000000003b804",
+ "0x00000000000c2174",
+ "0x0000000000130304",
+ "0x00000000001e46c4",
+ "0x0000000000031f34",
+ "0x000000000014c234",
+ "0x000000000009c014",
+ "0x000000000010cea4",
+ "0x000000000004af84",
+ "0x00000000001cb854",
+ "0x0000000000122894",
+ "0x00000000001bd844",
+ "0x00000000000326b4",
+ "0x00000000000e9684",
+ "0x0000000000085094",
+ "0x000000000002d9d4",
+ "0x0000000000201f44",
+ "0x0000000000143b34",
+ "0x000000000001c9f4",
+ "0x000000000009da54",
+ "0x00000000000df184",
+ "0x000000000009b024",
+ "0x00000000000d59a4",
+ "0x00000000000da594",
+ "0x0000000000177254",
+ "0x00000000000eecc4",
+ "0x0000000000175724",
+ "0x000000000008c114",
+ "0x00000000000898c4",
+ "0x00000000001d19d4",
+ "0x00000000001c3f64",
+ "0x00000000001debd4",
+ "0x00000000000531d4",
+ "0x00000000001017d4",
+ "0x00000000000d81f4",
+ "0x00000000001009c4",
+ "0x0000000000207674",
+ "0x00000000000f81d4",
+ "0x00000000001ab3c4",
+ "0x00000000001820b4",
+ "0x0000000000155fb4",
+ "0x00000000001bebf4",
+ "0x000000000007a324",
+ "0x000000000005e214",
+ "0x0000000000227384",
+ "0x0000000000141884",
+ "0x00000000001350d4",
+ "0x0000000000074bf4",
+ "0x00000000000b3354",
+ "0x0000000000112c64",
+ "0x000000000019e3a4",
+ "0x00000000002172a4",
+ "0x00000000000c8e34",
+ "0x000000000012aea4",
+ "0x00000000000fe714",
+ "0x00000000001c5a94",
+ "0x0000000000071e04",
+ "0x000000000007ee24",
+ "0x0000000000042974",
+ "0x00000000000c9f14",
+ "0x0000000000108a34",
+ "0x00000000001dab24",
+ "0x0000000000168704",
+ "0x0000000000121a84",
+ "0x00000000000c8d44",
+ "0x0000000000176f84",
+ "0x0000000000136de4",
+ "0x0000000000108ee4",
+ "0x00000000001faec4",
+ "0x00000000000a79b4",
+ "0x00000000001b1bd4",
+ "0x0000000000232004",
+ "0x000000000020ed84",
+ "0x00000000001d0354",
+ "0x0000000000174dc4",
+ "0x00000000001fd8f4",
+ "0x00000000001007e4",
+ "0x00000000001f5884",
+ "0x000000000005db84",
+ "0x000000000022e9a4",
+ "0x0000000000196ab4",
+ "0x000000000019cd24",
+ "0x00000000000bab54",
+ "0x00000000000896e4",
+ "0x0000000000194354",
+ "0x00000000000190c4",
+ "0x00000000001ce554",
+ "0x0000000000183374",
+ "0x000000000000ddb4",
+ "0x0000000000092564",
+ "0x00000000000b3804",
+ "0x0000000000241b44",
+ "0x0000000000175364",
+ "0x0000000000182654",
+ "0x0000000000078164",
+ "0x00000000001c9f04",
+ "0x0000000000048dc4",
+ "0x0000000000016b44",
+ "0x00000000000ebfc4",
+ "0x00000000001601e4",
+ "0x000000000017da64",
+ "0x00000000001a1554",
+ "0x000000000004a534",
+ "0x000000000021b534",
+ "0x00000000000ab3d4",
+ "0x000000000016cb74",
+ "0x000000000011aaf4",
+ "0x000000000015d304",
+ "0x0000000000094814",
+ "0x000000000002e064",
+ "0x00000000000a1474",
+ "0x0000000000176624",
+ "0x000000000011cda4",
+ "0x000000000000cfa4",
+ "0x0000000000133004",
+ "0x0000000000244844",
+ "0x0000000000113c54",
+ "0x00000000001e52f4",
+ "0x00000000000efad4",
+ "0x000000000015d304",
+ "0x0000000000179504",
+ "0x00000000001bc944",
+ "0x000000000009d1e4",
+ "0x00000000001fc724",
+ "0x00000000001af0b4",
+ "0x000000000014ae84",
+ "0x00000000000f7c34",
+ "0x0000000000037c04",
+ "0x000000000007c4e4",
+ "0x00000000001b9a64",
+ "0x000000000018a124",
+ "0x00000000002497f4",
+ "0x00000000000c1ae4",
+ "0x00000000000c9d34",
+ "0x0000000000241f04",
+ "0x0000000000119ce4",
+ "0x00000000000350e4",
+ "0x000000000009ca64",
+ "0x000000000014d224",
+ "0x00000000001e65b4",
+ "0x000000000003adb4",
+ "0x00000000001eaed4",
+ "0x0000000000180584",
+ "0x0000000000036674",
+ "0x00000000001f7864",
+ "0x00000000001789c4",
+ "0x0000000000228284",
+ "0x00000000000710e4",
+ "0x00000000000d0ea4",
+ "0x000000000001b464",
+ "0x0000000000150d34",
+ "0x00000000000a2644",
+ "0x00000000001b0af4",
+ "0x00000000001f1e64",
+ "0x00000000000a6d84",
+ "0x0000000000102a94",
+ "0x00000000000af664",
+ "0x00000000001e7964",
+ "0x0000000000083654",
+ "0x0000000000121c64",
+ "0x000000000011e9c4",
+ "0x00000000001abd24",
+ "0x00000000001f15f4",
+ "0x00000000000f26e4",
+ "0x00000000000cc494",
+ "0x0000000000230894",
+ "0x0000000000084194",
+ "0x00000000001e56b4",
+ "0x0000000000115b44",
+ "0x00000000001bbd14",
+ "0x000000000017b5d4",
+ "0x0000000000117d04",
+ "0x000000000002fe64",
+ "0x0000000000016964",
+ "0x0000000000005114",
+ "0x0000000000110504",
+ "0x000000000003f314",
+ "0x00000000001b5e64",
+ "0x00000000000efda4",
+ "0x000000000003d424",
+ "0x00000000000a9a84",
+ "0x0000000000125594",
+ "0x000000000007c6c4",
+ "0x000000000012c164",
+ "0x0000000000118754",
+ "0x00000000000190c4",
+ "0x00000000001c83d4",
+ "0x000000000000ef84",
+ "0x00000000001bbc24",
+ "0x00000000000c4514",
+ "0x000000000021b624",
+ "0x00000000001ba0f4",
+ "0x000000000012b9e4",
+ "0x000000000016bb84",
+ "0x0000000000026a44",
+ "0x000000000019efd4",
+ "0x000000000020dbb4",
+ "0x000000000000bec4",
+ "0x00000000002441b4",
+ "0x00000000001cbdf4",
+ "0x0000000000088064",
+ "0x00000000002424a4",
+ "0x0000000000098414",
+ "0x000000000022de64",
+ "0x00000000001db1b4",
+ "0x000000000001b644",
+ "0x000000000003c9d4",
+ "0x00000000000ba3d4",
+ "0x00000000000b7b84",
+ "0x0000000000128ce4",
+ "0x00000000001b1bd4",
+ "0x0000000000161c24",
+ "0x0000000000219734",
+ "0x0000000000227ec4",
+ "0x00000000001f6964",
+ "0x00000000001b83e4",
+ "0x0000000000110144",
+ "0x00000000001a0744",
+ "0x00000000001769e4",
+ "0x000000000003d7e4",
+ "0x0000000000139bd4",
+ "0x00000000000550c4",
+ "0x000000000008cb64",
+ "0x00000000001eb384",
+ "0x00000000001cb854",
+ "0x000000000006f4c4",
+ "0x000000000018dff4",
+ "0x000000000003bbc4",
+ "0x00000000001127b4",
+ "0x0000000000075284",
+ "0x000000000018e864",
+ "0x0000000000118fc4",
+ "0x000000000005b604",
+ "0x000000000001eac4",
+ "0x00000000001c2614",
+ "0x0000000000100154",
+ "0x00000000001333c4",
+ "0x0000000000115964",
+ "0x000000000000ba14",
+ "0x0000000000127664",
+ "0x000000000011cbc4",
+ "0x0000000000244ed4",
+ "0x00000000001b3524",
+ "0x0000000000126b24",
+ "0x0000000000013304",
+ "0x00000000000703c4",
+ "0x00000000000cdb14",
+ "0x0000000000134954",
+ "0x0000000000186f74",
+ "0x0000000000024f14",
+ "0x00000000001cc844",
+ "0x00000000000f1d84",
+ "0x00000000000dc484",
+ "0x000000000013b434",
+ "0x00000000000c0374",
+ "0x00000000001f7954",
+ "0x00000000000db674",
+ "0x00000000001510f4",
+ "0x00000000001254a4",
+ "0x00000000000cfa04",
+ "0x00000000000f39a4",
+ "0x0000000000014a74",
+ "0x0000000000037754",
+ "0x000000000021aea4",
+ "0x000000000006b234",
+ "0x00000000001431d4",
+ "0x0000000000149354",
+ "0x000000000014a074",
+ "0x00000000000da1d4",
+ "0x00000000001ab2d4",
+ "0x000000000022f6c4",
+ "0x0000000000160ff4",
+ "0x000000000018c794",
+ "0x000000000c74b8cf",
+ "0x00000000041df7ef",
+ "0x000000000ca55d9f",
+ "0x00000000006bdeaf",
+ "0x00000000020a8f4f",
+ "0x000000000c65f01f",
+ "0x0000000008da3e6f",
+ "0x0000000007898e8f",
+ "0x000000000c26d6ff",
+ "0x000000000ce490ff",
+ "0x000000000b2744bf",
+ "0x0000000003557b8f",
+ "0x000000000667afaf",
+ "0x00000000082c1c4f",
+ "0x000000000b59df1f",
+ "0x000000000948828f",
+ "0x0000000000a5630f",
+ "0x0000000000c1d1cf",
+ "0x000000000b66a33f",
+ "0x000000000db60aef",
+ "0x00000000001406df",
+ "0x0000000004ce897f",
+ "0x000000000b47449f",
+ "0x0000000003da922f",
+ "0x0000000007fd6dff",
+ "0x000000000d488abf",
+ "0x00000000018b121f",
+ "0x00000000077e88af",
+ "0x0000000005b1eadf",
+ "0x00000000060f41df",
+ "0x000000000d0a2b3f",
+ "0x000000000c7b73ef",
+ "0x000000000ba5094f",
+ "0x0000000009322f8f",
+ "0x000000000285b67f",
+ "0x000000000572244f",
+ "0x000000000d89702f",
+ "0x000000000de1461f",
+ "0x00000000047d2a3f",
+ "0x00000000053773ef",
+ "0x000000000020601f",
+ "0x000000000787ef3f",
+ "0x000000000954f7ef",
+ "0x000000000c2c373f",
+ "0x0000000004d8266f",
+ "0x000000000a6c94df",
+ "0x000000000053538f",
+ "0x0000000005cce38f",
+ "0x000000000e17b33f",
+ "0x0000000004f7a3ff",
+ "0x000000000babc64f",
+ "0x00000000051f7cef",
+ "0x0000000005afd0bf",
+ "0x000000000c1bca8f",
+ "0x0000000009ae92af",
+ "0x0000000004b05c7f",
+ "0x000000000a24323f",
+ "0x000000000afa07cf",
+ "0x00000000024d71cf",
+ "0x0000000004b9d3ef",
+ "0x0000000002b2897f",
+ "0x000000000c71838f",
+ "0x0000000007a1acef",
+ "0x000000000d485eaf",
+ "0x00000000002cf46f",
+ "0x000000000b3cc2ef",
+ "0x000000000dafbd7f",
+ "0x00000000027b7b1f",
+ "0x000000000aa215bf",
+ "0x000000000e1d1dcf",
+ "0x000000000a3a2d1f",
+ "0x000000000766ff5f",
+ "0x0000000002e751af",
+ "0x0000000003f3981f",
+ "0x000000000afdd4ef",
+ "0x000000000c1a2c2f",
+ "0x000000000919a0af",
+ "0x000000000ad5182f",
+ "0x0000000005b047cf",
+ "0x0000000000f43d4f",
+ "0x0000000006f15edf",
+ "0x000000000187044f",
+ "0x00000000002f2c8f",
+ "0x000000000174bf1f",
+ "0x0000000003ded65f",
+ "0x000000000ad1483f",
+ "0x00000000056bb06f",
+ "0x000000000c8957df",
+ "0x000000000a1b8ccf",
+ "0x000000000a42bb1f",
+ "0x00000000032161bf",
+ "0x0000000007d79c6f",
+ "0x0000000005d0984f",
+ "0x0000000001034e2f",
+ "0x000000000a27fe6f",
+ "0x000000000852522f",
+ "0x000000000d0903ef",
+ "0x000000000ab38acf",
+ "0x0000000002f8c6bf",
+ "0x00000000064c638f",
+ "0x000000000c84ff0f",
+ "0x000000000aded9af",
+ "0x000000000b1ca05f",
+ "0x000000000d16e5ff",
+ "0x00000000057ddb5f",
+ "0x000000000771c2af",
+ "0x000000000adfdc6f",
+ "0x000000000086e38f",
+ "0x0000000003fa425f",
+ "0x0000000006af2d8f",
+ "0x0000000006e35b0f",
+ "0x000000000c164d3f",
+ "0x0000000002a7a28f",
+ "0x0000000005b00adf",
+ "0x000000000867d5ff",
+ "0x000000000723606f",
+ "0x0000000003fe430f",
+ "0x000000000d3dceef",
+ "0x0000000003dff53f",
+ "0x00000000096b21af",
+ "0x000000000b2e8c7f",
+ "0x00000000010d29ef",
+ "0x000000000c51312f",
+ "0x0000000005fab85f",
+ "0x000000000224394f",
+ "0x0000000009b77e6f",
+ "0x000000000c28aacf",
+ "0x000000000d78d1cf",
+ "0x000000000dd5f26f",
+ "0x000000000d34f8bf",
+ "0x000000000a8eeadf",
+ "0x000000000989de1f",
+ "0x000000000423915f",
+ "0x00000000043fda9f",
+ "0x000000000c63b8ef",
+ "0x000000000a532e5f",
+ "0x0000000000b861df",
+ "0x0000000001a65d4f",
+ "0x00000000064d268f",
+ "0x0000000000bbe6cf",
+ "0x000000000d9b37bf",
+ "0x0000000002ee57cf",
+ "0x0000000002a0b10f",
+ "0x000000000b2ab32f",
+ "0x000000000cea495f",
+ "0x0000000005f13d2f",
+ "0x000000000c1750ef",
+ "0x000000000c82395f",
+ "0x00000000040ee25f",
+ "0x000000000498f4ef",
+ "0x0000000009022cef",
+ "0x000000000429423f",
+ "0x000000000533d3cf",
+ "0x000000000bc0358f",
+ "0x0000000005d9ca5f",
+ "0x0000000004050fff",
+ "0x00000000090f32af",
+ "0x00000000018ef5bf",
+ "0x0000000002b831ef",
+ "0x000000000ac7c0df",
+ "0x000000000b9a504f",
+ "0x000000000e4451bf",
+ "0x000000000bd1815f",
+ "0x0000000005b261ef",
+ "0x000000000157da3f",
+ "0x00000000071dd14f",
+ "0x0000000001b04bcf",
+ "0x00000000031fec9f",
+ "0x000000000087081f",
+ "0x000000000b5409af",
+ "0x000000000e3d29df",
+ "0x0000000009f8679f",
+ "0x0000000003d6020f",
+ "0x00000000036466ef",
+ "0x000000000b73468f",
+ "0x000000000b96ec2f",
+ "0x0000000009c6e3af",
+ "0x00000000043d9dcf",
+ "0x000000000bc46f6f",
+ "0x0000000007ae599f",
+ "0x000000000e185ecf",
+ "0x00000000005bd19f",
+ "0x0000000006cc054f",
+ "0x0000000000c6060f",
+ "0x000000000abbe71f",
+ "0x000000000b8f938f",
+ "0x000000000da96f1f",
+ "0x000000000dc9785f",
+ "0x000000000178512f",
+ "0x000000000c656cdf",
+ "0x000000000a8c450f",
+ "0x0000000008ecf7df",
+ "0x000000000970fbcf",
+ "0x000000000d6c2e7f",
+ "0x000000000d429ecf",
+ "0x0000000002b7103f",
+ "0x0000000005594d3f",
+ "0x000000000a8920af",
+ "0x00000000078e38ef",
+ "0x00000000077f47ef",
+ "0x00000000001ff08f",
+ "0x0000000009855edf",
+ "0x00000000020a67ef",
+ "0x0000000006e6f58f",
+ "0x0000000000dc752f",
+ "0x0000000003bfc85f",
+ "0x00000000072b694f",
+ "0x00000000017e011f",
+ "0x0000000000b8a73f",
+ "0x0000000000e3aedf",
+ "0x00000000000190ef",
+ "0x0000000007ebb47f",
+ "0x0000000004a5cbcf",
+ "0x000000000b67b13f",
+ "0x0000000004d4120f",
+ "0x00000000045c918f",
+ "0x000000000e10360f",
+ "0x00000000018bc16f",
+ "0x00000000084fc3cf",
+ "0x00000000021bd93f",
+ "0x000000000ac2f4bf",
+ "0x00000000077056ef",
+ "0x000000000002787f",
+ "0x0000000005934a8f",
+ "0x0000000002c63a6f",
+ "0x00000000038adf5f",
+ "0x000000000a943fdf",
+ "0x000000000c72549f",
+ "0x000000000de616ef",
+ "0x000000000a14324f",
+ "0x00000000014b896f",
+ "0x000000000391173f",
+ "0x0000000007859aff",
+ "0x00000000023ac75f",
+ "0x00000000026d04ef",
+ "0x0000000003f3bacf",
+ "0x000000000abae9ff",
+ "0x0000000002a0cf0f",
+ "0x0000000005659c2f",
+ "0x000000000a0d33af",
+ "0x000000000a0f3cef",
+ "0x0000000009696dbf",
+ "0x000000000aade70f",
+ "0x0000000004a35f2f",
+ "0x00000000058940df",
+ "0x000000000c71e8cf",
+ "0x0000000005fd4c5f",
+ "0x000000000377e26f",
+ "0x000000000a00b12f",
+ "0x00000000014d7eff",
+ "0x000000000737c0af",
+ "0x000000000114828f",
+ "0x000000000e0c823f",
+ "0x0000000007ead82f",
+ "0x000000000d8a80ff",
+ "0x0000000000e329bf",
+ "0x000000000c6fc63f",
+ "0x0000000008ac8c4f",
+ "0x000000000e2d889f",
+ "0x000000000094d3af",
+ "0x000000000bd0f4bf",
+ "0x000000000c88b78f",
+ "0x00000000091bc8df",
+ "0x0000000008f35bcf",
+ "0x000000000e250d5f",
+ "0x0000000004d5485f",
+ "0x000000000e157c0f",
+ "0x000000000a5e76cf",
+ "0x00000000033099ff",
+ "0x000000000d70c7ff",
+ "0x000000000762c2af",
+ "0x0000000003f52e0f",
+ "0x000000000063e5bf",
+ "0x000000000b9ca0cf",
+ "0x000000000c75627f",
+ "0x000000000c77e4af",
+ "0x000000000632094f",
+ "0x0000000005c263bf",
+ "0x000000000df5caef",
+ "0x000000000ccd9adf",
+ "0x00000000091d907f",
+ "0x0000000008a40b6f",
+ "0x000000000d1d11af",
+ "0x00000000098db49f",
+ "0x000000000e207f1f",
+ "0x000000000732750f",
+ "0x00000000018db15f",
+ "0x0000000002c183df",
+ "0x000000000754c92f",
+ "0x0000000006da0faf",
+ "0x000000000bf2af1f",
+ "0x00000000066dfa4f",
+ "0x00000000022bdecf",
+ "0x000000000723093f",
+ "0x000000000c1b2d0f",
+ "0x000000000045429f",
+ "0x0000000008c5dd3f",
+ "0x0000000003e214ff",
+ "0x000000000172b6cf",
+ "0x000000000afa8ddf",
+ "0x00000000055168ef",
+ "0x0000000004d534af",
+ "0x0000000006bbbf0f",
+ "0x000000000c6db93f",
+ "0x000000000b81658f",
+ "0x000000000b3462df",
+ "0x00000000035ad08f",
+ "0x0000000001bc9abf",
+ "0x000000000956e05f",
+ "0x000000000b08aaff",
+ "0x0000000005e9fa1f",
+ "0x00000000049d625f",
+ "0x000000000e15199f",
+ "0x000000000c2047ef",
+ "0x0000000000d3a76f",
+ "0x0000000002ba02ef",
+ "0x000000000a2a539f",
+ "0x00000000049e516f",
+ "0x0000000004033a4f",
+ "0x00000000070a0bbf",
+ "0x000000000c7f695f",
+ "0x000000000aa0f8bf",
+ "0x000000000cca401f",
+ "0x000000000506724f",
+ "0x000000000d58fa3f",
+ "0x000000000a4cd4bf",
+ "0x000000000bcb5b4f",
+ "0x000000000c5b614f",
+ "0x0000000008c26a1f",
+ "0x0000000008382a8f",
+ "0x000000000df16f4f",
+ "0x000000000d78803f",
+ "0x00000000029ddb6f",
+ "0x00000000039b691f",
+ "0x0000000008c1828f",
+ "0x000000000a3871af",
+ "0x000000000896961f",
+ "0x000000000366aa4f",
+ "0x000000000c64d5ef",
+ "0x000000000d7c796f",
+ "0x000000000119ffdf",
+ "0x0000000003b4ba0f",
+ "0x000000000ab0756f",
+ "0x000000000c3b89bf",
+ "0x000000000cd780ef",
+ "0x0000000006bec65f",
+ "0x0000000007f9fdaf",
+ "0x0000000009b3736f",
+ "0x000000000c5e84bf",
+ "0x00000000019bcf6f",
+ "0x000000000709dbef",
+ "0x0000000009581d3f",
+ "0x0000000007c26fcf",
+ "0x000000000b31da1f",
+ "0x000000000e3065bf",
+ "0x000000000580731f",
+ "0x00000000084d158f",
+ "0x000000000a9d223f",
+ "0x0000000002deb68f",
+ "0x00000000036e3dff",
+ "0x00000000049ca7cf",
+ "0x00000000075a9adf",
+ "0x000000000d9d26bf",
+ "0x0000000002961e7f",
+ "0x00000000032c39af",
+ "0x000000000d4d135f",
+ "0x00000000057912ff",
+ "0x000000000676875f",
+ "0x0000000009633b7f",
+ "0x00000000020901cf",
+ "0x000000000367b2af",
+ "0x0000000009e5f83f",
+ "0x0000000005bb138f",
+ "0x000000000595113f",
+ "0x000000000b2ad6cf",
+ "0x00000000070f9adf",
+ "0x0000000005d4f98f",
+ "0x0000000001622c1f",
+ "0x0000000001552ecf",
+ "0x000000000392f55f",
+ "0x0000000001d76fcf",
+ "0x00000000097217df",
+ "0x00000000000bfa3f",
+ "0x000000000967f7af",
+ "0x000000000c7dc91f",
+ "0x0000000004cc92ff",
+ "0x000000000850164f",
+ "0x0000000006506bbf",
+ "0x000000000ab80dcf",
+ "0x00000000035b0e6f",
+ "0x0000000000a64a9f",
+ "0x0000000007c698cf",
+ "0x000000000c7404cf",
+ "0x0000000008ee201f",
+ "0x000000000bce6fbf",
+ "0x0000000006aee0af",
+ "0x0000000001662dbf",
+ "0x0000000000152d3f",
+ "0x0000000005e9b3cf",
+ "0x0000000008c0e41f",
+ "0x00000000025e8a0f",
+ "0x0000000004fc1d9f",
+ "0x0000000001feebef",
+ "0x00000000029b43af",
+ "0x000000000a63dcaf",
+ "0x000000000d51e6ff",
+ "0x0000000008b304df",
+ "0x000000000405f2df",
+ "0x00000000072edf3f",
+ "0x0000000001d6dabf",
+ "0x0000000008c1d32f",
+ "0x0000000006c40c5f",
+ "0x00000000056952cf",
+ "0x00000000087c57ff",
+ "0x000000000d06a0af",
+ "0x0000000005f400ff",
+ "0x0000000009f3336f",
+ "0x000000000194451f",
+ "0x000000000ba5760f",
+ "0x000000000151ae8f",
+ "0x0000000003bd363f",
+ "0x0000000008cc025f",
+ "0x0000000000f8d30f",
+ "0x000000000dd808cf",
+ "0x000000000ca5cf0f",
+ "0x0000000007c910af",
+ "0x000000000d1483af",
+ "0x00000000072eb8cf",
+ "0x000000000a2fbc4f",
+ "0x000000000a68780f",
+ "0x000000000d13b56f",
+ "0x000000000a01535f",
+ "0x000000000ba2d3ff",
+ "0x00000000023866ef",
+ "0x0000000006e6c97f",
+ "0x0000000008ab343f",
+ "0x0000000006b207df",
+ "0x00000000024b71ef",
+ "0x0000000001b3522f",
+ "0x0000000004d3dd8f",
+ "0x0000000003ff6b4f",
+ "0x0000000003dbe76f",
+ "0x000000000d7a8d3f",
+ "0x0000000004b14d6f",
+ "0x00000000028855bf",
+ "0x00000000080ae16f",
+ "0x000000000420a80f",
+ "0x000000000e038c2f",
+ "0x00000000090ad8ef",
+ "0x00000000045e8e9f",
+ "0x000000000c71a18f",
+ "0x0000000008d304bf",
+ "0x000000000b24adef",
+ "0x0000000005a0261f",
+ "0x0000000000b761ef",
+ "0x00000000040eb64f",
+ "0x000000000e3967ff",
+ "0x000000000b1be6bf",
+ "0x00000000050977bf",
+ "0x0000000009b7156f",
+ "0x00000000029fcb5f",
+ "0x000000000144159f",
+ "0x000000000c00bf1f",
+ "0x00000000066cbf4f",
+ "0x0000000001903b0f",
+ "0x000000000822b97f",
+ "0x0000000008092d7f",
+ "0x0000000009fea9cf",
+ "0x00000000074cdb7f",
+ "0x00000000084adb8f",
+ "0x00000000051025bf",
+ "0x00000000016e495f",
+ "0x000000000e2a751f",
+ "0x0000000007e1b6ff",
+ "0x000000000dc21bff",
+ "0x0000000006050d0f",
+ "0x000000000687e5ef",
+ "0x0000000006bba1ff",
+ "0x00000000015829ef",
+ "0x000000000844ff8f",
+ "0x0000000004d56ecf",
+ "0x000000000b06a66f",
+ "0x0000000008fdb07f",
+ "0x000000000692c82f",
+ "0x0000000007000c5f",
+ "0x00000000071754ff",
+ "0x0000000005679cff",
+ "0x000000000147cb4f",
+ "0x0000000006d4001f",
+ "0x0000000000cdba8f",
+ "0x000000000c11a1ef",
+ "0x000000000a58448f",
+ "0x0000000000b4810f",
+ "0x000000000b46d05f",
+ "0x000000000cc9a65f",
+ "0x0000000007a86daf",
+ "0x000000000a191f3f",
+ "0x00000000069442ef",
+ "0x000000000c016c8f",
+ "0x0000000002d2499f",
+ "0x00000000055c854f",
+ "0x000000000d2e76cf",
+ "0x0000000002506b0f",
+ "0x000000000d4fbddf",
+ "0x00000000071e1d3f",
+ "0x00000000089ae76f",
+ "0x0000000000a5045f",
+ "0x0000000008ebcccf",
+ "0x000000000345624f",
+ "0x000000000830ee0f",
+ "0x000000000695b71f",
+ "0x00000000067229df",
+ "0x0000000004f7b69f",
+ "0x000000000b037b5f",
+ "0x00000000068d1dbf",
+ "0x000000000d2107ef",
+ "0x0000000005417c8f",
+ "0x000000000251df1f",
+ "0x0000000009ad785f",
+ "0x000000000a1931df",
+ "0x000000000a8cc55f",
+ "0x0000000006309f4f",
+ "0x0000000002a3778f",
+ "0x0000000000c5f32f",
+ "0x000000000a8026bf",
+ "0x000000000713f56f",
+ "0x00000000064f77df",
+ "0x0000000000e831bf",
+ "0x000000000232f5af",
+ "0x000000000afcde3f",
+ "0x000000000227c2cf",
+ "0x0000000005018daf",
+ "0x000000000b21d73f",
+ "0x0000000009a4c98f",
+ "0x00000000053d682f",
+ "0x0000000003c036df",
+ "0x0000000005c1c07f",
+ "0x000000000313b04f",
+ "0x000000000daf11cf",
+ "0x0000000002eb361f",
+ "0x0000000003e43eef",
+ "0x000000000d87b0df",
+ "0x000000000a000def",
+ "0x000000000181228f",
+ "0x000000000d55383f",
+ "0x00000000085b175f",
+ "0x000000000d2237af",
+ "0x0000000007ba1adf",
+ "0x0000000003f02f2f",
+ "0x000000000119191f",
+ "0x0000000003446e6f",
+ "0x000000000406732f",
+ "0x000000000c772aef",
+ "0x0000000000249bbf",
+ "0x000000000c0adc5f",
+ "0x00000000019fcc3f",
+ "0x00000000086c650f",
+ "0x00000000035747bf",
+ "0x000000000c14d43f",
+ "0x0000000008d3733f",
+ "0x00000000002f1c7f",
+ "0x000000000c6b4b8f",
+ "0x000000000267f9df",
+ "0x000000000aec7dbf",
+ "0x000000000982b70f",
+ "0x00000000097be29f",
+ "0x000000000405904f",
+ "0x000000000499582f",
+ "0x000000000c2a832f",
+ "0x000000000090562f",
+ "0x000000000111112f",
+ "0x000000000718597f",
+ "0x000000000496495f",
+ "0x000000000802b79f",
+ "0x000000000269884f",
+ "0x00000000057ae01f",
+ "0x00000000009aa8ff",
+ "0x00000000030e587f",
+ "0x0000000005c224cf",
+ "0x000000000c1247bf",
+ "0x00000000067660cf",
+ "0x000000000b3427af",
+ "0x00000000027198af",
+ "0x0000000005dd795f",
+ "0x00000000094ecb2f",
+ "0x00000000058c7f5f",
+ "0x0000000003386a7f",
+ "0x000000000c63f1ff",
+ "0x0000000009a4ea5f",
+ "0x0000000002b473af",
+ "0x000000000b6460af",
+ "0x000000000621157f",
+ "0x00000000099f7b1f",
+ "0x00000000053e20df",
+ "0x000000000ad9d7ff",
+ "0x0000000008883aff",
+ "0x000000000ba68a7f",
+ "0x00000000017b16bf",
+ "0x000000000d6b0acf",
+ "0x000000000c7a64df",
+ "0x00000000079f5d3f",
+ "0x000000000816d81f",
+ "0x000000000a3c9b7f",
+ "0x000000000694297f",
+ "0x0000000005c4cb8f",
+ "0x00000000020b531f",
+ "0x000000000935aa0f",
+ "0x000000000b6e29af",
+ "0x000000000925eacf",
+ "0x000000000862aecf",
+ "0x000000000801b89f",
+ "0x000000000a5b8e4f",
+ "0x000000000abb0f5f",
+ "0x000000000acd485f",
+ "0x000000000a5f43ff",
+ "0x000000000399727f",
+ "0x00000000099203ef",
+ "0x000000000235da4f",
+ "0x0000000009c4d2cf",
+ "0x000000000112daaf",
+ "0x00000000087623bf",
+ "0x0000000004a3131f",
+ "0x00000000068b79bf",
+ "0x000000000c86128f",
+ "0x000000000d143c4f",
+ "0x000000000b2a464f",
+ "0x0000000008a7e85f",
+ "0x0000000004d8ec1f",
+ "0x00000000039ea3df",
+ "0x000000000280246f",
+ "0x000000000d5d321f",
+ "0x000000000003bcbf",
+ "0x00000000003e72bf",
+ "0x000000000a7c3c8f",
+ "0x0000000008fcbf6f",
+ "0x000000000861232f",
+ "0x0000000004991fef",
+ "0x00000000028733ef",
+ "0x000000000d89a84f",
+ "0x000000000a0662df",
+ "0x0000000008b205bf",
+ "0x000000000786b23f",
+ "0x000000000c11779f",
+ "0x000000000d216f0f",
+ "0x000000000095f08f",
+ "0x000000000cc716ef",
+ "0x000000000844afbf",
+ "0x0000000006d6c2df",
+ "0x000000000bc0545f",
+ "0x0000000005f0b8df",
+ "0x0000000005cb47df",
+ "0x0000000003efd8ef",
+ "0x00000000020630bf",
+ "0x000000000422383f",
+ "0x0000000006c8128f",
+ "0x000000000816025f",
+ "0x000000000116bb7f",
+ "0x00000000065ec5af",
+ "0x0000000003ab490f",
+ "0x0000000007050a0f",
+ "0x000000000b40e17f",
+ "0x000000000ac4317f",
+ "0x000000000653bedf",
+ "0x00000000039e821f",
+ "0x00000000019b8e9f",
+ "0x00000000039590bf",
+ "0x0000000000730a2f",
+ "0x000000000df13f5f",
+ "0x00000000079234cf",
+ "0x0000000003fd3b7f",
+ "0x0000000001699edf",
+ "0x0000000003c219af",
+ "0x000000000170e0ff",
+ "0x0000000005e13b3f",
+ "0x0000000005408c8f",
+ "0x000000000bd474df",
+ "0x000000000b4cefbf",
+ "0x0000000009d3345f",
+ "0x00000000040ab2af",
+ "0x000000000e21c8ff",
+ "0x0000000005badc1f",
+ "0x0000000005c8a7af",
+ "0x000000000328e73f",
+ "0x000000000627aedf",
+ "0x000000000e262b2f",
+ "0x000000000368131f",
+ "0x0000000006229e4f",
+ "0x000000000bbd791f",
+ "0x000000000d95406f",
+ "0x000000000688b7cf",
+ "0x000000000db01cff",
+ "0x000000000b840d1f",
+ "0x0000000008d150af",
+ "0x0000000007092c7f",
+ "0x000000000cd3f9ff",
+ "0x0000000006bb4c8f",
+ "0x0000000003b1d72f",
+ "0x0000000002d2cbcf",
+ "0x000000000ddc11cf",
+ "0x000000000334fa2f",
+ "0x0000000004bff7ff",
+ "0x000000000cc3b0ef",
+ "0x000000000c9b4f1f",
+ "0x0000000000d19eff",
+ "0x000000000a50610f",
+ "0x0000000005cdfbbf",
+ "0x0000000002bcec1f",
+ "0x000000000ca7a76f",
+ "0x0000000004ed5b5f",
+ "0x000000000bb5a1ef",
+ "0x0000000004d50a5f",
+ "0x0000000003588eef",
+ "0x000000000bed9f5f",
+ "0x000000000ac70bcf",
+ "0x000000000ccb7cdf",
+ "0x0000000009f0391f",
+ "0x00000000039193cf",
+ "0x000000000253381f",
+ "0x000000000451615f",
+ "0x000000000b5d332f",
+ "0x000000000b989fff",
+ "0x000000000671f08f",
+ "0x00000000062276ef",
+ "0x000000000c8b3a8f",
+ "0x0000000004f30a5f",
+ "0x0000000004d5e6af",
+ "0x000000000c91d3ef",
+ "0x00000000038a358f",
+ "0x0000000007400ddf",
+ "0x0000000007efde4f",
+ "0x000000000478f4ef",
+ "0x000000000d5430cf",
+ "0x00000000018b755f",
+ "0x0000000006e250af",
+ "0x000000000026842f",
+ "0x0000000006f578bf",
+ "0x00000000058c282f",
+ "0x00000000099b7e2f",
+ "0x000000000cfc841f",
+ "0x00000000012abc1f",
+ "0x0000000006f47e6f",
+ "0x00000000099996af",
+ "0x0000000003d994ef",
+ "0x000000000b3d811f",
+ "0x000000000e2b7e4f",
+ "0x00000000084deb2f",
+ "0x000000000d6c52ef",
+ "0x000000000621238f",
+ "0x0000000006034bdf",
+ "0x000000000903faff",
+ "0x000000000c9fa51f",
+ "0x000000000a3f978f",
+ "0x000000000de27c4f",
+ "0x000000000bb5b3bf",
+ "0x000000000bdc9e8f",
+ "0x0000000005f3626f",
+ "0x000000000de9808f",
+ "0x000000000b49a3ff",
+ "0x00000000010f9cff",
+ "0x000000000378487f",
+ "0x0000000006af1aaf",
+ "0x000000000d6e8cef",
+ "0x000000000e40022f",
+ "0x00000000055a683f",
+ "0x00000000006763ff",
+ "0x0000000007e8bfcf",
+ "0x000000000202936f",
+ "0x0000000004a5f4ef",
+ "0x000000000b63c32f",
+ "0x0000000004fc7b3f",
+ "0x0000000001c544bf",
+ "0x000000000770512f",
+ "0x0000000001af7f4f",
+ "0x000000000c6694ff",
+ "0x00000000017a487f",
+ "0x0000000003658b4f",
+ "0x000000000b9a0bbf",
+ "0x00000000091ae12f",
+ "0x00000000019833df",
+ "0x000000000c82f78f",
+ "0x000000000cfdf75f",
+ "0x0000000006989f5f",
+ "0x000000000d32af9f",
+ "0x0000000007407a9f",
+ "0x0000000001d1223f",
+ "0x0000000008001a3f",
+ "0x00000000033097ff",
+ "0x0000000009fcef2f",
+ "0x000000000ccee4bf",
+ "0x000000000058e73f",
+ "0x000000000e3a2adf",
+ "0x00000000039dcd2f",
+ "0x0000000008f5b76f",
+ "0x00000000004f05df",
+ "0x000000000967438f",
+ "0x000000000daacd9f",
+ "0x000000000184cc0f",
+ "0x000000000241f00f",
+ "0x000000000e4311ef",
+ "0x00000000072ce11f",
+ "0x0000000007520cbf",
+ "0x000000000255c67f",
+ "0x000000000dc50caf",
+ "0x000000000bdf0d0f",
+ "0x000000000455f53f",
+ "0x000000000382ca2f",
+ "0x00000000026a892f",
+ "0x000000000810760f",
+ "0x000000000adbfe4f",
+ "0x000000000b9647ff",
+ "0x00000000012bf17f",
+ "0x0000000007ec5fef",
+ "0x000000000816e62f",
+ "0x000000000430a32f",
+ "0x00000000097cbc1f",
+ "0x000000000a90c8df",
+ "0x000000000115339f",
+ "0x000000000dd8adaf",
+ "0x0000000008ee763f",
+ "0x00000000008e14af",
+ "0x000000000d27339f",
+ "0x000000000a1128ff",
+ "0x000000000225e4af",
+ "0x000000000c06766f",
+ "0x0000000008eb982f",
+ "0x000000000af38e2f",
+ "0x000000000936577f",
+ "0x0000000009ea202f",
+ "0x000000000795c31f",
+ "0x000000000710cc5f",
+ "0x0000000009573a3f",
+ "0x000000000dc65a6f",
+ "0x000000000811624f",
+ "0x000000000601e4cf",
+ "0x000000000821407f",
+ "0x000000000b7487ff",
+ "0x00000000052fe79f",
+ "0x000000000c1b850f",
+ "0x00000000092902ff",
+ "0x000000000695a61f",
+ "0x0000000006337a8f",
+ "0x0000000002cb3aef",
+ "0x00000000028a890f",
+ "0x000000000340e97f",
+ "0x000000000e2ea39f",
+ "0x000000000622f0cf",
+ "0x000000000cd74f1f",
+ "0x0000000005edd43f",
+ "0x000000000478102f",
+ "0x0000000009e3056f",
+ "0x0000000005a85f9f",
+ "0x0000000001cfafef",
+ "0x00000000008159ef",
+ "0x00000000047068cf",
+ "0x0000000002cf977f",
+ "0x000000000d8c0a9f",
+ "0x000000000bc9ed8f",
+ "0x000000000c9d26af",
+ "0x0000000005079a6f",
+ "0x000000000c45727f",
+ "0x000000000472ba3f",
+ "0x00000000081b359f",
+ "0x000000000487e40f",
+ "0x000000000d1306ef",
+ "0x0000000007b9c2bf",
+ "0x0000000009094fff",
+ "0x00000000084c814f",
+ "0x0000000009cead9f",
+ "0x0000000002b2a93f",
+ "0x00000000029abf5f",
+ "0x000000000a42123f",
+ "0x00000000012ce71f",
+ "0x00000000085209df",
+ "0x000000000c0e38ff",
+ "0x00000000031d947f",
+ "0x0000000009b3fd1f",
+ "0x0000000004a8591f",
+ "0x00000000052e907f",
+ "0x0000000003cfa48f",
+ "0x0000000002a0e56f",
+ "0x0000000004b97e7f",
+ "0x000000000901804f",
+ "0x0000000006b14f0f",
+ "0x000000000bdd780f",
+ "0x000000000218b2df",
+ "0x000000000798e77f",
+ "0x000000000764ec9f",
+ "0x000000000a6fd80f",
+ "0x000000000c1bbf2f",
+ "0x000000000adfbb7f",
+ "0x000000000a2ef38f",
+ "0x000000000d67db2f",
+ "0x000000000b2feebf",
+ "0x0000000008a0f6df",
+ "0x0000000001efe53f",
+ "0x0000000002b9b13f",
+ "0x000000000360b7af",
+ "0x00000000092c833f",
+ "0x0000000000a9de6f",
+ "0x00000000066df75f",
+ "0x0000000002587e1f",
+ "0x0000000007ec7edf",
+ "0x000000000ceee94f",
+ "0x000000000dcbf1ff",
+ "0x000000000109a20f",
+ "0x00000000002bcb1f",
+ "0x000000000bf12daf",
+ "0x00000000043375ff",
+ "0x000000000755b90f",
+ "0x000000000bef4daf",
+ "0x0000000005d57caf",
+ "0x0000000007ae696f",
+ "0x000000000245ec0f",
+ "0x000000000261ba7f",
+ "0x0000000006acad1f",
+ "0x000000000ac9a47f",
+ "0x000000000b3c1bef",
+ "0x0000000009ec200f",
+ "0x0000000006178c3f",
+ "0x0000000002c7673f",
+ "0x000000000c65239f",
+ "0x000000000445423f",
+ "0x0000000005ed53cf",
+ "0x000000000910408f",
+ "0x0000000007bcebcf",
+ "0x000000000cc31bdf",
+ "0x00000000029591bf",
+ "0x0000000005295b5f",
+ "0x000000000d69090f",
+ "0x00000000091750ff",
+ "0x0000000002a05b9f",
+ "0x00000000096799cf",
+ "0x000000000b87ba5f",
+ "0x000000000d71a7ef",
+ "0x000000000382d38f",
+ "0x000000000751bfdf",
+ "0x000000000d8d0e4f",
+ "0x000000000023863f",
+ "0x000000000293080f",
+ "0x0000000007e9043f",
+ "0x00000000016ea33f",
+ "0x000000000171b89f",
+ "0x000000000e1cc49f",
+ "0x0000000007579aef",
+ "0x00000000033b27bf",
+ "0x000000000c75e3bf",
+ "0x000000000d1b9f3f",
+ "0x000000000e4b3aaf",
+ "0x0000000002e8e3bf",
+ "0x0000000000a6948f",
+ "0x000000000812c95f",
+ "0x000000000b56f69f",
+ "0x0000000003d56cdf",
+ "0x000000000523156f",
+ "0x0000000001bdb01f",
+ "0x000000000e1f115f",
+ "0x000000000ba11eff",
+ "0x000000000ac3273f",
+ "0x0000000001c78aef",
+ "0x00000000091ad40f",
+ "0x0000000001d5918f",
+ "0x00000000069e215f",
+ "0x0000000002dcdedf",
+ "0x0000000008a2c50f",
+ "0x000000000d84192f",
+ "0x000000000abfb05f",
+ "0x0000000001350eef",
+ "0x000000000cc653ef",
+ "0x00000000056b7bcf",
+ "0x000000000939349f",
+ "0x0000000008216d7f",
+ "0x000000000c587e6f",
+ "0x0000000003732f7f",
+ "0x0000000006303a0f",
+ "0x0000000008f57f2f",
+ "0x000000000677980f",
+ "0x0000000001ea4bcf",
+ "0x00000000080bdf5f",
+ "0x00000000028bed4f",
+ "0x000000000e43cb8f",
+ "0x0000000007762d2f",
+ "0x0000000004682e3f",
+ "0x000000000bcf257f",
+ "0x000000000de6946f",
+ "0x0000000001ea255f",
+ "0x0000000002a81c4f",
+ "0x000000000402d3ff",
+ "0x000000000b58cf1f",
+ "0x000000000cc9022f",
+ "0x000000000719974f",
+ "0x00000000058333ff",
+ "0x000000000935a64f",
+ "0x0000000005da8b5f",
+ "0x00000000054f463f",
+ "0x0000000004a09a4f",
+ "0x00000000037f741f",
+ "0x000000000adc0f2f",
+ "0x0000000009eb846f",
+ "0x000000000a2536bf",
+ "0x00000000058b8d7f",
+ "0x00000000038475af",
+ "0x00000000040af71f",
+ "0x00000000030fe14f",
+ "0x0000000008c4ed1f",
+ "0x000000000506362f",
+ "0x000000000af5b74f",
+ "0x000000000cd97fbf",
+ "0x000000000a39a14f",
+ "0x0000000008ae72bf",
+ "0x000000000003c8ef",
+ "0x0000000002381e9f",
+ "0x0000000003bc443f",
+ "0x000000000738595f",
+ "0x0000000005db224f",
+ "0x000000000b04c91f",
+ "0x0000000002027cef",
+ "0x00000000002ed08f",
+ "0x000000000bd21faf",
+ "0x000000000477f6df",
+ "0x0000000001c4965f",
+ "0x00000000008a4c3f",
+ "0x000000000242e2df",
+ "0x00000000047f7d6f",
+ "0x0000000005b1749f",
+ "0x0000000000021c2b",
+ "0x00000000000320cb",
+ "0x000000000002a6eb",
+ "0x000000000000b42b",
+ "0x00000000000386fb",
+ "0x000000000002af5b",
+ "0x000000000003bd5b",
+ "0x0000000000029d8b",
+ "0x000000000001763b",
+ "0x000000000000c7db",
+ "0x0000000000012feb",
+ "0x000000000001e89b",
+ "0x00000000000301db",
+ "0x00000000000330bb",
+ "0x000000000003752b",
+ "0x000000000003275b",
+ "0x000000000002bd6b",
+ "0x000000000001b6eb",
+ "0x0000000000024b0b",
+ "0x000000000001178b",
+ "0x0000000000026dbb",
+ "0x0000000000022dfb",
+ "0x000000000001b50b",
+ "0x000000000001e5cb",
+ "0x0000000000021c2b",
+ "0x000000000002609b",
+ "0x000000000002c12b",
+ "0x0000000000020f0b",
+ "0x000000000003a40b",
+ "0x0000000000017dbb",
+ "0x000000000001c7cb",
+ "0x000000000003ac7b",
+ "0x0000000000029e7b",
+ "0x000000000001e5cb",
+ "0x000000000003923b",
+ "0x000000000001d21b",
+ "0x0000000000037bbb",
+ "0x000000000002825b",
+ "0x0000000000004b2b",
+ "0x000000000002e79b",
+ "0x00000000000399bb",
+ "0x000000000003275b",
+ "0x000000000001349b",
+ "0x00000000000222bb",
+ "0x000000000002c8ab",
+ "0x000000000001448b",
+ "0x000000000002816b",
+ "0x0000000000022a3b",
+ "0x000000000001349b",
+ "0x0000000000030b3b",
+ "0x000000000001a06b",
+ "0x000000000002726b",
+ "0x000000000003a22b",
+ "0x0000000000010a6b",
+ "0x000000000000e3fb",
+ "0x000000000000d7cb",
+ "0x000000000003905b",
+ "0x000000000000791b",
+ "0x000000000002276b",
+ "0x00000000000101fb",
+ "0x000000000001772b",
+ "0x000000000003ab8b",
+ "0x0000000000003e0b",
+ "0x000000000003b03b",
+ "0x000000000000e4eb",
+ "0x0000000000011a5b",
+ "0x00000000000204bb",
+ "0x000000000000a9db",
+ "0x00000000000279eb",
+ "0x000000000001682b",
+ "0x00000000000202db",
+ "0x000000000002a41b",
+ "0x0000000000039b9b",
+ "0x000000000003c11b",
+ "0x00000000000330bb",
+ "0x000000000001fb5b",
+ "0x000000000003653b",
+ "0x000000000002726b",
+ "0x000000000001880b",
+ "0x0000000000035bdb",
+ "0x000000000002bb8b",
+ "0x000000000003b12b",
+ "0x000000000000674b",
+ "0x000000000002f00b",
+ "0x000000000001e11b",
+ "0x000000000002f0fb",
+ "0x00000000000288eb",
+ "0x00000000000288eb",
+ "0x0000000000009f8b",
+ "0x000000000003257b",
+ "0x000000000002f0fb",
+ "0x000000000002069b",
+ "0x0000000000032b1b",
+ "0x000000000002582b",
+ "0x0000000000038abb",
+ "0x000000000003b3fb",
+ "0x000000000003392b",
+ "0x000000000003a5eb",
+ "0x000000000002e4cb",
+ "0x00000000000151ab",
+ "0x000000000000f5cb",
+ "0x000000000001538b",
+ "0x000000000002663b",
+ "0x0000000000009e9b",
+ "0x000000000000b60b",
+ "0x000000000000ea8b",
+ "0x00000000000396eb",
+ "0x000000000000f4db",
+ "0x000000000002717b",
+ "0x0000000000024bfb",
+ "0x000000000003761b",
+ "0x000000000002249b",
+ "0x0000000000002a5b",
+ "0x00000000000133ab",
+ "0x000000000002663b",
+ "0x00000000000396eb",
+ "0x0000000000028e8b",
+ "0x000000000002b22b",
+ "0x000000000001169b",
+ "0x0000000000012a4b",
+ "0x00000000000296fb",
+ "0x00000000000111eb",
+ "0x000000000003626b",
+ "0x000000000001d99b",
+ "0x000000000001d12b",
+ "0x00000000000123bb",
+ "0x000000000003284b",
+ "0x000000000002bc7b",
+ "0x0000000000023b1b",
+ "0x0000000000003feb",
+ "0x0000000000012d1b",
+ "0x0000000000008dbb",
+ "0x00000000000041cb",
+ "0x000000000000773b",
+ "0x00000000000203cb",
+ "0x000000000003329b",
+ "0x000000000002e10b",
+ "0x0000000000026ccb",
+ "0x0000000000038c9b",
+ "0x000000000002db6b",
+ "0x000000000000917b",
+ "0x000000000002f0fb",
+ "0x0000000000023fcb",
+ "0x000000000002d11b",
+ "0x0000000000014b1b",
+ "0x000000000001736b",
+ "0x000000000003923b",
+ "0x000000000001a51b",
+ "0x0000000000004a3b",
+ "0x0000000000014deb",
+ "0x000000000000467b",
+ "0x000000000003671b",
+ "0x000000000002a23b",
+ "0x000000000001a51b",
+ "0x000000000002e6ab",
+ "0x0000000000004d0b",
+ "0x000000000001d5db",
+ "0x00000000000111eb",
+ "0x000000000002a50b",
+ "0x000000000003167b",
+ "0x000000000003491b",
+ "0x0000000000024ceb",
+ "0x0000000000011e1b",
+ "0x000000000002834b",
+ "0x000000000000962b",
+ "0x0000000000011d2b",
+ "0x0000000000016beb",
+ "0x00000000000197fb",
+ "0x0000000000008f9b",
+ "0x000000000002294b",
+ "0x0000000000028cab",
+ "0x000000000000e12b",
+ "0x000000000003923b",
+ "0x000000000003770b",
+ "0x000000000000f2fb",
+ "0x000000000001fa6b",
+ "0x000000000002c3fb",
+ "0x000000000001934b",
+ "0x000000000002bd6b",
+ "0x000000000003a6db",
+ "0x000000000001fd3b",
+ "0x00000000000022db",
+ "0x000000000000d31b",
+ "0x00000000000024bb",
+ "0x0000000000023c0b",
+ "0x000000000000944b",
+ "0x000000000002c4eb",
+ "0x000000000002186b",
+ "0x000000000003ab8b",
+ "0x000000000000dc7b",
+ "0x0000000000013b2b",
+ "0x000000000001079b",
+ "0x0000000000005edb",
+ "0x000000000002db6b",
+ "0x000000000002af5b",
+ "0x000000000000755b",
+ "0x00000000000133ab",
+ "0x0000000000009dab",
+ "0x000000000002942b",
+ "0x000000000001001b",
+ "0x000000000001c5eb",
+ "0x0000000000004d0b",
+ "0x000000000000babb",
+ "0x0000000000021a4b",
+ "0x0000000000020a5b",
+ "0x000000000002c30b",
+ "0x000000000002168b",
+ "0x000000000001ed4b",
+ "0x000000000001853b",
+ "0x000000000002a5fb",
+ "0x0000000000033bfb",
+ "0x000000000001439b",
+ "0x000000000003185b",
+ "0x00000000000043ab",
+ "0x00000000000141bb",
+ "0x0000000000011b4b",
+ "0x000000000001484b",
+ "0x000000000002177b",
+ "0x000000000002e3db",
+ "0x00000000000033bb",
+ "0x000000000001a06b",
+ "0x0000000000030a4b",
+ "0x0000000000014cfb",
+ "0x0000000000019bbb",
+ "0x000000000001fb5b",
+ "0x00000000000112db",
+ "0x000000000000cd7b",
+ "0x000000000002609b",
+ "0x0000000000037bbb",
+ "0x000000000000b60b",
+ "0x000000000001be6b",
+ "0x000000000000458b",
+ "0x000000000002357b",
+ "0x000000000001934b",
+ "0x000000000000377b",
+ "0x00000000000111eb",
+ "0x000000000000df4b",
+ "0x0000000000007ebb",
+ "0x000000000001e02b",
+ "0x000000000003bb7b",
+ "0x00000000000212cb",
+ "0x000000000002951b",
+ "0x000000000002933b",
+ "0x00000000000223ab",
+ "0x000000000003a4fb",
+ "0x0000000000011b4b",
+ "0x000000000000674b",
+ "0x000000000002924b",
+ "0x0000000000001e2b",
+ "0x000000000001871b",
+ "0x000000000002393b",
+ "0x000000000001fb5b",
+ "0x00000000000031db",
+ "0x000000000002e01b",
+ "0x00000000000287fb",
+ "0x0000000000029abb",
+ "0x000000000000cc8b",
+ "0x000000000002b31b",
+ "0x000000000001e6bb",
+ "0x000000000001394b",
+ "0x000000000002b9ab",
+ "0x000000000001b05b",
+ "0x000000000001bd7b",
+ "0x000000000002a6eb",
+ "0x00000000000111eb",
+ "0x000000000003b6cb",
+ "0x000000000000d6db",
+ "0x000000000002e79b",
+ "0x0000000000033bfb",
+ "0x000000000001010b",
+ "0x0000000000022a3b",
+ "0x000000000002825b",
+ "0x00000000000112db",
+ "0x00000000000340ab",
+ "0x000000000002cc6b",
+ "0x000000000001475b",
+ "0x000000000000782b",
+ "0x000000000000a70b",
+ "0x000000000003c20b",
+ "0x00000000000110fb",
+ "0x00000000000102eb",
+ "0x000000000000b9cb",
+ "0x000000000001970b",
+ "0x000000000003b21b",
+ "0x000000000002c6cb",
+ "0x0000000000039e6b",
+ "0x000000000003b21b",
+ "0x000000000001466b",
+ "0x000000000003b12b",
+ "0x000000000001d5db",
+ "0x000000000003734b",
+ "0x000000000000c23b",
+ "0x000000000002546b",
+ "0x000000000000fb6b",
+ "0x0000000000010e2b",
+ "0x000000000001fa6b",
+ "0x000000000001592b",
+ "0x000000000003068b",
+ "0x0000000000030c2b",
+ "0x000000000003a9ab",
+ "0x000000000002f4bb",
+ "0x000000000000917b",
+ "0x00000000000241ab",
+ "0x000000000003a6db",
+ "0x000000000000e12b",
+ "0x000000000001907b",
+ "0x000000000003c3eb",
+ "0x00000000000124ab",
+ "0x0000000000005c0b",
+ "0x00000000000199db",
+ "0x000000000001448b",
+ "0x000000000002fa5b",
+ "0x0000000000020e1b",
+ "0x0000000000021a4b",
+ "0x000000000001001b",
+ "0x00000000000296fb",
+ "0x000000000002d7ab",
+ "0x000000000001c9ab",
+ "0x000000000002447b",
+ "0x000000000001475b",
+ "0x000000000002b6db",
+ "0x000000000000a34b",
+ "0x0000000000038d8b",
+ "0x000000000002834b",
+ "0x000000000003bf3b",
+ "0x000000000003bf3b",
+ "0x00000000000210eb",
+ "0x000000000000ce6b",
+ "0x000000000001367b",
+ "0x000000000001556b",
+ "0x0000000000017dbb",
+ "0x00000000000304ab",
+ "0x000000000002b04b",
+ "0x000000000000c14b",
+ "0x000000000003851b",
+ "0x000000000003284b",
+ "0x000000000000f3eb",
+ "0x0000000000031d0b",
+ "0x00000000000220db",
+ "0x000000000001583b",
+ "0x00000000000105bb",
+ "0x0000000000005c0b",
+ "0x0000000000034dcb",
+ "0x0000000000013c1b",
+ "0x000000000002a32b",
+ "0x000000000002f78b",
+ "0x000000000001ee3b",
+ "0x00000000000331ab",
+ "0x000000000000755b",
+ "0x000000000003c2fb",
+ "0x0000000000023deb",
+ "0x0000000000005a2b",
+ "0x00000000000202db",
+ "0x000000000003635b",
+ "0x000000000001871b",
+ "0x000000000001961b",
+ "0x00000000000115ab",
+ "0x0000000000026dbb",
+ "0x000000000001fd3b",
+ "0x000000000001925b",
+ "0x000000000000269b",
+ "0x00000000000211db",
+ "0x000000000002825b",
+ "0x000000000003932b",
+ "0x0000000000008f9b",
+ "0x000000000000755b",
+ "0x0000000000037f7b",
+ "0x0000000000019f7b",
+ "0x000000000003b12b",
+ "0x0000000000024bfb",
+ "0x000000000002b22b",
+ "0x000000000001f10b",
+ "0x000000000000a25b",
+ "0x00000000000301db",
+ "0x0000000000032deb",
+ "0x000000000003ae5b",
+ "0x000000000000e5db",
+ "0x000000000002b13b",
+ "0x0000000000037acb",
+ "0x000000000003851b",
+ "0x000000000001097b",
+ "0x000000000000db8b",
+ "0x0000000000017aeb",
+ "0x0000000000033ddb",
+ "0x0000000000035bdb",
+ "0x0000000000019d9b",
+ "0x0000000000012c2b",
+ "0x0000000000033b0b",
+ "0x00000000000311cb",
+ "0x000000000001d7bb",
+ "0x000000000000737b",
+ "0x0000000000034afb",
+ "0x000000000001628b",
+ "0x000000000002366b",
+ "0x000000000000827b",
+ "0x000000000003815b",
+ "0x00000000000241ab",
+ "0x0000000000020ffb",
+ "0x0000000000030c2b",
+ "0x000000000002be5b",
+ "0x000000000000e6cb",
+ "0x000000000001e98b",
+ "0x000000000002d4db",
+ "0x000000000003707b",
+ "0x0000000000020d2b",
+ "0x000000000001f1fb",
+ "0x000000000000da9b",
+ "0x000000000002ed3b",
+ "0x000000000002465b",
+ "0x000000000002a7db",
+ "0x000000000000782b",
+ "0x0000000000036f8b",
+ "0x000000000001cc7b",
+ "0x000000000001a60b",
+ "0x00000000000030eb",
+ "0x0000000000004dfb",
+ "0x0000000000022b2b",
+ "0x000000000001691b",
+ "0x000000000001358b",
+ "0x000000000002834b",
+ "0x000000000002807b",
+ "0x00000000000202db",
+ "0x00000000000311cb",
+ "0x0000000000002d2b",
+ "0x000000000003545b",
+ "0x00000000000103db",
+ "0x000000000002bf4b",
+ "0x0000000000023a2b",
+ "0x0000000000027bcb",
+ "0x000000000003b4eb",
+ "0x00000000000199db",
+ "0x000000000002825b",
+ "0x0000000000027dab",
+ "0x000000000000fd4b",
+ "0x000000000001286b",
+ "0x000000000001a06b",
+ "0x0000000000005cfb",
+ "0x0000000000001d3b",
+ "0x0000000000011c3b",
+ "0x000000000001a9cb",
+ "0x000000000000296b",
+ "0x000000000003770b",
+ "0x0000000000005c0b",
+ "0x000000000001358b",
+ "0x0000000000027e9b",
+ "0x0000000000007ebb",
+ "0x0000000000022b2b",
+ "0x000000000000fb6b",
+ "0x0000000000010e2b",
+ "0x000000000000755b",
+ "0x000000000001f3db",
+ "0x00000000000377fb",
+ "0x00000000000020fb",
+ "0x000000000000c6eb",
+ "0x000000000001556b",
+ "0x000000000000746b",
+ "0x000000000002e6ab",
+ "0x000000000000a52b",
+ "0x000000000003419b",
+ "0x000000000001b50b",
+ "0x000000000000809b",
+ "0x0000000000027adb",
+ "0x000000000002294b",
+ "0x000000000000449b",
+ "0x000000000001457b",
+ "0x000000000002447b",
+ "0x000000000002bd6b",
+ "0x000000000001853b",
+ "0x0000000000023b1b",
+ "0x0000000000037cab",
+ "0x000000000003b3fb",
+ "0x000000000001277b",
+ "0x000000000000c7db",
+ "0x000000000001358b",
+ "0x0000000000012feb",
+ "0x000000000001c13b",
+ "0x000000000002366b",
+ "0x000000000002f4bb",
+ "0x000000000002924b",
+ "0x000000000001475b",
+ "0x000000000001f1fb",
+ "0x000000000000cf5b",
+ "0x000000000001439b",
+ "0x000000000002e4cb",
+ "0x000000000003b03b",
+ "0x000000000000566b",
+ "0x000000000000c14b",
+ "0x000000000000eb7b",
+ "0x0000000000032edb",
+ "0x000000000002a7db",
+ "0x0000000000032deb",
+ "0x000000000003752b",
+ "0x000000000001376b",
+ "0x000000000000c8cb",
+ "0x000000000003194b",
+ "0x000000000001493b",
+ "0x000000000002c21b",
+ "0x000000000003482b",
+ "0x0000000000005edb",
+ "0x0000000000002ffb",
+ "0x000000000002339b",
+ "0x0000000000031eeb",
+ "0x00000000000120eb",
+ "0x0000000000013c1b",
+ "0x00000000000298db",
+ "0x000000000000845b",
+ "0x000000000001547b",
+ "0x00000000000396eb",
+ "0x00000000000198eb",
+ "0x000000000000ed5b",
+ "0x000000000001f1fb",
+ "0x0000000000021a4b"
+ ],
+ "p": [
+ "0x0000000001c4885b",
+ "0x00000000001b5f8b",
+ "0x0000000003f3f525",
+ "0x0000000003632a82",
+ "0x00000000015f5bdc",
+ "0x0000000002d2602c",
+ "0x0000000002156e44",
+ "0x00000000008dd746",
+ "0x0000000003aaa713",
+ "0x000000000297dd91",
+ "0x000000000158c95f",
+ "0x00000000020f988d",
+ "0x0000000003db956a",
+ "0x0000000001d607de",
+ "0x00000000038c39c2",
+ "0x0000000002a2df2c",
+ "0x0000000001895253",
+ "0x00000000022b204d",
+ "0x000000000025386c",
+ "0x00000000002efcd5",
+ "0x000000000318663a",
+ "0x000000000216c0c0",
+ "0x000000000187502a",
+ "0x0000000003bd8bec",
+ "0x0000000001382315",
+ "0x0000000003623c21",
+ "0x00000000025465f7",
+ "0x0000000003e58c76",
+ "0x0000000001e668bf",
+ "0x00000000023eb450",
+ "0x0000000003781131",
+ "0x000000000067301b",
+ "0x0000000003ab7cce",
+ "0x0000000000a53c73",
+ "0x0000000000ce5753",
+ "0x00000000012a5b2a",
+ "0x0000000001fbd595",
+ "0x00000000037afe70",
+ "0x00000000007755d9",
+ "0x0000000001c2be80",
+ "0x0000000003c8fe6b",
+ "0x0000000000ed42da",
+ "0x0000000000caa894",
+ "0x00000000010dc4b4",
+ "0x00000000014a16aa",
+ "0x0000000002e1b74c",
+ "0x00000000029a32da",
+ "0x0000000001757764",
+ "0x0000000003304049",
+ "0x0000000000a58a87",
+ "0x0000000001405525",
+ "0x000000000187a37f",
+ "0x0000000003ce7502",
+ "0x0000000000fdcc8a",
+ "0x0000000003cd1879",
+ "0x0000000002b254b6",
+ "0x0000000001cec04b",
+ "0x00000000036983ea",
+ "0x0000000000cfec78",
+ "0x0000000003b5b66c",
+ "0x0000000003ba74cb",
+ "0x00000000005afa9f",
+ "0x000000000324130e",
+ "0x00000000035f1887",
+ "0x0000000002795929",
+ "0x0000000000fd4d0f",
+ "0x0000000000d68689",
+ "0x0000000003d1eb66",
+ "0x000000000192617b",
+ "0x000000000194929d",
+ "0x0000000003a4b71b",
+ "0x0000000000d1f167",
+ "0x0000000001b5d7cb",
+ "0x000000000042e665",
+ "0x00000000000e42a5",
+ "0x00000000013ed252",
+ "0x00000000003a4b9e",
+ "0x0000000003de40a8",
+ "0x00000000002b8f51",
+ "0x000000000211f827",
+ "0x00000000004cf2d2",
+ "0x00000000021b63a4",
+ "0x000000000304ba50",
+ "0x0000000001b6cb10",
+ "0x0000000003b2233b",
+ "0x0000000003a2886a",
+ "0x000000000167135c",
+ "0x0000000001fd354f",
+ "0x0000000003ef28fa",
+ "0x000000000330f95d",
+ "0x0000000003d432ef",
+ "0x0000000003569576",
+ "0x0000000000c3e83e",
+ "0x0000000001ae4f98",
+ "0x00000000018853b5",
+ "0x000000000187cfa0",
+ "0x0000000001286326",
+ "0x0000000003ddd38e",
+ "0x00000000013c72bf",
+ "0x00000000034fc2ce",
+ "0x00000000025f413a",
+ "0x00000000010947ef",
+ "0x0000000001cac513",
+ "0x0000000003a888d1",
+ "0x0000000002027d68",
+ "0x0000000001ebaf42",
+ "0x000000000029139e",
+ "0x0000000000317759",
+ "0x0000000002462925",
+ "0x00000000020fdf13",
+ "0x0000000003a9b8db",
+ "0x00000000009ae0af",
+ "0x0000000003c4cea3",
+ "0x0000000002632493",
+ "0x00000000005f6aea",
+ "0x0000000003ca8b9b",
+ "0x0000000001a52b1c",
+ "0x0000000000b74681",
+ "0x00000000028a1bde",
+ "0x0000000003f4f08a",
+ "0x0000000002f088c4",
+ "0x00000000026a3b85",
+ "0x00000000025623f8",
+ "0x00000000027fdbb6",
+ "0x0000000001cd45b0",
+ "0x00000000014bcaad",
+ "0x00000000030cdcf9",
+ "0x00000000025cafec",
+ "0x0000000000d90896",
+ "0x0000000003bfddf2",
+ "0x000000000155f856",
+ "0x000000000350cab9",
+ "0x0000000000aeda5c",
+ "0x0000000000891d00",
+ "0x0000000002e98a22",
+ "0x0000000003ecaf08",
+ "0x00000000023b71c8",
+ "0x00000000025187d2",
+ "0x00000000014a32af",
+ "0x0000000000ba0e0e",
+ "0x0000000000777729",
+ "0x0000000003f39a1e",
+ "0x0000000003cc8dc8",
+ "0x0000000001772bd1",
+ "0x00000000008df560",
+ "0x0000000000d44b0c",
+ "0x00000000002cd300",
+ "0x0000000003ed6849",
+ "0x000000000065852a",
+ "0x0000000003a2df2a",
+ "0x0000000002b19178",
+ "0x0000000001f3cad0",
+ "0x0000000001c91385",
+ "0x0000000001417849",
+ "0x00000000038b9ecc",
+ "0x0000000002032407",
+ "0x0000000001fe43d7",
+ "0x000000000296b0f9",
+ "0x00000000000fe299",
+ "0x000000000037b6b5",
+ "0x000000000281cadf",
+ "0x0000000003a27019",
+ "0x0000000001effbbe",
+ "0x0000000003e94f0c",
+ "0x0000000001dbb1d0",
+ "0x000000000301a98c",
+ "0x0000000003582a04",
+ "0x000000000134b08a",
+ "0x0000000002ca2b4e",
+ "0x0000000003976ba9",
+ "0x0000000002cca907",
+ "0x0000000002e1746f",
+ "0x00000000024ef516",
+ "0x000000000259f73a",
+ "0x00000000002ac488",
+ "0x00000000017e205d",
+ "0x00000000031e4885",
+ "0x0000000003a41462",
+ "0x0000000001449bf5",
+ "0x0000000001b32c7a",
+ "0x000000000198e4c8",
+ "0x000000000365e809",
+ "0x0000000000d240dd",
+ "0x0000000003684f11",
+ "0x0000000002584aaf",
+ "0x0000000000109593",
+ "0x000000000123847a",
+ "0x0000000002988005",
+ "0x0000000002850d37",
+ "0x00000000007763aa",
+ "0x00000000038f8fb4",
+ "0x00000000012dd34f",
+ "0x00000000010bdfe6",
+ "0x00000000020c83f7",
+ "0x00000000022ae125",
+ "0x0000000002cae8b3",
+ "0x00000000024de4ce",
+ "0x0000000000ce4763",
+ "0x00000000032fd392",
+ "0x00000000013448bb",
+ "0x0000000000c3192d",
+ "0x00000000034a7ed4",
+ "0x00000000004a6ac4",
+ "0x0000000000dff615",
+ "0x0000000002927fcd",
+ "0x0000000001771da4",
+ "0x00000000001730da",
+ "0x0000000001f5abe6",
+ "0x0000000000a04af0",
+ "0x00000000023be65f",
+ "0x000000000357f1ff",
+ "0x000000000198d75e",
+ "0x00000000026fc49d",
+ "0x00000000025c9982",
+ "0x00000000005abeb3",
+ "0x00000000003c4bfc",
+ "0x00000000012cb72d",
+ "0x000000000135af70",
+ "0x00000000007a6786",
+ "0x000000000039f261",
+ "0x0000000000fcbc04",
+ "0x000000000122c4e8",
+ "0x00000000009aacfd",
+ "0x00000000007578ea",
+ "0x000000000283adf3",
+ "0x000000000365a2fd",
+ "0x00000000005abd48",
+ "0x0000000000553cbe",
+ "0x0000000003ab9694",
+ "0x0000000003167b9c",
+ "0x00000000025e453a",
+ "0x0000000001c852bb",
+ "0x0000000003beaf69",
+ "0x0000000000829bf4",
+ "0x000000000323fb96",
+ "0x0000000001c3e82e",
+ "0x0000000002e328ab",
+ "0x000000000058528e",
+ "0x00000000026e434c",
+ "0x000000000339036e",
+ "0x0000000000bb5595",
+ "0x0000000000a57a2c",
+ "0x0000000003b5569c",
+ "0x0000000000cf26b1",
+ "0x0000000001aac414",
+ "0x0000000001001945",
+ "0x0000000003845f71",
+ "0x00000000037940f0",
+ "0x0000000003d1d4ba",
+ "0x0000000002e74811",
+ "0x0000000001ce3591",
+ "0x0000000003d0a11f",
+ "0x00000000031fd74a",
+ "0x0000000001ca21a2",
+ "0x00000000014aeede",
+ "0x0000000001788f36",
+ "0x0000000001ad71b1",
+ "0x00000000032d45c5",
+ "0x00000000002e0444",
+ "0x00000000021ee330",
+ "0x0000000000881b18",
+ "0x0000000000f507d9",
+ "0x00000000034da1eb",
+ "0x0000000001105130",
+ "0x00000000024f4187",
+ "0x0000000003bfdcc1",
+ "0x0000000001e35e50",
+ "0x00000000002e97e1",
+ "0x00000000007b261a",
+ "0x0000000001904603",
+ "0x0000000003221615",
+ "0x0000000000003a52",
+ "0x00000000034ad1f3",
+ "0x0000000002d9572c",
+ "0x0000000002e245b0",
+ "0x00000000003b4587",
+ "0x0000000000b1192b",
+ "0x000000000222e8d8",
+ "0x0000000001dfc562",
+ "0x000000000076f6ef",
+ "0x000000000045a51d",
+ "0x00000000010514ce",
+ "0x000000000244d4af",
+ "0x0000000002c779cc",
+ "0x0000000000517b1a",
+ "0x0000000000603719",
+ "0x000000000156cdba",
+ "0x0000000000c3dfce",
+ "0x0000000001145399",
+ "0x00000000032a5373",
+ "0x00000000005957b0",
+ "0x0000000003ed3f95",
+ "0x00000000039685aa",
+ "0x0000000000f336f1",
+ "0x0000000003f29a36",
+ "0x0000000001fc8e5f",
+ "0x0000000002a0f037",
+ "0x0000000002ffdf8f",
+ "0x000000000332674e",
+ "0x0000000001b46346",
+ "0x0000000003d71790",
+ "0x0000000003a3fa6a",
+ "0x0000000003a499d2",
+ "0x000000000205a485",
+ "0x0000000003f47498",
+ "0x0000000001982bfa",
+ "0x00000000039238b7",
+ "0x00000000007cf5b6",
+ "0x0000000002dbabbf",
+ "0x000000000032abe7",
+ "0x00000000025e639f",
+ "0x00000000005ee09e",
+ "0x000000000125d506",
+ "0x00000000017f03fb",
+ "0x00000000005f7e62",
+ "0x000000000124668e",
+ "0x00000000013030fa",
+ "0x0000000001a56ced",
+ "0x000000000373cc53",
+ "0x0000000002925aff",
+ "0x00000000008a7e08",
+ "0x000000000367a0bb",
+ "0x00000000015b3abb",
+ "0x0000000002d41757",
+ "0x0000000002626884",
+ "0x0000000003a32c97",
+ "0x0000000001400e68",
+ "0x0000000001256115",
+ "0x0000000003d965e0",
+ "0x00000000029c6c76",
+ "0x0000000002a6c302",
+ "0x000000000061bf33",
+ "0x000000000044cbb9",
+ "0x0000000002290510",
+ "0x00000000036851a2",
+ "0x000000000222c91f",
+ "0x000000000001ce1b",
+ "0x00000000018b3cc5",
+ "0x0000000001fd562b",
+ "0x0000000000d1f66e",
+ "0x000000000380b7c7",
+ "0x00000000010e8219",
+ "0x00000000028298a3",
+ "0x000000000095331f",
+ "0x0000000000282e19",
+ "0x0000000001b1d351",
+ "0x000000000180a4db",
+ "0x00000000003ba001",
+ "0x0000000002ea0839",
+ "0x0000000001325f93",
+ "0x0000000000fecfa1",
+ "0x000000000157b3b1",
+ "0x00000000027f7faa",
+ "0x000000000370226e",
+ "0x0000000000dc76e7",
+ "0x0000000002ece746",
+ "0x0000000003873996",
+ "0x0000000003a25a48",
+ "0x000000000317ed1b",
+ "0x00000000003f7ff7",
+ "0x00000000012df4bd",
+ "0x0000000001f94213",
+ "0x00000000009efb95",
+ "0x00000000007c0632",
+ "0x00000000001f6295",
+ "0x000000000066c7a9",
+ "0x000000000158504c",
+ "0x00000000019296d8",
+ "0x000000000196d158",
+ "0x0000000000ca4ce7",
+ "0x0000000001bc0e09",
+ "0x0000000003369e7d",
+ "0x0000000002a68e28",
+ "0x0000000003534d75",
+ "0x00000000004f0e30",
+ "0x0000000000e3b8db",
+ "0x0000000003d79bbf",
+ "0x00000000031abb86",
+ "0x0000000000d24553",
+ "0x0000000003f25b1a",
+ "0x0000000003891b6e",
+ "0x0000000001c30c53",
+ "0x000000000105a1e9",
+ "0x000000000345ab6d",
+ "0x00000000026b7a47",
+ "0x0000000003f5a8a0",
+ "0x00000000007ad413",
+ "0x0000000001fedf73",
+ "0x0000000000fe49ce",
+ "0x0000000003e14ff5",
+ "0x0000000001396f47",
+ "0x00000000014a3b59",
+ "0x0000000002bbd567",
+ "0x00000000007a59b6",
+ "0x00000000011f9559",
+ "0x0000000003dec29e",
+ "0x00000000021f136e",
+ "0x0000000000a49c4b",
+ "0x000000000343c83c",
+ "0x0000000000b46d2f",
+ "0x00000000017bb9ee",
+ "0x0000000001ae204b",
+ "0x0000000000a7bde7",
+ "0x00000000014ccf12",
+ "0x000000000090dd1b",
+ "0x0000000002f4f972",
+ "0x0000000003e1635c",
+ "0x0000000001dd26db",
+ "0x00000000022eda0e",
+ "0x000000000391589b",
+ "0x0000000003b03cd6",
+ "0x00000000037d146e",
+ "0x0000000002565da8",
+ "0x0000000001a16838",
+ "0x00000000031759b5",
+ "0x0000000001b4a8fd",
+ "0x000000000018f897",
+ "0x00000000028e22e8",
+ "0x00000000010d1d36",
+ "0x0000000000b1665f",
+ "0x00000000022953cf",
+ "0x00000000004757e2",
+ "0x0000000002f738dd",
+ "0x0000000003bb95d1",
+ "0x0000000003b13462",
+ "0x000000000168ad0e",
+ "0x00000000015ab92d",
+ "0x000000000193a273",
+ "0x000000000320da0c",
+ "0x000000000011a4d0",
+ "0x00000000016918b1",
+ "0x0000000003d53ca4",
+ "0x0000000003f22633",
+ "0x0000000002344746",
+ "0x0000000003efc910",
+ "0x00000000036b736b",
+ "0x0000000000b15d5e",
+ "0x0000000000159cda",
+ "0x0000000000df73de",
+ "0x000000000221ce0e",
+ "0x00000000034ac612",
+ "0x000000000258b50b",
+ "0x0000000000d07ca8",
+ "0x0000000002b74396",
+ "0x0000000001b81cb6",
+ "0x0000000001b2a359",
+ "0x00000000014776a1",
+ "0x000000000222c192",
+ "0x000000000107e64e",
+ "0x0000000000c4e461",
+ "0x0000000000f912bf",
+ "0x000000000225ecd9",
+ "0x00000000023f0d81",
+ "0x00000000002c4c18",
+ "0x0000000003962bf4",
+ "0x0000000000d37a0e",
+ "0x0000000002653ef8",
+ "0x000000000383ba2a",
+ "0x00000000006cf889",
+ "0x0000000000e258a3",
+ "0x000000000136db42",
+ "0x00000000001177b4",
+ "0x0000000000daff93",
+ "0x0000000001ca9b45",
+ "0x0000000001bef0b6",
+ "0x00000000025f49e6",
+ "0x00000000026a8f37",
+ "0x0000000000eae1e1",
+ "0x0000000002f1559d",
+ "0x0000000001731bf0",
+ "0x00000000014c28ac",
+ "0x0000000002f7adf1",
+ "0x0000000003c13867",
+ "0x00000000023d49c1",
+ "0x0000000003658d19",
+ "0x0000000002e6747b",
+ "0x000000000123a4ef",
+ "0x00000000027493fa",
+ "0x000000000200249f",
+ "0x00000000017936ec",
+ "0x00000000039e3e73",
+ "0x00000000015e9e24",
+ "0x0000000003d046e6",
+ "0x0000000000c95306",
+ "0x0000000002182610",
+ "0x0000000003e12746",
+ "0x0000000000e7d4ce",
+ "0x00000000007a4ab5",
+ "0x0000000003645dc5",
+ "0x000000000338443f",
+ "0x0000000000fdf62c",
+ "0x0000000000655f6d",
+ "0x000000000297b7ce",
+ "0x000000000056c163",
+ "0x000000000156630b",
+ "0x0000000002594dc7",
+ "0x0000000002773ad5",
+ "0x000000000047dc0c",
+ "0x000000000077b606",
+ "0x0000000001de03ce",
+ "0x00000000034e1c59",
+ "0x0000000002e62f33",
+ "0x00000000035b5deb",
+ "0x0000000000ef0b33",
+ "0x00000000009124af",
+ "0x000000000105027e",
+ "0x00000000018db0a2",
+ "0x0000000001ec4e3a",
+ "0x000000000148c193",
+ "0x0000000003c14902",
+ "0x0000000003f1f3dc",
+ "0x000000000383e904",
+ "0x0000000003921648",
+ "0x00000000030df243",
+ "0x000000000167810e",
+ "0x00000000019352bd",
+ "0x00000000034660b0",
+ "0x000000000070eaf9",
+ "0x0000000003881615",
+ "0x0000000002e69fa1",
+ "0x000000000139782a",
+ "0x00000000001e838c",
+ "0x0000000003d02f96",
+ "0x00000000037bc79a",
+ "0x0000000001cd03c3",
+ "0x00000000028561be",
+ "0x0000000001970f9e",
+ "0x0000000000adc81d",
+ "0x0000000000423a5b",
+ "0x0000000000011250",
+ "0x0000000003e4d4f4",
+ "0x000000000328ca5b",
+ "0x00000000006c6e57",
+ "0x000000000328f9d1",
+ "0x0000000003bb8d9d",
+ "0x00000000020cf386",
+ "0x00000000023f8798",
+ "0x0000000003bd5ef9",
+ "0x0000000002394b5c",
+ "0x00000000009ca9b9",
+ "0x0000000003839a02",
+ "0x00000000005a28b7",
+ "0x00000000017e42fa",
+ "0x0000000002f634ae",
+ "0x0000000003bf3ba9",
+ "0x0000000001569bc9",
+ "0x000000000081be58",
+ "0x0000000001b1f55d",
+ "0x0000000001135a52",
+ "0x0000000002570d0d",
+ "0x0000000003516822",
+ "0x00000000027409c1",
+ "0x0000000002114a11",
+ "0x00000000025cd71c",
+ "0x0000000001625703",
+ "0x000000000059500d",
+ "0x00000000030e5861",
+ "0x0000000003e4a096",
+ "0x0000000000523e6d",
+ "0x00000000038275ea",
+ "0x0000000001c0840c",
+ "0x0000000003b8d60d",
+ "0x000000000308a30a",
+ "0x0000000001e5245d",
+ "0x0000000000b9c0c2",
+ "0x0000000000a73301",
+ "0x0000000002df5970",
+ "0x00000000030fd3cb",
+ "0x00000000039367be",
+ "0x0000000002648398",
+ "0x00000000021a3217",
+ "0x00000000005d0c01",
+ "0x000000000254b037",
+ "0x00000000017e9b09",
+ "0x0000000003a8d178",
+ "0x0000000001ec30a9",
+ "0x0000000000be2dd2",
+ "0x0000000002e06a14",
+ "0x0000000001ea3d3f",
+ "0x0000000001f7eb84",
+ "0x0000000000f1cf23",
+ "0x0000000002aa63b0",
+ "0x0000000002b0ee31",
+ "0x0000000001756981",
+ "0x00000000004896ca",
+ "0x0000000001de0619",
+ "0x0000000002150682",
+ "0x000000000255b9de",
+ "0x00000000010073c3",
+ "0x000000000372db58",
+ "0x0000000000d68963",
+ "0x00000000001dc1f0",
+ "0x0000000002d32f23",
+ "0x00000000022ee5d4",
+ "0x00000000016ff40e",
+ "0x0000000001e34f41",
+ "0x0000000002256106",
+ "0x000000000353e465",
+ "0x0000000002d2105e",
+ "0x0000000002f177ac",
+ "0x0000000003ab603a",
+ "0x00000000032d1b43",
+ "0x0000000001d74daa",
+ "0x00000000021b2ea8",
+ "0x000000000393eca0",
+ "0x0000000002a76aa9",
+ "0x000000000145b702",
+ "0x00000000033f9ee2",
+ "0x000000000081e68e",
+ "0x000000000024ee0d",
+ "0x0000000001b17ed7",
+ "0x0000000002db9129",
+ "0x000000000086f025",
+ "0x000000000263ce19",
+ "0x0000000003a3e24b",
+ "0x0000000001f2acd0",
+ "0x00000000002b5207",
+ "0x0000000002f1ad93",
+ "0x00000000017118b3",
+ "0x00000000007ea27c",
+ "0x000000000069daa5",
+ "0x0000000001929aa2",
+ "0x00000000026a4851",
+ "0x0000000003919251",
+ "0x000000000240aeb0",
+ "0x0000000000be857a",
+ "0x000000000132fd53",
+ "0x0000000000c89059",
+ "0x0000000000d4d697",
+ "0x0000000003dc75e8",
+ "0x0000000001248506",
+ "0x0000000000e771bd",
+ "0x000000000012d8ce",
+ "0x0000000001e71460",
+ "0x0000000002860132",
+ "0x00000000023b0a2e",
+ "0x00000000028790bf",
+ "0x0000000002900a1a",
+ "0x0000000001779489",
+ "0x0000000001e3d1aa",
+ "0x0000000002f56f1e",
+ "0x0000000002416d36",
+ "0x0000000001617fc4",
+ "0x0000000003036e3b",
+ "0x0000000002bca842",
+ "0x0000000003b6ae1d",
+ "0x0000000001e2aa65",
+ "0x0000000003b93b76",
+ "0x0000000002bbd18e",
+ "0x00000000037b24c3",
+ "0x0000000001671217",
+ "0x00000000004caf07",
+ "0x000000000281261e",
+ "0x00000000021fa546",
+ "0x0000000001db235b",
+ "0x000000000104aabb",
+ "0x0000000003354ef4",
+ "0x0000000002eacd4a",
+ "0x000000000177432e",
+ "0x0000000002746739",
+ "0x00000000030d8b1f",
+ "0x00000000019cb827",
+ "0x0000000000a196bf",
+ "0x00000000007611df",
+ "0x0000000003699f89",
+ "0x00000000035a2796",
+ "0x0000000001d94951",
+ "0x0000000001f589c2",
+ "0x000000000375ed40",
+ "0x0000000001e69c3d",
+ "0x0000000000d96ee3",
+ "0x0000000003bd0442",
+ "0x0000000001614687",
+ "0x000000000242e826",
+ "0x00000000014835cd",
+ "0x00000000012a5cd9",
+ "0x00000000028ae06f",
+ "0x000000000126ee9e",
+ "0x0000000003723fc6",
+ "0x0000000000f6f5c0",
+ "0x000000000045f62a",
+ "0x0000000003110979",
+ "0x000000000258fdb6",
+ "0x00000000022023bc",
+ "0x0000000002330d9f",
+ "0x0000000001bdc2e3",
+ "0x0000000001d6e6f6",
+ "0x0000000003d60b4e",
+ "0x00000000006db993",
+ "0x0000000003c6983a",
+ "0x000000000327b0f0",
+ "0x000000000173cdf3",
+ "0x00000000033fecbd",
+ "0x0000000001deee46",
+ "0x0000000000d5668e",
+ "0x0000000003a6e274",
+ "0x000000000153a0ab",
+ "0x0000000002b502a5",
+ "0x0000000002ce2890",
+ "0x00000000013d6e30",
+ "0x00000000018c68f9",
+ "0x0000000003692fdf",
+ "0x00000000010fdbeb",
+ "0x000000000312eb12",
+ "0x00000000011d8bb2",
+ "0x000000000174fc75",
+ "0x0000000001c73db3",
+ "0x00000000019796b0",
+ "0x000000000287e2fb",
+ "0x0000000001d4d03f",
+ "0x0000000002f831b4",
+ "0x00000000039fc919",
+ "0x00000000028427d8",
+ "0x00000000003806ba",
+ "0x000000000332c36f",
+ "0x0000000000da675e",
+ "0x0000000002d6ad53",
+ "0x00000000011ca725",
+ "0x0000000002089baa",
+ "0x00000000023f4196",
+ "0x000000000105d3e8",
+ "0x0000000002a3bf91",
+ "0x0000000001bb7b8e",
+ "0x0000000001149a4c",
+ "0x0000000000b5e642",
+ "0x00000000027dd86f",
+ "0x00000000007c6be7",
+ "0x00000000023c39e2",
+ "0x0000000001ef6725",
+ "0x0000000002672774",
+ "0x000000000085c083",
+ "0x0000000000c4d47a",
+ "0x0000000003a59668",
+ "0x0000000002376a97",
+ "0x0000000000f5b13b",
+ "0x0000000001284427",
+ "0x0000000002d3c297",
+ "0x00000000034bdcb6",
+ "0x00000000025e9cbe",
+ "0x0000000002076df5",
+ "0x0000000003cd404c",
+ "0x0000000002edb68f",
+ "0x0000000003cb9ae5",
+ "0x00000000019ba650",
+ "0x0000000000dc60c3",
+ "0x000000000005dc55",
+ "0x0000000001a22dad",
+ "0x000000000036abc6",
+ "0x000000000074b13b",
+ "0x00000000022d3159",
+ "0x0000000002b31a80",
+ "0x00000000027c1427",
+ "0x0000000000ef0031",
+ "0x0000000003d0ce68",
+ "0x00000000010dffb3",
+ "0x00000000012c6bfe",
+ "0x0000000003f49958",
+ "0x00000000030759f9",
+ "0x00000000026264d4",
+ "0x00000000037b81bd",
+ "0x0000000003826150",
+ "0x0000000000142bc2",
+ "0x00000000031d75d3",
+ "0x0000000001b56d9f",
+ "0x0000000003b6800c",
+ "0x0000000000195e32",
+ "0x0000000003c380c0",
+ "0x0000000002000f3f",
+ "0x0000000000f195ad",
+ "0x00000000000b209f",
+ "0x0000000002e8c3ef",
+ "0x0000000001a181a8",
+ "0x00000000009ed739",
+ "0x0000000001ce6ab1",
+ "0x0000000000f2f2db",
+ "0x00000000021fb0fc",
+ "0x0000000000a74f7c",
+ "0x000000000066d16a",
+ "0x0000000001114800",
+ "0x00000000013875d0",
+ "0x0000000002978f46",
+ "0x00000000034b1bc6",
+ "0x000000000396a29d",
+ "0x0000000003f1bf9a",
+ "0x0000000001d42e73",
+ "0x00000000007d6335",
+ "0x0000000002048f8f",
+ "0x0000000003ebbc1b",
+ "0x000000000064ebd5",
+ "0x0000000003e051bb",
+ "0x0000000003be612e",
+ "0x0000000003007f76",
+ "0x000000000051ea8e",
+ "0x0000000002a70833",
+ "0x000000000200e4cc",
+ "0x000000000228c17f",
+ "0x0000000002deca7d",
+ "0x00000000013743da",
+ "0x0000000002a0e28a",
+ "0x0000000002d821e3",
+ "0x0000000000893738",
+ "0x0000000003c8b3b8",
+ "0x0000000002b404e9",
+ "0x0000000002fe58fc",
+ "0x0000000003d3117e",
+ "0x0000000002669440",
+ "0x00000000007b1701",
+ "0x00000000007217f9",
+ "0x000000000144d988",
+ "0x0000000001bf6ec5",
+ "0x000000000267953c",
+ "0x0000000001f144da",
+ "0x000000000224ad02",
+ "0x00000000025ecb43",
+ "0x0000000001ac7992",
+ "0x0000000001ffcbe6",
+ "0x0000000002d78e4b",
+ "0x0000000003206624",
+ "0x0000000003d941db",
+ "0x0000000002c27e59",
+ "0x0000000000b98609",
+ "0x00000000026667eb",
+ "0x0000000000d013a0",
+ "0x00000000039540d4",
+ "0x0000000000c03b9c",
+ "0x00000000018def01",
+ "0x00000000015cba11",
+ "0x0000000000800ba2",
+ "0x0000000001a81ad4",
+ "0x0000000000ec61e6",
+ "0x0000000000c92680",
+ "0x00000000032f2405",
+ "0x0000000000d3ce4a",
+ "0x000000000157751f",
+ "0x0000000003925cd6",
+ "0x00000000021d2e46",
+ "0x0000000000b01dc6",
+ "0x00000000014d4cd6",
+ "0x0000000000f82822",
+ "0x00000000038099a1",
+ "0x00000000014f1985",
+ "0x00000000021c6cd5",
+ "0x0000000002f193d5",
+ "0x00000000017482ca",
+ "0x000000000200dc4e",
+ "0x000000000157b8d0",
+ "0x0000000001947021",
+ "0x0000000002f27807",
+ "0x000000000355c271",
+ "0x0000000003d78f01",
+ "0x0000000002c2dab1",
+ "0x0000000001804cac",
+ "0x000000000231b3f7",
+ "0x000000000272e78e",
+ "0x0000000002a00972",
+ "0x0000000001ed0526",
+ "0x0000000002768fb9",
+ "0x000000000201e795",
+ "0x00000000004f6bf8",
+ "0x0000000000c56328",
+ "0x0000000002b6ff95",
+ "0x00000000034492a9",
+ "0x00000000026168cc",
+ "0x0000000001ee304e",
+ "0x0000000002ee93ae",
+ "0x000000000334e1c8",
+ "0x0000000003c28bf0",
+ "0x0000000000ff9fe2",
+ "0x0000000001c831e7",
+ "0x0000000000d457e0",
+ "0x000000000100ce10",
+ "0x0000000000d88f26",
+ "0x00000000000ab184",
+ "0x0000000000c7928e",
+ "0x0000000002b9dbc0",
+ "0x0000000003113d71",
+ "0x0000000003a36ca3",
+ "0x0000000001f8753b",
+ "0x0000000002fb9f4c",
+ "0x0000000001840d44",
+ "0x000000000049ba5a",
+ "0x00000000009f5f4e",
+ "0x0000000002be022f",
+ "0x0000000000983ee8",
+ "0x0000000003073003",
+ "0x0000000000e5d42f",
+ "0x00000000012754ed",
+ "0x0000000002d84322",
+ "0x0000000002845ebe",
+ "0x000000000159819e",
+ "0x000000000105bcf4",
+ "0x0000000002968ddf",
+ "0x0000000000b672b0",
+ "0x00000000004322fb",
+ "0x0000000001048f6c",
+ "0x0000000001b13eb1",
+ "0x0000000000f7a8c3",
+ "0x0000000001f79be0",
+ "0x0000000001781356",
+ "0x0000000001454de8",
+ "0x00000000028d5cac",
+ "0x000000000247ada8",
+ "0x0000000002c84ada",
+ "0x0000000000450191",
+ "0x000000000318f05d",
+ "0x0000000000528a4b",
+ "0x0000000000cb6181",
+ "0x0000000002f8e7c5",
+ "0x0000000003969330",
+ "0x00000000003b091f",
+ "0x0000000003a730e8",
+ "0x0000000002d2e6d5",
+ "0x000000000098f91e",
+ "0x00000000031ba34e",
+ "0x00000000038d2c61",
+ "0x0000000000ee715a",
+ "0x000000000223a817",
+ "0x00000000026c2b2d",
+ "0x0000000001900e57",
+ "0x0000000001d2ccdc",
+ "0x00000000027db622",
+ "0x000000000206d460",
+ "0x0000000000425c3d",
+ "0x00000000005d08c9",
+ "0x00000000007f5cb1",
+ "0x0000000000cf66ef",
+ "0x0000000002e9b99a",
+ "0x000000000127adaa",
+ "0x0000000001f9b3ca",
+ "0x0000000001c85282",
+ "0x0000000001217c85",
+ "0x000000000305cd8b",
+ "0x000000000134e4a3",
+ "0x0000000003b3f8c3",
+ "0x0000000000d0e389",
+ "0x0000000001b65f8d",
+ "0x0000000000ba73ed",
+ "0x0000000001b556e6",
+ "0x00000000034e64a3",
+ "0x0000000002128ef6",
+ "0x0000000001f6bb78",
+ "0x0000000000fdd584",
+ "0x0000000002c934f5",
+ "0x0000000002d51c96",
+ "0x0000000000b00186",
+ "0x0000000002914684",
+ "0x0000000002cbf441",
+ "0x00000000036327dd",
+ "0x000000000296614c",
+ "0x00000000023123c7",
+ "0x0000000000d3e041",
+ "0x00000000024bdff2",
+ "0x0000000001ea11a3",
+ "0x0000000000ecde80",
+ "0x0000000001feeb89",
+ "0x000000000032cad0",
+ "0x0000000000a87d28",
+ "0x00000000029926c5",
+ "0x000000000372e98d",
+ "0x0000000001a81675",
+ "0x0000000000e0ca7a",
+ "0x0000000000ab6603",
+ "0x0000000000998a68",
+ "0x0000000003c3c145",
+ "0x0000000000c7c6c9",
+ "0x0000000003f6b962",
+ "0x00000000030f9fc4",
+ "0x0000000003fb277a",
+ "0x000000000134aa98",
+ "0x00000000009294ec",
+ "0x0000000002e026f0",
+ "0x000000000186b295",
+ "0x00000000009fe8f7",
+ "0x00000000013d42c7",
+ "0x0000000002807699",
+ "0x0000000000590e43",
+ "0x00000000039d5ea2",
+ "0x0000000003cff1e4",
+ "0x00000000038efc2b",
+ "0x0000000002118037",
+ "0x0000000000857e44",
+ "0x00000000039ad0c6",
+ "0x00000000013d88fe",
+ "0x00000000014604f9",
+ "0x000000000245b3bc",
+ "0x000000000035e950",
+ "0x00000000016ff34b",
+ "0x0000000000b30366",
+ "0x0000000002a07290",
+ "0x0000000002380e3e",
+ "0x0000000001a4d9d7",
+ "0x0000000001e40fb5",
+ "0x0000000000e40634",
+ "0x0000000001e96890",
+ "0x0000000000d8c013",
+ "0x0000000002b69afa",
+ "0x0000000000c67ca6",
+ "0x0000000002c16b40",
+ "0x0000000000d7a3d4",
+ "0x00000000018d0466",
+ "0x0000000000422d77",
+ "0x000000000306b609",
+ "0x0000000003107c70",
+ "0x0000000002d00e39",
+ "0x0000000003acbaf6",
+ "0x00000000025e7e98",
+ "0x00000000005d53ca",
+ "0x0000000001f408d4",
+ "0x00000000030b302c",
+ "0x0000000003bab24a",
+ "0x0000000000090a35",
+ "0x0000000001fa04a2",
+ "0x0000000002a183f4",
+ "0x000000000188af35",
+ "0x0000000002dce453",
+ "0x00000000032e48ba",
+ "0x0000000001cb1cd7",
+ "0x0000000001baf6fe",
+ "0x0000000000112d04",
+ "0x0000000002cb888a",
+ "0x0000000001c5f08d",
+ "0x000000000248f554",
+ "0x00000000004a1332",
+ "0x0000000002e4dac0",
+ "0x0000000000b2022c",
+ "0x00000000006a2526",
+ "0x00000000036d75d2",
+ "0x0000000002dd844d",
+ "0x0000000000ba4c30",
+ "0x00000000039b9c95",
+ "0x000000000363f801",
+ "0x0000000001658945",
+ "0x00000000002199e8",
+ "0x000000000358254c",
+ "0x000000000173d9f6",
+ "0x000000000376efa3",
+ "0x0000000000485518",
+ "0x00000000007ab58a",
+ "0x0000000000dfdaf2",
+ "0x0000000000ce0316",
+ "0x000000000080c3ee",
+ "0x000000000094aeb2",
+ "0x00000000015b8ec5",
+ "0x00000000002ca98e",
+ "0x00000000014d1778",
+ "0x00000000028444bd",
+ "0x0000000001bef807",
+ "0x00000000037d9cd6",
+ "0x00000000006137b4",
+ "0x000000000326faea",
+ "0x0000000002cd5887",
+ "0x0000000001003ac5",
+ "0x0000000003c9ffe6",
+ "0x0000000002de65e5",
+ "0x0000000001764ced",
+ "0x0000000003574101",
+ "0x0000000002892e34",
+ "0x0000000003c72ff6",
+ "0x0000000003aaa105",
+ "0x00000000011b0586",
+ "0x000000000203b090",
+ "0x0000000003854228",
+ "0x0000000001b863b2",
+ "0x00000000024fcfd5",
+ "0x00000000035e73f3",
+ "0x000000000061cd20",
+ "0x0000000000e67f72",
+ "0x0000000001d8763e",
+ "0x000000000066ac36",
+ "0x0000000001918117",
+ "0x0000000001502f32",
+ "0x0000000000d0e598",
+ "0x000000000177719b",
+ "0x0000000000fd81a0",
+ "0x0000000000392220",
+ "0x00000000030a2fa0",
+ "0x0000000003025c65",
+ "0x000000000011dc02",
+ "0x0000000001ff2582",
+ "0x0000000001831941",
+ "0x0000000001756de9",
+ "0x00000000035bcacf",
+ "0x000000000226e565",
+ "0x000000000236157c",
+ "0x00000000002304a5",
+ "0x0000000003a610ae",
+ "0x0000000003f2f898",
+ "0x0000000003bc6ee3",
+ "0x00000000037a4c11",
+ "0x0000000002da0624",
+ "0x0000000002cc794d",
+ "0x00000000035f0d84",
+ "0x00000000034fadaa",
+ "0x00000000033b2e55",
+ "0x0000000000bcc9d0",
+ "0x0000000002069ef1",
+ "0x00000000012d9d02",
+ "0x0000000003182ee6",
+ "0x0000000003d9ebf6",
+ "0x0000000001b5775c",
+ "0x00000000015d24e0",
+ "0x0000000003b01af5",
+ "0x00000000039b383b",
+ "0x0000000002e7beab",
+ "0x000000000097c716",
+ "0x00000000029a31ba",
+ "0x00000000032074e5",
+ "0x00000000016d3003",
+ "0x0000000002ba2e3a",
+ "0x0000000000452319",
+ "0x0000000002fd95e2",
+ "0x0000000003871021",
+ "0x0000000003ba76ed",
+ "0x0000000001e828cf",
+ "0x000000000162ceb3",
+ "0x0000000000f04aee",
+ "0x00000000014d58e3",
+ "0x00000000009aa727",
+ "0x0000000003e05657",
+ "0x00000000004263e6",
+ "0x0000000000374e7f",
+ "0x000000000342ccc1",
+ "0x00000000035bf793",
+ "0x0000000003962d32",
+ "0x0000000003040bbd",
+ "0x000000000373bab9",
+ "0x0000000003a9dc82",
+ "0x0000000002aab611",
+ "0x00000000012b109a",
+ "0x0000000001f0ca8a",
+ "0x0000000000e43f0f",
+ "0x00000000013ae823",
+ "0x00000000021784ce",
+ "0x0000000003696b19",
+ "0x000000000070e45e",
+ "0x0000000002c7efd1",
+ "0x00000000002dad7a",
+ "0x0000000000004dea",
+ "0x00000000031a586d",
+ "0x00000000001198ea",
+ "0x0000000001123ee4",
+ "0x0000000001b89066",
+ "0x000000000288c027",
+ "0x0000000001c3eee2",
+ "0x00000000005863f7",
+ "0x00000000010d9413",
+ "0x000000000301f55b",
+ "0x0000000000c6e07a",
+ "0x0000000002eb969c",
+ "0x00000000035c7a6c",
+ "0x0000000003ec04d0",
+ "0x0000000002b859bd",
+ "0x0000000003a2ba75",
+ "0x000000000043d072",
+ "0x0000000003e1c975",
+ "0x0000000003c3f3c3",
+ "0x0000000002af6454",
+ "0x000000000112940f",
+ "0x0000000002bb943c",
+ "0x0000000001db3c7f",
+ "0x00000000036e46da",
+ "0x0000000003f03b15",
+ "0x0000000003068114",
+ "0x00000000016da1c4",
+ "0x0000000002b82651",
+ "0x0000000002b1cee0",
+ "0x0000000000cefa25",
+ "0x000000000006d069",
+ "0x000000000320186d",
+ "0x0000000001881eee",
+ "0x0000000000d48e11",
+ "0x0000000001e02cbe",
+ "0x0000000003791680",
+ "0x00000000017de88f",
+ "0x0000000002928a5b",
+ "0x0000000001779dd3",
+ "0x0000000001cf4d51",
+ "0x0000000001204303",
+ "0x0000000002f5757c",
+ "0x00000000037425af",
+ "0x00000000001595e9",
+ "0x000000000033786d",
+ "0x000000000303137f",
+ "0x00000000033c2ef8",
+ "0x0000000001a67ef4",
+ "0x00000000020ac40f",
+ "0x0000000001788f66",
+ "0x000000000053a753",
+ "0x0000000003f57ec4",
+ "0x0000000001df1394",
+ "0x0000000003fc589e",
+ "0x00000000012b793f",
+ "0x0000000000f4c30a",
+ "0x0000000003e5daf4",
+ "0x0000000001f95f05",
+ "0x0000000000fa79fe",
+ "0x0000000003e8d1e0",
+ "0x000000000153e68e",
+ "0x0000000003320ca6",
+ "0x00000000015089e0",
+ "0x0000000001eecb16",
+ "0x0000000002cb4ce3",
+ "0x0000000000367600",
+ "0x0000000002982c80",
+ "0x0000000003088465",
+ "0x0000000001312a93",
+ "0x0000000000c9c00a",
+ "0x0000000003ba4eee",
+ "0x0000000000b3254e",
+ "0x00000000027b3ca3",
+ "0x00000000028b9306",
+ "0x00000000017a7ef9",
+ "0x0000000002bce652",
+ "0x0000000000ef1409",
+ "0x0000000000e30b3f",
+ "0x00000000016d5d81",
+ "0x0000000001a9c37a",
+ "0x00000000011c96c3",
+ "0x00000000001d09c4",
+ "0x000000000041905b",
+ "0x0000000000fb0039",
+ "0x0000000002bfa1f9",
+ "0x0000000002c4c30e",
+ "0x000000000362b3c9",
+ "0x0000000001b8d070",
+ "0x000000000348953d",
+ "0x0000000000968f3d",
+ "0x0000000003e6f13d",
+ "0x0000000002fa6392",
+ "0x0000000000bd8370",
+ "0x00000000000954a4",
+ "0x00000000006a6cb7",
+ "0x0000000000f2f8ee",
+ "0x000000000229f3b5",
+ "0x0000000003138ff6",
+ "0x0000000002a1eae2",
+ "0x00000000021d7e4e",
+ "0x0000000001874a84",
+ "0x0000000003a8fbff",
+ "0x0000000000152c37",
+ "0x000000000267225b",
+ "0x00000000014abb85",
+ "0x0000000002c3a487",
+ "0x000000000154e1db",
+ "0x00000000001983ff",
+ "0x0000000001f78903",
+ "0x00000000001f77ea",
+ "0x0000000002d5bcae",
+ "0x000000000010309a",
+ "0x00000000009acc45",
+ "0x0000000002576dcd",
+ "0x0000000000ee7473",
+ "0x000000000226f032",
+ "0x0000000003c84f7d",
+ "0x0000000003b9c0ce",
+ "0x00000000016a64a6",
+ "0x0000000003344ce0",
+ "0x00000000009c8a56",
+ "0x00000000036041e7",
+ "0x0000000002788862",
+ "0x00000000011a4958",
+ "0x000000000243bac0",
+ "0x0000000000bb931b",
+ "0x0000000002ea06d7",
+ "0x00000000026828c9",
+ "0x0000000001bfc2b7",
+ "0x000000000051f086",
+ "0x0000000003ecabef",
+ "0x000000000371ac5c",
+ "0x00000000002d2fee",
+ "0x0000000003256668",
+ "0x0000000001d303e3",
+ "0x00000000021bb2a9",
+ "0x0000000001eff8e7",
+ "0x0000000000d2f77c",
+ "0x0000000003eca965",
+ "0x0000000003ba7a42",
+ "0x0000000002770044",
+ "0x0000000000652de9",
+ "0x00000000024b7828",
+ "0x0000000003225df1",
+ "0x0000000001d385ab",
+ "0x0000000001a4dd43",
+ "0x0000000003cc2622",
+ "0x0000000003962049",
+ "0x00000000035ede17",
+ "0x00000000004af169",
+ "0x00000000019f1c51",
+ "0x00000000000c1366",
+ "0x00000000022bb187",
+ "0x00000000014e1f45",
+ "0x00000000000c0832",
+ "0x000000000135344e",
+ "0x000000000233ebcd",
+ "0x0000000001a4bb34",
+ "0x0000000003124272",
+ "0x0000000003f0ffb2",
+ "0x00000000023c9873",
+ "0x000000000003a5fe",
+ "0x0000000002c042e5",
+ "0x0000000001855624",
+ "0x00000000003c5066",
+ "0x0000000000f20e3c",
+ "0x000000000384c93e",
+ "0x0000000002438a3e",
+ "0x0000000000133352",
+ "0x0000000000587aab",
+ "0x0000000000fb924a",
+ "0x0000000001ab5811",
+ "0x0000000002fc4eef",
+ "0x00000000011d3f52",
+ "0x00000000003049fe",
+ "0x00000000020a28ca",
+ "0x0000000000ca32a4",
+ "0x0000000001f15779",
+ "0x0000000003e39af3",
+ "0x000000000091852a",
+ "0x0000000001825087",
+ "0x0000000002034fa1",
+ "0x0000000000cfe43a",
+ "0x0000000002700bba",
+ "0x00000000023e0db9",
+ "0x000000000346ef6a",
+ "0x000000000210e1e9",
+ "0x000000000331406c",
+ "0x0000000002a29c3e",
+ "0x0000000002b1d3cf",
+ "0x000000000351af24",
+ "0x0000000000482c20",
+ "0x00000000016aafcb",
+ "0x00000000004f0217",
+ "0x0000000001a6589a",
+ "0x0000000002d2cfa9",
+ "0x0000000001c92028",
+ "0x0000000000744991",
+ "0x0000000002f1c80f",
+ "0x000000000321fa7e",
+ "0x00000000031bf2c7",
+ "0x00000000015b52c8",
+ "0x0000000003fd6e43",
+ "0x0000000000dffc0c",
+ "0x0000000002af5336",
+ "0x000000000107353e",
+ "0x000000000332aff5",
+ "0x0000000000e10003",
+ "0x0000000000530f8f",
+ "0x0000000003c37367",
+ "0x00000000033ee897",
+ "0x0000000002ce2fba",
+ "0x000000000349cfd5",
+ "0x00000000034e523a",
+ "0x0000000000e016b2",
+ "0x0000000000ed6b84",
+ "0x0000000000fbee72",
+ "0x0000000002e5dabd",
+ "0x00000000021ab1a5",
+ "0x00000000022199b9",
+ "0x0000000000e0afd7",
+ "0x00000000002c6687",
+ "0x00000000026b75e1",
+ "0x00000000036453a4",
+ "0x00000000009e7f21",
+ "0x0000000003cbb968",
+ "0x0000000002ca3362",
+ "0x0000000000cf4bc7",
+ "0x0000000001bae9b0",
+ "0x0000000000974093",
+ "0x000000000056582c",
+ "0x00000000012483a0",
+ "0x0000000000df9bef",
+ "0x000000000317733d",
+ "0x0000000003a6b795",
+ "0x0000000002ab32cb",
+ "0x0000000000642825",
+ "0x0000000002788cb6",
+ "0x0000000000435004",
+ "0x000000000305d9e7",
+ "0x0000000003e730cc",
+ "0x0000000002edd528",
+ "0x0000000000b5624b",
+ "0x00000000003eabbb",
+ "0x00000000018464ee",
+ "0x0000000002521fc0",
+ "0x0000000002e99d72",
+ "0x00000000016401f5",
+ "0x00000000023262ef",
+ "0x0000000001490c82",
+ "0x00000000005cd02b",
+ "0x0000000001e652d3",
+ "0x0000000001ebc18e",
+ "0x00000000016b1ebe",
+ "0x0000000003d6f348",
+ "0x0000000003f72f91",
+ "0x000000000025487b",
+ "0x000000000224be73",
+ "0x0000000003a9029d",
+ "0x0000000003fe3d3f",
+ "0x0000000001cc2afa",
+ "0x000000000185bbac",
+ "0x0000000000318ed1",
+ "0x0000000001a2606d",
+ "0x0000000000c1147c",
+ "0x0000000002a863a9",
+ "0x0000000001d936df",
+ "0x00000000028aed3d",
+ "0x0000000003916473",
+ "0x0000000000463835",
+ "0x00000000002845f5",
+ "0x0000000001ff5fe3",
+ "0x00000000036960d2",
+ "0x000000000033fb0c",
+ "0x0000000002385993",
+ "0x00000000019a8ce3",
+ "0x0000000002c76580",
+ "0x0000000002906bb0",
+ "0x00000000035f65f3",
+ "0x0000000000784386",
+ "0x0000000003ae74e5",
+ "0x000000000274b1a3",
+ "0x0000000003c33a46",
+ "0x00000000022ee13d",
+ "0x000000000199a1f6",
+ "0x0000000002292a77",
+ "0x000000000333e015",
+ "0x00000000031a8ef0",
+ "0x0000000000a6f585",
+ "0x000000000253b9e3",
+ "0x0000000003345632",
+ "0x00000000020ef824",
+ "0x0000000003d71d93",
+ "0x00000000022b3a85",
+ "0x00000000022c6126",
+ "0x000000000368901f",
+ "0x000000000264db1b",
+ "0x00000000011fa389",
+ "0x0000000003ea06e7",
+ "0x0000000002a5b43c",
+ "0x00000000005278da",
+ "0x000000000073d14d",
+ "0x00000000007edfb7",
+ "0x0000000000b1e292",
+ "0x0000000000b656b2",
+ "0x0000000003a90f75",
+ "0x000000000016b060",
+ "0x0000000003d14473",
+ "0x00000000028e8cc0",
+ "0x0000000001dbdcb4",
+ "0x000000000396c2a1",
+ "0x0000000000c1e22c",
+ "0x0000000002ef311b",
+ "0x000000000026cad4",
+ "0x0000000003813c93",
+ "0x00000000021ae26e",
+ "0x00000000031a2d2c",
+ "0x0000000003b4114a",
+ "0x0000000002553fbc",
+ "0x00000000027b11c8",
+ "0x0000000002ea8f0d",
+ "0x000000000266adf3",
+ "0x0000000000ccf97d",
+ "0x0000000003c61e00",
+ "0x00000000021709ca",
+ "0x000000000006a238",
+ "0x000000000081d77a",
+ "0x0000000000bd2a57",
+ "0x000000000213c1df",
+ "0x0000000003010d32",
+ "0x0000000002a7f94f",
+ "0x0000000003620c18",
+ "0x00000000027a2b5b",
+ "0x00000000015d00cb",
+ "0x00000000039773a5",
+ "0x000000000302ef2e",
+ "0x0000000003c92d83",
+ "0x000000000234b5d7",
+ "0x000000000371f9c8",
+ "0x0000000002e53116",
+ "0x00000000031f72d3",
+ "0x0000000000a0d83c",
+ "0x0000000002035854",
+ "0x0000000003172e5c",
+ "0x0000000001f0a546",
+ "0x0000000000878da7",
+ "0x0000000000e4b2eb",
+ "0x00000000010b984f",
+ "0x00000000000e4d0f",
+ "0x000000000352956a",
+ "0x0000000002ed8678",
+ "0x0000000003c5f357",
+ "0x00000000028c453a",
+ "0x000000000274b1f3",
+ "0x0000000002d590cd",
+ "0x0000000003d46977",
+ "0x0000000003f2c5a1",
+ "0x0000000000fe7ad3",
+ "0x0000000002350076",
+ "0x00000000005267ac",
+ "0x00000000024ce1ec",
+ "0x0000000001480df2",
+ "0x00000000022dc387",
+ "0x00000000017aab32",
+ "0x00000000013ccad5",
+ "0x00000000032d4c1c",
+ "0x0000000002672892",
+ "0x00000000021c75dc",
+ "0x0000000000d97192",
+ "0x00000000004abbfc",
+ "0x0000000002f817c3",
+ "0x00000000007541b0",
+ "0x0000000003ac58f9",
+ "0x000000000207e944",
+ "0x000000000106dfa0",
+ "0x000000000036204e",
+ "0x00000000016cb997",
+ "0x000000000330911f",
+ "0x0000000000a05a9f",
+ "0x0000000001e329a3",
+ "0x0000000003320fcf",
+ "0x00000000013d7a3b",
+ "0x000000000108f18b",
+ "0x0000000001a33371",
+ "0x000000000359160a",
+ "0x0000000002100593",
+ "0x000000000297c53a",
+ "0x00000000017937de",
+ "0x000000000017cb15",
+ "0x0000000001297a46",
+ "0x00000000037a9a18",
+ "0x00000000024b9f9a",
+ "0x0000000003ca270f",
+ "0x000000000020f57f",
+ "0x0000000000fe582d",
+ "0x00000000038f81b4",
+ "0x0000000000e87317",
+ "0x000000000237d405",
+ "0x0000000003fb4a42"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proofssss.json b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proofssss.json
new file mode 100755
index 000000000..54ed0b726
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/proofssss.json
@@ -0,0 +1,15 @@
+{
+ "id" : "User",
+ "time" : "2024-11-15 15:05:26",
+ "proof" : {
+ "p" : [ "0x0000000001d97a06", "0x0000000001d31661", "0x0000000002f77e28", "0x00000000032e1860", "0x000000000062e8c8", "0x0000000003aacd10" ],
+ "a" : [ "0x00000000017fc587", "0x0000000001edd70e" ],
+ "z" : [ "0x00000000c7220131", "0x000000004a6db725", "0x0000000030a6b595", "0x000000008d6671e9", "0x00000000002a7630", "0x000000000014ac88", "0x000000000010330d", "0x000000000236a3dd", "0x00000000331833eb", "0x00000000170f9f3b", "0x000000009e255b04", "0x00000000c055781c", "0x00000000002c311f", "0x000000000008c527" ],
+ "emb" : [ "0x0000000003696c8c", "0x0000000001d51adb" ],
+ "cmt" : {
+ "cmt_eq_new_json" : [ "0x0000000002e51c3e", "0x0000000001d99233" ],
+ "cmt_eq_old_json" : [ "0x00000000030bed6b", "0x0000000001514a66" ],
+ "cmt_mult_json" : [ "0x00000000035f8936", "0x00000000025663b5" ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/prove.js b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/prove.js
new file mode 100755
index 000000000..a3a96a6ba
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/prove.js
@@ -0,0 +1,292 @@
+/**
+ * File Name: prove.js
+ * Project Name: ZeroID
+ * Author(s): Norton
+ * Creation Date: 2024-02-01
+ * Copyright: Copyright (C) 2024 Example Corporation. All rights reserved.
+ * License: This code is distributed under the MIT license.
+ * Modification History:
+ * - 2024-02-02: Initial version by Norton.
+ * - 2024-02-10: Minor bug fixes by Norton.
+ * Description: This is an implementation of Pedersen's Commitment in the multiplicative group, written
+ * in JavaScript language.
+ * Contact Information: [None]
+ */
+
+import * as fs from 'fs'
+import CryptoJS from 'crypto-js'
+import { Pedersen } from './Pedersen.js'
+
+function InttoHex(Value, length) {
+ // 转换为十六进制,不包括'0x'前缀
+ let hex = Value.toString(16);
+ // 计算需要填充的零的数量
+ const padding = length - hex.length;
+ // 如果需要,填充零
+ if (padding > 0) {
+ hex = '0x' + '0'.repeat(padding) + hex;
+ }
+ else {
+ hex = '0x' + hex;
+ }
+ return hex;
+}
+
+// 生物特征编码的维度
+const dim = 2
+// 承诺的生成元
+const g = 56544564n
+const h = 237684576n
+
+// 读取用户身份信息
+try {
+ // 同步读取文件内容
+ const data = fs.readFileSync('identity.json', 'utf8')
+ // 将字符串转换为JSON对象
+ var json = JSON.parse(data)
+} catch (err) {
+ console.error("An error occurred while reading the JSON File.", err)
+}
+// 获取用户身份信息
+const id = json.id
+let emb_old = new Array(dim)
+let rand_old = new Array(dim)
+let cmt_old = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_old[i] = BigInt(json.m[i])
+ rand_old[i] = BigInt(json.r[i])
+ cmt_old[i] = BigInt(json.cmt[i])
+ //console.log(emb_old[i], rand_old[i], cmt_old[i])
+}
+
+
+// 打印数组
+console.log("emb_old: " + emb_old.toString());
+console.log("old_cmt: " + cmt_old.toString());
+console.log("rand_old: " + rand_old.toString());
+
+
+
+console.time('time')
+// 随机生成认证生物特征向量
+const code = new Pedersen(g, h)
+let emb_new = new Array(dim)
+let rand_new = new Array(dim)
+let cmt_new = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_new[i] = BigInt(Math.floor(Math.random() * 1000))
+ rand_new[i] = BigInt(Math.floor(Math.random() * 10000))
+ cmt_new[i] = code.Commitment(emb_new[i], rand_new[i])
+ //console.log(emb_new[i], rand_new[i], cmt_new[i])
+}
+
+
+// 打印数组
+console.log("emb_new: " + JSON.stringify(emb_new));
+console.log("rand_new: " + JSON.stringify(rand_new));
+console.log("cmt_new: " + JSON.stringify(cmt_new));
+
+// 生成前后生物特征元素的平方的承诺
+let emb_eq_old = new Array(dim)
+let emb_eq_new = new Array(dim)
+let rand_eq_old = new Array(dim)
+let rand_eq_new = new Array(dim)
+let cmt_eq_old = new Array(dim)
+let cmt_eq_new = new Array(dim)
+let emb_mult = new Array(dim)
+let rand_mult = new Array(dim)
+let cmt_mult = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ emb_eq_old[i] = emb_old[i] * emb_old[i]
+ emb_eq_new[i] = emb_new[i] * emb_new[i]
+ emb_mult[i] = emb_old[i] * emb_new[i]
+ rand_eq_old[i] = emb_old[i] * rand_old[i] + BigInt(Math.floor(Math.random() * 1000000))
+ rand_eq_new[i] = emb_new[i] * rand_new[i] + BigInt(Math.floor(Math.random() * 1000000))
+ rand_mult[i] = emb_new[i] * rand_old[i] + BigInt(Math.floor(Math.random() * 1000))
+ //console.log(emb_eq_old[i], emb_eq_new[i], emb_mult[i], rand_eq_old[i], rand_eq_new[i], rand_mult[i])
+ cmt_eq_old[i] = code.Commitment(emb_eq_old[i], rand_eq_old[i])
+ cmt_eq_new[i] = code.Commitment(emb_eq_new[i], rand_eq_new[i])
+ cmt_mult[i] = code.Commitment(emb_mult[i], rand_mult[i])
+ //console.log(cmt_eq_old[i], cmt_eq_new[i])
+}
+
+
+// 打印所有数组的内容
+console.log("emb_eq_old: " + JSON.stringify(emb_eq_old));
+console.log("emb_eq_new: " + JSON.stringify(emb_eq_new));
+console.log("emb_mult: " + JSON.stringify(emb_mult));
+console.log("rand_eq_old: " + JSON.stringify(rand_eq_old));
+console.log("rand_eq_new: " + JSON.stringify(rand_eq_new));
+console.log("rand_mult: " + JSON.stringify(rand_mult));
+console.log("cmt_eq_old: " + JSON.stringify(cmt_eq_old));
+console.log("cmt_eq_new: " + JSON.stringify(cmt_eq_new));
+console.log("cmt_mult: " + JSON.stringify(cmt_mult));
+
+// 构造乘法同态的验证因子
+const b1 = BigInt(Math.floor(Math.random() * 10000))
+const b2 = BigInt(Math.floor(Math.random() * 10000))
+const b3 = BigInt(Math.floor(Math.random() * 10000))
+const b4 = BigInt(Math.floor(Math.random() * 10000))
+const b5 = BigInt(Math.floor(Math.random() * 10000))
+const b6 = BigInt(Math.floor(Math.random() * 10000))
+const b7 = BigInt(Math.floor(Math.random() * 10000))
+const a1 = code.Commitment(b1, b2)
+const a2 = code.Commitment(b3, b4)
+
+
+
+// 打印验证因子
+console.log("b1: ", b1);
+console.log("b2: ", b2);
+console.log("b3: ", b3);
+console.log("b4: ", b4);
+console.log("b5: ", b5);
+console.log("b6: ", b6);
+console.log("b7: ", b7);
+console.log("a1: ", a1);
+console.log("a2: ", a2);
+
+let p1 = new Array(dim)
+let p2 = new Array(dim)
+let p3 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ let temp_eq_old = new Pedersen(cmt_old[i], h)
+ p1[i] = temp_eq_old.Commitment(b1, b5)
+ let temp_eq_new = new Pedersen(cmt_new[i], h)
+ p2[i] = temp_eq_new.Commitment(b3, b6)
+ p3[i] = temp_eq_old.Commitment(b3, b7)
+ //console.log(p1[i], p2[i], p3[i])
+}
+
+
+// 打印数组
+console.log("p1: " + JSON.stringify(p1));
+console.log("p2: " + JSON.stringify(p2));
+console.log("p3: " + JSON.stringify(p3));
+
+// 生成挑战因子
+let cmt_old_json = Array(dim)
+let cmt_new_json = Array(dim)
+let cmt_eq_old_json = Array(dim)
+let cmt_eq_new_json = Array(dim)
+let cmt_mult_json = Array(dim)
+for(let i = 0; i < dim; i++) {
+ cmt_old_json[i] = InttoHex(cmt_old[i], 16)
+ cmt_new_json[i] = InttoHex(cmt_new[i], 16)
+ cmt_eq_old_json[i] = InttoHex(cmt_eq_old[i], 16)
+ cmt_eq_new_json[i] = InttoHex(cmt_eq_new[i], 16)
+ cmt_mult_json[i] = InttoHex(cmt_mult[i], 16)
+ //console.log(cmt_old_json[i], cmt_new_json[i], cmt_eq_old_json[i], cmt_eq_new_json[i], cmt_mult_json[i])
+}
+
+// 打印数组
+console.log("cmt_old_json: " + JSON.stringify(cmt_old_json));
+console.log("cmt_new_json: " + JSON.stringify(cmt_new_json));
+console.log("cmt_eq_old_json: " + JSON.stringify(cmt_eq_old_json));
+console.log("cmt_eq_new_json: " + JSON.stringify(cmt_eq_new_json));
+console.log("cmt_mult_json: " + JSON.stringify(cmt_mult_json));
+
+var t = new Date().toLocaleString();
+const challenge = {cmt_old_json, cmt_new_json, cmt_eq_old_json, cmt_eq_new_json, cmt_mult_json, id, t}
+// e -> hash
+console.log("challenge:"+challenge)
+const test = JSON.stringify(challenge)
+const hash = CryptoJS.SHA256(test.toString()).toString()
+const e = BigInt('0x' + hash) % 5000n
+console.log("e:"+e)
+// 生成其余辅助证明因子
+let z1 = new Array(dim)
+let z2 = new Array(dim)
+let z3 = new Array(dim)
+let z4 = new Array(dim)
+let z5 = new Array(dim)
+let z6 = new Array(dim)
+let z7 = new Array(dim)
+for(let i = 0; i < dim; i++) {
+ z1[i] = b1 + e * emb_old[i]
+ z2[i] = b2 + e * rand_old[i]
+ z3[i] = b3 + e * emb_new[i]
+ z4[i] = b4 + e * rand_new[i]
+ z5[i] = b5 + e * (rand_eq_old[i] - emb_old[i] * rand_old[i])
+ z6[i] = b6 + e * (rand_eq_new[i] - emb_new[i] * rand_new[i])
+ z7[i] = b7 + e * (rand_mult[i] - emb_new[i] * rand_old[i])
+ //console.log(z1[i], z2[i], z3[i], z4[i], z5[i], z6[i], z7[i])
+}
+
+
+// 打印数组
+console.log("z1: " + JSON.stringify(z1));
+console.log("z2: " + JSON.stringify(z2));
+console.log("z3: " + JSON.stringify(z3));
+console.log("z4: " + JSON.stringify(z4));
+console.log("z5: " + JSON.stringify(z5));
+console.log("z6: " + JSON.stringify(z6));
+console.log("z7: " + JSON.stringify(z7));
+
+// 计算生物特征编码间的欧式距离
+let emb_dist = 0n
+let rand_dist = 0n
+for(let i = 0; i < dim; i++) {
+ emb_dist = emb_dist + (emb_new[i] - emb_old[i]) * (emb_new[i] - emb_old[i])
+ rand_dist = rand_dist + (rand_eq_new[i] + rand_eq_old[i] - 2n * rand_mult[i])
+}
+
+// 打印变量
+console.log("emb_dist: ", emb_dist);
+console.log("rand_dist: ", rand_dist);
+
+//console.log(emb_dist, rand_dist)
+const cmt_dist = code.Commitment(emb_dist, rand_dist)
+//console.log(t);
+// 数据打包
+let a_json = new Array(2)
+a_json[0] = InttoHex(a1, 16)
+a_json[1] = InttoHex(a2, 16)
+
+// 打印数组
+console.log("a_json: " + JSON.stringify(a_json));
+
+let z_json = new Array(dim * 7)
+let p_json = new Array(dim * 3)
+for(let i = 0; i < dim; i++) {
+ z_json[i] = InttoHex(z1[i], 16)
+ z_json[dim + i] = InttoHex(z2[i], 16)
+ z_json[2 * dim + i] = InttoHex(z3[i], 16)
+ z_json[3 * dim + i] = InttoHex(z4[i], 16)
+ z_json[4 * dim + i] = InttoHex(z5[i], 16)
+ z_json[5 * dim + i] = InttoHex(z6[i], 16)
+ z_json[6 * dim + i] = InttoHex(z7[i], 16)
+ p_json[i] = InttoHex(p1[i], 16)
+ p_json[dim + i] = InttoHex(p2[i], 16)
+ p_json[2 * dim + i] = InttoHex(p3[i], 16)
+}
+
+// 打印数组
+console.log("z_json: " + JSON.stringify(z_json));
+console.log("p_json: " + JSON.stringify(p_json));
+
+//console.log(a_json, z_json, p_json)
+//console.log(cmt_dist)
+var proof = {
+ "id": id,
+ "time": t,
+ "proof": {
+ "emb": cmt_new_json,
+ "cmt": {cmt_eq_old_json, cmt_eq_new_json, cmt_mult_json},
+ "a": a_json,
+ "z": z_json,
+ "p": p_json
+ }
+}
+//var json = JSON.stringify(proof)
+//console.log(json)
+const proofString = JSON.stringify(proof, null, 2);
+// 数据存储
+fs.writeFile('proof.json', proofString, 'utf8', (err) => {
+ if (err) {
+ console.log("An error occured while writing JSON Object to File.");
+ return console.log(err);
+ }
+ console.log("Proof file has been saved.");
+ });
+console.timeEnd('time')
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/register.vue b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/register.vue
new file mode 100755
index 000000000..ae5ebc402
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/register.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/META-INF/MANIFEST.MF b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/META-INF/MANIFEST.MF
new file mode 100755
index 000000000..081ea57cd
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/META-INF/MANIFEST.MF
@@ -0,0 +1,3 @@
+Manifest-Version: 1.0
+Main-Class: szu.zhl.test1.Test1Application
+
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/Test1Application.java b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/Test1Application.java
new file mode 100755
index 000000000..57c78bf75
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/Test1Application.java
@@ -0,0 +1,13 @@
+package szu.zhl.test1;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Test1Application {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Test1Application.class, args);
+ }
+
+}
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/configs/WebConfig.java b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/configs/WebConfig.java
new file mode 100755
index 000000000..207a3a5aa
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/configs/WebConfig.java
@@ -0,0 +1,19 @@
+package szu.zhl.test1.configs;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedOrigins("http://localhost:8080")
+ .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
+ .allowedHeaders("*")
+ .allowCredentials(true);
+ }
+}
\ No newline at end of file
diff --git a/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/controller/UserController.java b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/controller/UserController.java
new file mode 100755
index 000000000..b0b56b9d5
--- /dev/null
+++ b/2024-shenzhen-FinTechathon/SpotOn/backend/test1/src/main/java/szu/zhl/test1/controller/UserController.java
@@ -0,0 +1,274 @@
+package szu.zhl.test1.controller;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import szu.zhl.test1.entity.*;
+import szu.zhl.test1.service.UserService;
+import szu.zhl.test1.utils.*;
+
+import java.io.IOException;
+import java.math.BigInteger;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+public class UserController {
+
+ @Autowired
+ private UserService userService;
+ @CrossOrigin(origins = "http://localhost:8080")
+ @PostMapping("/login")
+
+ public ResponseEntity