[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/custom.md",
    "content": "---\nname: Custom issue template\nabout: Describe this issue template's purpose here.\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/workflows/ReleaseAWSS3.yml",
    "content": "# This is a basic workflow to help you get started with Actions\n\nname: ReleaseAWSS3\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@v3\n        with:\n          node-version: '20.x'\n\n      - name: Install Dependencies\n        working-directory: ./darc-docs\n        run: |\n          npm install\n\n      - name: Build\n        working-directory: ./darc-docs\n        run: npm run build\n        env:\n          CI: true\n\n      - name: Configure AWS Credentials\n        uses: aws-actions/configure-aws-credentials@v1\n        with:\n          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n          aws-region: us-east-1\n\n      - name: Deploy static site to S3 bucket\n        working-directory: ./darc-docs\n        run: aws s3 sync ./build s3://darc-website --delete\n"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n.env\ncoverage\ncoverage.json\ntypechain\ntypechain-types\n\n# Hardhat files\ncache\nartifacts\n\n# Docusaurus files\ndarc-docs/.docusaurus\n\n# Idea files\n.idea/\n\n# Darc docs Compiled output\ndarc-docs/build\ndarc-docs/static/api\ndarc-js/dist"
  },
  {
    "path": "LICENSE",
    "content": "Business Source License 1.1\n\nLicense text copyright (c) 2017 MariaDB Corporation Ab, All Rights Reserved.\n\"Business Source License\" is a trademark of MariaDB Corporation Ab.\n\n-----------------------------------------------------------------------------\n\nParameters\n\nLicensor:             DARC Team\n\nLicensed Work:        DARC\n\nAdditional Use Grant: TBA\n\nChange Date:          The earlier of 2038-01-01 or a date specified at\n                      TBA\n\nChange License:       GNU General Public License v3.0 or later\n\n-----------------------------------------------------------------------------\n\nTerms\n\nThe Licensor hereby grants you the right to copy, modify, create derivative\nworks, redistribute, and make non-production use of the Licensed Work. The\nLicensor may make an Additional Use Grant, above, permitting limited\nproduction use.\n\nEffective on the Change Date, or the fourth anniversary of the first publicly\navailable distribution of a specific version of the Licensed Work under this\nLicense, whichever comes first, the Licensor hereby grants you rights under\nthe terms of the Change License, and the rights granted in the paragraph\nabove terminate.\n\nIf your use of the Licensed Work does not comply with the requirements\ncurrently in effect as described in this License, you must purchase a\ncommercial license from the Licensor, its affiliated entities, or authorized\nresellers, or you must refrain from using the Licensed Work.\n\nAll copies of the original and modified Licensed Work, and derivative works\nof the Licensed Work, are subject to this License. This License applies\nseparately for each version of the Licensed Work and the Change Date may vary\nfor each version of the Licensed Work released by Licensor.\n\nYou must conspicuously display this License on each original or modified copy\nof the Licensed Work. If you receive the Licensed Work in original or\nmodified form from a third party, the terms and conditions set forth in this\nLicense apply to your use of that work.\n\nAny use of the Licensed Work in violation of this License will automatically\nterminate your rights under this License for the current and all other\nversions of the Licensed Work.\n\nThis License does not grant you any right in any trademark or logo of\nLicensor or its affiliates (provided that you may use a trademark or logo of\nLicensor as expressly required by this License).\n\nTO THE EXTENT PERMITTED BY APPLICABLE LAW, THE LICENSED WORK IS PROVIDED ON\nAN \"AS IS\" BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS,\nEXPRESS OR IMPLIED, INCLUDING (WITHOUT LIMITATION) WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND\nTITLE.\n\nMariaDB hereby grants you permission to use this License’s text to license\nyour works, and to refer to it using the trademark \"Business Source License\",\nas long as you comply with the Covenants of Licensor below.\n\n-----------------------------------------------------------------------------\n\nCovenants of Licensor\n\nIn consideration of the right to use this License’s text and the \"Business\nSource License\" name and trademark, Licensor covenants to MariaDB, and to all\nother recipients of the licensed work to be provided by Licensor:\n\n1. To specify as the Change License the GPL Version 2.0 or any later version,\n   or a license that is compatible with GPL Version 2.0 or a later version,\n   where \"compatible\" means that software provided under the Change License can\n   be included in a program with software provided under GPL Version 2.0 or a\n   later version. Licensor may specify additional Change Licenses without\n   limitation.\n\n2. To either: (a) specify an additional grant of rights to use that does not\n   impose any additional restriction on the right granted in this License, as\n   the Additional Use Grant; or (b) insert the text \"None\".\n\n3. To specify a Change Date.\n\n4. Not to modify this License in any other way.\n\n-----------------------------------------------------------------------------\n\nNotice\n\nThe Business Source License (this document, or the \"License\") is not an Open\nSource license. However, the Licensed Work will eventually be made available\nunder an Open Source License, as stated in this License."
  },
  {
    "path": "README.md",
    "content": "# Decentralized Autonomous Regulated Company (DARC)\n\nWelcome to the official repository for the Decentralized Autonomous Regulated Company (DARC) project. DARC is a project\nthat aims to create a decentralized autonomous company that is regulated by a plugin system based on commercial laws.\nThe project is currently in the early stages of development and is not yet ready for production use.\n\nEnglish | [简体中文](./README_cn.md) | [日本語](./README_ja.md)\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=project-darc/darc&type=Date)](https://star-history.com/#project-darc/darc&Date)\n\n\n## Join our community\n\nTelegram: [https://t.me/projectdarc](https://t.me/projectdarc)\nDiscord: [https://discord.gg/QzKbTHVgGG](https://discord.gg/QzKbTHVgGG)\n\n## Whitepaper\n\nEnglish: [darc-whitepaper.pdf](https://github.com/Project-DARC/DARC-whitepaper/blob/release/darc-whitepaper.pdf)\n\nChinese(中文版): [darc-whitepaper-cn.pdf](https://github.com/Project-DARC/DARC-whitepaper/blob/release/darc-whitepaper-cn.pdf)\n\n## What is DARC?\n\nDecentralized Autonomous Regulated Company (DARC) is a company virtual machine that can be compiled and deployed to\nEVM-compatible blockchains with following features:\n\n- **Multi-level tokens**, each level token can be used as common stock, preferred stock, convertible bonds, board of\n  directors, product tokens, non-fungible tokens (NFT), with different prices, voting power and dividend power, which\n  are defined by the company's plugin(law) system.\n- **Program** composed of a series of DARC instructions that include managing tokens, dividends, voting, legislation,\n  purchasing, withdrawing cash, and other company operations.\n- **Dividend Mechanism** for distributing dividends to token holders according to certain rules.\n- **Plugin-as-a-Law**.The plugin system serves as the by-law or commercial contract that supervises all operations. All\n  company operations need to be approved by the plugin system or corresponding voting process.\n\n## By-Law Script\n\nBy-law script is a JavaScript-like programming language that is used to define the company's commercial rules and\noperations on DARC. For example:\n\n```javascript\nmint_tokens(   // mint token operation\n    [addr1, addr2, addr3],   // token address\n    [0, 0, 0],   // token class \n    [500, 300, 200]  // number of tokens\n);\n\npay_cash(100000000, 0, 1); // pay 0.1 ETH as purchase\n\ntransfer_tokens(   // transfer token operation\n    [addr1, addr2, addr3],   // token address\n    [0, 0, 0],   // token class \n    [100, 100, 200]  // number of tokens\n);\n\nadd_withdraw_cash(10000000);  // add 0.01 ETH to withdraw balance\n\nwithdraw_cash_to(  // withdraw cash from my account to other address\n    [addr4, addr5],       // withdraw cash to addr4, addr5\n    [10000000, 10000000]  // withdraw amount 0.01 ETH, 0.01 ETH\n);\n\n\n```\n\nAbove By-law Script will be transpiled via code generator and sent to corresponding DARC VM contract. The DARC will\nexecute the program if the plugin system approves. To add plugin and voting rules to the DARC, we can simple compose the\nplugin conditions and voting rules, then send them via operation `add_voting_rule()`, `add_and_enable_plugins()`\nor `add_plugins()`, and they will be deployed and effective immediately if the current plugin system approves the\noperation.\n\nHere is a quick example, assume we need to limit the transfer of tokens by major shareholders (>25%) by asking the board\nof directors for an all-hand vote (assuming 5 tokens in total), and it requires 100% approval (5 out of 5) in 1 hour. We\ncan add a new plugin and corresponding voting rule to the DARC VM contract:\n\n```javascript\nadd_voting_rule(  // add a voting rule (as index 5)\n    [\n        {\n            voting_class: [1], // voting token class: 1, level-1 token owners (board of directors) are required to vote\n            approve_percentage: 99,  // 99% voting power is required to approve\n            voting_duration: 3600,  // voting duration: 1 hour (3600 seconds)\n            execute_duration: 3600,  // pending duration for execution: 1 hour (3600 seconds)\n            is_absolute_majority: true,  // absolute majority is required, not relative majority\n        }\n    ]\n)\n\nadd_and_enable_plugins(   // add and enable plugins (as index 7)\n    [\n        {\n            condition:  // define the condition:\n                (operation == \"transfer_tokens\")   // if operation is transfer_tokens\n                & (operator_total_voting_power_percentage > 25),  // and addr1's voting power > 25%\n            return_type: voting_needed,  // return type: requires a vote\n            return_level: 100,  // priority: 100\n            votingRuleIndex: 5 // voting rule index 5 (ask board of directors to vote and must 100% approve)\n            note: \"100% Approval is needed by board members to transfer tokens by major shareholders (>25%)\"\n            is_before_operation: false,  // check the plugin after the operation is executed in sandbox\n        }\n    ]\n)\n```\n\nAfter above By-Law Script is executed, the DARC VM contract will add a new plugin and voting rule, and the plugin will\nbe effective immediately (if there exists any voting procedure related to `add_voting_rule()`\nand `add_and_enable_plugins()`, the plugin will be effective after the voting process is approved). If the\noperator (`addr1`) tries to transfer tokens to addr2, the plugin will check the condition and return `voting_needed` to\nthe DARC VM contract, and the DARC VM contract will ask the board of directors (level-1 token owners) to vote. If the\nboard of directors approves the operation, the operation will be executed in the sandbox, otherwise the operation will\nbe rejected. For example, if there are 3 voting rules are triggerd, the voting operation will be:\n\n```javascript\nvote([true, true, true])\n```\n\nIf the voting process is approved by the existing voting rules and plugins, the new program will be approved to execute\nin the next execution pending duration (1 hour in this example), and the program owner or any other members can execute\nthe program in the next 1 hour, or the program will be ignored and removed from the pending list.\n\n## \"Plugin-as-a-Law\"\n\nThe law of DARC is defined in below pseudo-code:\n\n```javascript\nif (plugin_condition == true) {\n    plugin_decision = allows / denies / requires a vote\n}\n```\n\nEach plugin contains a condition expression tree and a corresponding decision (return type). When the condition tree is\nevaluated to true while the program is submitted before running, the plugin will make a decision by allows, denies or\nrequires a vote. For example:\n\n### Example 1: Anti-Dilutive shares\n\nAnti-Dilutive shares is a basic mechanism to prevent the company (including DAO and other on-chain \"tokenomics\") from\nissuing too many shares and dilute the ownership of the existing shareholders. In DARC, the company and early-stage\ninvestors can define a law of \"anti-dilutive shares\", and the law can be abolished by certain process.\n\n***Law 1 (Anti-Dilutive Shares): Shareholder X should always holds 10% of the total stock.***\n\n*Design of Plugin: If operation is minting new level-0 tokens, plugin should check the state of token ownerships, X\nshould always keep a minimum total voting power of 10%, as well as dividend power of 10% after executing the operation*\n\nIn By-law script, we can define the plugin with following conditions:\n\n```javascript\n// define X's address\nconst x_addr = \"0x1234567890123456789012345678901234567890\";\n\n// define the plugin\nconst anti_delutive = {\n\n    // define the trigger condition\n    condition:\n        ((operation == \"mint_tokens\")             // if operator is minting new tokens\n            | (operation == \"pay_to_mint_tokens\"))   // or operator is paying to mint new tokens\n        &                                          // and        \n        ((total_voting_power_percentage(x) < 10)    // X's total voting power < 10%\n            | (total_dividend_power_percentage(x) < 10)),   // or X's total dividend power < 10%\n\n    // define the decision: reject the operation\n    return_type: NO,\n\n    // define the priority: 100\n    return_level: 100,\n\n    // check the plugin after the operation is executed in sandbox\n    is_before_operation: false,\n}\n```\n\nSince it checks the state of token ownerships, the plugin should be executed after the operation is executed inside the\nDARC's sandbox. If the plugin's condition is evaluated to true, the plugin will deny the operation after executing in\nthe sandbox, and the operation will be rejected to be executed in the real environment. Otherwise, \"minting new tokens\"\nwill be allowed to execute.\n\nWhen this plugin is added to the DARC, the operator (the author of current program) must mint extra tokens to\naddress `x_addr` to satisfy the **Law 1** above, otherwise it will be rejected. For example, the DARC has only one level\nof tokens (level 0, voting power = 1, dividend power = 1), the stock ownerships are:\n\n| ShareHolders | Number of tokens | Percentage |\n|--------------|------------------|------------|\n| CEO          | 400              | 40%        |\n| CTO          | 300              | 30%        |\n| CFO          | 200              | 20%        |\n| VC X         | 100              | 10%        |\n| **Total**    | **1000**         | **100%**   |\n\nIf the operator want to mint 200 tokens and issue them to VC Y, the operator must mint 20 tokens to address `x_addr` to\nsatisfy the **Law 1** above, otherwise the operation will be rejected. Here is a sample investment program by VC Y:\n\n```javascript\npay_cash(1000000000000)  // pay 1000 ETH to the DARC\nmint_tokens(20, 0, x_addr)  // mint 20 level-0 tokens to address x_addr\nmint_tokens(180, 0, y_addr)  // mint 180 level-0 tokens to address y_addr\nadd_and_enable_plugin([new_law_1, new_law_2, new_law_3])  // investment laws by VC Y\n```\n\nAfter the operation, the stock ownerships are:\n\n| ShareHolders | Number of tokens | Percentage |\n|--------------|------------------|------------|\n| CEO          | 400              | 33.33%     |\n| CTO          | 300              | 25%        |\n| CFO          | 200              | 16.67%     |\n| VC X         | 120              | 10%        |\n| VC Y         | 180              | 15%        |\n| **Total**    | **1200**         | 100%       |\n\nAlso another plugin should be added to the DARC to define the legislation of the \"Abolish Law 1\":\n\n***Law 1.1(Law 1 Appendix): Both Law 1 and Law 1 Appendix (current Law) can be abolished if and only if the operator is\nX***\n\n*Design of Plugin: If operation is \"disable_plugins\", and the plugin that to be disabled is with `id == 1` or `id == 2`,\nand the operator is not X, then the plugin should reject the operation (assume the anti dilutive law index is 1, and the\nappendix law index is 2, both are before-operation plugins)*\n\n```javascript\nconst law_1_appendix = {\n\n    // define the trigger condition\n    condition:\n        (operation == \"disable_plugins\")\n        & ((disable_after_op_plugin_id == 1) | (disable_after_op_plugin_id == 2))\n        & (operator != x_addr),\n\n    // define the decision\n    return_type: no,\n\n    // define the priority\n    return_level: 100,\n\n    // reject the operation before sandbox\n    is_before_operation: true,\n}\n```\n\n### Example 2: Bet-on Agreement/Valuation-Adjustment Mechanism(VAM) Agreement\n\n***Law2: If total revenue < 1000 ETH by 2035/01/01, shareholder X can take over 75% of total voting power and 90% of\ndividend power.***\n\n*Design of Plugin: After executing in sandbox, check the following conditions:*\n\n- *timestamp >= 2035/01/01*\n\n- *revenue since 2000/01/01 < 1000 ETH*\n\n- *operation is \"mint_tokens\"*\n\n- *total voting power of x <= 75%*\n\n- *the dividend power of x <= 90%*\n\n*then the plugin should approve the operation*\n\nIn By-law script, we can define the above plugin as following:\n\n```javascript\nconst bet_on_2 = {\n\n    // define the trigger condition\n    condition:\n        (timestamp >= toTimestamp('2035/01/01')) &\n        (revenue_since(946706400) < 1000000000000) & // 1000000000000 Gwei = 1000 ETH\n        (operation == \"mint_tokens\") &\n        (total_voting_power_percentage(x) < 75) &\n        (total_dividend_power_percentage(x) < 90),\n\n    // define the decision\n    return_type: yes,\n\n    // define the priority\n    return_level: 100,\n\n    // approve the operation after executing in sandbox\n    is_before_operation: false,\n}\n```\n\n### Example 3: Employee Payroll\n\n***Law 3: The payroll for employees with role level X should be 10 ETH per month.***\n\n*Design of Plugin: If operation is \"add withdrawable cash\", the amount is less than or equals to 10 ETH, and the last\noperation was at least 30 days, then this operation should be approved and skip sandbox check*\n\nIn By-law script, we can define the plugin with following conditions (for example, level X = 2 can withdraw 10 ETH per\n30 days):\n\n```javascript\nconst payroll_law_level_2 = {\n    condition:\n        (operation == \"add_withdrawable_cash\") &   // operation is \"add withdrawable cash\"\n        (member_role_level == 2) &   // the operator address is in role level 2\n\n        // add cash by < every 30 days = 2592000 seconds\n        (operator_last_operation_window(\"add_withdrawable_cash\") >= 2592000) &\n        // each time add < 10000000000 Gwei = 10 ETH to the account\n        (add_withdrawable_cash_amount <= 10000000000),\n\n    // approve the operation and skip sandbox check\n    return_type: yes_and_skip_sandbox,\n    return_level: 1\n    is_before_operation: true,\n}\n```\n\nWith the plugin above, the operator can add withdrawable cash to the employee's account with amount less than or equals\nto 10 ETH, and the last operation was at least 30 days. The plugin will approve the operation and skip the sandbox\ncheck. When the employee address is disable, removed from role level X, or other plugins with higher priority deny the\noperation, these operations will be rejected.\n\n### Example 4: Voting and legislation\n\nFor daily operations, the board of directors can be defined as a group of addresses, and the voting mechanism can be\nused to make decisions. For example, let's design the voting mechanism for the following scenario:\n\n1. Any address X with more than 10% total voting power can be added to the board by minting 1 token (level 2, board\n   voting token), if and only if the behavior is approved by 2/3 of all the board members (voting rule 1).\n\n```javascript\nconst add_board_member = {\n    condition:\n        (operation == \"mint_tokens\") &   // operation is \"mint_tokens\"\n        (mint_tokens_level == 2) &  // the token level is 2\n        (mint_tokens_amount == 1) &  // the amount is 1\n        (operator_total_voting_power_percentage >= 10),   // the operator address holds at least 10% of the total voting power\n    return_type: voting_needed,\n    voting_rule: 1,  // Under the voting rule 1, the operation will be approved if and only if 2/3 of all the board members approve the operation\n    return_level: 100,\n    is_before_operation: false, // make the decision after executing in sandbox\n}\n```\n\n2. Any operator with more than 7% of all voting power can submit `enable_plugins()` , and it needs to be approved by\n   100% of all the board members. Each operator can try to activate plugin per 10 days.\n\n```javascript\nconst enable_plugin = {\n    condition:\n        (operation == \"enable_plugins\") &   // operation is \"enable_plugins\"\n        (operator_total_voting_power_percentage >= 7) &   // the operator address holds at least 7% of the total voting power\n        (operator_last_operation_window(\"enable_plugin\") >= 864000),  // each operator can try to enable plugins once per 864000 seconds (10 days)\n\n    return_type: voting_needed,\n    voting_rule: 2,  // Under the voting rule 2, the operation will be approved if and only if 100% of all the board members approve the operation\n    return_level: 100,\n    is_before_operation: false, // make the decision after executing in sandbox\n}\n```\n\n3. To disable plugins 2,3 and 4, the operator needs to hold at least 20% of total voting power, and the operation needs\n   to be approved by 70% of all common stock token(level-0) voters as relative majority(voting rule 2). For each member\n   of DARC, this operation can be executed once per 15 days (1296000 seconds).\n\n```javascript\nconst disable_2_3_4 = {\n    condition:\n        (operation == \"disable_plugins\") &   // operation is \"disable_plugins\"\n        (\n            disable_after_op_plugin_id == 2\n            | disable_after_op_plugin_id == 3\n            | disable_after_op_plugin_id == 4\n        ) &  // disable after operation plugins 2,3 and 4\n        (operator_total_voting_power_percentage >= 20) &   // the operator address holds at least 20% of the total voting power\n        (operator_last_operation_window(\"disable_plugins\") >= 1296000),  // each operator can try to disable plugins once per 1296000 seconds (15 days)\n    return_type: voting_needed,\n    voting_rule: 3,  // Under the voting rule 3, the operation will be approved if and only if 70% of all the common stock holders approve the operation\n    is_before_operation: false, // make the decision after sandbox check\n}\n```\n\n### Example 5: Multi-level Tokens: Product tokens and Non-fungible tokens\n\nHere is an example of how to design a token with different levels of voting power and dividend power. The voting power\nand dividend power are used to calculate the voting power and dividend power of each token holder. Here is the table of\nthe token levels:\n\n| Level | Token                            | Voting Power | Dividend Power | Total Supply |\n|-------|----------------------------------|--------------|----------------|--------------|\n| 0     | Level-0 Common Stock             | 1            | 1              | 100,000      |\n| 1     | Level-1 Stock                    | 20           | 1              | 10,000       |\n| 2     | Board of Directors               | 1            | 0              | 5            |\n| 3     | Executives                       | 1            | 0              | 5            |\n| 4     | Non-Voting Shares                | 0            | 1              | 200,000      |\n| 5     | Product Token A (0.01 ETH/token) | 0            | 0              | ∞            |\n| 6     | Product Token B (10 ETH/token)   | 0            | 0              | ∞            |\n| 7     | Non-Fungible Token #1            | 0            | 0              | 1            |\n| 8     | Non-Fungible Token #2            | 0            | 0              | 1            |\n| 9     | Non-Fungible Token #3            | 0            | 0              | 1            |\n| 10    | Non-Fungible Token #4            | 0            | 0              | 1            |\n| 11    | Non-Fungible Token #5            | 0            | 0              | 1            |\n| ...   | ...                              | ...          | ...            | ...          |\n\nTo pay for service or prochase for products, customers can use `pay_cash()` to pay for the service directly, or\nuse `pay_to_mint_tokens()` as a payment method and receive product tokens/NFTs.\n\nHere is an example about how to define \"Product Token A\" and \"NFT\" price and total supply.\n\n```javascript\nconst product_token_A_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // operation is \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level == 5) &  // the token level is 5\n        (pay_to_mint_price_per_token >= 10000000000000000),   // price per token >= 0.01 ETH = 10000000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // approve the operation and skip sandbox check\n    return_level: 1,\n    is_before_operation: true, // approve the operation and skip sandbox check\n}\n\nconst NFT_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // operation is \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level >= 7) &  // the token level is 7 or higher\n        (pay_to_mint_token_amount == 1) &  // only allow to mint 1 token at a time\n        (pay_to_mint_current_level_total_supply == 0) &  // current total supply is 0\n        (pay_to_mint_price_per_token >= 10000000000000000000),   // price per token >= 10 ETH = 10000000000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // approve the operation and skip sandbox check\n    return_level: 1,\n    is_before_operation: true, // approve the operation and skip sandbox check\n}\n```\n\n### Example 6: Lock dividend yield rate for 5 years\n\nThe dividend mechanism is designed to distribute dividends to token holders under certain rules:\n\n1. For each `X` purchase transactions, take Y‱ of the total income as the dividendable cash\n2. The `offer_dividend()` operation can be called, which will distribute the dividendable cash to token holders'\n   dividend withdraw balance\n3. The amount of dividends per token holder (X) is calculated by the following\n   formula: `dividend_X = dividendable_cash * dividend_power(X) / total_dividend_power`\n4. After the `offer_dividend()` operation is called, the dividendable cash and dividendable transaction counter will be\n   set to 0, and the dividend withdraw balance of each token holder will be increased by `dividend_X`\n\nTo make sure the dividend yield rate is stable, we can add a plugin to the DARC to lock the dividend yield rate for 5\nyears by limiting the `set_parameters()` function.\n\n***Law 6: The dividend yield rate should be locked > 500‱ (5%) before 2030-01-01.***\n\n```javascript\nconst dividend_yield_rate_law = {\n    condition:\n        (operation == \"set_parameters\") &  // operation is \"set_parameters\"\n        (set_parameters_key == \"dividendPermyriadPerTransaction\") &  // the key is \"dividend_yield_rate\"\n        (set_parameters_value < 500) &  // the value is < 500‱ (5%)\n        (timestamp < 1893477600),  // the timestamp < unix timestamp  2030-01-01 00:00:00 (UTC) \n\n    return_type: no,  // reject the operation\n    return_level: 1,\n    is_before_operation: true, // reject the operation and skip sandbox check\n}\n```\n\n### Example 7: Investment program package\n\nHere is an unofficial example program of **Simple agreement for future equity (SAFE)**, a common investment contract by\na VC firm:\n\n1. The VC firm will pay 1000 ETH (1000000000000 Gwei) cash to the DARC as investment\n2. The VC firm will be granted 100,000,000 level-0 tokens (common stock) and 1 level-2 token (board of members)\n3. The VC firm will be granted the right to disable plugins 5, 6, 7\n4. The VC firm will be granted the right to enable plugins 8, 9, 10, 11\n5. The VC firm will be granted the right to change its role to level-5 (majority shareholder level)\n6. It's recommended to sign and scan a PDF document to record the agreement, upload the PDF document to IPFS, and add\n   the IPFS hash `QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC` to the DARC permanent storage array. This can help the\n   emergency agent to verify and fix DARC technical issues if needed.\n\n```javascript\nconst vc_addr = \"0x1234567890123456789012345678901234567890\";  // define my address\n\npay_cash(1000000000000, 0, 1);  // pay 1000 ETH = 1000000000000 Gwei cash\n\nmint_token([vc_addr], [100000000], [0]);  // mint 100,000,000 level-0 tokens (common stock) to VC firm\n\nmint_token([vc_addr], [1], [2]);  // mint a single 2-level token (board of members) to VC firm\n\ndisable_plugins([5, 6, 7], [false, false, false]) // disable previes after-operation plugins 5, 6, 7\n\nenable_plugins([8, 9, 10, 11], [false, false, false, false]) // enable new added plugins 8, 9, 10, which were added before this program\n\nchange_member_role(vc_addr, 5);  // change the role of VC firm to level-5 (majority shareholder level)\n\n/** Finally, sign and scan a SAFE document,\n * upload and pin on IPFS, and add the IPFS hash value to the DARC\n * just in case if DARC needs emergency agent to take over the DARC\n */\nadd_storage(['QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC']);\n```\n\n## Building the source\n\nSince Hardhat and OpenZeppelin are used, the project can be built using the following commands:\n\n1. Install dependencies\n\n   We recommend that you use `pnpm` instead of `npm`, but `npm` can also work.\n\n   `pnpm` is a newer package manager that has some advantages over npm. It is faster, more efficient, and disk-space\n   friendly.\n\n    ```shell\n    cd darc-protocol\n    npm install\n    ```\n\n2. Compile the contracts\n\n    ```shell\n    npx hardhat compile\n    ```\n\n3. Run the Darc test network\n\n    ```shell\n    npm run node\n    ```\n\n4. Test contracts\n\n    ```shell\n    npx hardhat test\n    REPORT_GAS=true npm run test\n    ```\n\n5. Deploy contracts\n\n    ```shell\n    npm run deploy\n    ```\n"
  },
  {
    "path": "README_cn.md",
    "content": "# Decentralized Autonomous Regulated Company (DARC) 去中心化的自动监管公司\n\n这是 Decentralized Autonomous Regulated Company (DARC) 项目的官方代码库。DARC\n是一个项目，旨在创建一个去中心化的自动监管公司，该公司由基于商业法律的插件系统监管。该项目目前处于早期开发阶段，尚未准备好用于生产环境。\n\n[English](./README.md) | 简体中文 | [日本語](./README_ja.md)\n\n## 加入社区\n\nTelegram: [https://t.me/projectdarc](https://t.me/projectdarc)\n\n## 什么是 DARC?\n\nDecentralized Autonomous Regulated Company (去中心化的自动监管公司，英文简称DARC) 是一个公司模型的虚拟机，可以编译部署到任何\nEVM （以太坊虚拟机）兼容的区块链公链上，具有以下特点：\n\n- **多级代币（Multi-level tokens）**,\n  每个级别的代币可以用作通用股份、优先股、特权股、债券、股票期权、董事会、商品代币、非同质化代币（NFT）等等。以上所有代币均可以有不同的价格、投票权和分红权，并且是由公司的插件系统（即法律）来定义；\n- **执行程序（Program）** ，每个执行程序是由一系列的 DARC 指令组成的，包括管理代币、分红、投票、提交法律、提款、购买和其他公司日常操作；\n- **分红机制（Dividend Mechanism）**，根据已有的法律协议和参数，为代币持有者提供分红；\n- **插件即法律（Plugin-as-a-Law）**，插件系统就是 DARC 的公司章程与合约，监督和管理公司所有日常操作。所有公司操作需要经过插件系统，或插件系统定义的投票程序的批准后，才能成功执行。\n\n## By-Law Script（章程语言）\n\nBy-law Script（章程语言）是一个类似于 JavaScript 语法的编程语言，可以用来定义公司的章程、规则、合约和 DARC 上的公司管理操作。例如：\n\n```javascript\nmint_tokens(   // 铸造代币\n    [addr1, addr2, addr3],   // 铸造代币发往的地址\n    [0, 0, 0],   // 代币等级\n    [500, 300, 200]  // 铸造代币数量\n);\n\npay_cash(100000000, 0, 1); // 支付 0.1 ETH 作为客户采购\n\ntransfer_tokens(   // 转让代币\n    [addr1, addr2, addr3],   // 代币转让的目标地址\n    [0, 0, 0],   // 代币等级\n    [100, 100, 200]  // 代币数量\n);\n\nadd_withdraw_cash(10000000);  // 申请 0.01 ETH 的提款\n\nwithdraw_cash_to(  // 把我的账户中的 ETH 提款到对应地址\n    [addr4, addr5],       // 提款地址\n    [10000000, 10000000]  // 提款金额： 0.01 ETH, 0.01 ETH\n);\n\n\n```\n\n以上 By-law Script 代码将被转译并解释运行在 DARC 虚拟机的智能合约上。如果以上代码全部被 DARC\n插件系统批准，那么将会被执行。如果有任何一条指令被插件系统拒绝，那么整个程序（Program）操作都会被拒绝。\n\n如果需要添加插件和投票规则，我们可以简单地写成插件和投票规则，并且通过 `add_voting_rule()` 或 `add_and_enable_plugins()`\n或 `add_plugins()` 操作来发送到 DARC 虚拟机的智能合约上，如果当前的插件系统批准了这些操作，那么这些插件和投票规则将会被部署并立即生效。\n\n下面是一个简单快速的例子。假设我们需要限制大股东（>25%）的代币转让，需要董事会进行全体投票（假设总共5票），并且需要 1 小时内\n100% 的投票通过（5票中必须有5票投票通过）。我们可以通过添加一个新的插件和相应的投票规则到 DARC 虚拟机的智能合约上：\n\n```javascript\nadd_voting_rule(  // 新增投票规则(序号为 5)\n    [\n        {\n            voting_class: [1], // 投票代币等级：1级代币，即公司董事会被要求投票\n            approve_percentage: 99,  // 投票通过需要 >= 99% 的投票权通过\n            voting_duration: 3600,  // 投票时常：1 小时\n            execute_duration: 3600,  // 投票通过后，执行操作的时常：1 小时\n            is_absolute_majority: true,  // 绝对多数投票制（而不是相对多数制）\n        }\n    ]\n);\n\nadd_and_enable_plugins(  // 新增插件并立即生效\n    [\n        {\n            condition: // 定义插件生效条件\n                (operation == \"transfer_tokens\")   // 如果是代币转让操作\n                & (operator_total_voting_power_percentage > 25), // 并且操作者地址的投票权 > 25%\n            return_type: voting_needed,  // 返回类型：需要投票\n            return_level: 100,  // 优先级：100\n            votingRuleIndex: 5 // 使用投票规则序号为 5 的投票规则（即 100% 的董事会成员们必须投票通过）\n            note: \"100% Approval is needed by board members to transfer tokens by major shareholders (>25%)\"\n            is_before_operation: false,  // 是否在沙箱（sandbox）试运行之前检查执行：否（这个插件要求在沙箱（sandbox）试运行之后检查执行）\n        }\n    ]\n);\n```\n\n执行以上的 By-law Script 程序后，DARC VM 合约将添加一个新的插件和投票规则，并且插件将立即生效（如果存在与 add_voting_rule()\n和 add_and_enable_plugins() 相关的任何投票程序，则插件将在投票流程通过后生效）。如果操作员（addr1）尝试将代币转移给\naddr2，插件将检查条件并返回 voting_needed 给 DARC VM 合约，DARC VM\n合约将要求董事会（一级代币所有者）进行投票。如果董事会批准该操作，则该操作将在沙盒中执行，否则该操作将被拒绝。例如，如果触发了3个投票规则，则投票操作将是：\n\n```javascript\nvote([true, true, true])\n```\n\n如果现有的投票规则和插件批准了投票过程，则新程序将被批准在下一个执行等待期（例如1小时）内执行，程序所有者或任何其他成员可以在下一个1小时内执行该程序，否则该程序将被忽略并从待处理列表中移除。\n\n## “插件即法律”（\"Plugin-as-a-Law\"）\n\n在 DARC 中，法律是由以下伪代码来定义的：\n\n```javascript\nif (插件条件 == true) {\n    插件决定 = 批准 / 拒绝 / 等待投票\n}\n```\n\n每个插件中，都包含一个条件树（condition expression\ntree）和一个决策（返回类型）。当在程序（Program）运行之前提交程序时，如果条件树被评估为真(true)，则插件将做出决策：允许、拒绝或要求进行投票。例如：\n\n### 例1: 反稀释股权\n\n在公司法律中，反稀释股份是一个基本机制，可以防止公司（也包括 DAO 和其他链上的“代币经济学”）发行过多的股份，从而稀释削弱掉现有股东们的股权和利益。在\nDARC 中，公司和早期投资者们可以定义一个“反稀释股份”的法律，并且同时制定一个特定的流程来在适当时候废除掉这条法律。\n\n***法律条款1 (反稀释股权法): 股东X应当永久持有该公司的10%股份***\n\n*插件设计思路: 如果操作者（operation）增发了0级代币（公司普通股），则插件应该检查代币的持有者（token\nownerships），X应该永远保持10%的总投票权和10%的分红权*\n\n在 By-law Script 的语法中，我们可以如下定义这个条件和法律:\n\n```javascript\n// 定义 X 的地址\nconst x_addr = \"0x1234567890123456789012345678901234567890\";\n\n// 定义插件\nconst anti_delutive = {\n\n    // 定义出发条件\n    condition:\n        ((operation == \"mint_tokens\")             // 如果正在“增发代币”\n            | (operation == \"pay_to_mint_tokens\"))   // 或者正在“付费增发代币”\n        &                                          // 并且       \n        ((total_voting_power_percentage(x) < 10)    // X的总投票权 < 10%\n            | (total_dividend_power_percentage(x) < 10)),   // 或者 X的总分红权 < 10%\n\n    // 定义插件决策：否决该操作\n    return_type: NO,\n\n    // 定义优先级：100\n    return_level: 100,\n\n    // 是否在沙箱（sandbox）试运行之前检查执行：否（这个插件要求在沙箱试运行之后检查执行）\n    is_before_operation: false,\n};\n```\n\n由于这个插件需要检查代币所有权的状态，因此应该在 DARC\n沙盒中执行操作后执行插件。如果插件的条件被评估为真，则当这个程序（Program）在沙箱（sandbox）执行后会被拒绝，并且该操作将被拒绝在真实环境中执行。否则，将允许“铸造新代币”执行。\n\n当将此插件添加到 DARC 中时，操作员（operator，也就是当前程序的提交者）必须铸造额外的代币并将其发送到 x_addr 地址，以满足上述的\n**法律条款1**，否则操作将被拒绝。例如，DARC 只有一级代币（级别 0，投票权 = 1，红利权 = 1），股权情况如下：\n\n| 股东     | 持股数量     | 百分比      |\n|--------|----------|----------|\n| CEO    | 400      | 40%      |\n| CTO    | 300      | 30%      |\n| CFO    | 200      | 20%      |\n| VC X   | 100      | 10%      |\n| **总共** | **1000** | **100%** |\n\n如果操作员想要铸造 200 个代币并将它们发放给 VC Y，则操作员必须铸造 20 个代币并将它们发送到 x_addr 地址，以满足上述的*\n*法律条款1**，否则该操作将被拒绝。以下是 VC Y 提供的示例投资方案：\n\n```javascript\npay_cash(1000000000000)  // 支付 1000 ETH 给 DARC\nmint_tokens(20, 0, x_addr)  // 增发 20 个 0 级代币给 x_addr\nmint_tokens(180, 0, y_addr)  // 增发 180 个 0 级代币给 y_addr\nadd_and_enable_plugin([new_law_1, new_law_2, new_law_3])  // VC Y 提出了新的法律\n```\n\n在以上操作后，股权情况如下：:\n\n| 股东     | 持股数量     | 百分比    |\n|--------|----------|--------|\n| CEO    | 400      | 33.33% |\n| CTO    | 300      | 25%    |\n| CFO    | 200      | 16.67% |\n| VC X   | 120      | 10%    |\n| VC Y   | 180      | 15%    |\n| **总共** | **1200** | 100%   |\n\n与此同时，另一个插件也应该添加到 DARC 中，以定义“废除法律1”的法律流程：\n\n***法律条款1.1 (法律条款1附录): 如果废除法律1和法律1附录（当前的法律），当且仅当操作者是 X***\n\n*插件设计思路: 如果操作是“disable_plugins”，并且企图被废除的法律条款序号是 `id == 1` 或者 `id == 2`，并且操作者不是\nX，则插件应该拒绝该操作（假设反稀释法律索引为 1，法律1附录索引为 2，两者都是在操作之前的插件）*\n\n```javascript\nconst law_1_appendix = {\n\n    // 定义法律触发条件\n    condition:\n        (operation == \"disable_plugins\")\n        & ((disable_after_op_plugin_id == 1) | (disable_after_op_plugin_id == 2))\n        & (operator != x_addr),\n\n    // 定义插件决策\n    return_type: no,\n\n    // 定义优先级\n    return_level: 100,\n\n    // 在沙箱试运行之前检查执行：是\n    is_before_operation: true,\n};\n```\n\n### 例2: 对赌协议（Bet-on Agreement，或者称为Valuation-Adjustment Mechanism(VAM) Agreement）\n\n***法律条文2: 如果在2035年1月1日之前，总共营收（revenue）少于1000 ETH，那么股东X可以获得超过75%的投票权和90%的分红权***\n\n***Law2: If total revenue < 1000 ETH by 2035/01/01, shareholder X can take over 75% of total voting power and 90% of\ndividend power.***\n\n*插件设计思路：在沙箱（sandbox）操作之后，检查以下条件：*\n\n- *时间戳（timestamp）>= 2035/01/01*\n\n- *自 2000/01/01 起的总收入 < 1000 ETH*\n\n- *操作为 \"mint_tokens\"*\n\n- *x 的总投票权 <= 75%*\n\n- *x 的红利权 <= 90%*\n\n*那么插件应该批准该操作*\n\n在 By-law 脚本中，我们可以定义上述插件如下：\n\n```javascript\nconst bet_on_2 = {\n\n    // 定义该插件的触发条件\n    condition:\n        (timestamp >= toTimestamp('2035/01/01')) &\n        (revenue_since(946706400) < 1000000000000) & // 1000000000000 Gwei = 1000 ETH\n        (operation == \"mint_tokens\") &\n        (total_voting_power_percentage(x) < 75) &\n        (total_dividend_power_percentage(x) < 90),\n\n    // 定义最终决策\n    return_type: yes,\n\n    // 定义优先级\n    return_level: 100,\n\n    // 在沙箱试运行之后检查执行：是\n    is_before_operation: false,\n}\n```\n\n### 例3: 员工工资\n\n***法律条文3: 对于级别为 X 的员工，每个月可以领 10 ETH 现金作为工资***\n\n*插件设计思路：如果操作是“添加可提款现金”，并且添加现金数量少于 10 ETH，并且该地址操作员（operator）上次操作在 30\n天之前，那么这个操作应该在沙箱（sandbox）运行之前直接批准，并且跳过沙箱检查*\n\n在 By-law Script 程序中，我们可以定义具有以下条件的插件（例如，级别 X = 2 可以每 30 天提取 10 ETH）：\n\n```javascript\nconst payroll_law_level_2 = {\n    condition:\n        (operation == \"add_withdrawable_cash\") &   // 操作指令是 \"add withdrawable cash\"\n        (member_role_level == 2) &   // operator 操作程序的作者是级别为 2 的成员\n\n        // 并且操作员上次执行 “add_withdrawable_cash” 的时间是 30 天 = 2592000 秒\n        (operator_last_operation_window(\"add_withdrawable_cash\") >= 2592000) &\n        // 并且本次添加金额 < 10000000000 Gwei = 10 ETH\n        (add_withdrawable_cash_amount <= 10000000000),\n    return_type: yes_and_skip_sandbox,\n    return_level: 1\n    is_before_operation: true, //在沙箱检查之前直接允许\n}\n```\n\n使用上述插件，操作员（即员工）可以将可提取现金添加到员工帐户中，金额小于或等于 10 ETH，上一个操作至少在 30\n天之前。插件将批准操作并跳过沙盒检查。当员工地址被禁用、从角色级别 X 中删除或其他优先级更高的插件拒绝操作时，这些操作将被拒绝。\n\n### 例4: 投票与立法\n\n\"对于日常运营，董事会可以定义为一组地址，并使用投票机制做出决策。例如，让我们为以下情景设计投票机制：\n\n1. 对于拥有超过10％总投票权的地址X，能通过铸造1个代币（代币级别为2，也就是董事会投票代币）的方式，添加到董事会，但前提是该行为经过董事会三分之二成员的批准（即依据投票规则1进行投票）。\n\n```javascript\nconst add_board_member = {\n    condition:\n        (operation == \"mint_tokens\") &   // 操作等于 \"增发代币\"\n        (mint_tokens_level == 2) &  // 增发代币级别为2\n        (mint_tokens_amount == 1) &  // 增发数量为1\n        (operator_total_voting_power_percentage >= 10),   // 操作者拥有的总投票权大于等于10%\n\n    // 插件决策：需要投票\n    return_type: voting_needed,\n    voting_rule: 1,  // 在决策投票规则1下，超过2/3的董事会成员批准该操作，则该操作被批准\n    return_level: 100,\n    is_before_operation: false, // 沙箱检查之后才进行投票\n}\n```\n\n2. 任何持有超过所有投票权7%的用户地址，都可以提交`enable_plugins()`指令，但需要获得所有董事会成员100%的批准。每个用户可以每隔10天尝试使用这条指令一次。\n\n```javascript\nconst enable_plugin = {\n    condition:\n        (operation == \"enable_plugins\") &   // 操作是 \"enable_plugins()\"\n        (operator_total_voting_power_percentage >= 7) &   // 该用户拥有的总投票权大于等于7%\n        (operator_last_operation_window(\"enable_plugin\") >= 864000),  //每个用户可以每 864000 seconds (10 days) 天尝试一次\n\n    return_type: voting_needed,\n    voting_rule: 2,  // 在投票规则2下，超过所有董事会成员的100%批准该操作，则该操作被批准\n    return_level: 100,\n    is_before_operation: false, // 沙箱检查之后才进行投票\n}\n```\n\n3. 要禁用插件2、3和4，程序操作者需要持有总投票权的至少20%，并且操作需要获得所有普通股代币（级别为0的代币）所有投票人的70%的相对多数（投票规则2）批准。对于DARC的每个成员，该操作每15天（1296000秒）可以执行一次。\n\n```javascript\nconst disable_2_3_4 = {\n    condition:\n        (operation == \"disable_plugins\") &   // 发起操作是 \"disable_plugins\"\n        (\n            disable_after_op_plugin_id == 2\n            | disable_after_op_plugin_id == 3\n            | disable_after_op_plugin_id == 4\n        ) &  // 废除插件2、3 或者 4\n        (operator_total_voting_power_percentage >= 20) &   // 操作者拥有的总投票权大于等于20%\n        (operator_last_operation_window(\"disable_plugins\") >= 1296000),  // 每个用户可以每 1296000 seconds (15 days) 天尝试一次\n    return_type: voting_needed,\n    voting_rule: 3,  // 在投票规则3下，超过所有普通股代币（级别为0的代币）所有投票人的70%的相对多数批准该操作，则该操作被批准\n    is_before_operation: false, // 沙箱检查之后才进行投票\n}\n```\n\n### 例5: 多级代币：商品代币和非同质化代币（NFT）\n\n以下是如何设计一个拥有不同投票和分红权力级别的代币的示例。投票权(voting power)和分红权(dividend power)\n用于计算每个代币持有者的投票权和分红权。以下是一个代币级别的表格：\n\n| 等级  | 代币                                   | 投票权 | 分红权 | 总币供应量   |\n|-----|--------------------------------------|-----|-----|---------|\n| 0   | 0级普通股份（Level-0 Common Stock）         | 1   | 1   | 100,000 |\n| 1   | 1级特别表决权股份（Level-1 Stock）             | 20  | 1   | 10,000  |\n| 2   | 董事会成员票（Board of Directors）           | 1   | 0   | 5       |\n| 3   | 行政人员投票权（Executives）                  | 1   | 0   | 5       |\n| 4   | 非投票股份（Non-Voting Shares）             | 0   | 1   | 200,000 |\n| 5   | 商品代币A（Product Token A） 价格是0.01 ETH/个 | 0   | 0   | ∞       |\n| 5   | 商品代币B（Product Token B） 价格是 10 ETH/个  | 0   | 0   | ∞       |\n| 7   | Non-Fungible Token #1                | 0   | 0   | 1       |\n| 8   | Non-Fungible Token #2                | 0   | 0   | 1       |\n| 9   | Non-Fungible Token #3                | 0   | 0   | 1       |\n| 10  | Non-Fungible Token #4                | 0   | 0   | 1       |\n| 11  | Non-Fungible Token #5                | 0   | 0   | 1       |\n| ... | ...                                  | ... | ... | ...     |\n\n为了支付服务或购买产品，客户可以使用`pay_cash()`直接支付服务费用，或使用 `pay_to_mint_tokens()`作为支付方式并获得商品代币/非同质化代币（NFT）。\n\n这里给一个简单的例子，来定义同质化商品代币A以及NFT的价格法则和总代币供应量。\n\n```javascript\nconst product_token_A_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // 操作指令是 \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level == 5) &  // 代币级别是5\n        (pay_to_mint_price_per_token >= 10000000000000000),   // 每个代币价格 >= 0.01 ETH = 10000000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // 准许操作并跳过沙箱检查\n    return_level: 1,\n    is_before_operation: true, // 在沙箱运行检查前执行本插件\n}\n\nconst NFT_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // 操作指令是 \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level >= 7) &  // 代币级别是7或者更高\n        (pay_to_mint_token_amount == 1) &  // 代币只能一次性付费铸造一个\n        (pay_to_mint_current_level_total_supply == 0) &  // 目前总代币供应量为0\n        (pay_to_mint_price_per_token >= 10000000000000000000),   // 每枚代币价格 >= 10 ETH = 10000000000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // 准许操作并跳过沙箱检查\n    return_level: 1,\n    is_before_operation: true, // 在沙箱运行检查前执行本插件\n}\n```\n\n### 例6: 在 5 年内锁定分红比率\n\n股息机制是根据一定规则向代币持有者分配股息的设计：\n\n每进行 X 笔购买交易，将总收入的 Y‱ 设为可分配股息的现金\n可以调用 offer_dividend() 操作，将可分配股息的现金分配给代币持有者的股息提取余额\n每个代币持有者（X）的股息金额计算公式如下：dividend_X = dividendable_cash * dividend_power(X) / total_dividend_power\n在调用 offer_dividend() 操作后，可分配股息的现金和可分配股息交易计数器将被设置为0，并且每个代币持有者的股息提取余额将增加\ndividend_X\n为了确保股息收益率稳定，我们可以添加一个插件到 DARC 中，通过限制 set_parameters() 函数来锁定股息收益率5年。\n\n***法律条文6: 在 2030-01-01 之前，本实体的收入分红比率必须保持 > 500‱ (5%) 以上***\n\n```javascript\nconst dividend_yield_rate_law = {\n    condition:\n        (operation == \"set_parameters\") &  // 操作指令是 \"set_parameters\"\n        (set_parameters_key == \"dividendPermyriadPerTransaction\") &  // 设置参数的键值为 \"dividend_yield_rate\"\n        (set_parameters_value < 500) &  // the value is < 500‱ (5%)\n        (timestamp < 1893477600),  // 时间戳小于 < unix timestamp  2030-01-01 00:00:00 (UTC) \n\n    return_type: no,  // 拒绝这个操作\n    return_level: 1,\n    is_before_operation: true, // 在进入沙箱检查前执行本插件\n}\n```\n\n### 例7: 一个投资计划项目\n\n这里提供一个非正式的**未来股权简单协议（Simple agreement for future equity，或者简称SAFE）**\n。这种协议经常被风险投资机构用来当作投资合同:\n\n1. 本 VC 同意支付 1000 ETH (1000000000000 Gwei) 现金作为投资\n2. 本 VC 将会获得 100,000,000 枚 level-0 代币 (普通股份) 和 1 枚 level-2 代币 (作为董事会成员投票权代币)\n3. 本 VC 将会被允许批准废除已有的 5, 6, 7 三条法律\n4. 本 VC 将会被允许批准提交 8, 9, 10, 11 四条法律，并当即生效\n5. 本 VC 将会被允许在公司名录概念中加入为 5 级成员权限 (主要大股东成员权限)\n6. 我们通常建议扫描并签字一份电子版的文字 PDF 文档，作为本次交易的记录，上传这份 PDF 文档到 IPFS 上面，并且把 IPFS 对应的\n   hash value `QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC` 加入到 DARC 的永久存储数组中。这样可以帮助紧急代理人（Emergency\n   Agent）在需要的时候，验证并修复 DARC 技术问题。\n\n```javascript\nconst vc_addr = \"0x1234567890123456789012345678901234567890\";  // 定义 VC 地址\n\npay_cash(1000000000000, 0, 1);  // 支付 1000 ETH = 1000000000000 Gwei cash\n\nmint_token([vc_addr], [100000000], [0]);  // 增发 100,000,000 level-0 tokens (common stock) 给 VC\n\nmint_token([vc_addr], [1], [2]);  // 增发一枚 2-level token (董事会成员) 给 VC\n\ndisable_plugins([5, 6, 7], [false, false, false]) // 取消合同 5, 6, 7\n\nenable_plugins([8, 9, 10, 11], [false, false, false, false]) // 增加合同 8, 9, 10, 11\n\nchange_member_role(vc_addr, 5);  // 把 VC 加入到公司名录概念中，作为 5 级成员权限 (主要大股东成员权限)\n\n// 把 PDF 文档的 IPFS hash 加入到 DARC 的永久存储数组中\nadd_storage(['QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC']);\n```\n\n## 编译源代码\n\n由于本项目使用了 Hardhat 和 Openzeppelin，所以你需要安装 Node.js 和 npm。然后执行以下命令：\n\n1. 安装依赖\n\n   我们建议您使用 `pnpm` 而不是 `npm`，但 `npm` 也可以工作。  \n   `pnpm` 是一个较新的包管理器，相较于 npm 具有一些优势。它更快、更高效，并且节省磁盘空间。\n\n    ```shell\n    cd darc-protocol\n    npm install\n    ```\n\n2. 编译智能合约\n\n    ```shell\n    npx hardhat compile\n    ```\n\n3. 运行 Darc 测试网络\n    ```shell\n    npm run node\n    ```\n\n4. 测试合约\n\n     ```shell\n    npm run test\n    REPORT_GAS=true npm run test\n     ```\n\n5. 部署合约\n    ```shell\n    npm run deploy\n    ```\n"
  },
  {
    "path": "README_ja.md",
    "content": "# Decentralized Autonomous Regulated Company (DARC)\n\nDecentralized Autonomous Regulated Company (DARC) プロジェクトの公式リポジトリへようこそ。DARC は、\n商法に基づくプラグインシステムによって規制される分散型自律企業の創設を目指すプロジェクトである。\nこのプロジェクトは現在、開発の初期段階にあり、まだ生産に使用できる段階ではありません。\n\n[English](./README.md) | [简体中文](./README_cn.md) | 日本語\n\n## コミュニティに参加\n\nTelegram: [https://t.me/projectdarc](https://t.me/projectdarc)\n\n## DARC とは?\n\nDecentralized Autonomous Regulated Company (DARC) は、EVM 互換のブロックチェーンにコンパイルしてデプロイできる企業仮想マシンで、次のような特徴があります:\n\n- **Multi-level tokens** 各レベルのトークンは、普通株式、優先株式、転換社債、取締役会、製品トークン、非可菌トークン（NFT）として使用することができ、価格、議決権、配当権は会社のプラグイン（法）システムによって定義されます。\n- **Program** トークンの管理、配当、投票、立法、購入、現金の引き出し、その他の企業運営を含む一連のDARC指示で構成される。\n- **Dividend Mechanism** 一定の規則に従ってトークン保有者に配当金を分配する。\n- **Plugin-as-a-Law** プラグインシステムは、すべてのオペレーションを監督する規約や商業契約の役割を果たす。\n  会社の運営はすべて、プラグインシステムまたはそれに対応する投票プロセスによって承認される必要がある。\n\n## By-Law Script\n\nBy-law Script は JavaScript のようなプログラミング言語であり、DARC 上での会社の商業ルールやオペレーションを定義するために使用されます。例えば:\n\n```javascript\nmint_tokens(   // ミントのトークン操作\n    [addr1, addr2, addr3],   // トークンアドレス\n    [0, 0, 0],   // トークンクラス\n    [500, 300, 200]  // トークン数\n);\n\npay_cash(100000000, 0, 1); // 0.1 ETH を購入代金として支払う\n\ntransfer_tokens(   // 転送トークン操作\n    [addr1, addr2, addr3],   // トークンアドレス\n    [0, 0, 0],   // トークンクラス\n    [100, 100, 200]  // トークン数\n);\n\nadd_withdraw_cash(10000000);  // 0.01 ETH を引き出し残高に追加する\n\nwithdraw_cash_to(  // 自分の口座から他のアドレスに現金を引き出す\n    [addr4, addr5],       // 現金を addr4、addr5 に引き出す\n    [10000000, 10000000]  // 引き出し額 0.01 ETH, 0.01 ETH\n);\n\n\n```\n\n上記付則のスクリプトはコードジェネレーターで変換され、対応する DARC の VM 契約に送られます。プラグインシステムが承認すれば、DARC はプログラムを実行します。\nDARC にプラグインと投票ルールを追加するには、単純にプラグイン条件と投票ルールを組み合わせ `add_voting_rule()`、`add_and_enable_plugins()`、`add_plugins()` の操作で送信します\nそして、現在のプラグインシステムがその操作を承認すれば、即座にデプロイされ、有効になる。\n\nここで簡単な例を挙げます。取締役会にオールハンド投票（全部で 5 つのトークンを想定）を求めることで、大株主（25％ 以上）によるトークンの譲渡を制限する必要があり、1 時間以内に 100％ の承認（5 人中 5 人）が必要だとします。\nDARC VM 契約に新しいプラグインと対応する投票ルールを追加することができます:\n\n```javascript\nadd_voting_rule(  // 投票ルールを追加する（インデックス 5 として）\n    [\n        {\n            voting_class: [1], // 投票トークンクラス: 1、レベル 1 のトークン所有者（取締役会）には投票義務がある\n            approve_percentage: 99,  // 承認には 99％ の議決権が必要\n            voting_duration: 3600,  // 投票時間: 1 時間（3600 秒）\n            execute_duration: 3600,  // 実行保留期間: 1 時間（3600 秒）\n            is_absolute_majority: true,  // 相対多数ではなく絶対多数が必要\n        }\n    ]\n)\n\nadd_and_enable_plugins(   // プラグインの追加と有効化（インデックス 7 と同様）\n    [\n        {\n            condition:  // 条件を定義する:\n                (operation == \"transfer_tokens\")   // 操作が transfer_tokens の場合\n                & (operator_total_voting_power_percentage > 25),  // かつ addr1 の議決権 >25\n            return_type: voting_needed,  // 戻り値の型: 要投票\n            return_level: 100,  // 優先度: 100\n            votingRuleIndex: 5 // 投票規則インデックス 5（取締役会に投票を依頼し、100％ 賛成しなければならない）\n            note: \"100% Approval is needed by board members to transfer tokens by major shareholders (>25%)\"\n            is_before_operation: false,  // サンドボックス内で操作が実行された後、プラグインをチェックする\n        }\n    ]\n)\n```\n\n上記のBy-Lawスクリプトが実行されると、DARC VMコントラクトは新しいプラグインと投票規則を追加し、プラグインは直ちに有効となる\n（`add_voting_rule()` と `add_and_enable_plugins()` に関連する投票手続きが存在する場合、プラグインは投票手続きが承認された後に有効となる）。\nオペレータ(`addr1`)が addr2 にトークンを転送しようとすると、プラグインはその条件をチェックして `voting_needed` を DARC VM 契約に返し、\nDARC VM 契約は理事会(レベル 1 のトークン所有者)に投票を依頼する。理事会が承認すれば、サンドボックス内で作戦が実行され、そうでなければ作戦は却下される。\n例えば、3 つの投票ルールがトリガーされた場合、投票操作は次のようになる:\n\n```javascript\nvote([true, true, true])\n```\n\n投票プロセスが既存の投票ルールとプラグインによって承認された場合、新しいプログラムは次の実行保留期間（この例では 1 時間）\nでの実行が承認され、プログラム所有者または他のメンバーは次の1時間以内にプログラムを実行することができます。\n\n## \"Plugin-as-a-Law\"\n\nDARC の法的規定は以下の擬似コードで定義される:\n\n```javascript\nif (plugin_condition == true) {\n    plugin_decision = allows / denies / requires a vote\n}\n```\n\n各プラグインには、条件式ツリーと対応するデシジョン（戻り値の型）が含まれる。実行前にプログラムがサブミットされている間に\n条件ツリーが真と評価されると、プラグインは許可、拒否、または投票を要求する決定を下す。例えば:\n\n### 例 1: 希薄化防止株式\n\n希薄化防止株式とは、企業（DAO や他のオンチェーン「トークノミクス」を含む）が株式を発行しすぎて、既存株主の所有権が希薄化するのを防ぐための基本的な仕組みである。\nDARC では、企業とアーリーステージの投資家は \"反希薄化株式\" の法的規定を定義することができ、一定のプロセスを経て法的規定を廃止することができる。\n\n***法的規定 1 (希薄化防止株式): 株主 X は常に全株式の 10％ を保有しているはずである。***\n\n*プラグインの設計: オペレーションが新しいレベル 0 トークンを鋳造する場合、プラグインはトークンの所有者の状態をチェックし、\nX はオペレーション実行後、常に 10％ の総議決権および 10％ の配当権を最低限維持すべきである。*\n\nBy-Law script では、以下の条件でプラグインを定義することができる:\n\n```javascript\n// X のアドレスを定義する\nconst x_addr = \"0x1234567890123456789012345678901234567890\";\n\n// プラグインを定義する\nconst anti_delutive = {\n\n    // トリガー条件を定義する\n    condition:\n        ((operation == \"mint_tokens\")             // オペレータが新しいトークンをミントしている場合\n            | (operation == \"pay_to_mint_tokens\"))   // またはオペレータが新しいトークンをミントするために支払っている\n        &                                          // 及び\n        ((total_voting_power_percentage(x) < 10)    // X の総議決権 <10\n            | (total_dividend_power_percentage(x) < 10)),   // または X の配当総額 <10\n\n    // 決断の定義: 操作の拒否\n    return_type: NO,\n\n    // 優先順位の定義: 100\n    return_level: 100,\n\n    // サンドボックス内で操作が実行された後、プラグインをチェックする\n    is_before_operation: false,\n}\n```\n\nこのプラグインはトークン所有権の状態をチェックするため、DARCのサンドボックス内で操作が実行された後に実行されなければならない。\nプラグインの条件がtrueと評価された場合、プラグインはサンドボックス内で実行した後に操作を拒否し、実際の環境での実行は拒否されます。\nそうでなければ、\"minting new tokens\" の実行が許可される。\n\nこのプラグインが DARC に追加された場合、オペレーター（現在のプログラムの作者）は、上記の**法的規定 1** を満たすために、アドレス `x_addr` に余分なトークンを追加しなければならない。\n例えば、DARC には 1 つのレベルのトークンしかなく（レベル 0、議決権 = 1、配当権 = 1）、株式の所有権は次のとおりである:\n\n| 株式所有者     | トークン数         | 比率       |\n|--------------|------------------|------------|\n| CEO          | 400              | 40%        |\n| CTO          | 300              | 30%        |\n| CFO          | 200              | 20%        |\n| VC X         | 100              | 10%        |\n| **合計**     | **1000**         | **100%**   |\n\nオペレータが 200 トークンをミントして VC Y に発行したい場合、上記の**法的規定 1** を満たすために、オペレータはアドレス `x_addr` に 20 トークンを鋳造しなければならない。\n以下は VC Y による投資プログラムのサンプルである:\n\n```javascript\npay_cash(1000000000000)  // DARC に 1000 ETH を支払う\nmint_tokens(20, 0, x_addr)  // レベル 0 トークン 20 個をアドレスx_addr にミントする\nmint_tokens(180, 0, y_addr)  // レベル 0 トークン 180 個をアドレスy_addr にミントする\nadd_and_enable_plugin([new_law_1, new_law_2, new_law_3])  // VC Yによる投資法\n```\n\n手術後、株式の所有権は次のようになる:\n\n| 株式所有者     | トークン数         | 比率       |\n|--------------|------------------|------------|\n| CEO          | 400              | 33.33%     |\n| CTO          | 300              | 25%        |\n| CFO          | 200              | 16.67%     |\n| VC X         | 120              | 10%        |\n| VC Y         | 180              | 15%        |\n| **合計**     | **1200**         | 100%       |\n\nまた、\"廃止法 1\"の立法を定義するために、DARC に別のプラグインを追加すべきである:\n\n***法的規定 1.1(法的規定 1 Appendix): 法的規定 1 と法則付則 1（現行法的規定）の両方が廃止できるのは、オペレータが X である場合に限られる***\n\n*プラグインの設計: 操作が \"disable_plugins\" で、無効にするプラグインが `id == 1` または `id == 2` で、操作者が X でない場合、プラグインは操作を拒否するはずです（希釈防止法のインデックスが 1、付録法のインデックスが 2 で、どちらも操作前のプラグインであると仮定します）*\n\n```javascript\nconst law_1_appendix = {\n\n    // トリガー条件を定義する\n    condition:\n        (operation == \"disable_plugins\")\n        & ((disable_after_op_plugin_id == 1) | (disable_after_op_plugin_id == 2))\n        & (operator != x_addr),\n\n    // 決断の定義\n    return_type: no,\n\n    // 優先度の定義\n    return_level: 100,\n\n    // サンドボックスの前に操作を拒否する\n    is_before_operation: true,\n}\n```\n\n### 例 2: ベットオン契約／評価調整メカニズム（VAM）契約\n\n***法的規定: 2035年1月1日までに総収入が 1000 ETH 未満であれば、株主 X は総議決権の 75％、配当権の 90％ を握ることができる。***\n\n*プラグインの設計: サンドボックス内で実行した後、以下の条件をチェックする:*\n\n- *タイムスタンプ >= 2035/01/01*\n\n- *2000年1月1日以降の収入 < 1000 ETH*\n\n- *操作は \"mint_tokens\"*\n\n- *X の総議決権 <= 75%*\n\n- *x の配当力 <= 90%*\n\n*その場合、プラグインはその操作を承認しなければならない*\n\nBy-law script では、上記のプラグインを次のように定義できる:\n\n```javascript\nconst bet_on_2 = {\n\n    // トリガー条件を定義する\n    condition:\n        (timestamp >= toTimestamp('2035/01/01')) &\n        (revenue_since(946706400) < 1000000000000) & // 1000000000000 Gwei = 1000 ETH\n        (operation == \"mint_tokens\") &\n        (total_voting_power_percentage(x) < 75) &\n        (total_dividend_power_percentage(x) < 90),\n\n    // 決断の定義\n    return_type: yes,\n\n    // 優先度の定義\n    return_level: 100,\n\n    // サンドボックスで実行後、操作を承認する\n    is_before_operation: false,\n}\n```\n\n### 例 3: 従業員給与計算\n\n***法的規定 3: ロールレベル X の従業員の給与は月 10 ETH でなければならない。***\n\n*プラグインの設計: 操作が \"add withdrawable cash\" であり、金額が 10 ETH 以下であり、最後の操作が少なくとも 30 日前である場合、この操作は承認され、サンドボックスのチェックをスキップする必要があります*\n\nBy-law script では、以下の条件でプラグインを定義することができます（例えば、レベル X = 2 は、30 日あたり 10 ETH を引き出すことができます）:\n\n```javascript\nconst payroll_law_level_2 = {\n    condition:\n        (operation == \"add_withdrawable_cash\") &   // 操作は \"add withdrawable cash\"\n        (member_role_level == 2) &   // オペレータアドレスがロールレベル  2である\n\n        // 現金を加える < 30 日ごとに = 2592000 秒\n        (operator_last_operation_window(\"add_withdrawable_cash\") >= 2592000) &\n        // 毎回 < 10000000000 Gwei = 10 ETH を口座に追加する\n        (add_withdrawable_cash_amount <= 10000000000),\n\n    // 操作を承認し、サンドボックスチェックをスキップする\n    return_type: yes_and_skip_sandbox,\n    return_level: 1\n    is_before_operation: true,\n}\n```\n\n上記のプラグインを使用すると、オペレータは従業員のアカウントに 10 ETH 以下の金額で引き出し可能な現金を追加することができます。\nプラグインは操作を承認し、サンドボックスチェックをスキップします。従業員アドレスが無効化された場合、ロールレベル X から削除された場合、\nまたは優先順位の高い他のプラグインが操作を拒否した場合、これらの操作は拒否されます。\n\n### 例 4: 投票と法案\n\n日常業務では、取締役会をアドレスのグループとして定義し、議決権行使メカニズムを使って意思決定を行うことができる。\n例えば、次のようなシナリオで投票メカニズムを設計する:\n\n1. 総議決権の 10％ 以上を持つアドレス X は、全理事会メンバーの 2/3 がその行動を承認した場合に限り、\n   1 トークン（レベル 2、理事会投票トークン）を鋳造することで理事会に加えることができる（投票ルール 1）。\n\n```javascript\nconst add_board_member = {\n    condition:\n        (operation == \"mint_tokens\") &   // 操作は \"mint_tokens\"\n        (mint_tokens_level == 2) &  // トークンレベルは 2\n        (mint_tokens_amount == 1) &  // 量は 1\n        (operator_total_voting_power_percentage >= 10),   // 事業者の住所が総議決権の 10% 以上を保有すること\n    return_type: voting_needed,\n    voting_rule: 1,  // 議決権行使ルール 1 では、全取締役の 2/3 以上の賛成があった場合にのみ承認される\n    return_level: 100,\n    is_before_operation: false, // サンドボックスで実行した後に判断する\n}\n```\n\n2. 全投票数の 7% 以上の投票権を持つ運営者は、`enable_plugins()` を提出することができ、全理事の 100% の承認を得る必要があります。\n   各オペレータは 10 日ごとにプラグインの有効化を試みることができる。\n\n```javascript\nconst enable_plugin = {\n    condition:\n        (operation == \"enable_plugins\") &   // 操作は \"enable_plugins\"\n        (operator_total_voting_power_percentage >= 7) &   // 事業者の住所が総議決権の 7％ 以上を保有していること\n        (operator_last_operation_window(\"enable_plugin\") >= 864000),  // 各オペレーターは、864000 秒（10 日間）に一度、プラグインを有効にしようとすることができます\n\n    return_type: voting_needed,\n    voting_rule: 2,  // 議決権行使ルール 2 では、全理事会メンバーの 100％ が承認した場合にのみ、その事業が承認される\n    return_level: 100,\n    is_before_operation: false, // サンドボックスで実行した後に判断する\n}\n```\n\n3. プラグイン 2,3,4 を無効化するためには、運営者が総議決権の 20% 以上を保有し、かつ、相対多数決（議決権行使ルール 2）として\n   全普通株式トークン（レベル 0）投票者の 70% の賛成を得る必要がある。DARC の各メンバーについて、この操作は 15 日（1296000 秒）に 1 回実行できる。\n\n```javascript\nconst disable_2_3_4 = {\n    condition:\n        (operation == \"disable_plugins\") &   // 操作は \"disable_plugins\"\n        (\n            disable_after_op_plugin_id == 2\n            | disable_after_op_plugin_id == 3\n            | disable_after_op_plugin_id == 4\n        ) &  // プラグイン 2,3,4 を操作後に無効にする\n        (operator_total_voting_power_percentage >= 20) &   // 事業者の住所が総議決権の 20% 以上を保有すること\n        (operator_last_operation_window(\"disable_plugins\") >= 1296000),  // 各オペレーターは 1296000 秒（15 日間）に一度、プラグインの無効化を試みることができる\n    return_type: voting_needed,\n    voting_rule: 3,  // 議決権行使ルール 3 では、全普通株式保有者の 70％ が賛成した場合にのみ、本運用が承認される\n    is_before_operation: false, // サンドボックスチェック後に決断を下す\n}\n```\n\n### 例 5: マルチレベルトークン: 製品トークンと非代替性トークン\n\n以下は、議決権と配当権のレベルが異なるトークンの設計方法の例である。議決権および配当権は、各トークンホルダーの議決権および配当権を計算するために使用される。\n以下はトークンレベルの表である:\n\n| レベル | トークン                            | 投票権        | 配当力          | 総供給量       |\n|-------|------------------------------------|--------------|----------------|--------------|\n| 0     | レベル0 普通株式                     | 1            | 1              | 100,000      |\n| 1     | レベル1株式                         | 20           | 1              | 10,000       |\n| 2     | 取締役会                            | 1            | 0              | 5            |\n| 3     | 経営陣                              | 1            | 0              | 5            |\n| 4     | 無議決権株式                         | 0            | 1              | 200,000      |\n| 5     | プロダクトトークン A (0.01 ETH/token) | 0            | 0              | ∞            |\n| 6     | プロダクトトークン B (10 ETH/token)   | 0            | 0              | ∞            |\n| 7     | Non-Fungible Token #1              | 0            | 0              | 1            |\n| 8     | Non-Fungible Token #2              | 0            | 0              | 1            |\n| 9     | Non-Fungible Token #3              | 0            | 0              | 1            |\n| 10    | Non-Fungible Token #4              | 0            | 0              | 1            |\n| 11    | Non-Fungible Token #5              | 0            | 0              | 1            |\n| ...   | ...                                | ...          | ...            | ...          |\n\nサービス料金の支払いや商品の購入には、`pay_cash()` を使って直接支払うか、`pay_to_mint_tokens()` を支払い方法として使い、商品トークン/NFT を受け取ることができる。\n\n以下は、\"Product Token A\" と \"NFT\" の価格と総供給量を定義する方法の例である。\n\n```javascript\nconst product_token_A_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // 操作は \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level == 5) &  // トークンレベルは 5\n        (pay_to_mint_price_per_token >= 10000000000000000),   // トークン1個あたりの価格 >= 0.01 ETH = 1000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // 操作を承認し、サンドボックスチェックをスキップする\n    return_level: 1,\n    is_before_operation: true, // 操作を承認し、サンドボックスチェックをスキップする\n}\n\nconst NFT_price_law = {\n    condition:\n        (operation == \"pay_to_mint_tokens\") &   // 操作は \"pay_to_mint_tokens\"\n        (pay_to_mint_tokens_level >= 7) &  // トークンレベルが 7 以上\n        (pay_to_mint_token_amount == 1) &  // 一度に 1 トークンしかミントできない\n        (pay_to_mint_current_level_total_supply == 0) &  // 現在の総供給量は 0\n        (pay_to_mint_price_per_token >= 10000000000000000000),   // トークン 1 個あたりの価格 >= 10 ETH = 1000000000000000 wei\n\n    return_type: yes_and_skip_sandbox,  // 操作を承認し、サンドボックスチェックをスキップする\n    return_level: 1,\n    is_before_operation: true, // 操作を承認し、サンドボックスチェックをスキップする\n}\n```\n\n### 例 6: 配当利回りを 5 年間固定\n\n配当メカニズムは、一定のルールの下でトークン保有者に配当を分配するように設計されている:\n\n1. 各 `X` の購入取引について、総収入の Y‱ を配当可能な現金とする\n2. `offer_dividend()` オペレーションを呼び出すことで、配当可能な現金をトークン保有者の配当引き出し残高に分配することができる\n3. トークン保有者一人当たりの配当額（X）は、以下の式で計算される: `dividend_X = dividendable_cash * dividend_power(X) / total_dividend_power`\n4. `offer_dividend()` が呼ばれた後、配当可能な現金と配当可能な取引のカウンタは 0 になり、各トークンホルダーの配当引き出し残高は `dividend_X` だけ増加する\n\n配当利回りが安定していることを確認するために、DARC にプラグインを追加し、`set_parameters()` 関数を制限することで、配当利回りを 5 年間固定することができます\n\n***法的規定 6: 配当利回りは2030年1月1日までに 500‱（5％）以上に固定される必要がある。***\n\n```javascript\nconst dividend_yield_rate_law = {\n    condition:\n        (operation == \"set_parameters\") &  // 操作は \"set_parameters\"\n        (set_parameters_key == \"dividendPermyriadPerTransaction\") &  // キーは \"dividend_yield_rate\"\n        (set_parameters_value < 500) &  // 値が< 500‱ (5%)\n        (timestamp < 1893477600),  // タイムスタンプ < unix タイムスタンプ 2030-01-01 00:00:00 (UTC)\n\n    return_type: no,  // 操作を拒否する\n    return_level: 1,\n    is_before_operation: true, // 操作を拒否し、サンドボックスチェックをスキップする\n}\n```\n\n### 例 7: 投資プログラムパッケージ\n\n以下は、VC による一般的な投資契約である **Simple agreement for future equity (SAFE)** の非公式なプログラム例である:\n\n1. VC は 1000 ETH（10000000000 Gwei）の現金を投資として DARC に支払う\n2. VC は、100,000,000 レベル 0 トークン（普通株式）と 1 レベル 2 トークン（取締役会）を付与される\n3. VC は、プラグイン 5、6、7 を無効にする権利を有する\n4. VC には、プラグイン 8、9、10、11 を有効にする権利が与えられる\n5. VC には、その役割をレベル 5（大株主レベル）に変更する権利が与えられる\n6. 契約を記録するために PDF 文書に署名してスキャンし、PDF 文書を IPFS にアップロードし、IPFS ハッシュ `QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC`\n   を DARC パーマネントストレージ配列に追加することを推奨する。\n   これは、必要に応じて緊急エージェントが DARC の技術的問題を検証し、修正するのに役立つ。\n\n```javascript\nconst vc_addr = \"0x1234567890123456789012345678901234567890\";  // 自分のアドレスを定義する\n\npay_cash(1000000000000, 0, 1);  // 1000 ETH = 1000000000000 Gwei cash を支払う\n\nmint_token([vc_addr], [100000000], [0]);  // 100,000,000 レベル 0 トークン（普通株）を VC ファームにミントする\n\nmint_token([vc_addr], [1], [2]);  // 2 レベルのトークン（役員会）を 1 つ VC ファームにミントする\n\ndisable_plugins([5, 6, 7], [false, false, false]) // 操作後のプラグイン 5、6、7 を無効にする\n\nenable_plugins([8, 9, 10, 11], [false, false, false, false]) // このプログラム以前に追加されたプラグイン 8、9、10 を有効にする\n\nchange_member_role(vc_addr, 5);  // VC の役割をレベル 5（大株主レベル）に変更する\n\n/** 最後に、DARC が DARC を引き継ぐために緊急エージェントを必要とする場合に備え、\n * SAFE 文書に署名し、スキャンし、IPFS にアップロードし、ピンを立て、\n * IPFS のハッシュ値を DARC に追加する\n */\nadd_storage(['QmcpxHN3a5HYnPurtuDs3jDfDSg1LPDe2KVBUG4RifcSbC']);\n```\n\n## ソースのビルド\n\nHardhat と OpenZeppelin を使用しているので、プロジェクトは以下のコマンドでビルドできます:\n\n1. 依存関係のインストール\n\n   `npm` の代わりに `pnpm` を使うことを推奨しますが、`npm` でも動作します。\n\n   `pnpm` は新しいパッケージマネージャーで、npm よりも優れている点がいくつかある。より速く、より効率的で、ディスクスペースに優しいです。\n\n    ```shell\n    cd darc-protocol\n    npm install\n    ```\n\n2. コントラクトのコンパイル\n\n    ```shell\n    npx hardhat compile\n    ```\n\n3. Darc テストネットワークの実行\n\n    ```shell\n    npm run node\n    ```\n\n4. コントラクトのテスト\n\n    ```shell\n    npx hardhat test\n    REPORT_GAS=true npm run test\n    ```\n\n5. コントラクトのデプロイ\n\n    ```shell\n    npm run deploy\n    ```\n"
  },
  {
    "path": "darc-docs/README.md",
    "content": "# Darc Docs\n\n![img.png](img.png)\n\n## Tech Stack\n\n- [React](https://reactjs.org/)\n- [Nodejs](https://nodejs.org/)\n- [Docusaurus](https://docusaurus.io/)\n\n## Installation\n\n```bash\nnpm install\n```\n\n## Run Locally\n\n```bash\nnpm run start\n```\n\n## Build\n\n```bash\nnpm run build\n```\n\n## Deploy\n\n```bash\nnpm run deploy\n```"
  },
  {
    "path": "darc-docs/babel.config.js",
    "content": "module.exports = {\n  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n};\n"
  },
  {
    "path": "darc-docs/blog/2019-05-28-first-blog-post.md",
    "content": "---\nslug: first-blog-post\ntitle: First Blog Post\nauthors:\n  name: Gao Wei\n  title: Docusaurus Core Team\n  url: https://github.com/wgao19\n  image_url: https://github.com/wgao19.png\ntags: [hola, docusaurus]\n---\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n"
  },
  {
    "path": "darc-docs/blog/2019-05-29-long-blog-post.md",
    "content": "---\nslug: long-blog-post\ntitle: Long Blog Post\nauthors: endi\ntags: [hello, docusaurus]\n---\n\nThis is the summary of a very long blog post,\n\nUse a `<!--` `truncate` `-->` comment to limit blog post size in the list view.\n\n<!--truncate-->\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet\n"
  },
  {
    "path": "darc-docs/blog/2021-08-01-mdx-blog-post.mdx",
    "content": "---\nslug: mdx-blog-post\ntitle: MDX Blog Post\nauthors: [slorber]\ntags: [docusaurus]\n---\n\nBlog posts support [Docusaurus Markdown features](https://docusaurus.io/docs/markdown-features), such as [MDX](https://mdxjs.com/).\n\n:::tip\n\nUse the power of React to create interactive blog posts.\n\n```js\n<button onClick={() => alert('button clicked!')}>Click me!</button>\n```\n\n<button onClick={() => alert('button clicked!')}>Click me!</button>\n\n:::\n"
  },
  {
    "path": "darc-docs/blog/2021-08-26-welcome/index.md",
    "content": "---\nslug: welcome\ntitle: Welcome\nauthors: [slorber, yangshun]\ntags: [facebook, hello, docusaurus]\n---\n\n[Docusaurus blogging features](https://docusaurus.io/docs/blog) are powered by the [blog plugin](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-blog).\n\nSimply add Markdown files (or folders) to the `blog` directory.\n\nRegular blog authors can be added to `authors.yml`.\n\nThe blog post date can be extracted from filenames, such as:\n\n- `2019-05-30-welcome.md`\n- `2019-05-30-welcome/index.md`\n\nA blog post folder can be convenient to co-locate blog post images:\n\n![Docusaurus Plushie](./docusaurus-plushie-banner.jpeg)\n\nThe blog supports tags as well!\n\n**And if you don't want a blog**: just delete this directory, and use `blog: false` in your Docusaurus config.\n"
  },
  {
    "path": "darc-docs/blog/authors.yml",
    "content": "endi:\n  name: Endilie Yacop Sucipto\n  title: Maintainer of Docusaurus\n  url: https://github.com/endiliey\n  image_url: https://github.com/endiliey.png\n\nyangshun:\n  name: Yangshun Tay\n  title: Front End Engineer @ Facebook\n  url: https://github.com/yangshun\n  image_url: https://github.com/yangshun.png\n\nslorber:\n  name: Sébastien Lorber\n  title: Docusaurus maintainer\n  url: https://sebastienlorber.com\n  image_url: https://github.com/slorber.png\n"
  },
  {
    "path": "darc-docs/docs/By-law Script/Getting Started.md",
    "content": "---\nsidebar_position: 1\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# Getting Started\n\n### By-law Script = JavaScript + Operator Overloading\n\nBy-law Script is the first programming language for describing the operations and rules for a DARC-based crypto company. It is a domain-specific language (DSL) that is designed to be easy to read and write, and to be used by non-programmers. It is based on JavaScript, and adds operator overloading to make it easier to write and read.\n\n### Setup\n\nThere are two ways to write and execute By-law Script programs. The first is to use the By-law Script IDE at [https://darc.app](https://darc.app), which is a web-based IDE that allows you to write, compile, and execute By-law Script programs. \n\nThe second is to use the darcjs SDK, which is a command-line tool that allows you to write By-law Script programs in a text editor and then compile and execute them.\n\nTo install darcjs, you can use npm:\n\n<Tabs>\n  <TabItem value=\"npm\" label=\"NPM\" default>\n\n```shell\nnpm install darcjs\n```\n\n  </TabItem>\n  <TabItem value=\"yarn\" label=\"YARN\">\n\n```shell\nyarn add darcjs\n```\n\n  </TabItem>\n  <TabItem value=\"pnpm\" label=\"PNPM\">\n\n```shell\npnpm install darcjs\n```\n\n  </TabItem>\n</Tabs>\n\nThen you can import darcjs and use `transpileAndRun()` to compile and execute By-law Script programs.\n\n```javascript\nimport { transpileAndRun, ethers } from 'darcjs';\n\nawait transpileAndRun(\n\n  // By-law Script code\n  `\n    batch_transfer_tokens(\n      [Address_B],  // the addresses of the recipients\n      [0],          // the token index\n      [100]);       // the amounts\n  `, \n\n  // signer\n  new ethers.Wallet( \n    YOUR_PRIVATE_KEY, \n    new ethers.providers.JsonRpcProvider( YOUR_JSON_RPC_PROVIDER_URL )\n  ),\n\n  // DARC address\n  \"0x123...\", \n\n  // DARC version\n  DARC_VERSION.Latest\n);\n```\n\n### Your first By-law Script program\n\nHere is a simple By-law Script program that defines the common stock of a company. Each share of common stock has voting weight 1 and dividend weight 1. This token class is called `token_0`, and the token index is 0.\n\n```javascript\nbatch_create_token_classes(\n  ['token_0'],  // token names\n  [0],          // token index\n  [1],          // voting weights\n  [1]);         // dividend weights\n```\n\nNext let's issue 1000 shares of `token_0` to the company's founder, 500 shares to Address_A, 400 shares to Address_B, and 100 shares to Address_C.\n\n```javascript\ncosnt Address_A = \"0x123...\";\ncosnt Address_B = \"0x51c...\";\ncosnt Address_C = \"0x374...\";\nbatch_mint_tokens(\n  [ Address_A, Address_B, Address_C],   // the addresses of the recipients\n  [0,0,0],                              // the token index\n  [500,400,100]);                       // the amounts\n```\n\nThen Address_A executes the following By-law Script on this DARC to transfer 100 shares of `token_0` to Address_B.\n\n```javascript\nbatch_transfer_tokens(\n  [Address_B],  // the addresses of the recipients\n  [0],          // the token index\n  [100]);       // the amounts\n```\n\nAs a customer, Address_D needs to pay 1000000 wei to the DARC for the service. The following By-law Script is executed by Address_D.\n\n```javascript\npay_cash(\n  1000000,  // the amount = 1000000 wei\n  0,        // the payment type = 0, the default native token\n  1);       // the dividendable flag, 1 means the payment is dividendable\n```\n\nFinally, Address_C wants to issue dividends to all token holders. The following By-law Script is executed by Address_C.\n\n```javascript\noffer_dividends();\n```\n\n### Package operations into a program\n\nThe above examples of code all execute single operations. For a program, it can contain multiple operations, and all operations will be executed sequentially, one after another. The advantage of doing this is that if an operator needs to execute a program and the program consists of multiple operations, it is necessary to ensure that all operations contained in this program are successfully approved for execution by voting, or the entire program is rejected as a whole.\n\nHere is the translation of the example you provided:\n\n**Address_E decides to invest in DARC. The investment agreement needs to complete four tasks**:\n\n1. Address_E pays 50000000 wei as venture capital.\n2. Address_E will receive 10000 shares of level-0 tokens (common stock).\n3. Address_E will receive 1 share of level-1 tokens (board seat).\n4. Address_E will receive 20000 shares of level-2 tokens (dividendable-only stock).\"\n\n\nFor the aforementioned four operations, we aspire for either all four operations to be simultaneously approved and successfully executed, or all four operations to be simultaneously rejected with none executed. For investor Address_E, it is absolutely undesirable to have a scenario where a single-operation program pays 50000000 wei to DARC, followed by the subsequent rejection of the three operations by the DARC manager. Therefore, in this scenario, the four operations must be bundled into a single program. If this program requires voting, the entire program must undergo the voting process. Upon rejection, Address_E will neither acquire shares nor a board seat, and the cash will be refunded to Address_E.\n\nBelow is a complete By-law Script Program containing the four operations mentioned above:\n  \n```javascript\n// pay 50000000 wei to DARC\npay_cash(\n  50000000,  // the amount = 50000000 wei\n  0,         // the payment type = 0, the default native token\n  0);        // the dividendable flag, 0 means the payment is non-dividendable\n\n// mint 10000 shares of level-0, \n// 1 share of level-1, \n// and 20000 shares of level-2 tokens to Address_E\nbatch_mint_tokens(\n  [Address_E, Address_E, Address_E],  // the addresses of the recipients\n  [0, 1, 2],                          // the token index\n  [10000, 1, 20000]);                 // the amounts\n\n```\n\nThis script encapsulates all the operations into a single program, ensuring that they are either all approved and executed successfully or all rejected without any execution. If the program requires voting, it must undergo the voting process as a whole. If rejected, Address_E will not obtain shares, a board seat, nor pay the cash, which will be refunded to Address_E.\n\n\n### Write By-law Script, just like writing JavaScript\n\nBy-law Script is based on JavaScript, so most of the syntax and grammar are the same as JavaScript, including the use of variables, constants, and functions. \n\nBelow is a batch script that paying cash to different addresses with different amounts. The amount is saved in a map, and the payment is executed in a loop. \n\n```javascript\nconst balance = new Map(\n  [\n    [address_X1, 1000000],\n    [address_X2, 2000000],\n    [address_X3, 3000000],\n    [address_X4, 4000000]\n  ]\n);\n\nfor (const [address, amount] of balance) {\n  batch_add_withdrawable_balances(   // if you don't want to package all operations into a batch operation\n    [address],  // the addresses of the recipients\n    [amount]);  // the amounts\n}\n```\n\n### Remember to add notes to the program\n\nWhen you write a By-law Script program, it is important to add notes to the program to explain the purpose of the program. This is especially important when the program requires voting. The notes will be displayed to the voters during the voting process, and will help them to understand the purpose of the program and make a decision.\n\nBy adding notes, you can just call the `setNote()` function in any place of the program. Below is an example of adding notes to the program.\n\n```javascript\nsetNote(\"Investment agreement for Address_E\");\n```\n\n### Your first Plugin-as-a-Law\n\nPlugin is the core mechanism of DARC and serves as its legal framework. All rules within DARC are based on the plugin system. By-law Script supports operator overload to make the composition and design of plugins simpler and more convenient. In By-law Script, each plugin is an object body. Below is the simplest example:\n\n```javascript\nconst plugin_0 = {\n  returnType: NO,                  // return type: NO\n  level: 3,                        // level 3\n  votingRuleIndex: 0,              // voting rule index, if voting is required\n  notes: \"disable all operations\", // the notes of the plugin\n  bIsEnabled: true,                // the plugin is enabled. this is the default value\n  bIsBeforeOperation: true,        // if the plugin is executed before the operation\n  conditionNodes: boolean_true()   // condition: always true\n},\n```\n\nIn the above plugin, we define conditionNodes with only one node, which is the object TRUE() we created. This plugin signifies that before any program or operation is executed, this plugin will be triggered. The returnType of this plugin is NO, indicating that whenever this plugin is triggered, it will be rejected. Therefore, when this plugin is successfully deployed in DARC, if no plugin of a higher level than level 3 is triggered to allow execution, then any operation will be rejected.\n\n\nOne of the most important features of By-law Script is its ability to use operator overloading to write condition nodes. Each condition node is an expression with parameters, and condition nodes are a series of expressions connected by logical operators such as AND, OR, and NOT. Therefore, by supporting operator overload at the transpiler level, developers can easily write condition nodes as triggering conditions for plugins. \n\nBelow is an example of composing plugins with condition nodes using operator overloading. It contains four plugins, establishing a set of rules for address_A to maintain a 20% non-dilutable ownership of the company's shares.\n\n```javascript\nconst plugin_before_op_1 = {\n  returnType: SANDBOX_NEEDED,                // return type: SANDBOX_NEEDED\n  level: 4,                                  // level 3\n  votingRuleIndex: 0,                        // voting rule index, if voting is required\n  notes: \"minting tokens should be checked\", // the notes of the plugin\n  bIsEnabled: true,                          // the plugin is enabled. this is the default value\n  bIsBeforeOperation: true,                  // if the plugin is executed before the operation\n  conditionNodes:\n    // if the operation is minting tokens or creating token classes                            \n    (operation_equals(EnumOpcode.BATCH_MINT_TOKENS) |  \n    operation_equals(EnumOpcode.BATCH_PAY_TO_MINT_TOKENS))\n\n    // and the token index is in range [0, 3], which means the token index is 0, 1, 2, or 3\n    & batch_op_any_token_class_in_range(0, 3)\n}\n\nconst plugin_after_op_1 = {\n  returnType: NO,\n  level: 6, \n  votingRuleIndex: 0,\n  notes: \"address_A must holds at least 20% of total voting and dividend weight\",\n  bIsEnabled: true,\n  bIsBeforeOperation: false,         // after-operation plugin\n  conditionNodes:\n\n    // if the address_A's voting weight percentage is less than 20%\n    // or the address_A's dividend weight percentage is less than 20%\n    address_voting_weight_percenrage_less_than(address_A, 20) \n    | address_dividend_weight_percenrage_less_than(address_A, 20)\n}\n\nconst plugin_before_op_2 = {\n  returnType: NO,\n  level: 6, \n  votingRuleIndex: 0,\n  notes: \"no one can disable before-op plugin 1,2,3 or after-op plugin 1\",\n  bIsEnabled: true,\n  bIsBeforeOperation: true,         // before-operation plugin\n  conditionNodes:\n\n    operation_equals(EnumOpcode.BATCH_DISABLE_PLUGINS)\n    & \n    （ disable_any_before_op_plugin_index_in_list([1,2,3])\n       | disable_any_after_op_plugin_index_in_list([1]) )\n    & not(operator_address_equals(address_A))\n}\n\nconst plugin_before_op_3 = {\n  returnType: YES_AND_SKIP_SANDBOX,\n  level: 7,\n  votingRuleIndex: 0,\n  notes: \"only address_A can disable before-op plugin 1,2,3 and after-op plugin 1\",\n  bIsEnabled: true,\n  bIsBeforeOperation: true,         // before-operation plugin\n  conditionNodes: \n    operation_equals(EnumOpcode.BATCH_DISABLE_PLUGINS)\n    & \n    （ disable_any_before_op_plugin_index_in_list([1,2,3])\n       | disable_any_after_op_plugin_index_in_list([1]) )\n    & operator_address_equals(address_A)\n}\n```\n\nIn the example provided, we have defined four plugins:\n\n1. The first plugin marks any operation as SANDBOX_NEEDED if it is either batch_mint_tokens or batch_pay_to_mint_tokens, and the token level is 0, 1, 2, or 3. This plugin ensures that any addition to the supply of tokens at these levels must undergo sandbox checks.\n\n2. The second plugin marks any operation as NO if, after the execution of any program, the total voting or total dividend rights of address_A fall below 20% in the sandbox. This ensures that address_A retains anti-dilution ownership of 20% of the total shares, regardless of how other operators increase share issuance.\n\n3. The third plugin directly rejects any operation that is batch_disable_plugins, and the disabled plugin indexes are 1, 2, 3 in the before-operation plugin list, or 1 in the after-operation plugin list, and the operator address is not equal to address_A. This plugin ensures that no one other than address_A can disable this set of four plugins, thereby securing the 20% non-dilutable ownership of address_A.\n\n4. The fourth plugin allows any operation that is batch_disable_plugins, and the disabled plugin indexes are 1, 2, 3 in the before-operation plugin list, or 1 in the after-operation plugin list, and the operator address is equal to address_A. This plugin ensures that this set of four plugins can be disabled by anyone other than address_A, allowing address_A to waive the anti-dilution feature of its ownership by disabling these four plugins.\n\nAfter the plugin is defined, it can be added to the plugin list of the DARC. Below is an example of adding the above four plugins to the plugin list of the DARC. Make sure that the existing before-operation plugin list only contains 1 plugin, and the existing after-operation plugin list also only contains 1 plugin.\n\n```javascript\nbatch_add_and_enable_plugins(\n  [plugin_before_op_1, plugin_after_op_1, plugin_before_op_2, plugin_before_op_3]);\n```\n\n### How does operator overloading work in By-law Script?\n\nThere are three types of condition nodes in the By-law Script, all of which are inherited from the base class `Node`\n\n1. Expression, a condition node that is a single expression with parameters, without any child nodes, such as `operator_address_equals(inputAddress)`.\n2. Logical operators(`and`, `or`, `not`), a condition node that is a series of expressions connected by logical operators.\n3. Boolean constants(`boolean_true`, `boolean_false`), a condition node that is a boolean constant.\n\nThe transpiler of By-law Script supports operator overloading for the base `Node` type with bit-and `&` and bit-or `|`, and will be overloaded to the logical operators `and` and `or` respectively. \n\nFor example, the following expression:\n\n```javascript\nexpression1() & (expression2() | expression3() ) & expression4()\n```\n\nwill be transpiled and overloaded to:\n\n```javascript\nand(\n  expression1(), \n  or(expression2(), expression3()),\n  expression4()\n)\n```\n\nSince each lower-case function is actually the wrapper of the constructor of the corresponding object, the above code is equivalent to the following code:\n\n```javascript\nnew AND(\n  new Expression1(), \n  new OR(new Expression2(), new Expression3()),\n  new Expression4()\n)\n```\n\nAnd when the condition nodes are set to plugin, the runtime will automatically serialize the tree-like structure of the condition nodes to the list of nodes(if the type of condition nodes value is `Node`), which is the actual format of the condition nodes in the plugin for DARC interface. The above example will be transpiled to (in pseudo-code):\n\n```javascript\n[\n  // node index 0: the root node, the AND node\n  {\n    nodeType: \"LOGICAL_OPERATOR\",\n    logialOperator: \"AND\",\n    childList: [1, 2, 5]\n  },\n\n  // node index 1: expression 1\n  {\n    nodeType: \"EXPRESSION\",\n    expression: \"expression1\"\n    param: {}\n    childList: []\n  },\n\n  // node index 2: OR node\n  {\n    nodeType: \"LOGICAL_OPERATOR\",\n    logialOperator: \"OR\",\n    childList: [3, 4]\n  },\n\n  // node index 3: expression 2\n  {\n    nodeType: \"EXPRESSION\",\n    expression: \"expression2\"\n    param: {}\n    childList: []\n  },\n\n  // node index 4: expression 3\n  {\n    nodeType: \"EXPRESSION\",\n    expression: \"expression3\"\n    param: {}\n    childList: []\n  },\n\n  // node index 5: expression 4\n  {\n    nodeType: \"EXPRESSION\",\n    expression: \"expression4\"\n    param: {}\n    childList: []\n  }\n]\n``` \n\nIn this way, the transpiler of By-law Script supports operator overloading for the condition nodes, and runtime generate the actual format of the condition nodes in the plugin for DARC interface.\n"
  },
  {
    "path": "darc-docs/docs/By-law Script/_category_.json",
    "content": "{\n  \"label\": \"By-law Script\",\n  \"position\": 3,\n  \"collapsed\": false,\n  \"collapsible\": false,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Everything about the By-law Script\"\n  }\n}\n"
  },
  {
    "path": "darc-docs/docs/DARC Protocol/Condition Nodes.md",
    "content": "---\nsidebar_position: 3\n---\n\n# Condition Nodes\n\n### What is a Condition Node?\n\nPlugins are the laws of the DARC protocol. Each plugin contains an array of condition nodes and a return type. Each condition node can be a condition expression, a logical operator, or a boolean value. The condition array can be reconstructed into a logical tree, representing the trigger conditions of the plugin. \n\nEach expression node is composed with a opcode(condition node ID) and one or a few parameters. The struct of the node parameter is defined as follows:\n\n```\nstruct NodeParam {\n  string[] STRING_ARRAY;\n  uint256[][] UINT256_2DARRAY;\n  address[][] ADDRESS_2DARRAY;\n  bytes BYTES;\n}\n```\n\n### Logical Operators\n\nThere are three logical operators in the DARC protocol: `AND`, `OR`, and `NOT`. The `AND` operator returns true if all of its children are true. The `OR` operator returns true if any of its children are true. The `NOT` operator returns true if its child is false. There must be at least one child for the `AND` and `OR` operators, and only one child for the `NOT` operator.\n\nIn both By-law Script and darc.js SDK, you can use the `and()`, `or()`, and `not()` wrapper functions to create the logical operators, for example:\n\nIn darc.js SDK:\n\n```ts\nimport {and, or, not, AND, OR, NOT} from 'darcjs';\n\nconst conditionTree = and(\n  or(\n    expression1(),\n    expression2()\n  ),\n\n  expression3(),\n\n  not(\n    expression4()\n  )\n);\n\n// or using the class constructor\nconst conditionTree = new And(\n  new OR(\n    expression1(),\n    expression2()\n  ),\n\n  expression3(),\n\n  new NOT(\n    expression4()\n  )\n);\n```\n\nIn By-law Script:\n\n```ts\nconst conditionTree = and(\n  or(\n    expression1(),\n    expression2()\n  ),\n\n  expression3(),\n\n  not(\n    expression4()\n  )\n);\n\n// or using the class constructor\nconst conditionTree = new AND(\n  new OR(\n    expression1(),\n    expression2()\n  ),\n\n  expression3(),\n\n  new NOT(\n    expression4()\n  )\n);\n```\n\nAlso you can use `|` for `OR`, `&` for `AND`, and `!` for `NOT` in By-law Script, and these operators will be parsed into the corresponding condition nodes. For example, the above By-law Script can be written as:\n\n```ts\nconst conditionTree = \n  expression1() & \n  ( expression2() | expression3() ) &\n  ( ! expression4() );\n```\n\n### Boolean Values\n\nThere are two boolean values in the DARC protocol: class `TRUE` and class `FALSE`, or wrapper function `boolean_true()` and `boolean_false()`. They are used to represent a boolean node in the condition tree.\n\n### Condition Expression\n\n1. There are multiple batch-operations, including:\n    - Batch Mint Tokens\n    - Batch Create Token Classes\n    - Batch Transfer Tokens\n    - Batch Transfer Tokens From To\n    - Batch Burn Tokens\n    - Batch Burn Tokens From\n    - Batch Add Membership\n    - Batch Suspend Membership\n    - Batch Resume Membership\n    - Batch Change Member Roles\n    - Batch Change Member Names\n    - Batch Add Plugins\n    - Batch Enable Plugins\n    - Batch Disable Plugins\n    - Batch Add and Enable Plugins\n    - Batch Set Parameters\n    - Batch Add Withdrawable Balances\n    - Batch Reduce Withdrawable Balances\n    - Batch Add Voting Rules\n    - Batch Pay to Mint Tokens\n    - Batch Pay to Transfer Tokens\n    - Batch Burn Tokens and Refund\n\nFor more details, please refer to [DARC Instruction Set Opcode Table(opcode.md)](OpCodes.md)\n\n2. Placeholders are reserved for future use.\n\n3. The range [staringValue, endingValue] is inclusive. For example, if the range is [1, 3], then the value 1, 2, 3 are all included.\n\n4. In the DARC protocol, all expressions are named with upper case, and in darc.js SDK and By-law Script, all expressions are named with lower case. For example, `OPERATOR_NAME_EQUALS` in the DARC protocol is `operator_name_equals` in darc.js SDK and By-law Script.\n\n| ID | Expression Name  | Parameter| Notes| Ready |\n|------------|------|------|-------| ---- |\n| 0  | UNDEFINED |  | Invalid Operation |\n| 1 | OPERATOR_NAME_EQUALS| STRING_ARRAY[0] operatorName  | The operator name is exactly the same as the given string |\n| 2 | OPERATOR_ROLE_EQUALS| UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is exactly the same as operatorRoleIndex |\n| 3 | OPERATOR_ADDRESS_EQUALS   | ADDRESS_2DARRAY[0][0] operatorAddress | The operator address equals operatorAddress|\n| 4 | OPERATOR_ROLE_GREATER_THAN | UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is greater than operatorRoleIndex|\n| 5 | OPERATOR_ROLE_LESS_THAN   | UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is less than operatorRoleIndex|\n| 6 | OPERATOR_ROLE_IN_RANGE| UINT256_2DARRAY[0][0] startingOperatorRoleIndex,  UINT256_2DARRAY[0][1] endingOperatorRoleIndex  | The operator role index is in the range of [startingOperatorRoleIndex, endingOperatorRoleIndex]|\n| 7 | OPERATOR_ROLE_IN_LIST | UINT256_2DARRAY[0] operatorRoleIndexArray| The operator role index is in the list of operatorRoleIndexArray|\n| 8 | OPERATOR_TOKEN_X_AMOUNT_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  | The operator has more than amount of token at tokenClass|\n| 9 | OPERATOR_TOKEN_X_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  ||\n| 10 | OPERATOR_TOKEN_X_AMOUNT_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startingAmount, UINT256_2DARRAY[0][2] endingAmount  | The operator has token amount in the range of [startingAmount, endingAmount] at tokenClass|\n| 11 | OPERATOR_TOKEN_X_AMOUNT_EQUALS| UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  | The operator has exactly amount of token at tokenClass|\n| 12 | OPERATOR_TOKEN_X_PERCENTAGE_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has more than percentage of token at tokenClass|\n| 13 | OPERATOR_TOKEN_X_PERCENTAGE_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has less than percentage of token at tokenClass|\n| 14 | OPERATOR_TOKEN_X_PERCENTAGE_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentageStartingValue,  UINT256_2DARRAY[0][2] percentageEndingValue  | The operator has token percentage in the range of [percentageStartingValue, percentageEndingValue] at tokenClass|\n| 15 | OPERATOR_TOKEN_X_PERCENTAGE_EQUALS| UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has exactly percentage of token at tokenClass|\n| 16 | OPERATOR_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0][0] amount  | The operator has more than amount of voting weight|\n| 17 | OPERATOR_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of voting weight|\n| 18 | OPERATOR_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has voting weight in the range of [startingAmount, endingAmount]|\n| 19 | OPERATOR_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has more than amount of dividend weight|\n| 20 | OPERATOR_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount  | The operator has less than amount of dividend weight|\n| 21 | OPERATOR_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has dividend weight in the range of [startingAmount, endingAmount]|\n| 22 | Placeholder22  |  |  |\n| 23 | Placeholder23  |  |  |\n| 24 | Placeholder24  |  |  |\n| 25 | OPERATOR_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount  | The operator has more than amount of withdrawable cash|\n| 26 | OPERATOR_WITHDRAWABLE_CASH_LESS_THAN   | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of withdrawable cash|\n| 27 | OPERATOR_WITHDRAWABLE_CASH_IN_RANGE| UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has withdrawable cash in the range of [startingAmount, endingAmount]|\n| 28 | OPERATOR_WITHDRAWABLE_DIVIDENDS_GREATER_THAN| UINT256_2DARRAY[0][0] amount  | The operator has more than amount of withdrawable dividends|\n| 29 | OPERATOR_WITHDRAWABLE_DIVIDENDS_LESS_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of withdrawable dividends|\n| 30 | OPERATOR_WITHDRAWABLE_DIVIDENDS_IN_RANGE   | UINT256_2DARRAY[0][0] amount  | The operator has withdrawable dividends in the range of [startingAmount, endingAmount]|\n| 31 | OPERATOR_ADDRESS_IN_LIST  | ADDRESS_2DARRAY[0] addressArray  | The operator address is in the list of addressArray|\n| 32 | Placeholder32  |  |  |\n| 33 | Placeholder33  |  |  |\n| 34 | Placeholder34  |  |  |\n| 35 | Placeholder35  |  |  |\n| 36 | Placeholder36  |  |  |\n| 37 | Placeholder37  |  |  |\n| 38 | Placeholder38  |  |  |\n| 39 | Placeholder39  |  |  |\n| 40 | Placeholder40  |  |  |\n| 41 | Placeholder41  |  |  |\n| 42 | Placeholder42  |  |  |\n| 43 | Placeholder43  |  |  |\n| 44 | Placeholder44  |  |  |\n| 45 | Placeholder45  |  |  |\n| 46 | Placeholder46  |  |  |\n| 47 | Placeholder47  |  |  |\n| 48 | Placeholder48  |  |  |\n| 49 | Placeholder49  |  |  |\n| 50 | Placeholder50  |  |  |\n| 51 | TIMESTAMP_GREATER_THAN | UINT256_2DARRAY[0][0] timestamp | The current timestamp is greater than timestamp|\n| 52 | TIMESTAMP_LESS_THAN | UINT256_2DARRAY[0][0] timestamp | The current timestamp is less than timestamp|\n| 53 | TIMESTAMP_IN_RANGE | UINT256_2DARRAY[0][0] startTimestamp, UINT256_2DARRAY[0][0] endTimestamp | The current timestamp is in the range of [startTimestamp, endTimestamp]|\n| 54 | DATE_YEAR_GREATER_THAN | UINT256_2DARRAY[0][0] year | The current year is greater than year|\n| 55 | DATE_YEAR_LESS_THAN | UINT256_2DARRAY[0][0] year | The current year is less than year|\n| 56 | DATE_YEAR_IN_RANGE | UINT256_2DARRAY[0][0] startYear, UINT256_2DARRAY[0][0] endYear | The current year is in the range of [startYear, endYear]|\n| 57 | DATE_MONTH_GREATER_THAN | UINT256_2DARRAY[0][0] month | The current month is greater than month|\n| 58 | DATE_MONTH_LESS_THAN | UINT256_2DARRAY[0][0] month | The current month is less than month|\n| 59 | DATE_MONTH_IN_RANGE | UINT256_2DARRAY[0][0] startMonth, UINT256_2DARRAY[0][0] endMonth | The current month is in the range of [startMonth, endMonth]|\n| 60 | DATE_DAY_GREATER_THAN | UINT256[0][0] day | The current day is greater than day|\n| 61 | DATE_DAY_LESS_THAN | UINT256[0][0] day | The current day is less than day|\n| 62 | DATE_DAY_IN_RANGE | UINT256[0][0] startDay, UINT256[0][0] endDay | The current day is in the range of [startDay, endDay]|\n| 63 | DATE_HOUR_GREATER_THAN | uint256 hour | The current hour is greater than hour|\n| 64 | DATE_HOUR_LESS_THAN | uint256 hour | The current hour is less than hour|\n| 65 | DATE_HOUR_IN_RANGE | uint256 startHour, uint256 endHour | The current hour is in the range of [startHour, endHour]|\n| 66 | ADDRESS_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has more than amount of voting weight|\n| 67 | ADDRESS_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has less than amount of voting weight|\n| 68 | ADDRESS_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has voting weight in the range of [startingAmount, endingAmount]|\n| 69 | ADDRESS_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has more than amount of dividend weight|\n| 70 | ADDRESS_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has less than amount of dividend weight|\n| 71 | ADDRESS_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] amount , ADDRESS_2DARRAY[0][0] address ||\n| 72 | ADDRESS_TOKEN_X_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 73 | ADDRESS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 74 | ADDRESS_TOKEN_X_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 75 | TOTAL_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0][0] amount  ||\n| 76 | TOTAL_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount  ||\n| 77 | TOTAL_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] amount  ||\n| 78 | TOTAL_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount  ||\n| 79 | TOTAL_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount  ||\n| 80 | TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] amount  ||\n| 81 | TOTAL_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 82 | TOTAL_CASH_LESS_THAN   | UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 83 | TOTAL_CASH_IN_RANGE| UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 84 | TOTAL_CASH_EQUALS| UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 85 | TOKEN_IN_LIST_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 86 | TOKEN_IN_LIST_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 87 | TOKEN_IN_LIST_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] startAmount, UINT256_2DARRAY[1][1] endAmount  ||\n| 88 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 89 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 90 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 91 | TOKEN_IN_LIST_AMOUNT_GREATER_THAN   | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 92 | TOKEN_IN_LIST_AMOUNT_LESS_THAN | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 93 | TOKEN_IN_LIST_AMOUNT_IN_RANGE  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 94 | TOKEN_IN_LIST_AMOUNT_EQUALS| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 95 | ADDRESS_VOTING_WEIGHT_PERCENTAGE_GREATER_THAN| UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 96 | ADDRESS_VOTING_WEIGHT_PERCENTAGE_LESS_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 97 | ADDRESS_VOTING_WEIGHT_PERCENTAGE_IN_RANGE   | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 98 | ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_GREATER_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 99 | ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_LESS_THAN| UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 100 | ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_IN_RANGE | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 101 | Placeholder101  |  |  |\n| 102 | Placeholder102  |  |  |\n| 103 | Placeholder103  |  |  |\n| 104 | Placeholder104  |  |  |\n| 105 | Placeholder105  |  |  |\n| 106 | Placeholder106  |  |  |\n| 107 | Placeholder107  |  |  |\n| 108 | Placeholder108  |  |  |\n| 109 | Placeholder109  |  |  |\n| 110 | Placeholder110  |  |  |\n| 111 | Placeholder111  |  |  |\n| 112 | Placeholder112  |  |  |\n| 113 | Placeholder113  |  |  |\n| 114 | Placeholder114  |  |  |\n| 115 | Placeholder115  |  |  |\n| 116 | Placeholder116  |  |  |\n| 117 | Placeholder117  |  |  |\n| 118 | Placeholder118  |  |  |\n| 119 | Placeholder119  |  |  |\n| 120 | Placeholder120  |  |  |\n| 121 | Placeholder121  |  |  |\n| 122 | Placeholder122  |  |  |\n| 123 | Placeholder123  |  |  |\n| 124 | Placeholder124  |  |  |\n| 125 | Placeholder125  |  |  |\n| 126 | Placeholder126  |  |  |\n| 127 | Placeholder127  |  |  |\n| 128 | Placeholder128  |  |  |\n| 129 | Placeholder129  |  |  |\n| 130 | Placeholder130  |  |  |\n| 131 | Placeholder131  |  |  |\n| 132 | Placeholder132  |  |  |\n| 133 | Placeholder133  |  |  |\n| 134 | Placeholder134  |  |  |\n| 135 | Placeholder135  |  |  |\n| 136 | Placeholder136  |  |  |\n| 137 | Placeholder137  |  |  |\n| 138 | Placeholder138  |  |  |\n| 139 | Placeholder139  |  |  |\n| 140 | Placeholder140  |  |  |\n| 141 | Placeholder141  |  |  |\n| 142 | Placeholder142  |  |  |\n| 143 | Placeholder143  |  |  |\n| 144 | Placeholder144  |  |  |\n| 145 | Placeholder145  |  |  |\n| 146 | Placeholder146  |  |  |\n| 147 | Placeholder147  |  |  |\n| 148 | Placeholder148  |  |  |\n| 149 | Placeholder149  |  |  |\n| 150 | Placeholder150  |  |  |\n| 151 | OPERATION_EQUALS | uint256 value ||\n| 152 | OPERATION_IN_LIST | uint256[] values ||\n| 153 | Placeholder153  |  |  |\n| 154 | Placeholder154  |  |  |\n| 155 | Placeholder155  |  |  |\n| 156 | Placeholder156  |  |  |\n| 157 | Placeholder157  |  |  |\n| 158 | Placeholder158  |  |  |\n| 159 | Placeholder159  |  |  |\n| 160 | Placeholder160  |  |  |\n| 161 | Placeholder161  |  |  |\n| 162 | Placeholder162  |  |  |\n| 163 | Placeholder163  |  |  |\n| 164 | Placeholder164  |  |  |\n| 166 | Placeholder166  |  |  |\n| 167 | Placeholder167  |  |  |\n| 168 | Placeholder168  |  |  |\n| 169 | Placeholder169  |  |  |\n| 170 | Placeholder170  |  |  |\n| 171 | Placeholder171  |  |  |\n| 172 | Placeholder172  |  |  |\n| 173 | Placeholder173  |  |  |\n| 174 | Placeholder174  |  |  |\n| 175 | Placeholder175  |  |  |\n| 176 | Placeholder176  |  |  |\n| 177 | Placeholder177  |  |  |\n| 178 | Placeholder178  |  |  |\n| 179 | Placeholder179  |  |  |\n| 180 | Placeholder180  |  |  |\n| 181 | EXTERNAL_CALL_UINT256_RESULT_EQUALS | ADDRESS_2DARRAY[0][0] externalAddress, BYTES encodedParameters, UINT256_2DARRAY[0][0] value || NOT READY, DO NOT USE\n| 182 | EXTERNAL_CALL_UINT256_RESULT_GREATER_THAN | sADDRESS_2DARRAY[0][0] externalAddress, BYTES encodedParameters, UINT256_2DARRAY[0][0] value || NOT READY, DO NOT USE\n| 183 | EXTERNAL_CALL_UINT256_RESULT_LESS_THAN | ADDRESS_2DARRAY[0][0] externalAddress, BYTES encodedParameters, UINT256_2DARRAY[0][0] value || NOT READY, DO NOT USE\n| 184 | EXTERNAL_CALL_UINT256_RESULT_IN_RANGE | ADDRESS_2DARRAY[0][0] externalAddress, BYTES encodedParameters, UINT256_2DARRAY[0][0] minValue, UINT256_2DARRAY[0][1] maxValue || NOT READY, DO NOT USE\n| 185 | EXTERNAL_CALL_STRING_RESULT_EQUALS | string external, string method, string[] args, string expectedValue || NOT READY, DO NOT USE\n| 186 | Placeholder186  |  |  |\n| 187 | Placeholder187  |  |  |\n| 188 | Placeholder188  |  |  |\n| 189 | Placeholder189  |  |  |\n| 190 | Placeholder190  |  |  |\n| 191 | Placeholder191  |  |  |\n| 192 | Placeholder192  |  |  |\n| 193 | Placeholder193  |  |  |\n| 194 | Placeholder194  |  |  |\n| 195 | Placeholder195  |  |  |\n| 196 | Placeholder196  |  |  |\n| 197 | Placeholder197  |  |  |\n| 198 | Placeholder198  |  |  |\n| 199 | Placeholder199  |  |  |\n| 200 | Placeholder200  |  |  |\n| 201 | Placeholder201  |  |  |\n| 202 | Placeholder202  |  |  |\n| 203 | Placeholder203  |  |  |\n| 204 | Placeholder204  |  |  |\n| 205 | Placeholder205  |  |  |\n| 206 | Placeholder206  |  |  |\n| 207 | Placeholder207  |  |  |\n| 208 | Placeholder208  |  |  |\n| 209 | Placeholder209  |  |  |\n| 210 | Placeholder210  |  |  |\n| 211 | BATCH_OP_SIZE_GREATER_THAN | UINT256_2DARRAY[0][0] batchSize ||\n| 212 | BATCH_OP_SIZE_LESS_THAN | UINT256_2DARRAY[0][0] batchSize ||\n| 213 | BATCH_OP_SIZE_IN_RANGE | UINT256_2DARRAY[0][0] startBatchSize, UINT256_2DARRAY[0][0] endBatchSize ||\n| 214 | BATCH_OP_SIZE_EQUALS | UINT256_2DARRAY[0][0] batchSize ||\n| 215 | BATCH_OP_EACH_TARGET_ADDRESSES_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 216 | BATCH_OP_EACH_TARGET_ADDRESSES_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 217 | BATCH_OP_EACH_TARGET_ADDRESSES_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 218 | BATCH_OP_ANY_TARGET_ADDRESS_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 219 | BATCH_OP_ANY_TARGET_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 220 | BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 221 | BATCH_OP_EACH_TARGET_ADDRESS_TO_ITSELF |  ||\n| 222 | BATCH_OP_ANY_TARGET_ADDRESS_TO_ITSELF |  ||\n| 223 | BATCH_OP_EACH_SOURCE_ADDRESS_EQUALS | ADDRESS_2DARRAY[0][0] sourceAddress ||\n| 224 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] sourceAddressArray ||\n| 225 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 226 | BATCH_OP_ANY_SOURCE_ADDRESS_EQUAL | ADDRESS_2DARRAY[0][0] sourceAddress ||\n| 227 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] sourceAddressArray ||\n| 228 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 229 | BATCH_OP_EACH_SOURCE_ADDRESS_FROM_ITSELF |  ||\n| 230 | BATCH_OP_ANY_SOURCE_ADDRESS_FROM_ITSELF |  |\n| 231 | BATCH_OP_EACH_TOKEN_CLASS_EQUALS | UINT256_2DARRAY[0][0] tokenClass ||\n| 232 | BATCH_OP_EACH_TOKEN_CLASS_IN_LIST | UINT256_2DARRAY[0] tokenClassArray ||\n| 233 | BATCH_OP_EACH_TOKEN_CLASS_IN_RANGE | UINT256_2DARRAY[0][0] startTokenClass, UINT256_2DARRAY[0][0] endTokenClass ||\n| 234 | BATCH_OP_EACH_TOKEN_CLASS_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 235 | BATCH_OP_EACH_TOKEN_CLASS_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 236 | BATCH_OP_TOTAL_TOKEN_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 237 | BATCH_OP_TOTAL_TOKEN_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 238 | BATCH_OP_TOTAL_TOKEN_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 239 | BATCH_OP_TOTAL_TOKEN_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 240 | BATCH_OP_ANY_TOKEN_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 241 | BATCH_OP_ANY_TOKEN_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 242 | BATCH_OP_ANY_TOKEN_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 243 | BATCH_OP_ANY_TOKEN_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 244 | BATCH_OP_ANY_TOKEN_CLASS_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 245 | BATCH_OP_ANY_TOKEN_CLASS_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 246 | BATCH_OP_ANY_TOKEN_CLASS_IN_RANGE | UINT256_2DARRAY[0][0] startTokenClass, UINT256_2DARRAY[0][0] endTokenClass ||\n| 247 | BATCH_OP_ANY_TOKEN_CLASS_EQUALS | UINT256_2DARRAY[0][0] tokenClass ||\n| 248 | BATCH_OP_ANY_TOKEN_CLASS_IN_LIST | UINT256_2DARRAY[0] tokenClassArray ||\n| 249 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 250 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 251 | BATCH_OP_EACH_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 252 | BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 253 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 254 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 255 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 256 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 257 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 258 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 259 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 260 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 261 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 262 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 263 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 264 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 265 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 266 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 267 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 268 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 269 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 270 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 271 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 272 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 273 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount ||\n| 274 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount ||\n| 275 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startAmount, UINT256_2DARRAY[0][2] endAmount ||\n| 276 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount |\n| 277 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount |\n| 278 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startAmount, UINT256_2DARRAY[0][2] endAmount |\n| 279 | Placeholder279  |  |  |\n| 280 | Placeholder280  |  |  |\n| 281 | Placeholder281  |  |  |\n| 282 | Placeholder282  |  |  |\n| 283 | Placeholder283  |  |  |\n| 284 | Placeholder284  |  |  |\n| 285 | Placeholder285  |  |  |\n| 286 | Placeholder286  |  |  |\n| 287 | Placeholder287  |  |  |\n| 288 | Placeholder288  |  |  |\n| 289 | Placeholder289  |  |  |\n| 290 | Placeholder290  |  |  |\n| 291 | Placeholder291  |  |  |\n| 292 | Placeholder292  |  |  |\n| 293 | Placeholder293  |  |  |\n| 294 | Placeholder294  |  |  |\n| 295 | Placeholder295  |  |  |\n| 296 | Placeholder296  |  |  |\n| 297 | Placeholder297  |  |  |\n| 298 | Placeholder298  |  |  |\n| 299 | Placeholder299  |  |  |\n| 300 | Placeholder300  |  |  |\n| 301 | ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 302 | ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 303 | ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0][0] startPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 304 | ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 305 | DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 306 | DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation. \n| 307 | DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 308 | DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 309 | ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 310 | ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 311 | ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 312 | ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 313 | DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation. \n| 314 | DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 315 | DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 316 | DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 317 | ARE_ALL_PLUGINS_BEFORE_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 318 | ARE_ALL_PLUGINS_AFTER_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 319 | IS_ANY_PLUGIN_BEFORE_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 320 | IS_ANY_PLUGIN_AFTER_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 321 | ADD_PLUGIN_ANY_LEVEL_EQUALS | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 322 | ADD_PLUGIN_ANY_LEVEL_IN_LIST | UINT256_2DARRAY[0] pluginIndexList ||\n| 323 | ADD_PLUGIN_ANY_LEVEL_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][0] endPluginIndex, UINT256_2DARRAY[0][0] level ||\n| 324 | ADD_PLUGIN_ANY_LEVEL_GREATER_THAN | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 325 | ADD_PLUGIN_ANY_LEVEL_LESS_THAN | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 326 | ADD_PLUGIN_ANY_RETURN_TYPE_EQUALS | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] returnType ||\n| 327 | ADD_PLUGIN_ANY_VOTING_RULE_INDEX_IN_LIST |  UINT256_2DARRAY[0] votingRuleIndexList ||\n| 328 | Placeholder320  |  |  |\n| 321 | Placeholder321  |  |  |\n| 322 | Placeholder322  |  |  |\n| 323 | Placeholder323  |  |  |\n| 324 | Placeholder324  |  |  |\n| 325 | Placeholder325  |  |  |\n| 326 | Placeholder326  |  |  |\n| 327 | Placeholder327  |  |  |\n| 328 | Placeholder328  |  |  |\n| 329 | Placeholder329  |  |  |\n| 330 | Placeholder330  |  |  |\n| 331 | Placeholder331  |  |  |\n| 332 | Placeholder332  |  |  |\n| 333 | Placeholder333  |  |  |\n| 334 | Placeholder334  |  |  |\n| 335 | Placeholder335  |  |  |\n| 336 | Placeholder336  |  |  |\n| 337 | Placeholder337  |  |  |\n| 338 | Placeholder338  |  |  |\n| 339 | Placeholder339  |  |  |\n| 340 | Placeholder340  |  |  |\n| 341 | Placeholder341  |  |  |\n| 342 | Placeholder342  |  |  |\n| 343 | Placeholder343  |  |  |\n| 344 | Placeholder344  |  |  |\n| 345 | Placeholder345  |  |  |\n| 346 | Placeholder346  |  |  |\n| 347 | Placeholder347  |  |  |\n| 348 | Placeholder348  |  |  |\n| 349 | Placeholder349  |  |  |\n| 350 | Placeholder350  |  |  |\n| 351 | Placeholder351  |  |  |\n| 352 | Placeholder352  |  |  |\n| 353 | Placeholder353  |  |  |\n| 354 | Placeholder354  |  |  |\n| 355 | Placeholder355  |  |  |\n| 356 | Placeholder356  |  |  |\n| 357 | Placeholder357  |  |  |\n| 358 | Placeholder358  |  |  |\n| 359 | Placeholder359  |  |  |\n| 360 | Placeholder360  |  |  |\n| 361 | Placeholder361  |  |  |\n| 362 | Placeholder362  |  |  |\n| 363 | Placeholder363  |  |  |\n| 364 | Placeholder364  |  |  |\n| 365 | Placeholder365  |  |  |\n| 366 | Placeholder366  |  |  |\n| 367 | Placeholder367  |  |  |\n| 368 | Placeholder368  |  |  |\n| 369 | Placeholder369  |  |  |\n| 370 | Placeholder370  |  |  |\n| 371 | ADD_ANY_VOTING_RULE_IS_ABSOLUTE_MAJORITY |  ||\n| 372 | ADD_ANY_VOTING_RULE_APPROVAL_PERCENTAGE_IN_RANGE | UINT256_2DARRAY[0][0] startPercentage, UINT256_2DARRAY[0][1] endPercentage ||\n| 373 | ADD_ANY_VOTING_RULE_TOKEN_CLASS_CONTAINS | UINT256_2DARRAY[0][0] tokenClass ||\n| 374 | Placeholder374  |  |  |\n| 375 | Placeholder375  |  |  |\n| 376 | Placeholder376  |  |  |\n| 377 | Placeholder377  |  |  |\n| 378 | Placeholder378  |  |  |\n| 379 | Placeholder379  |  |  |\n| 380 | Placeholder380  |  |  |\n| 381 | Placeholder381  |  |  |\n| 382 | Placeholder382  |  |  |\n| 383 | Placeholder383  |  |  |\n| 384 | Placeholder384  |  |  |\n| 385 | Placeholder385  |  |  |\n| 386 | Placeholder386  |  |  |\n| 387 | Placeholder387  |  |  |\n| 388 | Placeholder388  |  |  |\n| 389 | Placeholder389  |  |  |\n| 390 | Placeholder390  |  |  |\n| 391 | Placeholder391  |  |  |\n| 392 | Placeholder392  |  |  |\n| 393 | Placeholder393  |  |  |\n| 394 | Placeholder394  |  |  |\n| 395 | Placeholder395  |  |  |\n| 396 | Placeholder396  |  |  |\n| 397 | Placeholder397  |  |  |\n| 398 | Placeholder398  |  |  |\n| 399 | Placeholder399  |  |  |\n| 400 | Placeholder400  |  |  |\n| 401 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 402 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 403 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_RANGE | ADDRESS_2DARRAY[0][0] startTargetAddress, ADDRESS_2DARRAY[0][1] endTargetAddress ||\n| 404 | Placeholder404  |  |  |\n| 405 | Placeholder405  |  |  |\n| 406 | CHANGE_MEMBER_NAME_TO_ANY_STRING_IN_LIST | STRING_ARRAY nameList ||\n| 407 | CHANGE_MEMBER_NAME_TO_ANY_STRING_CONTAINS | STRING_ARRAY[0] subString ||\n| 408 | Placeholder408  |  |  |\n| 409 | Placeholder409  |  |  |\n| 410 | Placeholder410  |  |  |\n| 411 | Placeholder411  |  |  |\n| 412 | Placeholder412  |  |  |\n| 413 | Placeholder413  |  |  |\n| 414 | Placeholder414  |  |  |\n| 415 | Placeholder415  |  |  |\n| 416 | Placeholder416  |  |  |\n| 417 | Placeholder417  |  |  |\n| 418 | Placeholder418  |  |  |\n| 419 | Placeholder419  |  |  |\n| 420 | Placeholder420  |  |  |\n| 421 | Placeholder421  |  |  |\n| 422 | Placeholder422  |  |  |\n| 423 | Placeholder423  |  |  |\n| 424 | Placeholder424  |  |  |\n| 425 | Placeholder425  |  |  |\n| 426 | Placeholder426  |  |  |\n| 427 | Placeholder427  |  |  |\n| 428 | Placeholder428  |  |  |\n| 429 | Placeholder429  |  |  |\n| 430 | Placeholder430  |  |  |\n| 431 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 432 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 433 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 434 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 435 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 436 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 437 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 438 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 439 | Placeholder439  |  |  |\n| 440 | Placeholder440  |  |  |\n| 441 | Placeholder441  |  |  |\n| 442 | Placeholder442  |  |  |\n| 443 | Placeholder443  |  |  |\n| 444 | Placeholder444  |  |  |\n| 445 | Placeholder445  |  |  |\n| 446 | Placeholder446  |  |  |\n| 447 | Placeholder447  |  |  |\n| 448 | Placeholder448  |  |  |\n| 449 | Placeholder449  |  |  |\n| 450 | Placeholder450  |  |  |\n| 451 | Placeholder451  |  |  |\n| 452 | Placeholder452  |  |  |\n| 453 | Placeholder453  |  |  |\n| 454 | Placeholder454  |  |  |\n| 455 | Placeholder455  |  |  |\n| 456 | Placeholder456  |  |  |\n| 457 | Placeholder457  |  |  |\n| 458 | Placeholder458  |  |  |\n| 459 | Placeholder459  |  |  |\n| 460 | Placeholder460  |  |  |\n| 461 | TOKEN_X_OP_ANY_PRICE_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 462 | TOKEN_X_OP_ANY_PRICE_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 463 | TOKEN_X_OP_ANY_PRICE_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startPrice, UINT256_2DARRAY[0][2] endPrice | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 464 | TOKEN_X_OP_ANY_PRICE_EQUALS | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 465 | TOKEN_X_OP_ANY_PRICE_GREATER_THAN_EXTERNAL_VALUE_UINT256 | UINT256_2DARRAY[0][0] tokenClass, ADDRESS_2DARRAY[0][0] externalContractAddress, BYTES abiEncodedParameters | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 466 | TOKEN_X_OP_ANY_PRICE_LESS_THAN_EXTERNAL_VALUE_UINT256 | UINT256_2DARRAY[0][0] tokenClass, ADDRESS_2DARRAY[0][0] externalContractAddress, BYTES abiEncodedParameters | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 467 | TOKEN_X_OP_ANY_PRICE_EQUALS_EXTERNAL_VALUE_UINT256 | UINT256_2DARRAY[0][0] tokenClass, ADDRESS_2DARRAY[0][0] externalContractAddress, BYTES abiEncodedParameters | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 468 | Placeholder468  |  |  |\n| 469 | Placeholder469  |  |  |\n| 470 | Placeholder470  |  |  |\n| 471 | Placeholder471  |  |  |\n| 472 | Placeholder472  |  |  |\n| 473 | Placeholder473  |  |  |\n| 474 | Placeholder474  |  |  |\n| 475 | Placeholder475  |  |  |\n| 476 | Placeholder476  |  |  |\n| 477 | Placeholder477  |  |  |\n| 478 | Placeholder478  |  |  |\n| 479 | Placeholder479  |  |  |\n| 480 | Placeholder480  |  |  |\n| 481 | Placeholder481  |  |  |\n| 482 | Placeholder482  |  |  |\n| 483 | Placeholder483  |  |  |\n| 484 | Placeholder484  |  |  |\n| 485 | Placeholder485  |  |  |\n| 486 | Placeholder486  |  |  |\n| 487 | Placeholder487  |  |  |\n| 488 | Placeholder488  |  |  |\n| 489 | Placeholder489  |  |  |\n| 490 | Placeholder490  |  |  |\n| 491 | Placeholder491  |  |  |\n| 492 | Placeholder492  |  |  |\n| 493 | Placeholder493  |  |  |\n| 494 | Placeholder494  |  |  |\n| 495 | Placeholder495  |  |  |\n| 496 | Placeholder496  |  |  |\n| 497 | Placeholder497  |  |  |\n| 498 | Placeholder498  |  |  |\n| 499 | Placeholder499  |  |  |\n| 500 | Placeholder500 |  |  |\n| 501 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 502 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 503 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0]startWeight, UINT256_2DARRAY[0][1] endWeight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 504 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 505 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 506 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 507 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0]  startWeight, UINT256_2DARRAY[0][1] endWeight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 508 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 509 | Placeholder509 |  |  |\n| 510 | Placeholder510 |  |  |\n| 511 | Placeholder511 |  |  |\n| 512 | Placeholder512 |  |  |\n| 513 | Placeholder513 |  |  |\n| 514 | Placeholder514 |  |  |\n| 515 | Placeholder515 |  |  |\n| 516 | Placeholder516 |  |  |\n| 517 | Placeholder517 |  |  |\n| 518 | Placeholder518 |  |  |\n| 519 | Placeholder519 |  |  |\n| 520 | Placeholder520 |  |  |\n| 521 | Placeholder521 |  |  |\n| 522 | Placeholder522 |  |  |\n| 523 | Placeholder523 |  |  |\n| 524 | Placeholder524 |  |  |\n| 525 | Placeholder525 |  |  |\n| 526 | Placeholder526 |  |  |\n| 527 | Placeholder527 |  |  |\n| 528 | Placeholder528 |  |  |\n| 529 | Placeholder529 |  |  |\n| 530 | Placeholder530 |  |  |\n| 531 | Placeholder531 |  |  |\n| 532 | Placeholder532 |  |  |\n| 533 | Placeholder533 |  |  |\n| 534 | Placeholder534 |  |  |\n| 535 | Placeholder535 |  |  |\n| 536 | Placeholder536 |  |  |\n| 537 | Placeholder537 |  |  |\n| 538 | Placeholder538 |  |  |\n| 539 | Placeholder539 |  |  |\n| 540 | Placeholder540 |  |  |\n| 541 | Placeholder541 |  |  |\n| 542 | Placeholder542 |  |  |\n| 543 | Placeholder543 |  |  |\n| 544 | Placeholder544 |  |  |\n| 545 | Placeholder545 |  |  |\n| 546 | Placeholder546 |  |  |\n| 547 | Placeholder547 |  |  |\n| 548 | Placeholder548 |  |  |\n| 549 | Placeholder549 |  |  |\n| 550 | Placeholder550 |  |  |\n| 551 | Placeholder551 |  |  |\n| 552 | Placeholder552 |  |  |\n| 553 | Placeholder553 |  |  |\n| 554 | Placeholder554 |  |  |\n| 555 | Placeholder555 |  |  |\n| 556 | Placeholder556 |  |  |\n| 557 | Placeholder557 |  |  |\n| 558 | Placeholder558 |  |  |\n| 559 | Placeholder559 |  |  |\n| 560 | Placeholder560 |  |  |\n| 561 | Placeholder561 |  |  |\n| 562 | Placeholder562 |  |  |\n| 563 | Placeholder563 |  |  |\n| 564 | Placeholder564 |  |  |\n| 565 | Placeholder565 |  |  |\n| 566 | Placeholder566 |  |  |\n| 567 | Placeholder567 |  |  |\n| 568 | Placeholder568 |  |  |\n| 569 | Placeholder569 |  |  |\n| 570 | Placeholder570 |  |  |\n| 571 | Placeholder571 |  |  |\n| 572 | Placeholder572 |  |  |\n| 573 | Placeholder573 |  |  |\n| 574 | Placeholder574 |  |  |\n| 575 | Placeholder575 |  |  |\n| 576 | Placeholder576 |  |  |\n| 577 | Placeholder577 |  |  |\n| 578 | Placeholder578 |  |  |\n| 579 | Placeholder579 |  |  |\n| 580 | Placeholder580 |  |  |\n| 581 | Placeholder581 |  |  |\n| 582 | Placeholder582 |  |  |\n| 583 | Placeholder583 |  |  |\n| 584 | Placeholder584 |  |  |\n| 585 | Placeholder585 |  |  |\n| 586 | Placeholder586 |  |  |\n| 587 | Placeholder587 |  |  |\n| 588 | Placeholder588 |  |  |\n| 589 | Placeholder589 |  |  |\n| 590 | Placeholder590 |  |  |\n| 591 | Placeholder591 |  |  |\n| 592 | Placeholder592 |  |  |\n| 593 | Placeholder593 |  |  |\n| 594 | Placeholder594 |  |  |\n| 595 | Placeholder595 |  |  |\n| 596 | Placeholder596 |  |  |\n| 597 | Placeholder597 |  |  |\n| 598 | Placeholder598 |  |  |\n| 599 | Placeholder599 |  |  |\n| 600 | Placeholder600 |  |  |\n| 601 | PROGRAM_OP_LENGTH_GREATER_THAN | UINT256_2DARRAY[0][0] length ||\n| 602 | PROGRAM_OP_LENGTH_LESS_THAN | UINT256_2DARRAY[0][0] length ||\n| 603 | PROGRAM_OP_LENGTH_IN_RANGE | UINT256_2DARRAY[0][0] startLength, UINT256_2DARRAY[0][1] endLength ||\n| 604 | PROGRAM_OP_LENGTH_EQUALS | UINT256_2DARRAY[0][0] length ||\n| 605 | PROGRAM_CONTAINS_OP | UINT256_2DARRAY[0][0] opCode ||\n| 606 | PROGRAM_CONTAINS_OP_IN_LIST | UINT256_2DARRAY[0] opCodeList ||\n| 607 | PROGRAM_EVERY_OP_EQUALS | UINT256_2DARRAY[0][0] opCode ||\n| 608 | PROGRAM_EVERY_OP_IN_LIST | UINT256_2DARRAY[0] opCodeList ||\n| 609 | Placeholder609 |  |  |\n| 610 | Placeholder610 |  |  |\n| 611 | Placeholder611 |  |  |\n| 612 | Placeholder612 |  |  |\n| 613 | Placeholder613 |  |  |\n| 614 | Placeholder614 |  |  |\n| 615 | Placeholder615 |  |  |\n| 616 | Placeholder616 |  |  |\n| 617 | Placeholder617 |  |  |\n| 618 | Placeholder618 |  |  |\n| 619 | Placeholder619 |  |  |\n| 620 | Placeholder620 |  |  |\n| 621 | Placeholder621 |  |  |\n| 622 | Placeholder622 |  |  |\n| 623 | Placeholder623 |  |  |\n| 624 | Placeholder624 |  |  |\n| 625 | Placeholder625 |  |  |\n| 626 | Placeholder626 |  |  |\n| 627 | Placeholder627 |  |  |\n| 628 | Placeholder628 |  |  |\n| 629 | Placeholder629 |  |  |\n| 630 | Placeholder630 |  |  |\n| 631 | Placeholder631 |  |  |\n| 632 | Placeholder632 |  |  |\n| 633 | Placeholder633 |  |  |\n| 634 | Placeholder634 |  |  |\n| 635 | Placeholder635 |  |  |\n| 636 | Placeholder636 |  |  |\n| 637 | Placeholder637 |  |  |\n| 638 | Placeholder638 |  |  |\n| 639 | Placeholder639 |  |  |\n| 640 | Placeholder640 |  |  |\n| 641 | Placeholder641 |  |  |\n| 642 | Placeholder642 |  |  |\n| 643 | Placeholder643 |  |  |\n| 644 | Placeholder644 |  |  |\n| 645 | Placeholder645 |  |  |\n| 646 | Placeholder646 |  |  |\n| 647 | Placeholder647 |  |  |\n| 648 | Placeholder648 |  |  |\n| 649 | Placeholder649 |  |  |\n| 650 | Placeholder650 |  |  |\n| 651 | Placeholder651 |  |  |\n| 652 | Placeholder652 |  |  |\n| 653 | Placeholder653 |  |  |\n| 654 | Placeholder654 |  |  |\n| 655 | Placeholder655 |  |  |\n| 656 | Placeholder656 |  |  |\n| 657 | Placeholder657 |  |  |\n| 658 | Placeholder658 |  |  |\n| 659 | Placeholder659 |  |  |\n| 660 | Placeholder660 |  |  |\n| 661 | Placeholder661 |  |  |\n| 662 | Placeholder662 |  |  |\n| 663 | Placeholder663 |  |  |\n| 664 | Placeholder664 |  |  |\n| 665 | Placeholder665 |  |  |\n| 666 | Placeholder666 |  |  |\n| 667 | Placeholder667 |  |  |\n| 668 | Placeholder668 |  |  |\n| 669 | Placeholder669 |  |  |\n| 670 | Placeholder670 |  |  |\n| 671 | Placeholder671 |  |  |\n| 672 | Placeholder672 |  |  |\n| 673 | Placeholder673 |  |  |\n| 674 | Placeholder674 |  |  |\n| 675 | Placeholder675 |  |  |\n| 676 | Placeholder676 |  |  |\n| 677 | Placeholder677 |  |  |\n| 678 | Placeholder678 |  |  |\n| 679 | Placeholder679 |  |  |\n| 680 | Placeholder680 |  |  |\n| 681 | Placeholder681 |  |  |\n| 682 | Placeholder682 |  |  |\n| 683 | Placeholder683 |  |  |\n| 684 | Placeholder684 |  |  |\n| 685 | Placeholder685 |  |  |\n| 686 | Placeholder686 |  |  |\n| 687 | Placeholder687 |  |  |\n| 688 | Placeholder688 |  |  |\n| 689 | Placeholder689 |  |  |\n| 690 | Placeholder690 |  |  |\n| 691 | Placeholder691 |  |  |\n| 692 | Placeholder692 |  |  |\n| 693 | Placeholder693 |  |  |\n| 694 | Placeholder694 |  |  |\n| 695 | Placeholder695 |  |  |\n| 696 | Placeholder696 |  |  |\n| 697 | Placeholder697 |  |  |\n| 698 | Placeholder698 |  |  |\n| 699 | Placeholder699 |  |  |\n| 700 | Placeholder700 |  |  |\n| 701 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_GREATER_THAN | uint256 timestamp ||\n| 702 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN | uint256 timestamp ||\n| 703 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_IN_RANGE | uint256 startTimestamp, uint256 endTimestamp ||\n| 704 | OPERATION_GLOBAL_SINCE_LAST_TIME_GREATER_THAN | uint256 timestamp ||\n| 705 | OPERATION_GLOBAL_SINCE_LAST_TIME_LESS_THAN | uint256 timestamp ||\n| 706 | OPERATION_GLOBAL_SINCE_LAST_TIME_IN_RANGE | uint256 startTimestamp, uint256 endTimestamp ||\n| 707 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN | address[] addressList, uint256 timestamp ||\n| 708 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN | address[] addressList, uint256 timestamp ||\n| 709 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE | address[] addressList, uint256 startTimestamp, uint256 endTimestamp ||\n| 710 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN | address[] addressList, uint256 timestamp ||\n| 711 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN | address[] addressList, uint256 timestamp ||\n| 712 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE | address[] addressList, uint256 startTimestamp, uint256 endTimestamp ||\n| 713 | Placeholder713 |  |  |\n| 714 | Placeholder714 |  |  |\n| 715 | Placeholder715 |  |  |\n| 716 | Placeholder716 |  |  |\n| 717 | Placeholder717 |  |  |\n| 718 | Placeholder718 |  |  |\n| 719 | Placeholder719 |  |  |\n| 720 | Placeholder720 |  |  |\n| 721 | Placeholder721 |  |  |\n| 722 | Placeholder722 |  |  |\n| 723 | Placeholder723 |  |  |\n| 724 | Placeholder724 |  |  |\n| 725 | Placeholder725 |  |  |\n| 726 | Placeholder726 |  |  |\n| 727 | Placeholder727 |  |  |\n| 728 | Placeholder728 |  |  |\n| 729 | Placeholder729 |  |  |\n| 730 | Placeholder730 |  |  |\n| 731 | Placeholder731 |  |  |\n| 732 | Placeholder732 |  |  |\n| 733 | Placeholder733 |  |  |\n| 734 | Placeholder734 |  |  |\n| 735 | Placeholder735 |  |  |\n| 736 | Placeholder736 |  |  |\n| 737 | Placeholder737 |  |  |\n| 738 | Placeholder738 |  |  |\n| 739 | Placeholder739 |  |  |\n| 740 | Placeholder740 |  |  |\n| 741 | Placeholder741 |  |  |\n| 742 | Placeholder742 |  |  |\n| 743 | Placeholder743 |  |  |\n| 744 | Placeholder744 |  |  |\n| 745 | Placeholder745 |  |  |\n| 746 | Placeholder746 |  |  |\n| 747 | Placeholder747 |  |  |\n| 748 | Placeholder748 |  |  |\n| 749 | Placeholder749 |  |  |\n| 750 | Placeholder750 |  |  |\n| 751 | Placeholder751 |  |  |\n| 752 | Placeholder752 |  |  |\n| 753 | Placeholder753 |  |  |\n| 754 | Placeholder754 |  |  |\n| 755 | Placeholder755 |  |  |\n| 756 | Placeholder756 |  |  |\n| 757 | Placeholder757 |  |  |\n| 758 | Placeholder758 |  |  |\n| 759 | Placeholder759 |  |  |\n| 760 | Placeholder760 |  |  |\n| 761 | Placeholder761 |  |  |\n| 762 | Placeholder762 |  |  |\n| 763 | Placeholder763 |  |  |\n| 764 | Placeholder764 |  |  |\n| 765 | Placeholder765 |  |  |\n| 766 | Placeholder766 |  |  |\n| 767 | Placeholder767 |  |  |\n| 768 | Placeholder768 |  |  |\n| 769 | Placeholder769 |  |  |\n| 770 | Placeholder770 |  |  |\n| 771 | Placeholder771 |  |  |\n| 772 | Placeholder772 |  |  |\n| 773 | Placeholder773 |  |  |\n| 774 | Placeholder774 |  |  |\n| 775 | Placeholder775 |  |  |\n| 776 | Placeholder776 |  |  |\n| 777 | Placeholder777 |  |  |\n| 778 | Placeholder778 |  |  |\n| 779 | Placeholder779 |  |  |\n| 780 | Placeholder780 |  |  |\n| 781 | Placeholder781 |  |  |\n| 782 | Placeholder782 |  |  |\n| 783 | Placeholder783 |  |  |\n| 784 | Placeholder784 |  |  |\n| 785 | Placeholder785 |  |  |\n| 786 | Placeholder786 |  |  |\n| 787 | Placeholder787 |  |  |\n| 788 | Placeholder788 |  |  |\n| 789 | Placeholder789 |  |  |\n| 790 | Placeholder790 |  |  |\n| 791 | Placeholder791 |  |  |\n| 792 | Placeholder792 |  |  |\n| 793 | Placeholder793 |  |  |\n| 794 | Placeholder794 |  |  |\n| 795 | Placeholder795 |  |  |\n| 796 | Placeholder796 |  |  |\n| 797 | Placeholder797 |  |  |\n| 798 | Placeholder798 |  |  |\n| 799 | Placeholder799 |  |  |\n| 800 | Placeholder800 |  |  |\n| 801 | Placeholder801 |  |  |\n| 802 | Placeholder802 |  |  |\n| 803 | Placeholder803 |  |  |\n| 804 | Placeholder804 |  |  |\n| 805 | Placeholder805 |  |  |\n| 806 | Placeholder806 |  |  |\n| 807 | Placeholder807 |  |  |\n| 808 | Placeholder808 |  |  |\n| 809 | Placeholder809 |  |  |\n| 810 | Placeholder810 |  |  |\n| 811 | Placeholder811 |  |  |\n| 812 | Placeholder812 |  |  |\n| 813 | Placeholder813 |  |  |\n| 814 | Placeholder814 |  |  |\n| 815 | Placeholder815 |  |  |\n| 816 | Placeholder816 |  |  |\n| 817 | Placeholder817 |  |  |\n| 818 | Placeholder818 |  |  |\n| 819 | Placeholder819 |  |  |\n| 820 | Placeholder820 |  |  |\n| 821 | Placeholder821 |  |  |\n| 822 | Placeholder822 |  |  |\n| 823 | Placeholder823 |  |  |\n| 824 | Placeholder824 |  |  |\n| 825 | Placeholder825 |  |  |\n| 826 | Placeholder826 |  |  |\n| 827 | Placeholder827 |  |  |\n| 828 | Placeholder828 |  |  |\n| 829 | Placeholder829 |  |  |\n| 830 | Placeholder830 |  |  |\n| 831 | Placeholder831 |  |  |\n| 832 | Placeholder832 |  |  |\n| 833 | Placeholder833 |  |  |\n| 834 | Placeholder834 |  |  |\n| 835 | Placeholder835 |  |  |\n| 836 | Placeholder836 |  |  |\n| 837 | Placeholder837 |  |  |\n| 838 | Placeholder838 |  |  |\n| 839 | Placeholder839 |  |  |\n| 840 | Placeholder840 |  |  |\n| 841 | Placeholder841 |  |  |\n| 842 | Placeholder842 |  |  |\n| 843 | Placeholder843 |  |  |\n| 844 | Placeholder844 |  |  |\n| 845 | Placeholder845 |  |  |\n| 846 | Placeholder846 |  |  |\n| 847 | Placeholder847 |  |  |\n| 848 | Placeholder848 |  |  |\n| 849 | Placeholder849 |  |  |\n| 850 | Placeholder850 |  |  |\n| 851 | Placeholder851 |  |  |\n| 852 | Placeholder852 |  |  |\n| 853 | Placeholder853 |  |  |\n| 854 | Placeholder854 |  |  |\n| 855 | Placeholder855 |  |  |\n| 856 | Placeholder856 |  |  |\n| 857 | Placeholder857 |  |  |\n| 858 | Placeholder858 |  |  |\n| 859 | Placeholder859 |  |  |\n| 860 | Placeholder860 |  |  |\n| 861 | Placeholder861 |  |  |\n| 862 | Placeholder862 |  |  |\n| 863 | Placeholder863 |  |  |\n| 864 | Placeholder864 |  |  |\n| 865 | Placeholder865 |  |  |\n| 866 | Placeholder866 |  |  |\n| 867 | Placeholder867 |  |  |\n| 868 | Placeholder868 |  |  |\n| 869 | Placeholder869 |  |  |\n| 870 | Placeholder870 |  |  |\n| 871 | Placeholder871 |  |  |\n| 872 | Placeholder872 |  |  |\n| 873 | Placeholder873 |  |  |\n| 874 | Placeholder874 |  |  |\n| 875 | Placeholder875 |  |  |\n| 876 | Placeholder876 |  |  |\n| 877 | Placeholder877 |  |  |\n| 878 | Placeholder878 |  |  |\n| 879 | Placeholder879 |  |  |\n| 880 | Placeholder880 |  |  |\n| 881 | Placeholder881 |  |  |\n| 882 | Placeholder882 |  |  |\n| 883 | Placeholder883 |  |  |\n| 884 | Placeholder884 |  |  |\n| 885 | Placeholder885 |  |  |\n| 886 | Placeholder886 |  |  |\n| 887 | Placeholder887 |  |  |\n| 888 | Placeholder888 |  |  |\n| 889 | Placeholder889 |  |  |\n| 890 | Placeholder890 |  |  |\n| 891 | Placeholder891 |  |  |\n| 892 | Placeholder892 |  |  |\n| 893 | Placeholder893 |  |  |\n| 894 | Placeholder894 |  |  |\n| 895 | Placeholder895 |  |  |\n| 896 | Placeholder896 |  |  |\n| 897 | Placeholder897 |  |  |\n| 898 | Placeholder898 |  |  |\n| 899 | Placeholder899 |  |  |\n| 900 | Placeholder900 |  |  |\n| 901 | Placeholder901 |  |  |\n| 902 | Placeholder902 |  |  |\n| 903 | Placeholder903 |  |  |\n| 904 | Placeholder904 |  |  |\n| 905 | Placeholder905 |  |  |\n| 906 | Placeholder906 |  |  |\n| 907 | Placeholder907 |  |  |\n| 908 | Placeholder908 |  |  |\n| 909 | Placeholder909 |  |  |\n| 910 | Placeholder910 |  |  |\n| 911 | Placeholder911 |  |  |\n| 912 | Placeholder912 |  |  |\n| 913 | Placeholder913 |  |  |\n| 914 | Placeholder914 |  |  |\n| 915 | Placeholder915 |  |  |\n| 916 | Placeholder916 |  |  |\n| 917 | Placeholder917 |  |  |\n| 918 | Placeholder918 |  |  |\n| 919 | Placeholder919 |  |  |\n| 920 | Placeholder920 |  |  |\n| 921 | Placeholder921 |  |  |\n| 922 | Placeholder922 |  |  |\n| 923 | Placeholder923 |  |  |\n| 924 | Placeholder924 |  |  |\n| 925 | Placeholder925 |  |  |\n| 926 | Placeholder926 |  |  |\n| 927 | Placeholder927 |  |  |\n| 928 | Placeholder928 |  |  |\n| 929 | Placeholder929 |  |  |\n| 930 | Placeholder930 |  |  |\n| 931 | Placeholder931 |  |  |\n| 932 | Placeholder932 |  |  |\n| 933 | Placeholder933 |  |  |\n| 934 | Placeholder934 |  |  |\n| 935 | Placeholder935 |  |  |\n| 936 | Placeholder936 |  |  |\n| 937 | Placeholder937 |  |  |\n| 938 | Placeholder938 |  |  |\n| 939 | Placeholder939 |  |  |\n| 940 | Placeholder940 |  |  |\n| 941 | Placeholder941 |  |  |\n| 942 | Placeholder942 |  |  |\n| 943 | Placeholder943 |  |  |\n| 944 | Placeholder944 |  |  |\n| 945 | Placeholder945 |  |  |\n| 946 | Placeholder946 |  |  |\n| 947 | Placeholder947 |  |  |\n| 948 | Placeholder948 |  |  |\n| 949 | Placeholder949 |  |  |\n| 950 | Placeholder950 |  |  |\n| 951 | Placeholder951 |  |  |\n| 952 | Placeholder952 |  |  |\n| 953 | Placeholder953 |  |  |\n| 954 | Placeholder954 |  |  |\n| 955 | Placeholder955 |  |  |\n| 956 | Placeholder956 |  |  |\n| 957 | Placeholder957 |  |  |\n| 958 | Placeholder958 |  |  |\n| 959 | Placeholder959 |  |  |\n| 960 | Placeholder960 |  |  |\n| 961 | Placeholder961 |  |  |\n| 962 | Placeholder962 |  |  |\n| 963 | Placeholder963 |  |  |\n| 964 | Placeholder964 |  |  |\n| 965 | Placeholder965 |  |  |\n| 966 | Placeholder966 |  |  |\n| 967 | Placeholder967 |  |  |\n| 968 | Placeholder968 |  |  |\n| 969 | Placeholder969 |  |  |\n| 970 | Placeholder970 |  |  |\n| 971 | Placeholder971 |  |  |\n| 972 | Placeholder972 |  |  |\n| 973 | Placeholder973 |  |  |\n| 974 | Placeholder974 |  |  |\n| 975 | Placeholder975 |  |  |\n| 976 | Placeholder976 |  |  |\n| 977 | Placeholder977 |  |  |\n| 978 | Placeholder978 |  |  |\n| 979 | Placeholder979 |  |  |\n| 980 | Placeholder980 |  |  |\n| 981 | Placeholder981 |  |  |\n| 982 | Placeholder982 |  |  |\n| 983 | Placeholder983 |  |  |\n| 984 | Placeholder984 |  |  |\n| 985 | Placeholder985 |  |  |\n| 986 | Placeholder986 |  |  |\n| 987 | Placeholder987 |  |  |\n| 988 | Placeholder988 |  |  |\n| 989 | Placeholder989 |  |  |\n| 990 | Placeholder990 |  |  |\n| 991 | Placeholder991 |  |  |\n| 992 | Placeholder992 |  |  |\n| 993 | Placeholder993 |  |  |\n| 994 | Placeholder994 |  |  |\n| 995 | Placeholder995 |  |  |\n| 996 | Placeholder996 |  |  |\n| 997 | Placeholder997 |  |  |\n| 998 | Placeholder998 |  |  |\n| 999 | Placeholder999 |  |  |\n| 1000 | Placeholder1000 |  |  |\n"
  },
  {
    "path": "darc-docs/docs/DARC Protocol/Getting Started.md",
    "content": "---\nsidebar_position: 1\n---\n\n# Getting Started\n\n### What is the DARC Protocol?\n\n### Building the source\n\nSince Hardhat and OpenZeppelin are used, the project can be built using the following commands:\n\n1. Install dependencies\n\n   We recommend that you use `pnpm` instead of `npm`, but `npm` can also work.\n\n   `pnpm` is a newer package manager that has some advantages over npm. It is faster, more efficient, and disk-space\n   friendly.\n\n    ```shell\n    cd darc-protocol\n    npm install\n    ```\n\n2. Compile the contracts\n\n    ```shell\n    npx hardhat compile\n    ```\n\n3. Host a local devnet node with hardhat configuration:\n\n    ```shell\n    npx hardhat node\n    ```\n\n4. Test contracts\n\n    ```shell\n    REPORT_GAS=true npx hardhat test --network localhost\n    ```\n\n### Deploy\n\nTo deploy the DARC protocol, you can use the following commands:\n\n```shell\nnpx hardhat run scripts/deploy.js --network <YOUR_NETWORK>\n```\n\nIf you want to deploy the DARC protocol to the local devnet, you can use the following command:\n\n\n```shell\nnpx hardhat run scripts/deploy.js --network localhost\n```\n\nMake sure you have a local devnet node running before deploying the DARC protocol.\n\nIf you want to deploy the DARC protocol to the Ethereum mainnet, you can use the following command:\n\n```shell\nnpx hardhat run scripts/deploy.js --network mainnet\n```\n"
  },
  {
    "path": "darc-docs/docs/DARC Protocol/OpCodes.md",
    "content": "---\nsidebar_position: 2\n---\n\n# OpCodes\n\n### What is an OpCode?\n\nDecentralized Autonomous Regulated Corporation (DARC) is a protocol that enables the creation and management of autonomous entities with built-in governance and regulatory mechanisms. One of the key components of the DARC protocol is the opcode instruction set, which defines the basic operations for managing tokens, money, and law within the system.\n\nThe opcode instruction set provides a standardized way to interact with the DARC protocol and perform various actions. These instructions define the operations that can be executed by participants within the DARC, allowing for the creation, transfer, and burning of tokens, as well as the management of membership, roles, and plugins.\n\nWith the opcode instruction set, users can mint new tokens, create token classes with specific properties such as voting and dividend weights, transfer tokens between addresses, and burn tokens to remove them from circulation. It also allows for the addition and suspension of membership, changing member roles and names, and enabling or disabling plugins for additional functionality.\n\nFurthermore, the opcode instruction set includes operations for handling monetary transactions, such as withdrawing cash to designated addresses, paying cash, offering dividends, and setting approval for all operations. Additionally, it provides mechanisms for adding storage IPFS hashes, voting on proposals, executing programs, and performing other essential functions within the DARC ecosystem.\n\nBy defining these operations through opcodes, the DARC protocol ensures consistency, transparency, and security in managing tokens, money, and law within autonomous entities. These instructions form the foundation for the decentralized governance and regulation of corporations, providing a framework for transparent and auditable decision-making processes.\n\n### Notes\n\nIn DARC protocol, the operations are named with uppercase letters, and in By-law Script and darcjs SDK, the operations are named with lowercase letters. For example, the operation `BATCH_MINT_TOKENS` in DARC protocol are named `batch_mint_tokens` in both By-law Script and darcjs SDK.\n\n| Opcode ID | Opcode Name                                  | Opcode Parameter                                        | Opcode Notes                                                |\n|-----------|----------------------------------------------|----------------------------------------------------------|------------------------------------------------------------|\n| 0         | UNDEFINED                                    |                                                          | Invalid Operation                                           |\n| 1         | BATCH_MINT_TOKENS                            | ADDRESS_2DARRAY[0] toAddressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray | Batch Mint Token Operation                                 |\n| 2         | BATCH_CREATE_TOKEN_CLASSES                   | STRING_ARRAY[] nameArray, UINT256_2DARRAY[0] tokenIndexArray, UINT256_2DARRAY[1] votingWeightArray, UINT256_2DARRAY[2] dividendWeightArray | Batch Create Token Class Operation                         |\n| 3         | BATCH_TRANSFER_TOKENS                        | ADDRESS_2DARRAY[0] toAddressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray | Batch Transfer Token Operation                             |\n| 4         | BATCH_TRANSFER_TOKENS_FROM_TO                | ADDRESS_2DARRAY[0] fromAddressArray, ADDRESS_2DARRAY[1] toAddressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray | Batch Transfer Token From Addr A to Addr B Operation        |\n| 5         | BATCH_BURN_TOKENS                            | UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray | Batch Burn Token Operation                                  |\n| 6         | BATCH_BURN_TOKENS_FROM                       | ADDRESS_2DARRAY[0] fromAddressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray | Batch Burn Token From Addr A Operation                      |\n| 7         | BATCH_ADD_MEMBERSHIPS                         | ADDRESS_2DARRAY[0] memberAddressArray, UINT256_2DARRAY[0] memberRoleArray, STRING_ARRAY memberNameArray | Batch Add Member Operation                                  |\n| 8         | BATCH_SUSPEND_MEMBERSHIPS                     | ADDRESS_2DARRAY[0] memberAddressArray                     | Batch Suspend Member Operation                              |\n| 9         | BATCH_RESUME_MEMBERSHIPS                      | ADDRESS_2DARRAY[0] memberAddressArray                     | Batch Resume Member Operation                               |\n| 10        | BATCH_CHANGE_MEMBER_ROLES                    | ADDRESS_2DARRAY[0] memberAddressArray, UINT256_2DARRAY[0] memberRoleArray | Batch Change Member Role Operation                          |\n| 11        | BATCH_CHANGE_MEMBER_NAMES                    | ADDRESS_2DARRAY[0] memberAddressArray, STRING_ARRAY memberNameArray | Batch Change Member Name Operation                          |\n| 12        | BATCH_ADD_PLUGINS                            | Plugin[] pluginList                                     | Batch Add Emergency Agent Operation                         |\n| 13        | BATCH_ENABLE_PLUGINS                         | UINT256_ARRAY[0] pluginIndexArray, BOOL_ARRAY isBeforeOperationArray | Batch Enable Plugin Operation                               |\n| 14        | BATCH_DISABLE_PLUGINS                        | UINT256_ARRAY[0] pluginIndexArray, BOOL_ARRAY isBeforeOperationArray | Batch Disable Plugin Operation                              |\n| 15        | BATCH_ADD_AND_ENABLE_PLUGINS                | Plugin[] pluginList                                     | Batch Add and Enable Plugin Operation                       |\n| 16        | BATCH_SET_PARAMETERS                         | MachineParameter[] parameterNameArray, UINT256_2DARRAY[0] parameterValueArray | Batch Set Parameter Operation                                |\n| 17        | BATCH_ADD_WITHDRAWABLE_BALANCES              | ADDRESS_2DARRAY[0] addressArray, UINT256_2DARRAY[0] amountArray | Batch Add Withdrawable Balance Operation                    |\n| 18        | BATCH_REDUCE_WITHDRAWABLE_BALANCES           | ADDRESS_2DARRAY[0] addressArray, UINT256_2DARRAY[0] amountArray | Batch Reduce Withdrawable Balance Operation                 |\n| 19        | BATCH_ADD_VOTING_RULES                       | VotingRule[] votingRuleList                              | Batch Add Voting Rules Operation                             |\n| 20        | BATCH_PAY_TO_MINT_TOKENS                     | ADDRESS_2DARRAY[0] addressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray, UINT256_2DARRAY[2] priceArray, UINT256_2DARRAY[3] dividendableFlag | Batch Pay to Mint Tokens Operation                          |\n| 21        | BATCH_PAY_TO_TRANSFER_TOKENS                 | ADDRESS_2DARRAY[0] toAddressArray, UINT256_2DARRAY[0] tokenClassArray, UINT256_2DARRAY[1] amountArray, UINT256_2DARRAY[2] priceArray, UINT256_2DARRAY[3] dividendableFlag | Pay some cash to transfer tokens Operation (product coins) |\n| 22        | ADD_EMERGENCY                               | ADDRESS_2DARRAY[0] addressArray                           | Add an array of address as emergency agents Operation        |\n| 23        | RESERVED_ID_23                               |                                                          | Reserved ID 23 DO NOT USE                                    |\n| 24        | CALL_EMERGENCY                               | UINT256_2DARRAY[0][0] emergencyAgentIndex                           | Call emergency agents to handle emergency situations         |\n| 25        | CALL_CONTRACT_ABI                            | ADDRESS_2D[0][0] contractAddress, bytes abi, UINT256_2DARRAY[0][0] value | Call a contract with the given abi Operation                |\n| 26        | PAY_CASH                                     | uint256 amount, uint256 paymentType, uint256 dividendable | Pay some cash Operation                                     |\n| 27        | OFFER_DIVIDENDS                              |                                                          | Calculate the dividends and offer to token holders Operation|\n| 28        | RESERVED_ID_28                               |                                                          | Reserved ID 28 DO NOT USE                                    |\n| 29        | SET_APPROVAL_FOR_ALL_OPERATIONS              | ADDRESS_2DARRAY[0][0] targetAddress                                          | Set the approval for all transfer operations by address Operation |\n| 30        | BATCH_BURN_TOKENS_AND_REFUND                 | UINT256_2D[0] tokenClassArray, UINT256_2D[1] amountArray, UINT256_2D[2] priceArray | Batch Burn tokens and Refund Operation                      |\n| 31        | ADD_STORAGE_STRING                        | STRING_ARRAY[0][0] IFPSHash                              | Add storage IPFS hash to the storage list permanently Operation |\n| 32        | VOTE                                         | bool[] voteArray                                       | Vote for a voting pending program Operation                 |\n| 33        | EXECUTE_PENDING_PROGRAM                               |                                                          | Execute a program that has been voted and approved Operation |\n| 34        | END_EMERGENCY                                |                                                          | Emergency mode termination Operation                       |\n| 35        | UPGRADE_TO_ADDRESS                           | ADDRESS_2DARRAY[0][0] targetAddress  | Upgrade the contract to a new contract address Operation     |\n| 36        | CONFIRM_UPGRAED_FROM_ADDRESS                 | ADDRESS_2DARRAY[0][0] fromAddress   | Accepting current DARCs to be upgraded from the old contract address Operation |\n"
  },
  {
    "path": "darc-docs/docs/DARC Protocol/_category_.json",
    "content": "{\n  \"label\": \"DARC Protocol\",\n  \"position\": 2,\n  \"collapsed\": false,\n  \"collapsible\": false,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Everything about the DARC Protocol\"\n  }\n}\n"
  },
  {
    "path": "darc-docs/docs/Overview/Overview.md",
    "content": "# Overview\n\n### What is DARC?\n\nDecentralized Autonomous Regulated Corporation(DARC) is a virtual machine that written in Solidity. It is a smart contract that can be deployed on Ethereum or EVM-compatible blockchain. It is fully open source and can be used by anyone under the license.\n\n### DARC Project Goals and Features\n\nThe ultimate goal of the DARC project is to design a comprehensive, self-regulating corporate governance system that liberates itself from the textual contracts and external regulations imposed by government and legal registrations such as C-corp, LLC, and foundations. It aims to achieve a complete, internal, trustworthy, and programmable plugin system for self-regulation within DARC instances. Therefore, it possesses the following characteristics:\n\n1. Multi-level tokens: DARC can configure multiple levels of tokens, each with its own voting weight and dividend weight. Through various configurations and combinations, tokens at different levels can serve as common stock, class A/B stock, company bonds, board of directors positions, preferred stock, and various other company assets and ownership structures defined by complex rules. Similarly, multi-level tokens can be commodities and services sold by DARC, whether they are fungible or non-fungible tokens.\n\n2. Plugin-as-a-Law: Plugin is the central mechanism of the DARC protocol, governing and establishing all rules within DARC, including the addition, enabling, and disabling of plugins themselves. Plugins define the operations permitted or prohibited within DARC under specific conditions. In the DARC framework, users can set up and add a complete set of plugins to define the daily operations of DARC, including board operations, company bylaws, shareholder agreements, complex investment agreements with various conditions, dividend regulations, employment contracts, procurement contracts, and more. By designing comprehensive and diverse plugins, DARC can be perfected much like real-world company legal contracts, regulating all operations of DARC members such as shareholders, the board of directors, employees, customers, and suppliers.\n\n3. Operation and Program: In the context of the DARC protocol, all operations are abstracted into a series of operations, including opcodes and parameters. Users can design, compile, and run all daily management and operations of DARC, including equity operations, member operations, cash operations, plugin design and maintenance, voting operations, and more, using By-law Script. These scripts are deployed and executed on the DARC virtual machine instance deployed on the blockchain.\n\n### DARC Project Structure\n\nThe entire DARC Project ([https://github.com/project-darc](https://github.com/project-darc)) is divided into four parts:\n\n1. DARC Protocol: This is the core component of DARC and serves as the virtual machine that interprets and executes all operations and programs. This part is written and completed in Solidity. Users can choose to deploy the prebuilt DARC binary or modify and compile their own DARC protocol for one-click deployment to an EVM-compatible blockchain.\n\n2. By-law Script: By-law Script is a programming language used to write DARC programs and plugins. The basic syntax of By-law Script is almost identical to JavaScript, and it uniquely supports operator overloading. Therefore, users can easily write complex boolean logic and comprehensive conditional statements. By-law Script is the first programming language designed to write executable and deployable legal code within legal entities.\n\n3. darcjs: darcjs: darcjs is a toolkit and SDK for developers and users to interact with the DARC protocol. With darcjs, users can easily compile and run By-law Script, deploy the DARC protocol on specified EVM-compatible blockchains, or embed core functionalities related to DARC in developer projects, such as payments, voting, asset transfers, legal updates, cash withdrawals, and more.\n\n4. DARC Studio: DARC Studio is a visual web frontend. With DARC Studio, users can easily write and run By-law Script in the browser without installing darcjs. It visualizes various information about deployed DARC instances, such as recent activities, assets, equity distributions, legal documents, and more.\n\n### Community\n\nTelegram: [https://t.me/projectdarc](https://t.me/projectdarc)\n\nGithub: [https://github.com/project-darc](https://github.com/project-darc)\n\nGithub Discussions: [https://github.com/orgs/Project-DARC/discussions](https://github.com/orgs/Project-DARC/discussions)"
  },
  {
    "path": "darc-docs/docs/Overview/_category_.json",
    "content": "{\n  \"label\": \"Overview\",\n  \"position\": 1,\n  \"collapsed\": false,\n  \"collapsible\": false,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Overview about darc.js\"\n  }\n}\n"
  },
  {
    "path": "darc-docs/docs/darc.js/Getting Started.md",
    "content": "---\nsidebar_position: 1\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# Getting Started\n\n### What is darc.js?\n\n**darc.js** is a TypeScript/JavaScript library for interacting with the DARC virtual machine for node.js and the browser\nenvironment.\n\n### Installation\n\nYou need to install **ethers.js** with version 5.7.2 or 5.x.x toghether with **darc.js**.\n\n<Tabs>\n  <TabItem value=\"npm\" label=\"NPM\" default>\n\n```shell\nnpm install darcjs \n```\n\n  </TabItem>\n  <TabItem value=\"yarn\" label=\"YARN\">\n\n```shell\nyarn add darcjs \n```\n\n  </TabItem>\n  <TabItem value=\"pnpm\" label=\"PNPM\">\n\n```shell\npnpm install darcjs \n```\n\n  </TabItem>\n</Tabs>\n\n### Usage\n\nTo use darc.js supports ESM, import it as follows:\n\n```ts\nimport * as darcjs from 'darcjs';\n```\n\nOr if you are using CommonJS:\n\n```js\nconst darcjs = require('darcjs');\n```\n\n### Deploy your DARC\n\nTo deploy DARC on an EVM-compatible blockchain, you need to use the `deployDARC(DARC_VERSION, signer)` function, in which `DARC_VERSION` is the version of DARC you want to deploy and signer is the signer of the transaction. If you are using the browser environment and want to get the signer from the **MetaMask** wallet, you can use the `getSigner()` function from `ethers.js`, for example:\n\n\n```ts\nimport { deployDARC, ethers } from 'darcjs';\n\n// Get signer from MetaMask wallet\nconst signer = (new ethers.providers.Web3Provider(window.ethereum)).getSigner();\n\n// deploy DARC\nconst darc_contract_address = await darcjs.deployDARC(\n  DARC_VERSION.Latest, signer\n);\n```\n\nIf you are using the node.js environment, you need to use `ethers.providers` to construct a provider, then use the `ethers.Wallet` class from `ethers.js` to create a signer with a private key, for example:\n\n```ts\nimport { deployDARC, ethers } from 'darcjs';\n\n// Construct the provider via JsonRpcProvider on local devnet node\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// Construct the signer via Wallet class and private key\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\n// deploy DARC\nconst darc_contract_address = await deployDARC(\n  DARC_VERSION.Latest, signer\n);\n\n// print the address of the deployed DARC\nconsole.log(\"The deployed DARC address: \" + darc_contract_address);\n```\n\n### Access to a deployed DARC(read only)\n\nTo access a deployed DARC on an EVM-compatible blockchain, you need to constrcut a `DARC` object via the `DARC` class, in which the constructor takes the address of the deployed DARC and the signer or provider as parameters.\nAlso you need to specify the version of the DARC you want to access, and the provider for accessing the EVM-compatible blockchain.\n\nSince you do not need to write anyting to the blockchain or execute any DARC program, you can just use the `provider` to access the DARC, and it is not necessary to use the `signer` for the DARC constructor.\n\nFor example:\n\n```ts\nimport { DARC, ethers } from 'darcjs';\n\n// Construct a provider via JsonRpcProvider on local devnet node\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// Get the deployed DARC address\nconst darc_contract_address = '0x5FbDB2315678afecb367f032d93F642f64180aa3';\n\n// Construct a DARC object\nconst myDARC_readOnly = new DARC({\n  address: darc_contract_address,\n  provider: provider,\n  version: DARC_VERSION.Latest,\n}); \n\n// Read the member address list of the DARC\nconst memberList = await myDARC_readOnly.getMemberList();\n\n// Read the member name via member address\nfor (let i = 0; i < memberList.length; i++) {\n  const memberInfo = await myDARC_readOnly.getMemberInfo(memberList[i]);\n  console.log(\"The member name of \" + memberList[i] + \" is \" + memberInfo.name);\n}\n```\n\n### Access to a deployed DARC(with signer)\n\nIf you want to access a deployed DARC on an EVM-compatible blockchain, and run the program or withdraw some cash from the DARC, you need to use the `signer` to construct the `DARC` object via the `DARC` class, in which the constructor takes the address of the deployed DARC, the signer and the version of the DARC you want to access as parameters. \n\nSince the signer contains the private key and provider information, it is not necessary to use the `provider` for the DARC constructor.\n\nHere is an example of how to access a deployed DARC with a signer:\n\n```ts\nimport { DARC, ethers } from 'darcjs';\n\n// Construct a provider via JsonRpcProvider on local devnet node\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// Construct the signer via Wallet class and private key\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\n\n// Get the deployed DARC address\nconst darc_contract_address = '0x5FbDB2315678afecb367f032d93F642f64180aa3';\n\n// Construct a DARC object\nconst myDARC = new DARC({\n  address: darc_contract_address,\n  wallet: signer,    // pass the signer to the DARC constructor\n  version: DARC_VERSION.Latest,\n});\n\n```\n\nThen you can use the `darc` object to access the deployed DARC, not only read the data of the DARC, but also run the program on the DARC. For example:\n\n```ts\nimport {transpileAndRun} from 'darcjs';\n// Write a code snippet of DARC program\nlet byLawScript = \n`\n// define address 1 and 2 for minting tokens\nconst addr1 = '0x0000';\nconst addr2 = '0x0001';\n\n// mint tokens to address addr1 and addr2\nbatch_mint_tokens(\n  [0,0,1,1], \n  [1000,1000,2000,2000], \n  [addr1, addr2, addr1, addr2]\n  );\n\n// enable plugins 3, 4 before sandbox checking operation\n// and disable plugins 5, 6 after sandbox checking operation\nbatch_enable_plugins(\n  [3,4,5,6],\n  [true, true, false, false]\n);\n\n// finally, offer dividends to every token holder\noffer_dividends();\n`\n\n// Transpile and run the By-law Script program on the DARC deployed on the chain\nconst result = await myDARC.transpileAndRun(\n  byLawScript,\n  signer,\n  dart_contract_address,\n  DARC_VERSION.Latest\n);\n```\n\n### Execute a By-law Script program on the DARC\n\nThe `transpileAndRun` function is used to execute a By-law Script program on the DARC. It takes the By-law Script program, the signer, the address of the deployed DARC and the version of the DARC as parameters.\n\nHere is an example of how to execute a By-law Script program on the DARC:\n\n```ts\nimport {transpileAndRun} from 'darcjs';\n\n// Write a code snippet of DARC program\nlet byLawScript = \n`\nbatch_transfer_tokens(\n  [\"0x0123...\"],  // the addresses of the recipients\n  [0],            // the token index\n  [100]);         // the amounts\n`\n\n// Execute the By-law Script program on the DARC deployed on the chain\nconst result = await transpileAndRun(\n  byLawScript,\n  signer,\n  dart_contract_address,\n  DARC_VERSION.Latest\n);\n```\n\nThe `transpileAndRun` function contains two parts: the first part is to transpile the By-law Script program into the operation list, do parsing for the By-law Script and replace the operator `|`, `&` with condition node constructor `or()`, `and()` respectively, and the second part is to execute the operation list on the DARC, pushing each operation with opcode and parameters into a list, and send the big chunk of object body with all operations to the DARC entrance.\n\n### Execute an operation list via SDK\n\nAlso you can execute an operation list on the DARC via the SDK, without the By-law Script syntax. The `executeOperationList` function is used to execute an operation list on the DARC. It takes the operation list, the signer, the address of the deployed DARC and the version of the DARC as parameters. You can just import all the operations and plugins you need from the `darcjs` library, and then use the `executeOperationList` function to execute the operation list on the DARC.\n\nHere is an example in TypeScript about how to execute an operation list via SDK:\n\n```ts\nimport {\n  executeOperationList, \n  batch_transfer_tokens, \n  operator_address_equals, \n  batch_add_and_enable_plugins\n} from 'darcjs';\n\n\nconst result = executeOperationList(\n  [\n    // first operation: batch transfer tokens\n    batch_transfer_tokens(\n      [\"0x0123...\"],  // the addresses of the recipients\n      [0],            // the token index\n      [100]),         // the amounts\n\n    batch_add_and_enable_plugins(\n      [\n        {\n          returnType: EnumReturnType.YES_AND_SKIP_SANDBOX, // yes and skip sandbox\n          level: BigInt(103),\n          votingRuleIndex: BigInt(0),\n          notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n          bIsEnabled: true,\n          bIsBeforeOperation: true,\n          conditionNodes: \n          or(\n            operator_address_equals(target1),\n            operator_address_equals(target2)\n          ).generateConditionNodeList()\n        }\n      ]\n    )\n  ],\n  signer,\n  dart_contract_address,\n  DARC_VERSION.Latest\n);\n\n```\n\n### Development Notes:\n\nTo run the test for darcjs, you need to clone the darcjs repository from the GitHub, and then run the test with the following commands:\n\n```shell\ngit clone https://github.com/Project-DARC/DARC.git\n```\n\nThen first install the dependencies for `darc-protocol` project\n\n```shell\ncd darc-protocol\nnpm install\n```\n\nAnd start a local devnet node with the following command:\n\n```shell\nnpx hardhat node\n```\n\nThen run the test for `darc-protocol` project\n\n```shell\nnpx hardhat test\n```\n\nThen switch to the `darcjs` project and install the dependencies for `darcjs` project\n\n```shell\ncd ../darcjs\npnpm install\n```\n\nAnd run the test for `darcjs` project\n\n```shell\npnpm run test\n```\n\nRemember, you need to install `pnpm` before running the test for `darcjs` project, and you can install `pnpm` with the following command:\n\n```shell\nnpm install -g pnpm\n```\n\nAlso do not forget to initialize the `darc-protocol` project and start a local devnet node before running the test for `darcjs` project."
  },
  {
    "path": "darc-docs/docs/darc.js/_category_.json",
    "content": "{\n  \"label\": \"darc.js\",\n  \"position\": 4,\n  \"collapsed\": false,\n  \"collapsible\": false,\n  \"link\": {\n    \"type\": \"generated-index\",\n    \"description\": \"Everything about darc.js\"\n  }\n}\n"
  },
  {
    "path": "darc-docs/docusaurus.config.js",
    "content": "// @ts-check\n// Note: type annotations allow type checking and IDEs autocompletion\n\nconst lightCodeTheme = require('prism-react-renderer/themes/github');\nconst darkCodeTheme = require('prism-react-renderer/themes/dracula');\n\n/** @type {import('@docusaurus/types').Config} */\nconst config = {\n    title: 'DARC Docs',\n    tagline: 'Decentralized Autonomous Regulated Corporation (DARC), your on-chain company.',\n    favicon: 'img/darc-logo.png',\n\n    // Set the production url of your site here\n    url: 'https://your-docusaurus-test-site.com',\n    // Set the /<baseUrl>/ pathname under which your site is served\n    // For GitHub pages deployment, it is often '/<projectName>/'\n    baseUrl: '/',\n\n    // GitHub pages deployment config.\n    // If you aren't using GitHub pages, you don't need these.\n    organizationName: 'project-darc', // Usually your GitHub org/user name.\n    projectName: 'darc', // Usually your repo name.\n\n    onBrokenLinks: 'throw',\n    onBrokenMarkdownLinks: 'warn',\n\n    // Even if you don't use internalization, you can use this field to set useful\n    // metadata like html lang. For example, if your site is Chinese, you may want\n    // to replace \"en\" with \"zh-Hans\".\n    i18n: {\n        defaultLocale: 'en',\n        locales: ['en'],\n    },\n\n    presets: [\n        [\n            'classic',\n            /** @type {import('@docusaurus/preset-classic').Options} */\n            ({\n                docs: {\n                    sidebarPath: require.resolve('./sidebars.js'),\n                    // Please change this to your repo.\n                    // Remove this to remove the \"edit this page\" links.\n                    editUrl:\n                        'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',\n                },\n                blog: {\n                    showReadingTime: true,\n                    // Please change this to your repo.\n                    // Remove this to remove the \"edit this page\" links.\n                    editUrl:\n                        'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/',\n                },\n                theme: {\n                    customCss: require.resolve('./src/css/custom.css'),\n                },\n            }),\n        ],\n    ],\n\n    themeConfig:\n    /** @type {import('@docusaurus/preset-classic').ThemeConfig} */\n        ({\n            colorMode: {\n                disableSwitch: true\n            },\n            algolia: {\n                // The application ID provided by Algolia\n                appId: 'JYQVEBDKBP',\n\n                // Public API key: it is safe to commit it\n                apiKey: '695a3556e6bf7d738b5c67b00996ed0a',\n\n                indexName: 'darc',\n\n                // Optional: see doc section below\n                contextualSearch: true,\n            },\n            // Replace with your project's social card\n            image: 'img/docusaurus-social-card.jpg',\n            navbar: {\n                logo: {\n                    src: 'img/darc-logo.png',\n                },\n                items: [\n                    {\n                        label: 'Home',\n                        to: '/',\n                    },\n                    {\n                        label: 'Docs',\n                        to: '/docs/Overview',\n                    },\n                    {\n                        type: 'dropdown',\n                        label: 'API',\n                        position: 'left',\n                        items: [\n                            {\n                                label: 'Darcjs API',\n                                href: '/api/darcjs/index.html',\n                                prependBaseUrlToHref: true,\n                                target: '_blank',\n                            },\n                        ],\n                    },\n\n                    {\n                        href: 'https://github.com/project-darc/darc',\n                        label: 'GitHub',\n                        position: 'right',\n                    },\n                ],\n\n            },\n            // footer: {\n            //     style: 'dark',\n            //     links: [\n            //         {\n            //             title: 'Docs',\n            //             items: [\n            //                 {\n            //                     label: 'Tutorial',\n            //                     to: '/docs/intro',\n            //                 },\n            //             ],\n            //         },\n            //         {\n            //             title: 'Community',\n            //             items: [\n            //                 {\n            //                     label: 'Stack Overflow',\n            //                     href: 'https://stackoverflow.com/questions/tagged/docusaurus',\n            //                 },\n            //                 {\n            //                     label: 'Discord',\n            //                     href: 'https://discordapp.com/invite/docusaurus',\n            //                 },\n            //                 {\n            //                     label: 'Twitter',\n            //                     href: 'https://twitter.com/docusaurus',\n            //                 },\n            //             ],\n            //         },\n            //         {\n            //             title: 'More',\n            //             items: [\n            //                 {\n            //                     label: 'Blog',\n            //                     to: '/blog',\n            //                 },\n            //                 {\n            //                     label: 'GitHub',\n            //                     href: 'https://github.com/facebook/docusaurus',\n            //                 },\n            //             ],\n            //         },\n            //     ],\n            //     copyright: `Copyright © ${new Date().getFullYear()} DARC Team. Built with Docusaurus.`,\n            // },\n            prism: {\n                theme: lightCodeTheme,\n                darkTheme: darkCodeTheme,\n            },\n        }),\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "darc-docs/package.json",
    "content": "{\n  \"name\": \"darc-docs\",\n  \"version\": \"0.0.3\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"prestart\": \"npm run generate:darcjs-api\",\n    \"start\": \"docusaurus start\",\n    \"prebuild\": \"npm run generate:darcjs-api\",\n    \"build\": \"docusaurus build\",\n    \"swizzle\": \"docusaurus swizzle\",\n    \"deploy\": \"docusaurus deploy\",\n    \"clear\": \"docusaurus clear\",\n    \"serve\": \"docusaurus serve\",\n    \"write-translations\": \"docusaurus write-translations\",\n    \"write-heading-ids\": \"docusaurus write-heading-ids\",\n    \"generate:darcjs-api\": \"typedoc --out ../darc-docs/static/api/darcjs  --entryPointStrategy expand ../darc-js/src --tsconfig ../darc-js/tsconfig.json  --skipErrorChecking\",\n    \"postinstall\": \"npm run generate:darcjs-api\"\n  },\n  \"dependencies\": {\n    \"@docusaurus/core\": \"2.4.0\",\n    \"@docusaurus/plugin-pwa\": \"^2.4.0\",\n    \"@docusaurus/preset-classic\": \"2.4.0\",\n    \"@emotion/react\": \"^11.10.8\",\n    \"@emotion/styled\": \"^11.10.8\",\n    \"@mdx-js/react\": \"^1.6.22\",\n    \"@mui/joy\": \"5.0.0-alpha.78\",\n    \"clsx\": \"^1.2.1\",\n    \"prism-react-renderer\": \"^1.3.5\",\n    \"react\": \"^17.0.2\",\n    \"react-dom\": \"^17.0.2\",\n    \"react-icons\": \"^4.8.0\",\n    \"react-use\": \"^17.4.0\",\n    \"typedoc\": \"^0.24.7\"\n  },\n  \"devDependencies\": {\n    \"@docusaurus/module-type-aliases\": \"2.4.0\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.5%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"engines\": {\n    \"node\": \">=16.14\"\n  }\n}\n"
  },
  {
    "path": "darc-docs/sidebars.js",
    "content": "/**\n * Creating a sidebar enables you to:\n - create an ordered group of docs\n - render a sidebar for each doc of that group\n - provide next/previous navigation\n\n The sidebars can be generated from the filesystem, or explicitly defined here.\n\n Create as many sidebars as you want.\n */\n\n// @ts-check\n\n/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */\nconst sidebars = {\n    // By default, Docusaurus generates a sidebar from the docs folder structure\n    tutorialSidebar: [\n        {\n            type: 'autogenerated',\n            dirName: '.', // '.' means the current docs folder\n        },\n    ],\n\n    // But you can create a sidebar manually\n    /*\n    tutorialSidebar: [\n      'intro',\n      'hello',\n      {\n        type: 'category',\n        label: 'Tutorial',\n        items: ['tutorial-basics/create-a-document'],\n      },\n    ],\n     */\n};\n\nmodule.exports = sidebars;\n"
  },
  {
    "path": "darc-docs/src/components/HomepageFeatures/index.js",
    "content": "import React from 'react';\nimport clsx from 'clsx';\nimport styles from './styles.module.css';\n\nconst FeatureList = [\n  {\n    title: 'Easy to Use',\n    Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default,\n    description: (\n      <>\n        Docusaurus was designed from the ground up to be easily installed and\n        used to get your website up and running quickly.\n      </>\n    ),\n  },\n  {\n    title: 'Focus on What Matters',\n    Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default,\n    description: (\n      <>\n        Docusaurus lets you focus on your docs, and we&apos;ll do the chores. Go\n        ahead and move your docs into the <code>docs</code> directory.\n      </>\n    ),\n  },\n  {\n    title: 'Powered by React',\n    Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,\n    description: (\n      <>\n        Extend or customize your website layout by reusing React. Docusaurus can\n        be extended while reusing the same header and footer.\n      </>\n    ),\n  },\n];\n\nfunction Feature({Svg, title, description}) {\n  return (\n    <div className={clsx('col col--4')}>\n      <div className=\"text--center\">\n        <Svg className={styles.featureSvg} role=\"img\" />\n      </div>\n      <div className=\"text--center padding-horiz--md\">\n        <h3>{title}</h3>\n        <p>{description}</p>\n      </div>\n    </div>\n  );\n}\n\nexport default function HomepageFeatures() {\n  return (\n    <section className={styles.features}>\n      <div className=\"container\">\n        <div className=\"row\">\n          {FeatureList.map((props, idx) => (\n            <Feature key={idx} {...props} />\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "darc-docs/src/components/HomepageFeatures/styles.module.css",
    "content": ".features {\n  display: flex;\n  align-items: center;\n  padding: 2rem 0;\n  width: 100%;\n}\n\n.featureSvg {\n  height: 200px;\n  width: 200px;\n}\n"
  },
  {
    "path": "darc-docs/src/css/custom.css",
    "content": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framework designed to\n * work well for content-centric websites.\n */\n\n/* You can override the default Infima variables here. */\n:root {\n    --ifm-color-primary: #2e8555;\n    --ifm-color-primary-dark: #29784c;\n    --ifm-color-primary-darker: #277148;\n    --ifm-color-primary-darkest: #205d3b;\n    --ifm-color-primary-light: #33925d;\n    --ifm-color-primary-lighter: #359962;\n    --ifm-color-primary-lightest: #3cad6e;\n    --ifm-code-font-size: 95%;\n    --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1);\n}\n\n/* For readability concerns, you should choose a lighter palette in dark mode. */\n[data-theme='dark'] {\n    --ifm-color-primary: #25c2a0;\n    --ifm-color-primary-dark: #21af90;\n    --ifm-color-primary-darker: #1fa588;\n    --ifm-color-primary-darkest: #1a8870;\n    --ifm-color-primary-light: #29d5b0;\n    --ifm-color-primary-lighter: #32d8b4;\n    --ifm-color-primary-lightest: #4fddbf;\n    --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);\n}\n\n.navbar {\n    backdrop-filter: blur(30px);\n    background: transparent;\n}"
  },
  {
    "path": "darc-docs/src/pages/index.js",
    "content": "import React from 'react';\nimport useDocusaurusContext from '@docusaurus/useDocusaurusContext';\nimport Layout from '@theme/Layout';\nimport {\n    Badge,\n    Box,\n    Button,\n    Card,\n    Container,\n    CssVarsProvider,\n    Grid,\n    Input,\n    Sheet,\n    Stack,\n    styled,\n    Typography\n} from \"@mui/joy\";\nimport {GiChaingun} from \"react-icons/gi\";\nimport {AiOutlineSafety} from \"react-icons/ai\";\nimport {FaFileContract} from \"react-icons/fa\";\nimport {FiCheck, FiChevronRight, FiCopy} from \"react-icons/fi\";\nimport {GoTelescope} from \"react-icons/go\";\n\nimport {useCopyToClipboard} from \"react-use\";\nimport Link from \"@docusaurus/Link\";\nimport {customTheme} from \"../theme\";\n\n// styled docusaurus link without underline and default color\nconst PlainLink = styled(Link)(({theme}) => ({\n    textDecoration: 'none',\n    '&:hover': {\n        textDecoration: 'none',\n        color: 'inherit',\n    }\n}))\n\nfunction HomepageHeader() {\n    const {siteConfig} = useDocusaurusContext();\n    const [text, setText] = React.useState('npm install darcjs ethers@5.7.2');\n    const [state, copyToClipboard] = useCopyToClipboard();\n    const [isCopy, setIsCopy] = React.useState(false);\n\n    // When user copies to clipboard, show tooltip and closed after 1 second\n    const handleCopy = () => {\n        copyToClipboard(text);\n        setIsCopy(true);\n        setTimeout(() => {\n            setIsCopy(false);\n        }, 1000);\n    }\n\n    return (\n        <>\n            <Container maxWidth={\"xl\"} sx={{\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'space-between',\n            }}>\n                <Stack spacing={4}>\n                    <Typography level={'display2'} lineHeight={1.2}>\n                        <Typography component={'span'} color={'primary'}>\n                            Decentralized\n                        </Typography>\n                        <br/> Autonomous <br/> Regulated Corporation\n                    </Typography>\n\n                    <Typography level={'h6'} fontSize={'lg'} sx={(theme) => ({\n                        color: theme.vars.palette.text.tertiary\n                    })}>\n                        From accountability and transparency to innovative decision-making, DARC is <br/>\n                        revolutionizing the way we approach corporate structures. Join the\n                        movement <br/> and\n                        discover\n                        the power of decentralized autonomous corporations.\n                    </Typography>\n\n\n                    <Stack direction={{xs: 'column', sm: 'row'}} spacing={2}>\n                        <Badge badgeContent={'Early test'} color={'warning'} anchorOrigin={{\n                            vertical: 'top',\n                            horizontal: 'right',\n                        }}>\n                            <Button size={'lg'} endDecorator={<FiChevronRight/>}\n                                    component={PlainLink} to={'https://app.darc.app/'}\n                                    sx={{\n                                        '&:hover': {\n                                            color: 'var(--joy-palette-common-white, #FFF)',\n                                        },\n                                        maxWidth: '300px'\n                                    }}\n                            >Launch dApp</Button>\n                        </Badge>\n                        <Box sx={{\n                            cursor: 'pointer',\n                        }}>\n                            <Box onClick={() => handleCopy()}>\n                                <Input\n                                    sx={{\n                                        width: '300px',\n                                        '& .Joy-disabled, .MuiInput-endDecorator': {\n                                            color: 'black',\n                                        }\n                                    }}\n                                    disabled\n                                    size={'lg'}\n                                    endDecorator={isCopy ? <FiCheck/> : <FiCopy/>}\n                                    placeholder={text}/>\n                            </Box>\n                        </Box>\n                    </Stack>\n                </Stack>\n\n                <Box sx={{display: {xs: 'none', xl: 'block'}}}>\n                    <img src={'/img/header-img-1.png'} style={{\n                        height: '600px',\n                    }}/>\n                </Box>\n\n            </Container>\n        </>\n    );\n}\n\nconst Footer = () => {\n    return (\n        <Box textAlign={'center'}>\n            <Typography variant={'body2'} fontSize={'sm'}>\n                © 2023 DARC. All rights reserved.\n            </Typography>\n        </Box>\n    )\n}\n\nconst featureCardData = [\n    {\n        title: 'Decentralization',\n        description: 'Enjoy the benefits of a decentralized operating framework with DARC, eliminating intermediaries and increasing efficiency for businesses.',\n        icon: <GiChaingun/>\n    },\n    {\n        title: 'Transparency',\n        description: 'DARC offers a transparent operating environment for businesses, providing greater trust and accountability for all parties involved.',\n        icon: <GoTelescope/>\n    },\n    {\n        title: 'Trustless Transactions',\n        description: 'Experience a trustless environment for transactions with DARC, where parties can transact and interact with each other without the need for intermediaries or third parties.',\n        icon: <AiOutlineSafety/>\n    },\n    {\n        title: 'Smart Contracts',\n        description: 'Automate business processes and reduce costs with DARC\\'s smart contract technology, providing a more efficient and effective way of conducting business.',\n        icon: <FaFileContract/>\n    }\n]\n\nconst featureCardData2 = [\n    {\n        title: 'Docs',\n        description: 'Simplify your documentation process with Darc\\'s user-friendly and efficient documentation tools.',\n        to: '/docs/Overview/',\n    },\n    {\n        title: 'Github',\n        description: 'Darc\\'s open and decentralized ecosystem empowers businesses with transparency, collaboration, and regulatory compliance.',\n        to: 'https://github.com/project-darc/darc'\n    }\n]\n\nexport default function Home() {\n    const {siteConfig} = useDocusaurusContext();\n    return (\n\n        <Layout\n            title={`Hello from ${siteConfig.title}`}\n            description=\"Description will go into a meta tag in <head />\">\n            <CssVarsProvider disableTransitionOnChange theme={customTheme}>\n                <Box sx={{\n                    background: 'linear-gradient(121deg, rgba(255,255,255,1) 0%, rgba(231,243,255,100) 25%, rgba(255,255,255,1) 40%, rgba(255,255,255,1) 100%)',\n                }}>\n                    <Stack spacing={{\n                        xs: 2,\n                        md: 12\n                    }}>\n                        <Box>\n                            <HomepageHeader/>\n                        </Box>\n\n\n                        <Box>\n                            <Container maxWidth={'xl'}>\n                                <Box>\n                                    <Typography level={'h2'}>\n                                        Features of\n                                        <Typography component={'span'} color={'primary'} ml={1}>\n                                            DARC\n                                        </Typography>\n                                    </Typography>\n\n                                    <Grid container spacing={2} mt={2} alignItems={'stretch'}>\n                                        {featureCardData.map((item, index) => (\n                                            <Grid xs={6} lg={3} key={index} minHeight={'100%'}>\n                                                <Card variant={'soft'} sx={{height: '100%'}}>\n                                                    <Stack spacing={1}>\n                                                        <Typography level={'body1'} fontWeight={'bolder'}\n                                                                    gap={1} display={'flex'}>\n                                                            <Typography component={'span'} alignSelf={'center'}\n                                                                        display={'flex'}\n                                                                        color={'primary'}>\n                                                                {item.icon}\n                                                            </Typography> {item.title}\n                                                        </Typography>\n                                                        <Typography level={'body2'} fontSize={'sm'}\n                                                                    fontWeight={'normal'}>\n                                                            {item.description}\n                                                        </Typography>\n                                                    </Stack>\n                                                </Card>\n                                            </Grid>\n                                        ))}\n                                    </Grid>\n                                </Box>\n                            </Container>\n                        </Box>\n\n                        <Box>\n                            <Container maxWidth={'xl'}>\n                                <Grid container spacing={2} alignItems={'center'}>\n                                    <Grid xs={12} md={6} lg={5}>\n                                        <Box>\n                                            <Typography level={'h2'} mt={5}>\n                                                <Typography component={'span'} color={'primary'} mr={1}>\n                                                    Accelerate\n                                                </Typography>\n                                                delivery <br/> of your corporation\n                                            </Typography>\n\n                                            <Typography level={'body1'} fontSize={'sm'} fontWeight={'normal'} mt={2}\n                                                        sx={(theme) => ({\n                                                            color: theme.vars.palette.text.tertiary\n                                                        })}>\n                                                Unlock the potential of Darc's tools within the DARC ecosystem,\n                                                optimizing\n                                                efficiency and compliance for blockchain-based businesses. Experience a\n                                                streamlined\n                                                approach to project delivery and take your business to the next level\n                                                with\n                                                Darc's\n                                                innovative tools.\n                                            </Typography>\n                                        </Box>\n                                    </Grid>\n\n                                    <Grid xs={12} md={6} sx={(theme) => ({\n                                        '& a': {\n                                            textDecoration: 'none',\n                                        },\n                                    })}>\n                                        <Box>\n                                            <Grid container spacing={2} alignItems={'stretch'}>\n                                                {featureCardData2.map((item, index) => (\n                                                    <Grid xs={6} minHeight={'100%'}>\n                                                        <Sheet variant={'outlined'}\n                                                               sx={theme => ({\n                                                                   p: 2,\n                                                                   borderRadius: 20,\n                                                                   height: '100%'\n                                                               })}>\n                                                            <Stack justifyContent={'space-between'} spacing={1}\n                                                                   height={'100%'}>\n                                                                <Link to={item.to}>\n                                                                    <Stack spacing={1}>\n                                                                        <Typography level={'body1'}\n                                                                                    fontWeight={'bolder'}>\n                                                                            {item.title}\n                                                                        </Typography>\n                                                                        <Typography level={'body2'} fontSize={'sm'}>\n                                                                            {item.description}\n                                                                        </Typography>\n                                                                    </Stack>\n                                                                </Link>\n                                                                <Typography to={item.to} component={PlainLink}\n                                                                            level={'body2'}\n                                                                            fontSize={'sm'} color={'primary'}\n                                                                            fontWeight={'bold'}>\n                                                                    Learn more\n                                                                </Typography>\n                                                            </Stack>\n                                                        </Sheet>\n                                                    </Grid>\n                                                ))}\n                                            </Grid>\n                                        </Box>\n                                    </Grid>\n                                </Grid>\n                            </Container>\n                        </Box>\n                    </Stack>\n\n                    <Box mt={10}>\n                        <Container>\n                            <Footer/>\n                        </Container>\n                    </Box>\n                </Box>\n            </CssVarsProvider>\n        </Layout>\n\n    );\n}\n"
  },
  {
    "path": "darc-docs/src/pages/index.module.css",
    "content": "/**\n * CSS files with the .module.css suffix will be treated as CSS modules\n * and scoped locally.\n */\n\n.heroBanner {\n  padding: 4rem 0;\n  text-align: center;\n  position: relative;\n  overflow: hidden;\n}\n\n@media screen and (max-width: 996px) {\n  .heroBanner {\n    padding: 2rem;\n  }\n}\n\n.buttons {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n"
  },
  {
    "path": "darc-docs/src/pages/markdown-page.md",
    "content": "---\ntitle: Markdown page example\n---\n\n# Markdown page example\n\nYou don't need React to write simple standalone pages.\n"
  },
  {
    "path": "darc-docs/src/theme.ts",
    "content": "import {extendTheme} from '@mui/joy/styles';\n\nexport const customTheme = extendTheme({\n    colorSchemes: {\n        light: {\n            palette: {\n                background: {\n                    body: 'var(--joy-palette-neutral-50)',\n                },\n            },\n        },\n        dark: {\n            palette: {\n                neutral: {\n                    outlinedBorder: 'var(--joy-palette-neutral-700)',\n                },\n            },\n        },\n    },\n    components: {\n        JoyAutocomplete: {\n            styleOverrides: {\n                root: {\n                    boxShadow: 'var(--joy-shadow-xs)',\n                },\n            },\n        },\n        JoyButton: {\n            styleOverrides: {\n                root: {\n                    boxShadow: 'var(--joy-shadow-xs)',\n                    transition: 'all 0.2s ease-in-out',\n                    '&:hover': {\n                        transform: 'scale(1.05)',\n                    },\n                    '&:active': {\n                        transform: 'scale(0.95)',\n                    },\n                },\n            },\n        },\n        JoyInput: {\n            styleOverrides: {\n                root: {\n                    boxShadow: 'var(--joy-shadow-xs)',\n                },\n            },\n        },\n        JoyTextarea: {\n            styleOverrides: {\n                root: {\n                    boxShadow: 'var(--joy-shadow-xs)',\n                },\n            },\n        },\n        JoySelect: {\n            styleOverrides: {\n                root: {\n                    boxShadow: 'var(--joy-shadow-xs)',\n                },\n            },\n        },\n    },\n    fontFamily: {\n        display: \"'Inter', var(--joy-fontFamily-fallback)\",\n        body: \"'Inter', var(--joy-fontFamily-fallback)\",\n    },\n});\n"
  },
  {
    "path": "darc-docs/static/.nojekyll",
    "content": ""
  },
  {
    "path": "darc-js/README.md",
    "content": "# darc.js\n\nThe official JavaScript client and SDK for Project DARC (Decentralized Autonomous Regulated Company), and the compiler and runtime for By-Law Script.\n\n## Quickstart\n\n### Installation\n\nIf you are using Node.js, you can install the package using npm:\n```bash\nnpm install darcjs\n```\n\nor yarn:\n```bash\nyarn add darcjs\n```\n\nor pnpm:\n```bash\npnpm add darcjs\n```\n\n### Run your first By-law Script\n\n\n\n```typescript\nimport {darcjs} from 'darcjs';\nimport {ethers} from 'ethers';\n\n// Your By-law Script\nconst byLawScript = `\nwithdraw_cash_to( \n  [addr4, addr5],     \n  [10000000, 10000000] \n); `;\n\n// Your JSON RPC provider from your blockchain\nconst provider = new ethers.providers.JsonRpcProvider('https://mainnet.infura.io/v3/your-infura-project-id');\n\n// Construct the signer via Wallet class and private key\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\n// deploy DARC\nconst darc_contract_address = await darcjs.deployDARC(\n  DARC_VERSION.Test, signer\n);\n\n// access the deployed DARC via the DARC contract address\nconst myDeployedDARC = new darcjs.DARC({\n  address: darc_contract_address,\n  wallet: signer,\n  version: DARC_VERSION.Test,\n});\n\n// Compile the code snippet above\nconst program = darcjs.transpile(byLawScript);\n\n// Run the program on your deployed DARC\nconst result = await myDeployedDARC.entrance(program);\n\n// Or you can just access to the DARC contract with address and provider, without signer\nconst myDeployedDARC_readOnly = new darcjs.DARC({\n  address: darc_contract_address,\n  provider: provider,\n  version: DARC_VERSION.Test,\n});\n\n// Read information from the DARC\nconst memberList = await myDARC_readOnly.getMemberList();\n```\n\n### Test\n\nBefore running the test, you need to start a Hardhat Network in your neighbour folder `darc-protocol`\n\n```bash\ncd ../darc-protocol\nnpx hardhat node\n```\n\nThen, you can run the test in `darc-js` folder. Run below command in another terminal.\n\n```bash\npnpm run test\n```"
  },
  {
    "path": "darc-js/package.json",
    "content": "{\n  \"devDependencies\": {\n    \"@types/babel-template\": \"^6.25.2\",\n    \"typescript\": \"^4.9.3\"\n  },\n  \"name\": \"darcjs\",\n  \"description\": \"The official JavaScript client and SDK for Project DARC (Decentralized Autonomous Regulated Company), and the compiler and runtime for By-Law Script.\",\n  \"version\": \"0.0.11\",\n  \"main\": \"./dist/darcjs.js\",\n  \"types\": \"./dist/darcjs.d.ts\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/Project-DARC/darc.js.git\"\n  },\n  \"scripts\": {\n    \"test\": \"mocha -r ts-node/register tests/**/*.ts --timeout 100000\",\n    \"build\": \"pnpm test && tsc --build\"\n  },\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"@babel/core\": \"^7.10.5\",\n    \"@babel/preset-env\": \"^7.10.4\",\n    \"@babel/preset-react\": \"^7.12.10\",\n    \"@babel/preset-typescript\": \"^7.10.4\",\n    \"@babel/standalone\": \"^7.10.5\",\n    \"@babel/types\": \"^7.10.5\",\n    \"@ethersproject/bignumber\": \"^5.7.0\",\n    \"@jetblack/operator-overloading\": \"^0.2.0\",\n    \"@types/babel-template\": \"^6.25.2\",\n    \"@types/chai\": \"^4.3.4\",\n    \"@types/mocha\": \"^10.0.1\",\n    \"@types/node\": \"^18.11.17\",\n    \"babel-template\": \"^6.26.0\",\n    \"chai\": \"^4.3.7\",\n    \"ethers\": \"5.7.2\",\n    \"mocha\": \"^10.2.0\",\n    \"ts-node\": \"^10.9.1\"\n  }\n}\n"
  },
  {
    "path": "darc-js/src/DARC/DARC.ts",
    "content": "import * as runtime from '../deployDARC/deployDARC';\nimport { ethers, Contract } from 'ethers';\nimport * as darcBinary from '../darcBinary/darcBinary';\nimport { DARC_VERSION } from '../darcBinary/darcBinary';\nexport {DARC_VERSION}\nexport type InitParam = {\n  address: string;\n  version: darcBinary.DARC_VERSION;\n  wallet?: ethers.Wallet;\n  provider?: ethers.providers.Provider;\n}\n\n\nexport type TokenInfo = {\n  votingWeight: BigInt,\n  dividendWeight: BigInt,\n  tokenInfo: string,\n  totalSupply: BigInt,\n}\n\nexport type MemberInfo = {\n  bIsInitialized: boolean,\n  bIsSuspened: boolean,\n  name: string,\n  role: bigint\n}\n\n\n/**\n * The DARC class is used to interact with the DARC contract.\n */\nexport class DARC {\n  private darcContract: Contract;\n  private darcAddress: string;\n  private darcVersion: darcBinary.DARC_VERSION;\n  private wallet: ethers.Wallet | undefined;\n  private provider: ethers.providers.Provider | undefined;\n\n  /**\n   * The constructor of the DARC class.\n   * @param param: the init param including the address, version, wallet and/or provider.\n   */\n  constructor(param: InitParam) {\n    const { address, version, wallet, provider } = param;\n    this.darcAddress = address;\n    this.darcVersion = version;\n    this.wallet = wallet;\n    this.provider = provider;\n    if (wallet !== undefined) {\n      this.darcContract = new ethers.Contract(address, darcBinary.darcBinary(version).abi, wallet);\n    } else if (provider !== undefined) {\n      this.darcContract = new ethers.Contract(address, darcBinary.darcBinary(version).abi, provider);\n    } else {\n      throw new Error(\"Either wallet or provider should be provided.\");\n    }\n  } \n\n  /**\n   * Run the program on the DARC contract.\n   * @param program: the program to be run.\n   */\n  async entrance(program:any){\n    if (this.wallet === undefined){\n      throw new Error(\"Wallet is not provided for this DARC instance.\");\n    }\n    await this.darcContract.entrance(program);\n  }\n\n  /**\n   * Below are all DARC's dashboard functions, read parameters from the DARC contract.\n   */\n  async getTokenOwners(tokenClass: BigInt): Promise<string[]> {\n    return await this.darcContract.getTokenOwners(tokenClass);\n  }\n\n  async getTokenInfo(tokenClass: BigInt): Promise<TokenInfo> {\n    const result = await this.darcContract.getTokenInfo(tokenClass);\n    //console.log(\"result: \" + JSON.stringify(result));\n    const {0: returnVotingWeight, 1: returnDividendWeight, 2: returnTokenInfo, 3: returnTotalSupply} = result;\n\n    let returnStruct: TokenInfo = {\n      votingWeight: returnVotingWeight,\n      dividendWeight: returnDividendWeight,\n      tokenInfo: returnTokenInfo,\n      totalSupply: returnTotalSupply,\n    };\n\n    return returnStruct;\n  }\n\n  /**\n   * Return the address of the DARC contract.\n   * @returns the address of the DARC contract.\n   */\n  address(): string {\n    return this.darcAddress;\n  }\n\n  /**\n   * Return the number of token classes.\n   * @returns the number of token classes.\n   */\n  async getNumberOfTokenClasses(): Promise<BigInt> {\n    return await this.darcContract.getNumberOfTokenClasses();\n  }\n\n/**\n * Return the balance of the owner for the token class.\n * @param tokenClass the index of the token class.\n * @param owner the address of the owner.\n * @returns the balance of the owner for the token class.\n */\n  async getTokenOwnerBalance(tokenClass: BigInt, owner: string): Promise<BigInt> {\n    return await this.darcContract.getTokenOwnerBalance(tokenClass, owner);\n  }\n\n  /**\n   * Get the DARC plugins.\n   * @returns the number of token classes.\n   */\n  async getPluginInfo(): Promise<any> {\n    return await this.darcContract.getPluginInfo();\n  }\n\n  /**\n   * Get the DARC member list.\n   * @returns the DARC member list.\n  */\n  async getMemberList(): Promise<string[]> {\n    return await this.darcContract.getMemberList();\n  }\n\n  async getMemberInfo(memberAddress:string): Promise<any> {\n    return await this.darcContract.getMemberInfo(memberAddress);\n  }\n\n}"
  },
  {
    "path": "darc-js/src/SDK/Node.ts",
    "content": "import { ConditionNodeStruct, NodeParamStruct } from \"../types/basicTypes\"; \nimport { BigNumberish } from \"ethers\";\n\n/**\n * The node type: AND, OR, NOT, EXPRESSION, TRUE, FALSE, UNDEFINED\n */\ntype NodeType = \"AND\" | \"OR\" | \"NOT\" | \"EXPRESSION\" | \"TRUE\" | \"FALSE\" | \"UNDEFINED\";\n\n/**\n * The core base class for all nodes\n */\nclass Node {\n  type: NodeType;\n  childList: Node[];\n  expressionId: number;\n  nodeParam: NodeParamStruct;\n  constructor() {\n    this.childList = [];\n    this.type = \"UNDEFINED\";\n    this.expressionId = 0;\n    this.nodeParam = {\n      STRING_ARRAY: [],\n      ADDRESS_2DARRAY: [],\n      UINT256_2DARRAY: [],\n      BYTES: [],\n    }\n   }\n\n   /** \n    * Just generate a condition node struct for the expression node\n    * @param id The id of the condition node\n    * @returns The condition node struct\n   */\n   private generateExpressionConditionNodeStruct(id: bigint): ConditionNodeStruct {\n    if (this.type !== \"EXPRESSION\") {\n      throw new Error(\"Node type is not EXPRESSION\");\n    }\n    const conditionNodeStruct: ConditionNodeStruct = {\n      id: id,\n      nodeType: 1,\n      logicalOperator:0,\n      conditionExpression: this.expressionId,\n      childList: [],\n      param: this.nodeParam,\n    };\n    return conditionNodeStruct;\n  }\n\n  /**\n   * Generate a condition node struct for BOOLEAN_TRUE or BOOLEAN_FALSE\n   * @param id The id of the condition node\n   * @returns The condition node struct\n   */\n  private generateBooleanConditionNodeStruct(id: bigint): ConditionNodeStruct {\n    if (this.type !== \"TRUE\" && this.type !== \"FALSE\") {\n      throw new Error(\"Node type is not TRUE or FALSE\");\n    }\n    if (this.type === \"TRUE\") {\n      const conditionNodeStruct: ConditionNodeStruct = {\n        id: id,\n        nodeType: 3,\n        logicalOperator: 0,\n        conditionExpression: 0,\n        childList: [],\n        param: this.nodeParam,\n      };\n      return conditionNodeStruct;\n    }\n    else {\n      const conditionNodeStruct: ConditionNodeStruct = {\n        id: id,\n        nodeType: 4,\n        logicalOperator: 0,\n        conditionExpression: 0,\n        childList: [],\n        param: this.nodeParam,\n      };\n      return conditionNodeStruct;\n    }\n  }\n\n  /**\n   * Generate a list of condition node structs for the AND node\n   * For example, if the AND node has 2 children, and the ID = 5, then the list will be:\n   * [\n   *   AND(5),\n   *   EXPRESSION_NODE(6),\n   *   EXPRESSION_NODE(7)\n   * ]\n   * @param id The id of the condition node\n   */\n  private generate_AND_or_OR_or_NOT_ConditionNodeStructList(id: bigint): ConditionNodeStruct[] {\n    let returnArray: ConditionNodeStruct[] = [];\n    if (this.type !== \"AND\" && this.type !== \"OR\" && this.type !== \"NOT\") {\n      throw new Error(\"Node type is not AND or OR node\");\n    }\n    let nodeType: number = 1;\n    if (this.type === \"OR\") {\n      nodeType = 2;\n    }\n    else if (this.type === \"NOT\") {\n      nodeType = 3;\n    }\n    const node0: ConditionNodeStruct = {\n      id: id,\n      nodeType: 2,  // logical operator\n      logicalOperator: nodeType,  // AND or OR or NOT\n      conditionExpression: 0,\n      childList: [],\n      param: this.nodeParam,\n    }\n    \n    const resultList = [];\n    let pointer = 0;\n    for (let i = 0; i < this.childList.length; i++) {\n      pointer += 1;\n      const  currentChildNode = this.childList[i];\n      if (currentChildNode.type === \"EXPRESSION\") {\n        resultList.push(currentChildNode.generateExpressionConditionNodeStruct(id + BigInt(pointer)));\n        node0.childList.push(id + BigInt(pointer));\n        //returnArray.push(currentChildNode.generateExpressionConditionNodeStruct(id + BigInt(i + 1)));\n      }\n      else if (currentChildNode.type === \"TRUE\" || currentChildNode.type === \"FALSE\") {\n        //returnArray.push(currentChildNode.generateBooleanConditionNodeStruct(id + BigInt(i + 1)));\n        resultList.push(currentChildNode.generateBooleanConditionNodeStruct(id + BigInt(pointer)));\n        node0.childList.push(id + BigInt(pointer));\n      }\n      else if (currentChildNode.type === \"AND\" || currentChildNode.type === \"OR\" || currentChildNode.type === \"NOT\") {\n        const result = currentChildNode.generate_AND_or_OR_or_NOT_ConditionNodeStructList(id + BigInt(pointer));\n        node0.childList.push(result[0].id);\n        resultList.push(result);\n        pointer += result.length - 1;\n      }\n      else if (currentChildNode.type === \"UNDEFINED\") {\n        throw new Error(\"Undefined node is not allowed\");\n      }\n    }\n    returnArray.push(node0);\n    for (let i = 0; i < resultList.length; i++) {\n      returnArray = returnArray.concat(resultList[i]);\n    }\n    return returnArray;\n  }\n\n  /**\n   * Generate a list of condition node structs for any node\n   * This is the root function for generating the condition node struct list\n   * All condition node list should be generated from this function\n   * @param id The id of the condition node\n   */\n  generateConditionNodeList(): ConditionNodeStruct[] {\n    if (this.type === \"EXPRESSION\") {\n      return [this.generateExpressionConditionNodeStruct(BigInt(0))];\n    }\n    else if (this.type === \"TRUE\" || this.type === \"FALSE\") {\n      return [this.generateBooleanConditionNodeStruct(BigInt(0))];\n    }\n    else if (this.type === \"UNDEFINED\") {\n      return [{\n        id: BigInt(0),\n        nodeType: BigInt(0),\n        logicalOperator: BigInt(0),\n        conditionExpression: BigInt(0),\n        childList: [],\n        param: this.nodeParam,\n      }];\n    }\n    else if (this.type === \"AND\" || this.type === \"OR\" || this.type === \"NOT\") {\n      return this.generate_AND_or_OR_or_NOT_ConditionNodeStructList(BigInt(0));\n    }\n    return [];\n  }\n\n  /**\n   * Operator overloading for AND node\n   * @param other The other node\n   * @returns The AND node\n   */\n  [Symbol.for('&')](other: Node): Node {\n    if (this.type === \"UNDEFINED\" || other.type === \"UNDEFINED\") {\n      throw new Error(\"Undefined node is not allowed\");\n    }\n    return new AND(this, other);\n  }\n\n  /**\n   * The operator overloading for OR node\n   * @param other The other node\n   * @returns The OR node\n   */\n  [Symbol.for('|')](other: Node): Node {\n    if (this.type === \"UNDEFINED\" || other.type === \"UNDEFINED\") {\n      throw new Error(\"Undefined node is not allowed\");\n    }\n    return new OR(this, other);\n  }\n}\n\nclass AND extends Node {\n  constructor(... args:Node[]) {\n    super();\n    if (args.length <= 1) {\n      throw new Error(\"AND node must have at least 2 children\");\n    }\n    this.processChildList(args);\n    this.type = \"AND\";\n  }\n\n  processChildList(childList: Node[]) {\n    for (let i = 0; i < childList.length; i++) {\n      if (childList[i].type === \"UNDEFINED\") {\n        continue;\n      }\n      else if (childList[i].type === \"AND\") {\n        this.processAndNode(childList[i]);\n      } else {\n        this.childList.push(childList[i]);\n      }\n    }\n  }\n\n  processAndNode(node: Node) {\n    for (let i = 0; i < node.childList.length; i++) {\n      if (node.childList[i].type === \"UNDEFINED\") {\n        continue;\n      }\n      else if (node.childList[i].type === \"AND\") {\n        this.processChildList(node.childList[i].childList);\n      } else {\n        this.childList.push(node.childList[i]);\n      }\n    }\n  }\n}\n\nclass OR extends Node {\n  constructor(... args:Node[]) {\n    super();\n    if (args.length <= 1) {\n      throw new Error(\"OR node must have at least 2 children\");\n    }\n    this.processChildList(args);\n    this.type = \"OR\";\n  }\n\n  processChildList(childList: Node[]) {\n    for (let i = 0; i < childList.length; i++) {\n      if (childList[i].type === \"UNDEFINED\") {\n        continue;\n      }\n      else if (childList[i].type === \"OR\") {\n        this.processOrNode(childList[i]);\n      } else {\n        this.childList.push(childList[i]);\n      }\n    }\n  }\n\n  processOrNode(node: Node) {\n    for (let i = 0; i < node.childList.length; i++) {\n      if (node.childList[i].type === \"UNDEFINED\") {\n        continue;\n      }\n      else if (node.childList[i].type === \"OR\") {\n        this.processChildList(node.childList[i].childList);\n      } else {\n        this.childList.push(node.childList[i]);\n      }\n    }\n  }\n}\n\nclass NOT extends Node {\n  constructor(node:Node) {\n    super();\n    if (node.type === \"UNDEFINED\") {\n      throw new Error(\"NOT node must have a valid child\");\n    }\n    this.childList.push(node);\n    this.type = \"NOT\";\n  }\n}\n\nclass EXPRESSION extends Node {\n  constructor(expressionId:number, nodeParam?:NodeParamStruct | undefined) {\n    super();\n    this.expressionId = expressionId;\n    if (nodeParam) {\n      this.nodeParam = nodeParam;\n    }\n    this.type = \"EXPRESSION\";\n  }\n}\n\nclass TRUE extends Node {\n  constructor() {\n    super();\n    this.type = \"TRUE\";\n  }\n}\n\nclass FALSE extends Node {\n  constructor() {\n    super();\n    this.type = \"FALSE\";\n  }\n}\n\n// below are wrapper functions for all the nodes above\n// so that user can initialize the nodes without using new keyword\n\nfunction and(... args:Node[]): Node {\n  return new AND(... args);\n}\n\nfunction or(... args:Node[]): Node {\n  return new OR(... args);\n}\n\nfunction not(node:Node): Node {\n  return new NOT(node);\n}\n\nfunction expression(expressionId:number, nodeParam?:NodeParamStruct | undefined): Node {\n  return new EXPRESSION(expressionId, nodeParam);\n}\n\nfunction boolean_true(): Node {\n  return new TRUE();\n}\n\nfunction boolean_false(): Node {\n  return new FALSE();\n}\n\nfunction node(): Node {\n  return new Node();\n}\n\n// export everything \nexport {\n  Node,\n  AND,\n  OR,\n  NOT,\n  EXPRESSION,\n  TRUE,\n  FALSE,\n  NodeType,\n  and,\n  or,\n  not,\n  expression,\n  boolean_true,\n  boolean_false,\n  node,\n};"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_BatchOp.ts",
    "content": "import { expression } from '../Node';\n\n/**\n * Batch operation-related condition nodes\n| 211 | BATCH_OP_SIZE_GREATER_THAN | UINT256_2DARRAY[0][0] batchSize ||\n| 212 | BATCH_OP_SIZE_LESS_THAN | UINT256_2DARRAY[0][0] batchSize ||\n| 213 | BATCH_OP_SIZE_IN_RANGE | UINT256_2DARRAY[0][0] startBatchSize, UINT256_2DARRAY[0][0] endBatchSize ||\n| 214 | BATCH_OP_SIZE_EQUALS | UINT256_2DARRAY[0][0] batchSize ||\n| 215 | BATCH_OP_EACH_TARGET_ADDRESSES_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 216 | BATCH_OP_EACH_TARGET_ADDRESSES_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 217 | BATCH_OP_EACH_TARGET_ADDRESSES_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 218 | BATCH_OP_ANY_TARGET_ADDRESS_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 219 | BATCH_OP_ANY_TARGET_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 220 | BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 221 | BATCH_OP_EACH_TARGET_ADDRESS_TO_ITSELF |  ||\n| 222 | BATCH_OP_ANY_TARGET_ADDRESS_TO_ITSELF |  ||\n| 223 | BATCH_OP_EACH_SOURCE_ADDRESS_EQUALS | ADDRESS_2DARRAY[0][0] sourceAddress ||\n| 224 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] sourceAddressArray ||\n| 225 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 226 | BATCH_OP_ANY_SOURCE_ADDRESS_EQUAL | ADDRESS_2DARRAY[0][0] sourceAddress ||\n| 227 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_LIST | ADDRESS_2DARRAY[0] sourceAddressArray ||\n| 228 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE | UINT256_2DARRAY[0][0] memberRole ||\n| 229 | BATCH_OP_EACH_SOURCE_ADDRESS_FROM_ITSELF |  ||\n| 230 | BATCH_OP_ANY_SOURCE_ADDRESS_FROM_ITSELF |  |\n| 231 | BATCH_OP_EACH_TOKEN_CLASS_EQUALS | UINT256_2DARRAY[0][0] tokenClass ||\n| 232 | BATCH_OP_EACH_TOKEN_CLASS_IN_LIST | UINT256_2DARRAY[0] tokenClassArray ||\n| 233 | BATCH_OP_EACH_TOKEN_CLASS_IN_RANGE | UINT256_2DARRAY[0][0] startTokenClass, UINT256_2DARRAY[0][0] endTokenClass ||\n| 234 | BATCH_OP_EACH_TOKEN_CLASS_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 235 | BATCH_OP_EACH_TOKEN_CLASS_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 236 | BATCH_OP_TOTAL_TOKEN_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 237 | BATCH_OP_TOTAL_TOKEN_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 238 | BATCH_OP_TOTAL_TOKEN_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 239 | BATCH_OP_TOTAL_TOKEN_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 240 | BATCH_OP_ANY_TOKEN_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 241 | BATCH_OP_ANY_TOKEN_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 242 | BATCH_OP_ANY_TOKEN_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 243 | BATCH_OP_ANY_TOKEN_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 244 | BATCH_OP_ANY_TOKEN_CLASS_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 245 | BATCH_OP_ANY_TOKEN_CLASS_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass ||\n| 246 | BATCH_OP_ANY_TOKEN_CLASS_IN_RANGE | UINT256_2DARRAY[0][0] startTokenClass, UINT256_2DARRAY[0][0] endTokenClass ||\n| 247 | BATCH_OP_ANY_TOKEN_CLASS_EQUALS | UINT256_2DARRAY[0][0] tokenClass ||\n| 248 | BATCH_OP_ANY_TOKEN_CLASS_IN_LIST | UINT256_2DARRAY[0] tokenClassArray ||\n| 249 | BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 250 | BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 251 | BATCH_OP_EACH_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 252 | BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST | UINT256_2DARRAY[0] memberRoleArray ||\n| 253 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 254 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 255 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 256 | BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 257 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 258 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 259 | BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 260 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 261 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 262 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 263 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 264 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 265 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 266 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 267 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 268 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 269 | BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 270 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 271 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 272 | BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][1] endAmount ||\n| 273 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount ||\n| 274 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount ||\n| 275 | BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startAmount, UINT256_2DARRAY[0][2] endAmount ||\n| 276 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount |\n| 277 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount |\n| 278 | BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startAmount, UINT256_2DARRAY[0][2] endAmount |\n */\n\nfunction batch_op_size_greater_than(batchSize: number) {\n  return expression(211, {\n    UINT256_2DARRAY: [[batchSize]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_size_less_than(batchSize: number) {\n  return expression(212, {\n    UINT256_2DARRAY: [[batchSize]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_size_in_range(startBatchSize: number, endBatchSize: number) {\n  return expression(213, {\n    UINT256_2DARRAY: [[startBatchSize, endBatchSize]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_size_equals(batchSize: number) {\n  return expression(214, {\n    UINT256_2DARRAY: [[batchSize]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_addresses_equals(targetAddress: string) {\n  return expression(215, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[targetAddress]],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_addresses_in_list(targetAddressArray: string[]) {\n  return expression(216, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [targetAddressArray],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_addresses_in_member_role(memberRole: number) {\n  return expression(217, {\n    UINT256_2DARRAY: [[memberRole]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_equals(targetAddress: string) {\n  return expression(218, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[targetAddress]],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_in_list(targetAddressArray: string[]) {\n  return expression(219, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [targetAddressArray],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_in_member_role(memberRole: number) {\n  return expression(220, {\n    UINT256_2DARRAY: [[memberRole]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_to_itself() {\n  return expression(221, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_to_itself() {\n  return expression(222, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_source_address_equals(sourceAddress: string) {\n  return expression(223, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[sourceAddress]],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_source_address_in_list(sourceAddressArray: string[]) {\n  return expression(224, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [sourceAddressArray],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_source_address_in_member_role(memberRole: number) {\n  return expression(225, {\n    UINT256_2DARRAY: [[memberRole]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_source_address_equal(sourceAddress: string) {\n  return expression(226, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[sourceAddress]],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_source_address_in_list(sourceAddressArray: string[]) {\n  return expression(227, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [sourceAddressArray],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_source_address_in_member_role(memberRole: number) {\n  return expression(228, {\n    UINT256_2DARRAY: [[memberRole]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_source_address_from_itself() {\n  return expression(229, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_source_address_from_itself() {\n  return expression(230, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_token_class_equals(tokenClass: number) {\n  return expression(231, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_token_class_in_list(tokenClassArray: number[]) {\n  return expression(232, {\n    UINT256_2DARRAY: [tokenClassArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_token_class_in_range(startTokenClass: number, endTokenClass: number) {\n  return expression(233, {\n    UINT256_2DARRAY: [[startTokenClass, endTokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_token_class_greater_than(tokenClass: number) {\n  return expression(234, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_token_class_less_than(tokenClass: number) {\n  return expression(235, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_total_token_amount_greater_than(amount: number) {\n  return expression(236, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_total_token_amount_less_than(amount: number) {\n  return expression(237, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_total_token_amount_in_range(startAmount: number, endAmount: number) {\n  return expression(238, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_total_token_amount_equals(amount: number) {\n  return expression(239, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_amount_greater_than(amount: number) {\n  return expression(240, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_amount_less_than(amount: number) {\n  return expression(241, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_amount_in_range(startAmount: number, endAmount: number) {\n  return expression(242, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_amount_equals(amount: number) {\n  return expression(243, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_class_greater_than(tokenClass: number) {\n  return expression(244, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_class_less_than(tokenClass: number) {\n  return expression(245, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_class_in_range(startTokenClass: number, endTokenClass: number) {\n  return expression(246, {\n    UINT256_2DARRAY: [[startTokenClass, endTokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_class_equals(tokenClass: number) {\n  return expression(247, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_token_class_in_list(tokenClassArray: number[]) {\n  return expression(248, {\n    UINT256_2DARRAY: [tokenClassArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_source_address_in_member_role_list(memberRoleArray: number[]) {\n  return expression(249, {\n    UINT256_2DARRAY: [memberRoleArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_source_address_in_member_role_list(memberRoleArray: number[]) {\n  return expression(250, {\n    UINT256_2DARRAY: [memberRoleArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_in_member_role_list(memberRoleArray: number[]) {\n  return expression(251, {\n    UINT256_2DARRAY: [memberRoleArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_in_member_role_list(memberRoleArray: number[]) {\n  return expression(252, {\n    UINT256_2DARRAY: [memberRoleArray],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_withdrawable_cash_greater_than(amount: number) {\n  return expression(253, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_withdrawable_cash_less_than(amount: number) {\n  return expression(254, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_withdrawable_cash_in_range(startAmount: number, endAmount: number) {\n  return expression(255, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_withdrawable_cash_equals(amount: number) {\n  return expression(256, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_withdrawable_cash_greater_than(amount: number) {\n  return expression(257, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_withdrawable_cash_less_than(amount: number) {\n  return expression(258, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_withdrawable_cash_in_range(startAmount: number, endAmount: number) {\n  return expression(259, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_voting_weight_greater_than(amount: number) {\n  return expression(260, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_voting_weight_less_than(amount: number) {\n  return expression(261, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_voting_weight_in_range(startAmount: number, endAmount: number) {\n  return expression(262, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_voting_weight_equals(amount: number) {\n  return expression(263, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_voting_weight_greater_than(amount: number) {\n  return expression(264, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_voting_weight_less_than(amount: number) {\n  return expression(265, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_voting_weight_in_range(startAmount: number, endAmount: number) {\n  return expression(266, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_dividend_weight_greater_than(amount: number) {\n  return expression(267, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_dividend_weight_less_than(amount: number) {\n  return expression(268, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_total_dividend_weight_in_range(startAmount: number, endAmount: number) {\n  return expression(269, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_dividend_weight_greater_than(amount: number) {\n  return expression(270, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_dividend_weight_less_than(amount: number) {\n  return expression(271, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_total_dividend_weight_in_range(startAmount: number, endAmount: number) {\n  return expression(272, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_owns_token_x_greater_than(tokenClass: number, amount: number) {\n  return expression(273, {\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_owns_token_x_less_than(tokenClass: number, amount: number) {\n  return expression(274, {\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_each_target_address_owns_token_x_in_range(tokenClass: number, startAmount: number, endAmount: number) {\n  return expression(275, {\n    UINT256_2DARRAY: [[tokenClass, startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_owns_token_x_greater_than(tokenClass: number, amount: number) {\n  return expression(276, {\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_owns_token_x_less_than(tokenClass: number, amount: number) {\n  return expression(277, {\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction batch_op_any_target_address_owns_token_x_in_range(tokenClass: number, startAmount: number, endAmount: number) {\n  return expression(278, {\n    UINT256_2DARRAY: [[tokenClass, startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport {\n  batch_op_size_greater_than,\n  batch_op_size_less_than,\n  batch_op_size_in_range,\n  batch_op_size_equals,\n  batch_op_each_target_addresses_equals,\n  batch_op_each_target_addresses_in_list,\n  batch_op_each_target_addresses_in_member_role,\n  batch_op_any_target_address_equals,\n  batch_op_any_target_address_in_list,\n  batch_op_any_target_address_in_member_role,\n  batch_op_each_target_address_to_itself,\n  batch_op_any_target_address_to_itself,\n  batch_op_each_source_address_equals,\n  batch_op_each_source_address_in_list,\n  batch_op_each_source_address_in_member_role,\n  batch_op_any_source_address_equal,\n  batch_op_any_source_address_in_list,\n  batch_op_any_source_address_in_member_role,\n  batch_op_each_source_address_from_itself,\n  batch_op_any_source_address_from_itself,\n  batch_op_each_token_class_equals,\n  batch_op_each_token_class_in_list,\n  batch_op_each_token_class_in_range,\n  batch_op_each_token_class_greater_than,\n  batch_op_each_token_class_less_than,\n  batch_op_total_token_amount_greater_than,\n  batch_op_total_token_amount_less_than,\n  batch_op_total_token_amount_in_range,\n  batch_op_total_token_amount_equals,\n  batch_op_any_token_amount_greater_than,\n  batch_op_any_token_amount_less_than,\n  batch_op_any_token_amount_in_range,\n  batch_op_any_token_amount_equals,\n  batch_op_any_token_class_greater_than,\n  batch_op_any_token_class_less_than,\n  batch_op_any_token_class_in_range,\n  batch_op_any_token_class_equals,\n  batch_op_any_token_class_in_list,\n  batch_op_each_source_address_in_member_role_list,\n  batch_op_any_source_address_in_member_role_list,\n  batch_op_each_target_address_in_member_role_list,\n  batch_op_any_target_address_in_member_role_list,\n  batch_op_each_target_address_withdrawable_cash_greater_than,\n  batch_op_each_target_address_withdrawable_cash_less_than,\n  batch_op_each_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_withdrawable_cash_equals,\n  batch_op_any_target_address_withdrawable_cash_greater_than,\n  batch_op_any_target_address_withdrawable_cash_less_than,\n  batch_op_any_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_total_voting_weight_greater_than,\n  batch_op_each_target_address_total_voting_weight_less_than,\n  batch_op_each_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_voting_weight_equals,\n  batch_op_any_target_address_total_voting_weight_greater_than,\n  batch_op_any_target_address_total_voting_weight_less_than,\n  batch_op_any_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_dividend_weight_greater_than,\n  batch_op_each_target_address_total_dividend_weight_less_than,\n  batch_op_each_target_address_total_dividend_weight_in_range,\n  batch_op_any_target_address_total_dividend_weight_greater_than,\n  batch_op_any_target_address_total_dividend_weight_less_than,\n  batch_op_any_target_address_total_dividend_weight_in_range,\n  batch_op_each_target_address_owns_token_x_greater_than,\n  batch_op_each_target_address_owns_token_x_less_than,\n  batch_op_each_target_address_owns_token_x_in_range,\n  batch_op_any_target_address_owns_token_x_greater_than,\n  batch_op_any_target_address_owns_token_x_less_than,\n  batch_op_any_target_address_owns_token_x_in_range\n};\n\n"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_CreateTokenClass.ts",
    "content": "import {expression} from \"../Node\";\n\n/**\n * CreateTokenClass-related condition nodes\n| 501 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 502 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 503 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0]startWeight, UINT256_2DARRAY[0][1] endWeight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 504 | CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 505 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 506 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_LESS_THAN | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 507 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0]  startWeight, UINT256_2DARRAY[0][1] endWeight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n| 508 | CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_EQUALS | UINT256_2DARRAY[0][0] weight | For \"BATCH_CREATE_TOKEN_CLASSES\" operation.\n */\n\nfunction create_token_classes_any_token_dividend_weight_greater_than(weight: bigint) {\n  return expression(501, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_token_dividend_weight_less_than(weight: bigint) {\n  return expression(502, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_token_dividend_weight_in_range(startWeight: bigint, endWeight: bigint) {\n  return expression(503, {\n    UINT256_2DARRAY: [[startWeight, endWeight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_token_dividend_weight_equals(weight: bigint) {\n  return expression(504, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_voting_weight_greater_than(weight: bigint) {\n  return expression(505, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_voting_weight_less_than(weight: bigint) {\n  return expression(506, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_voting_weight_in_range(startWeight: bigint, endWeight: bigint) {\n  return expression(507, {\n    UINT256_2DARRAY: [[startWeight, endWeight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction create_token_classes_any_voting_weight_equals(weight: bigint) {\n  return expression(508, {\n    UINT256_2DARRAY: [[weight]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport {\n  create_token_classes_any_token_dividend_weight_greater_than,\n  create_token_classes_any_token_dividend_weight_less_than,\n  create_token_classes_any_token_dividend_weight_in_range,\n  create_token_classes_any_token_dividend_weight_equals,\n  create_token_classes_any_voting_weight_greater_than,\n  create_token_classes_any_voting_weight_less_than,\n  create_token_classes_any_voting_weight_in_range,\n  create_token_classes_any_voting_weight_equals\n};"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_MachineState.ts",
    "content": "import {\n  expression\n } from '../Node';\n\n/**\n * Machine-state-related related expressions\n| 51 | TIMESTAMP_GREATER_THAN | UINT256_2DARRAY[0][0] timestamp | The current timestamp is greater than timestamp|\n| 52 | TIMESTAMP_LESS_THAN | UINT256_2DARRAY[0][0] timestamp | The current timestamp is less than timestamp|\n| 53 | TIMESTAMP_IN_RANGE | UINT256_2DARRAY[0][0] startTimestamp, UINT256_2DARRAY[0][0] endTimestamp | The current timestamp is in the range of [startTimestamp, endTimestamp]|\n| 54 | DATE_YEAR_GREATER_THAN | UINT256_2DARRAY[0][0] year | The current year is greater than year|\n| 55 | DATE_YEAR_LESS_THAN | UINT256_2DARRAY[0][0] year | The current year is less than year|\n| 56 | DATE_YEAR_IN_RANGE | UINT256_2DARRAY[0][0] startYear, UINT256_2DARRAY[0][0] endYear | The current year is in the range of [startYear, endYear]|\n| 57 | DATE_MONTH_GREATER_THAN | UINT256_2DARRAY[0][0] month | The current month is greater than month|\n| 58 | DATE_MONTH_LESS_THAN | UINT256_2DARRAY[0][0] month | The current month is less than month|\n| 59 | DATE_MONTH_IN_RANGE | UINT256_2DARRAY[0][0] startMonth, UINT256_2DARRAY[0][0] endMonth | The current month is in the range of [startMonth, endMonth]|\n| 60 | DATE_DAY_GREATER_THAN | UINT256[0][0] day | The current day is greater than day|\n| 61 | DATE_DAY_LESS_THAN | UINT256[0][0] day | The current day is less than day|\n| 62 | DATE_DAY_IN_RANGE | UINT256[0][0] startDay, UINT256[0][0] endDay | The current day is in the range of [startDay, endDay]|\n| 63 | DATE_HOUR_GREATER_THAN | uint256 hour | The current hour is greater than hour|\n| 64 | DATE_HOUR_LESS_THAN | uint256 hour | The current hour is less than hour|\n| 65 | DATE_HOUR_IN_RANGE | uint256 startHour, uint256 endHour | The current hour is in the range of [startHour, endHour]|\n| 66 | ADDRESS_VOTING_WEIGHT_GREATER_THAN | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has more than amount of voting weight|\n| 67 | ADDRESS_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has less than amount of voting weight|\n| 68 | ADDRESS_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has voting weight in the range of [startingAmount, endingAmount]|\n| 69 | ADDRESS_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has more than amount of dividend weight|\n| 70 | ADDRESS_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount, ADDRESS_2DARRAY[0][0] address  | The address has less than amount of dividend weight|\n| 71 | ADDRESS_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] amount , ADDRESS_2DARRAY[0][0] address ||\n| 72 | ADDRESS_TOKEN_X_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 73 | ADDRESS_TOKEN_X_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 74 | ADDRESS_TOKEN_X_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount, ADDRESS_2DARRAY[0][0] address  ||\n| 75 | TOTAL_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0][0] amount  ||\n| 76 | TOTAL_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount  ||\n| 77 | TOTAL_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] amount  ||\n| 78 | TOTAL_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount  ||\n| 79 | TOTAL_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount  ||\n| 80 | TOTAL_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] amount  ||\n| 81 | TOTAL_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 82 | TOTAL_CASH_LESS_THAN   | UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 83 | TOTAL_CASH_IN_RANGE| UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 84 | TOTAL_CASH_EQUALS| UINT256_2DARRAY[0][0] amount  || NOT READY, DO NOT USE\n| 85 | TOKEN_IN_LIST_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 86 | TOKEN_IN_LIST_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 87 | TOKEN_IN_LIST_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] startAmount, UINT256_2DARRAY[1][1] endAmount  ||\n| 88 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 89 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 90 | TOKEN_IN_LIST_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount  ||\n| 91 | TOKEN_IN_LIST_AMOUNT_GREATER_THAN   | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 92 | TOKEN_IN_LIST_AMOUNT_LESS_THAN | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 93 | TOKEN_IN_LIST_AMOUNT_IN_RANGE  | UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n| 94 | TOKEN_IN_LIST_AMOUNT_EQUALS| UINT256_2DARRAY[0] tokenClassList,  UINT256_2DARRAY[1][0] amount ||\n * */\n\nfunction timestamp_greater_than(timestamp: number) {\n  return expression(51, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[timestamp]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction timestamp_less_than(timestamp: number) {\n  return expression(52, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[timestamp]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction timestamp_in_range(startTimestamp: number, endTimestamp: number) {\n  return expression(53, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startTimestamp, endTimestamp]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_year_greater_than(year: number) {\n  return expression(54, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[year]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_year_less_than(year: number) {\n  return expression(55, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[year]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_year_in_range(startYear: number, endYear: number) {\n  return expression(56, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startYear, endYear]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_month_greater_than(month: number) {\n  return expression(57, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[month]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_month_less_than(month: number) {\n  return expression(58, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[month]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_month_in_range(startMonth: number, endMonth: number) {\n  return expression(59, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startMonth, endMonth]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_day_greater_than(day: number) {\n  return expression(60, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[day]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_day_less_than(day: number) {\n  return expression(61, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[day]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_day_in_range(startDay: number, endDay: number) {\n  return expression(62, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startDay, endDay]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_hour_greater_than(hour: number) {\n  return expression(63, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[hour]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_hour_less_than(hour: number) {\n  return expression(64, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[hour]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction date_hour_in_range(startHour: number, endHour: number) {\n  return expression(65, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startHour, endHour]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_greater_than(amount: number, address: string) {\n  return expression(66, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_less_than(amount: number, address: string) {\n  return expression(67, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_in_range(amount: number, address: string) {\n  return expression(68, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_greater_than(amount: number, address: string) {\n  return expression(69, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_less_than(amount: number, address: string) {\n  return expression(70, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_in_range(amount: number, address: string) {\n  return expression(71, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_token_x_greater_than(tokenClass: number, amount: number, address: string) {\n  return expression(72, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_token_x_less_than(tokenClass: number, amount: number, address: string) {\n  return expression(73, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_token_x_in_range(tokenClass: number, amount: number, address: string) {\n  return expression(74, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction total_voting_weight_greater_than(amount: number) {\n  return expression(75, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_voting_weight_less_than(amount: number) {\n  return expression(76, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_voting_weight_in_range(amount: number) {\n  return expression(77, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_dividend_weight_greater_than(amount: number) {\n  return expression(78, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_dividend_weight_less_than(amount: number) {\n  return expression(79, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_dividend_weight_in_range(amount: number) {\n  return expression(80, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_cash_greater_than(amount: number) {\n  return expression(81, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_cash_less_than(amount: number) {\n  return expression(82, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_cash_in_range(amount: number) {\n  return expression(83, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction total_cash_equals(amount: number) {\n  return expression(84, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_voting_weight_greater_than(tokenClassList: number[], amount: number) {\n  return expression(85, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_voting_weight_less_than(tokenClassList: number[], amount: number) {\n  return expression(86, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_voting_weight_in_range(tokenClassList: number[], startAmount: number, endAmount: number) {\n  return expression(87, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [startAmount, endAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_dividend_weight_greater_than(tokenClassList: number[], amount: number) {\n  return expression(88, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_dividend_weight_less_than(tokenClassList: number[], amount: number) {\n  return expression(89, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_dividend_weight_in_range(tokenClassList: number[], amount: number) {\n  return expression(90, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_amount_greater_than(tokenClassList: number[], amount: number) {\n  return expression(91, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_amount_less_than(tokenClassList: number[], amount: number) {\n  return expression(92, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_amount_in_range(tokenClassList: number[], amount: number) {\n  return expression(93, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_in_list_amount_equals(tokenClassList: number[], amount: number) {\n  return expression(94, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [tokenClassList, [amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_percenrage_greater_than(amount: number, address: string) {\n  return expression(95, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_percenrage_less_than(amount: number, address: string) {\n  return expression(96, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_voting_weight_percenrage_in_range(amount: number, address: string) {\n  return expression(97, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_percenrage_greater_than(amount: number, address: string) {\n  return expression(98, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_percenrage_less_than(amount: number, address: string) {\n  return expression(99, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\nfunction address_dividend_weight_percenrage_in_range(amount: number, address: string) {\n  return expression(100, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [[address]],\n    BYTES: []\n  });\n}\n\n\nexport {\n  timestamp_greater_than,\n  timestamp_less_than,\n  timestamp_in_range,\n  date_year_greater_than,\n  date_year_less_than,\n  date_year_in_range,\n  date_month_greater_than,\n  date_month_less_than,\n  date_month_in_range,\n  date_day_greater_than,\n  date_day_less_than,\n  date_day_in_range,\n  date_hour_greater_than,\n  date_hour_less_than,\n  date_hour_in_range,\n  address_voting_weight_greater_than,\n  address_voting_weight_less_than,\n  address_voting_weight_in_range,\n  address_dividend_weight_greater_than,\n  address_dividend_weight_less_than,\n  address_dividend_weight_in_range,\n  address_token_x_greater_than,\n  address_token_x_less_than,\n  address_token_x_in_range,\n  total_voting_weight_greater_than,\n  total_voting_weight_less_than,\n  total_voting_weight_in_range,\n  total_dividend_weight_greater_than,\n  total_dividend_weight_less_than,\n  total_dividend_weight_in_range,\n  total_cash_greater_than,\n  total_cash_less_than,\n  total_cash_in_range,\n  total_cash_equals,\n  token_in_list_voting_weight_greater_than,\n  token_in_list_voting_weight_less_than,\n  token_in_list_voting_weight_in_range,\n  token_in_list_dividend_weight_greater_than,\n  token_in_list_dividend_weight_less_than,\n  token_in_list_dividend_weight_in_range,\n  token_in_list_amount_greater_than,\n  token_in_list_amount_less_than,\n  token_in_list_amount_in_range,\n  token_in_list_amount_equals,\n  address_voting_weight_percenrage_greater_than,\n  address_voting_weight_percenrage_less_than,\n  address_voting_weight_percenrage_in_range,\n  address_dividend_weight_percenrage_greater_than,\n  address_dividend_weight_percenrage_less_than,\n  address_dividend_weight_percenrage_in_range\n};"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_MembershipOp.ts",
    "content": "import {expression } from '../Node';\n\n/**\n * Membership-related condition nodes\n| 401 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_EQUALS | ADDRESS_2DARRAY[0][0] targetAddress ||\n| 402 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_LIST | ADDRESS_2DARRAY[0] targetAddressArray ||\n| 403 | CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_RANGE | ADDRESS_2DARRAY[0][0] startTargetAddress, ADDRESS_2DARRAY[0][1] endTargetAddress ||\n| 404 | Placeholder404  |  |  |\n| 405 | Placeholder405  |  |  |\n| 406 | CHANGE_MEMBER_NAME_TO_ANY_STRING_IN_LIST | STRING_ARRAY nameList ||\n| 407 | CHANGE_MEMBER_NAME_TO_ANY_STRING_CONTAINS | STRING_ARRAY[0] subString ||\n */\n\nfunction change_member_role_to_any_role_equals(targetAddress: string) {\n  return expression(401, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[targetAddress]],\n    BYTES: []\n  });\n}\n\nfunction change_member_role_to_any_role_in_list(targetAddressArray: string[]) {\n  return expression(402, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [targetAddressArray],\n    BYTES: []\n  });\n}\n\nfunction change_member_role_to_any_role_in_range(startTargetAddress: string, endTargetAddress: string) {\n  return expression(403, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [[startTargetAddress, endTargetAddress]],\n    BYTES: []\n  });\n}\n\nfunction change_member_name_to_any_string_in_list(nameList: string[]) {\n  return expression(406, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: nameList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction change_member_name_to_any_string_contains(subString: string) {\n  return expression(407, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [subString],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport { change_member_role_to_any_role_equals, change_member_role_to_any_role_in_list, change_member_role_to_any_role_in_range, change_member_name_to_any_string_in_list, change_member_name_to_any_string_contains };\n"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_Operation.ts",
    "content": "import { expression } from '../Node';\nimport { EnumOpcode } from '../opcodes/opcodeTable';\n/**\n * Operation-related condition nodes\n| 151 | OPERATION_EQUALS | uint256 value ||\n| 152 | OPERATION_IN_LIST | uint256[] values ||\n */\n\n\nfunction operation_equals(opcode: EnumOpcode) {\n  return expression(151, {\n    UINT256_2DARRAY: [[opcode]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_in_list(opcodes: EnumOpcode[]) {\n  return expression(152, {\n    UINT256_2DARRAY: [opcodes],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport { operation_equals, operation_in_list, EnumOpcode };"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_OperationLog.ts",
    "content": "import {expression} from \"../Node\";\n\n/**\n * Operation log related condition nodes\n| 701 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_GREATER_THAN | uint256 timestamp ||\n| 702 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN | uint256 timestamp ||\n| 703 | OPERATION_BY_OPERATOR_SINCE_LAST_TIME_IN_RANGE | uint256 startTimestamp, uint256 endTimestamp ||\n| 704 | OPERATION_GLOBAL_SINCE_LAST_TIME_GREATER_THAN | uint256 timestamp ||\n| 705 | OPERATION_GLOBAL_SINCE_LAST_TIME_LESS_THAN | uint256 timestamp ||\n| 706 | OPERATION_GLOBAL_SINCE_LAST_TIME_IN_RANGE | uint256 startTimestamp, uint256 endTimestamp ||\n| 707 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN | address[] addressList, uint256 timestamp ||\n| 708 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN | address[] addressList, uint256 timestamp ||\n| 709 | OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE | address[] addressList, uint256 startTimestamp, uint256 endTimestamp ||\n| 710 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN | address[] addressList, uint256 timestamp ||\n| 711 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN | address[] addressList, uint256 timestamp ||\n| 712 | OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE | address[] addressList, uint256 startTimestamp, uint256 endTimestamp ||\n */\n\nfunction operation_by_operator_since_last_time_greater_than(timestamp: bigint) {\n  return expression(701, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_operator_since_last_time_less_than(timestamp: bigint) {\n  return expression(702, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_operator_since_last_time_in_range(startTimestamp: bigint, endTimestamp: bigint) {\n  return expression(703, {\n    UINT256_2DARRAY: [[startTimestamp, endTimestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_global_since_last_time_greater_than(timestamp: bigint) {\n  return expression(704, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_global_since_last_time_less_than(timestamp: bigint) {\n  return expression(705, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_global_since_last_time_in_range(startTimestamp: bigint, endTimestamp: bigint) {\n  return expression(706, {\n    UINT256_2DARRAY: [[startTimestamp, endTimestamp]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_any_address_in_list_since_last_time_greater_than(addressList: string[], timestamp: bigint) {\n  return expression(707, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_any_address_in_list_since_last_time_less_than(addressList: string[], timestamp: bigint) {\n  return expression(708, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_any_address_in_list_since_last_time_in_range(addressList: string[], startTimestamp: bigint, endTimestamp: bigint) {\n  return expression(709, {\n    UINT256_2DARRAY: [[startTimestamp, endTimestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_each_address_in_list_since_last_time_greater_than(addressList: string[], timestamp: bigint) {\n  return expression(710, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_each_address_in_list_since_last_time_less_than(addressList: string[], timestamp: bigint) {\n  return expression(711, {\n    UINT256_2DARRAY: [[timestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operation_by_each_address_in_list_since_last_time_in_range(addressList: string[], startTimestamp: bigint, endTimestamp: bigint) {\n  return expression(712, {\n    UINT256_2DARRAY: [[startTimestamp, endTimestamp]],\n    STRING_ARRAY: addressList,\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport {\n  operation_by_operator_since_last_time_greater_than,\n  operation_by_operator_since_last_time_less_than,\n  operation_by_operator_since_last_time_in_range,\n  operation_global_since_last_time_greater_than,\n  operation_global_since_last_time_less_than,\n  operation_global_since_last_time_in_range,\n  operation_by_any_address_in_list_since_last_time_greater_than,\n  operation_by_any_address_in_list_since_last_time_less_than,\n  operation_by_any_address_in_list_since_last_time_in_range,\n  operation_by_each_address_in_list_since_last_time_greater_than,\n  operation_by_each_address_in_list_since_last_time_less_than,\n  operation_by_each_address_in_list_since_last_time_in_range\n};"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_Operator.ts",
    "content": "import {\n expression\n} from '../Node';\n\n\n/**\n * Operator related expressions\n\n| 0  | UNDEFINED |  | Invalid Operation |\n| 1 | OPERATOR_NAME_EQUALS| STRING_ARRAY[0] operatorName  | The operator name is exactly the same as the given string |\n| 2 | OPERATOR_ROLE_EQUALS| UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is exactly the same as operatorRoleIndex |\n| 3 | OPERATOR_ADDRESS_EQUALS   | ADDRESS_2DARRAY[0][0] operatorAddress | The operator address equals operatorAddress|\n| 4 | OPERATOR_ROLE_GREATER_THAN | UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is greater than operatorRoleIndex|\n| 5 | OPERATOR_ROLE_LESS_THAN   | UINT256_2DARRAY[0][0] operatorRoleIndex   | The operator role index is less than operatorRoleIndex|\n| 6 | OPERATOR_ROLE_IN_RANGE| UINT256_2DARRAY[0][0] startingOperatorRoleIndex,  UINT256_2DARRAY[0][1] endingOperatorRoleIndex  | The operator role index is in the range of [startingOperatorRoleIndex, endingOperatorRoleIndex]|\n| 7 | OPERATOR_ROLE_IN_LIST | UINT256_2DARRAY[0] operatorRoleIndexArray| The operator role index is in the list of operatorRoleIndexArray|\n| 8 | OPERATOR_TOKEN_X_AMOUNT_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  | The operator has more than amount of token at tokenClass|\n| 9 | OPERATOR_TOKEN_X_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  ||\n| 10 | OPERATOR_TOKEN_X_AMOUNT_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startingAmount, UINT256_2DARRAY[0][2] endingAmount  | The operator has token amount in the range of [startingAmount, endingAmount] at tokenClass|\n| 11 | OPERATOR_TOKEN_X_AMOUNT_EQUALS| UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] amount  | The operator has exactly amount of token at tokenClass|\n| 12 | OPERATOR_TOKEN_X_PERCENTAGE_GREATER_THAN   | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has more than percentage of token at tokenClass|\n| 13 | OPERATOR_TOKEN_X_PERCENTAGE_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has less than percentage of token at tokenClass|\n| 14 | OPERATOR_TOKEN_X_PERCENTAGE_IN_RANGE  | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentageStartingValue,  UINT256_2DARRAY[0][2] percentageEndingValue  | The operator has token percentage in the range of [percentageStartingValue, percentageEndingValue] at tokenClass|\n| 15 | OPERATOR_TOKEN_X_PERCENTAGE_EQUALS| UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] percentage  | The operator has exactly percentage of token at tokenClass|\n| 16 | OPERATOR_VOTING_WEIGHT_GREATER_THAN| UINT256_2DARRAY[0][0] amount  | The operator has more than amount of voting weight|\n| 17 | OPERATOR_VOTING_WEIGHT_LESS_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of voting weight|\n| 18 | OPERATOR_VOTING_WEIGHT_IN_RANGE   | UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has voting weight in the range of [startingAmount, endingAmount]|\n| 19 | OPERATOR_DIVIDEND_WEIGHT_GREATER_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has more than amount of dividend weight|\n| 20 | OPERATOR_DIVIDEND_WEIGHT_LESS_THAN| UINT256_2DARRAY[0][0] amount  | The operator has less than amount of dividend weight|\n| 21 | OPERATOR_DIVIDEND_WEIGHT_IN_RANGE | UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has dividend weight in the range of [startingAmount, endingAmount]|\n| 22 | Placeholder22  |  |  |\n| 23 | Placeholder23  |  |  |\n| 24 | Placeholder24  |  |  |\n| 25 | OPERATOR_WITHDRAWABLE_CASH_GREATER_THAN | UINT256_2DARRAY[0][0] amount  | The operator has more than amount of withdrawable cash|\n| 26 | OPERATOR_WITHDRAWABLE_CASH_LESS_THAN   | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of withdrawable cash|\n| 27 | OPERATOR_WITHDRAWABLE_CASH_IN_RANGE| UINT256_2DARRAY[0][0] startingAmount, UINT256_2DARRAY[0][1] endingAmount  | The operator has withdrawable cash in the range of [startingAmount, endingAmount]|\n| 28 | OPERATOR_WITHDRAWABLE_DIVIDENDS_GREATER_THAN| UINT256_2DARRAY[0][0] amount  | The operator has more than amount of withdrawable dividends|\n| 29 | OPERATOR_WITHDRAWABLE_DIVIDENDS_LESS_THAN  | UINT256_2DARRAY[0][0] amount  | The operator has less than amount of withdrawable dividends|\n| 30 | OPERATOR_WITHDRAWABLE_DIVIDENDS_IN_RANGE   | UINT256_2DARRAY[0][0] amount  | The operator has withdrawable dividends in the range of [startingAmount, endingAmount]|\n| 31 | OPERATOR_ADDRESS_IN_LIST  | ADDRESS_2DARRAY[0] addressArray  | The operator address is in the list of addressArray|\n */\n\nfunction operator_name_equals(operatorName: string) {\n  return expression(1, {\n    STRING_ARRAY: [operatorName],\n    UINT256_2DARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_role_equals(operatorRoleIndex: number) {\n  return expression(2, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[operatorRoleIndex]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_address_equals(operatorAddress: string) {\n  return expression(3, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [],\n    ADDRESS_2DARRAY: [[operatorAddress]],\n    BYTES: []\n  });\n}\n\nfunction operator_role_greater_than(operatorRoleIndex: number) {\n  return expression(4, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[operatorRoleIndex]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_role_less_than(operatorRoleIndex: number) {\n  return expression(5, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[operatorRoleIndex]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_role_in_range(startingOperatorRoleIndex: number, endingOperatorRoleIndex: number) {\n  return expression(6, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startingOperatorRoleIndex, endingOperatorRoleIndex]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_role_in_list(operatorRoleIndexArray: number[]) {\n  return expression(7, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [operatorRoleIndexArray],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_amount_greater_than(tokenClass: number, amount: number) {\n  return expression(8, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_amount_less_than(tokenClass: number, amount: number) {\n  return expression(9, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_amount_in_range(tokenClass: number, startingAmount: number, endingAmount: number) {\n  return expression(10, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, startingAmount, endingAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_amount_equals(tokenClass: number, amount: number) {\n  return expression(11, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_percentage_greater_than(tokenClass: number, percentage: number) {\n  return expression(12, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, percentage]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_percentage_less_than(tokenClass: number, percentage: number) {\n  return expression(13, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, percentage]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_percentage_in_range(tokenClass: number, percentageStartingValue: number, percentageEndingValue: number) {\n  return expression(14, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, percentageStartingValue, percentageEndingValue]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_token_x_percentage_equals(tokenClass: number, percentage: number) {\n  return expression(15, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[tokenClass, percentage]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_voting_weight_greater_than(amount: number) {\n  return expression(16, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_voting_weight_less_than(amount: number) {\n  return expression(17, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_voting_weight_in_range(startingAmount: number, endingAmount: number) {\n  return expression(18, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startingAmount, endingAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_dividend_weight_greater_than(amount: number) {\n  return expression(19, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_dividend_weight_less_than(amount: number) {\n  return expression(20, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_dividend_weight_in_range(startingAmount: number, endingAmount: number) {\n  return expression(21, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startingAmount, endingAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_cash_greater_than(amount: number) {\n  return expression(25, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_cash_less_than(amount: number) {\n  return expression(26, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_cash_in_range(startingAmount: number, endingAmount: number) {\n  return expression(27, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startingAmount, endingAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_dividends_greater_than(amount: number) {\n  return expression(28, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_dividends_less_than(amount: number) {\n  return expression(29, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[amount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_withdrawable_dividends_in_range(startingAmount: number, endingAmount: number) {\n  return expression(30, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [[startingAmount, endingAmount]],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction operator_address_in_list(addressArray: string[]) {\n  return expression(31, {\n    STRING_ARRAY: [],\n    UINT256_2DARRAY: [],\n    ADDRESS_2DARRAY: [addressArray],\n    BYTES: []\n  });\n}\n\nexport {\n  operator_name_equals,\n  operator_role_equals,\n  operator_address_equals,\n  operator_role_greater_than,\n  operator_role_less_than,\n  operator_role_in_range,\n  operator_role_in_list,\n  operator_token_x_amount_greater_than,\n  operator_token_x_amount_less_than,\n  operator_token_x_amount_in_range,\n  operator_token_x_amount_equals,\n  operator_token_x_percentage_greater_than,\n  operator_token_x_percentage_less_than,\n  operator_token_x_percentage_in_range,\n  operator_token_x_percentage_equals,\n  operator_voting_weight_greater_than,\n  operator_voting_weight_less_than,\n  operator_voting_weight_in_range,\n  operator_dividend_weight_greater_than,\n  operator_dividend_weight_less_than,\n  operator_dividend_weight_in_range,\n  operator_withdrawable_cash_greater_than,\n  operator_withdrawable_cash_less_than,\n  operator_withdrawable_cash_in_range,\n  operator_withdrawable_dividends_greater_than,\n  operator_withdrawable_dividends_less_than,\n  operator_withdrawable_dividends_in_range,\n  operator_address_in_list\n}"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_PluginAndVoting.ts",
    "content": "import {expression} from '../Node';\n\n/**\n * Plugin and voting related condition nodes\n| 301 | ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 302 | ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 303 | ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0][0] startPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 304 | ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 305 | DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 306 | DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation. \n| 307 | DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 308 | DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST | UINT256_2DARRAY[0] pluginIndexList | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 309 | ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 310 | ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 311 | ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 312 | ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_ENABLE_PLUGINS\" operation.\n| 313 | DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation. \n| 314 | DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 315 | DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 316 | DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][1] endPluginIndex | Only for checking \"BATCH_DISABLE_PLUGINS\" operation.\n| 317 | ARE_ALL_PLUGINS_BEFORE_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 318 | ARE_ALL_PLUGINS_AFTER_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 319 | IS_ANY_PLUGIN_BEFORE_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 320 | IS_ANY_PLUGIN_AFTER_OPERATION |  | This can be used for checking \"BATCH_ENABLE_PLUGINS\", \"BATCH_DISABLE_PLUGINS\", \"BATCH_ADD_PLUGINS\" and \"BATCH_ADD_AND_ENABLE_PLUGINS\" operations.\n| 321 | ADD_PLUGIN_ANY_LEVEL_EQUALS | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 322 | ADD_PLUGIN_ANY_LEVEL_IN_LIST | UINT256_2DARRAY[0] pluginIndexList ||\n| 323 | ADD_PLUGIN_ANY_LEVEL_IN_RANGE | UINT256_2DARRAY[0][0] startPluginIndex, UINT256_2DARRAY[0][0] endPluginIndex, UINT256_2DARRAY[0][0] level ||\n| 324 | ADD_PLUGIN_ANY_LEVEL_GREATER_THAN | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 325 | ADD_PLUGIN_ANY_LEVEL_LESS_THAN | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] level ||\n| 326 | ADD_PLUGIN_ANY_RETURN_TYPE_EQUALS | UINT256_2DARRAY[0][0] pluginIndex, UINT256_2DARRAY[0][0] returnType ||\n| 327 | ADD_PLUGIN_ANY_VOTING_RULE_INDEX_IN_LIST |  UINT256_2DARRAY[0] votingRuleIndexList ||\n| 328 | Placeholder320  |  |  |\n| 321 | Placeholder321  |  |  |\n| 322 | Placeholder322  |  |  |\n| 323 | Placeholder323  |  |  |\n| 324 | Placeholder324  |  |  |\n| 325 | Placeholder325  |  |  |\n| 326 | Placeholder326  |  |  |\n| 327 | Placeholder327  |  |  |\n| 328 | Placeholder328  |  |  |\n| 329 | Placeholder329  |  |  |\n| 330 | Placeholder330  |  |  |\n| 331 | Placeholder331  |  |  |\n| 332 | Placeholder332  |  |  |\n| 333 | Placeholder333  |  |  |\n| 334 | Placeholder334  |  |  |\n| 335 | Placeholder335  |  |  |\n| 336 | Placeholder336  |  |  |\n| 337 | Placeholder337  |  |  |\n| 338 | Placeholder338  |  |  |\n| 339 | Placeholder339  |  |  |\n| 340 | Placeholder340  |  |  |\n| 341 | Placeholder341  |  |  |\n| 342 | Placeholder342  |  |  |\n| 343 | Placeholder343  |  |  |\n| 344 | Placeholder344  |  |  |\n| 345 | Placeholder345  |  |  |\n| 346 | Placeholder346  |  |  |\n| 347 | Placeholder347  |  |  |\n| 348 | Placeholder348  |  |  |\n| 349 | Placeholder349  |  |  |\n| 350 | Placeholder350  |  |  |\n| 351 | Placeholder351  |  |  |\n| 352 | Placeholder352  |  |  |\n| 353 | Placeholder353  |  |  |\n| 354 | Placeholder354  |  |  |\n| 355 | Placeholder355  |  |  |\n| 356 | Placeholder356  |  |  |\n| 357 | Placeholder357  |  |  |\n| 358 | Placeholder358  |  |  |\n| 359 | Placeholder359  |  |  |\n| 360 | Placeholder360  |  |  |\n| 361 | Placeholder361  |  |  |\n| 362 | Placeholder362  |  |  |\n| 363 | Placeholder363  |  |  |\n| 364 | Placeholder364  |  |  |\n| 365 | Placeholder365  |  |  |\n| 366 | Placeholder366  |  |  |\n| 367 | Placeholder367  |  |  |\n| 368 | Placeholder368  |  |  |\n| 369 | Placeholder369  |  |  |\n| 370 | Placeholder370  |  |  |\n| 371 | ADD_ANY_VOTING_RULE_IS_ABSOLUTE_MAJORITY |  ||\n| 372 | ADD_ANY_VOTING_RULE_APPROVAL_PERCENTAGE_IN_RANGE | UINT256_2DARRAY[0][0] startPercentage, UINT256_2DARRAY[0][1] endPercentage ||\n| 373 | ADD_ANY_VOTING_RULE_TOKEN_CLASS_CONTAINS | UINT256_2DARRAY[0][0] tokenClass ||\n */\n\nfunction enable_any_before_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(301, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_any_after_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(302, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_each_before_op_plugin_index_in_list(startPluginIndex: number) {\n  return expression(303, {\n    UINT256_2DARRAY: [[startPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_each_after_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(304, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_any_before_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(305, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_any_after_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(306, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_each_before_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(307, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_each_after_op_plugin_index_in_list(pluginIndexList: number[]) {\n  return expression(308, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_any_before_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(309, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_any_after_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(310, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_each_before_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(311, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction enable_each_after_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(312, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_any_before_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(313, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_any_after_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(314, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_each_before_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(315, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction disable_each_after_op_plugin_index_in_range(startPluginIndex: number, endPluginIndex: number) {\n  return expression(316, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction are_all_plugins_before_operation() {\n  return expression(317, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction are_all_plugins_after_operation() {\n  return expression(318, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction is_any_plugin_before_operation() {\n  return expression(319, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction is_any_plugin_after_operation() {\n  return expression(320, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_level_equals(pluginIndex: number, level: number) {\n  return expression(321, {\n    UINT256_2DARRAY: [[pluginIndex, level]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_level_in_list(pluginIndexList: number[]) {\n  return expression(322, {\n    UINT256_2DARRAY: [pluginIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_level_in_range(startPluginIndex: number, endPluginIndex: number, level: number) {\n  return expression(323, {\n    UINT256_2DARRAY: [[startPluginIndex, endPluginIndex, level]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_level_greater_than(pluginIndex: number, level: number) {\n  return expression(324, {\n    UINT256_2DARRAY: [[pluginIndex, level]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_level_less_than(pluginIndex: number, level: number) {\n  return expression(325, {\n    UINT256_2DARRAY: [[pluginIndex, level]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_return_type_equals(pluginIndex: number, returnType: number) {\n  return expression(326, {\n    UINT256_2DARRAY: [[pluginIndex, returnType]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_plugin_any_voting_rule_index_in_list(votingRuleIndexList: number[]) {\n  return expression(327, {\n    UINT256_2DARRAY: [votingRuleIndexList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_any_voting_rule_is_absolute_majority() {\n  return expression(371, {\n    UINT256_2DARRAY: [],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_any_voting_rule_approval_percentage_in_range(startPercentage: number, endPercentage: number) {\n  return expression(372, {\n    UINT256_2DARRAY: [[startPercentage, endPercentage]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_any_voting_rule_token_class_contains(tokenClass: number) {\n  return expression(373, {\n    UINT256_2DARRAY: [[tokenClass]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport {\n  enable_any_before_op_plugin_index_in_list,\n  enable_any_after_op_plugin_index_in_list,\n  enable_each_before_op_plugin_index_in_list,\n  enable_each_after_op_plugin_index_in_list,\n  disable_any_before_op_plugin_index_in_list,\n  disable_any_after_op_plugin_index_in_list,\n  disable_each_before_op_plugin_index_in_list,\n  disable_each_after_op_plugin_index_in_list,\n  enable_any_before_op_plugin_index_in_range,\n  enable_any_after_op_plugin_index_in_range,\n  enable_each_before_op_plugin_index_in_range,\n  enable_each_after_op_plugin_index_in_range,\n  disable_any_before_op_plugin_index_in_range,\n  disable_any_after_op_plugin_index_in_range,\n  disable_each_before_op_plugin_index_in_range,\n  disable_each_after_op_plugin_index_in_range,\n  are_all_plugins_before_operation,\n  are_all_plugins_after_operation,\n  is_any_plugin_before_operation,\n  is_any_plugin_after_operation,\n  add_plugin_any_level_equals,\n  add_plugin_any_level_in_list,\n  add_plugin_any_level_in_range,\n  add_plugin_any_level_greater_than,\n  add_plugin_any_level_less_than,\n  add_plugin_any_return_type_equals,\n  add_plugin_any_voting_rule_index_in_list,\n  add_any_voting_rule_is_absolute_majority,\n  add_any_voting_rule_approval_percentage_in_range,\n  add_any_voting_rule_token_class_contains\n};"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_Program.ts",
    "content": "import {expression} from \"../Node\";\nimport { EnumOpcode } from '../opcodes/opcodeTable';\n\n/**\n * Program-related condition nodes\n| 601 | PROGRAM_OP_LENGTH_GREATER_THAN | UINT256_2DARRAY[0][0] length ||\n| 602 | PROGRAM_OP_LENGTH_LESS_THAN | UINT256_2DARRAY[0][0] length ||\n| 603 | PROGRAM_OP_LENGTH_IN_RANGE | UINT256_2DARRAY[0][0] startLength, UINT256_2DARRAY[0][1] endLength ||\n| 604 | PROGRAM_OP_LENGTH_EQUALS | UINT256_2DARRAY[0][0] length ||\n| 605 | PROGRAM_CONTAINS_OP | UINT256_2DARRAY[0][0] opCode ||\n| 606 | PROGRAM_CONTAINS_OP_IN_LIST | UINT256_2DARRAY[0] opCodeList ||\n| 607 | PROGRAM_EVERY_OP_EQUALS | UINT256_2DARRAY[0][0] opCode ||\n| 608 | PROGRAM_EVERY_OP_IN_LIST | UINT256_2DARRAY[0] opCodeList ||\n */\n\nfunction program_op_length_greater_than(length: bigint) {\n  return expression(601, {\n    UINT256_2DARRAY: [[length]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_op_length_less_than(length: bigint) {\n  return expression(602, {\n    UINT256_2DARRAY: [[length]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_op_length_in_range(startLength: bigint, endLength: bigint) {\n  return expression(603, {\n    UINT256_2DARRAY: [[startLength, endLength]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_op_length_equals(length: bigint) {\n  return expression(604, {\n    UINT256_2DARRAY: [[length]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_contains_op(opCode: EnumOpcode) {\n  return expression(605, {\n    UINT256_2DARRAY: [[opCode]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_contains_op_in_list(opCodeList: EnumOpcode[]) {\n  return expression(606, {\n    UINT256_2DARRAY: [opCodeList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_every_op_equals(opCode: EnumOpcode) {\n  return expression(607, {\n    UINT256_2DARRAY: [[opCode]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction program_every_op_in_list(opCodeList: EnumOpcode[]) {\n  return expression(608, {\n    UINT256_2DARRAY: [opCodeList],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport { program_op_length_greater_than, program_op_length_less_than, program_op_length_in_range, program_op_length_equals, program_contains_op, program_contains_op_in_list, program_every_op_equals, program_every_op_in_list };"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_TokenAndCash.ts",
    "content": "import {expression} from '../Node';\n\n/**\n * Token and cash-related condition nodes\n| 461 | TOKEN_X_OP_ANY_PRICE_GREATER_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 462 | TOKEN_X_OP_ANY_PRICE_LESS_THAN | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 463 | TOKEN_X_OP_ANY_PRICE_IN_RANGE | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] startPrice, UINT256_2DARRAY[0][2] endPrice | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n| 464 | TOKEN_X_OP_ANY_PRICE_EQUALS | UINT256_2DARRAY[0][0] tokenClass, UINT256_2DARRAY[0][1] price | For three operations: \"BATCH_PAY_TO_MINT_TOKENS\", \"BATCH_PAY_TO_TRANSFER_TOKENS\" and \"BATCH_BURN_TOKENS_AND_REFUND\".\n */\n\nfunction token_x_op_any_price_greater_than(tokenClass: bigint, price: bigint) {\n  return expression(461, {\n    UINT256_2DARRAY: [[tokenClass, price]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_x_op_any_price_less_than(tokenClass: bigint, price: bigint) {\n  return expression(462, {\n    UINT256_2DARRAY: [[tokenClass, price]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_x_op_any_price_in_range(tokenClass: bigint, startPrice: bigint, endPrice: bigint) {\n  return expression(463, {\n    UINT256_2DARRAY: [[tokenClass, startPrice, endPrice]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction token_x_op_any_price_equals(tokenClass: bigint, price: bigint) {\n  return expression(464, {\n    UINT256_2DARRAY: [[tokenClass, price]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport { token_x_op_any_price_greater_than, token_x_op_any_price_less_than, token_x_op_any_price_in_range, token_x_op_any_price_equals };\n\n"
  },
  {
    "path": "darc-js/src/SDK/conditionNodes/Condition_Withdrawable.ts",
    "content": "import {expression} from \"../Node\";\n\n/**\n * Withdrawable-related condition nodes\n| 431 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 432 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 433 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 434 | ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n| 435 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN | UINT256_2DARRAY[0][0] amount ||\n| 436 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN | UINT256_2DARRAY[0][0] amount ||\n| 437 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE | UINT256_2DARRAY[0][0] startAmount, UINT256_2DARRAY[0][0] endAmount ||\n| 438 | REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS | UINT256_2DARRAY[0][0] amount ||\n */\n\nfunction add_withdrawable_balance_any_amount_greater_than(amount: bigint) {\n  return expression(431, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_withdrawable_balance_any_amount_less_than(amount: bigint) {\n  return expression(432, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_withdrawable_balance_any_amount_in_range(startAmount: bigint, endAmount: bigint) {\n  return expression(433, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction add_withdrawable_balance_any_amount_equals(amount: bigint) {\n  return expression(434, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction reduce_withdrawable_balance_any_amount_greater_than(amount: bigint) {\n  return expression(435, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction reduce_withdrawable_balance_any_amount_less_than(amount: bigint) {\n  return expression(436, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction reduce_withdrawable_balance_any_amount_in_range(startAmount: bigint, endAmount: bigint) {\n  return expression(437, {\n    UINT256_2DARRAY: [[startAmount, endAmount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nfunction reduce_withdrawable_balance_any_amount_equals(amount: bigint) {\n  return expression(438, {\n    UINT256_2DARRAY: [[amount]],\n    STRING_ARRAY: [],\n    ADDRESS_2DARRAY: [],\n    BYTES: []\n  });\n}\n\nexport {\n  add_withdrawable_balance_any_amount_greater_than,\n  add_withdrawable_balance_any_amount_less_than,\n  add_withdrawable_balance_any_amount_in_range,\n  add_withdrawable_balance_any_amount_equals,\n  reduce_withdrawable_balance_any_amount_greater_than,\n  reduce_withdrawable_balance_any_amount_less_than,\n  reduce_withdrawable_balance_any_amount_in_range,\n  reduce_withdrawable_balance_any_amount_equals\n};\n"
  },
  {
    "path": "darc-js/src/SDK/includes.ts",
    "content": "// all the included instructions are here, mostly instructions for operations\nimport { OperationStruct, PluginStruct, PluginStructWithNode, VotingRuleStruct } from \"../types/basicTypes\";\nimport { BigNumber } from \"ethers\";\nimport { objectMethod } from \"@babel/types\";\n\nimport {\n  OPCODE_ID_1_BATCH_MINT_TOKENS,\n  OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES,\n  OPCODE_ID_3_BATCH_TRANSFER_TOKENS,\n  OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO,\n  OPCODE_ID_5_BATCH_BURN_TOKENS,\n  OPCODE_ID_6_BATCH_BURN_TOKENS_FROM,\n  OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS,\n  OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS,\n  OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS,\n  OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES,\n  OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES,\n  OPCODE_ID_12_BATCH_ADD_PLUGINS,\n  OPCODE_ID_13_BATCH_ENABLE_PLUGINS,\n  OPCODE_ID_14_BATCH_DISABLE_PLUGINS,\n  OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS,\n  OPCODE_ID_16_BATCH_SET_PARAMETERS,\n  OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_19_BATCH_ADD_VOTING_RULES,\n  OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS,\n  OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS,\n  OPCODE_ID_22_ADD_EMERGENCY,\n  OPCODE_ID_24_CALL_EMERGENCY,\n  OPCODE_ID_25_CALL_CONTRACT_ABI,\n  OPCODE_ID_26_PAY_CASH,\n  OPCODE_ID_27_OFFER_DIVIDENDS,\n  OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS,\n  OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND,\n  OPCODE_ID_31_ADD_STORAGE_STRING,\n  OPCODE_ID_32_VOTE,\n  OPCODE_ID_33_EXECUTE_PENDING_PROGRAM,\n  OPCODE_ID_34_END_EMERGENCY,\n  OPCODE_ID_35_UPGRADE_TO_ADDRESS,\n  OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS,\n  OPCODE_ID_37_UPGRADE_TO_THE_LATEST\n} from \"./opcodes/opcodeTable\";\n\n/**\n * Below are return types\n */\nexport let UNDEFINED = 0;\nexport let SANDBOX_NEEDED = 1;\nexport let NO = 2;\nexport let VOTING_NEEDED = 3;\nexport let YES_AND_SKIP_SANDBOX = 4;\nexport let YES = 5;\n\nexport enum EnumReturnType {\n  UNDEFINED = 0,\n  SANDBOX_NEEDED = 1,\n  NO = 2,\n  VOTING_NEEDED = 3,\n  YES_AND_SKIP_SANDBOX = 4,\n  YES = 5\n}\n\n\n/**\n * The list of operations to be executed\n * When an operation function is called, it will add an operation to this list\n */\nexport let operationList: OperationStruct[] = [];\n\n/**\n * The notes for the program\n */\nexport let programNotes: string = \"\";\n\nexport { BigNumber };\n\n/**\n * The basic node for the program\n */\nexport { Node, expression, TRUE, FALSE, AND, OR, and, or, not, NOT, boolean_true, boolean_false } from \"./Node\";\n\n/**\n * The setter for the program notes\n * @param note The notes for the program\n */\nexport function setNote(note:string) {\n  programNotes = note;\n}\n\nexport function batch_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_1_BATCH_MINT_TOKENS(addressArray, tokenClassArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_create_token_classes(nameArray: string[], tokenIndexArray: bigint[] | number[], votingWeightArray: bigint[] | number[], dividendWeightArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES(nameArray, tokenIndexArray, votingWeightArray, dividendWeightArray);\n  operationList.push(operation);\n}\n \nexport function batch_transfer_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_3_BATCH_TRANSFER_TOKENS(addressArray, tokenClassArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_transfer_tokens_from_to(fromAddressArray: string[], toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO(fromAddressArray, toAddressArray, tokenClassArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_burn_tokens(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_5_BATCH_BURN_TOKENS(tokenClassArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_burn_tokens_from(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_6_BATCH_BURN_TOKENS_FROM(addressArray, tokenClassArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_add_memberships(addressArray: string[], roleArray: bigint[] | number[], nameArray: string[]) {\n  let operation = OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS(addressArray, roleArray, nameArray);\n  operationList.push(operation);\n}\n\nexport function batch_suspend_memberships(addressArray: string[]) {\n  let operation = OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS(addressArray);\n  operationList.push(operation);\n}\n\nexport function batch_resume_memberships(addressArray: string[]) {\n  let operation = OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS(addressArray);\n  operationList.push(operation);\n}\n\nexport function batch_change_member_roles(addressArray: string[], roleArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES(addressArray, roleArray);\n  operationList.push(operation);\n}\n\nexport function batch_change_member_names(addressArray: string[], nameArray: string[]) {\n  let operation = OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES(addressArray, nameArray);\n  operationList.push(operation);\n}\n\nexport function batch_add_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]) {\n  let operation = OPCODE_ID_12_BATCH_ADD_PLUGINS(pluginArray);\n  operationList.push(operation);\n}\n\nexport function batch_enable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]) {\n  let operation = OPCODE_ID_13_BATCH_ENABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n  operationList.push(operation);\n}\n\nexport function batch_disable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]) {\n  let operation = OPCODE_ID_14_BATCH_DISABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n  operationList.push(operation);\n}\n\nexport function batch_add_and_enable_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]) {\n  let operation = OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS(pluginArray);\n  operationList.push(operation);\n}\n\nexport function batch_set_parameters(parameterIndexArray: bigint[] | number[], parameterValueArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_16_BATCH_SET_PARAMETERS(parameterIndexArray, parameterValueArray);\n  operationList.push(operation);\n}\n\nexport function batch_add_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_reduce_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n  operationList.push(operation);\n}\n\nexport function batch_add_voting_rules(ruleArray: VotingRuleStruct[]) {\n  let operation = OPCODE_ID_19_BATCH_ADD_VOTING_RULES(ruleArray);\n  operationList.push(operation);\n}\n\nexport function batch_pay_to_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint) {\n  let operation = OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS(addressArray, tokenClassArray, amountArray, priceArray, dividendable);\n  operationList.push(operation);\n}\n\nexport function batch_pay_to_transfer_tokens( toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint) {\n  let operation = OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS(toAddressArray, tokenClassArray, amountArray, priceArray, dividendable);\n  operationList.push(operation);\n}\n\nexport function add_emergency(emergencyAddressArray: string[]) {\n  let operation = OPCODE_ID_22_ADD_EMERGENCY(emergencyAddressArray);\n  operationList.push(operation);\n}\n\nexport function call_emergency(emergencyAddressArrayIndex: bigint[] | number[]) {\n  let operation = OPCODE_ID_24_CALL_EMERGENCY(emergencyAddressArrayIndex);\n  operationList.push(operation);\n}\n\nexport function call_contract_abi(contractAddress: string, abi: string | Uint8Array, value: bigint) {\n  let operation = OPCODE_ID_25_CALL_CONTRACT_ABI(contractAddress, abi, value);\n  operationList.push(operation);\n}\n\nexport function pay_cash(amount: bigint, paymentType: bigint, dividendable: bigint) {\n  let operation = OPCODE_ID_26_PAY_CASH(amount, paymentType, dividendable);\n  operationList.push(operation);\n}\n\nexport function offer_dividends() {\n  let operation = OPCODE_ID_27_OFFER_DIVIDENDS();\n  operationList.push(operation);\n}\n\nexport function set_approval_for_all_operations(address: string) {\n  let operation = OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS(address);\n  operationList.push(operation);\n}\n\nexport function batch_burn_tokens_and_refund(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[]) {\n  let operation = OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND(tokenClassArray, amountArray, priceArray);\n  operationList.push(operation);\n}\n\nexport function add_storage_string(value: string) {\n  let operation = OPCODE_ID_31_ADD_STORAGE_STRING(value);\n  operationList.push(operation);\n}\n\nexport function vote(voteArray: boolean[]) {\n  let operation = OPCODE_ID_32_VOTE(voteArray);\n  operationList.push(operation);\n}\n\nexport function execute_pending_program() {\n  let operation = OPCODE_ID_33_EXECUTE_PENDING_PROGRAM();\n  operationList.push(operation);\n}\n\nexport function end_emergency() {\n  let operation = OPCODE_ID_34_END_EMERGENCY();\n  operationList.push(operation);\n}\n\nexport function upgrade_to_address(newAddress: string) {\n  let operation = OPCODE_ID_35_UPGRADE_TO_ADDRESS(newAddress);\n  operationList.push(operation);\n}\n\nexport function confirm_upgrade_from_address(newAddress: string) {\n  let operation = OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS(newAddress);\n  operationList.push(operation);\n}\n\nexport function upgrade_to_the_latest() {\n  let operation = OPCODE_ID_37_UPGRADE_TO_THE_LATEST();\n  operationList.push(operation);\n}\n\n// below are the condition nodes\n\nexport {\n  batch_op_size_greater_than,\n  batch_op_size_less_than,\n  batch_op_size_in_range,\n  batch_op_size_equals,\n  batch_op_each_target_addresses_equals,\n  batch_op_each_target_addresses_in_list,\n  batch_op_each_target_addresses_in_member_role,\n  batch_op_any_target_address_equals,\n  batch_op_any_target_address_in_list,\n  batch_op_any_target_address_in_member_role,\n  batch_op_each_target_address_to_itself,\n  batch_op_any_target_address_to_itself,\n  batch_op_each_source_address_equals,\n  batch_op_each_source_address_in_list,\n  batch_op_each_source_address_in_member_role,\n  batch_op_any_source_address_equal,\n  batch_op_any_source_address_in_list,\n  batch_op_any_source_address_in_member_role,\n  batch_op_each_source_address_from_itself,\n  batch_op_any_source_address_from_itself,\n  batch_op_each_token_class_equals,\n  batch_op_each_token_class_in_list,\n  batch_op_each_token_class_in_range,\n  batch_op_each_token_class_greater_than,\n  batch_op_each_token_class_less_than,\n  batch_op_total_token_amount_greater_than,\n  batch_op_total_token_amount_less_than,\n  batch_op_total_token_amount_in_range,\n  batch_op_total_token_amount_equals,\n  batch_op_any_token_amount_greater_than,\n  batch_op_any_token_amount_less_than,\n  batch_op_any_token_amount_in_range,\n  batch_op_any_token_amount_equals,\n  batch_op_any_token_class_greater_than,\n  batch_op_any_token_class_less_than,\n  batch_op_any_token_class_in_range,\n  batch_op_any_token_class_equals,\n  batch_op_any_token_class_in_list,\n  batch_op_each_source_address_in_member_role_list,\n  batch_op_any_source_address_in_member_role_list,\n  batch_op_each_target_address_in_member_role_list,\n  batch_op_any_target_address_in_member_role_list,\n  batch_op_each_target_address_withdrawable_cash_greater_than,\n  batch_op_each_target_address_withdrawable_cash_less_than,\n  batch_op_each_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_withdrawable_cash_equals,\n  batch_op_any_target_address_withdrawable_cash_greater_than,\n  batch_op_any_target_address_withdrawable_cash_less_than,\n  batch_op_any_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_total_voting_weight_greater_than,\n  batch_op_each_target_address_total_voting_weight_less_than,\n  batch_op_each_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_voting_weight_equals,\n  batch_op_any_target_address_total_voting_weight_greater_than,\n  batch_op_any_target_address_total_voting_weight_less_than,\n  batch_op_any_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_dividend_weight_greater_than,\n  batch_op_each_target_address_total_dividend_weight_less_than,\n  batch_op_each_target_address_total_dividend_weight_in_range,\n  batch_op_any_target_address_total_dividend_weight_greater_than,\n  batch_op_any_target_address_total_dividend_weight_less_than,\n  batch_op_any_target_address_total_dividend_weight_in_range,\n  batch_op_each_target_address_owns_token_x_greater_than,\n  batch_op_each_target_address_owns_token_x_less_than,\n  batch_op_each_target_address_owns_token_x_in_range,\n  batch_op_any_target_address_owns_token_x_greater_than,\n  batch_op_any_target_address_owns_token_x_less_than,\n  batch_op_any_target_address_owns_token_x_in_range\n} from \"./conditionNodes/Condition_BatchOp\";\n\nexport {\n  create_token_classes_any_token_dividend_weight_greater_than,\n  create_token_classes_any_token_dividend_weight_less_than,\n  create_token_classes_any_token_dividend_weight_in_range,\n  create_token_classes_any_token_dividend_weight_equals,\n  create_token_classes_any_voting_weight_greater_than,\n  create_token_classes_any_voting_weight_less_than,\n  create_token_classes_any_voting_weight_in_range,\n  create_token_classes_any_voting_weight_equals\n} from \"./conditionNodes/Condition_CreateTokenClass\";\n\nexport {\n  timestamp_greater_than,\n  timestamp_less_than,\n  timestamp_in_range,\n  date_year_greater_than,\n  date_year_less_than,\n  date_year_in_range,\n  date_month_greater_than,\n  date_month_less_than,\n  date_month_in_range,\n  date_day_greater_than,\n  date_day_less_than,\n  date_day_in_range,\n  date_hour_greater_than,\n  date_hour_less_than,\n  date_hour_in_range,\n  address_voting_weight_greater_than,\n  address_voting_weight_less_than,\n  address_voting_weight_in_range,\n  address_dividend_weight_greater_than,\n  address_dividend_weight_less_than,\n  address_dividend_weight_in_range,\n  address_token_x_greater_than,\n  address_token_x_less_than,\n  address_token_x_in_range,\n  total_voting_weight_greater_than,\n  total_voting_weight_less_than,\n  total_voting_weight_in_range,\n  total_dividend_weight_greater_than,\n  total_dividend_weight_less_than,\n  total_dividend_weight_in_range,\n  total_cash_greater_than,\n  total_cash_less_than,\n  total_cash_in_range,\n  total_cash_equals,\n  token_in_list_voting_weight_greater_than,\n  token_in_list_voting_weight_less_than,\n  token_in_list_voting_weight_in_range,\n  token_in_list_dividend_weight_greater_than,\n  token_in_list_dividend_weight_less_than,\n  token_in_list_dividend_weight_in_range,\n  token_in_list_amount_greater_than,\n  token_in_list_amount_less_than,\n  token_in_list_amount_in_range,\n  token_in_list_amount_equals,\n  address_voting_weight_percenrage_greater_than,\n  address_voting_weight_percenrage_less_than,\n  address_voting_weight_percenrage_in_range,\n  address_dividend_weight_percenrage_greater_than,\n  address_dividend_weight_percenrage_less_than,\n  address_dividend_weight_percenrage_in_range\n} from \"./conditionNodes/Condition_MachineState\";\n\nexport { change_member_role_to_any_role_equals, change_member_role_to_any_role_in_list, change_member_role_to_any_role_in_range, change_member_name_to_any_string_in_list, change_member_name_to_any_string_contains } from \"./conditionNodes/Condition_MembershipOp\";\n\nexport { operation_equals, operation_in_list, EnumOpcode } from \"./conditionNodes/Condition_Operation\";\n\nexport {\n  operation_by_operator_since_last_time_greater_than,\n  operation_by_operator_since_last_time_less_than,\n  operation_by_operator_since_last_time_in_range,\n  operation_global_since_last_time_greater_than,\n  operation_global_since_last_time_less_than,\n  operation_global_since_last_time_in_range,\n  operation_by_any_address_in_list_since_last_time_greater_than,\n  operation_by_any_address_in_list_since_last_time_less_than,\n  operation_by_any_address_in_list_since_last_time_in_range,\n  operation_by_each_address_in_list_since_last_time_greater_than,\n  operation_by_each_address_in_list_since_last_time_less_than,\n  operation_by_each_address_in_list_since_last_time_in_range\n} from \"./conditionNodes/Condition_OperationLog\";\n\nexport {\n  operator_name_equals,\n  operator_role_equals,\n  operator_address_equals,\n  operator_role_greater_than,\n  operator_role_less_than,\n  operator_role_in_range,\n  operator_role_in_list,\n  operator_token_x_amount_greater_than,\n  operator_token_x_amount_less_than,\n  operator_token_x_amount_in_range,\n  operator_token_x_amount_equals,\n  operator_token_x_percentage_greater_than,\n  operator_token_x_percentage_less_than,\n  operator_token_x_percentage_in_range,\n  operator_token_x_percentage_equals,\n  operator_voting_weight_greater_than,\n  operator_voting_weight_less_than,\n  operator_voting_weight_in_range,\n  operator_dividend_weight_greater_than,\n  operator_dividend_weight_less_than,\n  operator_dividend_weight_in_range,\n  operator_withdrawable_cash_greater_than,\n  operator_withdrawable_cash_less_than,\n  operator_withdrawable_cash_in_range,\n  operator_withdrawable_dividends_greater_than,\n  operator_withdrawable_dividends_less_than,\n  operator_withdrawable_dividends_in_range,\n  operator_address_in_list\n} from \"./conditionNodes/Condition_Operator\";\n\nexport {\n  enable_any_before_op_plugin_index_in_list,\n  enable_any_after_op_plugin_index_in_list,\n  enable_each_before_op_plugin_index_in_list,\n  enable_each_after_op_plugin_index_in_list,\n  disable_any_before_op_plugin_index_in_list,\n  disable_any_after_op_plugin_index_in_list,\n  disable_each_before_op_plugin_index_in_list,\n  disable_each_after_op_plugin_index_in_list,\n  enable_any_before_op_plugin_index_in_range,\n  enable_any_after_op_plugin_index_in_range,\n  enable_each_before_op_plugin_index_in_range,\n  enable_each_after_op_plugin_index_in_range,\n  disable_any_before_op_plugin_index_in_range,\n  disable_any_after_op_plugin_index_in_range,\n  disable_each_before_op_plugin_index_in_range,\n  disable_each_after_op_plugin_index_in_range,\n  are_all_plugins_before_operation,\n  are_all_plugins_after_operation,\n  is_any_plugin_before_operation,\n  is_any_plugin_after_operation,\n  add_plugin_any_level_equals,\n  add_plugin_any_level_in_list,\n  add_plugin_any_level_in_range,\n  add_plugin_any_level_greater_than,\n  add_plugin_any_level_less_than,\n  add_plugin_any_return_type_equals,\n  add_plugin_any_voting_rule_index_in_list,\n  add_any_voting_rule_is_absolute_majority,\n  add_any_voting_rule_approval_percentage_in_range,\n  add_any_voting_rule_token_class_contains\n} from \"./conditionNodes/Condition_PluginAndVoting\";\n\nexport { program_op_length_greater_than, program_op_length_less_than, program_op_length_in_range, program_op_length_equals, program_contains_op, program_contains_op_in_list, program_every_op_equals, program_every_op_in_list } from \"./conditionNodes/Condition_Program\";\n\nexport { token_x_op_any_price_greater_than, token_x_op_any_price_less_than, token_x_op_any_price_in_range, token_x_op_any_price_equals } from \"./conditionNodes/Condition_TokenAndCash\";\n\nexport {\n  add_withdrawable_balance_any_amount_greater_than,\n  add_withdrawable_balance_any_amount_less_than,\n  add_withdrawable_balance_any_amount_in_range,\n  add_withdrawable_balance_any_amount_equals,\n  reduce_withdrawable_balance_any_amount_greater_than,\n  reduce_withdrawable_balance_any_amount_less_than,\n  reduce_withdrawable_balance_any_amount_in_range,\n  reduce_withdrawable_balance_any_amount_equals\n} from \"./conditionNodes/Condition_Withdrawable\";"
  },
  {
    "path": "darc-js/src/SDK/opcodes/opcodeTable.ts",
    "content": "import { ethers } from \"ethers\";  \nimport {OperationStruct, PluginStruct, VotingRuleStruct, PluginStructWithNode} from \"../../types/basicTypes\";\nimport { toBigIntArray, isValidAddressArray, isValidBigIntOrNumberArray, isValidStringArray, areArriesWithSameLength, isValidBigIntOrNumber } from \"./utils\";\n\nimport { pluginProcessor } from \"./pluginProcessor\";\n\nenum EnumOpcode {\n\n  /**\n   * @notice Invalid Operation\n   * ID: 0\n   */\n  UNDEFINED = 0,\n\n  /**\n   * @notice Batch Mint Token Operation\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to mint new token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint new token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to mint\n   * \n   * ID: 1\n   */\n  BATCH_MINT_TOKENS = 1,\n\n  /**\n   * @notice Batch Create Token Class Operation\n   * @param STRING_ARRAY[] string[] nameArray: the array of the name of the token class to create\n   * @param UINT256_2DARRAY[0] uint256[] tokenIndexArray: the array of the token index of the token class to create\n   * @param UINT256_2DARRAY[1] uint256[] votingWeightArray: the array of the voting weight of the token class to create\n   * @param UINT256_2DARRAY[2] uint256[] dividendWeightArray: the array of the dividend weight of the token class to create\n   * \n   * ID:2\n   */\n  BATCH_CREATE_TOKEN_CLASSES = 2,\n\n  /**\n   * @notice Batch Transfer Token Operation\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * \n   * ID:3\n   */\n  BATCH_TRANSFER_TOKENS = 3,\n\n  /**\n   * @notice Batch Transfer Token From Addr A to Addr B Operation\n   * @param ADDRESS_2DARRAY[0] address[] fromAddressArray (source): the array of the address to transfer token from\n   * @param ADDRESS_2DARRAY[1] address[] toAddressArray (target): the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * \n   * ID:4\n   */\n  BATCH_TRANSFER_TOKENS_FROM_TO = 4,\n\n  /**\n   * @notice Batch Burn Token Operation\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * \n   * ID:5\n   */\n  BATCH_BURN_TOKENS = 5,\n\n  /**\n   * @notice Batch Burn Token From Addr A Operation\n   * @param ADDRESS_2DARRAY[0] address[] fromAddressArray: the array of the address to burn token from\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * \n   * ID:6\n   */\n  BATCH_BURN_TOKENS_FROM = 6,\n\n  /**\n   * @notice Batch Add Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to add as member\n   * @param UINT256_2DARRAY[0] uint256[] memberRoleArray: the array of the role of the member to add\n   * @param STRING_ARRAY string[] memberNameArray: the array of the name of the member to add\n   * \n   * ID:7\n   */\n  BATCH_ADD_MEMBERSHIPS = 7,\n\n  /**\n   * @notice Batch Suspend Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to suspend as member\n   * \n   * ID:8\n   */\n  BATCH_SUSPEND_MEMBERSHIPS = 8,\n\n  /**\n   * @notice Batch Resume Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to reinstate as member\n   * \n   * ID:9\n   */\n  BATCH_RESUME_MEMBERSHIPS = 9,\n\n  /**\n   * @notice Batch Change Member Role Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to change role of as member\n   * @param UINT256_2DARRAY[0] uint256[] memberRoleArray: the array of the role of the member to change\n   * \n   * ID:10\n   */\n  BATCH_CHANGE_MEMBER_ROLES = 10,\n\n  /**\n   * @notice Batch Change Member Name Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to change name of as member\n   * @param STRING_ARRAY string[] memberNameArray: the array of the name of the member to change\n   * \n   * ID:11\n   */\n  BATCH_CHANGE_MEMBER_NAMES = 11,\n\n  /**\n   * @notice Batch Add Emergency Agent Operation\n   * @param Plugin[] pluginList: the array of the plugins\n   * ID:12\n   */\n  BATCH_ADD_PLUGINS = 12,\n\n  /**\n   * @notice Batch Enable Plugin Operation\n   * @param UINT256_ARRAY[0] uint256[] pluginIndexArray: the array of the plugins index to enable\n   * @param BOOL_ARRAY bool[] isBeforeOperationArray: the array of the flag to indicate if the plugin is before operation\n   * ID:13\n   */\n  BATCH_ENABLE_PLUGINS = 13,\n\n  /**\n   * @notice Batch Disable Plugin Operation\n   * @param UINT256_ARRAY[0] uint256[] pluginIndexArray: the array of the plugins index to disable\n   * @param BOOL_ARRAY bool[] isBeforeOperationArray: the array of the flag to indicate if the plugin is before operation\n   * ID:14\n   */\n  BATCH_DISABLE_PLUGINS = 14,\n\n  /**\n   * @notice Batch Add and Enable Plugin Operation\n   * @param Plugin[] pluginList: the array of the plugins\n   * ID:15\n   */\n  BATCH_ADD_AND_ENABLE_PLUGINS = 15,\n\n  /**\n   * @notice Batch Set Parameter Operation\n   * @param MachineParameter[] parameterNameArray: the array of the parameter name\n   * @param UINT256_2DARRAY[0] uint256[] parameterValueArray: the array of the parameter value\n   * ID:16\n   */\n  BATCH_SET_PARAMETERS = 16,\n\n  /**\n   * @notice Batch Add Withdrawable Balance Operation\n   * @param ADDRESS_2DARRAY[0] addressArray: the array of the address to add withdrawable balance\n   * @param UINT256_2DARRAY[0] amountArray: the array of the amount to add withdrawable balance\n   * ID:17\n   */\n  BATCH_ADD_WITHDRAWABLE_BALANCES = 17,\n\n  /**\n   * @notice Batch Reduce Withdrawable Balance Operation\n   * @param ADDRESS_2DARRAY[0] addressArray: the array of the address to substract withdrawable balance\n   * @param UINT256_2DARRAY[0] amountArray: the array of the amount to substract withdrawable balance\n   * ID:18\n   */\n  BATCH_REDUCE_WITHDRAWABLE_BALANCES = 18,\n\n  /**\n   * @notice Batch Add Voting Rules\n   * @param VotingRule[] votingRuleList: the array of the voting rules\n   * ID:19\n   */\n  BATCH_ADD_VOTING_RULES = 19,\n\n\n  /**\n   * @notice Batch Pay to Mint Tokens Operation\n   * @param ADDRESS_2DARRAY[0] address[] addressArray: the array of the address to mint tokens\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint tokens\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount to mint tokens\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to mint\n   * @param UINT256_2DARRAY[3] uint256[1] dividendableFlag: the flag to indicate if the payment is dividendable. 1 for yes (pay for purchase), 0 for no (pay for investment)\n   * ID:20\n   */\n  BATCH_PAY_TO_MINT_TOKENS = 20,\n\n  /**\n   * @notice Pay some cash to transfer tokens (can be used as product coins)\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to transfer\n   * @ param UINT256_2DARRAY[3] uint256[1] dividendableFlag: the flag to indicate if the payment is dividendable. 1 for yes (pay for purchase), 0 for no (pay for investment)\n   * ID:21\n   */\n  BATCH_PAY_TO_TRANSFER_TOKENS = 21,\n\n  /**\n   * @notice Add an array of address as emergency agents\n   *  (can be used as product NFTs with a new unique token class)\n   * @param ADDRESS_2DARRAY[0] address[] The array of the address to add as emergency agents \n   * ID:22\n   */\n  ADD_EMERGENCY = 22,\n\n  /**\n   * @notice Reserved ID 23 DO NOT USE\n   * ID:23\n   */\n  RESERVED_ID_23 = 23,\n\n  /**\n   * @notice Call emergency agents to handle emergency situations\n   * @param UINT256_2DARRAY[0] address[] addressArray: the array of the emergency agents index to call\n   * ID:24\n   */\n  CALL_EMERGENCY = 24,\n\n\n  /**\n   * @notice Call a contract with the given abi\n   * @param ADDRESS_2D[0][0] address contractAddress: the address of the contract to call\n   * @param bytes abi the encodedWithSignature abi of the function to call\n   * @param UINT256_2DARRAY[0][0] uint256 the value to send to the contract\n   * ID:25\n   */\n  CALL_CONTRACT_ABI = 25,\n\n  /**\n   * @notice Pay some cash\n   * @param uint256 amount: the amount of cash to pay\n   * @param uint256 paymentType: the type of cash to pay, 0 for ethers/matic/original tokens\n   *  1 for USDT, 2 for USDC (right now only 0 is supported), 3 for DAI ...\n   * @param uint256 dividendable: the flag to indicate if the payment is dividendable, \n   * 0 for no (pay for investment), 1 for yes (pay for purchase)\n   * ID:26\n   */\n  PAY_CASH = 26,\n\n  /**\n   * @notice Calculate the dividends and offer to token holders\n   *  by adding the dividends to the withdrawable balance of each token holder\n   * \n   * ID:27\n   */\n  OFFER_DIVIDENDS = 27,\n\n  /**\n   * @notice Reserved ID 28 DO NOT USE\n   * ID:28\n   */\n  RESERVED_ID_28 = 28,\n\n  /**\n   * @notice Set the approval for all transfer operations by address\n   * @paran address: the address to set approval for all transfer operations\n   * ADDRESS_2DARRAY[0][0] targetAddress\n   * ID:29\n   */\n  SET_APPROVAL_FOR_ALL_OPERATIONS = 29,\n\n\n  /**\n   * @notice Batch Burn tokens and Refund\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn tokens from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to burn\n   * ID:30\n   */\n  BATCH_BURN_TOKENS_AND_REFUND = 30,\n\n  /**\n   * @notice Add storage IPFS hash to the storage list permanently\n   * @paran STRING_ARRAY[0][0] text: the string text to add to the storage list\n   * ID:31\n   */\n  ADD_STORAGE_STRING = 31,\n\n\n  /**\n   * Below are two operations than can be used during voting pending process\n   */\n\n  /**\n   * @notice Vote for a voting pending program\n   * @param bool[] voteArray: the array of the vote for each program\n   * ID:32\n   */\n  VOTE = 32,\n\n  /**\n   * @notice Execute a program that has been voted and approved\n   * ID:33\n   */\n  EXECUTE_PENDING_PROGRAM = 33,\n\n  /**\n   * @notice Emergency mode termination. Emergency agents cannot do anything after this operation\n   * ID:34\n   */\n  END_EMERGENCY = 34,\n\n  /**\n   * @notice Upgrade the contract to a new contract address\n   * @param ADDRESS_2DARRAY[0][0] The address of the new contract\n   * ID:35\n   */\n  UPGRADE_TO_ADDRESS = 35,\n\n  /**\n   * @notice Accepting current DARCs to be upgraded from the old contract address\n   * @param ADDRESS_2DARRAY[0][0] The address of the old contract\n   * ID:36\n   */\n  CONFIRM_UPGRAED_FROM_ADDRESS = 36,\n\n  /**\n   * @notice Upgrade the contract to the latest version\n   * ID:37\n   */\n  UPGRADE_TO_THE_LATEST = 37,\n}\n\n\n\nfunction OPCODE_ID_1_BATCH_MINT_TOKENS(\n  addressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure the length of addressArray, tokenClassArray, amountArray are the same and not empty\n  if (addressArray.length != tokenClassArray.length || addressArray.length != amountArray.length) {\n    throw new Error(\"The length of addressArray, tokenClassArray, amountArray are different\");\n  }\n  if (addressArray.length == 0 || tokenClassArray.length == 0 || amountArray.length == 0) {\n    throw new Error(\"The length of addressArray, tokenClassArray, amountArray are zero\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 1, // mint token\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [\n        addressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES(\n  nameArray: string[], \n  tokenIndexArray: bigint[] | number[], \n  votingWeightArray: bigint[] | number[], \n  dividendWeightArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure the length of all arrays are the same and not empty\n  if (nameArray.length != tokenIndexArray.length || nameArray.length != votingWeightArray.length || nameArray.length != dividendWeightArray.length) {\n    throw new Error(\"The length of nameArray, tokenIndexArray, votingWeightArray, dividendWeightArray are different\");\n  }\n  if (nameArray.length == 0 || tokenIndexArray.length == 0 || votingWeightArray.length == 0 || dividendWeightArray.length == 0) {\n    throw new Error(\"The length of nameArray, tokenIndexArray, votingWeightArray, dividendWeightArray are zero\");\n  }\n  // make sure name array is valid array of strings\n  if (!isValidStringArray(nameArray)) {\n    throw new Error(\"The nameArray is not a valid array of strings\");\n  }\n  // make sure token index, voting weight and dividend weight array is valid array of bigint or number, and if it is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenIndexArray)) {\n    throw new Error(\"The tokenIndexArray is not a valid array of bigints\");\n  }\n  if (!isValidBigIntOrNumberArray(votingWeightArray)) {\n    throw new Error(\"The votingWeightArray is not a valid array of bigints\");\n  }\n  if (!isValidBigIntOrNumberArray(dividendWeightArray)) {\n    throw new Error(\"The dividendWeightArray is not a valid array of bigints\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 2, // mint token\n    param: {\n      STRING_ARRAY: nameArray,\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenIndexArray),\n        toBigIntArray(votingWeightArray),\n        toBigIntArray(dividendWeightArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_3_BATCH_TRANSFER_TOKENS(\n  toAddressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure the length of the array is the same and not empty\n  if (toAddressArray.length != tokenClassArray.length || toAddressArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array or amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 3, // opcode for batch transfer token\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [\n        toAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO(\n  fromAddressArray: string[], \n  toAddressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n    // make sure that the length of the array is the same and not empty\n    if (fromAddressArray.length != toAddressArray.length || fromAddressArray.length != tokenClassArray.length || fromAddressArray.length != amountArray.length) {\n        throw new Error(\"Invalid array length\");\n    }\n    // if any element in token class array or amount array is number, convert it to bigint\n    if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n        throw new Error(\"Invalid token class array\");\n    }\n    if (!isValidBigIntOrNumberArray(amountArray)) {\n        throw new Error(\"Invalid amount array\");\n    }\n\n    //create the operation\n    const operation = {\n        operatorAddress: \"\",\n        opcode: 4,\n        param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            UINT256_2DARRAY: [\n                toBigIntArray(tokenClassArray),\n                toBigIntArray(amountArray)\n            ],\n            ADDRESS_2DARRAY: [\n                fromAddressArray,\n                toAddressArray\n            ],\n            BYTES: []\n        }\n    };\n    return operation;\n}\n\nfunction OPCODE_ID_5_BATCH_BURN_TOKENS(\n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (tokenClassArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array or amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 5, // burn token\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_6_BATCH_BURN_TOKENS_FROM(\n  fromAddressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (fromAddressArray.length != tokenClassArray.length || fromAddressArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array or amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 6, // burn token\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [\n        fromAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS(\n  memberAddressArray: string[], \n  memberRoleArray: bigint[] | number[], \n  memberNameArray: string[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (memberAddressArray.length != memberRoleArray.length || memberAddressArray.length != memberNameArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in member role array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(memberRoleArray)) {\n    throw new Error(\"Invalid member role array\");\n  }\n  // make sure member name array is valid array of strings\n  if (!isValidStringArray(memberNameArray)) {\n    throw new Error(\"The memberNameArray is not a valid array of strings\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 7, // add membership\n    param: {\n      STRING_ARRAY: memberNameArray,\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(memberRoleArray)\n      ],\n      ADDRESS_2DARRAY: [\n        memberAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS(\n  memberAddressArray: string[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (memberAddressArray.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 8, // suspend membership\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [\n        memberAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS(\n  memberAddressArray: string[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (memberAddressArray.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 9, // resume membership\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [\n        memberAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES(\n  memberAddressArray: string[], \n  memberRoleArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (memberAddressArray.length != memberRoleArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in member role array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(memberRoleArray)) {\n    throw new Error(\"Invalid member role array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 10, // change member roles\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(memberRoleArray)\n      ],\n      ADDRESS_2DARRAY: [\n        memberAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES(\n  memberAddressArray: string[], \n  memberNameArray: string[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (memberAddressArray.length != memberNameArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // make sure member name array is valid array of strings\n  if (!isValidStringArray(memberNameArray)) {\n    throw new Error(\"The memberNameArray is not a valid array of strings\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 11, // change member names\n    param: {\n      STRING_ARRAY: memberNameArray,\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [\n        memberAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_12_BATCH_ADD_PLUGINS(\n  pluginList: PluginStruct[] | PluginStructWithNode[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (pluginList.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  const processedPluginArray = pluginProcessor(pluginList);\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 12, // add plugins\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: processedPluginArray,\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_13_BATCH_ENABLE_PLUGINS(\n  pluginIndexArray: bigint[] | number[], \n  isBeforeOperationArray: boolean[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (pluginIndexArray.length != isBeforeOperationArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in plugin index array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(pluginIndexArray)) {\n    throw new Error(\"Invalid plugin index array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 13, // enable plugins\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: isBeforeOperationArray,\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(pluginIndexArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_14_BATCH_DISABLE_PLUGINS(\n  pluginIndexArray: bigint[] | number[], \n  isBeforeOperationArray: boolean[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (pluginIndexArray.length != isBeforeOperationArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in plugin index array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(pluginIndexArray)) {\n    throw new Error(\"Invalid plugin index array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 14, // disable plugins\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: isBeforeOperationArray,\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(pluginIndexArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS(\n  pluginList: PluginStruct[] | PluginStructWithNode[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (pluginList.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  const processedPluginArray = pluginProcessor(pluginList);\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 15, // add and enable plugins\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: processedPluginArray,\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_16_BATCH_SET_PARAMETERS(\n  parameterNameArray: bigint[] | number[], \n  parameterValueArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (parameterNameArray.length != parameterValueArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in parameter value array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(parameterValueArray)) {\n    throw new Error(\"Invalid parameter value array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 16, // set parameters\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: parameterNameArray,\n      UINT256_2DARRAY: [parameterValueArray],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES(\n  addressArray: string[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (addressArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 17, // add withdrawable balances\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [\n        addressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES(\n  addressArray: string[], \n  amountArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (addressArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 18, // reduce withdrawable balances\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [\n        addressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_19_BATCH_ADD_VOTING_RULES(\n  votingRuleList: VotingRuleStruct[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (votingRuleList.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 19, // add voting rules\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: votingRuleList,\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS(\n  addressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[], \n  priceArray: bigint[] | number[], \n  dividendableFlag: bigint\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (addressArray.length != tokenClassArray.length || addressArray.length != amountArray.length || addressArray.length != priceArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array, amount array or price array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n  if (!isValidBigIntOrNumberArray(priceArray)) {\n    throw new Error(\"Invalid price array\");\n  }\n  if (!isValidBigIntOrNumberArray([dividendableFlag])) {\n    throw new Error(\"Invalid dividendable flag\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 20, // pay to mint tokens\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray),\n        toBigIntArray(priceArray),\n        toBigIntArray([dividendableFlag])\n      ],\n      ADDRESS_2DARRAY: [\n        addressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS(\n  toAddressArray: string[], \n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[], \n  priceArray: bigint[] | number[], \n  dividendableFlag: bigint\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (toAddressArray.length != tokenClassArray.length || toAddressArray.length != amountArray.length || toAddressArray.length != priceArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array, amount array or price array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n  if (!isValidBigIntOrNumberArray(priceArray)) {\n    throw new Error(\"Invalid price array\");\n  }\n  if (!isValidBigIntOrNumberArray([dividendableFlag])) {\n    throw new Error(\"Invalid dividendable flag\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 21, // pay to transfer tokens\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray),\n        toBigIntArray(priceArray),\n        toBigIntArray([dividendableFlag])\n      ],\n      ADDRESS_2DARRAY: [\n        toAddressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_22_ADD_EMERGENCY(\n  addressArray: string[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (addressArray.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 22, // add emergency\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [\n        addressArray\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_24_CALL_EMERGENCY(\n  emergencyIndexArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (emergencyIndexArray.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in emergency index array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(emergencyIndexArray)) {\n    throw new Error(\"Invalid emergency index array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 24, // call emergency\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(emergencyIndexArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_25_CALL_CONTRACT_ABI(\n  contractAddress: string, \n  abiHexStringOrUint8Array: string | Uint8Array, \n  value: bigint\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (contractAddress == \"\") {\n    throw new Error(\"Invalid contract address or abi\");\n  }\n  // make sure that abi is a valid hex string or Uint8Array\n  if (!ethers.utils.isBytesLike(abiHexStringOrUint8Array)) {\n    throw new Error(\"Invalid abi, should be a valid hex string or Uint8Array\");\n  }\n\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 25, // call contract abi\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [value],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: abiHexStringOrUint8Array\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_26_PAY_CASH(\n  amount: bigint, \n  paymentType: bigint, \n  dividendable: bigint\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (!isValidBigIntOrNumber(amount)) {\n    throw new Error(\"Invalid amount\");\n  }\n  if (!isValidBigIntOrNumber(paymentType)) {\n    throw new Error(\"Invalid payment type\");\n  }\n  if (!isValidBigIntOrNumber(dividendable)) {\n    throw new Error(\"Invalid dividendable flag\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 26, // pay cash\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [amount, paymentType, dividendable],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_27_OFFER_DIVIDENDS(): OperationStruct {\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 27, // offer dividends\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS(\n  targetAddress: string\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (targetAddress == \"\") {\n    throw new Error(\"Invalid target address\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 29, // set approval for all operations\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [\n        [targetAddress]\n      ],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND(\n  tokenClassArray: bigint[] | number[], \n  amountArray: bigint[] | number[],\n  priceArray: bigint[] | number[]\n  ): OperationStruct {\n  // make sure that the length of the array is the same and not empty\n  if (tokenClassArray.length != amountArray.length) {\n    throw new Error(\"Invalid array length\");\n  }\n  // if any element in token class array or amount array is number, convert it to bigint\n  if (!isValidBigIntOrNumberArray(tokenClassArray)) {\n    throw new Error(\"Invalid token class array\");\n  }\n  if (!isValidBigIntOrNumberArray(amountArray)) {\n    throw new Error(\"Invalid amount array\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 30, // burn token and refund\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [\n        toBigIntArray(tokenClassArray),\n        toBigIntArray(amountArray)\n      ],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_31_ADD_STORAGE_STRING(\n  text: string\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (text == \"\") {\n    throw new Error(\"Invalid text\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 31, // add storage string\n    param: {\n      STRING_ARRAY: [text],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_32_VOTE(\n  voteArray: boolean[]\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (voteArray.length == 0) {\n    throw new Error(\"Invalid array length\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 32, // vote\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: voteArray,\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_33_EXECUTE_PENDING_PROGRAM(): OperationStruct {\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 33, // execute pending program\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_34_END_EMERGENCY(): OperationStruct {\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 34, // end emergency\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_35_UPGRADE_TO_ADDRESS(\n  newContractAddress: string\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (newContractAddress == \"\") {\n    throw new Error(\"Invalid new contract address\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 35, // upgrade to address\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [newContractAddress],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS(\n  oldContractAddress: string\n  ): OperationStruct {\n  // make sure that the length of the array is not empty\n  if (oldContractAddress == \"\") {\n    throw new Error(\"Invalid old contract address\");\n  }\n\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 36, // confirm upgrade from address\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY: [oldContractAddress],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\nfunction OPCODE_ID_37_UPGRADE_TO_THE_LATEST(): OperationStruct {\n  //create the operation\n  const operation = {\n    operatorAddress: \"\",\n    opcode: 37, // upgrade to the latest version\n    param: {\n      STRING_ARRAY: [],\n      BOOL_ARRAY: [],\n      VOTING_RULE_ARRAY: [],\n\n      PLUGIN_ARRAY: [],\n      PARAMETER_ARRAY:[],\n      UINT256_2DARRAY: [],\n      ADDRESS_2DARRAY: [],\n      BYTES: []\n    }\n  };\n  return operation;\n}\n\n// export all functions\nexport {\n  EnumOpcode,\n  OPCODE_ID_1_BATCH_MINT_TOKENS,\n  OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES,\n  OPCODE_ID_3_BATCH_TRANSFER_TOKENS,\n  OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO,\n  OPCODE_ID_5_BATCH_BURN_TOKENS,\n  OPCODE_ID_6_BATCH_BURN_TOKENS_FROM,\n  OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS,\n  OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS,\n  OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS,\n  OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES,\n  OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES,\n  OPCODE_ID_12_BATCH_ADD_PLUGINS,\n  OPCODE_ID_13_BATCH_ENABLE_PLUGINS,\n  OPCODE_ID_14_BATCH_DISABLE_PLUGINS,\n  OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS,\n  OPCODE_ID_16_BATCH_SET_PARAMETERS,\n  OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_19_BATCH_ADD_VOTING_RULES,\n  OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS,\n  OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS,\n  OPCODE_ID_22_ADD_EMERGENCY,\n  OPCODE_ID_24_CALL_EMERGENCY,\n  OPCODE_ID_25_CALL_CONTRACT_ABI,\n  OPCODE_ID_26_PAY_CASH,\n  OPCODE_ID_27_OFFER_DIVIDENDS,\n  OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS,\n  OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND,\n  OPCODE_ID_31_ADD_STORAGE_STRING,\n  OPCODE_ID_32_VOTE,\n  OPCODE_ID_33_EXECUTE_PENDING_PROGRAM,\n  OPCODE_ID_34_END_EMERGENCY,\n  OPCODE_ID_35_UPGRADE_TO_ADDRESS,\n  OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS,\n  OPCODE_ID_37_UPGRADE_TO_THE_LATEST\n}\n"
  },
  {
    "path": "darc-js/src/SDK/opcodes/pluginProcessor.ts",
    "content": "import { ConditionNodeStruct, PluginStruct, PluginStructWithNode } from \"../../types/basicTypes\";\nimport { Node} from \"../Node\";\n\n/**\n * This is a helper function to convert a plugin array with Node to a plugin array with ConditionNodeStruct\n * This will make sure that if user passes in a Node-type condition node, it will be converted to a ConditionNodeStruct, \n * which is the type that the smart contract of DARC entrance interface accepts\n */\nexport function pluginProcessor(pluginArray: PluginStruct[] | PluginStructWithNode[]) : PluginStruct[] {\n  let returnArray: PluginStruct[] = [];\n  for (let i = 0; i < pluginArray.length; i++) {\n\n    if (pluginArray[i].conditionNodes instanceof Node) {\n      const node = (pluginArray[i].conditionNodes) as Node;\n      const serializedNode = node.generateConditionNodeList();\n      returnArray.push({\n        returnType: pluginArray[i].returnType,\n        level: pluginArray[i].level,\n        conditionNodes: serializedNode,\n        votingRuleIndex: pluginArray[i].votingRuleIndex,\n        notes: pluginArray[i].notes,\n        bIsEnabled: pluginArray[i].bIsEnabled,\n        bIsBeforeOperation: pluginArray[i].bIsBeforeOperation,\n      });\n    }\n    else {\n      returnArray.push( (pluginArray[i]) as PluginStruct);\n    }\n  }\n\n  return returnArray;\n}\n"
  },
  {
    "path": "darc-js/src/SDK/opcodes/utils.ts",
    "content": "import { getAddress } from \"ethers/lib/utils\";\n\n/**\n * For any given array of numbers, convert them to BigInts\n * @param inputArray The array of numbers to be converted\n * @returns The array of BigInts\n */\nfunction toBigIntArray(inputArray: bigint[] | number[]): bigint[] {\n  let outputArray: bigint[] = [];\n  if (typeof inputArray[0] === \"bigint\") {\n    return inputArray as bigint[];\n  }\n  else if (typeof inputArray[0] === \"number\") {\n    for (let i = 0; i < inputArray.length; i++) {\n      outputArray.push(BigInt(inputArray[i]));\n    }\n  }\n  return outputArray;\n}\n\n/**\n * This function checks if the input array is a valid array of bigints or numbers\n * @param inputArray The array to be checked\n * @returns True if the array is valid, false otherwise\n */\nfunction isValidBigIntOrNumberArray(inputArray: bigint[] | number[]): boolean {\n  if (typeof inputArray[0] === \"bigint\") {\n    return true;\n  }\n  else if (typeof inputArray[0] === \"number\") {\n    return true;\n  }\n  return false;\n}\n\nfunction isValidAddressArray(inputArray: string[]): boolean {\n  if (typeof inputArray[0] === \"string\") {\n    return true;\n  }\n  return false;\n}\n\nfunction isValidStringArray(inputArray: string[]): boolean {\n  if (typeof inputArray[0] === \"string\") {\n    return true;\n  }\n  return false;\n}\n\nfunction areArriesWithSameLength(...arrays: any[][]): boolean {\n  const length = arrays[0].length;\n  for (let i = 1; i < arrays.length; i++) {\n    if (arrays[i].length !== length) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isValidBigIntOrNumber(input: any): boolean {\n  if (typeof input === \"bigint\") {\n    return true;\n  }\n  else if (typeof input === \"number\") {\n    return true;\n  }\n  return false;\n}\n\n\nexport {\n  toBigIntArray,\n  isValidBigIntOrNumberArray,\n  isValidAddressArray,\n  isValidStringArray,\n  isValidBigIntOrNumber,\n  areArriesWithSameLength\n}"
  },
  {
    "path": "darc-js/src/SDK/plugins/ConditionNode.ts",
    "content": "// The basic abstact syntax tree node of the expression tree\n// representing the condition of a restriction plugin condition\n\nimport { Expression } from \"./Expression\";\n\nenum ConditionNodeType { ExpressionNode, LogicalOperatorNode, BooleanValueNode}\nenum LogicalOperatorType {AND, OR, NOT}\n\nclass ConditionNode {\n    type: ConditionNodeType;\n    expression: Expression | null;\n    logicalOperator: LogicalOperatorType | null;\n    expressionParameters: (number|string|bigint)[] | null;\n    booleanValue: boolean | null;\n    childList: ConditionNode[] = [];\n    constructor(type: ConditionNodeType, \n        expression: Expression | null, \n        logicalOperator: LogicalOperatorType | null, \n        expressionParameters:  (number|string|bigint)[] | null,\n        booleanValue: boolean | null = null) {\n        this.type = type;\n        this.expression = expression;\n        this.logicalOperator = logicalOperator;\n        this.expressionParameters = expressionParameters;\n        this.childList = [];\n        this.booleanValue = booleanValue;\n\n        // validate the node\n        this.isValidLogicalOperatorNode();\n        this.isValidExpressionNode();\n    }\n\n    serializeToString(): string {\n        const childListString = this.childList.length == 0 ? this.childList.map((child) => child.serializeToString()).join(\" \") : null;\n        let returnString = \"\";\n        if (this.type === ConditionNodeType.ExpressionNode) {\n            returnString+= `Expression: ${this.expression}(${this.expressionParameters})`;\n        }\n        else if (this.type === ConditionNodeType.LogicalOperatorNode) {\n            returnString+= `LogicalOperator: ${this.logicalOperator}`;\n        }\n        else if (this.type === ConditionNodeType.BooleanValueNode) {\n            returnString+= `BooleanValue: ${this.booleanValue}`;\n        }\n        if (childListString) {\n            returnString+= ` Child List: ${childListString}`;\n        }\n        return returnString;\n    }\n\n    // operator overloading for '&' operator\n    [Symbol.for('&')] (rightOperand: ConditionNode): ConditionNode {\n\n        // if the current node is an expression node\n        if (this.type === ConditionNodeType.ExpressionNode) {\n\n            // if the right operand is an expression node, create a new logical operator node of type OR\n            if (rightOperand.type == ConditionNodeType.BooleanValueNode || rightOperand.type == ConditionNodeType.ExpressionNode){\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n\n            // if the right operand is a logical operator node, add the current node as the left child of the right operand\n            else if (rightOperand.type == ConditionNodeType.LogicalOperatorNode) {\n\n                // if the right operand is an AND operator, add the current node as the child to the child list of the right operand\n                if (rightOperand.logicalOperator == LogicalOperatorType.AND) {\n                    rightOperand.childList.push(this);\n                    return rightOperand;\n                }\n\n                else if (rightOperand.logicalOperator == LogicalOperatorType.OR) {\n                    let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n                    logicalOperatorNode.childList.push(this);\n                    logicalOperatorNode.childList.push(rightOperand);\n                    return logicalOperatorNode;\n                }\n\n                else if (rightOperand.logicalOperator == LogicalOperatorType.NOT) {\n                    let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n                    logicalOperatorNode.childList.push(this);\n                    logicalOperatorNode.childList.push(rightOperand);\n                    return logicalOperatorNode;\n                }\n\n                // else throw an exception\n                else {\n                    throw new Error(\"Invalid logical operator type\");\n                }\n            }\n        }\n\n        // if the current node is a logical operator node\n        else if (this.type === ConditionNodeType.LogicalOperatorNode) {\n\n            // if the right operand is an expression node, add the right operand as the right child of the current node\n            if (this.logicalOperator === LogicalOperatorType.AND) {\n                this.childList.push(rightOperand);\n                return this;\n            }\n\n            // if the right operand is a logical operator node, add the right operand as the right child of the current node\n            else if (this.logicalOperator === LogicalOperatorType.OR) {\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n            else if (this.logicalOperator === LogicalOperatorType.NOT) {\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n        }\n        else if (this.type === ConditionNodeType.BooleanValueNode) {\n            let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.AND, null);\n            logicalOperatorNode.childList.push(this);\n            logicalOperatorNode.childList.push(rightOperand);\n            return logicalOperatorNode;\n        }\n        throw new Error(\"Invalid condition node type\");\n\n    }\n\n    // operator overloading for '|' operator\n    [Symbol.for('|')] (rightOperand: ConditionNode): ConditionNode {\n\n        // if the current node is an expression node\n        if (this.type === ConditionNodeType.ExpressionNode) {\n\n            // if the right operand is an expression node, create a new logical operator node of type OR\n            if (rightOperand.type == ConditionNodeType.BooleanValueNode || rightOperand.type == ConditionNodeType.ExpressionNode){\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n\n            // if the right operand is a logical operator node, add the current node as the left child of the right operand\n            else if (rightOperand.type == ConditionNodeType.LogicalOperatorNode) {\n\n                // if the right operand is an AND operator, add the current node as the child to the child list of the right operand\n                if (rightOperand.logicalOperator == LogicalOperatorType.OR) {\n                    rightOperand.childList.push(this);\n                    return rightOperand;\n                }\n\n                else if (rightOperand.logicalOperator == LogicalOperatorType.AND) {\n                    let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n                    logicalOperatorNode.childList.push(this);\n                    logicalOperatorNode.childList.push(rightOperand);\n                    return logicalOperatorNode;\n                }\n\n                else if (rightOperand.logicalOperator == LogicalOperatorType.NOT) {\n                    let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n                    logicalOperatorNode.childList.push(this);\n                    logicalOperatorNode.childList.push(rightOperand);\n                    return logicalOperatorNode;\n                }\n\n                // else throw an exception\n                else {\n                    throw new Error(\"Invalid logical operator type\");\n                }\n            }\n        }\n\n        // if the current node is a logical operator node\n        else if (this.type === ConditionNodeType.LogicalOperatorNode) {\n\n            // if the right operand is an expression node, add the right operand as the right child of the current node\n            if (this.logicalOperator === LogicalOperatorType.OR) {\n                this.childList.push(rightOperand);\n                return this;\n            }\n\n            // if the right operand is a logical operator node, add the right operand as the right child of the current node\n            else if (this.logicalOperator === LogicalOperatorType.AND) {\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n            else if (this.logicalOperator === LogicalOperatorType.NOT) {\n                let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n                logicalOperatorNode.childList.push(this);\n                logicalOperatorNode.childList.push(rightOperand);\n                return logicalOperatorNode;\n            }\n        }\n        else if (this.type === ConditionNodeType.BooleanValueNode) {\n            let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.OR, null);\n            logicalOperatorNode.childList.push(this);\n            logicalOperatorNode.childList.push(rightOperand);\n            return logicalOperatorNode;\n        }\n        throw new Error(\"Invalid condition node type\");\n    }\n\n    // if an operator \"!\" is used, the expression will return a\n    // logical operator node with current node as left child, and\n    // a null object as right child, and the operator type is \"!\"\n    [Symbol.for('!')] (): ConditionNode {\n        let logicalOperatorNode = new ConditionNode(ConditionNodeType.LogicalOperatorNode, null, LogicalOperatorType.NOT, null);\n        logicalOperatorNode.childList.push(this);\n        return logicalOperatorNode;\n    }\n\n    // check if the current node is a valid logical operator node,\n    // and throw an exception if it is not\n    isValidLogicalOperatorNode(){\n        if (this.type === ConditionNodeType.LogicalOperatorNode){\n            // check if the logical operator type is null\n            if (this.logicalOperator === null){\n                throw new Error(\"The logical operator type of the current node is null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // if operator is AND, OR, make sure that child list has at least 2 elements\n            if (this.logicalOperator === LogicalOperatorType.AND || this.logicalOperator === LogicalOperatorType.OR){\n                if (this.childList.length < 2){\n                    throw new Error(\"The list of all child nodes has less than 2 elements, which is illegal.\\n\\\n                    Current node:\\n \" + JSON.stringify(this));\n                }\n            }\n            // if operator is NOT, make sure that the child list has only 1 element\n            if (this.logicalOperator === LogicalOperatorType.NOT){\n                if (this.childList.length !== 1){\n                    throw new Error(\"Invalid length of child node for NOT operator.\\n\\\n                    Current node:\\n \" + JSON.stringify(this));\n                }\n            }\n        }\n    }\n\n    // check if the current node is a valid expression node,\n    // and throw an exception if it is not\n    isValidExpressionNode(){\n        if (this.type === ConditionNodeType.ExpressionNode){\n            // check if the expression type is null\n            if (this.expression === null){\n                throw new Error(\"The expression type of the current expression node is null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // make sure that the child list is empty\n            if (this.childList.length !== 0){\n                throw new Error(\"Illegal element in child node list of an expression node.\\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n        }\n    }\n\n    // check if the current node is a valid boolean value node,\n    // and throw an exception if it is not\n    isValidBooleanValueNode(){\n        if (this.type === ConditionNodeType.BooleanValueNode){\n            // check if the boolean value is null\n            if (this.booleanValue === null){\n                throw new Error(\"The boolean value of the current boolean value node is null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // make sure that the left and right child are null\n            if (this.childList.length !== 0){\n                throw new Error(\"The child list node of current node is not empty for a boolean value node.\\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // make sure that the expression type is null\n            if (this.expression !== null){\n                throw new Error(\"The expression type of the current boolean value node is not null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // make sure that the logical operator type is null\n            if (this.logicalOperator !== null){\n                throw new Error(\"The logical operator type of the current boolean value node is not null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n            // make sure that the expression parameters is null\n            if (this.expressionParameters !== null){\n                throw new Error(\"The expression parameters of the current boolean value node is not null. \\n\\\n                Current node:\\n \" + JSON.stringify(this));\n            }\n        }\n    }\n}\n\n\nexport { ConditionNode, Expression, ConditionNodeType, LogicalOperatorType };"
  },
  {
    "path": "darc-js/src/SDK/plugins/Expression.ts",
    "content": "// All the expressions that can be used in the by-law script\n\nexport enum Expression{\n  // operator identifiers\n  Operator_Address_Equals = 1,\n  Operator_Alias_Equals = 2,\n  Operator_Role_Equals = 3,\n  Operator_Address_Not_Equals = 4,\n  Operator_Alias_Not_Equals = 5,\n  Operator_Role_Not_Equals = 6,\n  Operator_Address_In_List = 7,\n  Operator_Alias_In_List = 8,\n  Operator_Role_In_List = 9,\n  Operator_Address_Not_In_List = 10,\n  Operator_Alias_Not_In_List = 11,\n  Operator_Role_Not_In_List = 12,\n\n  // operations\n  Operation_Equals = 1000,\n  Operation_Not_Equals = 1001,\n\n  // todo: add more operations\n\n}"
  },
  {
    "path": "darc-js/src/SDK/runtime.ts",
    "content": "import * as instructions from \"./includes\";\nimport { ethers, Contract } from 'ethers';\nimport { OperationStruct, OperationStructOutput, ProgramStruct } from \"../types/basicTypes\";\nimport * as DARC from \"../DARC/DARC\";\nimport { transpile } from \"./transpiler\";\n\n\n/**\n * This function takes in a string of code and returns a program struct\n * @param code The code to be run\n * @param wallet The wallet to be used to sign the transaction (provider must be set)\n * @param targetDARCAddress The address of the DARC contract to be used, if any. Leave blank if not needed.\n * @returns nothing\n */\nexport async function run(code:string, wallet:ethers.Wallet, targetDARCAddress:string, darcVersion: DARC.DARC_VERSION = DARC.DARC_VERSION.Latest, delegateToAddress?:string) {\n  let include = '';\n  for (const key in instructions) {\n    include += `let ${key} = instructions.${key};\\n`;\n  }\n\n  const fn = new Function('instructions', 'ethers', 'wallet', 'address', include + code + '\\n return operationList;');\n\n  const results = fn(instructions, ethers, wallet, targetDARCAddress);\n  const operatorAddress = delegateToAddress? delegateToAddress: wallet.address;\n  const resultList:OperationStruct[] = [...results];\n\n  // add operator address to each operation\n  for (let i = 0; i < resultList.length; i++) {\n    resultList[i].operatorAddress = operatorAddress;\n  }\n\n  // create the program\n  const program:ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    operations: resultList,\n    notes: \"\"\n  };\n\n  // create the attached DARC\n  const attachedDARC = new DARC.DARC({\n    address: targetDARCAddress,\n    version: darcVersion,\n    wallet: wallet,\n  });\n\n  await attachedDARC.entrance(program);\n\n  // after execution, clear the operation list\n  instructions.operationList.length = 0;\n  instructions.programNotes.replace(instructions.programNotes, '');\n}\n\n/**\n * The core function for transpiling and running a by-law script snippet\n * @param code The code to be run\n * @param wallet The wallet to be used to sign the transaction (provider must be set)\n * @param targetDARCAddress The address of the DARC contract to be used\n * @param darcVersion The version of the DARC contract to be used\n * @param delegateToAddress The address of the delegate to be used, if any. Leave blank if not needed.\n */\nexport async function transpileAndRun(\n  code:string, \n  wallet:ethers.Wallet, \n  targetDARCAddress:string, \n  darcVersion: DARC.DARC_VERSION = DARC.DARC_VERSION.Latest,\n  delegateToAddress?:string\n) {\n  const compiledCode = transpile(code);\n  if (delegateToAddress) {\n    await run(compiledCode, wallet, targetDARCAddress, darcVersion, delegateToAddress);\n  }\n  else {\n    await run(compiledCode, wallet, targetDARCAddress, darcVersion);\n  }\n}"
  },
  {
    "path": "darc-js/src/SDK/transpiler.ts",
    "content": "export function transpile(sourceCode: string): string {\n\n  // compile the source code with babel standalone\n  const babel = require('@babel/standalone');\n\n  // register the plugin\n\n  babel.registerPlugin('overload', require('@jetblack/operator-overloading')); //jetblack_operator_overload);\n  \n\n  // register the preset\n  babel.registerPreset('@babel/preset-env', require('@babel/preset-env'));\n\n\n  // register the typescript preset\n  babel.registerPreset('@babel/preset-typescript', require('@babel/preset-typescript'));\n\n  // compile the code\n  const result = babel.transform(      `'operator-overloading enabled';` + sourceCode, {\n    plugins: ['overload'], //, '@babel/plugin-proposal-class-properties', '@babel/plugin-proposal-private-methods'],\n    //['@babel/plugin-proposal-class-properties', { \"loose\": true }],\n    //['@babel/plugin-proposal-private-methods', { loose: true }]\n\n    presets: ['@babel/preset-env', '@babel/preset-typescript'],\n    filename: 'source.ts',\n    sourceType: 'script'\n  });\n\n  \n\n  return result.code;\n}"
  },
  {
    "path": "darc-js/src/darcBinary/DARC-latest.json",
    "content": "{\n  \"_format\": \"hh-sol-artifact-1\",\n  \"contractName\": \"DARC\",\n  \"sourceName\": \"contracts/protocol/DARC.sol\",\n  \"abi\": [\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"string\",\n          \"name\": \"haystack\",\n          \"type\": \"string\"\n        },\n        {\n          \"internalType\": \"string\",\n          \"name\": \"needle\",\n          \"type\": \"string\"\n        }\n      ],\n      \"name\": \"contains\",\n      \"outputs\": [\n        {\n          \"internalType\": \"bool\",\n          \"name\": \"\",\n          \"type\": \"bool\"\n        }\n      ],\n      \"stateMutability\": \"pure\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"currentMachineState\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256[100]\",\n              \"name\": \"latestOperationTimestamp\",\n              \"type\": \"uint256[100]\"\n            }\n          ],\n          \"internalType\": \"struct OperationLog\",\n          \"name\": \"globalOperationLog\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendPermyriadPerTransaction\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendCycleOfTransactions\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"currentCashBalanceForDividends\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendCycleCounter\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"address[]\",\n              \"name\": \"emergencyAgentsAddressList\",\n              \"type\": \"address[]\"\n            },\n            {\n              \"internalType\": \"string[]\",\n              \"name\": \"strStorageList\",\n              \"type\": \"string[]\"\n            },\n            {\n              \"internalType\": \"address[]\",\n              \"name\": \"activeEmergencyAgentsAddressList\",\n              \"type\": \"address[]\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEmergency\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct MachineStateParameters\",\n          \"name\": \"machineStateParameters\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"currentBalance\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"address\",\n              \"name\": \"programOperatorAddress\",\n              \"type\": \"address\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"operatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"internalType\": \"enum EnumOpcode\",\n                  \"name\": \"opcode\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"bool[]\",\n                      \"name\": \"BOOL_ARRAY\",\n                      \"type\": \"bool[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"uint256[]\",\n                          \"name\": \"votingTokenClassList\",\n                          \"type\": \"uint256[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"approvalThresholdPercentage\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"executionPendingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"notes\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsAbsoluteMajority\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct VotingRule[]\",\n                      \"name\": \"VOTING_RULE_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"enum EnumReturnType\",\n                          \"name\": \"returnType\",\n                          \"type\": \"uint8\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"level\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"id\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionNodeType\",\n                              \"name\": \"nodeType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumLogicalOperatorType\",\n                              \"name\": \"logicalOperator\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"conditionExpression\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"childList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"string[]\",\n                                  \"name\": \"STRING_ARRAY\",\n                                  \"type\": \"string[]\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[][]\",\n                                  \"name\": \"UINT256_2DARRAY\",\n                                  \"type\": \"uint256[][]\"\n                                },\n                                {\n                                  \"internalType\": \"address[][]\",\n                                  \"name\": \"ADDRESS_2DARRAY\",\n                                  \"type\": \"address[][]\"\n                                },\n                                {\n                                  \"internalType\": \"bytes\",\n                                  \"name\": \"BYTES\",\n                                  \"type\": \"bytes\"\n                                }\n                              ],\n                              \"internalType\": \"struct NodeParam\",\n                              \"name\": \"param\",\n                              \"type\": \"tuple\"\n                            }\n                          ],\n                          \"internalType\": \"struct ConditionNode[]\",\n                          \"name\": \"conditionNodes\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingRuleIndex\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"notes\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsBeforeOperation\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct Plugin[]\",\n                      \"name\": \"PLUGIN_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"internalType\": \"enum MachineParameter[]\",\n                      \"name\": \"PARAMETER_ARRAY\",\n                      \"type\": \"uint8[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct Param\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct Operation[]\",\n              \"name\": \"operations\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"notes\",\n              \"type\": \"string\"\n            }\n          ],\n          \"internalType\": \"struct Program\",\n          \"name\": \"program\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"name\": \"entrance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"string\",\n          \"name\": \"\",\n          \"type\": \"string\"\n        }\n      ],\n      \"stateMutability\": \"payable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"executingPendingDeadline\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"finiteState\",\n      \"outputs\": [\n        {\n          \"internalType\": \"enum FiniteState\",\n          \"name\": \"\",\n          \"type\": \"uint8\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getCurrentDividendPerUnit\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getDARClogs\",\n      \"outputs\": [\n        {\n          \"internalType\": \"string[]\",\n          \"name\": \"\",\n          \"type\": \"string[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"timestamp\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getDateTime\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"year\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"month\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"day\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"hour\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"minute\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"second\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"pure\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getGlobalOperationLog\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256[100]\",\n              \"name\": \"latestOperationTimestamp\",\n              \"type\": \"uint256[100]\"\n            }\n          ],\n          \"internalType\": \"struct OperationLog\",\n          \"name\": \"\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getLatestVotingItemIndex\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getMemberInfo\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsInitialized\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsSuspended\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"name\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"role\",\n              \"type\": \"uint256\"\n            }\n          ],\n          \"internalType\": \"struct MemberInfo\",\n          \"name\": \"\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getMemberList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getMyInfo\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"\",\n          \"type\": \"address\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getNumberOfTokenClasses\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"addr\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getOperationLogByAddress\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256[100]\",\n              \"name\": \"latestOperationTimestamp\",\n              \"type\": \"uint256[100]\"\n            }\n          ],\n          \"internalType\": \"struct OperationLog\",\n          \"name\": \"\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getPluginInfo\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"enum EnumReturnType\",\n              \"name\": \"returnType\",\n              \"type\": \"uint8\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"level\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"id\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionNodeType\",\n                  \"name\": \"nodeType\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumLogicalOperatorType\",\n                  \"name\": \"logicalOperator\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"conditionExpression\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"uint256[]\",\n                  \"name\": \"childList\",\n                  \"type\": \"uint256[]\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct NodeParam\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct ConditionNode[]\",\n              \"name\": \"conditionNodes\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"votingRuleIndex\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"notes\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEnabled\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsBeforeOperation\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct Plugin[]\",\n          \"name\": \"\",\n          \"type\": \"tuple[]\"\n        },\n        {\n          \"components\": [\n            {\n              \"internalType\": \"enum EnumReturnType\",\n              \"name\": \"returnType\",\n              \"type\": \"uint8\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"level\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"id\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionNodeType\",\n                  \"name\": \"nodeType\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumLogicalOperatorType\",\n                  \"name\": \"logicalOperator\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"conditionExpression\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"uint256[]\",\n                  \"name\": \"childList\",\n                  \"type\": \"uint256[]\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct NodeParam\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct ConditionNode[]\",\n              \"name\": \"conditionNodes\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"votingRuleIndex\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"notes\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEnabled\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsBeforeOperation\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct Plugin[]\",\n          \"name\": \"\",\n          \"type\": \"tuple[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getSumDividendWeightByTokenClass\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getSumVotingWeightByTokenClass\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getTokenInfo\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"votingWeight\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"dividendWeight\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"string\",\n          \"name\": \"tokenInfo\",\n          \"type\": \"string\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"totalSupply\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"address\",\n          \"name\": \"tokenOwnerAddress\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getTokenOwnerBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getTokenOwners\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"idx\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getVotingItemsByIndex\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"programOperatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"address\",\n                      \"name\": \"operatorAddress\",\n                      \"type\": \"address\"\n                    },\n                    {\n                      \"internalType\": \"enum EnumOpcode\",\n                      \"name\": \"opcode\",\n                      \"type\": \"uint8\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"string[]\",\n                          \"name\": \"STRING_ARRAY\",\n                          \"type\": \"string[]\"\n                        },\n                        {\n                          \"internalType\": \"bool[]\",\n                          \"name\": \"BOOL_ARRAY\",\n                          \"type\": \"bool[]\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"votingTokenClassList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"approvalThresholdPercentage\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"votingDurationInSeconds\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"executionPendingDurationInSeconds\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"bool\",\n                              \"name\": \"bIsEnabled\",\n                              \"type\": \"bool\"\n                            },\n                            {\n                              \"internalType\": \"string\",\n                              \"name\": \"notes\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"internalType\": \"bool\",\n                              \"name\": \"bIsAbsoluteMajority\",\n                              \"type\": \"bool\"\n                            }\n                          ],\n                          \"internalType\": \"struct VotingRule[]\",\n                          \"name\": \"VOTING_RULE_ARRAY\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"enum EnumReturnType\",\n                              \"name\": \"returnType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"level\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"uint256\",\n                                  \"name\": \"id\",\n                                  \"type\": \"uint256\"\n                                },\n                                {\n                                  \"internalType\": \"enum EnumConditionNodeType\",\n                                  \"name\": \"nodeType\",\n                                  \"type\": \"uint8\"\n                                },\n                                {\n                                  \"internalType\": \"enum EnumLogicalOperatorType\",\n                                  \"name\": \"logicalOperator\",\n                                  \"type\": \"uint8\"\n                                },\n                                {\n                                  \"internalType\": \"uint256\",\n                                  \"name\": \"conditionExpression\",\n                                  \"type\": \"uint256\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[]\",\n                                  \"name\": \"childList\",\n                                  \"type\": \"uint256[]\"\n                                },\n                                {\n                                  \"components\": [\n                                    {\n                                      \"internalType\": \"string[]\",\n                                      \"name\": \"STRING_ARRAY\",\n                                      \"type\": \"string[]\"\n                                    },\n                                    {\n                                      \"internalType\": \"uint256[][]\",\n                                      \"name\": \"UINT256_2DARRAY\",\n                                      \"type\": \"uint256[][]\"\n                                    },\n                                    {\n                                      \"internalType\": \"address[][]\",\n                                      \"name\": \"ADDRESS_2DARRAY\",\n                                      \"type\": \"address[][]\"\n                                    },\n                                    {\n                                      \"internalType\": \"bytes\",\n                                      \"name\": \"BYTES\",\n                                      \"type\": \"bytes\"\n                                    }\n                                  ],\n                                  \"internalType\": \"struct NodeParam\",\n                                  \"name\": \"param\",\n                                  \"type\": \"tuple\"\n                                }\n                              ],\n                              \"internalType\": \"struct ConditionNode[]\",\n                              \"name\": \"conditionNodes\",\n                              \"type\": \"tuple[]\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"votingRuleIndex\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"string\",\n                              \"name\": \"notes\",\n                              \"type\": \"string\"\n                            },\n                            {\n                              \"internalType\": \"bool\",\n                              \"name\": \"bIsEnabled\",\n                              \"type\": \"bool\"\n                            },\n                            {\n                              \"internalType\": \"bool\",\n                              \"name\": \"bIsBeforeOperation\",\n                              \"type\": \"bool\"\n                            }\n                          ],\n                          \"internalType\": \"struct Plugin[]\",\n                          \"name\": \"PLUGIN_ARRAY\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"enum MachineParameter[]\",\n                          \"name\": \"PARAMETER_ARRAY\",\n                          \"type\": \"uint8[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256[][]\",\n                          \"name\": \"UINT256_2DARRAY\",\n                          \"type\": \"uint256[][]\"\n                        },\n                        {\n                          \"internalType\": \"address[][]\",\n                          \"name\": \"ADDRESS_2DARRAY\",\n                          \"type\": \"address[][]\"\n                        },\n                        {\n                          \"internalType\": \"bytes\",\n                          \"name\": \"BYTES\",\n                          \"type\": \"bytes\"\n                        }\n                      ],\n                      \"internalType\": \"struct Param\",\n                      \"name\": \"param\",\n                      \"type\": \"tuple\"\n                    }\n                  ],\n                  \"internalType\": \"struct Operation[]\",\n                  \"name\": \"operations\",\n                  \"type\": \"tuple[]\"\n                },\n                {\n                  \"internalType\": \"string\",\n                  \"name\": \"notes\",\n                  \"type\": \"string\"\n                }\n              ],\n              \"internalType\": \"struct Program\",\n              \"name\": \"program\",\n              \"type\": \"tuple\"\n            },\n            {\n              \"internalType\": \"uint256[]\",\n              \"name\": \"votingRuleIndices\",\n              \"type\": \"uint256[]\"\n            },\n            {\n              \"internalType\": \"uint256[]\",\n              \"name\": \"powerYes\",\n              \"type\": \"uint256[]\"\n            },\n            {\n              \"internalType\": \"uint256[]\",\n              \"name\": \"powerNo\",\n              \"type\": \"uint256[]\"\n            },\n            {\n              \"internalType\": \"uint256[]\",\n              \"name\": \"totalPower\",\n              \"type\": \"uint256[]\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"votingEndTime\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"executingEndTime\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"enum VotingStatus\",\n              \"name\": \"votingStatus\",\n              \"type\": \"uint8\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsProgramExecuted\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct VotingItem\",\n          \"name\": \"\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getWithdrawableCashBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getWithdrawableCashOwnerList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getWithdrawableDividendBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getWithdrawableDividendOwnerList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"initialOwnerAddress\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"\",\n          \"type\": \"address\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"initialize\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"latestVotingItemIndex\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"sandboxMachineState\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256[100]\",\n              \"name\": \"latestOperationTimestamp\",\n              \"type\": \"uint256[100]\"\n            }\n          ],\n          \"internalType\": \"struct OperationLog\",\n          \"name\": \"globalOperationLog\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"components\": [\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendPermyriadPerTransaction\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendCycleOfTransactions\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"currentCashBalanceForDividends\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"dividendCycleCounter\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"address[]\",\n              \"name\": \"emergencyAgentsAddressList\",\n              \"type\": \"address[]\"\n            },\n            {\n              \"internalType\": \"string[]\",\n              \"name\": \"strStorageList\",\n              \"type\": \"string[]\"\n            },\n            {\n              \"internalType\": \"address[]\",\n              \"name\": \"activeEmergencyAgentsAddressList\",\n              \"type\": \"address[]\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEmergency\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct MachineStateParameters\",\n          \"name\": \"machineStateParameters\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"currentBalance\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"\",\n          \"type\": \"address\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"voted\",\n      \"outputs\": [\n        {\n          \"internalType\": \"bool\",\n          \"name\": \"\",\n          \"type\": \"bool\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"votingDeadline\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"votingItems\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"address\",\n              \"name\": \"programOperatorAddress\",\n              \"type\": \"address\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"operatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"internalType\": \"enum EnumOpcode\",\n                  \"name\": \"opcode\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"bool[]\",\n                      \"name\": \"BOOL_ARRAY\",\n                      \"type\": \"bool[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"uint256[]\",\n                          \"name\": \"votingTokenClassList\",\n                          \"type\": \"uint256[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"approvalThresholdPercentage\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"executionPendingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"notes\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsAbsoluteMajority\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct VotingRule[]\",\n                      \"name\": \"VOTING_RULE_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"enum EnumReturnType\",\n                          \"name\": \"returnType\",\n                          \"type\": \"uint8\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"level\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"id\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionNodeType\",\n                              \"name\": \"nodeType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumLogicalOperatorType\",\n                              \"name\": \"logicalOperator\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"conditionExpression\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"childList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"string[]\",\n                                  \"name\": \"STRING_ARRAY\",\n                                  \"type\": \"string[]\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[][]\",\n                                  \"name\": \"UINT256_2DARRAY\",\n                                  \"type\": \"uint256[][]\"\n                                },\n                                {\n                                  \"internalType\": \"address[][]\",\n                                  \"name\": \"ADDRESS_2DARRAY\",\n                                  \"type\": \"address[][]\"\n                                },\n                                {\n                                  \"internalType\": \"bytes\",\n                                  \"name\": \"BYTES\",\n                                  \"type\": \"bytes\"\n                                }\n                              ],\n                              \"internalType\": \"struct NodeParam\",\n                              \"name\": \"param\",\n                              \"type\": \"tuple\"\n                            }\n                          ],\n                          \"internalType\": \"struct ConditionNode[]\",\n                          \"name\": \"conditionNodes\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingRuleIndex\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"notes\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsBeforeOperation\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct Plugin[]\",\n                      \"name\": \"PLUGIN_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"internalType\": \"enum MachineParameter[]\",\n                      \"name\": \"PARAMETER_ARRAY\",\n                      \"type\": \"uint8[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct Param\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct Operation[]\",\n              \"name\": \"operations\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"notes\",\n              \"type\": \"string\"\n            }\n          ],\n          \"internalType\": \"struct Program\",\n          \"name\": \"program\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"votingEndTime\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"executingEndTime\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"enum VotingStatus\",\n          \"name\": \"votingStatus\",\n          \"type\": \"uint8\"\n        },\n        {\n          \"internalType\": \"bool\",\n          \"name\": \"bIsProgramExecuted\",\n          \"type\": \"bool\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"amount\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"withdrawCash\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"amount\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"withdrawDividends\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    }\n  ],\n  \"bytecode\": \"0x60808060405234620000195762033b4190816200001f8239f35b600080fdfe610bc08060405260043610156200001557600080fd5b600090813560e01c908163036ee850146200299d575080630fda3e1e146200290557806310ade3ea14620028d65780631797631d146200284f5780631c75255a14620027e957806323b65c7814620027625780632514a6b4146200253c5780632eeb063b146200236c5780633fb18aec146200230257806356424cf414620022235780635c00d98714620022005780635d0b184914620002055780635f1231ea14620021165780635f5d5f00146200208f578063681ece9d146200204a5780636c0d4fa41462001eb75780637daa10ce1462001e9a5780638129fc1c1462001ad757806383e4cccf146200186e578063864f9f7a146200183057806386ad77e214620014e25780638c7a63ae1462001451578063942d59fa146200126e5780639f36145f14620011e8578063a064c4f114620011bd578063acf80bc4146200117f578063aec266871462001095578063aefca42a1462001074578063c41f9482146200102c578063c591aa981462000fde578063cab847f714620002a4578063d5a172f21462000278578063d6a93c511462000226578063f179f23b14620002055763f8ce8bdc14620001c757600080fd5b346200020257806003193601126200020257620001e3620052e8565b50610c80620001f162002bb8565b620002006040518092620029ed565bf35b80fd5b503462000202578060031936011262000202576020613f7854604051908152f35b503462000202578060031936011262000202575b6103e8811062000250575b602090604051908152f35b60ff60078260031b0154161562000272576200026c9062004cdf565b6200023a565b62000245565b50346200020257806003193601126200020257613f70546040516001600160a01b039091168152602090f35b5060031960203682011262000ca5576001600160401b036004351162000ca557606090600435360301126200020257604051620002e18162002b06565b620002f1600435600401620029d8565b8152600435602401356101608190526001600160401b03811162000ca957600435013660238201121562000ca957600462000333910135806101805262002c61565b9062000343604051928362002b94565b610180518252602082016101c052610180516101605160043501906024369160051b8301011162000ca15760240160e052825b6101805160051b610160516004350190602460e0519183010181101562000ebd57356101e08190526001600160401b03811162000ca95760609101360360231901126200020257620003cf604051806101205262002b06565b620003e960246101e05161016051600435010101620029d8565b610120515260446101e0516101605160043501010135602681101562000ca55760206101205101526101e0516101605160043501016064810135806101005260018060401b03811162000ca957610100910136036023190112620002025762000459604051806101405262002b22565b610100516101e051610160516004350101016001600160401b0360248201351162000ca55762000493906024369181810135010162004925565b6101405152610100516101e05161016051600435010101916001600160401b0360448401351162000ca5573660436044850135850101121562000ca557620004e5602460448501358501013562002c61565b90620004f5604051928362002b94565b6024604485013585010135825260208201906044850135610100516101e05161016051600435010101013660446024818901358901013560051b8301011162000db457604401915b60446024818801358801013560051b81880135610100516101e051610160516004350101010101018310156200058857602080916200057c85620049b0565b8152019201916200053d565b50610140516020019290925250610100516101e051610160519395600435909401010192506001600160401b0360648401351162000ca1573660436064850135850101121562000ca157602460648401358401013590620005e98262002c61565b90620005f9604051928362002b94565b828252602082016064860135610100516101e05161016051600435010101013660448660051b8301011162000bb157604401905b6064870135610100516101e051610160516004350101010160448660051b8201018310156200074f576001600160401b038335116200074b5760e083358201360360431901126200074b5760405191620006878362002acd565b6001600160401b038435830160440135116200074757620006b436604486358501818101350101620049be565b835283358201606481013560208501526084810135604085015260a48101356060850152620006e69060c401620049b0565b60808401526001600160401b038435830160e40135116200074757602092839262000736906101049062000727368935830160e48101350160440162002f77565b60a085015287350101620049b0565b60c08201528152019101906200062d565b8980fd5b8880fd5b50505092935090506040610140510152610100516101e05161016051600435010101608481013560c05260018060401b0360848201351162000ca1573660436084830135830101121562000ca157608481013501602401356080819052620007ca90620007bc9062002c61565b604051806101a05262002b94565b6101a051608051905260206101a051019160805160051b60c051610100516101e051610160516004350101010190604436918301011162000db45760440160a052929091905b60805160051b60c051610100516101e0516101605160043501010101604460a0519282010182101562000cad576001600160401b0382351162000ca95760e082359091013603604319011262000ca557604051926200086f8462002acd565b6044823560c051610100516101e0516101605160043501010101010135600681101562000ca15784526064823560c051610100516101e05161016051600435010101010101356020850152813560c051610100516101e0516101605160043501010101019360018060401b0360848601351162000ca1573660636084870135870101121562000ca1576200090d604460848701358701013562002c61565b956200091d604051978862002b94565b6044608487013587010135875260208701906084870135853560c051610100516101e05161016051600435010101010101366064604460848b01358b01013560051b8301011162000c9d57606401915b60c051610100516101e051610160516004350101010186350160848901359081019089016044013560051b810160640184101562000bb5576001600160401b0384351162000bb15760c0843582013603606319011262000bb15760405190620009d68262002ab1565b8435810160648101358352600560849091013510156200074b578435810160848101356020840152600460a49091013510156200074b578435810160a4810135604084015260c481013560608401526001600160401b0360e490910135116200074b5762000a51368635830160e481013501606401620049be565b60808301526001600160401b03853582016101040135116200074b5760808535820161010481013501360360631901126200074b576040519062000a958262002a7f565b6001600160401b0386358201610104810135016064013511620007475762000ad136606461010489358501908101350181810135010162004925565b82526001600160401b0386358201610104810135016084013511620007475762000b0f36873583016101048101350160848101350160640162004a24565b60208301526001600160401b03863582016101048101350160a4013511620007475762000b5036873583016101048101350160a48101350160640162004aaf565b60408301526001600160401b03863582016101048101350160c4013511620007475760209384939092909162000b9b9036908935016101048101350160c48101350160640162002f77565b606082015260a08201528152019201916200096d565b8780fd5b50509550509091929594604082015260a4833560c051610100516101e05161016051600435010101010101356060820152823560c051610100516101e0516101605160043501010101019260018060401b0360c48501351162000c9d5761010462000c819162000c326020966044369160c4810135010162002f77565b608085015262000c5d60e4823560c051610100516101e05161016051600435010101010101620049b0565b60a08501523560c051610100516101e05161016051600435010101010101620049b0565b60c082015281520191602060a0510160a0529291909162000810565b8680fd5b8380fd5b5080fd5b8280fd5b50506101a0516101405160600152610100516101e0516101605194956004359095010101929091506001600160401b0360a48401351162000ca55736604360a4850135850101121562000ca55762000d0f602460a48501358501013562002c61565b9062000d1f604051928362002b94565b602460a4850135850101358252602082019060a4850135610100516101e0516101605160043501010101366044602460a48901358901013560051b8301011162000db457604401915b610100516101e0516101605160043501010160a48701359081019087016024013560051b0160440183101562000db85760058335101562000db457823581526020928301920162000d68565b8480fd5b509350509290926080610140510152610100516101e0516101605160043501010160018060401b0360c48201351162000ca15762000e01906024369160c4810135010162004a24565b6101405160a00152610100516101e051610160516004350101016001600160401b0360e48201351162000ca15762000e44906024369160e4810135010162004aaf565b60c0610140510152610100516101e051610160516004350101016101048101359060018060401b03821162000db457602462000e84923692010162002f77565b60e0610140510152610140516040610120510152610120516101c0515260206101c051016101c052602060e0510160e052909162000376565b60208401858152849084600435604401356001600160401b03811162000ca55762000ef090600436918135010162002f77565b604084015282516001600160a01b03919062000f4990831662000f4062000f2162000f1b33620335e4565b62004ba8565b62000f3962000f33878a5116620335e4565b62004c0e565b9062004c65565b90331462004cac565b8251805182101562000fb6579062000faa62000fb0928462000f6d84339362004d46565b5151161462000fa362000f8462000f1b33620335e4565b62000f3962000f338862000f9a888c5162004d46565b515116620335e4565b9062004cac565b62004cdf565b62000f49565b62000fda62000fc5866200677e565b60405191829160208352602083019062002e26565b0390f35b503462000202576040366003190112620002025760209060ff906040906001600160a01b036200100d620029bc565b168152613f778452818120602435825284522054166040519015158152f35b503462000202576020366003190112620002025760c06200104f6004356200621c565b93604093919351958652602086015260408501526060840152608083015260a0820152f35b503462000202578060031936011262000202576020613f7254604051908152f35b50346200020257806003193601126200020257613f7590815491620010ba8362002c61565b91620010ca604051938462002b94565b8383526020938484018093835285832083915b838310620011475750505050604051928484019085855251809152604084019460408260051b8601019392955b828710620011185785850386f35b90919293828062001136600193603f198a8203018652885162002e26565b96019201960195929190926200110a565b600188819260409a99979a516200116c8162001164818962002cb6565b038262002b94565b81520192019201919096939596620010dd565b50346200020257602036600319011262000202576020906040906001600160a01b03620011ab620029bc565b168152611f4783522054604051908152f35b50346200020257602036600319011262000202576020620011e06004356200610a565b604051908152f35b5034620002025760203660031901126200020257604062001243916004358152613f76602052206200121a816200370e565b9060ff600782015491600960088201549101549060405195869560a0875260a087019062003273565b93602086015260408501526200125f606085018383166200350e565b60081c16151560808301520390f35b5034620002025760208060031936011262000ca557604051620012918162002ae9565b60405192620012a08462002b06565b80845260609384848201528460408201528252838383015283604083015283808301528360808301528060a08301528060c08301528060e083015280610100809301526004358152613f768352604090209160405192620013018462002ae9565b6200130c816200370e565b84526200131c600382016200351c565b8483019081529262001331600483016200351c565b604086019081529562001347600584016200351c565b868201908152926200135c600682016200351c565b956080880196875260078201549660a0890197885260088301549260c08a01938452600901549560e08a019460ff8816620013989087620052db565b868b019760081c60ff16151588526040519b8c9b8a8d52518c6101209b8c9101526101408d01620013c99162003273565b9451601f198d8703810160408f015295620013e49162002fcf565b905191858d830301908d0152620013fb9162002fcf565b905190838b82030160808c0152620014139162002fcf565b9051918982030160a08a01526200142a9162002fcf565b955160c08801525160e08701525190850162001446916200350e565b511515908301520390f35b5034620002025760203660031901126200020257600435906103e8821015620014ce575060031b6001810154600282015491620014c46005620014a560068401549362001164604051809481930162002cb6565b6040519485948552602085015260806040850152608084019062002e26565b9060608301520390f35b634e487b7160e01b81526032600452602490fd5b50346200020257806003193601126200020257611f42805490620015068262002c61565b9162001516604051938462002b94565b808352602083019184526020842084925b828410620016e4578585611f43805490620015428262002c61565b9362001552604051958662002b94565b82855260208501918152602081209080925b8484106200159a576200158b8662000fda89604051938493604085526040850190620030b7565b908382036020850152620030b7565b604051620015a88162002acd565b620015b860ff85541682620035e5565b60018401546020820152600284018054620015d38162002c61565b91620015e3604051938462002b94565b81835285526020808620869184015b8383106200165d57505050506001928260209260406006950152600387015460608201526040516200162d81620011648160048c0162002cb6565b608082015260ff6005880154818116151560a084015260081c16151560c082015281520193019301929162001564565b600190602060405191620016718362002ab1565b84548352838501549260ff8416620016898162002fc4565b8382015260ff600894851c16620016a08162002a18565b604082015260028601546060820152620016bd600387016200351c565b6080820152620016d060048701620036ac565b60a0820152815201920192019190620015f2565b604051620016f28162002acd565b6200170260ff84541682620035e5565b6001808401546020830152600284019081546200171f8162002c61565b926200172f604051948562002b94565b8184528a526020808b208b9185015b838310620017aa5750505050506001928260209260406006950152600386015460608201526040516200177a81620011648160048b0162002cb6565b608082015260ff6005870154818116151560a084015260081c16151560c082015281520192019301929062001527565b8490602060405191620017bd8362002ab1565b84548352838501549260ff8416620017d58162002fc4565b8382015260ff600894851c16620017ec8162002a18565b60408201526002860154606082015262001809600387016200351c565b60808201526200181c60048701620036ac565b60a08201528152019201920191906200173e565b50346200020257602036600319011262000202576020906040906001600160a01b036200185c620029bc565b168152611f4583522054604051908152f35b5034620002025760208060031936011262000ca5578160043591620018b14784111562000fa36200189f86620050f5565b620018aa47620050f5565b9062004d8e565b3382526200191c611f45808352620018f5604085205486111562000fa3620018d988620050f5565b338852848752620018ee6040892054620050f5565b9062004dfa565b3384528083526200190b856040862054620050ba565b929062000fa3620018d988620050f5565b3384528252806040842055156200195e575b508080809381811562001954575b3390f115620019485780f35b604051903d90823e3d90fd5b506108fc6200193c565b9050611f46805491620019718362004e62565b918593865b81811062001a645750506200198b8462004e62565b805192906001600160401b03841162001a50579080849392620019b18a98979662004ff7565b0191865280862090865b84811062001a31575050505050825b828110620019da5750506200192e565b9192509062001a279062000faa6001600160a01b03620019fb838662004d46565b511662001a088362004eb6565b90919082549060031b9160018060a01b03809116831b921b1916179055565b90849291620019ca565b83516001600160a01b03168184015589975092810192600101620019bb565b634e487b7160e01b88526041600452602488fd5b62001a6f8162004eb6565b90546001600160a01b03916003913391831b1c83160362001a9e575b505062001a989062004cdf565b62001976565b9662001ace91839862001ab562001a989562004eb6565b9054911b1c1662001ac7828962004d46565b5262004cdf565b95903862001a8b565b50346200020257806003193601126200020257613f7080546001600160a01b03191633179055613f73805460ff19166001908117909155604051909190819062001b218162002b3f565b5290611f428054600082558062001e31575b508252818060405162001b468162002b3f565b5262001e1d57611f438054600082558062001d9e575b508252612710613f745562001d9062001b7462005bee565b836040519162001b848362002b3f565b81835262001c866040519162001b9a8362002b3f565b8383526040519462001bac8662002b3f565b8486526040519362001bbe8562002b3f565b8585526040519462001bd08662002b3f565b8686526040519162001be28362002a7f565b8252602097888301526040820152606094858201526040519162001c068362002ab1565b8683526003888401528660408401528686840152608083015260a082015262001c2f8262004cef565b5262001c3b8162004cef565b506040519062001c4b8262002acd565b6004825287868301526040820152838382015260405162001c6c8162002b3f565b84815260808201528660a08201528660c082015262005cfa565b62001c9062005bee565b60405162001c9e8162002b3f565b83815260405162001caf8162002b3f565b84815260405162001cc08162002b3f565b85815260405162001cd18162002b3f565b8681526040519162001ce38362002b3f565b8783526040519362001cf58562002a7f565b8452888401526040830152848201526040519162001d138362002ab1565b8583526003878401528560408401528585840152608083015260a082015262001d3c8262004cef565b5262001d488162004cef565b50856040519462001d598662002acd565b60058652850152604084015282015260405162001d768162002b3f565b84815260808201528260a08201528360c082015262005d46565b611388611faf55611fb05580f35b92506006838102938185040362001e075760009382855260208520908101905b81811062001dce57505062001b5c565b8086849255868682015562001de66002820162005504565b86600382015562001dfa6004820162005399565b8660058201550162001dbe565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b82526041600452602482fd5b92506006838102938185040362001e075760009382855260208520908101905b81811062001e6157505062001b33565b8086849255868682015562001e796002820162005504565b86600382015562001e8d6004820162005399565b8660058201550162001e51565b503462000202578060031936011262000202576020604051338152f35b5034620002025780600319360112620002025762001ed462002bb8565b6040519162001ee38362002b22565b611faf548352611fb0549060209182850152611fb1546040850152611fb254606085015260405180611fb390848254918281520191845284842090845b8181106200202c575050508162001f3991038262002b94565b6080850152611fb4805462001f4e8162002c61565b9162001f5e604051938462002b94565b818352835283832083908584015b83831062001ffe575050505060a085015260405180928391611fb591808354928381520192855280852094905b82821062001fda5750505062001fb29250038262002b94565b60c083015260ff611fb65416151560e083015262000fda611fb7546040519384938462002ead565b85546001600160a01b03168452600195860195879550938101939091019062001f99565b60018781926040999899516200201a8162001164818962002cb6565b81520192019201919095949562001f6c565b82546001600160a01b03168452928601926001928301920162001f20565b5034620002025760203660031901126200020257600435906103e8821015620014ce5762000fda6200208260048460031b0162002c03565b6040519182918262002a39565b50346200020257806003193601126200020257604051611f4180548083529083526020808301937f68ffef30f3d6829c9938575e8bc340aa2a3398e927d767947dd5024d1581d59292915b828210620020f55762000fda85620020828189038262002b94565b83546001600160a01b031686529485019460019384019390910190620020da565b5034620002025760209081600319360112620002025760409062002139620029bc565b8160608451620021498162002a7f565b82815286810183905285810182905201526001600160a01b03168152611f40835220604051906200217a8262002a7f565b620021f581549160ff83161515845260ff8585019360081c1615158352600260405191620021b983620021b1816001850162002cb6565b038462002b94565b6040860192835201549260608501938452604051958695818752511515908601525115156040850152516080606085015260a084019062002e26565b905160808301520390f35b50346200020257602036600319011262000202576020620011e060043562005e1c565b50346200020257806003193601126200020257611faf546200227c6200224862033044565b916200225a6127109384831062004cac565b62002272611fb254611fb054111562000fa3620330b2565b611fb15462005eb0565b90506200228862033108565b50825b6103e88110620022b0575b6020620022a685858504620061de565b9050604051908152f35b909260ff60078360031b01541615620022fa5781620022e4620022f092620022dd62000faa969562005e1c565b906200608f565b949062000fa362033108565b929091926200228b565b929062002296565b50346200020257604036600319011262000202576001600160401b0360043581811162000ca9576200233990369060040162002f77565b916024359182116200020257602062002362846200235b366004870162002f77565b9062006518565b6040519015158152f35b503462000202578060031936011262000202576040516200238d8162002b3f565b604051613f0383825b606482106200252557505050620023ad8162002b5b565b815260405191620023be8362002b22565b613f67548352613f68549060209182850152613f69546040850152613f6a54606085015260405180613f6b90848254918281520191845284842090845b8181106200250757505050816200241491038262002b94565b6080850152613f6c8054620024298162002c61565b9162002439604051938462002b94565b818352835283832083908584015b838310620024d9575050505060a085015260405180928391613f6d91808354928381520192855280852094905b828210620024b5575050506200248d9250038262002b94565b60c083015260ff613f6e5416151560e083015262000fda613f6f546040519384938462002ead565b85546001600160a01b03168452600195860195879550938101939091019062002474565b6001878192604099989951620024f58162001164818962002cb6565b81520192019201919095949562002447565b82546001600160a01b031684529286019260019283019201620023fb565b600160208192855481520193019101909162002396565b5034620002025760208060031936011262000ca5576004356200256b4782111562000fa36200189f84620050f5565b33835282808080611f4794858752620025b0604083205482111562000fa36200259484620050f5565b338652898b52620025a96040872054620050f5565b906200526f565b338252858752620025f0620025ca826040852054620050ba565b919062000fa3620025db85620050f5565b3387528a8c52620025a96040882054620050f5565b338352868852604083205581811562002758575b3390f1156200274d57338352815260408220541562002621575080f35b611f48805491620026328362004e62565b918493855b818110620026f35750506200264c8462004e62565b805192906001600160401b038411620026df5781906200266c8562004fbc565b0191865280862090865b848110620026c3575050505050825b828110620026935750505080f35b620026bd9062000faa6001600160a01b03620026b0838662004d46565b511662001a088362004e9a565b62002685565b83516001600160a01b0316838201559281019260010162002676565b634e487b7160e01b87526041600452602487fd5b620026fe8162004e9a565b90546001600160a01b03916003913391831b1c8316036200272d575b5050620027279062004cdf565b62002637565b966200274491839862001ab5620027279562004e9a565b9590386200271a565b6040513d84823e3d90fd5b506108fc62002604565b50346200020257806003193601126200020257604051611f4680548083529083526020808301937f721f0813146d89d6f0f0dbb1451dd10acd9dadea7c30d73459c3079bc665b9a892915b828210620027c85762000fda85620020828189038262002b94565b83546001600160a01b031686529485019460019384019390910190620027ad565b50346200020257604036600319011262000202576004356024356001600160a01b0381169081900362000ca9576103e88210156200283b579160036040926020948352811b0183522054604051908152f35b634e487b7160e01b83526032600452602483fd5b50346200020257806003193601126200020257604051611f4880548083529083526020808301937f54b856f7ae688db523226c6d190d6c3f1578f46968ba7de0cc9e487420dbf24c92915b828210620028b55762000fda85620020828189038262002b94565b83546001600160a01b0316865294850194600193840193909101906200289a565b50346200020257806003193601126200020257602060ff613f73541660405190620029018162002a18565b8152f35b5034620002025760209081600319360112620002025762002925620029bc565b6200292f620052e8565b506001600160a01b03168152611f498252604080822090519190620029548362002b3f565b60405193849192915b606483106200298757610c808587620029768162002b5b565b8152620002006040518092620029ed565b600182819286548152019401920191926200295d565b90503462000ca5578160031936011262000ca557602090613f71548152f35b600435906001600160a01b0382168203620029d357565b600080fd5b35906001600160a01b0382168203620029d357565b516000915b6064831062002a0057505050565b600190825181526020809101920192019190620029f2565b6004111562002a2357565b634e487b7160e01b600052602160045260246000fd5b6020908160408183019282815285518094520193019160005b82811062002a61575050505090565b83516001600160a01b03168552938101939281019260010162002a52565b608081019081106001600160401b0382111762002a9b57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111762002a9b57604052565b60e081019081106001600160401b0382111762002a9b57604052565b61012081019081106001600160401b0382111762002a9b57604052565b606081019081106001600160401b0382111762002a9b57604052565b61010081019081106001600160401b0382111762002a9b57604052565b602081019081106001600160401b0382111762002a9b57604052565b610c8081019081106001600160401b0382111762002a9b57604052565b604081019081106001600160401b0382111762002a9b57604052565b601f909101601f19168101906001600160401b0382119082101762002a9b57604052565b6040519062002bc78262002b3f565b60405182611f4b6000835b6064821062002bec5750505062002be98262002b5b565b52565b600160208192855481520193019101909162002bd2565b9060405191828154918282526020928383019160005283600020936000905b82821062002c3d5750505062002c3b9250038362002b94565b565b85546001600160a01b03168452600195860195889550938101939091019062002c22565b6001600160401b03811162002a9b5760051b60200190565b90600182811c9216801562002cab575b602083101462002c9557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002c89565b906000929180549162002cc98362002c79565b91828252600193848116908160001462002d30575060011462002ced575b50505050565b90919394506000526020928360002092846000945b83861062002d1b57505050500101903880808062002ce7565b80548587018301529401938590820162002d02565b9294505050602093945060ff191683830152151560051b0101903880808062002ce7565b90815462002d628162002c61565b9260409362002d748551918262002b94565b828152809460208092019260005281600020906000935b85851062002d9b57505050505050565b6001848192845162002db38162001164818a62002cb6565b81520193019401939162002d8b565b90815180825260208080930193019160005b82811062002de3575050505090565b83516001600160a01b03168552938101939281019260010162002dd4565b60005b83811062002e155750506000910152565b818101518382015260200162002e04565b9060209162002e418151809281855285808601910162002e01565b601f01601f1916010190565b908082519081815260208091019281808460051b8301019501936000915b84831062002e7c5750505050505090565b909192939495848062002e9c600193601f198682030187528a5162002e26565b980193019301919493929062002e6b565b93929162002ebf85610ca093620029ed565b610cc080610c808701528151908601526020810151610ce08601526040810151610d008601526060810151610d2086015260e062002f4b62002f146080840151610100610d408a0152610dc089019062002dc2565b62002f3460a085015191610cbf1992838b830301610d608c015262002e4d565b9060c08501519089830301610d808a015262002dc2565b9101511515610da0860152930152565b6001600160401b03811162002a9b57601f01601f191660200190565b81601f82011215620029d35780359062002f918262002f5b565b9262002fa1604051948562002b94565b82845260208383010111620029d357816000926020809301838601378301015290565b6005111562002a2357565b90815180825260208080930193019160005b82811062002ff0575050505090565b83518552938101939281019260010162002fe1565b90815180825260208092019182818360051b82019501936000915b848310620030315750505050505090565b90919293949584806200304d83856001950387528a5162002fcf565b980193019301919493929062003020565b90815180825260208092019182818360051b82019501936000915b8483106200308a5750505050505090565b9091929394958480620030a683856001950387528a5162002dc2565b980193019301919493929062003079565b90815180825260208092019081926005928183851b82019601946000915b848310620030e7575050505050505090565b90919293949596818103835287519060e0808201835190600682101562002a235783929189945283850151848401528a60409182870151938386015283518091528561010082818801941b87010194019260005b8281106200319a5750505050509282916200317060019560608085015190840152608080850151908483039085015262002e26565b9160a08082015115159083015260c0809101511515910152990193019301919594939290620030d5565b91939596806200325f600193959760ff198b82030189528951908151815283820151620031c78162002fc4565b8482015287820151620031da8162002a18565b888201526060908183015182820152816200324f6200323e6200322d6080620032108189015160c080848a015288019062002fcf565b9560a0809901519881880391015287519080875286019062002e4d565b888701518582038a87015262003005565b8b8601518482038d8601526200305e565b9301519181840391015262002e26565b970195019101918b9695949391926200313b565b90606081019160018060a01b03815116825260208101519260606020840152835180915260808301602060808360051b86010195019160005b818110620032d55750505050906040620032d29392015190604081840391015262002e26565b90565b858703607f19018352835180516001600160a01b031688526020810151949793949293919290602682101562002a2357604091602084015201519060606040820152620033318251610100606084015261016083019062002e4d565b602083810151838303605f190160808501528051808452928201929101906000905b808210620034f3575050506040830151605f198383030160a0840152805180835260208301906020808260051b86010193019360005b8281106200346e57505050506060840151838203605f190160c0850152620033b29250620030b7565b608083015190605f198382030160e0840152602080835192838152019201906000905b8082106200344a575050506200343d8360209360e0620034266200340e879660a060019a0151605f198683030161010087015262003005565b60c0850151848203605f19016101208601526200305e565b92015190610140605f198285030191015262002e26565b98019401929101620032ac565b9091926020806001928651620034608162002fc4565b8152019401920190620033d5565b90919293602080600192601f19868203018852885190620034d76200349c835160e080855284019062002fcf565b8484015185840152604084015160408401526060840151606084015260808401511515608084015260a084015183820360a085015262002e26565b60c0928301511515919092015297019695019392910162003389565b90919260208060019286511515815201940192019062003353565b90600382101562002a235752565b9060405191828154918282526020928383019160005283600020936000905b828210620035545750505062002c3b9250038362002b94565b8554845260019586019588955093810193909101906200353b565b906040516200357e8162002acd565b60c060ff6006839562003591816200351c565b85526001810154602086015260028101546040860152600381015460608601528260048201541615156080860152604051620035d68162001164816005860162002cb6565b60a08601520154161515910152565b600682101562002a235752565b908154620036008162002c61565b9262003610604051948562002b94565b818452600090815260208082208186015b84841062003630575050505050565b600183819262003640856200351c565b81520192019301929062003621565b9081546200365d8162002c61565b926200366d604051948562002b94565b818452600090815260208082208186015b8484106200368d575050505050565b60018381926200369d8562002c03565b8152019201930192906200367e565b9060036060604051620036bf8162002a7f565b6200370a8195620036d08162002d54565b8352620036e060018201620035f2565b6020840152620036f3600282016200364f565b6040840152620021b1604051809681930162002cb6565b0152565b906040516200371d8162002b06565b82546001600160a01b03168152600183018054919384929091620037418262002c61565b9162003751604051938462002b94565b80835260208301916000526020600020916000905b828210620037935750505050916200370a6040926002946020840152620021b18451809681930162002cb6565b604051620037a18162002b06565b84546001600160a01b038116825260a01c60ff16602681101562002a23576020820152604051620037d28162002b22565b620037e06001870162002d54565b815260028601604051808260208294549384815201906000526020600020926000905b80601f83011062004753576200393c9454918181106200473c575b81811062004722575b81811062004708575b818110620046ee575b818110620046d5575b818110620046bb575b818110620046a1575b81811062004687575b8181106200466d575b81811062004653575b81811062004639575b8181106200461f575b81811062004605575b818110620045eb575b818110620045d1575b818110620045b7575b8181106200459d575b81811062004583575b81811062004569575b8181106200454f575b81811062004535575b8181106200451b575b81811062004501575b818110620044e7575b818110620044cd575b818110620044b3575b81811062004499575b8181106200447f575b81811062004465575b8181106200444b575b81811062004431575b1062004420575b50038262002b94565b6020820152600386018054620039528162002c61565b9162003962604051938462002b94565b81835260208301906000526020600020906000905b838210620043ff57505050506040820152600486018054620039998162002c61565b91620039a9604051938462002b94565b81835260208301906000526020600020906000905b838210620042af57505050506060820152600586016040519081602082549182815201916000526020600020906000915b81601f84011062003fa65784600997946020979460019a979462003b3594549181811062003f88575b81811062003f67575b81811062003f46575b81811062003f25575b81811062003f05575b81811062003ee4575b81811062003ec3575b81811062003ea2575b81811062003e81575b81811062003e60575b81811062003e3f575b81811062003e1e575b81811062003dfd575b81811062003ddc575b81811062003dbb575b81811062003d9a575b81811062003d79575b81811062003d58575b81811062003d37575b81811062003d16575b81811062003cf5575b81811062003cd4575b81811062003cb3575b81811062003c92575b81811062003c71575b81811062003c50575b81811062003c2f575b81811062003c0e575b81811062003bed575b81811062003bcc575b81811062003bab575b1062003b905750038262002b94565b608082015262003b4860068a01620035f2565b60a082015262003b5b60078a016200364f565b60c082015260405162003b7781620011648160088e0162002cb6565b60e0820152604082015281520194019101909262003766565b90889160f81c62003ba18162002fc4565b8152013862003933565b928a8d9160ff8560f01c1662003bc18162002fc4565b815201930162003b26565b928a8d9160ff8560e81c1662003be28162002fc4565b815201930162003b1d565b928a8d9160ff8560e01c1662003c038162002fc4565b815201930162003b14565b928a8d9160ff8560d81c1662003c248162002fc4565b815201930162003b0b565b928a8d9160ff8560d01c1662003c458162002fc4565b815201930162003b02565b928a8d9160ff8560c81c1662003c668162002fc4565b815201930162003af9565b928a8d9160ff8560c01c1662003c878162002fc4565b815201930162003af0565b928a8d9160ff8560b81c1662003ca88162002fc4565b815201930162003ae7565b928a8d9160ff8560b01c1662003cc98162002fc4565b815201930162003ade565b928a8d9160ff8560a81c1662003cea8162002fc4565b815201930162003ad5565b928a8d9160ff8560a01c1662003d0b8162002fc4565b815201930162003acc565b928a8d9160ff8560981c1662003d2c8162002fc4565b815201930162003ac3565b928a8d9160ff8560901c1662003d4d8162002fc4565b815201930162003aba565b928a8d9160ff8560881c1662003d6e8162002fc4565b815201930162003ab1565b928a8d9160ff8560801c1662003d8f8162002fc4565b815201930162003aa8565b928a8d9160ff8560781c1662003db08162002fc4565b815201930162003a9f565b928a8d9160ff8560701c1662003dd18162002fc4565b815201930162003a96565b928a8d9160ff8560681c1662003df28162002fc4565b815201930162003a8d565b928a8d9160ff8560601c1662003e138162002fc4565b815201930162003a84565b928a8d9160ff8560581c1662003e348162002fc4565b815201930162003a7b565b928a8d9160ff8560501c1662003e558162002fc4565b815201930162003a72565b928a8d9160ff8560481c1662003e768162002fc4565b815201930162003a69565b928a8d9160ff8560401c1662003e978162002fc4565b815201930162003a60565b928a8d9160ff8560381c1662003eb88162002fc4565b815201930162003a57565b928a8d9160ff8560301c1662003ed98162002fc4565b815201930162003a4e565b928a8d9160ff8560281c1662003efa8162002fc4565b815201930162003a45565b928a8d9160ff85831c1662003f1a8162002fc4565b815201930162003a3c565b928a8d9160ff8560181c1662003f3b8162002fc4565b815201930162003a33565b928a8d9160ff8560101c1662003f5c8162002fc4565b815201930162003a2a565b928a8d9160ff8560081c1662003f7d8162002fc4565b815201930162003a21565b928a8d9160ff851662003f9b8162002fc4565b815201930162003a18565b926001610400602092865460ff811662003fc08162002fc4565b825260ff8160081c1662003fd48162002fc4565b8583015260ff8160101c1662003fea8162002fc4565b604083015260ff8160181c16620040018162002fc4565b606083015260ff81861c16620040178162002fc4565b608083015260ff8160281c166200402e8162002fc4565b60a083015260ff8160301c16620040458162002fc4565b60c08301526200405b60ff8260381c1662002fc4565b60ff8160381c1660e083015260ff8160401c16620040798162002fc4565b61010083015260ff8160481c16620040918162002fc4565b61012083015260ff8160501c16620040a98162002fc4565b61014083015260ff8160581c16620040c18162002fc4565b61016083015260ff8160601c16620040d98162002fc4565b61018083015260ff8160681c16620040f18162002fc4565b6101a083015260ff8160701c16620041098162002fc4565b6101c083015260ff8160781c16620041218162002fc4565b6101e083015260ff8160801c16620041398162002fc4565b61020083015260ff8160881c16620041518162002fc4565b61022083015260ff8160901c16620041698162002fc4565b61024083015260ff8160981c16620041818162002fc4565b61026083015260ff8160a01c16620041998162002fc4565b61028083015260ff8160a81c16620041b18162002fc4565b6102a083015260ff8160b01c16620041c98162002fc4565b6102c083015260ff8160b81c16620041e18162002fc4565b6102e083015260ff8160c01c16620041f98162002fc4565b61030083015260ff8160c81c16620042118162002fc4565b61032083015260ff8160d01c16620042298162002fc4565b61034083015260ff8160d81c16620042418162002fc4565b61036083015260ff8160e01c16620042598162002fc4565b61038083015260ff8160e81c16620042718162002fc4565b6103a083015260ff8160f01c16620042898162002fc4565b6103c083015260f81c6200429d8162002fc4565b6103e0820152019401920191620039ef565b604051620042bd8162002acd565b620042cd60ff85541682620035e5565b60018401546020820152600284018054620042e88162002c61565b91620042f8604051938462002b94565b81835260208301906000526020600020906000905b8382106200437857505050506001928260209260406006950152600387015460608201526040516200434881620011648160048c0162002cb6565b608082015260ff6005880154818116151560a084015260081c16151560c0820152815201930191019091620039be565b6001906020604051916200438c8362002ab1565b85548352838601549260ff8416620043a48162002fc4565b8382015260ff600894851c16620043bb8162002a18565b604082015260028701546060820152620043d8600388016200351c565b6080820152620043eb60048801620036ac565b60a08201528152019301910190916200430d565b6007602060019262004411866200356f565b81520193019101909162003977565b60f81c151581526020013862003933565b92602060019160ff8560f01c16151581520193016200392c565b92602060019160ff8560e81c161515815201930162003923565b92602060019160ff8560e01c16151581520193016200391a565b92602060019160ff8560d81c161515815201930162003911565b92602060019160ff8560d01c161515815201930162003908565b92602060019160ff8560c81c1615158152019301620038ff565b92602060019160ff8560c01c1615158152019301620038f6565b92602060019160ff8560b81c1615158152019301620038ed565b92602060019160ff8560b01c1615158152019301620038e4565b92602060019160ff8560a81c1615158152019301620038db565b92602060019160ff8560a01c1615158152019301620038d2565b92602060019160ff8560981c1615158152019301620038c9565b92602060019160ff8560901c1615158152019301620038c0565b92602060019160ff8560881c1615158152019301620038b7565b92602060019160ff8560801c1615158152019301620038ae565b92602060019160ff8560781c1615158152019301620038a5565b92602060019160ff8560701c16151581520193016200389c565b92602060019160ff8560681c161515815201930162003893565b92602060019160ff8560601c16151581520193016200388a565b92602060019160ff8560581c161515815201930162003881565b92602060019160ff8560501c161515815201930162003878565b92602060019160ff8560481c16151581520193016200386f565b92602060019160ff8560401c161515815201930162003866565b92602060019160ff8560381c16151581520193016200385d565b92602060019160ff8560301c161515815201930162003854565b92602060019160ff8560281c16151581520193016200384b565b92602060019160ff85831c161515815201930162003842565b92602060019160ff8560181c161515815201930162003839565b92602060019160ff8560101c161515815201930162003830565b92602060019160ff8560081c161515815201930162003827565b92602060019160ff8516151581520193016200381e565b916020919350610400600191865460ff81161515825260ff8160081c1615158583015260ff8160101c161515604083015260ff816060828260181c161515818601528282608082828c1c16151581890152828260281c16151560a0890152828260c095828260301c161515878c0152828260381c16151560e08c0152828260401c1615156101008c0152828260481c1615156101208c0152828260501c1615156101408c0152828260581c1615156101608c01521c161515610180890152828260681c1615156101a0890152828260701c1615156101c0890152828260781c1615156101e08901521c161515610200860152828260881c161515610220860152828260901c161515610240860152828260981c161515610260860152828260a01c161515610280860152828260a81c1615156102a0860152828260b01c1615156102c0860152828260b81c1615156102e08601521c16151561030083015260ff8160c81c16151561032083015260ff8160d01c16151561034083015260ff8160d81c16151561036083015260ff8160e01c16151561038083015260ff8160e81c1615156103a083015260ff8160f01c1615156103c083015260f81c15156103e082015201940192018492939162003803565b9080601f83011215620029d357813590620049408262002c61565b9262004950604051948562002b94565b828452602092838086019160051b83010192808411620029d357848301915b848310620049805750505050505090565b82356001600160401b038111620029d3578691620049a48484809489010162002f77565b8152019201916200496f565b35908115158203620029d357565b81601f82011215620029d357803591620049d88362002c61565b92620049e8604051948562002b94565b808452602092838086019260051b820101928311620029d3578301905b82821062004a14575050505090565b8135815290830190830162004a05565b9080601f83011215620029d35781359062004a3f8262002c61565b9262004a4f604051948562002b94565b828452602092838086019160051b83010192808411620029d357848301915b84831062004a7f5750505050505090565b82356001600160401b038111620029d357869162004aa384848094890101620049be565b81520192019162004a6e565b9080601f83011215620029d35781359162004aca8362002c61565b9260409262004adc8451958662002b94565b8185526020938486019185600594851b86010194818611620029d357868101935b86851062004b1057505050505050505090565b84356001600160401b038111620029d357820183603f82011215620029d357888101359062004b3f8262002c61565b9162004b4e8751938462002b94565b808352868b8401918a1b83010191868311620029d35791878c94929593015b81811062004b8657505082935081520194019362004afd565b91938091939562004b9784620029d8565b8152019101918b9391949262004b6d565b9062002c3b604560405180947f496e76616c69642070726f6772616d20616464726573732e204d73672e73656e60208301526403232b91d160dd1b604083015262004bfd815180926020868601910162002e01565b810103602581018552018362002b94565b9062002c3b6040805180947f2c20616e642070726f6772616d206f70657261746f7220616464726573733a20602083015262004c54815180926020868601910162002e01565b810103602081018552018362002b94565b602062002c3b91939293604051948162004c89879351809286808701910162002e01565b820162004c9f8251809386808501910162002e01565b0103808552018362002b94565b1562004cb55750565b60405162461bcd60e51b81526020600482015290819062004cdb90602483019062002e26565b0390fd5b600019811462001e075760010190565b80511562004cfd5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101562004cfd5760400190565b80516002101562004cfd5760600190565b80516003101562004cfd5760800190565b805182101562004cfd5760209160051b010190565b7f496e76616c696420776974686472617720616d6f756e742e20416d6f756e743a8152600160fd1b602082015260210190565b600f62002c3b916020949360405195869262004dbe62004db083860162004d5b565b918281519485920162002e01565b016e0161030b732103130b630b731b29d1608d1b815262004de9825180936020878501910162002e01565b010360101981018552018362002b94565b601962002c3b916020949360405195869262004e1c62004db083860162004d5b565b01780161030b732103bb4ba34323930bbb0b136329031b0b9b41d1603d1b815262004e51825180936020878501910162002e01565b010360061981018552018362002b94565b9062004e6e8262002c61565b62004e7d604051918262002b94565b828152809262004e90601f199162002c61565b0190602036910137565b611f48805482101562004cfd5760005260206000200190600090565b611f46805482101562004cfd5760005260206000200190600090565b611f41805482101562004cfd5760005260206000200190600090565b613f02805482101562004cfd5760005260206000200190600090565b611f4a805482101562004cfd5760005260206000200190600090565b613efe805482101562004cfd5760005260206000200190600090565b613f00805482101562004cfd5760005260206000200190600090565b805482101562004cfd5760005260206000200190600090565b8181029291811591840414171562001e0757565b919082549060031b91821b91600019901b1916179055565b81811062004faf575050565b6000815560010162004fa3565b600160401b811162002a9b57611f489081549080835581811062004fdf57505050565b62002c3b926000526020600020918201910162004fa3565b600160401b811162002a9b57611f469081549080835581811062004fdf57505050565b805460008255806200502a575050565b62002c3b9160005260206000209081019062004fa3565b600160401b811162002a9b57613efe9081549080835581811062004fdf57505050565b600160401b811162002a9b57613f009081549080835581811062004fdf57505050565b611fb5805460008255806200502a575050565b90600160401b811162002a9b5781549080835581811062004fdf57505050565b9190828111620050cb576001920390565b50600091508190565b8115620050df570490565b634e487b7160e01b600052601260045260246000fd5b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8082101562005260575b506904ee2d6d415b85acef8160201b8083101562005250575b50662386f26fc100008083101562005240575b506305f5e1008083101562005230575b506127108083101562005220575b5060648210156200520f575b600a8092101562005204575b60019081602181860195620051918762002f5b565b96620051a1604051988962002b94565b808852620051b2601f199162002f5b565b01366020890137860101905b620051cb575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215620051fe57919082620051be565b620051c4565b91600101916200517c565b919060646002910491019162005170565b6004919392049101913862005164565b6008919392049101913862005156565b6010919392049101913862005146565b6020919392049101913862005133565b6040935081049150386200511a565b601e62002c3b91602094936040519586926200529162004db083860162004d5b565b017f2c20616e6420776974686472617761626c65206469766964656e64733a2000008152620052ca825180936020878501910162002e01565b010360011981018552018362002b94565b600382101562002a235752565b60405190620052f78262002b3f565b60405182620053068262002b5b565b610c8036833752565b906200531b8262002c61565b6040906200532c8251918262002b94565b83815280936200533f601f199162002c61565b019160005b838110620053525750505050565b6020908251620053628162002acd565b6000815282600081830152606080868401526000818401526080830152600060a0830152600060c083015282860101520162005344565b620053a5815462002c79565b9081620053b0575050565b81601f60009311600114620053c3575055565b908083918252620053e4601f60208420940160051c84016001850162004fa3565b5555565b8054906000815581620053f9575050565b6000526020600020908101905b81811062005412575050565b806200542060019262005399565b0162005406565b90600160401b811162002a9b578154918181558282106200544757505050565b600052602060002091820191015b81811062005461575050565b806200546f60019262005399565b0162005455565b805490600081558162005487575050565b6000526020600020908101905b818110620054a0575050565b80620054ae6001926200501a565b0162005494565b90600160401b811162002a9b57815491818155828210620054d557505050565b600052602060002091820191015b818110620054ef575050565b80620054fd6001926200501a565b01620054e3565b8054600091828155816200551757505050565b6001600160fd1b0382168203620055a45782526020822091600391821b8301925b838110620055465750505050565b808260089255826001820155826002820155620055658482016200501a565b6200557360048201620053e8565b620055816005820162005476565b6200558f6006820162005476565b6200559d6007820162005399565b0162005538565b634e487b7160e01b83526011600452602483fd5b600160401b821162002a9b57805490828155818310620055d757505050565b6001600160fd1b03828116830362001e07578316830362001e0757600090815260208120600392831b810193831b015b838110620056155750505050565b808260089255826001820155826002820155620056348482016200501a565b6200564260048201620053e8565b620056506005820162005476565b6200565e6006820162005476565b6200566c6007820162005399565b0162005607565b51600681101562002a235790565b90600681101562002a235760ff80198354169116179055565b90620056a68162002fc4565b60ff80198354169116179055565b90620056c08162002a18565b61ff0082549160081b169061ff001916179055565b9190601f8111620056e557505050565b62002c3b926000526020600020906020601f840160051c8301931062005714575b601f0160051c019062004fa3565b909150819062005706565b81519192916001600160401b03811162002a9b576200574b8162005744845462002c79565b84620056d5565b602080601f83116001146200578a5750819293946000926200577e575b50508160011b916000199060031b1c1916179055565b01519050388062005768565b90601f198316958460005282600020926000905b888210620057d957505083600195969710620057bf575b505050811b019055565b015160001960f88460031b161c19169055388080620057b5565b806001859682949686015181550195019301906200579e565b9060ff801983541691151516179055565b9061ff00825491151560081b169061ff001916179055565b8151600681101562002a235762005833908262005681565b602082015160018201556002810160408301516020815191620058578385620055b8565b01916000526020600020916000905b828210620058b857505050509060c0600562002c3b9360608401516003820155620058996080850151600483016200571f565b0191620058ad60a0820151151584620057f2565b015115159062005803565b805180518555620058f860018601620058e16020840151620058da8162002fc4565b826200569a565b604083015190620058f28262002a18565b620056b4565b60608101516002860155608081015180519060038701906001600160401b03831162002a9b576020906200592d84846200509a565b0190600052602060002060005b83811062005bd9575050505060a001518051805190600487019060209062005963848462005427565b01906000526020600020906000905b83821062005bb957505050506005850160208201516020815191620059988385620054b5565b019160005260206000206000925b82841062005b5557505050506006850160408201516020815191620059cc8385620054b5565b019160005260206000206000925b82841062005ae85750505050606001518051906001600160401b03821162002a9b5762005a1a8262005a10600789015462002c79565b60078901620056d5565b602090601f831160011462005a6d57928260089360209360019660009262005a61575b5050600019600383901b1c191690851b1760078801555b0194019101909262005866565b01519050388062005a3d565b906007870160005260206000209160005b601f198516811062005acf575083602093600196938793600897601f1981161062005ab5575b505050811b01600788015562005a54565b015160001960f88460031b161c1916905538808062005aa4565b9192602060018192868501518155019401920162005a7e565b80518051906001600160401b03821162002a9b5760209062005b0b83866200509a565b0183600052602060002060005b83811062005b37575050505060016020819201920193019290620059da565b82516001600160a01b03168183015560209092019160010162005b18565b80518051906001600160401b03821162002a9b5760209062005b7883866200509a565b0183600052602060002060005b83811062005ba4575050505060016020819201920193019290620059a6565b60019060208451940193818401550162005b85565b600160208262005bcc839451876200571f565b0193019101909162005972565b6001906020845194019381840155016200593a565b60409081519162005bff8362002b78565b60018352829160005b60208082101562005c725783516020929162005c248262002ab1565b60008252600081830152600086830152606060008184015280608084015286519062005c508262002a7f565b808252808383015280888301528082015260a083015282880101520162005c08565b505091925050565b611f43805482101562004cfd576000526006602060002091020190600090565b613efb805482101562004cfd576000526006602060002091020190600090565b611f42805482101562004cfd576000526006602060002091020190600090565b613efa805482101562004cfd576000526006602060002091020190600090565b611f428054600160401b81101562002a9b5762005d1d9160018201905562005cba565b91909162005d305762002c3b916200581b565b634e487b7160e01b600052600060045260246000fd5b611f438054600160401b81101562002a9b5762005d1d9160018201905562005c7a565b613efb8054600160401b81101562002a9b5762005d1d9160018201905562005c9a565b613efa8054600160401b81101562002a9b5762005d1d9160018201905562005cda565b1562005db757565b60405162461bcd60e51b815260206004820152603760248201527f73756d4469766964656e64576569676874466f72546f6b656e436c6173733a206044820152766469766964656e64576569676874206f766572666c6f7760481b6064820152608490fd5b6103e881101562004cfd5762005e4a8162005e436002620032d29460031b01549162005f36565b9062005eb0565b919062005daf565b6103e881101562004cfd5762005e4a8162005e43611fba620032d29460031b01549162005fe5565b90811562005ea757606462005e938184029384620050d4565b0362005e9f5760019190565b600091508190565b60019150600090565b9190821562005ec85762005e938184029384620050d4565b5060019150600090565b1562005eda57565b60405162461bcd60e51b815260206004820152602e60248201527f746f74616c546f6b656e73506572546f6b656e436c6173733a20746f74616c5460448201526d6f6b656e73206f766572666c6f7760901b6064820152608490fd5b6103e8811015908162004cfd57600390811b906004928383019182549260009582879601935b85871062005f6e575050505050505090565b97969091929394959762005fd05762005fc48862005fbc62005f9662000faa9a9b8762004f5e565b905490881b1c6001600160a01b031660009081526020899052604081205490946200608f565b999062005ed2565b95949392919062005f5c565b603282634e487b7160e01b6000525260246000fd5b6103e8811015908162004cfd5790600391821b90611fbc820190815490600094611fbb869501915b8386106200601e5750505050505090565b9590919293949562004cfd576200607186620060696200604362000faa998962004f5e565b905490861b1c6001600160a01b031660009081526020879052604081205490946200608f565b989062005ed2565b94939291906200600d565b906001820191821062005e9f5760019190565b9190820191821062005e9f5760019190565b15620060a957565b60405162461bcd60e51b815260206004820152603360248201527f73756d566f74696e67576569676874466f72546f6b656e436c6173733a20766f60448201527274696e67576569676874206f766572666c6f7760681b6064820152608490fd5b6103e881101562004cfd57620061318162005e436001620032d29460031b01549162005f36565b9190620060a1565b6103e881101562004cfd57620061318162005e43611fb9620032d29460031b01549162005fe5565b611faf54620061736200224862033044565b9190506200618062033108565b5060009081925b6103e88410620061a4575b6200619f935004620061de565b905090565b9160ff60078560031b01541615620061d75783620022e4620061d092620022dd62000faa969762005e1c565b9262006187565b9162006192565b908015620061f657620061f191620050d4565b600191565b5050600090600090565b9190820180921162001e0757565b9190820391821162001e0757565b906107b2906301e1853e80840483810180821162001e07576001820181811162001e0757604583019082821162001e075760646200625f92049060021c6200620e565b9561017183019682881162001e075762006280906101908099049062006200565b9084840294848604148415171562001e075762015180948583029280840487149015171562001e0757620062c092620062b99162006200565b906200620e565b91600495869108159586620064df575b506040516101a081016001600160401b03811182821017620064ca57604052600c9687825261018080366020850137601f91826200630e8562004cef565b5215620064c05760ff601d5b16620063268462004d13565b5281620063338462004d24565b52601e620063418462004d35565b528251881015620064ab578160a0840152825160051015620064ab57601e60c0840152825160061015620064ab578160e0840152825160071015620064ab5781610100840152825160081015620064ab57601e610120840152825160091015620064ab57816101408401528251600a1015620064ab57601e6101608401528251600b1015620064ab57820152600096905b81881062006426575b50508282049460018601809611620064115760018701809711620064115750949392603c80610e10809585060494840604920690565b601190634e487b7160e01b6000525260246000fd5b90969262006435848362004d46565b51858102908082048714901517156200648e578110620064a3576200645b848362004d46565b5190858202918083048714901517156200648e5762006486916200647f916200620e565b9362004cdf565b9690620063d2565b601188634e487b7160e01b6000525260246000fd5b9296620063db565b603288634e487b7160e01b6000525260246000fd5b60ff601c6200631a565b604187634e487b7160e01b6000525260246000fd5b909550606486061590811591620064fa575b509438620062d0565b905085061538620064f1565b90815181101562004cfd570160200190565b908151815111620065cf576000905b6200653683518251906200620e565b8211620065c75760019260005b8251811015620065bc576001600160f81b0319806200656e62006567848862006200565b8562006506565b5116906200657d838662006506565b5116036200659657620065909062004cdf565b62006543565b5092509060005b620065b457620065ad9062004cdf565b9062006527565b505050600190565b50929190916200659d565b505050600090565b5050600090565b611f4680549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004eb6565b611f4a80549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004f0a565b611fb5805490600160401b82101562002a9b576001820180825582101562004cfd576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b611fb3805490600160401b82101562002a9b576001820180825582101562004cfd576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b611f4180549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004ed2565b60405190620066f98262002b78565b60188252772a343290383937b3b930b69034b99032bc32b1baba32b21760411b6020830152565b604051906200672f8262002b06565b603a82527930b33a32b9103b37ba34b7339030b7321030b8383937bb30b61760311b6040837f5468652070656e64696e672070726f6772616d2069732065786563757465642060208201520152565b90600091825b60208083019081518051871015620069155781620067a788620067af9362004d46565b510162007387565b6026928382101562002a2357601a9182036200686d5787620067d2915162004d46565b5192828401519081101562002a2357036200682b5750936200681c6200682492620068146200680d60a0604062000faa9a0151015162004cef565b5162004cef565b51906200608f565b959062007395565b9262006784565b6064906040519062461bcd60e51b82526004820152601b60248201527a2a34329037b831b7b2329034b9903737ba102820acafa1a0a9a41760291b6044820152fd5b929190506200688681620067a789869a979a5162004d46565b8281101562002a2357601403620068bf575050906200681c62000faa95620022dd620068b88462006824965162004d46565b51620073e2565b620068d190620067a785855162004d46565b9081101562002a2357601514620068ef575b50620068249062004cdf565b906200681c6200690e95620022dd620068b88462006824965162004d46565b90620068e3565b5050509092508034106000146200698b5760405162461bcd60e51b815260206004820152603760248201527f546865207061796d656e74206973206e6f7420656e6f7567682e205468652074604482015276037ba30b6103830bcb6b2b73a1039b437bab6321031329604d1b6064820152608490fd5b8034116200720c575b50613f739182549260ff841693620069ac8562002a18565b600194808603620069e657505050620069dc919250620069d6620069d08262007479565b62007550565b620075da565b620032d2620066ea565b620069f18162002a18565b600281148080620071ff575b1562006e285750505062006a11826200748e565b1562006de95762006a22826200748e565b1562006dad5762006a5b90602080930190600260ff8560018060a01b0362006a4b865162004cef565b5151169460409687915162004cef565b510151015192541662006a6e8162002a18565b0362006d6d5781600052613f778085528360002092613f7880549485600052875260ff86600020541662006d2f5783519480600052613f7693848952600396878960002001540362006cc95783600052885286600020906000528752856000208960ff19825416179055886000905b62006b27575b505050505050742a3432903b37ba329034b99032bc32b1baba32b21760591b9192935062006b1062032533565b519162006b1d8362002b78565b6015835282015290565b845181101562006cc35786825480600052858a5262006b4c8389846000200162004f5e565b905490891b1c908a84888b62006b63838d62004d46565b511562006c2157505050505062006bc662006ba685549283600052888d52620022dd62006b9887600480986000200162004f5e565b9054908d1b1c91896203241d565b9092600052878c5262006bbf85858d6000200162004f5e565b9062004f8b565b1562006bdf575062006bd89062004cdf565b8962006add565b875162461bcd60e51b8152908101899052601c60248201527b766f74696e6720666f7220706f776572596573206f766572666c6f7760201b6044820152606490fd5b9062006c5e62006c7096620022dd87999462006bbf979860005284895262006c5187600580986000200162004f5e565b9054911b1c918d6203241d565b959097600052528c6000200162004f5e565b1562006c815762006bd89062004cdf565b865162461bcd60e51b815260048101899052601b60248201527a766f74696e6720666f7220706f7765724e6f206f766572666c6f7760281b6044820152606490fd5b62006ae3565b875162461bcd60e51b8152600481018a9052603960248201527f746865206e756d626572206f6620766f74657320646f6573206e6f74206d6174604482015278636820746865206e756d626572206f6620706f6c696369657360381b6064820152608490fd5b855162461bcd60e51b81526004810188905260176024820152761d9bdd195c881a185cc8185b1c9958591e481d9bdd1959604a1b6044820152606490fd5b825162461bcd60e51b8152600481018590526019602482015278766f74696e67206973206e6f7420696e2070726f677265737360381b6044820152606490fd5b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74652070726f6772616d60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527624b73b30b634b2103b37ba34b73390383937b3b930b69760491b6044820152606490fd5b62006e3882979495969762002a18565b60038214918280620071f2575b1562006ec75750505050505062006e5c81620074f5565b1562006e775762006e6d906202f2b7565b620032d262006720565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420657865637574696e672070656e64696e672070726f677261604482015261369760f11b6064820152608490fd5b62006ed28162002a18565b8180620071e4575b80620071d7575b156200710157505050509060ff9062006ef962032745565b54169062006f078262002a18565b810362006fc5575062006f1a8162007479565b1562006f345780620069d6620069d0620069dc9362007479565b60405162461bcd60e51b815260206004820152605f60248201527f54686520766f74696e672069732072656a656374656420616e64206e6f77204460448201527f41524320697320696e2069646c652073746174652e2054686520696e7075742060648201527f70726f6772616d206973206e6f7420612076616c69642070726f6772616d2e00608482015260a490fd5b8062006fd360039262002a18565b146200700c57505b60405162006fe98162002b78565b6013815272283937b3b930b6903a32b936b4b730ba32b21760691b602082015290565b6200701781620074f5565b15620070285762006e6d906202f2b7565b60405162461bcd60e51b815260206004820152609960248201527f54686520766f74696e672069732070617373656420616e64206e6f772044415260448201527f4320697320696e20657865637574696e672070656e64696e672073746174652e60648201527f2054686520696e7075742070726f6772616d206973206e6f7420612076616c6960848201527f6420455845435554455f50454e44494e475f50524f4752414d20746f2065786560a48201527831baba32903a3432903832b73234b73390383937b3b930b69760391b60c482015260e490fd5b6200710c8162002a18565b8215620071c2575b505080620071b4575b6200712c575050505062006fdb565b60ff19161790556200713e8162007479565b15620071585780620069d6620069d0620069dc9362007479565b60405162461bcd60e51b815260206004820152602e60248201527f5b4572726f72203030335d5468652070726f6772616d206973206e6f7420612060448201526d3b30b634b210383937b3b930b69760911b6064820152608490fd5b50613f72544210156200711d565b620071cf91925062002a18565b388062007114565b50613f7254421062006ee1565b50613f715442101562006eda565b50613f7254421062006e45565b50613f71544210620069fd565b60018060a01b039081845116600052611f4590816020526040600020541562007302575b6200723c9034620050ba565b9015620072be576200725f9083865116600052826020526040600020546200608f565b9290156200727d578451166000526020526040600020553862006994565b60405162461bcd60e51b81526020600482015260196024820152782a3432903732bb903130b630b731b29037bb32b9333637bb9760391b6044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527b2a3432903830bcb6b2b73a103932ba3ab9371037bb32b9333637bb9760211b6044820152606490fd5b611f4654939291906000805b86811062007344575b506200723c92939495501562007330575b905062007230565b6200733e84875116620065d6565b62007328565b84620073508262004eb6565b919054818b51169260031b1c161462007374576200736e9062004cdf565b6200730e565b5093945084935060016200723c62007317565b51602681101562002a235790565b156200739d57565b60405162461bcd60e51b815260206004820152601f60248201527f54686520746f74616c207061796d656e7420697320746f6f206c617267652e006044820152606490fd5b906000805b6040840160a0620073fc818351015162004d13565b51518410156200747157926200681c62007461604094620074598562007451866200743f8b620074468362000faa9f9e6200743f90620074679e51015162004d13565b5162004d46565b519451015162004d24565b519062005eb0565b929062007395565b6200608f565b91929050620073e7565b509093505050565b6020015151156200748957600190565b600090565b602001516001815103620074b257620074ab620032d29162004cef565b51620074b8565b50600090565b6020810151602681101562002a2357602003620074b2576040015160a081015151620074b25760c081015151620074b25751516200748957600190565b602001516001815103620074b25762007512620032d29162004cef565b516020810151602681101562002a2357602103620074b2576040015160a081015151620074b25760c081015151620074b25751516200748957600190565b156200755857565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642070726f6772616d60881b6044820152606490fd5b60809060208152602a60208201527f5468652070726f6772616d2069732064656e6965642062792074686520706c7560408201526967696e2073797374656d60b01b60608201520190565b620075e58162015182565b5162014c9357600681101562002a23576003811462014c3a5780620076425760405162461bcd60e51b8152602060048201526016602482015275151a19481c1c9bd9dc985b481a5cc81a5b9d985b1a5960521b6044820152606490fd5b600481036200b0db5750600080611f4a54905b8181106200b094575b5050156200b078575b60005b60209081830151918251821015620076cf57620076c181611f49620076a7620076a162000faa95620067a788620076c99a62004d46565b62033353565b9160018060a01b03885116600052526040600020620242c3565b429162004f8b565b6200766a565b50505060005b60208083015180518310156200771d57620076fa91620067a784620076a19362004d46565b90606482101562004cfd5762007717914290611f4b015562004cdf565b620076d5565b505050906000905b602083015180518310156200b0725782620077409162004d46565b516020810180516026908181101562002a2357156200b02f5781518181101562002a23576001036200798e5750506040809101906200778460c08351015162004cef565b5192620077a660a06200779b818651015162004cef565b519451015162004d13565b5195620077b785518551146202df8a565b620077c685518851146202dff0565b60005b85518110156200790c57620077df818662004d46565b516103e8908181101562004cfd57600160ff6007620078079360031b0154161515146202e052565b62007813828a62004d46565b5162007820838862004d46565b51908282101562004cfd5760066200783e9260031b0154906200608f565b906200784b848962004d46565b51918383101562004cfd576006620078689360031b01556202e0aa565b62007874828a62004d46565b519062007882838862004d46565b518181101562004cfd576001600160a01b039392620078c29160039086620078ab878e62004d46565b5116600052811b016020528760002054906200608f565b620078ce848a62004d46565b519283101562004cfd57600362000faa936200790696620078f0878e62004d46565b5116600052811b0160205287600020556202e109565b620077c9565b5093926200792991929650620079229062032f53565b9262032e37565b945192620079378462002b3f565b60008452600036813760005b835181101562007971578062000faa620079626200796b938762004d46565b51878a62032a46565b62007943565b509450926020925062007985915062004cdf565b91905062007725565b81518181101562002a235760020362007c255750506040809101805192835195620079d3620079c260a08097015162004cef565b519562007446818651015162004d13565b5193875186510362007bd257875184510362007b7e57875185510362007b27575060005b855181101562007b115762007a0d818762004d46565b51906103e8918281101562004cfd5762007a3360ff6007809360031b015416156202e162565b62007a3f828962004d46565b518381101562004cfd5760031b01805460ff1916600117905562007a64818a62004d46565b5162007a71828962004d46565b51908382101562004cfd57600562007a8d9260031b016200571f565b62007a99818662004d46565b5162007aa6828962004d46565b518381101562004cfd5760031b6001015562007ac3818762004d46565b5162007ad0828962004d46565b518381101562004cfd5760031b6002015562007aed818862004d46565b519182101562004cfd576000600662007b0b9360031b015562004cdf565b620079f7565b5095509390506020925062007985915062004cdf565b5162461bcd60e51b815260206004820152603c6024820152600080516020620337ec83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b5162461bcd60e51b81526020600482015260396024820152600080516020620337ec8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b5162461bcd60e51b81526020600482015260386024820152600080516020620337ec8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b819593949295518181101562002a235760030362008221575050604084019062007c5460c08351015162004cef565b519362007c6b60a06200779b818651015162004cef565b519362007c80865185511462000fa3620331b7565b62007c93865186511462000fa3620331b7565b60005b865181101562007cfc5762007cac818662004d46565b51906103e882101562004cfd57600362007cf69260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b51111562000fa3620332bb565b62007c96565b50909493919460005b855181101562007e305762007d1b818662004d46565b51906103e88083101562004cfd57600360018060a01b0393848c5116600052811b0160205262007d5e60406000205462007d56848962004d46565b5190620050ba565b9062007d6b848a62004d46565b51918383101562004cfd57600362007d9a93878f5116600052811b0160205260406000205562000fa3620332bb565b62007da6828862004d46565b518181101562004cfd576003908462007dc0858c62004d46565b5116600052811b0160205262007de160406000205462006814848962004d46565b62007ded848a62004d46565b519283101562004cfd57600362000faa9362007e2a9662007e0f878e62004d46565b5116600052811b0160205260406000205562000fa362033320565b62007d05565b5091509162007e4762007e4e919695949662032f53565b9562032e37565b926040519462007e5e8662002b78565b6001865260203681880137516001600160a01b031662007e7e8662004cef565b526000905b86518210156200820c5762007e99828862004d46565b516104c05262007eaa855162004e62565b9660009462007eba885162004e62565b610ae0528594865b885181101562007f91578a8962007ef26001600160a01b0362007ee6858462004d46565b51166104c05162032d3b565b158062007f4b575b62007f13575b505062007f0d9062004cdf565b62007ec2565b9862007f409162001ac782859c62007f3762007f0d9760018060a01b039262004d46565b51169262004d46565b9790508a8962007f00565b5050506103e86104c051101562004cfd576001600160a01b0362007f70828b62004d46565b511660005260036104c051811b016020528a89604060002054151562007efa565b509098949897969291939760005b885181101562008033576103e86104c051101562004cfd576001600160a01b0362007fcb828b62004d46565b511660005260036104c051811b016020526040600020541562007ffa575b62007ff49062004cdf565b62007f9f565b9962007ff4906200802a906001600160a01b03620080198e8d62004d46565b511662001ac782610ae05162004d46565b9a905062007fe9565b5098509694939291956104c0516103e8811015806107405262004cfd5760031b60040154966200806e62008068878a62006200565b62004e62565b996000998a6104e0525b6107405162004cfd576104e0518a8110156200812d57620080ad620080ca9160006107405260046104c05160031b0162004f5e565b9054610ae05160039290921b1c6001600160a01b03169062032dea565b15620080e9575b620080df6104e05162004cdf565b6104e05262008078565b99808c62001ac762008126936200810d6104e05160046104c05160031b0162004f5e565b905460039190911b1c6001600160a01b03169262004d46565b99620080d1565b509a939794969299919850946000915b838310620081d257505050506107405162004cfd578051906001600160401b03821162002a9b576020906200817c8360046104c05160031b016200509a565b0160046104c05160031b01600052602060002060005b838110620081b45750505050620081a99062004cdf565b909295919562007e83565b82516001600160a01b03168183015560209092019160010162008192565b6200820590620081fe906001600160a01b03620081f0868662004d46565b511662001ac7828962004d46565b9262004cdf565b916200813d565b91945050620079859194506020925062004cdf565b819593949295518181101562002a2357600403620084a9575050604080920160c0946200826262008256878451015162004cef565b51968351015162004d13565b51946200827960a06200779b818651015162004cef565b51936200828e885188511462000fa3620331b7565b620082a1885185511462000fa3620331b7565b620082b4885186511462000fa3620331b7565b60005b88518110156200831c57620082cd818662004d46565b51906103e882101562004cfd5762008316916003906001600160a01b03620082f6848e62004d46565b5116600052811b0160205262000faa886000205462007ce9838a62004d46565b620082b7565b50909691959294939660005b83518110156200845d576200833e818862004d46565b51906103e8918281101562004cfd576001600160a01b03906003908262008366858a62004d46565b5116600052811b01602052620083878b62007d56848b600020549262004d46565b9062008394848c62004d46565b51918583101562004cfd576003620083cd9385620083b3888d62004d46565b5116600052811b016020528a6000205562000fa3620332bb565b620083d9828a62004d46565b518381101562004cfd5760039082620083f3858b62004d46565b5116600052811b01602052620084148b62006814848b600020549262004d46565b91905062008423838b62004d46565b519384101562004cfd57620084579360039162008441858b62004d46565b5116600052811b01602052876000205562004cdf565b62008328565b50946200848092975062007e4791939450620084799062032f53565b9362032e37565b9260005b835181101562007971578062000faa62007962620084a3938762004d46565b62008484565b8195949593929351908082101562002a23576005918203620084db575050506020919262000faa62007985926202ec1a565b82518181101562002a23576006036200874c575050509060408092016200850760c08251015162004cef565b51946200852960a06200851e818551015162004cef565b519351015162004d13565b51928651835103620086fb578651845103620086af5760005b8751811015620085a75762008558818562004d46565b51906103e882101562004cfd57620085a1916003906001600160a01b0362008581848d62004d46565b5116600052811b0160205262000faa876000205462007ce9838962004d46565b62008542565b509092919260005b87518110156200865b57620085c5818662004d46565b516103e88082101562004cfd576001600160a01b03929160039084620085ec858e62004d46565b5116600052811b016020526200860c886000205462007d56848962004d46565b62008618848a62004d46565b519283101562004cfd57600362000faa9362008655966200863b8f889062004d46565b5116600052811b01602052896000205562000fa3620332bb565b620085af565b50959262008670919250620079229062032f53565b9251946200867e8662002b3f565b60008652600036813760005b835181101562007971578062000faa62007962620086a9938762004d46565b6200868a565b845162461bcd60e51b8152602060048201526030602482015260008051602062033aec83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b845162461bcd60e51b815260206004820152603560248201526000805160206203372c8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b82518181101562002a23576007036200889b575050506040809101936200877860c08651015162004cef565b51926200878a60a08751015162004cef565b5195515191620087a2855188511462000fa3620331b7565b60005b855181101562007b1157620088959062000faa6001600160a01b03826002886200887d8e620088728e620088688f89620087e08a8562004d46565b51166000526200881c896200881481611f409a8b6020526200880e60ff8760002054161562000fa362033288565b62004d46565b519662004d46565b51968a6200885283519b8c96620088338862002a7f565b600188526060602089019860008a528781019b8c52019b8c5262004d46565b51166000526020526000209751151588620057f2565b5115158662005803565b51600185016200571f565b519101556200888d838a62004d46565b5116620066c0565b620087a5565b82519596959394928185101562002a235760089485036200899257505050620088cd60c0604080950151015162004cef565b519360005b85518110156200897d5762008977906001600160a01b0380620088f6838a62004d46565b5116600052611f4090816020526200894c60ff620089236001828c600020541615151462000fa3620331e7565b8262008930868d62004d46565b5116600052836020528960002054891c161562000fa36203324f565b62008958838a62004d46565b51166000526020528560002061010061ff001982541617905562004cdf565b620088d2565b50949093506020925062007985915062004cdf565b80518281101562002a235760090362008a6657505050620089bc60c0604080950151015162004cef565b519360005b85518110156200897d5762008a6090866001600160a01b0380620089e6848462004d46565b511660005262008a396001898362008a1b87611f4097886020526200880e8660ff8097600020541615151462000fa3620331e7565b5116600052846020528a600020548a1c1615151462000fa36203321a565b62008a45838a62004d46565b51166000526020528560002061ff0019815416905562004cdf565b620089c1565b809192939597969450518281101562002a2357600a0362008b445750505060408094019162008aab60a062008aa060c08651015162004cef565b519451015162004cef565b519162008ac0845184511462000fa3620331b7565b60005b8451811015620079715762008b3e906001600160a01b038062008ae7838962004d46565b5116600052611f408060205262008b0e600160ff8c600020541615151462000fa3620331e7565b62008b1a838862004d46565b519162008b28848a62004d46565b5116600052602052600289600020015562004cdf565b62008ac3565b80969496518281101562002a2357600b0362008c125750505060408092019362008b7360c08651015162004cef565b519451519162008b8b865184511462000fa3620331b7565b60005b8651811015620079715762008c0c9062000faa6001600160a01b038062008bb6848c62004d46565b5116600052611f408060205262008bdd600160ff8b600020541615151462000fa3620331e7565b62008be9848962004d46565b519162008bf7858d62004d46565b5116600052602052600188600020016200571f565b62008b8e565b80969394929596518281101562002a2357600c0362008d1257505060400160609182825101519362008c44856202d698565b60005b855181101562008cfc5760c062008c6382878751015162004d46565b5101511562008cbf5762008c8762008c8082878751015162004d46565b5162005cfa565b611f425460001981019190821162001e07578762008ca962008cb99362005cba565b5001805460ff1916905562004cdf565b62008c47565b62008cda62008cd382878751015162004d46565b5162005d46565b611f425460001981019190821162001e07578762008ca962008cb99362005c7a565b5095915093506020925062007985915062004cdf565b809695949396518281101562002a2357600d0362008e3657505060400193602062008d4260a08751015162004cef565b51955101519162008d5786518451146202dd8c565b60005b865181101562007971578062008d7562008de5928662004d46565b511562008deb5762008d9862008d8c828a62004d46565b51611f4254116202de15565b62008dc160ff8762008db662008daf858d62004d46565b5162005cba565b50015416156202de6d565b8562008dd262008daf838b62004d46565b5001805460ff1916600117905562004cdf565b62008d5a565b62008e0762008dfb828a62004d46565b51611f4354116202de15565b62008e2560ff8762008db662008e1e858d62004d46565b5162005c7a565b8562008dd262008e1e838b62004d46565b80518281101562002a2357600e0362008ef457505060400193602062008e6160a08751015162004cef565b51955101519162008e7686518451146202dd8c565b60005b865181101562007971578062008e9462008ea0928662004d46565b5162008ea65762004cdf565b62008e79565b62008ec262008eb6828a62004d46565b51611f4254116202dece565b62008ee360ff8762008ed962008daf858d62004d46565b500154166202df27565b8562008ca962008daf838b62004d46565b809693949596518281101562002a2357600f0362008fbf57505060400160609182825101519362008f25856202d698565b60005b855181101562008cfc5760c062008f4482878751015162004d46565b5101511562008f895762008f6162008c8082878751015162004d46565b611f425460001981019190821162001e07578762008dd262008f839362005cba565b62008f28565b62008f9d62008cd382878751015162004d46565b611f425460001981019190821162001e07578762008dd262008f839362005c7a565b8091929394969550518281101562002a235760100362009064575050604001519062008ff460a0608084015193015162004cef565b519362009009835186511462000fa3620331b7565b60005b835181101562009051578062000faa6200902b6200904b938762004d46565b51620090378162002fc4565b62009043838a62004d46565b51906202d55c565b6200900c565b5093509160209150620079859062004cdf565b80959295518281101562002a2357601103620092ed575050906040809401916200909960a062008aa060c08651015162004cef565b5191620090aa84518451146202d510565b60005b845181101562009122576200911c9062000faa6001600160a01b0380620090d5848a62004d46565b5116600052611f4580602052620090f68b6000205462006814868b62004d46565b91909262009105868c62004d46565b51166000526020528a6000205562000fa36203316d565b620090ad565b509394509162009133915062032e37565b90611f46928354946200914c6200806885518862006200565b91600093845b888110620092ad575060005b865181101562009205576000805b8a8110620091b6575b50156200918e575b620091889062004cdf565b6200915e565b946200918890620091ad906001600160a01b03620081f0898b62004d46565b9590506200917d565b620091c18162004eb6565b90546001600160a01b0360039290921b1c811690620091e1858c62004d46565b511614620091fa57620091f49062004cdf565b6200916c565b505060013862009175565b50965094909350620092178362004e62565b805191906001600160401b03831162002a9b57602090620092388462004ff7565b0190600052602060002060005b8381106200928f575050505060005b8281106200926c575050506200798560209162004cdf565b620092899062000faa6001600160a01b03620019fb838662004d46565b62009254565b82516001600160a01b03168183015560209092019160010162009245565b94620092e0620092e791620092c28862004eb6565b905460039190911b1c6001600160a01b031662001ac7828962004d46565b9562004cdf565b62009152565b80518281101562002a23576012036200955c5750506040809401916200931e60a062008aa060c08651015162004cef565b51916200932f84518451146202d510565b60005b845181101562009381576200937b9062000faa6001600160a01b03806200935a848a62004d46565b5116600052611f4580602052620090f68b6000205462007d56868b62004d46565b62009332565b509491509291620093929062032e37565b90611f468054620093a38162004e62565b9260009485925b808410620094575750505050620093c18362004e62565b805191906001600160401b03831162002a9b57602090620093e28462004ff7565b0190600052602060002060005b83811062009439575050505060005b82811062009416575050506200798560209162004cdf565b620094339062000faa6001600160a01b03620019fb838662004d46565b620093fe565b82516001600160a01b031681830155602090920191600101620093ef565b9297600097929597949194998a5b86518110156200954a576200947a8b62004eb6565b90546001600160a01b0360039290921b1c8116906200949a838a62004d46565b511614620094b357620094ad9062004cdf565b62009465565b509950976001979592979491945b806200951a575b15620094e057620094d99062004cdf565b92620093aa565b9562009513620094d991620094f58962004eb6565b905460039190911b1c6001600160a01b031662001ac7828a62004d46565b9662004cdf565b50620095268162004eb6565b60018060a01b0391549060031b1c16600052611f45602052826000205415620094c8565b509998909897959297949194620094c1565b80959295518281101562002a2357601303620095bd57505060408091015101519260005b8451811015620095ac578062000faa6200959f620095a6938862004d46565b516202f24b565b62009580565b509250906200798560209162004cdf565b8051918083101562002a235760149283036200976057505050604080910190620095ec60c08351015162004cef565b51926200960360a06200779b818651015162004cef565b51956200961485518551146202df8a565b6200962385518851146202dff0565b60005b85518110156200970b576200963c818962004d46565b5162009649828762004d46565b516103e8918282101562004cfd5760066200966a9260031b0154906200608f565b9062009677848962004d46565b51918383101562004cfd576006620096949360031b01556202e0aa565b620096a0828a62004d46565b5190620096ae838862004d46565b518181101562004cfd576001600160a01b039392620096d79160039086620078ab878e62004d46565b620096e3848a62004d46565b519283101562004cfd57600362000faa936200970596620078f0878e62004d46565b62009626565b5093926200972191929650620079229062032f53565b9451926200972f8462002b3f565b60008452600036813760005b835181101562007971578062000faa620079626200975a938762004d46565b6200973b565b819694959396518181101562002a2357601590810362009cd7575050505060408401906200979360c08351015162004cef565b5193620097aa60a06200779b818651015162004cef565b5193620097bf865185511462000fa3620331b7565b620097d2865186511462000fa3620331b7565b60005b86518110156200982e57620097eb818662004d46565b51906103e882101562004cfd576003620098289260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b620097d5565b50909493919460005b85518110156200993f576200984d818662004d46565b51906103e88083101562004cfd57600360018060a01b0393848c5116600052811b016020526200988860406000205462007d56848962004d46565b9062009895848a62004d46565b51918383101562004cfd576003620098c493878f5116600052811b0160205260406000205562000fa3620332bb565b620098d0828862004d46565b518181101562004cfd5760039084620098ea858c62004d46565b5116600052811b016020526200990b60406000205462006814848962004d46565b62009917848a62004d46565b519283101562004cfd57600362000faa93620099399662007e0f878e62004d46565b62009837565b5091509162007e4762009956919695949662032f53565b9260405194620099668662002b78565b6001865260203681880137516001600160a01b0316620099868662004cef565b526000905b86518210156200820c57620099a1828862004d46565b516103a052620099b2855162004e62565b96600094620099c2885162004e62565b610580528594865b885181101562009a90578a89620099fa6001600160a01b03620099ee858462004d46565b51166103a05162032d3b565b158062009a4a575b62009a1b575b505062009a159062004cdf565b620099ca565b9862009a3f9162001ac782859c62007f3762009a159760018060a01b039262004d46565b9790508a8962009a08565b5050506103e86103a051101562004cfd576001600160a01b0362009a6f828b62004d46565b511660005260036103a051811b016020528a89604060002054151562009a02565b509098949897969291939760005b885181101562009b32576103e86103a051101562004cfd576001600160a01b0362009aca828b62004d46565b511660005260036103a051811b016020526040600020541562009af9575b62009af39062004cdf565b62009a9e565b9962009af39062009b29906001600160a01b0362009b188e8d62004d46565b511662001ac7826105805162004d46565b9a905062009ae8565b5098509694939291956103a0516103e8811015806105c05262004cfd5760031b600401549662009b6762008068878a62006200565b996000998a610200525b6105c05162004cfd57610200518a81101562009c0d5762009ba662009bc39160006105c05260046103a05160031b0162004f5e565b90546105805160039290921b1c6001600160a01b03169062032dea565b1562009be2575b62009bd86102005162004cdf565b6102005262009b71565b99808c62001ac762009c06936200810d6102005160046103a05160031b0162004f5e565b9962009bca565b509a939794969299919850946000915b83831062009cb257505050506105c05162004cfd578051906001600160401b03821162002a9b5760209062009c5c8360046103a05160031b016200509a565b0160046103a05160031b01600052602060002060005b83811062009c94575050505062009c899062004cdf565b90929591956200998b565b82516001600160a01b03168183015560209092019160010162009c72565b62009cd090620081fe906001600160a01b03620081f0868662004d46565b9162009c1d565b82979496959751918083101562002a2357601692830362009d4457505050505060c0604062009d0a920151015162004cef565b519260005b8451811015620095ac5762009d3e9062000faa6001600160a01b0362009d36838962004d46565b511662006675565b62009d0f565b83518181101562002a235760170362009d9d5760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b83518181101562002a235760180362009e1057505050505060c0604062009dc8920151015162004cef565b51611fb6805460ff191660011790559260005b8451811015620095ac5762009e0a9062000faa6001600160a01b0362009e02838962004d46565b51166200662a565b62009ddb565b83979697518181101562002a235760190362009f8457505050505060008080604080940160a08082510151805162009f4b575b5050519060e08201519162009e676200680d60c060018060a01b0393015162004cef565b511690602083519301915af1903d1562009f42573d9162009e888362002f5b565b9262009e978351948562002b94565b83523d6000602085013e5b1562009eb75750506200798560209162004cdf565b62004cdb925062009f23815192600080516020620338cc833981519152602085015278039bab1b1b2b9b9b33ab617102932ba3ab937103230ba309d1603d1b8385015283815162009f12816059946020868601910162002e01565b810103603981018552018362002b94565b5162461bcd60e51b815260206004820152918291602483019062002e26565b60609162009ea2565b62009f569062004cef565b515162009f65575b8062009e43565b8192506200680d9062009f7b9251015162004cef565b51903862009f5e565b83518181101562002a2357601a036200a084575050505062009faf60a0604080940151015162004cef565b519062009fc060038351146202d510565b62009fcb8262004cef565b519262009fe462009fdc8462004d13565b519362004d24565b51926200a04a5750509162007985916001602094146000146200a043576200a023906200a016611fb19182546200608f565b90915562000fa362033108565b62000faa611fb26200a03681546200607c565b90915562000fa362033142565b5062004cdf565b60649250519062461bcd60e51b825260206004830152602482015273496e76616c6964207061796d656e74207479706560601b6044820152fd5b909192809450518181101562002a2357601b036200a51957505050505091906200a0c4611faf546200225a6200a0b962033044565b612710831062004cac565b50506200a0d062033108565b506000805b6103e881106200a4a8575b50506200a0ec62006161565b6200a0fa613f745462004e62565b9060009485935b6103e88510156200a49b5760ff60078660031b015416156200a25a5760009560028660031b0154156200a24b57869796975b62004cfd5760048660031b01548810156200a232576200a15b886004600389901b0162004f5e565b600160a01b6001900391549060031b1c1696876000528660031b600301602052604097858960002054906200a1909162005eb0565b99906200a19c62033108565b6200a1a79162004cac565b6000998960031b600201546200a1bd9162005eb0565b91906200a1c962033108565b6200a1d49162004cac565b828b52611f476020528a20908154906200a1ee916200608f565b9091556200a1fb62033108565b6200a2069162004cac565b6200a212828862004d46565b526200a21e9062004cdf565b976200a22a9062004cdf565b97966200a133565b91946200a2429196975062004cdf565b9390946200a101565b91946200a24291965062004cdf565b949592915092505b6200a26d8262004e62565b91600091825b8281106200a40557505050611f48908154926200a29562008068858462006200565b9360009081905b8082106200a3ca57505060005b8381106200a3265750508351939150506001600160401b03831162002a9b576020906200a2d68462004fbc565b0190600052602060002060005b8381106200a3085750505050620079856020916000611fb1556000611fb25562004cdf565b82516001600160a01b0316818301556020909201916001016200a2e3565b6000805b8381106200a382575b50156200a34c575b6200a3469062004cdf565b6200a2a9565b906200a346906200a379906001600160a01b036200a36b858762004d46565b511662001ac7828a62004d46565b9190506200a33b565b6001600160a01b03806200a397858862004d46565b5116906200a3a6838b62004d46565b5116146200a3bf576200a3b99062004cdf565b6200a32a565b50506001386200a333565b9091620081fe6200a3fe916200a3e08562004e9a565b905460039190911b1c6001600160a01b031662001ac7828b62004d46565b906200a29c565b6000805b8581106200a453575b50156200a42b575b6200a4259062004cdf565b6200a273565b926200a425906200a44a906001600160a01b03620081f0878662004d46565b9390506200a41a565b6001600160a01b03806200a468858762004d46565b5116906200a477838a62004d46565b5116146200a490576200a48a9062004cdf565b6200a409565b50506001386200a412565b949592915092506200a262565b806003959394951b9060ff600783015416156200a50e576200a4f86200746162000faa946200a4ec6200a5049560026200a4e28762005e1c565b9101549062005eb0565b929062000fa362033108565b939062000fa362033108565b939291936200a0d5565b50939291936200a0e0565b83518181101562002a2357601c036200a5725760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b83518181101562002a2357601d036200a598575b50505050506200798560209162004cdf565b839795969497518181101562002a2357601e036200ae665750505050604084019060a0906200a5cb828451015162004cef565b51516200a5dc838551015162004d13565b5151036200ade9576200a5f3828451015162004cef565b51516200a604838551015162004d24565b5151036200ad6d576200a61b828451015162004cef565b51946200a62c838551015162004d13565b51916200a65d6200a641858751015162004d24565b51946200a652818851015162004cef565b519651015162004d13565b519585518751036200ad0a5760005b86518110156200a6c5576200a682818862004d46565b51906103e882101562004cfd5760036200a6bf9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b6200a66c565b5090969192939660005b86518110156200a76e576200a6e5818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526200a71d60406000205462007d56838b62004d46565b91906200a72b828a62004d46565b51906103e882101562004cfd576200a76893600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b6200a6cf565b5093979550936200a7829096929662032f53565b96604051966200a7928862002b78565b60018852602036818a013786516001600160a01b03166200a7b38962004cef565b52604051966200a7c38862002b3f565b600088526000610460525b895161046051908110156200ab8b576200a7e9908b62004d46565b51610520526200a7fa885162004e62565b996000976200a80a8b5162004e62565b610920528897895b8b518110156200a8d8578d8c6200a8426001600160a01b036200a836858462004d46565b51166105205162032d3b565b15806200a892575b6200a863575b50506200a85d9062004cdf565b6200a812565b9b6200a8879162001ac782859f62007f376200a85d9760018060a01b039262004d46565b9a90508d8c6200a850565b5050506103e861052051101562004cfd576001600160a01b036200a8b7828e62004d46565b5116600052600361052051811b016020528d8c60406000205415156200a84a565b50909b989a99949691929395979b60005b8b518110156200a97d576103e861052051101562004cfd576001600160a01b036200a915828e62004d46565b5116600052600361052051811b01602052604060002054156200a944575b6200a93e9062004cdf565b6200a8e9565b9c6200a9746200a93e918f6200a9638f9160018060a01b039262004d46565b511662001ac7826109205162004d46565b9d90506200a933565b509a9b509895969193969490929461052051996103e88b10159b8c62004cfd578d9b60031b600401549d6200a9b3908f62006200565b6200a9be9062004e62565b6103205260006108c0528c6000610640525b62004cfd57610640519c8e8e10156200aa8e57506200aa1c6200a9ff60009e60046105205160031b0162004f5e565b90546109205160039290921b1c6001600160a01b03169062032dea565b156200aa3c575b8c6200aa326106405162004cdf565b610640526200a9d0565b6200aa546106405160046105205160031b0162004f5e565b60018060a01b0391549060031b1c166200aa756108c0516103205162004d46565b526200aa846108c05162004cdf565b6108c0526200aa23565b939d509396999094979b50999094979960005b8281106200ab3f5750505062004cfd5761032051516001600160401b03811162002a9b576200aada8160046105205160031b016200509a565b602061032051019060046105205160031b0160005260206000209160005b8281106200ab2157505050506200ab126104605162004cdf565b6104605295989094986200a7ce565b81516001600160a01b0316818501556020909101906001016200aaf8565b6200ab85906001600160a01b036200ab58828562004d46565b51166200ab6c6108c0516103205162004d46565b526200ab7b6108c05162004cdf565b6108c05262004cdf565b6200aaa1565b5094929750929750939450600094855b87518110156200ac0b576200abce6200abc66200abb9838962004d46565b5162007451848d62004d46565b91906202f07a565b806200abe7575b506200abe19062004cdf565b6200ab9b565b906200abfc6200ac04986200abe1936200608f565b98906202f0c7565b906200abd5565b509650945092909150806200ac2f575b5050620079856020915b913880806200a586565b6200ac629060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b92906202f120565b60018060a01b03835116600052602052604060002055600080611f4654905b8181106200acc0575b5050916200798591602093156200aca4575b50916200ac1b565b516200acb9906001600160a01b0316620065d6565b386200ac9c565b6200accb8162004eb6565b9054855160039290921b1c6001600160a01b039081169116146200acfa576200acf49062004cdf565b6200ac81565b506001915082905060206200ac8a565b60405162461bcd60e51b815260206004820152603560248201527f546865206c656e677468206f6620746f6b656e436c61737320616e6420746f6b604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b60405162461bcd60e51b81526020600482015260596024820152600080516020620339ec83398151915260448201527f642070726963654172726179206973206e6f7420657175616c2061742042415460648201527810d217d095549397d513d2d15394d7d0539117d49151955391603a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152605a6024820152600080516020620339ec83398151915260448201527f6420616d6f756e744172726179206973206e6f7420657175616c2061742042416064820152791510d217d095549397d513d2d15394d7d0539117d4915195539160321b608482015260a490fd5b839794969597518181101562002a2357601f036200aeaa57505050506020916200aea46200ae9d6040620079859401515162004cef565b516202f281565b6200ac25565b83518181101562002a23576020036200aed0575b5050505050620079856020916200ac25565b83518181101562002a235760218091036200aeed575b506200aebe565b8451828110156200b01a576022036200af2d5750505050505062007985602091611fb660ff1981541690556200af2262005087565b91388080806200aee6565b8451828110156200b01a576023036200af54575b505050505050620079856020916200af22565b845194828610156200b01a5760248096036200af72575b506200af41565b8051838110156200b006576025146200af6b5751918210156200aff25750036200afb65750506020916200afaa62007985926202e1ae565b9138808080806200af6b565b60405162461bcd60e51b8152602060048201529182015275496e76616c6964206f7065726174696f6e207479706560501b604482015260649150fd5b8490634e487b7160e01b6000526004526000fd5b8683634e487b7160e01b6000526004526000fd5b50634e487b7160e01b60005260045260246000fd5b60405162461bcd60e51b815260206004820152601b60248201527a13dc195c985d1a5bdb881d1e5c19481a5cc81d5b9919599a5b9959602a1b6044820152606490fd5b50915050565b80516200b08e906001600160a01b031662006600565b62007667565b6200b09f8162004f0a565b9054855160039290921b1c6001600160a01b039081169116146200b0ce576200b0c89062004cdf565b62007655565b505050600138806200765e565b600281036200b0ff5760405162461bcd60e51b81528062004cdb600482016200758f565b6001146200b10a5750565b6200b118611f43546200530f565b805190600160401b821162002a9b57613efb5482613efb5580831062014bbf575b50602001613efb60005260206000206000915b83831062014b9e575050505060005b611f43548110156200b194578062000faa6200b17b6200b18e9362005c7a565b506200b1878362005c9a565b90620150c9565b6200b15b565b506200b1a3611f42546200530f565b805190600160401b821162002a9b57613efa5482613efa5580831062014b02575b50602001613efa60005260206000206000915b83831062014ae1575050505060005b611f42548110156200b218578062000faa6200b2066200b2129362005cba565b506200b1878362005cda565b6200b1e6565b5060005b6103e8811015806200b3c957600160ff611fbf8460031b0154161515146200b251575b506200b24b9062004cdf565b6200b21c565b916000835b62004cfd57611fbc8360031b01548110156200b2c0576200b2b7929350600092816200b28b8593611fbc8860031b0162004f5e565b9054600391821b1c6001600160a01b031660009081529087901b611fbb01602052604081205562004cdf565b9093926200b256565b5091604051906200b2d18262002b3f565b6000825262004cfd578051906001600160401b03821162002a9b576020906200b30283611fbc8660031b016200509a565b01611fbc8360031b01600052602060002060005b8381106200b3ab57505050611fbf600383901b908101805460ff191690556000611fb88201819055611fb98201819055611fba8201819055611fbd90910180546200b24b9493506200b3689062002c79565b601f908181116200b389575b5050556000611fbe8260031b0155906200b23f565b6200b3a39183855260208520910160051c81019062004fa3565b38806200b374565b82516001600160a01b0316818301556020909201916001016200b316565b505060005b6103e8811062014a53575060005b611f41548110156200b43757806200b3f86200b4319262004ed2565b60018060a01b0391549060031b1c16600052613ef860205260006002604082208281556200b4296001820162005399565b015562004cdf565b6200b3dc565b506200b446611f415462004e62565b8051906001600160401b03821162002a9b57600160401b821162002a9b57602090613ef95483613ef95580841062014a31575b5001613ef9600052602060002060005b83811062014a13575050505060005b611f41548110156200b50a576200b4af8162004ed2565b9054613ef95460039290921b1c6001600160a01b0316919081101562004cfd57613ef96000526000805160206203398c833981519152810180546001600160a01b0319169092179091556200b5049062004cdf565b6200b498565b509060005b611f41548110156200b5c957806200b52b6200b57e9262004ed2565b9060018060a01b03918291549060031b1c16600052611f40602052604080600020916200b5588462004ed2565b90549060031b1c16600052613ef8602052600020908082036200b584575b505062004cdf565b6200b50f565b600280916200b5aa60ff6200b59d8184541687620057f2565b825460081c168562005803565b6200b5bc600182016001860162014d65565b015491015538806200b576565b5060005b613f02548110156200b61b57806200b5e96200b6159262004eee565b60018060a01b0391549060031b1c16600052613f0160205262000faa6040600020606481019062004fa3565b6200b5cd565b506200b62a611f4a5462004e62565b8051906001600160401b03821162002a9b57600160401b821162002a9b57602090613f025483613f0255808410620149f1575b5001613f02600052602060002060005b838110620149d3575050505060005b611f4a548110156200b6bf578062000faa6200b69c6200b6b99362004f0a565b905460039190911b1c6001600160a01b031662001a088362004eee565b6200b67c565b5060005b611f4a548110156200b74a57806200b6df6200b7319262004f0a565b9060018060a01b03918291549060031b1c16600052611f49602052604080600020916200b70c8462004f0a565b90549060031b1c16600052613f01602052600020908082036200b73757505062004cdf565b6200b6c3565b6200b742916201514b565b38806200b576565b50611f4b80546000905b60648210620149ba575050611faf54613f675550611fb054613f6855611fb154613f6955611fb254613f6a55611fb3546001600160401b03811162002a9b57600160401b811162002a9b57613f6b5481613f6b558082106201498c575b50613f6b60009081527f0c040229f6fc4874d4176ee508a0872dc89a48e51cc9b61a792006f29e06275480546000805160206203376c83398151915291905b8484106201496a575050505050611fb454600160401b811162002a9b57613f6c5481613f6c5580821062014928575b50613f6c6000908152600080516020620337ac8339815191527fcdf85548d0b3537a0f46212d2994f9493fe1dfa88d3af4ddb0cac3c506fd3f595b8383106201490a575050611fb5549150506001600160401b03811162002a9b57600160401b811162002a9b57613f6d5481613f6d55808210620148dc575b50613f6d60009081527f70c3d981fef3a436e3d026045c487f2278cccbfa7f9e11fbd3c1406b0017bd5d80546000805160206203396c83398151915291905b848410620148ba57505050505060ff611fb65416151560ff8019613f6e5416911617613f6e5560005b613efe548110156200b94a57806200b91c6200b9449262004f26565b905460039190911b1c6001600160a01b03166000908152613efd602052604081205562004cdf565b6200b900565b506200b959611f465462004e62565b8051906001600160401b03821162002a9b576020906200b9798362005041565b01613efe600052602060002060005b8381106201489c575050505060005b611f46548110156200b9da578062000faa6200b9b76200b9d49362004eb6565b905460039190911b1c6001600160a01b031662001a088362004f26565b6200b997565b5060005b611f46548110156200ba4957806200b9fa6200ba439262004eb6565b9060018060a01b03918291549060031b1c16600052611f4560205260408060002054916200ba288462004eb6565b90549060031b1c16600052613efd6020526000205562004cdf565b6200b9de565b5060005b613f00548110156200ba9757806200ba696200ba919262004f42565b905460039190911b1c6001600160a01b03166000908152613eff602052604081205562004cdf565b6200ba4d565b506200baa6611f485462004e62565b8051906001600160401b03821162002a9b576020906200bac68362005064565b01613f00600052602060002060005b8381106201487e575050505060005b611f48548110156200bb27578062000faa6200bb046200bb219362004e9a565b905460039190911b1c6001600160a01b031662001a088362004f42565b6200bae4565b5060005b611f48548110156200bb9657806200bb476200bb909262004e9a565b9060018060a01b03918291549060031b1c16600052611f4760205260408060002054916200bb758462004e9a565b90549060031b1c16600052613eff6020526000205562004cdf565b6200bb2b565b50613f02546000805b82811062014839575b501562014803575b5060005b60208301519081518110156200bc0c5762000faa620076c16200bbe6620076a16020620067a7866200bc069862004d46565b86516001600160a01b03166000908152613f0160205260409020620242c3565b6200bbb4565b505060005b602083015180518210156200bc5957620076a16020620067a7846200bc369462004d46565b90606482101562004cfd576200bc53914290613f03015562004cdf565b6200bc11565b5050906000905b6020810151805183101562010f2357826200bc7b9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036200c24d57604001906200bcbc60c08351015162004cef565b51936200bcd360a06200779b818651015162004cef565b51916200bce486518551146202df8a565b6200bcf386518451146202dff0565b60005b86518110156200be51576200bd0c818662004d46565b516103e881101562004cfd57600160ff611fbf6200bd339360031b0154161515146202e052565b6200bd3f818562004d46565b516200bd4c828762004d46565b51906103e882101562004cfd57611fbe6200bd6d9260031b0154906200608f565b906200bd7a838862004d46565b51916103e883101562004cfd57611fbe6200bd9a9360031b01556202e0aa565b6200bda6818562004d46565b516200bdb3828762004d46565b51906103e882101562004cfd576200bdf691611fbb906001600160a01b036200bddd868d62004d46565b511660005260031b01602052604060002054906200608f565b91906200be04828862004d46565b51906103e882101562004cfd576200be4b9362000faa92611fbb906001600160a01b036200be33878f62004d46565b511660005260031b016020526040600020556202e109565b6200bcf6565b50926200be68919250620084799095949562032f53565b916040516200be778162002b3f565b6000815260003681376000945b80518610156200c233576200be9a868262004d46565b516102c0526200beab855162004e62565b966000946200bebb845162004e62565b6105a05260009460005b88518110156200bf8d578a896200bef56001600160a01b036200bee9858462004d46565b51166102c05162032d92565b15806200bf45575b6200bf16575b50506200bf109062004cdf565b6200bec5565b986200bf3a9162001ac782859c62007f376200bf109760018060a01b039262004d46565b9790508a896200bf03565b5050506103e86102c051101562004cfd576001600160a01b036200bf6a828b62004d46565b5116600052611fbb6102c05160031b016020528a8960406000205415156200befd565b50909895979498969291939660005b88518110156200c02b576103e86102c051101562004cfd576001600160a01b03806200bfc9838c62004d46565b5116600052611fbb6102c05160031b01602052604060002054156200bffb575b506200bff59062004cdf565b6200bf9c565b819b6200c023916200c0126200bff5948d62004d46565b511662001ac7826105a05162004d46565b9a906200bfe9565b509850969592919093966102c0516103e8811015806103e05262004cfd5760031b611fbc0154986200c06262008068898c62006200565b6108a0526000610a80526000610ac0525b6103e05162004cfd57610ac0518a8110156200c13c576200c0a96200c0c99160006103e052611fbc6102c05160031b0162004f5e565b90546105a0516001600160a01b03939260031b9190911c83169062032dea565b156200c0e9575b506200c0df610ac05162004cdf565b610ac0526200c073565b60006103e0526200c108610ac051611fbc6102c05160031b0162004f5e565b90549060031b1c166200c122610a80516108a05162004d46565b526200c131610a805162004cdf565b610a8052386200c0d0565b50979294959093985095909560005b8281106200c1e7575050506103e05162004cfd576108a051516001600160401b03811162002a9b576200c18981611fbc6102c05160031b016200509a565b60206108a05101611fbc6102c05160031b01600052602060002060005b8381106200c1c957505050506200c1bd9062004cdf565b9492959091956200be84565b82516001600160a01b0316818301556020909201916001016200c1a6565b6200c22d906001600160a01b036200c200828562004d46565b51166200c214610a80516108a05162004d46565b526200c223610a805162004cdf565b610a805262004cdf565b6200c14b565b5050939092506200c245915062004cdf565b90916200bc60565b906020829493940151602681101562002a23576002036200c404576040809201908151938451916200c2a46200c28860a08098015162004cef565b51966200c299818751015162004d13565b519551015162004d24565b5194835187510362007bd257835185510362007b7e57835186510362007b27575060005b86518110156200c3f1576200c2de818862004d46565b516103e881101562004cfd5760ff611fbf6200c3019260031b015416156202e162565b6200c30d818862004d46565b516103e881101562004cfd5760031b611fbf01805460ff191660011790556200c337818562004d46565b516200c344828962004d46565b51906103e882101562004cfd57611fbd6200c3639260031b016200571f565b6200c36f818662004d46565b516200c37c828962004d46565b516103e881101562004cfd5760031b611fb901556200c39c818762004d46565b516200c3a9828962004d46565b516103e881101562004cfd5760031b611fba01556200c3c9818862004d46565b51906103e882101562004cfd576000611fbe6200c3eb9360031b015562004cdf565b6200c2c8565b509592509350506200c245915062004cdf565b9092916020840151602681101562002a23576003036200ca2a5760408401906200c43360c08351015162004cef565b51906200c44a60a06200779b818651015162004cef565b51936200c45f835185511462000fa3620331b7565b6200c472835186511462000fa3620331b7565b60005b83518110156200c4d0576200c48b818662004d46565b51906103e882101562004cfd57611fbb6200c4ca9260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200c475565b509095919560005b87518110156200c61e576200c4ee818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b016020526200c52860406000205462007d56838962004d46565b906200c535838862004d46565b51916103e883101562004cfd57611fbb6200c56e9360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b6200c57a818662004d46565b516103e881101562004cfd57611fbb906001600160a01b036200c59e848c62004d46565b511660005260031b016020526200c5c060406000205462006814838962004d46565b91906200c5ce828862004d46565b51906103e882101562004cfd576200c61893611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b511660005260031b0160205260406000205562000fa362033320565b6200c4d8565b50926200c63d919294506200c6369096959662032f53565b9462032e37565b92604051906200c64d8262002b78565b6001825260203681840137516001600160a01b03166200c66d8262004cef565b526000945b80518610156200c233576200c688868262004d46565b51610220526200c699855162004e62565b966000946200c6a9845162004e62565b6104005260009460005b88518110156200c77b578a896200c6e36001600160a01b036200c6d7858462004d46565b51166102205162032d92565b15806200c733575b6200c704575b50506200c6fe9062004cdf565b6200c6b3565b986200c7289162001ac782859c62007f376200c6fe9760018060a01b039262004d46565b9790508a896200c6f1565b5050506103e861022051101562004cfd576001600160a01b036200c758828b62004d46565b5116600052611fbb6102205160031b016020528a8960406000205415156200c6eb565b50909895979498969291939660005b88518110156200c820576103e861022051101562004cfd576001600160a01b036200c7b6828b62004d46565b5116600052611fbb6102205160031b01602052604060002054156200c7e7575b6200c7e19062004cdf565b6200c78a565b996200c7e1906200c817906001600160a01b036200c8068e8d62004d46565b511662001ac7826104005162004d46565b9a90506200c7d6565b50985096959291909396610220516103e8811015806104a05262004cfd5760031b611fbc0154986200c85762008068898c62006200565b6103c0526000610a40526000610540525b6104a05162004cfd57610540518a8110156200c933576200c89e6200c8bb9160006104a052611fbc6102205160031b0162004f5e565b90546104005160039290921b1c6001600160a01b03169062032dea565b156200c8da575b6200c8d06105405162004cdf565b610540526200c868565b60006104a0526200c8f961054051611fbc6102205160031b0162004f5e565b60018060a01b0391549060031b1c166200c91a610a40516103c05162004d46565b526200c929610a405162004cdf565b610a40526200c8c2565b50979294959093985095909560005b8281106200c9de575050506104a05162004cfd576103c051516001600160401b03811162002a9b576200c98081611fbc6102205160031b016200509a565b60206103c05101611fbc6102205160031b01600052602060002060005b8381106200c9c057505050506200c9b49062004cdf565b9492959091956200c672565b82516001600160a01b0316818301556020909201916001016200c99d565b6200ca24906001600160a01b036200c9f7828562004d46565b51166200ca0b610a40516103c05162004d46565b526200ca1a610a405162004cdf565b610a405262004cdf565b6200c942565b90926020810151602681101562002a23576004036200d0575760400160c0936200ca686200ca5c868451015162004cef565b51958351015162004d13565b51906200ca7f60a06200779b818651015162004cef565b51936200ca94875184511462000fa3620331b7565b6200caa7875185511462000fa3620331b7565b6200caba875186511462000fa3620331b7565b60005b87518110156200cb25576200cad3818662004d46565b51906103e882101562004cfd576200cb1f91611fbb906001600160a01b036200cafd848d62004d46565b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200cabd565b509095919593929360005b83518110156200cc88576200cb46818762004d46565b516103e881101562004cfd57611fbb906001600160a01b036200cb6a848862004d46565b511660005260031b016020526200cb8c60406000205462007d56838862004d46565b906200cb99838962004d46565b51916103e883101562004cfd576200cbdf92611fbb906001600160a01b036200cbc3878b62004d46565b511660005260031b0160205260406000205562000fa3620332bb565b6200cbeb818762004d46565b516103e881101562004cfd57611fbb906001600160a01b036200cc0f848c62004d46565b511660005260031b016020526200cc3160406000205462006814838862004d46565b9190506200cc40818862004d46565b51916103e883101562004cfd576200cc8292611fbb906001600160a01b036200cc6a858e62004d46565b511660005260031b0160205260406000205562004cdf565b6200cb30565b5091936200cca491935062007e47620084799197969762032f53565b6000945b80518610156200c233576200ccbe868262004d46565b51610280526200cccf855162004e62565b966000946200ccdf845162004e62565b6107005260009460005b88518110156200cdb1578a896200cd196001600160a01b036200cd0d858462004d46565b51166102805162032d92565b15806200cd69575b6200cd3a575b50506200cd349062004cdf565b6200cce9565b986200cd5e9162001ac782859c62007f376200cd349760018060a01b039262004d46565b9790508a896200cd27565b5050506103e861028051101562004cfd576001600160a01b036200cd8e828b62004d46565b5116600052611fbb6102805160031b016020528a8960406000205415156200cd21565b50909895979498969291939660005b88518110156200ce4f576103e861028051101562004cfd576001600160a01b03806200cded838c62004d46565b5116600052611fbb6102805160031b01602052604060002054156200ce1f575b506200ce199062004cdf565b6200cdc0565b819b6200ce47916200ce366200ce19948d62004d46565b511662001ac7826107005162004d46565b9a906200ce0d565b50985096959291909396610280516103e881101580610a005262004cfd5760031b611fbc0154986200ce8662008068898c62006200565b610260526000610780526000610620525b610a005162004cfd57610620518a8110156200cf60576200cecd6200ceed916000610a0052611fbc6102805160031b0162004f5e565b9054610700516001600160a01b03939260031b9190911c83169062032dea565b156200cf0d575b506200cf036106205162004cdf565b610620526200ce97565b6000610a00526200cf2c61062051611fbc6102805160031b0162004f5e565b90549060031b1c166200cf46610780516102605162004d46565b526200cf556107805162004cdf565b61078052386200cef4565b50979294959093985095909560005b8281106200d00b57505050610a005162004cfd5761026051516001600160401b03811162002a9b576200cfad81611fbc6102805160031b016200509a565b60206102605101611fbc6102805160031b01600052602060002060005b8381106200cfed57505050506200cfe19062004cdf565b9492959091956200cca8565b82516001600160a01b0316818301556020909201916001016200cfca565b6200d051906001600160a01b036200d024828562004d46565b51166200d038610780516102605162004d46565b526200d0476107805162004cdf565b6107805262004cdf565b6200cf6f565b92906020840151602681101562002a23576005036200d5b15760408401906200d08a60a06200851e818551015162004cef565b519282518451036200ad0a5760005b83518110156200d0f4576200d0af818562004d46565b51906103e882101562004cfd57611fbb6200d0ee9260018060a01b038a511660005260031b0160205262000faa60406000205462007ce9838962004d46565b6200d099565b509060005b83518110156200d19b576200d10f818562004d46565b516103e881101562004cfd57611fbb9060018060a01b0389511660005260031b016020526200d14960406000205462007d56838862004d46565b91906200d157828762004d46565b51906103e882101562004cfd576200d19593611fbb62000faa9360018060a01b038d511660005260031b0160205260406000205562000fa3620332bb565b6200d0f9565b50916200d1ac919495935062032f53565b92604051926200d1bc8462002b78565b6001845260203681860137516001600160a01b03166200d1dc8462004cef565b52604051926200d1ec8462002b3f565b6000845260003681376000945b80518610156200c233576200d20f868262004d46565b516107c0526200d220855162004e62565b966000946200d230845162004e62565b6102405260009460005b88518110156200d302578a896200d26a6001600160a01b036200d25e858462004d46565b51166107c05162032d92565b15806200d2ba575b6200d28b575b50506200d2859062004cdf565b6200d23a565b986200d2af9162001ac782859c62007f376200d2859760018060a01b039262004d46565b9790508a896200d278565b5050506103e86107c051101562004cfd576001600160a01b036200d2df828b62004d46565b5116600052611fbb6107c05160031b016020528a8960406000205415156200d272565b50909895979498969291939660005b88518110156200d3a7576103e86107c051101562004cfd576001600160a01b036200d33d828b62004d46565b5116600052611fbb6107c05160031b01602052604060002054156200d36e575b6200d3689062004cdf565b6200d311565b996200d368906200d39e906001600160a01b036200d38d8e8d62004d46565b511662001ac7826102405162004d46565b9a90506200d35d565b509850969592919093966107c0516103e8811015806109e05262004cfd5760031b611fbc0154986200d3de62008068898c62006200565b610560526000610420526000610480525b6109e05162004cfd57610480518a8110156200d4ba576200d4256200d4429160006109e052611fbc6107c05160031b0162004f5e565b90546102405160039290921b1c6001600160a01b03169062032dea565b156200d461575b6200d4576104805162004cdf565b610480526200d3ef565b60006109e0526200d48061048051611fbc6107c05160031b0162004f5e565b60018060a01b0391549060031b1c166200d4a1610420516105605162004d46565b526200d4b06104205162004cdf565b610420526200d449565b50979294959093985095909560005b8281106200d565575050506109e05162004cfd5761056051516001600160401b03811162002a9b576200d50781611fbc6107c05160031b016200509a565b60206105605101611fbc6107c05160031b01600052602060002060005b8381106200d54757505050506200d53b9062004cdf565b9492959091956200d1f9565b82516001600160a01b0316818301556020909201916001016200d524565b6200d5ab906001600160a01b036200d57e828562004d46565b51166200d592610420516105605162004d46565b526200d5a16104205162004cdf565b6104205262004cdf565b6200d4c9565b926020810151602681101562002a23576006036200db9a576040016200d5dc60c08251015162004cef565b51936200d5f360a06200851e818551015162004cef565b519285518351036200db485785518451036200dafb5760005b86518110156200d674576200d622818562004d46565b51906103e882101562004cfd576200d66e91611fbb906001600160a01b036200d64c848c62004d46565b511660005260031b0160205262000faa60406000205462007ce9838962004d46565b6200d60c565b509060005b86518110156200d718576200d68f818562004d46565b516103e881101562004cfd57611fbb906001600160a01b036200d6b3848b62004d46565b511660005260031b016020526200d6d560406000205462007d56838862004d46565b91906200d6e3828762004d46565b51906103e882101562004cfd576200d7129362000faa92611fbb906001600160a01b036200cbc3878f62004d46565b6200d679565b50916200d72f919350620084799095949562032f53565b91604051926200d73f8462002b3f565b6000845260003681376000945b80518610156200c233576200d762868262004d46565b51610aa0526200d773855162004e62565b966000946200d783845162004e62565b6109c05260009460005b88518110156200d855578a896200d7bd6001600160a01b036200d7b1858462004d46565b5116610aa05162032d92565b15806200d80d575b6200d7de575b50506200d7d89062004cdf565b6200d78d565b986200d8029162001ac782859c62007f376200d7d89760018060a01b039262004d46565b9790508a896200d7cb565b5050506103e8610aa051101562004cfd576001600160a01b036200d832828b62004d46565b5116600052611fbb610aa05160031b016020528a8960406000205415156200d7c5565b50909895979498969291939660005b88518110156200d8f3576103e8610aa051101562004cfd576001600160a01b03806200d891838c62004d46565b5116600052611fbb610aa05160031b01602052604060002054156200d8c3575b506200d8bd9062004cdf565b6200d864565b819b6200d8eb916200d8da6200d8bd948d62004d46565b511662001ac7826109c05162004d46565b9a906200d8b1565b50985096959291909396610aa0516103e8811015806102e05262004cfd5760031b611fbc0154986200d92a62008068898c62006200565b6109a05260006102a05260006107e0525b6102e05162004cfd576107e0518a8110156200da04576200d9716200d9919160006102e052611fbc610aa05160031b0162004f5e565b90546109c0516001600160a01b03939260031b9190911c83169062032dea565b156200d9b1575b506200d9a76107e05162004cdf565b6107e0526200d93b565b60006102e0526200d9d06107e051611fbc610aa05160031b0162004f5e565b90549060031b1c166200d9ea6102a0516109a05162004d46565b526200d9f96102a05162004cdf565b6102a052386200d998565b50979294959093985095909560005b8281106200daaf575050506102e05162004cfd576109a051516001600160401b03811162002a9b576200da5181611fbc610aa05160031b016200509a565b60206109a05101611fbc610aa05160031b01600052602060002060005b8381106200da9157505050506200da859062004cdf565b9492959091956200d74c565b82516001600160a01b0316818301556020909201916001016200da6e565b6200daf5906001600160a01b036200dac8828562004d46565b51166200dadc6102a0516109a05162004d46565b526200daeb6102a05162004cdf565b6102a05262004cdf565b6200da13565b60405162461bcd60e51b8152602060048201526030602482015260008051602062033aec83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201526000805160206203372c8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b602081949293940151602681101562002a23576007036200dd3557604001916200dbc960c08451015162004cef565b51916200dbdb60a08551015162004cef565b51935151916200dbf3845186511462000fa3620331b7565b60005b84518110156200dd23576001600160a01b03806200dc15838862004d46565b5116600052613ef8806020526200dc3960ff604060002054161562000fa362033288565b60026200dc47848862004d46565b516200dcb16200dc58868c62004d46565b5191620088728b604051966200dc6e8862002a7f565b60018852886200dc958b60208b01946000865260408c0197885260608c01998a5262004d46565b51166000526020526200886860406000209751151588620057f2565b519101556200dcc1828762004d46565b51613ef954929116600160401b83101562002a9b576001830180613ef95583101562004cfd57613ef96000526000805160206203398c83398151915290920180546001600160a01b0319169092179091556200dd1d9062004cdf565b6200dbf6565b5094915092506200c245915062004cdf565b6020810151602681101562002a23576008036200de235760c060406200dd5f920151015162004cef565b519160005b83518110156200de14576200de0e906001600160a01b03806200dd88838862004d46565b5116600052613ef890816020526200ddb1600160ff6040600020541615151462000fa3620331e7565b806200ddbe848962004d46565b5116600052816020526200dde260ff60406000205460081c161562000fa36203324f565b6200ddee838862004d46565b5116600052602052604060002061010061ff001982541617905562004cdf565b6200dd64565b50926200c24591925062004cdf565b6020810151602681101562002a23576009036200df025760c060406200de4d920151015162004cef565b519160005b83518110156200de14576200defc906001600160a01b03806200de76838862004d46565b5116600052613ef890816020526200de9f600160ff6040600020541615151462000fa3620331e7565b806200deac848962004d46565b5116600052816020526200ded4600160ff60406000205460081c1615151462000fa36203321a565b6200dee0838862004d46565b5116600052602052604060002061ff0019815416905562004cdf565b6200de52565b6020810151602681101562002a2357600a036200dfea57604001906200df3e60a06200df3360c08551015162004cef565b519351015162004cef565b51926200df53835185511462000fa3620331b7565b60005b83518110156200dfd9576200dfd3906001600160a01b03806200df7a838862004d46565b5116600052613ef8806020526200dfa2600160ff6040600020541615151462000fa3620331e7565b6200dfae838962004d46565b51916200dfbc848962004d46565b511660005260205260026040600020015562004cdf565b6200df56565b50939092506200c245915062004cdf565b602081949392940151602681101562002a2357600b036200e0ca57604001926200e01960c08551015162004cef565b51935151916200e031855184511462000fa3620331b7565b60005b85518110156200e0ba576200e0b49062000faa6001600160a01b03806200e05c848b62004d46565b5116600052613ef8806020526200e084600160ff6040600020541615151462000fa3620331e7565b6200e090848962004d46565b51916200e09e858c62004d46565b511660005260205260016040600020016200571f565b6200e034565b509350916200c245915062004cdf565b9091926020820151602681101562002a2357600c036200e1b557606060408301510151926200e0f9846202d698565b60005b84518110156200dfd95760c06200e11c8260606040880151015162004d46565b510151156200e170576200e1446200e13d8260606040880151015162004d46565b5162005d8c565b613efa54908160001981011162001e0757600562008ca96200e16a936000190162005cda565b6200e0fc565b6200e18f6200e1888260606040880151015162004d46565b5162005d69565b613efb54908160001981011162001e0757600562008ca96200e16a936000190162005c9a565b9291906020810151602681101562002a2357600d036200e2bf576040019260206200e1e560a08651015162004cef565b5194510151916200e1fa85518451146202dd8c565b60005b85518110156200e0ba57806200e2186200e26c928662004d46565b51156200e272576200e23b6200e22f828962004d46565b51613efa54116202de15565b6200e25a60ff600562008db66200e253858c62004d46565b5162005cda565b600562008dd26200e253838a62004d46565b6200e1fd565b6200e28e6200e282828962004d46565b51613efb54116202de15565b6200e2ad60ff600562008db66200e2a6858c62004d46565b5162005c9a565b600562008dd26200e2a6838a62004d46565b6020810151602681101562002a2357600e036200e3b8576040019260206200e2ec60a08651015162004cef565b5194510151916200e30185518451146202dd8c565b60005b85518110156200e0ba57806200e31f6200e36c928662004d46565b51156200e372576200e3426200e336828962004d46565b51613efa54116202dece565b6200e35a60ff600562008ed96200e253858c62004d46565b600562008ca96200e253838a62004d46565b6200e304565b6200e38e6200e382828962004d46565b51613efb54116202dece565b6200e3a660ff600562008ed96200e2a6858c62004d46565b600562008ca96200e2a6838a62004d46565b9091926020820151602681101562002a2357600f036200e49557606060408301510151926200e3e7846202d698565b60005b84518110156200dfd95760c06200e40a8260606040880151015162004d46565b510151156200e457576200e42b6200e13d8260606040880151015162004d46565b613efa54908160001981011162001e0757600562008dd26200e451936000190162005cda565b6200e3ea565b6200e46f6200e1888260606040880151015162004d46565b613efb54908160001981011162001e0757600562008dd26200e451936000190162005c9a565b9291906020810151602681101562002a23576010036200e5da5760400151926200e4c860a0608086015195015162004cef565b51916200e4dd855184511462000fa3620331b7565b60005b85518110156200e0ba57806200e4fb6200e570928862004d46565b516200e5078162002fc4565b6200e513828762004d46565b51906200e5208162002fc4565b6200e5376200e52e620332ea565b82151562004cac565b6200e5428162002fc4565b600181036200e57657506200e5666200e55a620332ea565b61271083111562004cac565b613f675562004cdf565b6200e4e0565b6200e5818162002fc4565b600281036200e5955750613f685562004cdf565b6200e5a08162002fc4565b600381036200e5b45750613f695562004cdf565b806200e5c260049262002fc4565b146200e5cf575062004cdf565b613f6a55386200a043565b6020810151602681101562002a23576011036200e87d57604001906200e60b60a06200df3360c08551015162004cef565b51936200e61c83518651146202d510565b60005b83518110156200e69c576200e696906200e6766001600160a01b03806200e647848962004d46565b5116600052613efd90816020526200e66a60406000205462006814868d62004d46565b939062000fa36203316d565b6200e682848962004d46565b511660005260205260406000205562004cdf565b6200e61f565b509350906200e6ab9062032e37565b90613efe54936200e6c26200806884518762006200565b9060009260005b8781106200e83d575060005b85518110156200e78a576000805b8981106200e73b575b50156200e705575b6200e6ff9062004cdf565b6200e6d5565b936200e6ff906200e732906001600160a01b036200e724888a62004d46565b511662001ac7828862004d46565b9490506200e6f4565b6200e7468162004f26565b90546001600160a01b0360039290921b1c8116906200e766858b62004d46565b5116146200e77f576200e7799062004cdf565b6200e6e3565b50506001386200e6ec565b5095509392506200e79b8262004e62565b8051906001600160401b03821162002a9b576020906200e7bb8362005041565b01613efe600052602060002060005b8381106200e81f575050505060005b8281106200e7ef575050506200c2459062004cdf565b6200e8199062000faa6001600160a01b036200e80c838662004d46565b511662001a088362004f26565b6200e7d9565b82516001600160a01b0316818301556020909201916001016200e7ca565b936200e8706200e877916200e8528762004f26565b905460039190911b1c6001600160a01b031662001ac7828862004d46565b9462004cdf565b6200e6c9565b6020819492940151602681101562002a23576012036200eac157604001906200e8b160a06200df3360c08551015162004cef565b51936200e8c283518651146202d510565b60005b83518110156200e916576200e910906200e6766001600160a01b03806200e8ed848962004d46565b5116600052613efd90816020526200e66a60406000205462007d56868d62004d46565b6200e8c5565b50935091906200e9269062032e37565b613efe546200e9358162004e62565b906000926000915b8083106200e9e8575050506200e9538262004e62565b8051906001600160401b03821162002a9b576020906200e9738362005041565b01613efe600052602060002060005b8381106200e9ca575050505060005b8281106200e9a7575050506200c2459062004cdf565b6200e9c49062000faa6001600160a01b036200e80c838662004d46565b6200e991565b82516001600160a01b0316818301556020909201916001016200e982565b91956000959193959760005b85518110156200eab2576200ea098962004f26565b90546001600160a01b0360039290921b1c8116906200ea29838962004d46565b5116146200ea42576200ea3c9062004cdf565b6200e9f4565b509750956001959391955b806200ea81575b156200ea6c576200ea659062004cdf565b916200e93d565b936200e8706200ea65916200e8528762004f26565b506200ea8d8162004f26565b60018060a01b0391549060031b1c16600052613efd602052604060002054156200ea54565b5097969096959391956200ea4d565b6020819493940151602681101562002a23576013036200eb625760408091015101519160005b83518110156200de14576200eafd818562004d46565b5190613efc54600160401b81101562002a9b576001810180613efc5581101562004cfd57613efc6000526200eb5c9262000faa916007027f6710e0bb821cd3dfcfba05f5136082a6d0bca8d604d6d14bfd93de2dd49659d2016202f19f565b6200eae7565b602081949392940151602681101562002a23576014036200f0a457604001906200eb9160c08351015162004cef565b51936200eba860a06200779b818651015162004cef565b51916200ebb986518551146202df8a565b6200ebc886518451146202dff0565b60005b86518110156200ecc2576200ebe1818562004d46565b516200ebee828762004d46565b51906103e882101562004cfd57611fbe6200ec0f9260031b0154906200608f565b906200ec1c838862004d46565b51916103e883101562004cfd57611fbe6200ec3c9360031b01556202e0aa565b6200ec48818562004d46565b516200ec55828762004d46565b51906103e882101562004cfd576200ec7f91611fbb906001600160a01b036200bddd868d62004d46565b91906200ec8d828862004d46565b51906103e882101562004cfd576200ecbc9362000faa92611fbb906001600160a01b036200be33878f62004d46565b6200ebcb565b50926200ecd9919250620084799095949562032f53565b916040516200ece88162002b3f565b6000815260003681376000945b80518610156200c233576200ed0b868262004d46565b516106e0526200ed1c855162004e62565b966000946200ed2c845162004e62565b6103005260009460005b88518110156200edfe578a896200ed666001600160a01b036200ed5a858462004d46565b51166106e05162032d92565b15806200edb6575b6200ed87575b50506200ed819062004cdf565b6200ed36565b986200edab9162001ac782859c62007f376200ed819760018060a01b039262004d46565b9790508a896200ed74565b5050506103e86106e051101562004cfd576001600160a01b036200eddb828b62004d46565b5116600052611fbb6106e05160031b016020528a8960406000205415156200ed6e565b50909895979498969291939660005b88518110156200ee9c576103e86106e051101562004cfd576001600160a01b03806200ee3a838c62004d46565b5116600052611fbb6106e05160031b01602052604060002054156200ee6c575b506200ee669062004cdf565b6200ee0d565b819b6200ee94916200ee836200ee66948d62004d46565b511662001ac7826103005162004d46565b9a906200ee5a565b509850969592919093966106e0516103e8811015806103405262004cfd5760031b611fbc0154986200eed362008068898c62006200565b610440526000610900526000610980525b6103405162004cfd57610980518a8110156200efad576200ef1a6200ef3a91600061034052611fbc6106e05160031b0162004f5e565b9054610300516001600160a01b03939260031b9190911c83169062032dea565b156200ef5a575b506200ef506109805162004cdf565b610980526200eee4565b6000610340526200ef7961098051611fbc6106e05160031b0162004f5e565b90549060031b1c166200ef93610900516104405162004d46565b526200efa26109005162004cdf565b61090052386200ef41565b50979294959093985095909560005b8281106200f058575050506103405162004cfd5761044051516001600160401b03811162002a9b576200effa81611fbc6106e05160031b016200509a565b60206104405101611fbc6106e05160031b01600052602060002060005b8381106200f03a57505050506200f02e9062004cdf565b9492959091956200ecf5565b82516001600160a01b0316818301556020909201916001016200f017565b6200f09e906001600160a01b036200f071828562004d46565b51166200f085610900516104405162004d46565b526200f0946109005162004cdf565b6109005262004cdf565b6200efbc565b926020840151602681101562002a23576015036200f6a55760408401906200f0d160c08351015162004cef565b51906200f0e860a06200779b818651015162004cef565b51936200f0fd835185511462000fa3620331b7565b6200f110835186511462000fa3620331b7565b60005b83518110156200f16e576200f129818662004d46565b51906103e882101562004cfd57611fbb6200f1689260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200f113565b509095919560005b87518110156200f2a0576200f18c818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b016020526200f1c660406000205462007d56838962004d46565b906200f1d3838862004d46565b51916103e883101562004cfd57611fbb6200f20c9360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b6200f218818662004d46565b516103e881101562004cfd57611fbb906001600160a01b036200f23c848c62004d46565b511660005260031b016020526200f25e60406000205462006814838962004d46565b91906200f26c828862004d46565b51906103e882101562004cfd576200f29a93611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b6200f176565b50926200f2b8919294506200c6369096959662032f53565b92604051906200f2c88262002b78565b6001825260203681840137516001600160a01b03166200f2e88262004cef565b526000945b80518610156200c233576200f303868262004d46565b51610a60526200f314855162004e62565b966000946200f324845162004e62565b6108405260009460005b88518110156200f3f6578a896200f35e6001600160a01b036200f352858462004d46565b5116610a605162032d92565b15806200f3ae575b6200f37f575b50506200f3799062004cdf565b6200f32e565b986200f3a39162001ac782859c62007f376200f3799760018060a01b039262004d46565b9790508a896200f36c565b5050506103e8610a6051101562004cfd576001600160a01b036200f3d3828b62004d46565b5116600052611fbb610a605160031b016020528a8960406000205415156200f366565b50909895979498969291939660005b88518110156200f49b576103e8610a6051101562004cfd576001600160a01b036200f431828b62004d46565b5116600052611fbb610a605160031b01602052604060002054156200f462575b6200f45c9062004cdf565b6200f405565b996200f45c906200f492906001600160a01b036200f4818e8d62004d46565b511662001ac7826108405162004d46565b9a90506200f451565b50985096959291909396610a60516103e8811015806106805262004cfd5760031b611fbc0154986200f4d262008068898c62006200565b6108605260006106c0526000610880525b6106805162004cfd57610880518a8110156200f5ae576200f5196200f53691600061068052611fbc610a605160031b0162004f5e565b90546108405160039290921b1c6001600160a01b03169062032dea565b156200f555575b6200f54b6108805162004cdf565b610880526200f4e3565b6000610680526200f57461088051611fbc610a605160031b0162004f5e565b60018060a01b0391549060031b1c166200f5956106c0516108605162004d46565b526200f5a46106c05162004cdf565b6106c0526200f53d565b50979294959093985095909560005b8281106200f659575050506106805162004cfd5761086051516001600160401b03811162002a9b576200f5fb81611fbc610a605160031b016200509a565b60206108605101611fbc610a605160031b01600052602060002060005b8381106200f63b57505050506200f62f9062004cdf565b9492959091956200f2ed565b82516001600160a01b0316818301556020909201916001016200f618565b6200f69f906001600160a01b036200f672828562004d46565b51166200f6866106c0516108605162004d46565b526200f6956106c05162004cdf565b6106c05262004cdf565b6200f5bd565b9091926020810151602681101562002a23576016036200f7575760c060406200f6d2920151015162004cef565b519160005b83518110156200de14576001600160a01b036200f6f5828662004d46565b51613f6b54929116600160401b83101562002a9b576001830180613f6b5583101562004cfd57613f6b6000526000805160206203376c83398151915290920180546001600160a01b0319169092179091556200f7519062004cdf565b6200f6d7565b6020810151602681101562002a23576017036200f7b45760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a23576018036200f8725760c060406200f7de920151015162004cef565b5191600160ff19613f6e541617613f6e5560005b83518110156200de14576001600160a01b036200f810828662004d46565b51613f6d54929116600160401b83101562002a9b576001830180613f6d5583101562004cfd57613f6d6000526000805160206203396c83398151915290920180546001600160a01b0319169092179091556200f86c9062004cdf565b6200f7f2565b602081949293940151602681101562002a23576019036200f89a575b506200c2459062004cdf565b6020810151602681101562002a2357601a036200fa115760a060406200f8c4920151015162004cef565b51906200f8d560038351146202d510565b6200f8e08262004cef565b516200f8f062009fdc8462004d13565b51926200f9d5576200c245926001036200f9ce576200f9176200f97591613f69546200608f565b613f6955604051906200f92a8262002b06565b603282527f6469766964656e6461626c652062616c616e6365206f766572666c6f772077686020830152710cadc40e0e4dec6cae6e6d2dcce40c6c2e6d60731b604083015262004cac565b6200f9c76200f987613f6a546200607c565b613f6a55604051906200f99a8262002b78565b601a8252796469766964656e647320636f756e746572206f766572666c6f7760301b602083015262004cac565b906200f88e565b506200f9c7565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b6020810151602681101562002a2357601b036200ffa157509190613f67546200fa3d6200a0b962033044565b613f6a54613f685411156200fa5c6200fa55620330b2565b8262004cac565b613f6954906200fa6d838362005eb0565b50506200fa7962033108565b506000805b6103e882106200ff52575b5050906200fab96200fabf93926200faaf6200faa462033044565b612710861062004cac565b62000fa3620330b2565b62005eb0565b90506200facb62033108565b5060009060005b6103e881106200fe7f575b50906127106200faee9204620061de565b90506200fafe613f745462004e62565b906000946000905b6103e88210156200fe72578160031b9460ff611fbf87015416156200fc5c57600096611fba870154156200fc4b57600098975b62004cfd57611fbc8701548910156200fc31576200fb5c89611fbc890162004f5e565b600160a01b6001900391549060031b1c169788600052611fbb8801602052604098868a60002054906200fb8f9162005eb0565b9a906200fb9b62033108565b6200fba69162004cac565b60009a611fba8b01546200fbba9162005eb0565b91906200fbc662033108565b6200fbd19162004cac565b82600052613eff602052600020908154906200fbed916200608f565b9091556200fbfa62033108565b6200fc059162004cac565b6200fc11828962004d46565b526200fc1d9062004cdf565b986200fc299062004cdf565b98976200fb39565b929095506200fc439196975062004cdf565b90946200fb06565b929095506200fc4391965062004cdf565b95969392509350505b6200fc708262004e62565b9160009160005b8281106200fddc57505050613f0054916200fc9762008068848462006200565b926000906000905b8082106200fdbf57505060005b8381106200fd295750508251929150506001600160401b03821162002a9b576020906200fcd98362005064565b01613f00600052602060002060005b8381106200fd0b57505050506200c245906000613f69556000613f6a556200f9c7565b82516001600160a01b0316818301556020909201916001016200fce8565b6000805b8381106200fd77575b50156200fd4f575b6200fd499062004cdf565b6200fcac565b906200fd49906200fd6e906001600160a01b03620081f0858762004d46565b9190506200fd3e565b6001600160a01b03806200fd8c858862004d46565b5116906200fd9b838a62004d46565b5116146200fdb4576200fdae9062004cdf565b6200fd2d565b50506001386200fd36565b9091620081fe6200fdd591620094f58562004f42565b906200fc9f565b6000805b8581106200fe2a575b50156200fe02575b6200fdfc9062004cdf565b6200fc77565b926200fdfc906200fe21906001600160a01b03620081f0878662004d46565b9390506200fdf1565b6001600160a01b03806200fe3f858762004d46565b5116906200fe4e838a62004d46565b5116146200fe67576200fe619062004cdf565b6200fde0565b50506001386200fde9565b939495929150506200fc65565b90918160039695961b60ff611fbf82015416156200ff4657611fba810154611fbc8201546000928391825b8184106200fee65750505050620074616200fedd936200fed562000faa979694620022e49462005eb0565b929062005daf565b9493946200fad2565b94929462004cfd576200ff3f856200ff376200ff0b62000faa98611fbc870162004f5e565b905460039190911b1c6001600160a01b03166000908152611fbb8601602052604081205490966200608f565b979062005ed2565b926200feaa565b5091909493946200fadd565b8160039897981b60ff611fbf82015416156200ff9757916200a4f8620074616200ff8d936200a4ec62000faa96611fba6200a4e28762005e52565b909695966200fa7e565b509695966200fa89565b6020810151602681101562002a2357601c036200fffe5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d0362010022575b506200c245906200f9c7565b9290916020840151602681101562002a2357601e036201075857604084019060a09062010053828451015162004cef565b515162010064838551015162004d13565b5151036200ade9576201007b828451015162004cef565b51516201008c838551015162004d24565b5151036200ad6d57620100a3828451015162004cef565b5194620100b4838551015162004d13565b5191620100c96200a641858751015162004d24565b519585518751036200ad0a5760005b86518110156201013357620100ee818862004d46565b51906103e882101562004cfd57611fbb6201012d9260018060a01b038d511660005260031b0160205262000faa60406000205462007ce9838c62004d46565b620100d8565b5090969192939660005b8651811015620101e05762010153818862004d46565b516103e881101562004cfd57611fbb9060018060a01b038c511660005260031b016020526201018d60406000205462007d56838b62004d46565b91906201019b828a62004d46565b51906103e882101562004cfd57620101da93611fbb62000faa938f60018060a01b0390511660005260031b0160205260406000205562000fa3620332bb565b6201013d565b5093969297955093620101f39062032f53565b9660405196620102038862002b78565b60018852602036818a013786516001600160a01b0316620102248962004cef565b5260405196620102348862002b3f565b600088526000610600525b89516106005190811015620105fa576201025a908b62004d46565b51610960526201026b885162004e62565b996000976201027b8b5162004e62565b6103605260009760005b8b518110156201034d578d8c620102b56001600160a01b03620102a9858462004d46565b51166109605162032d92565b158062010305575b620102d6575b5050620102d09062004cdf565b62010285565b9b620102fa9162001ac782859f62007f37620102d09760018060a01b039262004d46565b9a90508d8c620102c3565b5050506103e861096051101562004cfd576001600160a01b036201032a828e62004d46565b5116600052611fbb6109605160031b016020528d8c6040600020541515620102bd565b50909b989a99949691929395979b60005b8b51811015620103f4576103e861096051101562004cfd576001600160a01b036201038a828e62004d46565b5116600052611fbb6109605160031b0160205260406000205415620103bb575b620103b59062004cdf565b6201035e565b9c620103eb620103b5918f620103da8f9160018060a01b039262004d46565b511662001ac7826103605162004d46565b9d9050620103aa565b509b5098959092949691939661096051996103e88b10159c8d62004cfd576201042c62008068611fbc8f9e60031b01549e8f62006200565b6108005260006107a0528d60009e5b62004cfd578d8f1015620104fc575060009d620104846201046782611fbc6109605160031b0162004f5e565b90546103605160039290921b1c6001600160a01b03169062032dea565b156201049e575b620104978f9162004cdf565b9e6201043b565b620104979e5060009e8f91620104bf81611fbc6109605160031b0162004f5e565b60018060a01b0391549060031b1c16620104e06107a0516108005162004d46565b52620104ef6107a05162004cdf565b6107a0529150506201048b565b9396999b929d509396999094979b5060005b828110620105ae5750505062004cfd5761080051516001600160401b03811162002a9b576201054881611fbc6109605160031b016200509a565b6020610800510190611fbc6109605160031b0160005260206000209160005b828110620105905750505050620105816106005162004cdf565b6106005295989094986201023f565b81516001600160a01b03168185015560209091019060010162010567565b620105f4906001600160a01b03620105c7828562004d46565b5116620105db6107a0516108005162004d46565b52620105ea6107a05162004cdf565b6107a05262004cdf565b6201050e565b509492975094955091965060009460005b87518110156201065e57620106296200abc66200abb9838962004d46565b8062010642575b506201063c9062004cdf565b6201060b565b906200abfc62010657986201063c936200608f565b9062010630565b5096509450915091806201067c575b506200c24591505b9062010016565b620106a79060018060a01b038451166000526200ac5a613efd9182602052604060002054906200608f565b60018060a01b03845116600052602052604060002055600091600092613efe54935b84811062010713575b506201066d57516001600160a01b031691600160401b81101562002a9b576200c2459262001a088260016201070c9401613efe5562004f26565b386201066d565b6201071e8162004f26565b9054845160039290921b1c6001600160a01b039081169116146201074d57620107479062004cdf565b620106c9565b5050600138620106d2565b9190926020810151602681101562002a2357601f03620107d3576040620107829101515162004cef565b5190613f6c54600160401b81101562002a9b576001810180613f6c5581101562004cfd57613f6c6000526200c24592620107cd91600080516020620337ac833981519152016200571f565b62010675565b6020810151602681101562002a2357602003620107f7575b506200c2459062010675565b6020810151602681101562002a2357602114620107eb576020810151602681101562002a23576022036201087d57506200c2459060ff19613f6e5416613f6e55613f6d546000613f6d558062010851575b505b90620107eb565b613f6d60005262010876906000805160206203396c8339815191529081019062004fa3565b3862010848565b6020810151602681101562002a2357602303620108a1575b506200c245906201084a565b6020810151602681101562002a235760241462010895576020810151602681101562002a235760251462010895579290916020840151602681101562002a235760150362010ee5576040840190620108fe60c08351015162004cef565b51906201091560a06200779b818651015162004cef565b51936201092a835185511462000fa3620331b7565b6201093d835186511462000fa3620331b7565b60005b83518110156201099b5762010956818662004d46565b51906103e882101562004cfd57611fbb620109959260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b62010940565b509095919560005b875181101562010acd57620109b9818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b01602052620109f360406000205462007d56838962004d46565b9062010a00838862004d46565b51916103e883101562004cfd57611fbb62010a399360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b62010a45818662004d46565b516103e881101562004cfd57611fbb906001600160a01b0362010a69848c62004d46565b511660005260031b0160205262010a8b60406000205462006814838962004d46565b919062010a99828862004d46565b51906103e882101562004cfd5762010ac793611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b620109a3565b509262010ae5919294506200c6369096959662032f53565b926040519062010af58262002b78565b6001825260203681840137516001600160a01b031662010b158262004cef565b526000945b805186101562010ed25762010b30868262004d46565b516106a05262010b41855162004e62565b9660009462010b51845162004e62565b6103805260009460005b885181101562010c23578a8962010b8b6001600160a01b0362010b7f858462004d46565b51166106a05162032d92565b158062010bdb575b62010bac575b505062010ba69062004cdf565b62010b5b565b9862010bd09162001ac782859c62007f3762010ba69760018060a01b039262004d46565b9790508a8962010b99565b5050506103e86106a051101562004cfd576001600160a01b0362010c00828b62004d46565b5116600052611fbb6106a05160031b016020528a89604060002054151562010b93565b50909895979498969291939660005b885181101562010cc8576103e86106a051101562004cfd576001600160a01b0362010c5e828b62004d46565b5116600052611fbb6106a05160031b016020526040600020541562010c8f575b62010c899062004cdf565b62010c32565b9962010c899062010cbf906001600160a01b0362010cae8e8d62004d46565b511662001ac7826103805162004d46565b9a905062010c7e565b509850969592919093966106a0516103e8811015806106605262004cfd5760031b611fbc01549862010cff62008068898c62006200565b6105e0526000610820526000610500525b6106605162004cfd57610500518a81101562010ddb5762010d4662010d6391600061066052611fbc6106a05160031b0162004f5e565b90546103805160039290921b1c6001600160a01b03169062032dea565b1562010d82575b62010d786105005162004cdf565b6105005262010d10565b60006106605262010da161050051611fbc6106a05160031b0162004f5e565b60018060a01b0391549060031b1c1662010dc2610820516105e05162004d46565b5262010dd16108205162004cdf565b6108205262010d6a565b50979294959093985095909560005b82811062010e86575050506106605162004cfd576105e051516001600160401b03811162002a9b5762010e2881611fbc6106a05160031b016200509a565b60206105e05101611fbc6106a05160031b01600052602060002060005b83811062010e68575050505062010e5c9062004cdf565b94929590919562010b1a565b82516001600160a01b03168183015560209092019160010162010e45565b62010ecc906001600160a01b0362010e9f828562004d46565b511662010eb3610820516105e05162004d46565b5262010ec26108205162004cdf565b6108205262004cdf565b62010dea565b5050939092506200c24591509062010895565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7065726174696f6e207479706560501b6044820152606490fd5b5091905062010f32826201561e565b9290600681101562002a23576002810362010f625760405162461bcd60e51b81528062004cdb600482016200758f565b6003810362011ef65750613f738054600260ff821662010f828162002a18565b1462011eb15760ff19166002179055613f78549060018201821162001e075760018201613f7855611f44549092600019929060005b8651811015620110335762010fda8462010fd2838a62004d46565b511062032899565b84600262010ff462010fed848b62004d46565b516202f17f565b500154106201100f575b620110099062004cdf565b62010fb7565b93506201100960026201102762010fed878a62004d46565b50015494905062010ffe565b5090936000199360005b8751811015620110aa57620110588562010fd2838b62004d46565b8560036201106b62010fed848c62004d46565b5001541062011086575b620110809062004cdf565b6201103d565b94506201108060036201109e62010fed888b62004d46565b50015495905062011075565b5091946001919350620110be875162004e62565b620110ca885162004e62565b620110d6895162004e62565b90620110e38a5162004e62565b9260405197620110f38962002ae9565b88526020880152604087015260608601526080850152600060a0850152600060c0850152600260e0850152600061010085015201600052613f766020526040600020825160018060a01b0381511660018060a01b03198354161782556020810151805190600160401b821162002a9b57600184015482600186015580831062011cf2575b5060200190600184016000526020600020916000905b8282106201168d57505050506040620111ac910151600283016200571f565b60208301518051906001600160401b03821162002a9b5760206003840191620111d684846200509a565b0190600052602060002060005b83811062011678575050505060408301518051906001600160401b03821162002a9b57602060048401916201121984846200509a565b0190600052602060002060005b83811062011663575050505060608301518051906001600160401b03821162002a9b57602060058401916201125c84846200509a565b0190600052602060002060005b8381106201164e575050505060808301518051906001600160401b03821162002a9b57602060068401916201129f84846200509a565b0190600052602060002060005b83811062011639575050505060a0830151600782015560c0830151600882015560e08301519290600901600384101562002a235761010062011304926201130b9560ff80198554169116178355015115159062005803565b426200608f565b9015620115f957613f7854600052613f7660205280600760406000200155613f715562011349613f785491826000526007604060002001546200608f565b919015620115b657600052613f7660205280600860406000200155613f7255613f78546000526009604060002001600260ff1982541617905560005b8251811015620113cb578062000faa620113a4620113c5938662004d46565b51613f7854600052613f7660205262006bbf83600360406000200162004f5e565b62011385565b506000915b8051831015620115b157613f78549283600052613f766020526201140d6201140082600360406000200162004f5e565b90549060031b1c6202f17f565b5054916201141b8362004e62565b9260005b818110620115665750506000906000915b8451831015620115355762011446838662004d46565b516103e8908181101562004cfd5760031b6001015462011467858862004d46565b519182101562004cfd576006620114849260031b01549062005eb0565b9015620114f15762011496916200608f565b929015620114b057620114a99062004cdf565b9162011430565b60405162461bcd60e51b8152602060048201526019602482015278746f74616c566f74696e67506f776572206f766572666c6f7760381b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f63757272656e74436c617373566f74696e67506f776572206f766572666c6f776044820152fd5b90956201155f945062000faa9250600052613f7660205262006bbf83600660406000200162004f5e565b91620113d0565b620115ab9087600052613f766020526201159881620115916201140088600360406000200162004f5e565b5062004f5e565b90549060031b1c62001ac7828862004d46565b6201141f565b509050565b60405162461bcd60e51b815260206004820152601b60248201527a657865637574696e6720656e642074696d65206f766572666c6f7760281b6044820152606490fd5b60405162461bcd60e51b8152602060048201526018602482015277766f74696e6720656e642074696d65206f766572666c6f7760401b6044820152606490fd5b600190602084519401938184015501620112ac565b60019060208451940193818401550162011269565b60019060208451940193818401550162011226565b600190602084519401938184015501620111e3565b805180518554602083015190916001600160a01b031690602681101562002a23576001600160a81b03199092161760a09190911b60ff60a01b161785556040015180518051906001870190602090620116e7848462005427565b01906000526020600020906000905b83821062011cd25750505050602081015180516001600160401b03811162002a9b57602060028801926201172b83856203239f565b019160005260206000209060005b8160051c811062011c965750601f198116810362011c51575b5050506040810151805190600160401b821162002a9b57600387015482600389015580831062011bc9575b50602001600387016000526020600020906000905b83821062011ba857505050506060810151805190600160401b821162002a9b57600487015482600489015580831062011b27575b50602001600487016000526020600020906000905b83821062011b065750505050608081015180516001600160401b03811162002a9b57602060058801926201181083856203239f565b019160005260206000209060005b8160051c811062011ac75750601f1981169283820362011a78575b505050506006850160a08201516020815191620118578385620054b5565b019160005260206000206000925b82841062011a1457505050506007850160c082015160208151916201188b8385620054b5565b019160005260206000206000925b828410620119a7575050505060e001518051906001600160401b03821162002a9b57620118d982620118cf600889015462002c79565b60088901620056d5565b602090601f83116001146201192c57928260099360209360019660009262011920575b5050600019600383901b1c191690851b1760088801555b019401910190926201118d565b015190503880620118fc565b906008870160005260206000209160005b601f19851681106201198e575083602093600196938793600997601f1981161062011974575b505050811b01600888015562011913565b015160001960f88460031b161c1916905538808062011963565b919260206001819286850151815501940192016201193d565b80518051906001600160401b03821162002a9b57602090620119ca83866200509a565b0183600052602060002060005b838110620119f657505050506001602081920192019301929062011899565b82516001600160a01b031681830155602090920191600101620119d7565b80518051906001600160401b03821162002a9b5760209062011a3783866200509a565b0183600052602060002060005b83811062011a6357505050506001602081920192019301929062011865565b60019060208451940193818401550162011a44565b6000936000905b808403821062011a9b5750505060051c01553880808062011839565b909194602062011abc6001928589519162011ab68362002fc4565b62032409565b960192019062011a7f565b6000805b6020811062011ae25750838201556001016201181e565b9490602062011afc6001928885519162011ab68362002fc4565b9201950162011acb565b600660208262011b1a60019451876200581b565b01930191019091620117db565b600681810204810362001e0757600683810204830362001e07576004880160005260206000208360060281015b826006028201811062011b69575050620117c6565b806000600692556000600182015562011b856002820162005504565b6000600382015562011b9a6004820162005399565b600060058201550162011b54565b600760208262011bbc60019451876202f19f565b0193019101909162011792565b600781810204810362001e0757600783810204830362001e07576003880160005260206000208360070281015b826007028201811062011c0b5750506201177d565b8062011c196007926200501a565b6000600182015560006002820155600060038201556000600482015562011c436005820162005399565b600060068201550162011bf6565b60009260005b601f1983168303811062011c7557505060051c015538808062011752565b9093602062011c8c60019284885115159162032409565b9501910162011c57565b6000805b6020811062011cb157508382015560010162011739565b9490602062011cc860019288855115159162032409565b9201950162011c9a565b600160208262011ce5839451876200571f565b01930191019091620116f6565b600981810204810362001e0757600983810204830362001e07576001850160005260206000208360090281015b826009028201811062011d3457505062011177565b6000815562011d4660018201620053e8565b62011d5b600282018054906000815562032377565b6003810154600060038301558062011e3b575b506004810154600060048301558062011dcc575b508062011d9b6005600993018054906000815562032377565b62011da96006820162005476565b62011db76007820162005476565b62011dc56008820162005399565b0162011d1f565b600681810204810362001e0757600482016000526020600020906006028101905b81811062011dfc575062011d82565b806000600692556000600182015562011e186002820162005504565b6000600382015562011e2d6004820162005399565b600060058201550162011ded565b600781810204810362001e0757600382016000526020600020906007028101905b81811062011e6b575062011d6e565b8062011e796007926200501a565b6000600182015560006002820155600060038201556000600482015562011ea36005820162005399565b600060068201550162011e5c565b60405162461bcd60e51b815260206004820152601d60248201527f766f74696e6720697320616c726561647920696e2070726f67726573730000006044820152606490fd5b6005919293501462011f055750565b90600080611f4a54905b818110620147bc575b505015620147a0575b60005b602083015190815181101562011f7c5762000faa620076c162011f56620076a16020620067a78662011f769862004d46565b86516001600160a01b03166000908152611f4960205260409020620242c3565b62011f24565b505060005b6020830151805182101562011fc957620076a16020620067a78462011fa69462004d46565b90606482101562004cfd5762011fc3914290611f4b015562004cdf565b62011f81565b50506000905b602083015180518310156200b072578262011fea9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036201223257604001906201202b60c08351015162004cef565b51936201204260a06200779b818651015162004cef565b51916201205386518551146202df8a565b6201206286518451146202dff0565b60005b8651811015620121b9576201207b818662004d46565b516103e881101562004cfd57600160ff6007620120a19360031b0154161515146202e052565b620120ad818562004d46565b51620120ba828762004d46565b51906103e882101562004cfd576006620120da9260031b0154906200608f565b90620120e7838862004d46565b51916103e883101562004cfd576006620121069360031b01556202e0aa565b62012112818562004d46565b516201211f828762004d46565b51906103e882101562004cfd5762012160916003906001600160a01b0362012148868d62004d46565b5116600052811b01602052604060002054906200608f565b91906201216e828862004d46565b51906103e882101562004cfd57620121b39362000faa926003906001600160a01b036201219c878f62004d46565b5116600052811b016020526040600020556202e109565b62012065565b5094915091620121cd620121d49162032f53565b9162032e37565b9360405192620121e48462002b3f565b60008452600036813760005b835181101562012215578062000faa620079626201220f938762004d46565b620121f0565b509450926020925062012229915062004cdf565b91905062011fcf565b9091926020820151602681101562002a2357600203620123c9576040809201908151938451916201226c6200c28860a08098015162004cef565b5194835187510362007bd257835185510362007b7e57835186510362007b27575060005b8651811015620123b357620122a6818862004d46565b516103e881101562004cfd5760ff6007620122c89260031b015416156202e162565b620122d4818862004d46565b516103e881101562004cfd5760031b600701805460ff19166001179055620122fd818562004d46565b516201230a828962004d46565b51906103e882101562004cfd576005620123289260031b016200571f565b62012334818662004d46565b5162012341828962004d46565b516103e881101562004cfd5760031b6001015562012360818762004d46565b516201236d828962004d46565b516103e881101562004cfd5760031b600201556201238c818862004d46565b51906103e882101562004cfd5760006006620123ad9360031b015562004cdf565b62012290565b5095915093506020925062012229915062004cdf565b9291906020810151602681101562002a2357600303620123f6576020919262000faa62012229926202e1ae565b6020810151602681101562002a23576004036201269e576201242060c06040830151015162004cef565b51936201243560c06040840151015162004d13565b51906201245c60a06040620124508282880151015162004cef565b51950151015162004d13565b519362012471875184511462000fa3620331b7565b62012484875185511462000fa3620331b7565b62012497875186511462000fa3620331b7565b60005b87518110156201250057620124b0818662004d46565b51906103e882101562004cfd57620124fa916003906001600160a01b03620124d9848d62004d46565b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b6201249a565b509095919593929360005b83518110156201265b5762012521818762004d46565b516103e881101562004cfd576003906001600160a01b0362012544848862004d46565b5116600052811b016020526201256560406000205462007d56838862004d46565b9062012572838962004d46565b51916103e883101562004cfd57620125b6926003906001600160a01b036201259b878b62004d46565b5116600052811b0160205260406000205562000fa3620332bb565b620125c2818762004d46565b516103e881101562004cfd576003906001600160a01b03620125e5848c62004d46565b5116600052811b016020526201260660406000205462006814838862004d46565b91905062012615818862004d46565b51916103e883101562004cfd5762012655926003906001600160a01b036201263e858e62004d46565b5116600052811b0160205260406000205562004cdf565b6201250b565b50936201267591929693506200847962007e479162032f53565b9260005b835181101562012215578062000faa6200796262012698938762004d46565b62012679565b6020810151602681101562002a2357600503620126c8576020919262000faa62012229926202ec1a565b6020810151602681101562002a23576006036201288f57620126f260c06040830151015162004cef565b51936201271960a060406201270d8282870151015162004cef565b51940151015162004d13565b519285518351036200db485785518451036200dafb5760005b8651811015620127985762012748818562004d46565b51906103e882101562004cfd5762012792916003906001600160a01b0362012771848c62004d46565b5116600052811b0160205262000faa60406000205462007ce9838962004d46565b62012732565b509060005b86518110156201283957620127b3818562004d46565b516103e881101562004cfd576003906001600160a01b03620127d6848b62004d46565b5116600052811b01602052620127f760406000205462007d56838862004d46565b919062012805828762004d46565b51906103e882101562004cfd57620128339362000faa926003906001600160a01b036201259b878f62004d46565b6201279d565b5094916201284e919350620121cd9062032f53565b91604051946201285e8662002b3f565b60008652600036813760005b835181101562012215578062000faa6200796262012889938762004d46565b6201286a565b6020810151602681101562002a2357600703620129a15760400192620128ba60c08551015162004cef565b5191620128cc60a08651015162004cef565b5194515191620128e4845187511462000fa3620331b7565b60005b845181101562012215576201299b9062000faa6001600160a01b03806201290f848a62004d46565b51166000528660028b6201298b6201294e876201294681611f4097886020526200880e60ff604060002054161562000fa362033288565b519362004d46565b5191620088728d60405196620129648862002a7f565b60018852886200dc958c60208b01946000865260408c0197885260608c01998a5262004d46565b519101556200888d838962004d46565b620128e7565b6020819493940151602681101562002a235760080362012a385760c06040620129ce920151015162004cef565b519160005b835181101562012a265762012a20906001600160a01b0380620129f7838862004d46565b5116600052611f4090816020526200ddb1600160ff6040600020541615151462000fa3620331e7565b620129d3565b50926020919250620122299062004cdf565b6020810151602681101562002a235760090362012aba5760c0604062012a62920151015162004cef565b519160005b835181101562012a265762012ab4906001600160a01b038062012a8b838862004d46565b5116600052611f4090816020526200de9f600160ff6040600020541615151462000fa3620331e7565b62012a67565b6020810151602681101562002a2357600a0362012b68576040019062012aeb60a06200df3360c08551015162004cef565b519262012b00835185511462000fa3620331b7565b60005b835181101562012b555762012b4f906001600160a01b038062012b27838862004d46565b5116600052611f40806020526200dfa2600160ff6040600020541615151462000fa3620331e7565b62012b03565b5093620122299193506020925062004cdf565b602081949392940151602681101562002a2357600b0362012c1b576040019262012b9760c08551015162004cef565b519351519162012baf855184511462000fa3620331b7565b60005b855181101562012c085762012c029062000faa6001600160a01b038062012bda848b62004d46565b5116600052611f40806020526200e084600160ff6040600020541615151462000fa3620331e7565b62012bb2565b5093509160209150620122299062004cdf565b9091926020820151602681101562002a2357600c0362012cf8576060604083015101519262012c4a846202d698565b60005b845181101562012b555760c062012c6d8260606040880151015162004d46565b5101511562012cba5762012c8e62008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca962012cb4936000190162005cba565b62012c4d565b62012cd262008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca962012cb4936000190162005c7a565b9291906020810151602681101562002a2357600d0362012ddc5760400192602062012d2860a08651015162004cef565b51945101519162012d3d85518451146202dd8c565b60005b855181101562012c08578062012d5b62012d9c928662004d46565b511562012da25762012d7262008d8c828962004d46565b62012d8a60ff600562008db662008daf858c62004d46565b600562008dd262008daf838a62004d46565b62012d40565b62012db262008dfb828962004d46565b62012dca60ff600562008db662008e1e858c62004d46565b600562008dd262008e1e838a62004d46565b6020819492940151602681101562002a2357600e0362012e8b5760400190602062012e0c60a08451015162004cef565b51925101519362012e2183518651146202dd8c565b60005b835181101562012c08578062012e3f62012e4b928862004d46565b5162012e515762004cdf565b62012e24565b62012e6162008eb6828762004d46565b62012e7960ff600562008ed962008daf858a62004d46565b600562008ca962008daf838862004d46565b906020829493940151602681101562002a2357600f0362012f69576060604083015101519262012ebb846202d698565b60005b845181101562012b555760c062012ede8260606040880151015162004d46565b5101511562012f2b5762012eff62008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262012f25936000190162005cba565b62012ebe565b62012f4362008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262012f25936000190162005c7a565b906020819493940151602681101562002a235760100362012fda57604001519062012f9d60a0608084015193015162004cef565b519362012fb2835186511462000fa3620331b7565b60005b835181101562012c08578062000faa6200902b62012fd4938762004d46565b62012fb5565b6020819492940151602681101562002a23576011036201323c57604001906201300e60a06200df3360c08551015162004cef565b51936201301f83518651146202d510565b60005b83518110156201309957620130939062000faa6001600160a01b03806201304a848962004d46565b5116600052611f45806020526201306c60406000205462006814868d62004d46565b9190926201307b868b62004d46565b511660005260205260406000205562000fa36203316d565b62013022565b50935090620130a89062032e37565b90611f465493620130bf6200806884518762006200565b9060009260005b87811062013221575060005b855181101562013179576000805b8981106201312a575b501562013102575b620130fc9062004cdf565b620130d2565b93620130fc9062013121906001600160a01b036200e724888a62004d46565b949050620130f1565b620131358162004eb6565b90546001600160a01b0360039290921b1c81169062013155858b62004d46565b5116146201316e57620131689062004cdf565b620130e0565b5050600138620130e9565b5095509392506201318a8262004e62565b8051906001600160401b03821162002a9b57602090620131aa8362004ff7565b01611f46600052602060002060005b83811062013203575050505060005b828110620131e0575050506201222960209162004cdf565b620131fd9062000faa6001600160a01b03620019fb838662004d46565b620131c8565b82516001600160a01b031681830155602090920191600101620131b9565b936200e87062013236916200e8528762004eb6565b620130c6565b6020819492940151602681101562002a23576012036201348157604001906201327060a06200df3360c08551015162004cef565b51936201328183518651146202d510565b60005b8351811015620132d457620132ce9062000faa6001600160a01b0380620132ac848962004d46565b5116600052611f45806020526201306c60406000205462007d56868d62004d46565b62013284565b5093509190620132e49062032e37565b611f4654620132f38162004e62565b906000926000915b808310620133a857505050620133118262004e62565b8051906001600160401b03821162002a9b57602090620133318362004ff7565b01611f46600052602060002060005b8381106201338a575050505060005b82811062013367575050506201222960209162004cdf565b620133849062000faa6001600160a01b03620019fb838662004d46565b6201334f565b82516001600160a01b03168183015560209092019160010162013340565b91956000959193959760005b85518110156201347257620133c98962004eb6565b90546001600160a01b0360039290921b1c811690620133e9838962004d46565b5116146201340257620133fc9062004cdf565b620133b4565b509750956001959391955b8062013441575b156201342c57620134259062004cdf565b91620132fb565b936200e87062013425916200e8528762004eb6565b506201344d8162004eb6565b60018060a01b0391549060031b1c16600052611f456020526040600020541562013414565b5097969096959391956201340d565b6020810151602681101562002a2357601303620134da5760408091015101519260005b8451811015620134c9578062000faa6200959f620134c3938862004d46565b620134a4565b509250906201222960209162004cdf565b6020810151602681101562002a23576014036201368757604001906201350560c08351015162004cef565b51936201351c60a06200779b818651015162004cef565b51916201352d86518551146202df8a565b6201353c86518451146202dff0565b60005b8651811015620136325762013555818562004d46565b5162013562828762004d46565b51906103e882101562004cfd576006620135829260031b0154906200608f565b906201358f838862004d46565b51916103e883101562004cfd576006620135ae9360031b01556202e0aa565b620135ba818562004d46565b51620135c7828762004d46565b51906103e882101562004cfd57620135f0916003906001600160a01b0362012148868d62004d46565b9190620135fe828862004d46565b51906103e882101562004cfd576201362c9362000faa926003906001600160a01b036201219c878f62004d46565b6201353f565b5094915091620121cd620136469162032f53565b9360405192620136568462002b3f565b60008452600036813760005b835181101562012215578062000faa6200796262013681938762004d46565b62013662565b6020810151602681101562002a2357601503620136b1576020919262000faa62012229926202e1ae565b6020810151602681101562002a23576016036201370d5760c06040620136db920151015162004cef565b519260005b8451811015620134c957620137079062000faa6001600160a01b0362009d36838962004d46565b620136e0565b6020810151602681101562002a23576017036201376a5760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601803620137d55760c0604062013794920151015162004cef565b5192600160ff19611fb6541617611fb65560005b8451811015620134c957620137cf9062000faa6001600160a01b0362009e02838962004d46565b620137a8565b6020819392930151602681101562002a23576019036201394a5760008091604082910160a08082510151805162013911575b5050519060e0820151916201382b6200680d60c060018060a01b0393015162004cef565b511690602083519301915af13d1562013908573d906201384b8262002f5b565b916201385b604051938462002b94565b82523d6000602084013e5b156201387a57506201222960209162004cdf565b62004cdb90620138e760405191600080516020620338cc833981519152602084015278039bab1b1b2b9b9b33ab617102932ba3ab937103230ba309d1603d1b6040840152828151620138d6816059946020868601910162002e01565b810103603981018452018262002b94565b60405162461bcd60e51b815260206004820152918291602483019062002e26565b60609062013866565b6201391c9062004cef565b51516201392b575b8062013807565b8192506200680d90620139419251015162004cef565b51903862013924565b6020810151602681101562002a2357601a0362013a005760a0604062013974920151015162004cef565b516201398460038251146202d510565b6201398f8162004cef565b5191620139a8620139a08362004d13565b519262004d24565b51916200f9d55760209262012229926001036200a04357620139d2620139e091611fb1546200608f565b611fb15562000fa362033108565b62000faa620139f2611fb2546200607c565b611fb25562000fa362033142565b6020810151602681101562002a2357601b0362013e305750919062013a30611faf546200225a6200a0b962033044565b505062013a3c62033108565b506000805b6103e8811062013de4575b505062013a5862006161565b62013a66613f745462004e62565b906000946000905b6103e882101562013dd7578160031b9460ff6007870154161562013bbf5760009660028701541562013bae57600098975b62004cfd57600487015489101562013b945762013ac0896004890162004f5e565b9054600391821b1c6001600160a01b031660008181529189016020526040918290205491999162013af390889062005eb0565b9a9062013aff62033108565b62013b0a9162004cac565b60009a60028b015462013b1d9162005eb0565b919062013b2962033108565b62013b349162004cac565b82600052611f476020526000209081549062013b50916200608f565b90915562013b5d62033108565b62013b689162004cac565b62013b74828962004d46565b5262013b809062004cdf565b9862013b8c9062004cdf565b989762013a9f565b9290955062013ba69196975062004cdf565b909462013a6e565b9290955062013ba691965062004cdf565b95969392509350505b62013bd38262004e62565b9160009160005b82811062013d4157505050611f48549162013bfa62008068848462006200565b926000906000905b80821062013d2457505060005b83811062013c8e5750508251929150506001600160401b03821162002a9b5760209062013c3c8362004fbc565b01611f48600052602060002060005b83811062013c705750505050620122296020916000611fb1556000611fb25562004cdf565b82516001600160a01b03168183015560209092019160010162013c4b565b6000805b83811062013cdc575b501562013cb4575b62013cae9062004cdf565b62013c0f565b9062013cae9062013cd3906001600160a01b03620081f0858762004d46565b91905062013ca3565b6001600160a01b038062013cf1858862004d46565b51169062013d00838a62004d46565b51161462013d195762013d139062004cdf565b62013c92565b505060013862013c9b565b9091620081fe62013d3a91620094f58562004e9a565b9062013c02565b6000805b85811062013d8f575b501562013d67575b62013d619062004cdf565b62013bda565b9262013d619062013d86906001600160a01b03620081f0878662004d46565b93905062013d56565b6001600160a01b038062013da4858762004d46565b51169062013db3838a62004d46565b51161462013dcc5762013dc69062004cdf565b62013d45565b505060013862013d4e565b9394959291505062013bc8565b8060039594951b9060ff6007830154161562013e26576200a4f86200746162000faa946200a4ec62013e1d9560026200a4e28762005e1c565b93929362013a41565b5093929362013a4c565b6020810151602681101562002a2357601c0362013e8d5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d0362013eb3575b506201222960209162004cdf565b9290916020840151602681101562002a2357601e03620145d557604084019060a09062013ee4828451015162004cef565b515162013ef5838551015162004d13565b5151036200ade95762013f0c828451015162004cef565b515162013f1d838551015162004d24565b5151036200ad6d5762013f34828451015162004cef565b519462013f45838551015162004d13565b519162013f5a6200a641858751015162004d24565b519585518751036200ad0a5760005b865181101562013fc25762013f7f818862004d46565b51906103e882101562004cfd57600362013fbc9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b62013f69565b5090969192939660005b86518110156201406b5762013fe2818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526201401a60406000205462007d56838b62004d46565b919062014028828a62004d46565b51906103e882101562004cfd576201406593600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b62013fcc565b50939692979550936201407e9062032f53565b96604051966201408e8862002b78565b60018852602036818a013786516001600160a01b0316620140af8962004cef565b5260405196620140bf8862002b3f565b600088526000610760525b895161076051908110156201447c57620140e5908b62004d46565b5161072052620140f6885162004e62565b99600097620141068b5162004e62565b6109405260009760005b8b51811015620141d6578d8c620141406001600160a01b0362014134858462004d46565b51166107205162032d3b565b158062014190575b62014161575b50506201415b9062004cdf565b62014110565b9b620141859162001ac782859f62007f376201415b9760018060a01b039262004d46565b9a90508d8c6201414e565b5050506103e861072051101562004cfd576001600160a01b03620141b5828e62004d46565b5116600052600361072051811b016020528d8c604060002054151562014148565b50909b989a99949691929395979b60005b8b518110156201427b576103e861072051101562004cfd576001600160a01b0362014213828e62004d46565b5116600052600361072051811b016020526040600020541562014242575b6201423c9062004cdf565b620141e7565b9c620142726201423c918f620142618f9160018060a01b039262004d46565b511662001ac7826109405162004d46565b9d905062014231565b509b5098959092949691939661072051996103e88b10159c8d62004cfd57620142b26200806860048f9e60031b01549e8f62006200565b6108e0526000610a20528d60009e5b62004cfd578d8f101562014380575060009d62014309620142ec8260046107205160031b0162004f5e565b90546109405160039290921b1c6001600160a01b03169062032dea565b1562014323575b6201431c8f9162004cdf565b9e620142c1565b6201431c9e5060009e8f91620143438160046107205160031b0162004f5e565b60018060a01b0391549060031b1c1662014364610a20516108e05162004d46565b5262014373610a205162004cdf565b610a205291505062014310565b9396999b929d509396999094979b5060005b828110620144305750505062004cfd576108e051516001600160401b03811162002a9b57620143cb8160046107205160031b016200509a565b60206108e051019060046107205160031b0160005260206000209160005b828110620144125750505050620144036107605162004cdf565b610760529598909498620140ca565b81516001600160a01b031681850155602090910190600101620143e9565b62014476906001600160a01b0362014449828562004d46565b51166201445d610a20516108e05162004d46565b526201446c610a205162004cdf565b610a205262004cdf565b62014392565b509492975094955091965060009460005b8751811015620144e057620144ab6200abc66200abb9838962004d46565b80620144c4575b50620144be9062004cdf565b6201448d565b906200abfc620144d998620144be936200608f565b90620144b2565b5096509450929091508062014502575b5050620122296020915b915062013ea5565b6201452d9060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b60018060a01b03835116600052602052604060002055600080611f4654905b8181106201458b575b5050916201222991602093156201456f575b5091620144f0565b5162014584906001600160a01b0316620065d6565b3862014567565b620145968162004eb6565b9054855160039290921b1c6001600160a01b03908116911614620145c557620145bf9062004cdf565b6201454c565b5060019150829050602062014555565b9190926020810151602681101562002a2357601f0362014610576020916201460a6200ae9d6040620122299401515162004cef565b620144fa565b6020810151602681101562002a235760200362014636575b5062012229602091620144fa565b6020810151602681101562002a2357602180910362014657575b5062014628565b602082015160268110156200b01a57602203620146945750506201222960209160ff19611fb65416611fb6556201468d62005087565b9162014650565b602082015160268110156200b01a57602303620146bb575b5050620122296020916201468d565b60208201519060268210156201478c576024809203620146dd575b50620146ac565b602083015160268110156201477957602514620146d65760208301519060268210156201476557506015036201472857506020916201472062012229926202e1ae565b9138620146d6565b60649060166040519162461bcd60e51b83526020600484015282015275496e76616c6964206f7065726174696f6e207479706560501b6044820152fd5b9050634e487b7160e01b6000526004526000fd5b50634e487b7160e01b6000526004526000fd5b634e487b7160e01b60005260045260246000fd5b8151620147b6906001600160a01b031662006600565b62011f21565b620147c78162004f0a565b9054865160039290921b1c6001600160a01b03908116911614620147f657620147f09062004cdf565b62011f0f565b5050506001388062011f18565b82516001600160a01b0316600160401b82101562002a9b5762001a08826001620148329401613f025562004eee565b386200bbb0565b620148448162004eee565b9054865160039290921b1c6001600160a01b0390811691161462014873576201486d9062004cdf565b6200bb9f565b50506001386200bba8565b82516001600160a01b0316818301556020909201916001016200bad5565b82516001600160a01b0316818301556020909201916001016200b988565b600191820180546001600160a01b03909216848601559390910192906200b8d7565b613f6d60005262014903906000805160206203396c83398151915290810190830162004fa3565b386200b898565b600180826201491b82948662014d65565b019201920191906200b85a565b613f6c600052600080516020620337ac833981519152908282015b8183018110620149555750506200b81f565b806201496360019262005399565b0162014943565b600191820180546001600160a01b03909216848601559390910192906200b7f0565b613f6b600052620149b3906000805160206203376c83398151915290810190830162004fa3565b386200b7b1565b6001809193019182549381613f0301550190916200b754565b82516001600160a01b0316818301556020909201916001016200b66d565b62014a0c90613f026000528484600020918201910162004fa3565b386200b65d565b82516001600160a01b0316818301556020909201916001016200b489565b62014a4c90613ef96000528484600020918201910162004fa3565b386200b479565b8062014a759160031b600160ff60078301541615151462014a7b575062004cdf565b6200b3ce565b62014a8e60048201611fbc830162014efe565b611fbf8101600160ff19825416179055805481611fb801556001810154611fb98201556002810154611fba82015562014acf60058201611fbd830162014d65565b611fbe6006820154910155386200a043565b600660208262014af560019451866200581b565b019201920191906200b1d7565b600681810204810362001e0757600683810204830362001e0757613efa6000527f2dfc264c6ecd0c6ea7ea3726867a09cc7eed901a6e437c010038bab559d48ed86006840281015b826006028201811062014b5f5750506200b1c4565b806000600692556000600182015562014b7b6002820162005504565b6000600382015562014b906004820162005399565b600060058201550162014b4a565b600660208262014bb260019451866200581b565b019201920191906200b14c565b8060060290600682040362001e07578260060260068104840362001e0757600090613efb82526020822092830192015b82811062014bff5750506200b139565b80826006925582600182015562014c196002820162005504565b82600382015562014c2d6004820162005399565b8260058201550162014bef565b608460405162461bcd60e51b815260206004820152604060248201526000805160206203394c83398151915260448201527f656d2073686f756c64206e6f742072657475726e20766f7465206e65656465646064820152fd5b60405162461bcd60e51b815260206004820152604760248201526000805160206203394c83398151915260448201527f656d2073686f756c64206e6f742072657475726e206120766f74696e672072756064820152661b19481b1a5cdd60ca1b608482015260a490fd5b81811462014d61578154916001600160401b03831162002a9b5762014d2383836200509a565b60005260206000209060005260206000208154916000925b84841062014d4a575050505050565b600180919201938454928185015501929062014d3b565b5050565b9080821462014d615762014d7a815462002c79565b906001600160401b03821162002a9b57819062014da48262014d9d865462002c79565b86620056d5565b600090601f831160011462014ddd5760009262014dd15750508160011b916000199060031b1c1916179055565b01549050388062005768565b81526020808220858352818320935090601f1985169083905b82821062014e3257505090846001959493921062014e1857505050811b019055565b015460001960f88460031b161c19169055388080620057b5565b849581929585015481556001809101960194019062014df6565b81811462014d615781549162014e63838362005427565b6000526020600020906000526020600020906000905b83821062014e875750505050565b8062014e966001928562014d65565b92810192918101910162014e79565b81811462014d615781549162014ebc8383620054b5565b6000526020600020906000526020600020906000905b83821062014ee05750505050565b8062014eef6001928562014cfd565b92810192918101910162014ed2565b81811462014d61578154916001600160401b03831162002a9b5762014f2483836200509a565b60005260206000209060005260206000208154916000925b84841062014f4b575050505050565b600191820180546001600160a01b039092168486015593909101929062014f3c565b81811462014d615781549162014f848383620054b5565b6000526020600020906000526020600020906000905b83821062014fa85750505050565b8062014fb76001928562014efe565b92810192918101910162014f9a565b81811462014d615781549162014fdd8383620055b8565b6000526020600020906000526020600020906000905b838210620150015750505050565b8060019184036201501e575b600880910193019101909162014ff3565b805484556201504b8280860190830160ff906201503f82825416846200569a565b5460081c1690620056b4565b6002808201549085015562015067600380830190860162014cfd565b600480850190820180820362015080575b50506201500d565b6201508b9162014e4c565b6201509d600580830190860162014ea5565b620150af600680830190860162014f6d565b620150c1600780830190860162014d65565b388062015078565b919062005d3057808203620150dc575050565b60ff60058062002c3b94620150f5848654168262005681565b6001850154600182015562015111600286016002830162014fc6565b600385015460038201556201512d600486016004830162014d65565b0192016201513f8282541684620057f2565b5460081c169062005803565b9080821462014d6157908154906000915b606483106201516b5750505050565b60018091940192835494818401550191926201515c565b90611f42549060009060208401805151906201519e8262002c61565b91620151ae604051938462002b94565b808352620151bf601f199162002c61565b01366020840137620151d48151518662005eb0565b9015620155c657620151e69062004e62565b92849180515115620155bb57620152008793929362004e62565b95915b81515183101562015404576000958687805b8c8c83109182156201537d576201522e89895162004d46565b5194600092839662015241859662015a04565b620152528588846001948562015bb7565b6201533e575b508284118062015328575b15620152cd575050509183918b620152c3575b600685101562002a23578c8f95600314620152a3575b5050620152999062004cdf565b9190925062015215565b9b620152ba9162001ac78262015299959f62004d46565b9a908c6201528c565b60009b5062015276565b909391809593148062015312575b15620153045750600685101562002a23578c8f95600314620152a3575050620152999062004cdf565b945050620152999062004cdf565b5050600685101562002a23578e851515620152db565b5050600686101562002a23578f86151562015263565b92935093509450620153508462005cba565b5001549060ff620153618562005cba565b505416946003620153728662005cba565b500154933862015258565b50505050969096949391946201539f8162015399858a62004d46565b620035e5565b600681101562002a2357600314620153c6575b50620153be9062004cdf565b919262015203565b6000905b808210620153d95750620153b2565b9094620092e0620153fd91620153f0888c62004d46565b5162001ac7828c62004d46565b90620153ca565b9650505094509150600093845b83518610156201555657620154316201542b878662004d46565b62005673565b9060068083101562002a235760029283036201545c57505062015455909562004cdf565b9462015411565b6201546c6201542b898862004d46565b928184101562002a235760018094148062015542575b15620154975750505062015455909562004cdf565b620154ac6201542b8a899b9694959b62004d46565b928084101562002a23576004809414928362015516575b5082620154eb575b5050620154df575b50620154559062004cdf565b955062015455620154d3565b90915088101562015501578714153880620154cb565b602182634e487b7160e01b6000525260246000fd5b908093508a10156201552d578914159138620154c3565b602184634e487b7160e01b6000525260246000fd5b508183101562002a23578083141562015482565b925092909350600682101562002a235760038203620155b2575b6201557b8162004e62565b9360005b8281106201558e575050509190565b806201559f620155ac928462004d46565b5162001ac7828962004d46565b6201557f565b50600062015570565b509450505092509190565b60405162461bcd60e51b815260206004820152602a60248201527f546865206c656e677468206f6620766f74696e672072756c65206c697374206960448201526973206f766572666c6f7760b01b6064820152608490fd5b90611f43549060009060208401805151906201563a8262002c61565b916201564a604051938462002b94565b8083526201565b601f199162002c61565b01366020840137620156708151518662005eb0565b9015620155c657620156829062004e62565b92849180515115620155bb576201569c8793929362004e62565b95915b8151518310156201588a576000958680805b8c8c82109283156201581557620156ca89895162004d46565b5194600092620156eb848683829a620156e4849b62015a04565b8362015bb7565b620157d6575b81841180620157c0575b1562015764575050509083928b6201575a575b600685101562002a23578c8f956003146201573a575b5050620157319062004cdf565b909250620156b1565b9b620157519162001ac78262015731959f62004d46565b9a908c62015724565b60009b506201570e565b908094939592951480620157aa575b156201579c5750600685101562002a23578c8f956003146201573a575050620157319062004cdf565b945050620157319062004cdf565b5050600685101562002a23578e85151562015773565b5050600686101562002a23578f861515620156fb565b9450945090506001620157e98362005c7a565b5001549060ff620157fa8462005c7a565b5054169460036201580b8562005c7a565b50015494620156f1565b935050505096909694939194620158328162015399858a62004d46565b600681101562002a235760031462015859575b50620158519062004cdf565b91926201569f565b6000905b8082106201586c575062015845565b9094620092e06201588391620153f0888c62004d46565b906201585d565b9650505094509150600093845b8351861015620159ac57620158b16201542b878662004d46565b9060068083101562002a23576002928303620158dc575050620158d5909562004cdf565b9462015897565b620158ec6201542b898862004d46565b928184101562002a235760038094148062015998575b156201591757505050620158d5909562004cdf565b6201592c6201542b8a899b9694959b62004d46565b928084101562002a23576005809414928362015981575b50826201596b575b50506201595f575b50620158d59062004cdf565b9550620158d562015953565b90915088101562002a235787141538806201594b565b908093508a101562002a2357891415913862015943565b508183101562002a23578083141562015902565b925092909350600682101562002a235760038203620159fb575b620159d18162004e62565b9360005b828110620159e4575050509190565b806201559f620159f5928462004d46565b620159d5565b506000620159c6565b1562015a0c57565b60405162461bcd60e51b815260206004820152602860248201527f506c7567696e466163746f72793a20706c7567696e20696e646578206f7574206044820152676f662072616e676560c01b6064820152608490fd5b9062002c3b606160405180947f436865636b696e6720636f6e646974696f6e206578703a20706c7567696e206960208301527f6e646578206f7574206f662072616e67652c20706c7567696e20696e6465783a6040830152600160fd1b606083015262015ad9815180926020868601910162002e01565b810103604181018552018362002b94565b606d62002c3b919392936040519485917f436865636b696e6720636f6e646974696f6e206578703a206e6f646520696e6460208401527f6578206f7574206f662072616e67652c20706c7567696e20696e6465783a2000604084015262015b5c815180926020605f8701910162002e01565b82016d016103737b2329034b73232bc1d160951b605f82015262015b8a825180936020878501910162002e01565b0103604d81018552018362002b94565b805482101562004cfd5760005260206000209060031b0190600090565b93929190841562015f485762015be1611f4254841062000fa362015bdb86620050f5565b62015a62565b62015c18600262015bf28562005cba565b500154851062000fa362015c0686620050f5565b62015c1188620050f5565b9062015aea565b841562015f295762015c48600162015c3f86600262015c378862005cba565b500162015b9a565b50015460ff1690565b945b62015c558662002fc4565b8562015c6657505050505050600090565b62015c718662002fc4565b60039580870362015c885750505050505050600190565b62015c938162002fc4565b6004810362015ca85750505050505050600090565b62015cb38162002fc4565b6001810362015cc95750620032d2955062015f78565b91959392949062015cda8362002fc4565b600280931462015cf1575b50505050505050600090565b801562015f0b5762015d1b600162015d0f848662015c378962005cba565b50015460081c60ff1690565b935b811562015eef578562015d36848662015c378562005cba565b500154965b62015d468862004e62565b9860005b89811062015e645750505050505062015d638262002a18565b6001820362015dc657505050906001916000915b81831062015d855750505090565b9091928062015da3575b62015d9b909362004cdf565b919062015d77565b5062015d9b62015dbe62015db8858462004d46565b51151590565b905062015d8f565b62015dd18262002a18565b810362015e2b5750509060009182915b81831062015def5750505090565b909192801562015e0e575b62015e06909362004cdf565b919062015de1565b5062015e0662015e2362015db8858462004d46565b905062015dfa565b90915062015e398162002a18565b1462015e4d57503880808080808062015ce5565b62015e6062015db8620032d29262004cef565b1590565b808b62015ead828c8a8c8a8c1562015ece5762015ea3949262015e99949262015c3762015e919362005cba565b500162004f5e565b90549060031b1c90565b8787878b62015bb7565b62015ec162015ec89462000faa9362004d46565b9015159052565b62015d4a565b62015ee9949262015e99949262015c3762015e919362005c7a565b62015ea3565b8562015f01848662015c378562005c7a565b5001549662015d3b565b62015f22600162015d0f848662015c378962005c7a565b9362015d1d565b62015f41600162015c3f86600262015c378862005c7a565b9462015c4a565b62015f61611f4354841062000fa362015bdb86620050f5565b62015f72600262015bf28562005c7a565b62015c18565b9392600462015fc291866000146201619057600262015f9d878262015c378562005cba565b500154955b87156201617f57600262015c3762015fba9362005cba565b5001620036ac565b916032841115620161735760338410158062016167575b6201615a576097841015806201614e575b620161415760d38410158062016134575b620161285761012d841015806201611c575b6201610f576101918410158062016102575b620160f5576101af84101580620160e8575b620160db576101cd84101580620160ce575b620160c1576101f584101580620160b4575b620160a757610259841015806201609a575b6201608c57506102bd831015620160815750505050600090565b620032d293620241b4565b9050620032d293506202b4f1565b506102bc84111562016067565b50620032d293506201e3df565b5061025884111562016055565b50620032d293506202be55565b506101f484111562016043565b50620032d293506202c8b8565b506101cc84111562016031565b50620032d2935062023923565b506101ae8411156201601f565b50620032d2935062028765565b5061019084106201600d565b50620032d293620161ad565b5061012c84111562015ffb565b50620032d2935062023f9f565b5060b484111562015fea565b5050620032d2926201f03f565b50609584111562015fd9565b50620032d29362025742565b600262015c3762015fba9362005c7a565b6002620161a3878262015c378562005c7a565b5001549562015fa2565b9260d381146201677c5760d481146201676f5760d58114620167625760d68114620167555760d78114620167485760d881146201673b5760d981146201672f5760da8114620167225760db8114620167155760dc8114620167095760dd8114620166fa5760de8114620166eb5760df8114620166de5760e08114620166d15760e18114620166c55760e28114620166b85760e38114620166ab5760e481146201669f5760e58114620166905760e68114620166815760e78114620166745760e88114620166675760e981146201665a5760ea81146201664d5760eb8114620166405760ec8114620166335760ed8114620166265760ee8114620166195760ef81146201660c5760f08114620165ff5760f18114620165f25760f28114620165e55760f38114620165d85760f48114620165cb5760f58114620165be5760f68114620165b15760f78114620165a45760f88114620165975760f981146201658b5760fa81146201657f5760fb8114620165735760fc8114620165675760fd81146201655b5760fe81146201654f5760ff811462016543576101008114620165375761010181146201652b5761010281146201651f5761010381146201651357610104811462016507576101058114620164fb576101068114620164ef576101078114620164e3576101088114620164d7576101098114620164cb5761010a8114620164bf5761010b8114620164b35761010c8114620164a75761010d81146201649b5761010e81146201648f5761010f811462016483576101108114620164775761011181146201646b5761011281146201645f57610113811462016453576101148114620164475761011581146201643b57610116146201643057505050600090565b620032d2926201da96565b50620032d2926201d86d565b50620032d2926201d644565b50620032d2926201d341565b50620032d2926201d120565b50620032d2926201ceff565b50620032d2926201cccd565b50620032d2926201cb04565b50620032d2926201c93b565b50620032d2926201c703565b50620032d2926201c53c565b50620032d2926201c20d565b50620032d2926201bfdb565b50620032d2926201be12565b50620032d2926201bc49565b50620032d2926201ba84565b50620032d2926201b84c565b50620032d2926201b685565b50620032d2926201b34f565b50620032d2926201b0ef565b50620032d2926201af1e565b50620032d2926201ad3d565b50620032d2926201ab76565b50620032d2926201a920565b50620032d2926201a757565b50620032d2926201a58e565b50620032d2926201a2ad565b50620032d29262019fad565b50620032d29262019cc0565b50620032d292620199c0565b50620032d292506201983b565b50620032d29250620196f6565b50620032d2925062019584565b50620032d292506201943f565b50620032d29250620192fa565b50620032d29250620191b6565b50620032d2925062019041565b50620032d2925062018efd565b50620032d2925062018db9565b50620032d2925062018c78565b50620032d2925062018b35565b50620032d29250620189f4565b50620032d29250620188ab565b50620032d2925062018767565b50620032d2925062018623565b50620032d29250620184ae565b50620032d2925062018310565b50620032d29250620181cd565b509050620032d2915062018172565b509050620032d2915062018115565b50620032d29262017ed7565b50620032d2925062017d48565b50620032d2925062017bf9565b50620032d292620179e2565b50620032d292506201783a565b50620032d29250620176ed565b509050620032d2915062017692565b509050620032d2915062017625565b50620032d292620173d9565b50620032d292506201724a565b50620032d29250620170f5565b50620032d29262016ec7565b50620032d2925062016d0f565b50620032d2925062016bb3565b50620032d2925062016ab2565b50620032d2925062016985565b50620032d2925062016884565b50620032d2925090602001906001825151036201682b576001620167a1835162004cef565b515103620167d157620167b4906201dd9d565b919015620065cf576200680d620167cc915162004cef565b511090565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231313a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90602001906001825151036201692c576001620168a2835162004cef565b515103620168d257620168b5906201dd9d565b919015620065cf576200680d620168cd915162004cef565b511190565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231323a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b906020019060018251510362016a59576002620169a3835162004cef565b515103620169fd57620169b6906201dd9d565b9015620065cf57620169cd6200680d835162004cef565b518110159182620169dd57505090565b620169f7919250620169f0905162004cef565b5162004d13565b51101590565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231333a205468652055494e545f324441525241595b305d206c60448201526d32b733ba341034b9903737ba101960911b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231333a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b906020019060018251510362016b5a57600162016ad0835162004cef565b51510362016b005762016ae3906201dd9d565b919015620065cf576200680d62016afb915162004cef565b511490565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231343a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231343a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90604001600191828251510362016cb5578262016bd1835162004cef565b51510362016c5b5762016be4906201e110565b15620065c757829160009182945b62016c00575b505050905090565b805185101562016c55576001600160a01b038062016c1f878462004d46565b51169062016c326200680d855162004cef565b51160362016c4d5762016c46849562004cdf565b9462016bf2565b505091505090565b62016bf8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3231353a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231353a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362016e6d578262016d2d835162004cef565b51511062016e135762016d40906201e110565b15620065c757600091835b62016d57575b50505090565b815183101562016e0d57600080855b62016d8f575b501562016d865762016d7f849362004cdf565b9262016d4b565b50505050600090565b62016da08396949295965162004cef565b515181101562016e02576001600160a01b038062016dbf888562004d46565b51169062016dd3836200743f875162004cef565b51161462016df5579062016de984939262004cdf565b90939594919262016d66565b5091809493503862016d6c565b949390929462016d6c565b62016d51565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3231363a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231363a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201709b578462016ee9845162004cef565b515103620170415762016efc906201e110565b1562016f9a5784931562016fb1576000935b62016f1a575050505090565b8051841015620051fe576001600160a01b038062016f39868462004d46565b5116600052611f4080845260409060ff8260002054161562016fa45760029262016f64888662004d46565b51166000528452600020015462016f806200680d855162004cef565b510362016f9a5762016f93859462004cdf565b9362016f0e565b5050505050600090565b5050505050505050600090565b6000935b62016fc1575050505090565b8051841015620051fe576001600160a01b038062016fe0868462004d46565b5116600052613ef880845260409060ff8260002054161562016fa4576002926201700b888662004d46565b511660005284526000200154620170276200680d855162004cef565b510362016f9a576201703a859462004cdf565b9362016fb5565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3231373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3231373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906040016001918282515103620171f0578262017113835162004cef565b515103620171965762017126906201e110565b91909115620065c757600091835b620171425750505050600090565b8051831015620171905783926001600160a01b038062017163838562004d46565b511690620171766200680d865162004cef565b511614620051c457620171899062004cdf565b9262017134565b62016d86565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3231383a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231383a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060400160019182825151036201737f578262017268835162004cef565b51511062017325576201727b906201e110565b15620065c75782916000935b620172955750505050600090565b815184101562017190576000835b620172bd575b50620172b6839462004cdf565b9362017287565b939291620172cc825162004cef565b51518510156201731c576001600160a01b0380620172eb868462004d46565b511690620172ff876200743f865162004cef565b51161462016c4d576201731483949562004cdf565b9092620172a3565b919293620172a9565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3231393a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231393a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90916020809101906001938483515103620175cb5784620173fb845162004cef565b51510362017571576201740e906201e110565b9190911562016f9a57849315620174cf576000935b62017432575050505050600090565b8151841015620174c95784936001600160a01b03908162017454828662004d46565b5116600052611f4080845260409060ff82600020541662017485575b50506201747e915062004cdf565b9362017423565b8293620174956002948862004d46565b511660005284526000200154620174b16200680d865162004cef565b5114620174c15780388062017470565b505050505090565b62016f9a565b6000935b620174e2575050505050600090565b8151841015620174c95784936001600160a01b03908162017504828662004d46565b5116600052613ef880845260409060ff82600020541662017535575b50506201752e915062004cdf565b93620174d3565b8293620175456002948862004d46565b511660005284526000200154620175616200680d865162004cef565b5114620174c15780388062017520565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b62017630816201e110565b91909115620065cf57815115620065cf57600090815b835181101562017689576001600160a01b038062017665838762004d46565b5116908351160362017682576201767c9062004cdf565b62017646565b5050905090565b50505050600190565b6201769d816201e110565b91909115620065cf57815115620065cf5760005b8251811015620065c7576001600160a01b0380620176d0838662004d46565b51169083511614620065b457620176e79062004cdf565b620176b1565b906040016001918282515103620177e057826201770b835162004cef565b51510362017786576201771e906201e199565b15620065c757829160009182945b6201773957505050905090565b805185101562016c55576001600160a01b038062017758878462004d46565b5116906201776b6200680d855162004cef565b51160362016c4d576201777f849562004cdf565b946201772c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3232333a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232333a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017988578262017858835162004cef565b5151106201792e576201786b906201e199565b15620065c757600091835b620178815750505090565b815183101562016e0d57600080855b620178b0575b501562016d8657620178a9849362004cdf565b9262017876565b620178c18396949295965162004cef565b515181101562017923576001600160a01b0380620178e0888562004d46565b511690620178f4836200743f875162004cef565b5116146201791657906201790a84939262004cdf565b90939594919262017890565b5091809493503862017896565b949390929462017896565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3232343a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232343a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910190600193848351510362017b9f578462017a04845162004cef565b51510362017b455762017a17906201e199565b1562016f9a5784931562017ab5576000935b62017a35575050505090565b8051841015620051fe576001600160a01b038062017a54868462004d46565b5116600052611f4080845260409060ff8260002054161562016fa45760029262017a7f888662004d46565b51166000528452600020015462017a9b6200680d855162004cef565b510362016f9a5762017aae859462004cdf565b9362017a29565b6000935b62017ac5575050505090565b8051841015620051fe576001600160a01b038062017ae4868462004d46565b5116600052613ef880845260409060ff8260002054161562016fa45760029262017b0f888662004d46565b51166000528452600020015462017b2b6200680d855162004cef565b510362016f9a5762017b3e859462004cdf565b9362017ab9565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017cee578262017c17835162004cef565b51510362017c945762017c2a906201e199565b91909115620065c757600091835b62017c465750505050600090565b8051831015620171905783926001600160a01b038062017c67838562004d46565b51169062017c7a6200680d865162004cef565b511614620051c45762017c8d9062004cdf565b9262017c38565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3232363a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232363a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017e7d578262017d66835162004cef565b51511062017e235762017d79906201e199565b15620065c75782916000935b62017d935750505050600090565b815184101562017190576000835b62017dbb575b5062017db4839462004cdf565b9362017d85565b93929162017dca825162004cef565b515185101562017e1a576001600160a01b038062017de9868462004d46565b51169062017dfd876200743f865162004cef565b51161462016c4d5762017e1283949562004cdf565b909262017da1565b91929362017da7565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3232373a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232373a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90916020809101906001938483515103620180bb578462017ef9845162004cef565b515103620180615762017f0c906201e199565b9190911562016f9a5784931562017fbf576000935b62017f30575050505050600090565b8151841015620174c95784936001600160a01b03908162017f52828662004d46565b5116600052611f4080845260409060ff82600020541662017f83575b505062017f7c915062004cdf565b9362017f21565b829362017f936002948862004d46565b51166000528452600020015462017faf6200680d865162004cef565b5114620174c15780388062017f6e565b6000935b62017fd2575050505050600090565b8151841015620174c95784936001600160a01b03908162017ff4828662004d46565b5116600052613ef880845260409060ff82600020541662018025575b50506201801e915062004cdf565b9362017fc3565b8293620180356002948862004d46565b511660005284526000200154620180516200680d865162004cef565b5114620174c15780388062018010565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b62018120816201e199565b91909115620065cf57815115620065cf57600090815b835181101562017689576001600160a01b038062018155838762004d46565b5116908351160362017682576201816c9062004cdf565b62018136565b6201817d816201e199565b91909115620065cf57815115620065cf5760005b8251811015620065c7576001600160a01b0380620181b0838662004d46565b51169083511614620065b457620181c79062004cdf565b62018191565b906020016001918282515103620182b65782620181eb835162004cef565b5151036201825c57620181fe906201e1d2565b905015620065c757829160009182945b6201821b57505050905090565b805185101562016c555762018231858262004d46565b51620182426200680d845162004cef565b510362016c4d5762018255849562004cdf565b946201820e565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201845457826201832e835162004cef565b515110620183fa5762018341906201e1d2565b905015620065c757600091835b620183595750505090565b815183101562016e0d57600080855b62018388575b501562016d865762018381849362004cdf565b926201834e565b620183998396949295965162004cef565b5151811015620183ef57620183af868362004d46565b51620183c1826200743f865162004cef565b5114620183e25790620183d684939262004cdf565b90939594919262018368565b509180949350386201836e565b94939092946201836e565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3233323a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620185c9576002620184cd835162004cef565b5151036201856f57620184e0906201e1d2565b905091909115620065c757829160009182945b6201850057505050905090565b815185101562016c555762018516858362004d46565b51620185276200680d835162004cef565b5111801562018549575b62016c4d5762018542849562004cdf565b94620184f3565b5062018556858362004d46565b5162018567620169f0835162004cef565b511062018531565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201870d578262018641835162004cef565b515103620186b35762018654906201e1d2565b905015620065c757829160009182945b6201867157505050905090565b805185101562016c555762018687858262004d46565b51620186986200680d845162004cef565b51101562016c4d57620186ac849562004cdf565b9462018664565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018851578262018785835162004cef565b515103620187f75762018798906201e1d2565b905015620065c757829160009182945b620187b557505050905090565b805185101562016c5557620187cb858262004d46565b51620187dc6200680d845162004cef565b51111562016c4d57620187f0849562004cdf565b94620187a8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201899a5782620188c9835162004cef565b5151036201894057620188dc906201e1d2565b9093915015620065c7578060009384925b62018906575b5050506200680d620167cc915162004cef565b909193815185101562018939576200e870620189309162018928878562004d46565b519062006200565b919081620188ed565b93620188f3565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018adb578262018a12835162004cef565b51510362018a815762018a25906201e1d2565b9093915015620065c7578060009384925b62018a4f575b5050506200680d620168cd915162004cef565b909193815185101562018a7a576200e87062018a719162018928878562004d46565b91908162018a36565b9362018a3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600190818351510362018c1e57600262018b55845162004cef565b51510362018bc45762018b68906201e1d2565b90915015620065c757906000918183925b62018b92575b505050620169cd6200680d835162004cef565b909192825184101562018bbd576200647f62018bb49162018928868662004d46565b91908062018b79565b9262018b7f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233383a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018d5f578262018c96835162004cef565b51510362018d055762018ca9906201e1d2565b9093915015620065c7578060009384925b62018cd3575b5050506200680d62016afb915162004cef565b909193815185101562018cfe576200e87062018cf59162018928878562004d46565b91908162018cba565b9362018cc0565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233393a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018ea3578262018dd7835162004cef565b51510362018e495762018dea906201e1d2565b9092915015620065c757600091835b62018e075750505050600090565b805183101562017190578262018e1f85948362004d46565b5162018e306200680d855162004cef565b5110620051c45762018e429062004cdf565b9262018df9565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018fe7578262018f1b835162004cef565b51510362018f8d5762018f2e906201e1d2565b9291921562016d8657600092845b62018f4b575050505050600090565b8051841015620174c9578362018f6386958462004d46565b5162018f746200680d865162004cef565b5111620174c15762018f869062004cdf565b9362018f3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201915c57600262019060835162004cef565b515103620191025762019073906201e1d2565b929091921562016d8657600092845b62019091575050505050600090565b8051841015620174c95783620190a986958562004d46565b51620190ba6200680d855162004cef565b51111580620190db575b620174c157620190d49062004cdf565b9362019082565b50620190e8818562004d46565b51620190f9620169f0855162004cef565b511015620190c4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620192a05782620191d4835162004cef565b5151036201924657620191e7906201e1d2565b9291921562016d8657600092845b62019204575050505050600090565b8051841015620174c957836201921c86958462004d46565b516201922d6200680d865162004cef565b5114620174c1576201923f9062004cdf565b93620191f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620193e5578262019318835162004cef565b5151036201938b576201932b906201e1d2565b905091909115620065c757600091835b620193495750505050600090565b80518310156201719057826201936185948362004d46565b51620193726200680d855162004cef565b5110620051c457620193849062004cdf565b926201933b565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201952a57826201945d835162004cef565b515103620194d05762019470906201e1d2565b905091909115620065c757600091835b6201948e5750505050600090565b8051831015620171905782620194a685948362004d46565b51620194b76200680d855162004cef565b5111620051c457620194c99062004cdf565b9262019480565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201969c576002620195a3835162004cef565b5151036201964257620195b6906201e1d2565b905015620065c757600091835b620195d15750505050600090565b8151831015620171905782620195e985948462004d46565b51620195fa6200680d845162004cef565b511115806201961b575b620051c457620196149062004cdf565b92620195c3565b5062019628818462004d46565b5162019639620169f0845162004cef565b51101562019604565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620197e1578262019714835162004cef565b515103620197875762019727906201e1d2565b905091909115620065c757600091835b620197455750505050600090565b80518310156201719057826201975d85948362004d46565b516201976e6200680d855162004cef565b5114620051c457620197809062004cdf565b9262019737565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362019966578262019859835162004cef565b5151106201990c576201986c906201e1d2565b905015620065c75782916000935b620198885750505050600090565b815184101562017190576000835b620198b0575b50620198a9839462004cdf565b936201987a565b939291620198bf825162004cef565b51518510156201990357620198d5848262004d46565b51620198e7866200743f855162004cef565b511462016c4d57620198fb83949562004cdf565b909262019896565b9192936201989c565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3234383a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910190600193848351510362019c665784620199e2845162004cef565b51511062019c0c57620199f5906201e199565b9290921562016f9a5784931562019b09576000935b62019a16575050505090565b8251841015620051fe576001600160a01b038062019a35868662004d46565b5116600052611f40808452604060ff8160002054161562016fa457879160009384935b62019a7b575b505050501562016f9a5762019a74859462004cdf565b9362019a0a565b9092989591939662019a8e865162004cef565b51518a101562019afd578162019aa58a8362004d46565b5116600052838352600285600020015462019ac68b6200743f895162004cef565b511462019aea5762019adb8798999a62004cdf565b93919097999894929662019a58565b9650509396505050843880808062019a5e565b96938296995062019a5e565b6000935b62019b19575050505090565b8251841015620051fe576001600160a01b038062019b38868662004d46565b5116600052613ef8808452604060ff8160002054161562016fa457879160009384935b62019b7e575b505050501562016f9a5762019b77859462004cdf565b9362019b0d565b9092989591939662019b91865162004cef565b51518a101562019c00578162019ba88a8362004d46565b5116600052838352600285600020015462019bc98b6200743f895162004cef565b511462019bed5762019bde8798999a62004cdf565b93919097999894929662019b5b565b9650509396505050843880808062019b61565b96938296995062019b61565b60405162461bcd60e51b815260048101839052603e60248201527f43452049445f3234393a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3234393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6020809301600192838251510362019f53578362019cdf835162004cef565b51511062019ef95762019cf2906201e199565b9490941562016f9a5783921562019e045793926000905b62019d18575050505050600090565b8351811015620174c9576001600160a01b038062019d37838762004d46565b5116600052611f4080875260409160ff83600020541662019d6d575b5050509362019d6483949562004cdf565b90949362019d09565b6000929190865b62019d81575b5062019d53565b90929791939662019d93865162004cef565b515189101562019df9578162019daa898362004d46565b5116600052838352600285600020015462019dcb8a6200743f895162004cef565b511462019ded5762019ddf87989962004cdf565b939190979894929862019d74565b50505050505091505090565b969382985062019d7a565b93926000905b62019e19575050505050600090565b8351811015620174c9576001600160a01b038062019e38838762004d46565b5116600052613ef880875260409160ff83600020541662019e6e575b5050509362019e6583949562004cdf565b90949362019e0a565b6000929190865b62019e82575b5062019e54565b90929791939662019e94865162004cef565b515189101562019eee578162019eab898362004d46565b5116600052838352600285600020015462019ecc8a6200743f895162004cef565b511462019ded5762019ee087989962004cdf565b939190979894929862019e75565b969382985062019e7b565b60405162461bcd60e51b815260048101869052603e60248201527f43452049445f3235303a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3235303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a253578462019fcf845162004cef565b5151106201a1f95762019fe2906201e110565b9290921562016f9a578493156201a0f6576000935b6201a003575050505090565b8251841015620051fe576001600160a01b03806201a022868662004d46565b5116600052611f40808452604060ff8160002054161562016fa457879160009384935b6201a068575b505050501562016f9a576201a061859462004cdf565b9362019ff7565b909298959193966201a07b865162004cef565b51518a10156201a0ea57816201a0928a8362004d46565b511660005283835260028560002001546201a0b38b6200743f895162004cef565b51146201a0d7576201a0c88798999a62004cdf565b9391909799989492966201a045565b965050939650505084388080806201a04b565b9693829699506201a04b565b6000935b6201a106575050505090565b8251841015620051fe576001600160a01b03806201a125868662004d46565b5116600052613ef8808452604060ff8160002054161562016fa457879160009384935b6201a16b575b505050501562016f9a576201a164859462004cdf565b936201a0fa565b909298959193966201a17e865162004cef565b51518a10156201a1ed57816201a1958a8362004d46565b511660005283835260028560002001546201a1b68b6200743f895162004cef565b51146201a1da576201a1cb8798999a62004cdf565b9391909799989492966201a148565b965050939650505084388080806201a14e565b9693829699506201a14e565b60405162461bcd60e51b815260048101839052603e60248201527f43452049445f3235313a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b602080930160019283825151036201a53457836201a2cc835162004cef565b5151106201a4da576201a2df906201e110565b9490941562016f9a578392156201a3e55793926000905b6201a305575050505050600090565b8351811015620174c9576001600160a01b03806201a324838762004d46565b5116600052611f4080875260409160ff8360002054166201a35a575b505050936201a35183949562004cdf565b9094936201a2f6565b6000929190865b6201a36e575b506201a340565b9092979193966201a380865162004cef565b51518910156201a3da57816201a397898362004d46565b511660005283835260028560002001546201a3b88a6200743f895162004cef565b511462019ded576201a3cc87989962004cdf565b93919097989492986201a361565b96938298506201a367565b93926000905b6201a3fa575050505050600090565b8351811015620174c9576001600160a01b03806201a419838762004d46565b5116600052613ef880875260409160ff8360002054166201a44f575b505050936201a44683949562004cdf565b9094936201a3eb565b6000929190865b6201a463575b506201a435565b9092979193966201a475865162004cef565b51518910156201a4cf57816201a48c898362004d46565b511660005283835260028560002001546201a4ad8a6200743f895162004cef565b511462019ded576201a4c187989962004cdf565b93919097989492986201a456565b96938298506201a45c565b60405162461bcd60e51b815260048101869052603e60248201527f43452049445f3235323a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3235323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a6fd57846201a5b0845162004cef565b5151036201a6a3576201a5c3906201e110565b1562016f9a578493156201a63a576000935b6201a5e1575050505090565b8051841015620051fe576001600160a01b036201a5ff858362004d46565b5116600052611f4582526040600020546201a61f6200680d855162004cef565b51101562016f9a576201a633859462004cdf565b936201a5d5565b6000935b6201a64a575050505090565b8051841015620051fe576001600160a01b036201a668858362004d46565b5116600052613efd82526040600020546201a6886200680d855162004cef565b51101562016f9a576201a69c859462004cdf565b936201a63e565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a8c657846201a779845162004cef565b5151036201a86c576201a78c906201e110565b1562016f9a578493156201a803576000935b6201a7aa575050505090565b8051841015620051fe576001600160a01b036201a7c8858362004d46565b5116600052611f4582526040600020546201a7e86200680d855162004cef565b51111562016f9a576201a7fc859462004cdf565b936201a79e565b6000935b6201a813575050505090565b8051841015620051fe576001600160a01b036201a831858362004d46565b5116600052613efd82526040600020546201a8516200680d855162004cef565b51111562016f9a576201a865859462004cdf565b936201a807565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910160019384825151036201ab1c5760026201a942835162004cef565b5151036201aac2576201a955906201e110565b9290921562016f9a578493156201aa14576000935b6201a976575050505090565b8251841015620051fe576001600160a01b03806201a995868662004d46565b5116600052611f4580835260409081600020546201a9b86200680d875162004cef565b51119283156201a9de575b50505062016f9a576201a9d7859462004cdf565b936201a96a565b909192506201a9ee878762004d46565b51166000528252600020546201aa09620169f0845162004cef565b51103880806201a9c3565b6000935b6201aa24575050505090565b8251841015620051fe576001600160a01b03806201aa43868662004d46565b5116600052613efd80835260409081600020546201aa666200680d875162004cef565b51119283156201aa8c575b50505062016f9a576201aa85859462004cdf565b936201aa18565b909192506201aa9c878762004d46565b51166000528252600020546201aab7620169f0845162004cef565b51103880806201aa71565b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3235353a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052602e60248201527f43452049445f3235353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201ace357846201ab98845162004cef565b5151036201ac89576201abab906201e110565b1562016f9a578493156201ac21576000935b6201abc9575050505090565b8051841015620051fe576001600160a01b036201abe7858362004d46565b5116600052611f4582526040600020546201ac076200680d855162004cef565b510362016f9a576201ac1a859462004cdf565b936201abbd565b6000935b6201ac31575050505090565b8051841015620051fe576001600160a01b036201ac4f858362004d46565b5116600052613efd82526040600020546201ac6f6200680d855162004cef565b510362016f9a576201ac82859462004cdf565b936201ac25565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201aec457846201ad5f845162004cef565b5151036201ae6a576201ad72906201e110565b1562016f9a578493156201adfd5760009182945b6201ad97575b505050505050600090565b81518510156201adf75785946001600160a01b036201adb7828562004d46565b51168452611f45825260408420546201add56200680d875162004cef565b51106201adee576201ade79062004cdf565b946201ad86565b50505050505090565b6201ad8c565b60009182945b6201ae1357505050505050600090565b81518510156201adf75785946001600160a01b036201ae33828562004d46565b51168452613efd825260408420546201ae516200680d875162004cef565b51106201adee576201ae639062004cdf565b946201ae03565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201b09557846201af40845162004cef565b5151036201b03b576201af53906201e110565b1562016f9a578493156201afce5760009182945b6201af7757505050505050600090565b81518510156201adf75785946001600160a01b036201af97828562004d46565b51168452611f45825260408420546201afb56200680d875162004cef565b51116201adee576201afc79062004cdf565b946201af67565b60009182945b6201afe457505050505050600090565b81518510156201adf75785946001600160a01b036201b004828562004d46565b51168452613efd825260408420546201b0226200680d875162004cef565b51116201adee576201b0349062004cdf565b946201afd4565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910160019384825151036201b2f55760026201b111835162004cef565b5151036201b29b576201b124906201e110565b9190911562016f9a578493156201b1e8576000935b6201b148575050505050600090565b8151841015620174c95784936001600160a01b03806201b169838662004d46565b5116600052611f4580865260409081600020546201b18c6200680d875162004cef565b51111592836201b1b1575b505050620174c1576201b1aa9062004cdf565b936201b139565b909192506201b1c1848762004d46565b51166000528552600020546201b1dc620169f0845162004cef565b5110153880806201b197565b6000935b6201b1fb575050505050600090565b8151841015620174c95784936001600160a01b03806201b21c838662004d46565b5116600052613efd80865260409081600020546201b23f6200680d875162004cef565b51111592836201b264575b505050620174c1576201b25d9062004cdf565b936201b1ec565b909192506201b274848762004d46565b51166000528552600020546201b28f620169f0845162004cef565b5110153880806201b24a565b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3235393a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052602e60248201527f43452049445f3235393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201b4cc57836201b36e845162004cef565b5151036201b47257156201b3f7576201b387906201e110565b15620065c757829160009182945b6201b3a257505050905090565b805185101562016c55576201b3cc6001600160a01b036201b3c4878462004d46565b51166201b583565b6201b3dc6200680d845162004cef565b51101562016c4d576201b3f0849562004cdf565b946201b395565b6201b402906201e110565b15620065c757829160009182945b6201b41d57505050905090565b805185101562016c55576201b4476001600160a01b036201b43f878462004d46565b51166201b526565b6201b4576200680d845162004cef565b51101562016c4d576201b46b849562004cdf565b946201b410565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60009081905b6103e882106201b53b57505090565b9091620081fe6201b57c916201b5758560031b60018060a01b038616600052611fbb8101602052611fb96040600020549101549062004f77565b9062006200565b906201b52c565b60009081905b6103e882106201b59857505090565b9091620081fe6201b5d0916201b575600386811b9060018060a01b038716600052810160205260016040600020549101549062004f77565b906201b589565b600091906201b632576000905b6103e882106201b5f357505090565b9091620081fe6201b62b916201b575600386811b9060018060a01b038716600052810160205260016040600020549101549062004f77565b906201b5e4565b81905b6103e882106201b64457505090565b9091620081fe6201b67e916201b5758560031b60018060a01b038616600052611fbb8101602052611fb96040600020549101549062004f77565b906201b635565b916020019060019283835151036201b7f257836201b6a4845162004cef565b5151036201b79857156201b725576201b6bd906201e110565b15620065c757829160009182945b6201b6d857505050905090565b805185101562016c55576201b6fa6001600160a01b036201b3c4878462004d46565b6201b70a6200680d845162004cef565b51111562016c4d576201b71e849562004cdf565b946201b6cb565b6201b730906201e110565b15620065c757829160009182945b6201b74b57505050905090565b805185101562016c55576201b76d6001600160a01b036201b43f878462004d46565b6201b77d6200680d845162004cef565b51111562016c4d576201b791849562004cdf565b946201b73e565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201ba2a5760026201b86c845162004cef565b5151036201b9d057156201b925576201b885906201e110565b91909115620065c757829160009182945b6201b8a357505050905090565b815185101562016c55576001600160a01b036201b8c6816201b3c4888662004d46565b6201b8d66200680d845162004cef565b51119081156201b8fa575b5062016c4d576201b8f3849562004cdf565b946201b896565b6201b90c91506201b3c4878562004d46565b6201b91c620169f0835162004cef565b5110386201b8e1565b6201b930906201e110565b91909115620065c757829160009182945b6201b94e57505050905090565b815185101562016c55576001600160a01b036201b971816201b43f888662004d46565b6201b9816200680d845162004cef565b51119081156201b9a5575b5062016c4d576201b99e849562004cdf565b946201b941565b6201b9b791506201b43f878562004d46565b6201b9c7620169f0835162004cef565b5110386201b98c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bbef57836201baa3845162004cef565b5151036201bb9557156201bb23576201babc906201e110565b15620065c757829160009182945b6201bad757505050905090565b805185101562016c55576201baf96001600160a01b036201b3c4878462004d46565b6201bb096200680d845162004cef565b510362016c4d576201bb1c849562004cdf565b946201baca565b6201bb2e906201e110565b15620065c757829160009182945b6201bb4957505050905090565b805185101562016c55576201bb6b6001600160a01b036201b43f878462004d46565b6201bb7b6200680d845162004cef565b510362016c4d576201bb8e849562004cdf565b946201bb3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bdb857836201bc68845162004cef565b5151036201bd5e57156201bcea576201bc81906201e110565b91909115620065c757600091835b6201bc9d5750505050600090565b8051831015620171905783926201bcc16001600160a01b036201b3c4838562004d46565b6201bcd16200680d855162004cef565b5110620051c4576201bce39062004cdf565b926201bc8f565b6201bcf5906201e110565b91909115620065c757600091835b6201bd115750505050600090565b8051831015620171905783926201bd356001600160a01b036201b43f838562004d46565b6201bd456200680d855162004cef565b5110620051c4576201bd579062004cdf565b926201bd03565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bf8157836201be31845162004cef565b5151036201bf2757156201beb3576201be4a906201e110565b91909115620065c757600091835b6201be665750505050600090565b8051831015620171905783926201be8a6001600160a01b036201b3c4838562004d46565b6201be9a6200680d855162004cef565b5111620051c4576201beac9062004cdf565b926201be58565b6201bebe906201e110565b91909115620065c757600091835b6201beda5750505050600090565b8051831015620171905783926201befe6001600160a01b036201b43f838562004d46565b6201bf0e6200680d855162004cef565b5111620051c4576201bf209062004cdf565b926201becc565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c1b35760026201bffb845162004cef565b5151036201c15957156201c0b1576201c014906201e110565b15620065c757600091835b6201c02d5750505050600090565b8151831015620171905783926001600160a01b036201c052816201b3c4848762004d46565b6201c0626200680d855162004cef565b51111590816201c085575b50620051c4576201c07e9062004cdf565b926201c01f565b6201c09791506201b3c4838662004d46565b6201c0a7620169f0845162004cef565b511015386201c06d565b6201c0bc906201e110565b15620065c757600091835b6201c0d55750505050600090565b8151831015620171905783926001600160a01b036201c0fa816201b43f848762004d46565b6201c10a6200680d855162004cef565b51111590816201c12d575b50620051c4576201c1269062004cdf565b926201c0c7565b6201c13f91506201b43f838662004d46565b6201c14f620169f0845162004cef565b511015386201c115565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c38a57836201c22c845162004cef565b5151036201c33057156201c2b5576201c245906201e110565b15620065c757829160009182945b6201c26057505050905090565b805185101562016c55576201c28a6001600160a01b036201c282878462004d46565b51166201c43a565b6201c29a6200680d845162004cef565b51101562016c4d576201c2ae849562004cdf565b946201c253565b6201c2c0906201e110565b15620065c757829160009182945b6201c2db57505050905090565b805185101562016c55576201c3056001600160a01b036201c2fd878462004d46565b51166201c3e4565b6201c3156200680d845162004cef565b51101562016c4d576201c329849562004cdf565b946201c2ce565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60009081905b6103e882106201c3f957505090565b9091620081fe6201c433916201b5758560031b60018060a01b038616600052611fbb8101602052611fba6040600020549101549062004f77565b906201c3ea565b60009081905b6103e882106201c44f57505090565b9091620081fe6201c487916201b575600386811b9060018060a01b038716600052810160205260026040600020549101549062004f77565b906201c440565b600091906201c4e9576000905b6103e882106201c4aa57505090565b9091620081fe6201c4e2916201b575600386811b9060018060a01b038716600052810160205260026040600020549101549062004f77565b906201c49b565b81905b6103e882106201c4fb57505090565b9091620081fe6201c535916201b5758560031b60018060a01b038616600052611fbb8101602052611fba6040600020549101549062004f77565b906201c4ec565b916020019060019283835151036201c6a957836201c55b845162004cef565b5151036201c64f57156201c5dc576201c574906201e110565b15620065c757829160009182945b6201c58f57505050905090565b805185101562016c55576201c5b16001600160a01b036201c282878462004d46565b6201c5c16200680d845162004cef565b51111562016c4d576201c5d5849562004cdf565b946201c582565b6201c5e7906201e110565b15620065c757829160009182945b6201c60257505050905090565b805185101562016c55576201c6246001600160a01b036201c2fd878462004d46565b6201c6346200680d845162004cef565b51111562016c4d576201c648849562004cdf565b946201c5f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c8e15760026201c723845162004cef565b5151036201c88757156201c7dc576201c73c906201e110565b91909115620065c757829160009182945b6201c75a57505050905090565b815185101562016c55576001600160a01b036201c77d816201c282888662004d46565b6201c78d6200680d845162004cef565b51119081156201c7b1575b5062016c4d576201c7aa849562004cdf565b946201c74d565b6201c7c391506201c282878562004d46565b6201c7d3620169f0835162004cef565b5110386201c798565b6201c7e7906201e110565b91909115620065c757829160009182945b6201c80557505050905090565b815185101562016c55576001600160a01b036201c828816201c2fd888662004d46565b6201c8386200680d845162004cef565b51119081156201c85c575b5062016c4d576201c855849562004cdf565b946201c7f8565b6201c86e91506201c2fd878562004d46565b6201c87e620169f0835162004cef565b5110386201c843565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236393a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201caaa57836201c95a845162004cef565b5151036201ca5057156201c9dc576201c973906201e110565b91909115620065c757600091835b6201c98f5750505050600090565b8051831015620171905783926201c9b36001600160a01b036201c282838562004d46565b6201c9c36200680d855162004cef565b5110620051c4576201c9d59062004cdf565b926201c981565b6201c9e7906201e110565b91909115620065c757600091835b6201ca035750505050600090565b8051831015620171905783926201ca276001600160a01b036201c2fd838562004d46565b6201ca376200680d855162004cef565b5110620051c4576201ca499062004cdf565b926201c9f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200190600192836201cb19845162004cef565b5151036201cc735783835151036201cc1957156201cba5576201cb3c906201e110565b91909115620065c757600091835b6201cb585750505050600090565b8051831015620171905783926201cb7c6001600160a01b036201c282838562004d46565b6201cb8c6200680d855162004cef565b5111620051c4576201cb9e9062004cdf565b926201cb4a565b6201cbb0906201e110565b91909115620065c757600091835b6201cbcc5750505050600090565b8051831015620171905783926201cbf06001600160a01b036201c2fd838562004d46565b6201cc006200680d855162004cef565b5111620051c4576201cc129062004cdf565b926201cbbe565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b916020019060026201cce0835162004cef565b5151036201cea55760019283835151036201ce4b57156201cda3576201cd06906201e110565b15620065c757600091835b6201cd1f5750505050600090565b8151831015620171905783926001600160a01b036201cd44816201c282848762004d46565b6201cd546200680d855162004cef565b51111590816201cd77575b50620051c4576201cd709062004cdf565b926201cd11565b6201cd8991506201c282838662004d46565b6201cd99620169f0845162004cef565b511015386201cd5f565b6201cdae906201e110565b15620065c757600091835b6201cdc75750505050600090565b8151831015620171905783926001600160a01b036201cdec816201c2fd848762004d46565b6201cdfc6200680d855162004cef565b51111590816201ce1f575b50620051c4576201ce189062004cdf565b926201cdb9565b6201ce3191506201c2fd838662004d46565b6201ce41620169f0845162004cef565b511015386201ce07565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b919060208092019060019384835151036201d0c65760026201cf22845162004cef565b5151036201d06c57156201cfcd576201cf3b906201e110565b9290921562016d8657600092845b6201cf55575050505090565b8051841015620051fe576201cf6f6200680d845162004cef565b516103e881101562004cfd576001600160a01b036201cf8f868462004d46565b5116600052600390811b0182526040600020546201cfb2620169f0855162004cef565b51101562016f9a576201cfc6859462004cdf565b936201cf49565b6201cfd8906201e110565b9290921562016d8657600092845b6201cff2575050505090565b8051841015620051fe576201d00c6200680d845162004cef565b516103e881101562004cfd57611fbb906001600160a01b036201d030878562004d46565b511660005260031b0182526040600020546201d051620169f0855162004cef565b51101562016f9a576201d065859462004cdf565b936201cfe6565b60405162461bcd60e51b815260048101859052603160248201527f43452049445f3237333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208092019060019384835151036201d2e75760026201d143845162004cef565b5151036201d28d57156201d1ee576201d15c906201e110565b9290921562016d8657600092845b6201d176575050505090565b8051841015620051fe576201d1906200680d845162004cef565b516103e881101562004cfd576001600160a01b036201d1b0868462004d46565b5116600052600390811b0182526040600020546201d1d3620169f0855162004cef565b51111562016f9a576201d1e7859462004cdf565b936201d16a565b6201d1f9906201e110565b9290921562016d8657600092845b6201d213575050505090565b8051841015620051fe576201d22d6200680d845162004cef565b516103e881101562004cfd57611fbb906001600160a01b036201d251878562004d46565b511660005260031b0182526040600020546201d272620169f0855162004cef565b51111562016f9a576201d286859462004cdf565b936201d207565b60405162461bcd60e51b815260048101859052603160248201527f43452049445f3237343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020809101600392836201d357835162004cef565b5151036201d5e55760019485835151036201d58b57156201d482576201d37d906201e110565b9390931562016f9a57600093855b6201d39857505050505090565b80518510156201d47c576201d3b26200680d845162004cef565b516103e8908181101562004cfd576001600160a01b03908490826201d3d88a8762004d46565b5116600052811b01865260409081600020546201d3fa620169f0885162004cef565b51119283156201d420575b5050506201ad8c576201d419869562004cdf565b946201d38b565b909192506201d4346200680d875162004cef565b519081101562004cfd5784916201d44c898662004d46565b5116600052811b018552600020546201d4716201d46a855162004cef565b5162004d24565b51103880806201d405565b620174c1565b6201d490909392936201e110565b9390931562016f9a57600093855b6201d4ab57505050505090565b80518510156201d47c576201d4c56200680d845162004cef565b516103e88082101562004cfd576001600160a01b0391826201d4e8898662004d46565b5116600052611fbb8091881b01855260409182600020546201d50f620169f0895162004cef565b51119384156201d536575b505050506201ad8c576201d52f869562004cdf565b946201d49e565b90919293506201d54b6200680d885162004cef565b519182101562004cfd576201d561898662004d46565b5116600052861b018352600020546201d57f6201d46a855162004cef565b5110388080806201d51a565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237353a205468652055494e543235365f324441525241595b306044820152705d206c656e677468206973206e6f74203360781b6064820152608490fd5b919060208092019060026201d65a835162004cef565b5151036201d8135760019384835151036201d7b957156201d716576201d680906201e110565b9290921562016d8657600092845b6201d69d575050505050600090565b8051841015620174c9576201d6b76200680d845162004cef565b51936103e885101562004cfd5785946001600160a01b036201d6da838562004d46565b5116600052600390811b0183526040600020546201d6fd620169f0865162004cef565b5110620174c1576201d70f9062004cdf565b936201d68e565b6201d721906201e110565b9290921562016d8657600092845b6201d73e575050505050600090565b8051841015620174c9576201d7586200680d845162004cef565b51936103e885101562004cfd578594611fbb906001600160a01b036201d77f848662004d46565b511660005260031b0183526040600020546201d7a0620169f0865162004cef565b5110620174c1576201d7b29062004cdf565b936201d72f565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b919060208092019060026201d883835162004cef565b5151036201da3c5760019384835151036201d9e257156201d93f576201d8a9906201e110565b9290921562016d8657600092845b6201d8c6575050505050600090565b8051841015620174c9576201d8e06200680d845162004cef565b51936103e885101562004cfd5785946001600160a01b036201d903838562004d46565b5116600052600390811b0183526040600020546201d926620169f0865162004cef565b5111620174c1576201d9389062004cdf565b936201d8b7565b6201d94a906201e110565b9290921562016d8657600092845b6201d967575050505050600090565b8051841015620174c9576201d9816200680d845162004cef565b51936103e885101562004cfd578594611fbb906001600160a01b036201d9a8848662004d46565b511660005260031b0183526040600020546201d9c9620169f0865162004cef565b5111620174c1576201d9db9062004cdf565b936201d958565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b916020809101600392836201daac835162004cef565b5151036201dd3e5760019485835151036201dce457156201dbd2576201dad2906201e110565b9390931562016f9a57600093855b6201daf057505050505050600090565b80518510156201adf7576201db0a6200680d845162004cef565b51946103e8958681101562004cfd5787966001600160a01b03918590836201db33868862004d46565b5116600052811b018752604080600020546201db54620169f0895162004cef565b51111592836201db79575b5050506201adee576201db729062004cdf565b946201dae0565b91985091506201db8e6200680d875162004cef565b519788101562004cfd57889785916201dba8858762004d46565b5116600052811b018652600020546201dbc66201d46a865162004cef565b5110153880806201db5f565b6201dbe0909392936201e110565b9390931562016f9a57600093855b6201dbfe57505050505050600090565b80518510156201adf7576201dc186200680d845162004cef565b51946103e88087101562004cfd5787966001600160a01b0390816201dc3e858762004d46565b5116600052611fbb8091891b01865260409081600020546201dc65620169f08a5162004cef565b51111593846201dc8b575b505050506201adee576201dc849062004cdf565b946201dbee565b9193509198506201dca16200680d885162004cef565b519081101562004cfd5789986201dcb9858762004d46565b5116600052871b018452600020546201dcd76201d46a865162004cef565b511015388080806201dc70565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237383a205468652055494e543235365f324441525241595b306044820152705d206c656e677468206973206e6f74203360781b6064820152608490fd5b6201dda8816201df2d565b156201df24576040810190606082510151511515806201dee9575b156201ddd55750516060015151600191565b604082510151511515806201ded0575b156201ddf75750516040015151600191565b60808251015151151590816201deb6575b50156201de1a57516080015151600191565b805160c081015151156201de6157506201de3960c08251015162004cef565b51516201de4a57505b600090600090565b60c06201de5a9151015162004cef565b5151600191565b602081015151156201de795750516020015151600191565b60a0015180516201de8d575b50506201de42565b6201de989062004cef565b51516201dea657806201de85565b60a06201de5a9151015162004cef565b602091500151602681101562002a2357601014386201de08565b506020810151602681101562002a23576013146201dde5565b50602081018051602681101562002a2357600c149081156201df0d575b506201ddc3565b905051602681101562002a2357600f14386201df06565b50600090600090565b6020018051906026908183101562002a235760018093146201e10b5780518281101562002a23576002146201e10b5780518281101562002a23576003146201e10b578051908282101562002a2357600480921462016d51578051838110156201e0f65760051462016d51578051838110156201e0f65760061462016d51578051838110156201e0f65760071462016d51578051838110156201e0f65760081462016d51578051838110156201e0f65760091462016d51578051838110156201e0f657600a1462016d51578051838110156201e0f657600b1462016d51578051838110156201e0f657600c1462016d51578051838110156201e0f657600d1462016d51578051838110156201e0f657600e1462016d51578051838110156201e0f657600f1462016d51578051838110156201e0f65760101462016d51578051838110156201e0f65760111462016d51578051838110156201e0f65760121462016d51578051838110156201e0f65760131462016d51578051838110156201e0f65760141462016d51578051838110156201e0f65760151462016d515751918210156201e0e15750601e14620032d25750600090565b602190634e487b7160e01b6000525260246000fd5b602183634e487b7160e01b6000525260246000fd5b505090565b6201e11b816201df2d565b156201e18a576020810151602681101562002a23576004146201e177576040015160c0015180516201e16557506040516201e1568162002b3f565b60008152600036813790600090565b6201e1709062004cef565b5190600190565b60c060406201e170920151015162004d13565b506040516201e1568162002b3f565b6020810151602681101562002a23576004146201e1bf57506040516201e1568162002b3f565b60c060406201e170920151015162004cef565b6201e1dd816201e322565b156201e3125760208101908151916026908184101562002a235760018094146201e2f75780518281101562002a23576003146201e2f7578051908282101562002a235760048092146201e2db578051838110156201e0f6576005146201e2db578051838110156201e0f6576006146201e2db578051838110156201e0f6576014146201e2db578051838110156201e0f6576015146201e2db5751918210156201e0e15750601e146201e2bd575050604051906201e29a8262002b3f565b60008252604051916201e2ad8362002b3f565b6000835260003681379190600090565b604001916201e2d660a06200779b818651015162004cef565b519190565b505050604001916201e2d660a06200779b818651015162004cef565b5050604001916201e2d660a06200779b818651015162004cef565b50604051906201e29a8262002b3f565b6020018051906026908183101562002a235760018093146201e10b5780518281101562002a2357600214620065c75780518281101562002a23576003146201e10b578051908282101562002a2357600480921462016d51578051838110156201e0f65760141462016d51578051838110156201e0f65760151462016d51578051838110156201e0f657601e1462016d51578051838110156201e0f65760051462016d515751918210156201e0e15750600614620032d25750600090565b916101f581146201e489576101f681146201e47d576101f781146201e471576101f881146201e465576101f981146201e459576101fa81146201e44d576101fb81146201e441576101fc146201e436575050600090565b620032d2916201eeda565b50620032d2916201ed35565b50620032d2916201ebd0565b50620032d2916201ea6b565b50620032d2916201e906565b50620032d2916201e761565b50620032d2916201e5fc565b50620032d291906020019060019182815151036201e5a257826201e4ae825162004cef565b5151036201e548576020820151602681101562002a2357600203620065c757600091835b6201e4e05750505050600090565b604081019260a0936201e4f7858251015162004d24565b51518210156201e54057816200743f87966201e5169351015162004d24565b516201e5276200680d855162004cef565b5110620051c4576201e5399062004cdf565b926201e4d2565b505062016d86565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201e70757826201e61b825162004cef565b5151036201e6ad576020820151602681101562002a2357600203620065c757600091835b6201e64d5750505050600090565b604081019260a0936201e664858251015162004d24565b51518210156201e54057816200743f87966201e6839351015162004d24565b516201e6946200680d855162004cef565b5111620051c4576201e6a69062004cdf565b926201e63f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201e8ac5760026201e781825162004cef565b5151036201e852576020820151602681101562002a2357600203620065c757600091835b6201e7b35750505050600090565b604081019260a0936201e7ca858251015162004d24565b51518210156201e5405781856201e7eb826200743f8a998651015162004d24565b516201e7fc6200680d885162004cef565b51111592836201e821575b505050620051c4576201e81a9062004cdf565b926201e7a5565b5101516201e83592506200743f9062004d24565b516201e846620169f0855162004cef565b5110158138806201e807565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ea1157826201e925825162004cef565b5151036201e9b7576020820151602681101562002a2357600203620065c757600091835b6201e9575750505050600090565b604081019260a0936201e96e858251015162004d24565b51518210156201e54057816200743f87966201e98d9351015162004d24565b516201e99e6200680d855162004cef565b5114620051c4576201e9b09062004cdf565b926201e949565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201eb7657826201ea8a825162004cef565b5151036201eb1c576020820151602681101562002a2357600203620065c757600091835b6201eabc5750505050600090565b604081019260a0936201ead3858251015162004d35565b51518210156201e54057816200743f87966201eaf29351015162004d13565b516201eb036200680d855162004cef565b5110620051c4576201eb159062004cdf565b926201eaae565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ecdb57826201ebef825162004cef565b5151036201ec81576020820151602681101562002a2357600203620065c757600091835b6201ec215750505050600090565b604081019260a0936201ec38858251015162004d35565b51518210156201e54057816200743f87966201ec579351015162004d13565b516201ec686200680d855162004cef565b5111620051c4576201ec7a9062004cdf565b926201ec13565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ee805760026201ed55825162004cef565b5151036201ee26576020820151602681101562002a2357600203620065c757600091835b6201ed875750505050600090565b604081019260a0936201ed9e858251015162004d35565b51518210156201e5405781856201edbf826200743f8a998651015162004d13565b516201edd06200680d885162004cef565b51111592836201edf5575b505050620051c4576201edee9062004cdf565b926201ed79565b5101516201ee0992506200743f9062004d13565b516201ee1a620169f0855162004cef565b5110158138806201eddb565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201efe557826201eef9825162004cef565b5151036201ef8b576020820151602681101562002a2357600203620065c757600091835b6201ef2b5750505050600090565b604081019260a0936201ef42858251015162004d35565b51518210156201e54057816200743f87966201ef619351015162004d13565b516201ef726200680d855162004cef565b5114620051c4576201ef849062004cdf565b926201ef1d565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91603381036201f129575060209150016001815151036201f0d95760016201f068825162004cef565b5151036201f086576200680d6201f080915162004cef565b51421190565b60405162461bcd60e51b815260206004820152602560248201527f43452049445f35313a2055494e543235365f324441525241595b305d20697320604482015264656d70747960d81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35313a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603481036201f212575060209150016001815151036201f1c25760016201f151825162004cef565b5151036201f16f576200680d6201f169915162004cef565b51421090565b60405162461bcd60e51b815260206004820152602560248201527f43452049445f35323a2055494e543235365f324441525241595b305d20697320604482015264656d70747960d81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35323a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603581036201f324575060209150016001815151036201f2d45760026201f23a825162004cef565b5151036201f27a576201f2526200680d825162004cef565b5142101590816201f261575090565b6201f2739150620169f0905162004cef565b5142111590565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35333a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35333a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603681036201f428575060209150016001815151036201f3ce5760016201f34c825162004cef565b5151036201f37457620167cc6200680d6201f367426200621c565b5050505050925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35343a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603781036201f51f575060209150016001815151036201f4c55760016201f450825162004cef565b5151036201f46b57620168cd6200680d6201f367426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35353a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603881036201f623575060209150016001815151036201f5c95760026201f547825162004cef565b5151036201f56f576201f55a426200621c565b5050505050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603981036201f728575060209150016001815151036201f6ce5760016201f64b825162004cef565b5151036201f67457620167cc6200680d6201f666426200621c565b505050509390505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35373a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603a81036201f81f575060209150016001815151036201f7c55760016201f750825162004cef565b5151036201f76b57620168cd6200680d6201f666426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35383a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603b81036201f924575060209150016001815151036201f8ca5760026201f847825162004cef565b5151036201f870576201f85a426200621c565b505050509050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603c81036201fa29575060209150016001815151036201f9cf5760016201f94c825162004cef565b5151036201f97557620167cc6200680d6201f967426200621c565b505050949150505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36303a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603d81036201fb20575060209150016001815151036201fac65760016201fa51825162004cef565b5151036201fa6c57620168cd6200680d6201f967426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36313a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36313a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603e81036201fc25575060209150016001815151036201fbcb5760026201fb48825162004cef565b5151036201fb71576201fb5b426200621c565b505050915050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f36323a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36323a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603f81036201fd2a575060209150016001815151036201fcd05760016201fc4d825162004cef565b5151036201fc7657620167cc6200680d6201fc68426200621c565b505095925050505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36333a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36333a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6040928184036201fe20575050602001906001825151036201fdc85760016201fd54835162004cef565b5151036201fd705750620168cd6200680d6201fc68426200621c565b5162461bcd60e51b815260206004820152603060248201527f43452049445f36343a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f36343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b604182036201ff22575050602001906001825151036201feca5760026201fe48835162004cef565b5151036201fe7257506201fe5c426200621c565b505092505050620169cd6200680d835162004cef565b5162461bcd60e51b815260206004820152603160248201527f43452049445f36353a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f36353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b9092604284036201ff3a5750620032d29250620215a8565b604384036201ff505750620032d29250620217b2565b60448481036201ff68575050620032d29250620219b4565b604585036201ff7f575050620032d2925062021c31565b604685036201ff96575050620032d2925062021e33565b604785036201ffad575050620032d2925062022035565b604885036201ffc4575050620032d2925062022318565b604985036201ffdb575050620032d2925062022625565b604a85036201fff2575050620032d2925062022903565b604b850362020009575050620032d2925062022ccb565b604c850362020020575050620032d2925062022e76565b604d850362020037575050620032d2925062022f7a565b604e85036202004e575050620032d29250620230d2565b604f850362020065575050620032d2925062023253565b605085036202007c575050620032d2925062023357565b91909293605181146000146202017857505090916020019160018351510362020120576001620200ad845162004cef565b515103620200c8575050620167cc6200680d47925162004cef565b907f43452049445f38313a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38313a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605281036202026d57505090916020019160018351510362020215576001620201a2845162004cef565b515103620201bd575050620168cd6200680d47925162004cef565b907f43452049445f38323a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38323a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b60538103620203835750509091602001916001835151036202032b57600262020297845162004cef565b515103620202d357505047620202b26200680d835162004cef565b5111159081620202c0575090565b9050620169f7620169f047925162004cef565b907f43452049445f38333a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b907f43452049445f38333a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605481036202047857505090916020019160018351510362020420576001620203ad845162004cef565b515103620203c857505062016afb6200680d47925162004cef565b907f43452049445f38343a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38343a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605581036202063357506020840192600284515103620205db5760019283620204a2865162004d13565b51510362020584575090829160009586945b620204cf575b50505050506200680d620167cc915162004d13565b9091929395620204e28383015162004cef565b51518710156202057d5762020539908415620205445762009513906202051d6103e8620205158b6200743f8c5162004cef565b5110620234af565b6201b575620205328a6200743f8b5162004cef565b516200610a565b9392919083620204b4565b6200951390620205616103e8620205158b6200743f8c5162004cef565b6201b575620205768a6200743f8b5162004cef565b5162006139565b95620204ba565b7f43452049445f38353a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38353a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b60568103620207b6575060208401926002845151036202075e57600192836202065d865162004d13565b51510362020707575090829160009586945b6202068a575b50505050506200680d620168cd915162004d13565b90919293956202069d8383015162004cef565b51518710156202070057620206d8908415620206e35762009513906202051d6103e8620206d08b6200743f8c5162004cef565b511062023521565b93929190836202066f565b6200951390620205616103e8620206d08b6200743f8c5162004cef565b9562020675565b7f43452049445f38363a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38363a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b91949091605781036202097c5750602084019460028651510362020923576002620207e2875162004d13565b515103620208cb5750600092835b620207fe8287015162004cef565b51518510156202089157906202085685620207fe93898760001462020860576103e862020839620092e0946200743f62020841945162004cef565b511062023593565b6201b57562020532896200743f8d5162004cef565b94909150620207f0565b6103e862020839620092e0946200743f6202087c945162004cef565b6201b57562020576896200743f8d5162004cef565b93505093925050620208a86200680d835162004d13565b518110159182620208b857505090565b620169f7919250620169f0905162004d13565b6084907f43452049445f38373a20414444524553535f324441525241595b305d206d757385519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f38373a20414444524553535f32444152524159206d757374206885519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b909491906058810362020b335750602084019260028451510362020adb5760019283620209aa865162004d13565b51510362020a84575090829160009586945b620209d65750505050506200680d620167cc915162004d13565b9091929395620209e98383015162004cef565b51518710156202057d5762020a4090841562020a4b57620095139062020a246103e862020a1c8b6200743f8c5162004cef565b511062023605565b6201b57562020a398a6200743f8b5162004cef565b5162005e1c565b9392919083620209bc565b620095139062020a686103e862020a1c8b6200743f8c5162004cef565b6201b57562020a7d8a6200743f8b5162004cef565b5162005e52565b7f43452049445f38383a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38383a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b6059810362020cae5750602084019260028451510362020c56576001928362020b5d865162004d13565b51510362020bff575090829160009586945b62020b895750505050506200680d620168cd915162004d13565b909192939562020b9c8383015162004cef565b5151871015620207005762020bd790841562020be257620095139062020a246103e862020bcf8b6200743f8c5162004cef565b511062023677565b939291908362020b6f565b620095139062020a686103e862020bcf8b6200743f8c5162004cef565b7f43452049445f38393a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38393a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b91949091605a810362020e3a5750602084019460028651510362020de157600262020cda875162004d13565b51510362020d895750600092835b62020cf68287015162004cef565b515185101562020891579062020d4e8562020cf693898760001462020d58576103e862020d31620092e0946200743f62020d39945162004cef565b5110620236e9565b6201b57562020a39896200743f8d5162004cef565b9490915062020ce8565b6103e862020d31620092e0946200743f62020d74945162004cef565b6201b57562020a7d896200743f8d5162004cef565b6084907f43452049445f39303a20414444524553535f324441525241595b305d206d757385519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f39303a20414444524553535f32444152524159206d757374206885519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b90949190605b8103620210135750602084019260028451510362020fbb576001928362020e68865162004d13565b51510362020f64575090829160009586945b62020e945750505050506200680d620167cc915162004d13565b909192939562020ea78383015162004cef565b51518710156202057d57831562020f17576103e862020ed98162020ed18a6200743f8b5162004cef565b51106202375b565b62020eea886200743f895162004cef565b519081101562004cfd5762020f0c916006620095139260031b01549062006200565b939291908362020e7a565b6103e862020f308162020ed18a6200743f8b5162004cef565b62020f41886200743f895162004cef565b519081101562004cfd5762020f0c91611fbe620095139260031b01549062006200565b7f43452049445f39313a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39313a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b605c8103620211e8575060208401926002845151036202119057600192836202103d865162004d13565b51510362021139575090829160009586945b620210695750505050506200680d620168cd915162004d13565b90919293956202107c8383015162004cef565b515187101562020700578315620210ec576103e8620210ae81620210a68a6200743f8b5162004cef565b5110620237cd565b620210bf886200743f895162004cef565b519081101562004cfd57620210e1916006620095139260031b01549062006200565b93929190836202104f565b6103e86202110581620210a68a6200743f8b5162004cef565b62021116886200743f895162004cef565b519081101562004cfd57620210e191611fbe620095139260031b01549062006200565b7f43452049445f39323a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39323a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b605d81969293949614600014620213c8575060208401926002845151036202136f57600262021218855162004d13565b515103620213175750600080955b620212348187015162004cef565b515187101562021300578315620212ae576103e89162021267836202125f8a6200743f8a5162004cef565b51106202383f565b62021278886200743f885162004cef565b519283101562004cfd576202129e620212a5916006620212349560031b01549062006200565b9762004cdf565b96915062021226565b6103e891620212c8836202125f8a6200743f8a5162004cef565b620212d9886200743f885162004cef565b519283101562004cfd576202129e620212a591611fbe620212349560031b01549062006200565b50929350935050620208a86200680d835162004d13565b6084907f43452049445f39333a20414444524553535f324441525241595b305d206d757387519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f39333a20414444524553535f32444152524159206d757374206887519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b9094929190605e0362016d86576020840192600284515103620215505760019283620213f5865162004d13565b515103620214f9575090829160009586945b62021422575b50505050506200680d62016afb915162004d13565b9091929395620214358383015162004cef565b5151871015620214f2578315620214a5576103e862021467816202145f8a6200743f8b5162004cef565b5110620238b1565b62021478886200743f895162004cef565b519081101562004cfd576202149a916006620095139260031b01549062006200565b939291908362021407565b6103e8620214be816202145f8a6200743f8b5162004cef565b620214cf886200743f895162004cef565b519081101562004cfd576202149a91611fbe620095139260031b01549062006200565b956202140d565b7f43452049445f39343a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39343a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b90604081019060018251510362021758576001620215c7835162004cef565b515103620216fe5760200191600183515103620216a4576001620215ec845162004cef565b5151036202164a571562021626576200680d6202161e620167cc926201b3c46200680d60018060a01b03925162004cef565b925162004cef565b6200680d6202161e620167cc926201b43f6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36363a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36363a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36363a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b9060408101906001825151036202195a576001620217d1835162004cef565b515103620219005760200191600183515103620218a6576001620217f6845162004cef565b5151036202184c571562021828576200680d6202161e620168cd926201b3c46200680d60018060a01b03925162004cef565b6200680d6202161e620168cd926201b43f6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36373a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36373a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36373a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b604082019160018351510362021bd7576001620219d2845162004cef565b51510362021b7d576020019060018251510362021b23576002620219f7835162004cef565b51510362021ac9571562021a6d5760018060a01b0362021a21816201b3c46200680d865162004cef565b62021a316200680d845162004cef565b511115928362021a415750505090565b62021a61929350620169f0916201b3c46200680d6202161e935162004cef565b51101538808062016d51565b60018060a01b0362021a89816201b43f6200680d865162004cef565b62021a996200680d845162004cef565b511115928362021aa95750505090565b62021a61929350620169f0916201b43f6200680d6202161e935162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f36383a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36383a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36383a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90604081019060018251510362021dd957600162021c50835162004cef565b51510362021d7f576020019160018351510362021d2557600162021c75845162004cef565b51510362021ccb571562021ca7576200680d6202161e620167cc926201c2826200680d60018060a01b03925162004cef565b6200680d6202161e620167cc926201c2fd6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36393a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36393a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36393a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90604081019060018251510362021fdb57600162021e52835162004cef565b51510362021f81576020019160018351510362021f2757600162021e77845162004cef565b51510362021ecd571562021ea9576200680d6202161e620168cd926201c2826200680d60018060a01b03925162004cef565b6200680d6202161e620168cd926201c2fd6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37303a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37303a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37303a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60408201916001835151036202224c57600162022053845162004cef565b515103620221f257602001906001825151036202219857600262022078835162004cef565b5151036202213e5715620220e25760018060a01b03620220a2816201c2826200680d865162004cef565b620220b26200680d845162004cef565b5111159283620220c25750505090565b62021a61929350620169f0916201c2826200680d6202161e935162004cef565b60018060a01b03620220fe816201c2fd6200680d865162004cef565b6202210e6200680d845162004cef565b51111592836202211e5750505090565b62021a61929350620169f0916201c2fd6200680d6202161e935162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f37313a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37313a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37313a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37313a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620222ae57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37323a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b906040808201916001835151036202255a57600162022338845162004cef565b515103620225015760200192600184515103620224a85760026202235d855162004cef565b5151036202244f5715620223e0576103e8906202238c82620223846200680d875162004cef565b5110620222a6565b6202239c6200680d855162004cef565b519182101562004cfd576003620169f092620167cc94620223c96200680d60018060a01b03925162004cef565b5116600052811b0160205260002054925162004cef565b6103e890620223f982620223846200680d875162004cef565b620224096200680d855162004cef565b519182101562004cfd57611fbb620169f092620167cc94620224376200680d60018060a01b03925162004cef565b511660005260031b0160205260002054925162004cef565b815162461bcd60e51b815260206004820152603160248201527f43452049445f37323a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37323a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37323a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37323a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620225bb57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37333a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b906040808201916001835151036202283857600162022645845162004cef565b515103620227df5760200192600184515103620227865760026202266a855162004cef565b5151036202272d5715620226d6576103e8906202269982620226916200680d875162004cef565b5110620225b3565b620226a96200680d855162004cef565b519182101562004cfd576003620169f092620168cd94620223c96200680d60018060a01b03925162004cef565b6103e890620226ef82620226916200680d875162004cef565b620226ff6200680d855162004cef565b519182101562004cfd57611fbb620169f092620168cd94620224376200680d60018060a01b03925162004cef565b815162461bcd60e51b815260206004820152603160248201527f43452049445f37333a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37333a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37333a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37333a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b156202289957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37343a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b9060408082019260018451510362022c7257600162022923855162004cef565b51510362022c195760208093019260018451510362022bc157600391826202294c865162004cef565b51510362022b63571562022a5f576103e8916202297b83620229736200680d885162004cef565b511062022891565b6202298b6200680d865162004cef565b51928084101562004cfd5760018060a01b038281620229af6200680d8b5162004cef565b5116956000968752811b01845285852054620229d0620169f0895162004cef565b5111159788620229e6575b505050505050505090565b909192939495969750620229ff6200680d895162004cef565b519283101562022a4b57916201d46a95939162022a276200680d62022a3a9997955162004cef565b51168452811b0190522054925162004cef565b5110153880808080808080620229db565b634e487b7160e01b86526032600452602486fd5b6103e862022a7781620229736200680d885162004cef565b62022a876200680d865162004cef565b51908082101562004cfd5760018060a01b03938462022aab6200680d8a5162004cef565b5116946000958652611fbb8094831b0185528686205462022ad1620169f08a5162004cef565b511115988962022ae8575b50505050505050505090565b9091929394959697985062022b026200680d8a5162004cef565b519384101562022b4f579162022b3d9795939162022b2b6200680d6201d46a9997955162004cef565b511685521b0190522054925162004cef565b51101538808080808080808062022adc565b634e487b7160e01b87526032600452602487fd5b835162461bcd60e51b815260048101839052603160248201527f43452049445f37343a2055494e543235365f324441525241595b305d206d7573604482015270742068617665203320656c656d656e747360781b6064820152608490fd5b60849083519062461bcd60e51b82526004820152602d60248201527f43452049445f37343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37343a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37343a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b906020019060018251510362022d7557600162022ce9835162004cef565b51510362022d1b571562022d0957620167cc6200680d6202161e62022e38565b620167cc6200680d6202161e62022dcf565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37353a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6000805b6103e8811062022de1575090565b908160031b60ff611fbf820154161562022e325762022e1f62022e2c9262022e17611fb962022e2594015462005e438762005fe5565b9290620060a1565b62006200565b9162004cdf565b62022dd3565b50905090565b6000805b6103e8811062022e4a575090565b9060ff60078360031b015416156200619f5762022e2562022e70916201b575846200610a565b62022e3c565b906020019060018251510362022f2057600162022e94835162004cef565b51510362022ec6571562022eb457620168cd6200680d6202161e62022e38565b620168cd6200680d6202161e62022dcf565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37363a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202307857600262022f98835162004cef565b5151036202301e571562022fe25762022fb062022e38565b62022fc06200680d835162004cef565b511115908162022fce575090565b9050620169f7620169f06202161e62022e38565b62022fec62022dcf565b62022ffc6200680d835162004cef565b51111590816202300a575090565b9050620169f7620169f06202161e62022dcf565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f37373a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202317c576001620230f0835162004cef565b5151036202312257156202311057620167cc6200680d6202161e62023215565b620167cc6200680d6202161e620231d6565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37383a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6000805b6103e88110620231e8575090565b9060ff611fbf8360031b015416156200619f5762022e256202320f916201b5758462005e52565b620231da565b6000805b6103e8811062023227575090565b9060ff60078360031b015416156200619f5762022e256202324d916201b5758462005e1c565b62023219565b9060200190600182515103620232fd57600162023271835162004cef565b515103620232a357156202329157620168cd6200680d6202161e62023215565b620168cd6200680d6202161e620231d6565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37393a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202345557600262023375835162004cef565b515103620233fb5715620233bf576202338d62023215565b6202339d6200680d835162004cef565b5111159081620233ab575090565b9050620169f7620169f06202161e62023215565b620233c9620231d6565b620233d96200680d835162004cef565b5111159081620233e7575090565b9050620169f7620169f06202161e620231d6565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f38303a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f38303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620234b757565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38353a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202352957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38363a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202359b57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38373a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202360d57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38383a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202367f57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38393a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620236f157565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39303a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202376357565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39313a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620237d557565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39323a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202384757565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39333a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620238b957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39343a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b9161019181146202398b5761019281146202397f576101938114620239735761019681146202396757610197146202395c575050600090565b620032d29162023ec1565b50620032d29162023ddc565b50620032d29162023c37565b50620032d29162023af6565b50620032d2919060200190600191828151510362023a9c5782620239b0825162004cef565b51510362023a42576020820151602681101562002a2357600a03620065c757600091835b620239e25750505050600090565b604081019260a093620239f9858251015162004cef565b51518210156201e54057816200743f879662023a189351015162004cef565b5162023a296200680d855162004cef565b5114620051c45762023a3b9062004cdf565b92620239d4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3430313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600191828151510362023bdd576020820151602681101562002a2357600a03620065c75782916000935b62023b335750505050600090565b6040810160a062023b48818351015162004cef565b51518610156201e54057906000855b62023b73575b50505062023b6c839462004cdf565b9362023b25565b62023b7f855162004cef565b515181101562023bd75762023b9d876200743f858551015162004cef565b5162023baf826200743f885162004cef565b511462023bcd579062023bc486939262004cdf565b90919262023b57565b5050505050905090565b62023b5d565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430323a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600191828151510362023d8257600262023c57825162004cef565b51510362023d28576020820151602681101562002a2357600a03620065c757600091835b62023c895750505050600090565b604081019260a09362023ca0858251015162004cef565b51518210156201e54057818562023cc1826200743f8a998651015162004cef565b5162023cd26200680d885162004cef565b511115928362023cf7575b505050620051c45762023cf09062004cdf565b9262023c7b565b51015162023d0b92506200743f9062004cef565b5162023d1c620169f0855162004cef565b51101581388062023cdd565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3430333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b600191828151510362023e68576020820151602681101562002a2357600b03620065c757600091835b62023e135750505050600090565b60408101515192835181101562023e615762023e4a62023e3582879662004d46565b5162023e42855162004cef565b51906203358c565b620051c45762023e5a9062004cdf565b9262023e05565b5062016d86565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3430363a2054686520535452494e475f4152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b600191828151510362023f46576020820151602681101562002a2357600b03620065c757600091835b62023ef85750505050600090565b60408101515192835181101562023e615762023f2f62023f1a82879662004d46565b5162023f27855162004cef565b519062006518565b620051c45762023f3f9062004cdf565b9262023eea565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3430373a2054686520535452494e475f4152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b916097811462023fc35760981462023fb8575050600090565b620032d291620240d4565b50602001805151620032d29290600019016202407b57600162023fe7835162004cef565b515103620240215760200151602681101562002a23576200680d6202161e620240109262033353565b51146202401c57600090565b600190565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3135313a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3135313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b919091602080930160019182825151036202415b57938293946000935b62024100575050505050600090565b6202410c835162004cef565b5151841015620174c9578181015193602685101562002a235762024131869562033353565b62024142826200743f875162004cef565b5114620174c157620241549062004cdf565b93620240f1565b60405162461bcd60e51b815260048101869052602b60248201527f43452049445f3135323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b926102bd8114620242b7576102be8114620242ab576102bf81146202429f576102c0811462024293576102c1811462024287576102c281146202427b576102c381146202426f576102c4811462024263576102c5811462024257576102c681146202424b576102c781146202423f576102c8146202423457505050600090565b620032d292620254dc565b50620032d292620252e1565b50620032d292620250dc565b50620032d29262024e6c565b50620032d29262024c67565b50620032d29262024a58565b50620032d29262024939565b50620032d29262024812565b50620032d292620246eb565b50620032d29262024591565b50620032d2926202443d565b50620032d292620242d4565b606482101562004cfd570190600090565b91602080910192600184515103620243e3576001620242f4855162004cef565b51510362024389571562024350576202161e62024342620167cc936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b90620242c3565b90549060031b1c426200620e565b6202161e62024342620167cc936202433b620076a16200680d9560018060a01b03845116600052613f0181526040600020930162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91602080910192600184515103620245375760016202445d855162004cef565b515103620244dd5715620244a4576202161e62024342620168cd936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b6202161e62024342620168cd936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160208091019260018451510362024691576002620245b1855162004cef565b515103620246375715620246035781516001600160a01b03166000908152611f49825260409020620245f39262024342926202433b91620076a1910162007387565b620169cd6200680d835162004cef565b81516001600160a01b03166000908152611f49825260409020620245f39262024342926202433b91620076a1910162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620247b857600162024709845162004cef565b5151036202475e57156202474c57620076a1602062024729920162007387565b606481101562004cfd576200680d6202161e620167cc92611f4b0154426200620e565b620076a1602062024729920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620248df57600162024830845162004cef565b5151036202488557156202487357620076a1602062024850920162007387565b606481101562004cfd576200680d6202161e620168cd92611f4b0154426200620e565b620076a1602062024850920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620249fe57600262024957845162004cef565b515103620249a457156202499257620076a1602062024977920162007387565b606481101562004cfd57620245f390611f4b0154426200620e565b620076a1602062024977920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909291604093848201600193848251510362024c0e578462024a7b835162004cef565b51510362024bb5579584959660001462024b27576000945b62024aa357505050505050600090565b62024aaf825162004cef565b51518510156201adf757859460018060a01b0362024ad3826200743f865162004cef565b51166000526020611f49815262024b0e6200680d62024b0462024342866000206202433b620076a1878c0162007387565b9288015162004cef565b51106201adee5762024b209062004cdf565b9462024a93565b6000945b62024b3b57505050505050600090565b62024b47825162004cef565b51518510156201adf757859460018060a01b0362024b6b826200743f865162004cef565b51166000526020611f49815262024b9c6200680d62024b0462024342866000206202433b620076a1878c0162007387565b51106201adee5762024bae9062004cdf565b9462024b2b565b865162461bcd60e51b815260206004820152603160248201527f43452049445f3730373a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b865162461bcd60e51b815260206004820152602e60248201527f43452049445f3730373a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909291604093848201600193848251510362024e13578462024c8a835162004cef565b51510362024dba579584959660001462024d2c576000945b62024cb257505050505050600090565b62024cbe825162004cef565b51518510156201adf757859460018060a01b0362024ce2826200743f865162004cef565b51166000526020611f49815262024d136200680d62024b0462024342866000206202433b620076a1878c0162007387565b51116201adee5762024d259062004cdf565b9462024ca2565b6000945b62024d4057505050505050600090565b62024d4c825162004cef565b51518510156201adf757859460018060a01b0362024d70826200743f865162004cef565b51166000526020611f49815262024da16200680d62024b0462024342866000206202433b620076a1878c0162007387565b51116201adee5762024db39062004cdf565b9462024d30565b865162461bcd60e51b815260206004820152603160248201527f43452049445f3730383a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b865162461bcd60e51b815260206004820152602e60248201527f43452049445f3730383a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b929160408082019260019384815151036202508357600262024e8f825162004cef565b5151036202502a5784959660001462024f66576000945b62024eb657505050505050600090565b62024ec2815162004cef565b51518510156201adf757859460018060a01b0362024ee6826200743f855162004cef565b51166000526020611f49815262024f0f62024342866000206202433b620076a185890162007387565b9086019062024f236200680d835162004cef565b51811015918262024f48575b50506201adee5762024f419062004cdf565b9462024ea6565b62024f5b919250620169f0905162004cef565b511015388062024f2f565b6000945b62024f7a57505050505050600090565b62024f86815162004cef565b51518510156201adf757859460018060a01b0362024faa826200743f855162004cef565b51166000526020611f49815262024fd362024342866000206202433b620076a185890162007387565b9086019062024fe76200680d835162004cef565b5181101591826202500c575b50506201adee57620250059062004cdf565b9462024f6a565b6202501f919250620169f0905162004cef565b511015388062024ff3565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3730393a2054686520414444524553535f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3730393a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b92916040808201926001938481515103620252885784620250fe825162004cef565b5151036202522f57849596600014620251a5576000945b6202512257505050505090565b6202512e815162004cef565b51518510156201d47c5760018060a01b0362025150866200743f845162004cef565b51166000526020611f4981526202518b6200680d6202518162024342876000206202433b620076a1878a0162007387565b9287015162004cef565b51116201ad8c576202519e869562004cdf565b9462025115565b6000945b620251b657505050505090565b620251c2815162004cef565b51518510156201d47c5760018060a01b03620251e4866200743f845162004cef565b51166000526020611f498152620252156200680d6202518162024342876000206202433b620076a1878a0162007387565b51116201ad8c5762025228869562004cdf565b94620251a9565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731303a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731303a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9291604080820192600193848151510362025483578462025303825162004cef565b5151036202542a57849596600014620253a0576000945b6202532757505050505090565b62025333815162004cef565b51518510156201d47c5760018060a01b0362025355866200743f845162004cef565b51166000526020611f498152620253866200680d6202518162024342876000206202433b620076a1878a0162007387565b51106201ad8c5762025399869562004cdf565b946202531a565b6000945b620253b157505050505090565b620253bd815162004cef565b51518510156201d47c5760018060a01b03620253df866200743f845162004cef565b51166000526020611f498152620254106200680d6202518162024342876000206202433b620076a1878a0162007387565b51106201ad8c5762025423869562004cdf565b94620253a4565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731313a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731313a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b92916040808201926001938481515103620256e9576002620254ff825162004cef565b5151036202569057849596600014620255d1576000945b6202552357505050505090565b6202552f815162004cef565b51518510156201d47c5760018060a01b0362025551866200743f845162004cef565b51166000526020611f4981526202557a62024342856000206202433b620076a185880162007387565b908501906202558e6200680d835162004cef565b518110918215620255b4575b50506201ad8c57620255ad869562004cdf565b9462025516565b620255c7919250620169f0905162004cef565b511038806202559a565b6000945b620255e257505050505090565b620255ee815162004cef565b51518510156201d47c5760018060a01b0362025610866200743f845162004cef565b51166000526020613f0181526202563962024342856000206202433b620076a185880162007387565b908501906202564d6200680d835162004cef565b51811091821562025673575b50506201ad8c576202566c869562004cdf565b94620255d5565b62025686919250620169f0905162004cef565b5110388062025659565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731323a2054686520414444524553535f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731323a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6001938085036202575a5750620032d2935062025e2a565b60028103620257705750620032d2935062025f14565b600381036202587a575050906040019180835151036202581e5762025796835162004cef565b515103620257bf57620257b96200680d60018060a01b0380935116935162004cef565b51161490565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f333a20414444524553535f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f333a20414444524553535f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b60049080820362025893575050620032d2935062026059565b60058103620258aa575050620032d293506202619e565b60068103620258c1575050620032d29350620262e3565b60078103620258d8575050620032d293506202651f565b60088103620258ef575050620032d293506202677d565b6009810362025906575050620032d29350620269bd565b600a81036202591d575050620032d2935062026bf1565b600b810362025934575050620032d2935062026ef3565b600c81036202594b575050620032d293506202711f565b600d810362025962575050620032d293506202736f565b600e810362025979575050620032d2935062027568565b600f810362025990575050620032d29350620278b8565b60108103620259a7575050620032d2935062027ab1565b60118103620259be575050620032d2935062027bd1565b60128103620259d5575050620032d2935062027cf1565b60138103620259ec575050620032d2935062027e87565b6014810362025a03575050620032d2935062027fa7565b6015810362025a1a575050620032d29350620280c7565b6019810362025a31575050620032d2935062028250565b601a810362025a48575050620032d2935062028388565b601b810362025a5f575050620032d29350620284c0565b601c8195929394951460001462025ba2575060200193808551510362025b495762025a8b855162004cef565b51510362025af057506000901562025aca5750516001600160a01b03166000908152611f47602052604090205490620167cc906200680d905162004cef565b90516001600160a01b03168152613eff602052604090205490620167cc906200680d9081565b60849060206040519162461bcd60e51b8352820152603260248201527f43452049445f32383a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152fd5b60405162461bcd60e51b8152602081840152602f60248201527f43452049445f32383a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b601d810362025cdd575060200193808551510362025c845762025bc6855162004cef565b51510362025c2b57506000901562025c055750516001600160a01b03166000908152611f47602052604090205490620168cd906200680d905162004cef565b90516001600160a01b03168152613eff602052604090205490620168cd906200680d9081565b60849060206040519162461bcd60e51b8352820152603260248201527f43452049445f32393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152fd5b60405162461bcd60e51b8152602081840152602f60248201527f43452049445f32393a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b601e810362025e0f5750602001938451510362025db657600262025d02855162004cef565b51510362025d5d57506000901562025d3f5750516001600160a01b03166000908152611f476020526040902054620169cd6200680d835162004cef565b90516001600160a01b03168152613eff6020526040902054620245f3565b60849060206040519162461bcd60e51b8352820152603360248201527f43452049445f33303a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152fd5b60849060206040519162461bcd60e51b8352820152602f60248201527f43452049445f33303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152fd5b9294509291601f14159050620065c757620032d2926202862f565b91909160018251510362025ebb571562025e8757620032d29160018060a01b03905116600052611f406020526200116462025e8162025e726001604060002001935162004cef565b51926040519283809262002cb6565b6203358c565b620032d29160018060a01b03905116600052613ef86020526200116462025e8162025e726001604060002001935162004cef565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f313a20535452494e475f4152524159206d75737420686176652060448201526a1bdb9948195b195b595b9d60aa1b6064820152608490fd5b916020019160018351510362025ffd57600162025f32845162004cef565b51510362025f9e571562025f6f57516001600160a01b03166000908152611f406020526040902060020154905162016afb906200680d9062004cef565b516001600160a01b03166000908152613ef86020526040902060020154905162016afb906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f323a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f323a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b91602001916001835151036202614257600162026077845162004cef565b515103620260e35715620260b457516001600160a01b03166000908152611f4060205260409020600201549051620167cc906200680d9062004cef565b516001600160a01b03166000908152613ef860205260409020600201549051620167cc906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f343a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f343a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b916020019160018351510362026287576001620261bc845162004cef565b515103620262285715620261f957516001600160a01b03166000908152611f4060205260409020600201549051620168cd906200680d9062004cef565b516001600160a01b03166000908152613ef860205260409020600201549051620168cd906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f353a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f353a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b9091602080910191600183515103620264c357600262026304845162004cef565b51510362026463576202631c6200680d845162004cef565b516202632d620169f0855162004cef565b5110620263dd5715620263ae5760018060a01b039081845116600052611f4091828252600260406000200154620263696200680d865162004cef565b51111594856202637b57505050505090565b909192939450511660005252620263a0620169f0600260406000200154925162004cef565b5110153880808080620174c1565b60018060a01b039081845116600052613ef891828252600260406000200154620263696200680d865162004cef565b60405162461bcd60e51b815260048101839052605260248201527f43452049445f363a2055494e543235365f324441525241595b305d5b305d206d60448201527f757374206265206c657373207468616e206f7220657175616c20746f2055494e606482015271543235365f324441525241595b305d5b315d60701b608482015260a490fd5b60405162461bcd60e51b815260048101839052603260248201527f43452049445f363a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f363a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b9092919260208094019060019283835151036202669e5762026542835162004cef565b515115620266365794839495600014620265c6576000935b62026569575050505050600090565b62026575835162004cef565b5151841015620174c957849360018060a01b03835116600052611f408252600260406000200154620265ad826200743f875162004cef565b5114620174c157620265bf9062004cdf565b936202655a565b6000935b620265d9575050505050600090565b620265e5835162004cef565b5151841015620174c957849360018060a01b03835116600052613ef882526002604060002001546202661d826200743f875162004cef565b5114620174c1576202662f9062004cdf565b93620265ca565b60405162461bcd60e51b815260048101879052603a60248201527f43452049445f373a2055494e543235365f324441525241595b305d206d757374604482015279081a185d9948185d081b19585cdd081bdb9948195b195b595b9d60321b6064820152608490fd5b60405162461bcd60e51b815260048101879052602e60248201527f43452049445f373a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b156202670257565b60405162461bcd60e51b815260206004820152605860248201527f43452049445f383a2055494e543235365f324441525241595b305d5b305d2028604482015260008051602062033a8c833981519152606482015277081d1a19481b195b99dd1a081bd9881d1bdad95b931a5cdd60421b608482015260a490fd5b9160200191600183515103620268de5760026202679b845162004cef565b5151036202687e5780156202686157620267c96103e8620267c16200680d865162004cef565b5110620266fa565b156202681757620267df6200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b01602052620167cc620169f0604060002054925162004cef565b620268276200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b01602052620167cc620169f0604060002054925162004cef565b620268786103e8620267c16200680d865162004cef565b620267c9565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f383a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f383a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b156202694257565b60405162461bcd60e51b815260206004820152605860248201527f43452049445f393a2055494e543235365f324441525241595b305d5b305d2028604482015260008051602062033a8c833981519152606482015277081d1a19481b195b99dd1a081bd9881d1bdad95b931a5cdd60421b608482015260a490fd5b916020019160018351510362026b1e576002620269db845162004cef565b51510362026abe57801562026aa15762026a096103e862026a016200680d865162004cef565b51106202693a565b1562026a575762026a1f6200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b01602052620168cd620169f0604060002054925162004cef565b62026a676200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b01602052620168cd620169f0604060002054925162004cef565b62026ab86103e862026a016200680d865162004cef565b62026a09565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f393a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f393a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b1562026b8257565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31303a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b91909160208092019160018351510362026e23576003918262026c15855162004cef565b51510362026dc057801562026da35762026c436103e862026c3b6200680d875162004cef565b511062026b7a565b1562026cfe5762026c596200680d845162004cef565b51916103e88084101562004cfd5785516001600160a01b03908116600090815294831b830184526040852054865162026c9790620169f09062004cef565b511115968762026cac575b5050505050505090565b909192939495965062026cc46200680d885162004cef565b519283101562022a4b5751168452811b0190526040902054905162026cee906201d46a9062004cef565b5110153880808080808062026ca2565b62026d0e6200680d845162004cef565b516103e88082101562004cfd5760018060a01b039384875116946000958652611fbb8094831b018552604086205462026d4c620169f0895162004cef565b511115978862026d6157505050505050505090565b90919293949596975062026d7a6200680d895162004cef565b519384101562022b4f57511685521b0190526040902054905162022a3a906201d46a9062004cef565b62026dba6103e862026c3b6200680d875162004cef565b62026c43565b60405162461bcd60e51b815260048101839052603560248201527f43452049445f31303a2055494e543235365f324441525241595b305d206d757360448201527474206861766520746872656520656c656d656e747360581b6064820152608490fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f31303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152fd5b1562026e8457565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31313a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b91602001916001835151036202704e57600262026f11845162004cef565b51510362026ff457801562026fd75762026f3f6103e862026f376200680d865162004cef565b511062026e7c565b1562026f8d5762026f556200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b0160205262016afb620169f0604060002054925162004cef565b62026f9d6200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b0160205262016afb620169f0604060002054925162004cef565b62026fee6103e862026f376200680d865162004cef565b62026f3f565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31313a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31313a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b15620270b057565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31323a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b9160200191600183515103620273155760026202713d845162004cef565b515103620272bb5780156202729e576202716b6103e8620271636200680d865162004cef565b5110620270a8565b156202721057620271816200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620271d56200680d855162004cef565b5191821015620014ce57506202161e620167cc926006620169f09360031b015490620050d4565b634e487b7160e01b81526011600452602490fd5b620272206200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc57620272766200680d855162004cef565b5191821015620014ce57506202161e620167cc92611fbe620169f09360031b015490620050d4565b620272b56103e8620271636200680d865162004cef565b6202716b565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31323a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31323a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202750e5760026202738d845162004cef565b515103620274b457156202742657620273ab6200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620273ff6200680d855162004cef565b5191821015620014ce57506202161e620168cd926006620169f09360031b015490620050d4565b620274366200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc576202748c6200680d855162004cef565b5191821015620014ce57506202161e620168cd92611fbe620169f09360031b015490620050d4565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31333a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31333a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b906020809301916001835151036202785e57600262027588845162004cef565b515103620278045715620276c857620275a66200680d835162004cef565b516103e8908181101562004cfd5760018060a01b03948584511693600094855260038093811b0182526040852054606481029080820460641490151715620276b457620275f86200680d885162004cef565b518581101562022b4f57841b600601546202761391620050d4565b62027623620169f0885162004cef565b511115968762027637575050505050505090565b90919293949596506202764f6200680d885162004cef565b51918583101562022b4f5751168552821b8201905260408320546064808202949180159086049091141715620271fc576202768f6200680d865162004cef565b5192831015620014ce57501b6006015462026cee916201d46a916202161e91620050d4565b634e487b7160e01b86526011600452602486fd5b620276d86200680d835162004cef565b51906103e88083101562004cfd5760018060a01b039485835116936000948552611fbb809160031b018252604085205493606485029480860460641490151715620276b4576202772d6200680d885162004cef565b51948486101562022b4f576202774e90611fbe809760031b015490620050d4565b6202775e620169f0895162004cef565b51111597886202777357505050505050505090565b9091929394959697506202778c6200680d895162004cef565b519185831015620277f0575116865260031b019052604083205492606484029380850460641490151715620271fc57620277cb6200680d865162004cef565b5191821015620014ce575060031b015462022a3a916201d46a916202161e91620050d4565b634e487b7160e01b88526032600452602488fd5b60405162461bcd60e51b815260048101859052603360248201527f43452049445f31343a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602f60248201527f43452049445f31343a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027a57576002620278d6845162004cef565b515103620279fd57156202796f57620278f46200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620279486200680d855162004cef565b5191821015620014ce57506202161e62016afb926006620169f09360031b015490620050d4565b6202797f6200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc57620279d56200680d855162004cef565b5191821015620014ce57506202161e62016afb92611fbe620169f09360031b015490620050d4565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31353a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31353a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027b7757600162027acf845162004cef565b51510362027b1d57801562027afd576202161e6200680d91620167cc9360018060a01b03905116906201b5d7565b5051620167cc906200680d906202161e906001600160a01b03166201b583565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31363a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027c9757600162027bef845162004cef565b51510362027c3d57801562027c1d576202161e6200680d91620168cd9360018060a01b03905116906201b5d7565b5051620168cd906200680d906202161e906001600160a01b03166201b583565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31373a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31373a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b90916020019060018251510362027e2d57600262027d10835162004cef565b51510362027dd357801562027d815782516001600160a01b039062027d38908216836201b5d7565b62027d486200680d855162004cef565b511115938462027d59575050505090565b62027d74939450916202161e91620169f0935116906201b5d7565b51101538808080620051c4565b5081516001600160a01b039062027d9a9082166201b583565b62027daa6200680d845162004cef565b511115928362027dba5750505090565b62021a61929350620169f0916202161e9151166201b583565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31383a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31383a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027f4d57600162027ea5845162004cef565b51510362027ef357801562027ed3576202161e6200680d91620167cc9360018060a01b03905116906201c48e565b5051620167cc906200680d906202161e906001600160a01b03166201c43a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31393a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202806d57600162027fc5845162004cef565b5151036202801357801562027ff3576202161e6200680d91620168cd9360018060a01b03905116906201c48e565b5051620168cd906200680d906202161e906001600160a01b03166201c43a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32303a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b909160200190600182515103620281f6576002620280e6835162004cef565b5151036202819c5780156202814a5782516001600160a01b03906202810e908216836201c48e565b6202811e6200680d855162004cef565b51111593846202812f575050505090565b62027d74939450916202161e91620169f0935116906201c48e565b5081516001600160a01b0390620281639082166201c43a565b620281736200680d845162004cef565b5111159283620281835750505090565b62021a61929350620169f0916202161e9151166201c43a565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f32313a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32313a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202832e5760016202826e845162004cef565b515103620282d45715620282a857516001600160a01b03166000908152611f4560205260409020549051620167cc906200680d9062004cef565b516001600160a01b03166000908152613efd60205260409020549051620167cc906200680d9062004cef565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32353a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32353a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362028466576001620283a6845162004cef565b5151036202840c5715620283e057516001600160a01b03166000908152611f4560205260409020549051620168cd906200680d9062004cef565b516001600160a01b03166000908152613efd60205260409020549051620168cd906200680d9062004cef565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32363a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b9091602080910191600183515103620285d5576002620284e1845162004cef565b5151036202857b57156202854f5760018060a01b039081845116600052611f45918282526040600020546202851b6200680d865162004cef565b51111594856202852d57505050505090565b909192939450511660005252620263a0620169f0604060002054925162004cef565b60018060a01b039081845116600052613efd918282526040600020546202851b6200680d865162004cef565b60405162461bcd60e51b815260048101839052603360248201527f43452049445f32373a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f32373a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b909160400160019283825151036202870b57839215620286aa576000925b6202865b5750505050600090565b62028667825162004cef565b51518310156201719057839260018060a01b03808351169062028690836200743f875162004cef565b511614620051c457620286a39062004cdf565b926202864d565b6000925b620286bc5750505050600090565b620286c8825162004cef565b51518310156201719057839260018060a01b038083511690620286f1836200743f875162004cef565b511614620051c457620287049062004cdf565b92620286ae565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f33313a20414444524553535f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b9161012d8114620289f85761012e8114620289ec5761012f8114620289e0576101308114620289d4576101318114620289c8576101328114620289bc576101338114620289b0576101348114620289a4576101358114620289985761013681146202898c5761013781146202898057610138811462028974576101398114620289685761013a81146202895c5761013b8114620289505761013c8114620289445761013d8114620289375761013e81146202892a5761013f81146202891d5761014081146202891057610141811462028904576101428114620288f8576101438114620288ec576101448114620288e0576101458114620288d4576101468114620288c8576101478114620288bc576101738114620288af576101748114620288a3576101751462028898575050600090565b620032d2916202b213565b50620032d2916202b050565b5050620032d2906202aff4565b50620032d2916202aea6565b50620032d2916202ab5c565b50620032d2916202a9e2565b50620032d2916202a861565b50620032d2916202a69c565b50620032d2916202a53a565b50620032d2916202a3bf565b5050620032d2906202a2b8565b5050620032d2906202a1a3565b5050620032d2906202a0a1565b5050620032d29062029f99565b50620032d29162029e18565b50620032d29162029c97565b50620032d29162029b14565b50620032d29162029991565b50620032d29162029810565b50620032d2916202968f565b50620032d2916202950c565b50620032d29162029389565b50620032d2916202924a565b50620032d2916202910b565b50620032d29162028fe6565b50620032d29162028ec2565b50620032d29162028d84565b50620032d29162028c46565b50620032d29162028b22565b50620032d2919060200190600191828151510362028ac9576020820151602681101562002a2357600d03620065c75762028a3383926202b3bf565b6000935b62028a455750505050600090565b62028a51825162004cef565b515184101562017190576000835b62028a79575b5062028a72839462004cdf565b9362028a37565b939291815185101562028ac05762028a97846200743f835162004cef565b5162028aa4868462004d46565b511462016c4d5762028ab883949562004cdf565b909262028a5f565b91929362028a65565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028bed576020820151602681101562002a2357600d03620065c75762028b5783926202b3bf565b6000935b62028b695750505050600090565b62028b75825162004cef565b515184101562017190576000835b62028b9d575b5062028b96839462004cdf565b9362028b5b565b939291815185101562028be45762028bbb846200743f835162004cef565b5162028bc8868462004d46565b511462016c4d5762028bdc83949562004cdf565b909262028b83565b91929362028b89565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028d2b576020820151602681101562002a2357600d03620065c75762028c7b83926202b3bf565b6000925b62028c8a5750505090565b62028c96825162004cef565b515183101562016e0d57600080855b62028cc5575b501562016d865762028cbe849362004cdf565b9262028c7f565b8295939194955181101562028d205762028ce5866200743f845162004cef565b5162028cf2828562004d46565b511462028d13579062028d0784939262004cdf565b90939594919262028ca5565b5091809493503862028cab565b949390929462028cab565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330333a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028e69576020820151602681101562002a2357600d03620065c75762028db983926202b3bf565b6000925b62028dc85750505090565b62028dd4825162004cef565b515183101562016e0d57600080855b62028e03575b501562016d865762028dfc849362004cdf565b9262028dbd565b8295939194955181101562028e5e5762028e23866200743f845162004cef565b5162028e30828562004d46565b511462028e51579062028e4584939262004cdf565b90939594919262028de3565b5091809493503862028de9565b949390929462028de9565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330343a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028f8d576020820151602681101562002a2357600e03620065c75762028ef783926202b3bf565b6000935b62028f095750505050600090565b62028f15825162004cef565b515184101562017190576000835b62028f3d575b5062028f36839462004cdf565b9362028efb565b939291815185101562028f845762028f5b846200743f835162004cef565b5162028f68868462004d46565b511462016c4d5762028f7c83949562004cdf565b909262028f23565b91929362028f29565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330353a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90602001906001918281515103620290b1576020820151602681101562002a2357600e03620065c7576202901b83926202b3bf565b6000935b6202902d5750505050600090565b62029039825162004cef565b515184101562017190576000835b62029061575b506202905a839462004cdf565b936202901f565b9392918151851015620290a8576202907f846200743f835162004cef565b516202908c868462004d46565b511462016c4d57620290a083949562004cdf565b909262029047565b9192936202904d565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620291f0576020820151602681101562002a2357600e03620065c7576202914083926202b3bf565b6000925b6202914f5750505090565b6202915b825162004cef565b515183101562016e0d57600080855b6202918a575b501562016d865762029183849362004cdf565b9262029144565b82959391949551811015620291e557620291aa866200743f845162004cef565b51620291b7828562004d46565b5114620291d85790620291cc84939262004cdf565b9093959491926202916a565b5091809493503862029170565b949390929462029170565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330373a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202932f576020820151602681101562002a2357600e03620065c7576202927f83926202b3bf565b6000925b6202928e5750505090565b6202929a825162004cef565b515183101562016e0d57600080855b620292c9575b501562016d8657620292c2849362004cdf565b9262029283565b829593919495518110156202932457620292e9866200743f845162004cef565b51620292f6828562004d46565b51146202931757906202930b84939262004cdf565b909395949192620292a9565b50918094935038620292af565b9493909294620292af565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330383a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620294b2576002620293a9825162004cef565b51510362029458576020820151602681101562002a2357600d03620065c757620293d483926202b3bf565b906000925b620293e75750505050600090565b8151831015620171905782620293ff85948462004d46565b51620294106200680d845162004cef565b5111158062029431575b620051c4576202942a9062004cdf565b92620293d9565b506202943e818462004d46565b516202944f620169f0845162004cef565b5110156202941a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3330393a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330393a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620296355760026202952c825162004cef565b515103620295db576020820151602681101562002a2357600d03620065c7576202955783926202b3bf565b906000925b6202956a5750505050600090565b81518310156201719057826202958285948462004d46565b51620295936200680d845162004cef565b51111580620295b4575b620051c457620295ad9062004cdf565b926202955c565b50620295c1818462004d46565b51620295d2620169f0845162004cef565b5110156202959d565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331303a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331303a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620297b6576002620296af825162004cef565b5151036202975c576020820151602681101562002a2357600d03620065c757620296da83926202b3bf565b60009182945b620296ed57505050905090565b815185101562016c555762029703858362004d46565b51620297146200680d835162004cef565b5111801562029736575b62016c4d576202972f849562004cdf565b94620296e0565b5062029743858362004d46565b5162029754620169f0835162004cef565b51106202971e565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331313a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331313a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202993757600262029830825162004cef565b515103620298dd576020820151602681101562002a2357600d03620065c7576202985b83926202b3bf565b60009182945b6202986e57505050905090565b815185101562016c555762029884858362004d46565b51620298956200680d835162004cef565b51118015620298b7575b62016c4d57620298b0849562004cdf565b9462029861565b50620298c4858362004d46565b51620298d5620169f0835162004cef565b51106202989f565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331323a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029aba576002620299b1825162004cef565b51510362029a60576020820151602681101562002a2357600e03620065c757620299dc83926202b3bf565b906000925b620299ef5750505050600090565b815183101562017190578262029a0785948462004d46565b5162029a186200680d845162004cef565b5111158062029a39575b620051c45762029a329062004cdf565b92620299e1565b5062029a46818462004d46565b5162029a57620169f0845162004cef565b51101562029a22565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331333a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331333a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029c3d57600262029b34825162004cef565b51510362029be3576020820151602681101562002a2357600e03620065c75762029b5f83926202b3bf565b906000925b62029b725750505050600090565b815183101562017190578262029b8a85948462004d46565b5162029b9b6200680d845162004cef565b5111158062029bbc575b620051c45762029bb59062004cdf565b9262029b64565b5062029bc9818462004d46565b5162029bda620169f0845162004cef565b51101562029ba5565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331343a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331343a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029dbe57600262029cb7825162004cef565b51510362029d64576020820151602681101562002a2357600e03620065c75762029ce283926202b3bf565b60009182945b62029cf557505050905090565b815185101562016c555762029d0b858362004d46565b5162029d1c6200680d835162004cef565b5111801562029d3e575b62016c4d5762029d37849562004cdf565b9462029ce8565b5062029d4b858362004d46565b5162029d5c620169f0835162004cef565b511062029d26565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331353a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331353a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029f3f57600262029e38825162004cef565b51510362029ee5576020820151602681101562002a2357600e03620065c75762029e6383926202b3bf565b60009182945b62029e7657505050905090565b815185101562016c555762029e8c858362004d46565b5162029e9d6200680d835162004cef565b5111801562029ebf575b62016c4d5762029eb8849562004cdf565b9462029e69565b5062029ecc858362004d46565b5162029edd620169f0835162004cef565b511062029ea7565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331363a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b6020808201908151602681101562002a2357600d1480156202a08b575b6202a03d57508051602681101562002a2357600f149081156202a026575b5062029fe05750600090565b6000805b606060408401510151805182101562017689576202a0058260c09262004d46565b5101511562022e325760406202a01d60609262004cdf565b91505062029fe4565b905051602681101562002a2357600c143862029fd4565b60009150815b816040850151015180518210156202a081576202a0638260019262004d46565b5115150362017682576202a07960409162004cdf565b90506202a043565b5050505050600190565b508151602681101562002a2357600e1462029fb6565b6020808201908151602681101562002a2357600d1480156202a18d575b6202a14957508051602681101562002a2357600f149081156202a132575b506202a0e85750600090565b6000805b6060604084015101518051821015620176895760c06202a10f8360019362004d46565b51015115151462022e325760406202a12960609262004cdf565b9150506202a0ec565b905051602681101562002a2357600c14386202a0dc565b60009150815b816040850151015180518210156202a081576202a16f8260019262004d46565b5115151462017682576202a18560409162004cdf565b90506202a14f565b508151602681101562002a2357600e146202a0be565b6020808201908151602681101562002a2357600d1480156202a2a2575b6202a25457508051602681101562002a2357600f149081156202a23d575b506202a1ea5750600090565b60005b6060604083015101518051821015620065c757819060c06202a213600193849362004d46565b5101511515146202a237575060406202a22e60609262004cdf565b9150506202a1ed565b91505090565b905051602681101562002a2357600c14386202a1de565b905060005b8160408401510151805182101562016d865781906202a27c600192839262004d46565b511515146202a29b57506202a29360409162004cdf565b90506202a259565b9250505090565b508151602681101562002a2357600e146202a1c0565b6020808201908151602681101562002a2357600d1480156202a3a9575b6202a36257508051602681101562002a2357600f149081156202a34b575b506202a2ff5750600090565b60005b6060604083015101518051821015620065c7576202a3238260c09262004d46565b510151156202a3445760406202a33b60609262004cdf565b9150506202a302565b5050600190565b905051602681101562002a2357600c14386202a2f3565b905060005b8160408401510151805182101562016d865781906202a38a600192839262004d46565b511515036202a29b57506202a3a160409162004cdf565b90506202a367565b508151602681101562002a2357600e146202a2d5565b60208092019160019283815151036202a4e0576202a3df84915162004cef565b5151036202a487578082018051602681101562002a2357600f141590816202a46f575b50620065c757600091835b6202a41b5750505050600090565b60408101926060845101519384518210156201e540576202a4566200680d60a0866202a449868b9a62004d46565b5101519351015162004cef565b5114620051c4576202a4689062004cdf565b926202a40d565b905051602681101562002a2357600c1415386202a402565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332313a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332313a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b60208092019160019283815151036202a642578183018051602681101562002a2357600f141590816202a62a575b5062016d865783926000945b6202a583575050505050600090565b6040810160608082510151518710156202a62257906000865b6202a5b8575b5050506202a5b1849562004cdf565b946202a574565b6202a5c4855162004cef565b51518110156202a61c57856202a5df89858551015162004d46565b5101516202a5f3826200743f885162004cef565b51146202a61157906202a60887939262004cdf565b9091926202a59c565b505050505050905090565b6202a5a2565b505062016f9a565b905051602681101562002a2357600c1415386202a568565b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b60208092019160019283815151036202a8075760026202a6bd825162004cef565b5151036202a7ad578183018051602681101562002a2357600f141590816202a795575b5062016d8657600092845b6202a6fa575050505050600090565b604081019360609485815101519586518310156202a78c57828691826202a723838c9b62004d46565b5101516202a7366200680d895162004cef565b51111593846202a75c575b50505050620174c1576202a7559062004cdf565b936202a6eb565b6202a76c93945051015162004d46565b5101516202a77f620169f0855162004cef565b511015848238806202a741565b50505062016f9a565b905051602681101562002a2357600c1415386202a6e0565b60405162461bcd60e51b815260048101839052603260248201527f43452049445f3332333a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332333a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b602080920160019283825151036202a98957836202a880835162004cef565b5151036202a92a578083018051602681101562002a2357600f141590816202a912575b5062016d8657600092845b6202a8bd575050505050600090565b6060604082015101519384518110156202a90b57826202a8df82889762004d46565b5101516202a8f26200680d865162004cef565b5110620174c1576202a9049062004cdf565b936202a8ae565b5062016f9a565b905051602681101562002a2357600c1415386202a8a3565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332343a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f3332343a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152fd5b602080920160019283825151036202ab0357836202aa01835162004cef565b5151036202aaa4578083018051602681101562002a2357600f141590816202aa8c575b5062016d8657600092845b6202aa3e575050505050600090565b6060604082015101519384518110156202a90b57826202aa6082889762004d46565b5101516202aa736200680d865162004cef565b5111620174c1576202aa859062004cdf565b936202aa2f565b905051602681101562002a2357600c1415386202aa24565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332353a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f3332353a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152fd5b906020019060019182815151036202ae4c57826202ab7b825162004cef565b5151036202adec57602082018051602681101562002a2357600f141590816202add4575b50620065c7576000939291825b6202abbb575b50600093505050565b60408101946060808751015180518310156202adcb576202abe1836202abe89262004d46565b5162005673565b906006918281101562002a235715806202adb2575b6202ad58576202ac166202abe184838b51015162004d46565b8281101562002a23578614806202ad98575b6202ad58576202ac416202abe184838b51015162004d46565b8281101562002a2357600280911490816202ad7d575b506202ad58576202ac716202abe184838b51015162004d46565b8281101562002a2357600380911490816202ad62575b506202ad58576202aca16202abe184838b51015162004d46565b978289101562002a23576004809914806202ad3e575b6202ad3357836202acd0926202abe19251015162004d46565b908110156202ad1e5784959650600580911490816202ad03575b50620051c4576202acfb9062004cdf565b94936202abac565b90506202ad156200680d855162004cef565b5114386202acea565b602187634e487b7160e01b6000525260246000fd5b509496505050505050565b50886202ad506200680d885162004cef565b51146202acb7565b5093955050505050565b90506202ad746200680d875162004cef565b5114386202ac87565b90506202ad8f6200680d875162004cef565b5114386202ac57565b50856202adaa6200680d875162004cef565b51146202ac28565b506202adc36200680d865162004cef565b51156202abfd565b5050506202abb2565b905051602681101562002a2357600c1415386202ab9f565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3332363a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3332363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202af9a57602082018051602681101562002a2357600f141590816202af82575b50620065c75782916000935b6202aeee5750505050600090565b6040810160608082510151518610156201e54057906000855b6202af23575b5050506202af1c839462004cdf565b936202aee0565b6202af2f855162004cef565b51518110156202af7c57826202af4a88828551015162004d46565b5101516202af5e826200743f885162004cef565b511462023bcd57906202af7386939262004cdf565b9091926202af07565b6202af0d565b905051602681101562002a2357600c1415386202aed4565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3332373a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b6020810151602681101562002a2357601303620074b25760005b60408083015101518051821015620065c757819060c06202b033600193849362004d46565b5101511515146202a23757506202b04a9062004cdf565b6202b00e565b6020918201805151600094936001939091600019016202b1b95760026202b078845162004cef565b5151036202b15f5781810151602681101562002a23576013036202b155576000959493929190835b6202b0af575b50505050909150565b604080820190808251015180518a10156202b14c578491826202b0d48c809462004d46565b5101516202b0e76200680d895162004cef565b51111593846202b11c575b505050506202b112576202b1098495969762004cdf565b9695946202b0a0565b5050509150915090565b6202b12c93945051015162004d46565b5101516202b13f620169f0855162004cef565b511015828838806202b0f2565b5050506202b0a6565b5060009450505050565b60405162461bcd60e51b815260048101839052603260248201527f43452049445f3337323a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3337323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200160019182825151036202b36457826202b231835162004cef565b5151036202b306576020810151602681101562002a2357601303620065c75782916000935b6202b2645750505050600090565b6040808301908082510151518610156201e54057906000855b6202b299575b5050506202b292839462004cdf565b936202b256565b6202b2a987848451015162004d46565b5151518110156202b300576202b2d1816202b2c989868651015162004d46565b515162004d46565b516202b2e26200680d865162004cef565b511462023bcd57906202b2f786939262004cdf565b9091926202b27d565b6202b283565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f3337333a2054686520535452494e475f324441525241595b305d60448201526f206c656e677468206973206e6f74203160801b6064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f3337333a2054686520535452494e475f32444152524159206c6560448201526c6e677468206973206e6f74203160981b6064820152608490fd5b6020908181018051602681101562002a2357600d149081156202b4da575b506202b3ff5750506040516202b3f38162002b3f565b60008152600036813790565b6040019160a0916202b4216202b419848651015162004cef565b515162004e62565b93600092835b6202b436868451015162004cef565b51518110156202b493576202b45081858551015162004d46565b516202b46e575b6202b4666202b4369162004cdf565b90506202b427565b936202b4666202b489828762001ac76202b436958c62004d46565b959150506202b457565b50935050506202b4a38162004e62565b9060005b8181106202b4b6575090925050565b806202b4c76202b4d4928762004d46565b5162001ac7828662004d46565b6202b4a7565b905051602681101562002a2357600e14386202b3dd565b9161025981146202b86d5761025a81146202b77d5761025b81146202b68d5761025c81146202b5775761025d81146202b56b5761025e81146202b55f5761025f81146202b55357610260146202b548575050600090565b620032d2916202bd2b565b50620032d2916202bbb1565b50620032d2916202baa0565b50620032d2916202b95d565b50602001906001825151036202b6335760026202b595835162004cef565b5151036202b5d957602001908151516202b5b46200680d835162004cef565b51111591826202b5c357505090565b620169f7919250620169f0905151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630343a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b7235760016202b6ab835162004cef565b5151036202b6c9576200680d602062016afb92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b8135760016202b79b835162004cef565b5151036202b7b9576200680d6020620168cd92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b9035760016202b88b835162004cef565b5151036202b8a9576200680d6020620167cc92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919091602080930160019182825151036202ba4657826202b97f835162004cef565b5151036202b9ec57938293946000935b6202b99e575050505050600090565b818101519384518110156202a90b576202b9c3620076a184620067a7848a9962004d46565b6202b9d36200680d865162004cef565b5114620174c1576202b9e59062004cdf565b936202b98f565b60405162461bcd60e51b815260048101869052603160248201527f43452049445f3630353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3630353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208091019060019182815151036202bb57578293946000945b6202bacb575050505050600090565b8281018051518610156202a90b576000855b6202baf8575b50506202baf1849562004cdf565b946202babc565b6202bb04845162004cef565b51518110156202bb51576202bb24620076a186620067a78a865162004d46565b6202bb35826200743f875162004cef565b511462023bcd57906202bb49869262004cdf565b90916202badd565b6202bae3565b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3630363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91909160208093019060019182815151036202bcd157846202bbd4825162004cef565b5151920191825151036202bc565782939460009283955b6202bbfa575b50505050905090565b805180518710156202bc4f57620076a183620067a7896202bc1b9462004d46565b6202bc2c876200743f865162004cef565b51036202bc46576202bc3f859662004cdf565b956202bbeb565b50505091505090565b506202bbf1565b60405162461bcd60e51b815260048101869052604760248201527f43452049445f3630373a205468652055494e543235365f324441525241595b3060448201527f5d206c656e677468206973206e6f7420657175616c20746f2070726f6772616d606482015266040d8cadccee8d60cb1b608482015260a490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3630373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208091019060019182815151036202bdfb578293946000935b6202bd53575050505090565b8281018051518510156202bdf457856000918183905b6202bd8b575b5050501562016f9a576202bd84859462004cdf565b936202bd47565b6202bd97865162004cef565b51518110156202bdee576202bdb7620076a188620067a78b865162004d46565b6202bdc8826200743f895162004cef565b51146202bde1576202bdda9062004cdf565b826202bd69565b505090508538806202bd6f565b6202bd6f565b50620051c4565b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3630383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916101cd81146202bea7576101ce81146202be9b576101cf81146202be8f576101d0146202be84575050600090565b620032d2916202c4b5565b50620032d2916202c293565b50620032d2916202c0a0565b50620032d2919060200160019182825151036202c0465760026202becc835162004cef565b5151036202bfec576202bedf816202c6a8565b15620065c7576202bef0906202c705565b9180939150518251036202bf8157600092845b6202bf12575050505050600090565b8051841015620174c957836202bf2a86958362004d46565b516202bf3b6200680d855162004cef565b5114806202bf5b575b620174c1576202bf549062004cdf565b936202bf03565b506202bf68818562004d46565b516202bf79620169f0855162004cef565b51106202bf44565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436313a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c2395760026202c0bf835162004cef565b5151036202c1df576202c0d2816202c6a8565b15620065c7576202c0e3906202c705565b9180939150518251036202c17457600092845b6202c105575050505050600090565b8051841015620174c957836202c11d86958362004d46565b516202c12e6200680d855162004cef565b5114806202c14e575b620174c1576202c1479062004cdf565b936202c0f6565b506202c15b818562004d46565b516202c16c620169f0855162004cef565b51116202c137565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436323a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c45b5760036202c2b2835162004cef565b5151036202c401576202c2c5816202c6a8565b15620065c7576202c2d6906202c705565b9180939150518251036202c39657600092845b6202c2f8575050505050600090565b8051841015620174c957836202c31086958362004d46565b516202c3216200680d855162004cef565b5114806202c36f575b806202c348575b620174c1576202c3419062004cdf565b936202c2e9565b506202c355818562004d46565b516202c3666201d46a855162004cef565b5110156202c331565b506202c37c818562004d46565b516202c38d620169f0855162004cef565b5111156202c32a565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436333a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c64e5760026202c4d4835162004cef565b5151036202c5f4576202c4e7816202c6a8565b15620065c7576202c4f8906202c705565b9180939150518251036202c58957600092845b6202c51a575050505050600090565b8051841015620174c957836202c53286958362004d46565b516202c5436200680d855162004cef565b5114806202c563575b620174c1576202c55c9062004cdf565b936202c50b565b506202c570818562004d46565b516202c581620169f0855162004cef565b51146202c54c565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436343a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6020018051602681101562002a23576014149081156202c6ed575b81156202c6d6575b506202401c57600090565b905051602681101562002a2357601e14386202c6cb565b80915051602681101562002a2357601514906202c6c3565b6202c710816202c6a8565b156202c81657602081018051602681101562002a23576014146202c801578051602681101562002a23576015146202c7ca5751602681101562002a2357601e146202c79857506040516202c7648162002b3f565b60008152604051916202c7778362002b3f565b60008352604051916202c78a8362002b3f565b600083526000368137929190565b604001906202c7ac60a08351015162004cef565b51906202c7c360a062007446818651015162004d13565b5191929190565b50604001906202c7df60a08351015162004cef565b51906202c7c360a06202c7f6818651015162004d24565b519451015162004d35565b50604001906202c7ac60a08351015162004cef565b60405162461bcd60e51b815260206004820152606860248201527f43452049445f3436313a20546865206f7065726174696f6e206973206e6f742060448201527f746f6b656e206f7065726174696f6e20776974682063617368287061792d746f60648201527f2d6d696e742c207061792d746f2d7472616e736665722c206275726e2d616e646084820152672d726566756e642960c01b60a482015260c490fd5b916101af81146202c962576101b081146202c956576101b181146202c94a576101b281146202c93e576101b381146202c932576101b481146202c926576101b581146202c91a576101b6146202c90f575050600090565b620032d2916202d3ab565b50620032d2916202d206565b50620032d2916202d0a1565b50620032d2916202cf3c565b50620032d2916202cdd7565b50620032d2916202cc32565b50620032d2916202cacd565b50620032d291906020019060019182815151036202ca7357826202c987825162004cef565b5151036202ca19576020820151602681101562002a2357601103620065c757600091835b6202c9b95750505050600090565b604081019260a0936202c9d0858251015162004cef565b51518210156201e54057816200743f87966202c9ef9351015162004cef565b516202ca006200680d855162004cef565b5110620051c4576202ca129062004cdf565b926202c9ab565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cbd857826202caec825162004cef565b5151036202cb7e576020820151602681101562002a2357601103620065c757600091835b6202cb1e5750505050600090565b604081019260a0936202cb35858251015162004cef565b51518210156201e54057816200743f87966202cb549351015162004cef565b516202cb656200680d855162004cef565b5111620051c4576202cb779062004cdf565b926202cb10565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cd7d5760026202cc52825162004cef565b5151036202cd23576020820151602681101562002a2357601103620065c757600091835b6202cc845750505050600090565b604081019260a0936202cc9b858251015162004cef565b51518210156201e5405781856202ccbc826200743f8a998651015162004cef565b516202cccd6200680d885162004cef565b51111592836202ccf2575b505050620051c4576202cceb9062004cdf565b926202cc76565b5101516202cd0692506200743f9062004cef565b516202cd17620169f0855162004cef565b5110158138806202ccd8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cee257826202cdf6825162004cef565b5151036202ce88576020820151602681101562002a2357601103620065c757600091835b6202ce285750505050600090565b604081019260a0936202ce3f858251015162004cef565b51518210156201e54057816200743f87966202ce5e9351015162004cef565b516202ce6f6200680d855162004cef565b5114620051c4576202ce819062004cdf565b926202ce1a565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d04757826202cf5b825162004cef565b5151036202cfed576020820151602681101562002a2357601203620065c757600091835b6202cf8d5750505050600090565b604081019260a0936202cfa4858251015162004cef565b51518210156201e54057816200743f87966202cfc39351015162004cef565b516202cfd46200680d855162004cef565b5110620051c4576202cfe69062004cdf565b926202cf7f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d1ac57826202d0c0825162004cef565b5151036202d152576020820151602681101562002a2357601203620065c757600091835b6202d0f25750505050600090565b604081019260a0936202d109858251015162004cef565b51518210156201e54057816200743f87966202d1289351015162004cef565b516202d1396200680d855162004cef565b5111620051c4576202d14b9062004cdf565b926202d0e4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d3515760026202d226825162004cef565b5151036202d2f7576020820151602681101562002a2357601203620065c757600091835b6202d2585750505050600090565b604081019260a0936202d26f858251015162004cef565b51518210156201e5405781856202d290826200743f8a998651015162004cef565b516202d2a16200680d885162004cef565b51111592836202d2c6575b505050620051c4576202d2bf9062004cdf565b926202d24a565b5101516202d2da92506200743f9062004cef565b516202d2eb620169f0855162004cef565b5110158138806202d2ac565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d4b657826202d3ca825162004cef565b5151036202d45c576020820151602681101562002a2357601203620065c757600091835b6202d3fc5750505050600090565b604081019260a0936202d413858251015162004cef565b51518210156201e54057816200743f87966202d4329351015162004cef565b516202d4436200680d855162004cef565b5114620051c4576202d4559062004cdf565b926202d3ee565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b156202d51857565b60405162461bcd60e51b815260206004820152601c60248201527b496e76616c6964206e756d626572206f6620706172616d657465727360201b6044820152606490fd5b6202d5678162002fc4565b6202d5756200e52e620332ea565b6202d5808162002fc4565b600181036202d59e57506202d5986200e55a620332ea565b611faf55565b6202d5a98162002fc4565b600281036202d5b95750611fb055565b6202d5c48162002fc4565b600381036202d5d45750611fb155565b806202d5e260049262002fc4565b146202d5eb5750565b611fb255565b60609060208152601e60208201527f496e76616c69642072657475726e20747970653a20554e444546494e4544000060408201520190565b7f496e76616c69642061667465722d6f7020706c7567696e206c6576656c2e204c815264032bb32b6160dd1b602082015260250190565b7f496e76616c6964206265666f72652d6f7020706c7567696e206c6576656c2e2081526502632bb32b6160d51b602082015260260190565b9060005b8251811015620115b15760c06202d6b4828562004d46565b510151156202da6b576202d6cd6202abe1828562004d46565b60068082101562002a235760049182036202d818575060209060016003836202d6f7868962004d46565b51015106036202d7145750506202d70e9062004cdf565b6202d69c565b62004cdb82846202d7fd60636202d7456202d73e856202d735868e62004d46565b510151620050f5565b93620050f5565b92847f20697320776974682072657475726e2074797065205945535f414e445f534b4960409586519788946202d78162004db08388016202d660565b016000805160206203388c83398151915281526202d7aa82518093601396878501910162002e01565b01918201527f505f53414e44424f582c2073686f756c64206265206f6e206c6576656c205b3160338201526f2c20342c20372c2031302c202e2e2e5d60801b605382015203604381018552018362002b94565b5193849362461bcd60e51b8552840152602483019062002e26565b6202d8286202abe1848762004d46565b818110156201e0f6576001036202d938575060209060026003836202d84e868962004d46565b51015106036202d8655750506202d70e9062004cdf565b62004cdb82846202d7fd605d6202d8866202d73e856202d735868e62004d46565b92847f20697320776974682072657475726e20747970652053414e44424f585f4e454560409586519788946202d8c262004db08388016202d660565b016000805160206203388c83398151915281526202d8eb82518093601396878501910162002e01565b01918201527f4445442c2073686f756c64206265206f6e206c6576656c205b322c20352c20386033820152692c2031312c202e2e2e5d60b01b605382015203603d81018552018362002b94565b6202d9486202abe1848762004d46565b9081101562015501576002036202da4f576020906003826202d96b858862004d46565b510151066202d9815750506202d70e9062004cdf565b62004cdb82846202d7fd6202d9a76202d9a0846202d735858d62004d46565b92620050f5565b916202da4060409384519586936202d9c562004db08387016202d660565b016000805160206203388c83398151915281528151906202d9ef826013948d868501910162002e01565b01017f20697320776974682072657475726e2074797065204e4f2c2073686f756c642081527f6265206f6e206c6576656c205b332c20362c20392c2031322c202e2e2e5d00006020820152603e0190565b03601f19810184528362002b94565b60405162461bcd60e51b815290819062004cdb9082016202d5f1565b6202da7b6202abe1828562004d46565b6006908181101562002a23576005036202db965750602060016003826202daa3858862004d46565b51015106036202dab957506202d70e9062004cdf565b62004cdb826202db7960526202dada6202d73e866202d73581998c62004d46565b926040937f20697320776974682072657475726e2074797065205945532c2073686f756c6485519889936202db1562004db08387016202d629565b016000805160206203388c83398151915281528251906202db3f826013958c878501910162002e01565b01918201527f206265206f6e206c6576656c205b312c20342c20372c2031302c202e2e2e5d00603382015203603281018752018562002b94565b5192839262461bcd60e51b84526004840152602483019062002e26565b6202dba66202abe1838662004d46565b908082101562002a235760039182036202dcb557506002602091826202dbcd858862004d46565b51015106036202dbe357506202d70e9062004cdf565b62004cdb826202db79605c6202dc046202d73e866202d73581998c62004d46565b926040937f20697320776974682072657475726e207479706520564f54494e475f4e45454485519889936202dc3f62004db08387016202d629565b016000805160206203388c83398151915281528251906202dc69826013958c878501910162002e01565b01918201527f45442c2073686f756c64206265206f6e206c6576656c205b322c20352c20382c6033820152682031312c202e2e2e5d60b81b605382015203603c81018752018562002b94565b6202dcc56202abe1848762004d46565b9081101562002a23576002036202dd7157602090816202dce6848762004d46565b510151066202dcfb57506202d70e9062004cdf565b62004cdb826202db796202dd1a6202d9a0856202d73581988b62004d46565b916202dd6260409384519788936202dd3862004db08387016202d629565b016000805160206203388c83398151915281528151906202d9ef826013948b868501910162002e01565b03601f19810186528562002b94565b60405162461bcd60e51b81528062004cdb600482016202d5f1565b156202dd9457565b60405162461bcd60e51b815260206004820152604d60248201527f546865206c656e677468206f662074686520706c7567696e20696e646578657360448201527f20617272617920616e642074686520626f6f6c65616e206172726179206d757360648201526c74206265207468652073616d6560981b608482015260a490fd5b156202de1d57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420706c7567696e20696e64657820746f20626520656e61626c604482015261195960f21b6064820152608490fd5b156202de7557565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c656420697320616c726560448201526a18591e48195b98589b195960aa1b6064820152608490fd5b156202ded657565b60405162461bcd60e51b815260206004820152602360248201527f496e76616c696420706c7567696e20696e64657820746f2062652064697361626044820152621b195960ea1b6064820152608490fd5b156202df2f57565b60405162461bcd60e51b815260206004820152602d60248201527f54686520706c7567696e20746f2062652064697361626c656420697320616c7260448201526c1958591e48191a5cd8589b1959609a1b6064820152608490fd5b156202df9257565b60405162461bcd60e51b815260206004820152603060248201527f546865206c656e677468206f662074617267657420616e6420746f6b656e436c60448201526f185cdcc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b156202dff857565b60405162461bcd60e51b815260206004820152602c60248201527f546865206c656e677468206f662074617267657420616e6420616d6f756e742060448201526b1a5cc81b9bdd08195c5d585b60a21b6064820152608490fd5b156202e05a57565b60405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e20636c617373206973206e6f7420696e697469616c697a604482015261195960f21b6064820152608490fd5b156202e0b257565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20737570706c79206f662074686520746f6b656e206973604482015268206f766572666c6f7760b81b6064820152608490fd5b156202e11157565b60405162461bcd60e51b8152602060048201526024808201527f5468652062616c616e6365206f662074686520746f6b656e206973206f766572604482015263666c6f7760e01b6064820152608490fd5b156202e16a57565b606460405162461bcd60e51b815260206004820152602060248201527f54686520746f6b656e20697320616c726561647920696e697469616c697a65646044820152fd5b60408101906202e1c360c08351015162004cef565b51916202e1e560a06202e1da818451015162004cef565b519251015162004d13565b51936202e1fa845183511462000fa3620331b7565b6202e20d845186511462000fa3620331b7565b60005b84518110156202e26a576202e226818462004d46565b51906103e882101562004cfd576202e2649160018060a01b03865116600052600390811b0160205262000faa60406000205462007ce9838a62004d46565b6202e210565b5092919360005b83518110156202e395576202e287818462004d46565b51906103e8918281101562004cfd5760018060a01b03908189511660005260039081602091811b0181526202e2c760406000205462007d56868962004d46565b906202e2d4868a62004d46565b51918783101562004cfd57846202e30193878f5116600052811b01845260406000205562000fa3620332bb565b6202e30d848862004d46565b518581101562004cfd578290846202e326878c62004d46565b5116600052811b0181526202e34660406000205462006814868962004d46565b9190926202e355868a62004d46565b519687101562004cfd576202e38f9662000faa956202e375888d62004d46565b5116600052811b01905260406000205562000fa362033320565b6202e271565b5050620121cd6202e3a69162032f53565b90604051936202e3b68562002b78565b60018552602036818701376001600160a01b03610ba08190529051166202e3dd8562004cef565b526000935b81518510156202e700576202e3f8858362004d46565b51946202e406845162004e62565b916000936202e416825162004e62565b610b80528496855b87518110156202e4bf576202e445610ba0516202e43c838b62004d46565b51168b62032d3b565b15806202e487575b6202e464575b6202e45e9062004cdf565b6202e41e565b956202e47e6202e45e91610ba0516200a36b8a8c62004d46565b9690506202e453565b506103e88a101562004cfd57610ba0516202e4a3828a62004d46565b511660005260038a811b0160205260406000205415156202e44d565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202e559578762004cfd57610ba0516202e4fd828c62004d46565b51166000528b602052604060002054156202e524575b6202e51e9062004cdf565b6202e4dd565b976202e5506202e51e918b6202e53f8c610ba0519262004d46565b511662001ac782610b805162004d46565b9890506202e513565b5094959193965098509690959680610b405262004cfd5760040180610b005254956202e58a62008068868962006200565b610b605260009788610b20525b610b405162004cfd57610b2051888110156202e635576202e5c66202e5dc916000610b4052610b005162004f5e565b610ba05191549060031b1c16610b805162032dea565b156202e5fb575b6202e5f1610b205162004cdf565b610b20526202e597565b976202e62e906202e613610b2051610b005162004f5e565b610ba05191549060031b1c1662001ac782610b605162004d46565b976202e5e3565b5095939096509690969391936000915b8383106202e6cf5750505050610b405162004cfd57610b6051516001600160401b03811162002a9b576202e67d81610b00516200509a565b6020610b605101610b005160005260206000206000610ba051905b8481106202e6b85750505050506202e6b09062004cdf565b93926202e3e2565b60019060208386511695019481850155016202e698565b620081fe6202e6f991610ba0516202e6e8868662004d46565b511662001ac782610b605162004d46565b916202e645565b5050509050565b60408101906202e71c60c08351015162004cef565b51916202e73360a06202e1da818451015162004cef565b51936202e748845183511462000fa3620331b7565b6202e75b845186511462000fa3620331b7565b60005b84518110156202e7b8576202e774818462004d46565b51906103e882101562004cfd576202e7b29160018060a01b03865116600052600390811b0160205262000faa60406000205462007ce9838a62004d46565b6202e75e565b5092919360005b83518110156202e8c9576202e7d5818462004d46565b51906103e8918281101562004cfd5760018060a01b03908189511660005260039081602091811b0181526202e81560406000205462007d56868962004d46565b906202e822868a62004d46565b51918783101562004cfd57846202e84f93878f5116600052811b01845260406000205562000fa3620332bb565b6202e85b848862004d46565b518581101562004cfd578290846202e874878c62004d46565b5116600052811b0181526202e89460406000205462006814868962004d46565b9190926202e8a3868a62004d46565b519687101562004cfd576202e8c39662000faa956202e375888d62004d46565b6202e7bf565b5050620121cd6202e8da9162032f53565b90604051936202e8ea8562002b78565b60018552602036818701376001600160a01b03610b008190529051166202e9118562004cef565b526000935b81518510156202e700576202e92c858362004d46565b51946202e93a845162004e62565b916000936202e94a825162004e62565b610b60528496855b87518110156202e9ea576202e970610b00516202e43c838b62004d46565b15806202e9b2575b6202e98f575b6202e9899062004cdf565b6202e952565b956202e9a96202e98991610b00516200a36b8a8c62004d46565b9690506202e97e565b506103e88a101562004cfd57610b00516202e9ce828a62004d46565b511660005260038a811b0160205260406000205415156202e978565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202ea73578762004cfd57610b00516202ea28828c62004d46565b51166000528b602052604060002054156202ea4f575b6202ea499062004cdf565b6202ea08565b976202ea6a6202ea49918b6202e6e88c610b00519262004d46565b9890506202ea3e565b5094959193965098509690959680610ba05262004cfd5760040180610b405254956202eaa462008068868962006200565b610b205260009788610b80525b610ba05162004cfd57610b8051888110156202eb4f576202eae06202eaf6916000610ba052610b405162004f5e565b610b005191549060031b1c16610b605162032dea565b156202eb15575b6202eb0b610b805162004cdf565b610b80526202eab1565b976202eb48906202eb2d610b8051610b405162004f5e565b610b005191549060031b1c1662001ac782610b205162004d46565b976202eafd565b5095939096509690969391936000915b8383106202ebe95750505050610ba05162004cfd57610b2051516001600160401b03811162002a9b576202eb9781610b40516200509a565b6020610b205101610b405160005260206000206000610b0051905b8481106202ebd25750505050506202ebca9062004cdf565b93926202e916565b60019060208386511695019481850155016202ebb2565b620081fe6202ec1391610b00516202ec02868662004d46565b511662001ac782610b205162004d46565b916202eb5f565b9060408201916202ec3560a06200779b818651015162004cef565b519280518451036200ad0a5760005b81518110156202ec9e576202ec5a818362004d46565b51906103e882101562004cfd576202ec989160018060a01b03855116600052600390811b0160205262000faa60406000205462007ce9838962004d46565b6202ec44565b5060005b81518110156202ed3c576202ecb8818362004d46565b51906103e8918281101562004cfd5760018060a01b03908186511660005260039081602091811b0181526202ecf860406000205462007d56868c62004d46565b9190926202ed07868962004d46565b519687101562004cfd576202ed369662000faa958a5116600052811b01905260406000205562000fa3620332bb565b6202eca2565b506202ed4a91935062032f53565b604051926202ed598462002b78565b60018452602036818601376001600160a01b03610b008190529051166202ed808462004cef565b52604051906202ed908262002b3f565b6000825260003681376000935b81518510156202e700576202edb3858362004d46565b51946202edc1845162004e62565b916000936202edd1825162004e62565b610b60528496855b87518110156202ee71576202edf7610b00516202e43c838b62004d46565b15806202ee39575b6202ee16575b6202ee109062004cdf565b6202edd9565b956202ee306202ee1091610b00516200a36b8a8c62004d46565b9690506202ee05565b506103e88a101562004cfd57610b00516202ee55828a62004d46565b511660005260038a811b0160205260406000205415156202edff565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202eefa578762004cfd57610b00516202eeaf828c62004d46565b51166000528b602052604060002054156202eed6575b6202eed09062004cdf565b6202ee8f565b976202eef16202eed0918b6202e6e88c610b00519262004d46565b9890506202eec5565b5094959193965098509690959680610ba05262004cfd5760040180610b205254956202ef2b62008068868962006200565b610b805260009788610b40525b610ba05162004cfd57610b4051888110156202efc0576202eae06202ef67916000610ba052610b205162004f5e565b156202ef86575b6202ef7c610b405162004cdf565b610b40526202ef38565b976202efb9906202ef9e610b4051610b205162004f5e565b610b005191549060031b1c1662001ac782610b805162004d46565b976202ef6e565b5095939096509690969391936000915b8383106202f05a5750505050610ba05162004cfd57610b8051516001600160401b03811162002a9b576202f00881610b20516200509a565b6020610b805101610b205160005260206000206000610b0051905b8481106202f0435750505050506202f03b9062004cdf565b93926202ed9d565b60019060208386511695019481850155016202f023565b620081fe6202f07391610b00516202e53f868662004d46565b916202efd0565b156202f08257565b60405162461bcd60e51b815260206004820152601d60248201527f54686520726566756e6420616d6f756e74206973206f766572666c6f770000006044820152606490fd5b156202f0cf57565b60405162461bcd60e51b815260206004820152602360248201527f54686520746f74616c20726566756e6420616d6f756e74206973206f766572666044820152626c6f7760e81b6064820152608490fd5b156202f12857565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20776974686472617761626c6520616d6f756e74206973604482015268206f766572666c6f7760b81b6064820152608490fd5b611f44805482101562004cfd576000526007602060002091020190600090565b815180519192916001600160401b03811162002a9b576202f1c181856200509a565b6020809201846000528260002060005b8381106202f238575050505060c08260069262002c3b95940151600185015560408101516002850155606081015160038501556202f2196080820151151560048601620057f2565b6202f22c60a0820151600586016200571f565b015115159101620057f2565b825182820155918401916001016202f1d1565b611f448054600160401b81101562002a9b576202f26e916001820190556202f17f565b91909162005d305762002c3b916202f19f565b611fb4908154600160401b81101562002a9b576001810180845581101562004cfd5762002c3b926000526020600020016200571f565b620069d06202f2c691620074f5565b613f78805480600052613f76908160205260ff60096040600020015460081c16620322fb57613f73600160ff19825416179055600052602052600960406000200161010061ff0019825416179055546000526202f32760406000206200370e565b90600080611f4a54905b818110620322b4575b50501562032298575b60005b60208301519081518110156202f37e5762000faa620076c162011f56620076a16020620067a7866202f3789862004d46565b6202f346565b505060005b602083015180518210156202f3cb57620076a16020620067a7846202f3a89462004d46565b90606482101562004cfd576202f3c5914290611f4b015562004cdf565b6202f383565b50506000905b602083015180518310156200b07257826202f3ec9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036202f5fd57604001906202f42d60c08351015162004cef565b51936202f44460a06200779b818651015162004cef565b51916202f45586518551146202df8a565b6202f46486518451146202dff0565b60005b86518110156202f58b576202f47d818662004d46565b516103e881101562004cfd57600160ff60076202f4a39360031b0154161515146202e052565b6202f4af818562004d46565b516202f4bc828762004d46565b51906103e882101562004cfd576202f4de906006809360031b0154906200608f565b6202f4ea848962004d46565b51926103e884101562004cfd576202f5079360031b01556202e0aa565b6202f513818562004d46565b516202f520828762004d46565b51906103e882101562004cfd576202f549916003906001600160a01b0362012148868d62004d46565b91906202f557828862004d46565b51906103e882101562004cfd576202f5859362000faa926003906001600160a01b036201219c878f62004d46565b6202f467565b5094915091620121cd6202f59f9162032f53565b93604051926202f5af8462002b3f565b60008452600036813760005b83518110156202f5e0578062000faa620079626202f5da938762004d46565b6202f5bb565b50945092602092506202f5f4915062004cdf565b9190506202f3d1565b602081949293940151602681101562002a23576002036202f895576040018051928351906202f635620079c260a08097015162004cef565b519382518651036202f8405782518451036202f7ea5782518551036202f7915760005b86518110156202f77b576202f66e818862004d46565b516103e881101562004cfd5760ff60076202f6909260031b015416156202e162565b6202f69c818862004d46565b516103e881101562004cfd5760031b600701805460ff191660011790556202f6c5818562004d46565b516202f6d2828962004d46565b51906103e882101562004cfd5760056202f6f09260031b016200571f565b6202f6fc818662004d46565b516202f709828962004d46565b516103e881101562004cfd5760031b600101556202f728818762004d46565b516202f735828962004d46565b516103e881101562004cfd5760031b600201556202f754818862004d46565b51906103e882101562004cfd57600060066202f7759360031b015562004cdf565b6202f658565b509591509350602092506202f5f4915062004cdf565b60405162461bcd60e51b815260206004820152603c6024820152600080516020620337ec83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b60405162461bcd60e51b81526020600482015260396024820152600080516020620337ec8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b60405162461bcd60e51b81526020600482015260386024820152600080516020620337ec8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b602081949392940151602681101562002a23576003036202f8c3576020919262000faa6202f5f4926202e707565b6020810151602681101562002a23576004036202faf95760400160c0936202f8f36200ca5c868451015162004cef565b51906202f90a60a06200779b818651015162004cef565b51936202f91f875184511462000fa3620331b7565b6202f932875185511462000fa3620331b7565b6202f945875186511462000fa3620331b7565b60005b87518110156202f98d576202f95e818662004d46565b51906103e882101562004cfd576202f987916003906001600160a01b03620124d9848d62004d46565b6202f948565b509095919593929360005b83518110156202fab6576202f9ae818762004d46565b516103e881101562004cfd576003906001600160a01b036202f9d1848862004d46565b5116600052811b016020526202f9f260406000205462007d56838862004d46565b906202f9ff838962004d46565b51916103e883101562004cfd576202fa28926003906001600160a01b036201259b878b62004d46565b6202fa34818762004d46565b516103e881101562004cfd576003906001600160a01b036202fa57848c62004d46565b5116600052811b016020526202fa7860406000205462006814838862004d46565b9190506202fa87818862004d46565b51916103e883101562004cfd576202fab0926003906001600160a01b036201263e858e62004d46565b6202f998565b50936202fad091929693506200847962007e479162032f53565b9260005b83518110156202f5e0578062000faa620079626202faf3938762004d46565b6202fad4565b92906020840151602681101562002a2357600503620300585760408401906202fb2c60a06200851e818551015162004cef565b519282518451036200ad0a5760005b83518110156202fb94576202fb51818562004d46565b51906103e882101562004cfd5760036202fb8e9260018060a01b038a5116600052811b0160205262000faa60406000205462007ce9838962004d46565b6202fb3b565b509060005b83518110156202fc37576202fbaf818562004d46565b516103e881101562004cfd5760039060018060a01b03895116600052811b016020526202fbe760406000205462007d56838862004d46565b91906202fbf5828762004d46565b51906103e882101562004cfd576202fc3193600362000faa9360018060a01b038d5116600052811b0160205260406000205562000fa3620332bb565b6202fb99565b50916202fc48919495935062032f53565b92604051926202fc588462002b78565b6001845260203681860137516001600160a01b03166202fc788462004cef565b52604051926202fc888462002b3f565b6000845260003681376000945b805186101562030044576202fcab868262004d46565b516109e0526202fcbc855162004e62565b966000946202fccc845162004e62565b6109005260009460005b88518110156202fd9c578a896202fd066001600160a01b036202fcfa858462004d46565b51166109e05162032d3b565b15806202fd56575b6202fd27575b50506202fd219062004cdf565b6202fcd6565b986202fd4b9162001ac782859c62007f376202fd219760018060a01b039262004d46565b9790508a896202fd14565b5050506103e86109e051101562004cfd576001600160a01b036202fd7b828b62004d46565b511660005260036109e051811b016020528a8960406000205415156202fd0e565b50909895979498969291939660005b88518110156202fe3f576103e86109e051101562004cfd576001600160a01b036202fdd7828b62004d46565b511660005260036109e051811b01602052604060002054156202fe06575b6202fe009062004cdf565b6202fdab565b996202fe00906202fe36906001600160a01b036202fe258e8d62004d46565b511662001ac7826109005162004d46565b9a90506202fdf5565b509850969592919093966109e0516103e881101580610ac05262004cfd5760031b60040154986202fe7562008068898c62006200565b610940526000610ae05260006108e0525b610ac05162004cfd576108e0518a8110156202ff4f576202febb6202fed8916000610ac05260046109e05160031b0162004f5e565b90546109005160039290921b1c6001600160a01b03169062032dea565b156202fef7575b6202feed6108e05162004cdf565b6108e0526202fe86565b6000610ac0526202ff156108e05160046109e05160031b0162004f5e565b60018060a01b0391549060031b1c166202ff36610ae0516109405162004d46565b526202ff45610ae05162004cdf565b610ae0526202fedf565b50979294959093985095909560005b8281106202fff857505050610ac05162004cfd5761094051516001600160401b03811162002a9b576202ff9b8160046109e05160031b016200509a565b6020610940510160046109e05160031b01600052602060002060005b8381106202ffda57505050506202ffce9062004cdf565b9492959091956202fc95565b82516001600160a01b0316818301556020909201916001016202ffb7565b6203003e906001600160a01b0362030011828562004d46565b511662030025610ae0516109405162004d46565b5262030034610ae05162004cdf565b610ae05262004cdf565b6202ff5e565b5050936202f5f49193506020925062004cdf565b90926020810151602681101562002a2357600603620301f0576040016203008460c08251015162004cef565b51936203009b60a06200851e818551015162004cef565b519285518351036200db485785518451036200dafb5760005b8651811015620300f957620300ca818562004d46565b51906103e882101562004cfd57620300f3916003906001600160a01b0362012771848c62004d46565b620300b4565b509060005b86518110156203019a5762030114818562004d46565b516103e881101562004cfd576003906001600160a01b0362030137848b62004d46565b5116600052811b016020526203015860406000205462007d56838862004d46565b919062030166828762004d46565b51906103e882101562004cfd57620301949362000faa926003906001600160a01b036201259b878f62004d46565b620300fe565b509491620301af919350620121cd9062032f53565b9160405194620301bf8662002b3f565b60008652600036813760005b83518110156202f5e0578062000faa62007962620301ea938762004d46565b620301cb565b6020810151602681101562002a23576007036203027657604001926203021b60c08551015162004cef565b51916203022d60a08651015162004cef565b519451519162030245845187511462000fa3620331b7565b60005b84518110156202f5e057620302709062000faa6001600160a01b03806201290f848a62004d46565b62030248565b6020819493940151602681101562002a2357600803620302e45760c06040620302a3920151015162004cef565b519160005b8351811015620302d257620302cc906001600160a01b0380620129f7838862004d46565b620302a8565b509260209192506202f5f49062004cdf565b6020810151602681101562002a23576009036203033d5760c060406203030e920151015162004cef565b519160005b8351811015620302d25762030337906001600160a01b038062012a8b838862004d46565b62030313565b6020810151602681101562002a2357600a03620303c357604001906203036e60a06200df3360c08551015162004cef565b519262030383835185511462000fa3620331b7565b60005b8351811015620303b057620303aa906001600160a01b038062012b27838862004d46565b62030386565b50936202f5f49193506020925062004cdf565b602081949392940151602681101562002a2357600b036203044e5760400192620303f260c08551015162004cef565b51935151916203040a855184511462000fa3620331b7565b60005b85518110156203043b57620304359062000faa6001600160a01b038062012bda848b62004d46565b6203040d565b50935091602091506202f5f49062004cdf565b9091926020820151602681101562002a2357600c036203052b57606060408301510151926203047d846202d698565b60005b8451811015620303b05760c0620304a08260606040880151015162004d46565b51015115620304ed57620304c162008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca9620304e7936000190162005cba565b62030480565b6203050562008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca9620304e7936000190162005c7a565b9291906020810151602681101562002a2357600d0362030594576040019260206203055b60a08651015162004cef565b5194510151916203057085518451146202dd8c565b60005b85518110156203043b578062012d5b6203058e928662004d46565b62030573565b6020819492940151602681101562002a2357600e03620305fd57604001906020620305c460a08451015162004cef565b519251015193620305d983518651146202dd8c565b60005b83518110156203043b578062012e3f620305f7928862004d46565b620305dc565b906020829493940151602681101562002a2357600f03620306db57606060408301510151926203062d846202d698565b60005b8451811015620303b05760c0620306508260606040880151015162004d46565b510151156203069d576203067162008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262030697936000190162005cba565b62030630565b620306b562008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262030697936000190162005c7a565b906020819493940151602681101562002a23576010036203074c5760400151906203070f60a0608084015193015162004cef565b519362030724835186511462000fa3620331b7565b60005b83518110156203043b578062000faa6200902b62030746938762004d46565b62030727565b6020819492940151602681101562002a23576011036203096557604001906203078060a06200df3360c08551015162004cef565b51936203079183518651146202d510565b60005b8351811015620307c257620307bc9062000faa6001600160a01b03806201304a848962004d46565b62030794565b50935090620307d19062032e37565b90611f465493620307e86200806884518762006200565b9060009260005b8781106203094a575060005b8551811015620308a2576000805b89811062030853575b50156203082b575b620308259062004cdf565b620307fb565b9362030825906203084a906001600160a01b036200e724888a62004d46565b9490506203081a565b6203085e8162004eb6565b90546001600160a01b0360039290921b1c8116906203087e858b62004d46565b5116146203089757620308919062004cdf565b62030809565b505060013862030812565b509550939250620308b38262004e62565b8051906001600160401b03821162002a9b57602090620308d38362004ff7565b01611f46600052602060002060005b8381106203092c575050505060005b82811062030909575050506202f5f460209162004cdf565b620309269062000faa6001600160a01b03620019fb838662004d46565b620308f1565b82516001600160a01b031681830155602090920191600101620308e2565b936200e8706203095f916200e8528762004eb6565b620307ef565b6020819492940151602681101562002a235760120362030b8857604001906203099960a06200df3360c08551015162004cef565b5193620309aa83518651146202d510565b60005b8351811015620309db57620309d59062000faa6001600160a01b0380620132ac848962004d46565b620309ad565b5093509190620309eb9062032e37565b611f4654620309fa8162004e62565b906000926000915b80831062030aaf5750505062030a188262004e62565b8051906001600160401b03821162002a9b5760209062030a388362004ff7565b01611f46600052602060002060005b83811062030a91575050505060005b82811062030a6e575050506202f5f460209162004cdf565b62030a8b9062000faa6001600160a01b03620019fb838662004d46565b62030a56565b82516001600160a01b03168183015560209092019160010162030a47565b91956000959193959760005b855181101562030b795762030ad08962004eb6565b90546001600160a01b0360039290921b1c81169062030af0838962004d46565b51161462030b095762030b039062004cdf565b62030abb565b509750956001959391955b8062030b48575b1562030b335762030b2c9062004cdf565b9162030a02565b936200e87062030b2c916200e8528762004eb6565b5062030b548162004eb6565b60018060a01b0391549060031b1c16600052611f456020526040600020541562030b1b565b50979690969593919562030b14565b6020810151602681101562002a235760130362030be15760408091015101519260005b845181101562030bd0578062000faa6200959f62030bca938862004d46565b62030bab565b509250906202f5f460209162004cdf565b6020810151602681101562002a235760140362030d8e576040019062030c0c60c08351015162004cef565b519362030c2360a06200779b818651015162004cef565b519162030c3486518551146202df8a565b62030c4386518451146202dff0565b60005b865181101562030d395762030c5c818562004d46565b5162030c69828762004d46565b51906103e882101562004cfd57600662030c899260031b0154906200608f565b9062030c96838862004d46565b51916103e883101562004cfd57600662030cb59360031b01556202e0aa565b62030cc1818562004d46565b5162030cce828762004d46565b51906103e882101562004cfd5762030cf7916003906001600160a01b0362012148868d62004d46565b919062030d05828862004d46565b51906103e882101562004cfd5762030d339362000faa926003906001600160a01b036201219c878f62004d46565b62030c46565b5094915091620121cd62030d4d9162032f53565b936040519262030d5d8462002b3f565b60008452600036813760005b83518110156202f5e0578062000faa6200796262030d88938762004d46565b62030d69565b6020810151602681101562002a235760150362030db8576020919262000faa6202f5f4926202e707565b6020810151602681101562002a235760160362030e145760c0604062030de2920151015162004cef565b519260005b845181101562030bd05762030e0e9062000faa6001600160a01b0362009d36838962004d46565b62030de7565b6020810151602681101562002a235760170362030e715760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a235760180362030edb5760c0604062030e9b920151015162004cef565b51611fb6805460ff191660011790559260005b845181101562030bd05762030ed59062000faa6001600160a01b0362009e02838962004d46565b62030eae565b6020819392930151602681101562002a235760190362030fc25760008091604082910160a08082510151805162030f89575b5050519060e08201519162030f316200680d60c060018060a01b0393015162004cef565b511690602083519301915af13d1562030f80573d9062030f518262002f5b565b9162030f61604051938462002b94565b82523d6000602084013e5b156201387a57506202f5f460209162004cdf565b60609062030f6c565b62030f949062004cef565b515162030fa3575b8062030f0d565b8192506200680d9062030fb99251015162004cef565b51903862030f9c565b6020810151602681101562002a2357601a03620310445760a0604062030fec920151015162004cef565b5162030ffc60038251146202d510565b620310078162004cef565b519162031018620139a08362004d13565b51916200f9d5576020926202f5f4926001036200a043576200a023906200a016611fb19182546200608f565b6020810151602681101562002a2357601b036203142f5750919062031074611faf546200225a6200a0b962033044565b50506203108062033108565b506000805b6103e88110620313e3575b50506203109c62006161565b90620310ab613f745462004e62565b906000946000905b6103e8821015620313d7578160031b9260ff60078501541615620311bf57600096600285015415620311a6576000975b62004cfd576004850154881015620311a6576203119f62031198899a62031112620311499b60048a0162004f5e565b60018060a01b0391549060031b1c1680600052600389016020526203113d8b60406000205462005eb0565b9c9062000fa362033108565b6203118c620311706203116460009e60028d01549062005eb0565b919062000fa362033108565b82600052611f476020526200a01660406000209182546200608f565b62001ac7828b62004d46565b9962004cdf565b97620310e3565b92909350620311b791965062004cdf565b9094620310b3565b95969392509350505b620311d38262004e62565b9160009160005b8281106203134157505050611f485491620311fa62008068848462006200565b926000906000905b8082106203132457505060005b8381106203128e5750508251929150506001600160401b03821162002a9b576020906203123c8362004fbc565b01611f48600052602060002060005b8381106203127057505050506202f5f46020916000611fb1556000611fb25562004cdf565b82516001600160a01b0316818301556020909201916001016203124b565b6000805b838110620312dc575b5015620312b4575b620312ae9062004cdf565b6203120f565b90620312ae90620312d3906001600160a01b03620081f0858762004d46565b919050620312a3565b6001600160a01b0380620312f1858862004d46565b51169062031300838a62004d46565b5116146203131957620313139062004cdf565b62031292565b50506001386203129b565b9091620081fe6203133a91620094f58562004e9a565b9062031202565b6000805b8581106203138f575b501562031367575b620313619062004cdf565b620311da565b92620313619062031386906001600160a01b03620081f0878662004d46565b93905062031356565b6001600160a01b0380620313a4858762004d46565b511690620313b3838a62004d46565b511614620313cc57620313c69062004cdf565b62031345565b50506001386203134e565b935050929390620311c8565b8060039594951b9060ff6007830154161562031425576200a4f86200746162000faa946200a4ec6203141c9560026200a4e28762005e1c565b93929362031085565b5093929362031090565b6020810151602681101562002a2357601c036203148c5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d03620314b2575b506202f5f460209162004cdf565b9290916020840151602681101562002a2357601e0362031bc357604084019060a090620314e3828451015162004cef565b5151620314f4838551015162004d13565b5151036200ade9576203150b828451015162004cef565b51516203151c838551015162004d24565b5151036200ad6d5762031533828451015162004cef565b519462031544838551015162004d13565b5191620315596200a641858751015162004d24565b519585518751036200ad0a5760005b8651811015620315c1576203157e818862004d46565b51906103e882101562004cfd576003620315bb9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b62031568565b5090969192939660005b86518110156203166a57620315e1818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526203161960406000205462007d56838b62004d46565b919062031627828a62004d46565b51906103e882101562004cfd576203166493600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b620315cb565b50939692979550936203167d9062032f53565b96604051966203168d8862002b78565b60018852602036818a013786516001600160a01b0316620316ae8962004cef565b5260405196620316be8862002b3f565b600088526000610a60525b8951610a60519081101562031a6a57620316e4908b62004d46565b51610a4052620316f5885162004e62565b99600097620317058b5162004e62565b6109c05260009760005b8b51811015620317d5578d8c6203173f6001600160a01b0362031733858462004d46565b5116610a405162032d3b565b15806203178f575b62031760575b50506203175a9062004cdf565b6203170f565b9b620317849162001ac782859f62007f376203175a9760018060a01b039262004d46565b9a90508d8c6203174d565b5050506103e8610a4051101562004cfd576001600160a01b03620317b4828e62004d46565b51166000526003610a4051811b016020528d8c604060002054151562031747565b50909b989a99949691929395979b60005b8b5181101562031869576103e8610a4051101562004cfd576001600160a01b0362031812828e62004d46565b51166000526003610a4051811b016020526040600020541562031841575b6203183b9062004cdf565b620317e6565b9c620318606203183b918f6200d8da8f9160018060a01b039262004d46565b9d905062031830565b509b50989590929496919396610a4051996103e88b10159c8d62004cfd57620318a06200806860048f9e60031b01549e8f62006200565b610960526000610980528d60009e5b62004cfd578d8f10156203196e575060009d620318f7620318da826004610a405160031b0162004f5e565b90546109c05160039290921b1c6001600160a01b03169062032dea565b1562031911575b6203190a8f9162004cdf565b9e620318af565b6203190a9e5060009e8f9162031931816004610a405160031b0162004f5e565b60018060a01b0391549060031b1c1662031952610980516109605162004d46565b52620319616109805162004cdf565b61098052915050620318fe565b9396999b929d509396999094979b5060005b82811062031a1e5750505062004cfd5761096051516001600160401b03811162002a9b57620319b9816004610a405160031b016200509a565b60206109605101906004610a405160031b0160005260206000209160005b82811062031a005750505050620319f1610a605162004cdf565b610a60529598909498620316c9565b81516001600160a01b031681850155602090910190600101620319d7565b62031a64906001600160a01b0362031a37828562004d46565b511662031a4b610980516109605162004d46565b5262031a5a6109805162004cdf565b6109805262004cdf565b62031980565b509492975094955091965060009460005b875181101562031ace5762031a996200abc66200abb9838962004d46565b8062031ab2575b5062031aac9062004cdf565b62031a7b565b906200abfc62031ac79862031aac936200608f565b9062031aa0565b5096509450929091508062031af0575b50506202f5f46020915b9150620314a4565b62031b1b9060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b60018060a01b03835116600052602052604060002055600080611f4654905b81811062031b79575b5050916202f5f4916020931562031b5d575b509162031ade565b5162031b72906001600160a01b0316620065d6565b3862031b55565b62031b848162004eb6565b9054855160039290921b1c6001600160a01b0390811691161462031bb35762031bad9062004cdf565b62031b3a565b5060019150829050602062031b43565b9190926020810151602681101562002a2357601f0362031bfe5760209162031bf86200ae9d60406202f5f49401515162004cef565b62031ae8565b6020810151602681101562002a235760200362031c24575b506202f5f460209162031ae8565b6020810151602681101562002a2357602180910362031c45575b5062031c16565b602082015160268110156200b01a5760220362031c815750506202f5f4602091611fb660ff19815416905562031c7a62005087565b9162031c3e565b602082015160268110156200b01a5760230362031ca8575b50506202f5f460209162031c7a565b602082015160268110156200b01a5760241462031c9957602082015160268110156200b01a5760251462031c99576020829593949201519060268210156201478c575060150362010ee557604084019062031d0860c08351015162004cef565b519062031d1f60a06200779b818651015162004cef565b519362031d34835185511462000fa3620331b7565b62031d47835186511462000fa3620331b7565b60005b835181101562031da35762031d60818662004d46565b51906103e882101562004cfd57600362031d9d9260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b62031d4a565b509095919560005b875181101562031ece5762031dc1818662004d46565b516103e881101562004cfd5760039060018060a01b03865116600052811b0160205262031df960406000205462007d56838962004d46565b9062031e06838862004d46565b51916103e883101562004cfd57600362031e3d9360018060a01b03895116600052811b0160205260406000205562000fa3620332bb565b62031e49818662004d46565b516103e881101562004cfd576003906001600160a01b0362031e6c848c62004d46565b5116600052811b0160205262031e8d60406000205462006814838962004d46565b919062031e9b828862004d46565b51906103e882101562004cfd5762031ec893600362000faa938d62007e0f8760018060a01b039262004d46565b62031dab565b509262031ee6919294506200c6369096959662032f53565b926040519062031ef68262002b78565b6001825260203681840137516001600160a01b031662031f168262004cef565b526000945b8051861015620322835762031f31868262004d46565b51610aa05262031f42855162004e62565b9660009462031f52845162004e62565b6109205260009460005b885181101562032022578a8962031f8c6001600160a01b0362031f80858462004d46565b5116610aa05162032d3b565b158062031fdc575b62031fad575b505062031fa79062004cdf565b62031f5c565b9862031fd19162001ac782859c62007f3762031fa79760018060a01b039262004d46565b9790508a8962031f9a565b5050506103e8610aa051101562004cfd576001600160a01b0362032001828b62004d46565b51166000526003610aa051811b016020528a89604060002054151562031f94565b50909895979498969291939660005b8851811015620320b4576103e8610aa051101562004cfd576001600160a01b036203205d828b62004d46565b51166000526003610aa051811b01602052604060002054156203208c575b620320869062004cdf565b62032031565b996203208690620320ab906001600160a01b036200a9638e8d62004d46565b9a90506203207b565b50985096959291909396610aa0516103e881101580610a205262004cfd5760031b6004015498620320ea62008068898c62006200565b610a00526000610a805260006109a0525b610a205162004cfd576109a0518a811015620321a7576200a9ff62032130916000610a20526004610aa05160031b0162004f5e565b156203214f575b620321456109a05162004cdf565b6109a052620320fb565b6000610a20526203216d6109a0516004610aa05160031b0162004f5e565b60018060a01b0391549060031b1c166203218e610a8051610a005162004d46565b526203219d610a805162004cdf565b610a805262032137565b50979294959093985095909560005b8281106203225057505050610a205162004cfd57610a0051516001600160401b03811162002a9b57620321f3816004610aa05160031b016200509a565b6020610a0051016004610aa05160031b01600052602060002060005b838110620322325750505050620322269062004cdf565b94929590919562031f1b565b82516001600160a01b0316818301556020909201916001016203220f565b6203227d906001600160a01b0362032269828562004d46565b51166200c214610a8051610a005162004d46565b620321b6565b5050936202f5f4919350602092509162031c99565b8151620322ae906001600160a01b031662006600565b6202f343565b620322bf8162004f0a565b9054865160039290921b1c6001600160a01b03908116911614620322ee57620322e89062004cdf565b6202f331565b505050600138806202f33a565b60405162461bcd60e51b815260206004820152604860248201527f5468652070656e64696e672070726f6772616d20686173206265656e2065786560448201527f63757465642c20616e642073686f756c64206e6f742062652065786563757465606482015267321030b3b0b4b71760c11b608482015260a490fd5b908062032382575050565b62002c3b91600052601f6020600020910160051c81019062004fa3565b90600160401b811162002a9b578154818355808210620323be57505050565b62002c3b92600052601f6020600020918180850160051c8401941680620323ed575b500160051c019062004fa3565b600019908186019182549160200360031b1c16905538620323e0565b9060ff809160031b9316831b921b19161790565b620324356203242e6000936202f17f565b506200356f565b92825b845180518210156203252b5781620324509162004d46565b516103e881101562004cfd57600390811b9460018060a01b038516600052602091860182526203248d604096600188600020549101549062005eb0565b919015620324f65790620324a1916200608f565b959015620324bc575050620324b69062004cdf565b62032438565b60649250519062461bcd60e51b825260048201526014602482015273746f74616c20706f776572206f766572666c6f7760601b6044820152fd5b865162461bcd60e51b815260048101849052600e60248201526d706f776572206f766572666c6f7760901b6044820152606490fd5b505092505090565b60005b613f78549081600052613f7691602092808452600393604092858460002001805486101562032694576203256f866203257b9262004f5e565b905490881b1c6202f17f565b509560ff60068098015416620325a3575b50505050506203259d915062004cdf565b62032536565b81600052838352620325cb620325bf8783886000200162004f5e565b905490831b1c6202f17f565b5096620325eb876001809a01549285600052878752886000200162004f5e565b905490831b1c91836000528585526203260b886005896000200162004f5e565b9054911b1c90600092606492838102938185041490151715620326805790620326349162004f77565b1062032678575b6203264757806203258c565b6009945060005252600020019060ff19918183825416179055613f73918254161790556000613f71556000613f7255565b50856203263b565b634e487b7160e01b84526011600452602484fd5b505050505050506000613f7854905b81600052613f76602052600380604060002001805483101562032719576006620326e0620326d48560ff9462004f5e565b905490851b1c6202f17f565b50015416156203271457620326f58262032929565b9081101562002a235762014d61576203270e9062004cdf565b620326a3565b505050565b50505060ff1990613f73600383825416179055600052613f766020526009604060002001908154169055565b613f785490600090828252613f769160209280845260039060409082828520015495620327728762002c61565b96620327818451988962002b94565b80885262032792601f199162002c61565b013682890137845b888652828252848487200154811015620327e35790620327d88262000faa620327c68897969562032929565b620327d2838d62004d46565b620052db565b90919293506203279a565b5050505090919350815b83518110156203285a5762032803818562004d46565b518281101562032846576001809114620328295750620328239062004cdf565b620327ed565b613f73805460ff191690911790555050613f71819055613f725550565b634e487b7160e01b84526021600452602484fd5b50909150613f7280544210600014620328815750613f739060ff19825416179055613f7155565b9050613f73600160ff1982541617905581613f715555565b15620328a157565b60405162461bcd60e51b815260206004820152601e60248201527f766f74696e672072756c6520696e646578206f7574206f662072616e676500006044820152606490fd5b15620328ee57565b60405162461bcd60e51b815260206004820152601360248201527263757272656e74596573206f766572666c6f7760681b6044820152606490fd5b613f785490600091808352613f76806020528260408520600301906203294f9162004f5e565b90549060031b1c62032961816202f17f565b50600101549383865282602052806040872060040190620329829162004f5e565b90549060031b1c9284875280602052816040882060050190620329a59162004f5e565b90549060031b1c9487526020526040862060060190620329c59162004f5e565b90549060031b1c90620329d8906202f17f565b506006015460ff1662032a24575062032a149262005e4362022e1f938362032a0462032a0c9562005e7a565b9690620328e6565b9290620328e6565b111562032a1e5790565b50600190565b6200fab9925062032a149362032a3e62032a0c9362005e7a565b9490620328e6565b9092919262032a56825162004e62565b60009162032a65815162004e62565b8390845b865181101562032b00576001600160a01b0362032a8c816202e43c848b62004d46565b158062032acb575b62032aac575b5062032aa69062004cdf565b62032a69565b819662032ac391620081f062032aa6948b62004d46565b959062032a9a565b506103e88a101562004cfd578062032ae4838a62004d46565b511660005260038a811b01602052604060002054151562032a94565b509295919694509260005b875181101562032b81576103e886101562004cfd576001600160a01b038062032b35838b62004d46565b5116600052600387811b016020526040600020541562032b62575b5062032b5c9062004cdf565b62032b0b565b819562032b79916200e72462032b5c948c62004d46565b949062032b50565b5092509450926103e8831015938462004cfd5760049586600395861b019687549462032bb262008068828862006200565b9460009689889a5b62032d2657818b101562032c5b57506000998b62032bf562032bdd838362004f5e565b90546001600160a01b0392918e1b1c82168a62032dea565b1562032c18575b50509062032c0d8b94939262004cdf565b9a9091929362032bba565b91998c95949392909162032c2e908c9062004f5e565b9054908d1b1c1662032c41828b62004d46565b5262032c4d9062004cdf565b9890919293508b3862032bfc565b9697949a98505091975092506000915b83831062032d01575050505062032cec578051926001600160401b03841162032cd7575062032c9b83836200509a565b602080910191600052806000209060005b84811062032cbb575050505050565b83516001600160a01b0316838201559281019260010162032cac565b604190634e487b7160e01b6000525260246000fd5b603283634e487b7160e01b6000525260246000fd5b62032d1f90620081fe906001600160a01b036200a36b868662004d46565b9162032c6b565b603285634e487b7160e01b6000525260246000fd5b9060005b6103e883101562004cfd576003600484821b01805483101562016f9a578262032d689162004f5e565b9054911b1c6001600160a01b0390811690831614620065b45762032d8c9062004cdf565b62032d3f565b9060005b6103e883101562004cfd576003611fbc84821b01805483101562016f9a578262032dc09162004f5e565b9054911b1c6001600160a01b0390811690831614620065b45762032de49062004cdf565b62032d96565b9060005b8251811015620065c7576001600160a01b038062032e0d838662004d46565b511690831614620065b45762032e239062004cdf565b62032dee565b801562001e07576000190190565b9081519060005b60001983810184811162001e075782101562032f05576001820180831162001e07575b84811062032e7c57505062032e769062004cdf565b62032e3e565b6001600160a01b038062032e91858962004d46565b51168162032ea0848a62004d46565b51161462032ebb575b5062032eb59062004cdf565b62032e61565b828692960182811162001e075762032eb59262032efe9262032ee262032ef7938b62004d46565b511662032ef0898b62004d46565b5262032e29565b9562032e29565b9062032ea9565b50509062032f138162004e62565b9060005b81811062032f26575090925050565b62032f4d906001600160a01b0362032f3f828862004d46565b511662001ac7828662004d46565b62032f17565b80519160005b60001984810185811162001e07578210156203300b576001820180831162001e07575b85811062032f9757505062032f919062004cdf565b62032f59565b62032fa3838662004d46565b5162032fb0828762004d46565b511462032fc9575b62032fc39062004cdf565b62032f7c565b948181019080821162001e075762032ffc620330039162032fef62032fc3948962004d46565b5162032ef08a8a62004d46565b9662032e29565b905062032fb8565b505090916203301a8162004e62565b9060005b8181106203302d575090925050565b806202b4c76203303e928762004d46565b6203301e565b604051620330528162002a7f565b604481527f496e76616c6964206469766964656e64207065726d797269616420706572207460208201527f72616e73616374696f6e2e2053686f756c64206265206c657373207468616e206040820152630313030360e41b606082015290565b604051620330c08162002b06565b603281527f4e6f20656e6f756768206e756d626572206f66207472616e73616374696f6e7360208201527108199bdc88191a5d9a59195b991cc81e595d60721b604082015290565b604051620331168162002b78565b601c81527b6469766964656e6473206f7065726174696f6e206f766572666c6f7760201b602082015290565b604051620331508162002b78565b600d81526c2ab735b737bbb71022b93937b960991b602082015290565b6040516203317b8162002b06565b602681527f4572726f7220696e20776974686472617761626c6520636173682063616c63756020820152653630ba34b7b760d11b604082015290565b604051620331c58162002b78565b6012815271496e76616c696420506172616d657465727360701b602082015290565b604051620331f58162002b78565b601581527413595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b602082015290565b604051620332288162002b78565b601781527613595b58995c881a5cc81b9bdd081cdd5cdc195b991959604a1b602082015290565b6040516203325d8162002b78565b601b81527a13595b58995c881a5cc8185b1c9958591e481cdd5cdc195b991959602a1b602082015290565b604051620332968162002b78565b60158152744d656d62657220616c72656164792065786973747360581b602082015290565b604051620332c98162002b78565b60118152704e6f20656e6f7567682062616c616e636560781b602082015290565b604051620332f88162002b78565b6018815277125b9d985b1a59081c185c985b595d195c881d1bc81cd95d60421b602082015290565b6040516203332e8162002b78565b6015815274546f6b656e20616d6f756e74206f766572666c6f7760581b602082015290565b602681101562002a23578015620074b2576001811462032a1e57600281146203358657600381146203358057600481146203357a57600581146203357457600681146203356e57600781146203356857600881146203356257600981146203355c57600a81146203355657600b81146203355057600c81146203354a57600d81146203354457600e81146203353e57600f81146203353857601081146203353257601181146203352c57601281146203352657601381146203352057601481146203351a57601581146203351457601681146203350e5760178114620335085760188114620335025760198114620334fc57601a8114620334f657601b8114620334f057601c8114620334ea57601d8114620334e457601e8114620334de57601f8114620334d85760208114620334d25760218114620334cc5760228114620334c65760238114620334c05760248114620334ba57602514620334b557600090565b602590565b50602490565b50602390565b50602290565b50602190565b50602090565b50601f90565b50601e90565b50601d90565b50601c90565b50601b90565b50601a90565b50601990565b50601890565b50601790565b50601690565b50601590565b50601490565b50601390565b50601290565b50601190565b50601090565b50600f90565b50600e90565b50600d90565b50600c90565b50600b90565b50600a90565b50600990565b50600890565b50600790565b50600690565b50600590565b50600490565b50600390565b50600290565b908151815103620065cf57600090815b835181101562017689576001600160f81b031980620335bc838762006506565b511690620335cb838562006506565b5116036201768257620335de9062004cdf565b6203359c565b60405190620335f38262002b06565b60288252604036602084013760005b601481106203361057505090565b60139080820391821162001e0757600382901b916001600160fd1b0381160362001e075760ff80831162001e0757600192620336599084901b6001600160a01b038616620050d4565b60f081168282160391821162001e07576203367d9060f41b600f60f81b16620336e6565b82841b916001600160ff1b038416840362001e0757620336ba9160001a620336a6848962006506565b5360f81b6001600160f81b031916620336e6565b92810180911162001e0757620336d9620336e09360001a918662006506565b5362004cdf565b62033602565b60f81c600a8110156203370f5760300160ff811162001e075760f81b6001600160f81b03191690565b60570160ff811162001e075760f81b6001600160f81b0319169056fe546865206c656e677468206f662061646472657373657320616e6420746f6b65305d206c656e677468206973206e6f742032000000000000000000000000000034dd862f2dd4c33543972cb453e26b9cc23a6eb518176c0de5db12d08007dc6d617665203120656c656d656e7400000000000000000000000000000000000000dd388e0eb473c306304080e96aea031c0fb4686a37f7b1a3c8a2301cd0627f0b7420686176652074776f20656c656d656e747300000000000000000000000000546865206c656e677468206f6620746f6b656e496e666f20616e6420746f6b656e20746865206c656e677468206f6620746f6b656e4c697374000000000000006c656e677468206973206e6f7420657175616c20746f207072696365206c69735d206c656e677468206973206e6f742031000000000000000000000000000000742068617665206f6e6520656c656d656e74000000000000000000000000000020706c7567696e207769746820696e6465782000000000000000000000000000656e677468206973206e6f7420310000000000000000000000000000000000005468652063616c6c20746f2074686520636f6e7472616374206973206e6f74202e55494e543235365f324441525241595b305d5b305d29206973206f7574206f2e55494e543235365f324441525241595b305d5b695d29206973206f7574206f742068617665203220656c656d656e7473000000000000000000000000000000546865206265666f7265206f7065726174696f6e20706c7567696e20737973748b3bb33683ac4daad017d30a0e9972b15e6854cd1f296e14295598f57ce03d506470626d4cb7d88e800a628455fe3f45216f254e8294f25d17ea4ac7e2f4f0a35d206c656e677468206973206e6f7420320000000000000000000000000000005265736572766564206f70636f6465206964203233206973206e6f7420696d70546865206c656e677468206f6620746f6b656e436c617373417272617920616e6c656e677468206973206e6f74203100000000000000000000000000000000005d206c656e677468206973206e6f742067726561746572207468616e20310000617665206f6e6520656c656d656e740000000000000000000000000000000000742068617665203120656c656d656e7400000000000000000000000000000000746f6b656e206c6576656c205829206d757374206265206c657373207468616e28746f6b656e206c6576656c205829206d757374206265206c657373207468615265736572766564206f70636f6465206964203238206973206e6f7420696d70546865206c656e677468206f662061646472657373657320616e6420616d6f75a26469706673582212200b7dff630712f4e35e13cd6b52bb4915fdb7f860f9ed94b9e17edff45824d9ad64736f6c63430008130033\",\n  \"deployedBytecode\": \"0x610bc08060405260043610156200001557600080fd5b600090813560e01c908163036ee850146200299d575080630fda3e1e146200290557806310ade3ea14620028d65780631797631d146200284f5780631c75255a14620027e957806323b65c7814620027625780632514a6b4146200253c5780632eeb063b146200236c5780633fb18aec146200230257806356424cf414620022235780635c00d98714620022005780635d0b184914620002055780635f1231ea14620021165780635f5d5f00146200208f578063681ece9d146200204a5780636c0d4fa41462001eb75780637daa10ce1462001e9a5780638129fc1c1462001ad757806383e4cccf146200186e578063864f9f7a146200183057806386ad77e214620014e25780638c7a63ae1462001451578063942d59fa146200126e5780639f36145f14620011e8578063a064c4f114620011bd578063acf80bc4146200117f578063aec266871462001095578063aefca42a1462001074578063c41f9482146200102c578063c591aa981462000fde578063cab847f714620002a4578063d5a172f21462000278578063d6a93c511462000226578063f179f23b14620002055763f8ce8bdc14620001c757600080fd5b346200020257806003193601126200020257620001e3620052e8565b50610c80620001f162002bb8565b620002006040518092620029ed565bf35b80fd5b503462000202578060031936011262000202576020613f7854604051908152f35b503462000202578060031936011262000202575b6103e8811062000250575b602090604051908152f35b60ff60078260031b0154161562000272576200026c9062004cdf565b6200023a565b62000245565b50346200020257806003193601126200020257613f70546040516001600160a01b039091168152602090f35b5060031960203682011262000ca5576001600160401b036004351162000ca557606090600435360301126200020257604051620002e18162002b06565b620002f1600435600401620029d8565b8152600435602401356101608190526001600160401b03811162000ca957600435013660238201121562000ca957600462000333910135806101805262002c61565b9062000343604051928362002b94565b610180518252602082016101c052610180516101605160043501906024369160051b8301011162000ca15760240160e052825b6101805160051b610160516004350190602460e0519183010181101562000ebd57356101e08190526001600160401b03811162000ca95760609101360360231901126200020257620003cf604051806101205262002b06565b620003e960246101e05161016051600435010101620029d8565b610120515260446101e0516101605160043501010135602681101562000ca55760206101205101526101e0516101605160043501016064810135806101005260018060401b03811162000ca957610100910136036023190112620002025762000459604051806101405262002b22565b610100516101e051610160516004350101016001600160401b0360248201351162000ca55762000493906024369181810135010162004925565b6101405152610100516101e05161016051600435010101916001600160401b0360448401351162000ca5573660436044850135850101121562000ca557620004e5602460448501358501013562002c61565b90620004f5604051928362002b94565b6024604485013585010135825260208201906044850135610100516101e05161016051600435010101013660446024818901358901013560051b8301011162000db457604401915b60446024818801358801013560051b81880135610100516101e051610160516004350101010101018310156200058857602080916200057c85620049b0565b8152019201916200053d565b50610140516020019290925250610100516101e051610160519395600435909401010192506001600160401b0360648401351162000ca1573660436064850135850101121562000ca157602460648401358401013590620005e98262002c61565b90620005f9604051928362002b94565b828252602082016064860135610100516101e05161016051600435010101013660448660051b8301011162000bb157604401905b6064870135610100516101e051610160516004350101010160448660051b8201018310156200074f576001600160401b038335116200074b5760e083358201360360431901126200074b5760405191620006878362002acd565b6001600160401b038435830160440135116200074757620006b436604486358501818101350101620049be565b835283358201606481013560208501526084810135604085015260a48101356060850152620006e69060c401620049b0565b60808401526001600160401b038435830160e40135116200074757602092839262000736906101049062000727368935830160e48101350160440162002f77565b60a085015287350101620049b0565b60c08201528152019101906200062d565b8980fd5b8880fd5b50505092935090506040610140510152610100516101e05161016051600435010101608481013560c05260018060401b0360848201351162000ca1573660436084830135830101121562000ca157608481013501602401356080819052620007ca90620007bc9062002c61565b604051806101a05262002b94565b6101a051608051905260206101a051019160805160051b60c051610100516101e051610160516004350101010190604436918301011162000db45760440160a052929091905b60805160051b60c051610100516101e0516101605160043501010101604460a0519282010182101562000cad576001600160401b0382351162000ca95760e082359091013603604319011262000ca557604051926200086f8462002acd565b6044823560c051610100516101e0516101605160043501010101010135600681101562000ca15784526064823560c051610100516101e05161016051600435010101010101356020850152813560c051610100516101e0516101605160043501010101019360018060401b0360848601351162000ca1573660636084870135870101121562000ca1576200090d604460848701358701013562002c61565b956200091d604051978862002b94565b6044608487013587010135875260208701906084870135853560c051610100516101e05161016051600435010101010101366064604460848b01358b01013560051b8301011162000c9d57606401915b60c051610100516101e051610160516004350101010186350160848901359081019089016044013560051b810160640184101562000bb5576001600160401b0384351162000bb15760c0843582013603606319011262000bb15760405190620009d68262002ab1565b8435810160648101358352600560849091013510156200074b578435810160848101356020840152600460a49091013510156200074b578435810160a4810135604084015260c481013560608401526001600160401b0360e490910135116200074b5762000a51368635830160e481013501606401620049be565b60808301526001600160401b03853582016101040135116200074b5760808535820161010481013501360360631901126200074b576040519062000a958262002a7f565b6001600160401b0386358201610104810135016064013511620007475762000ad136606461010489358501908101350181810135010162004925565b82526001600160401b0386358201610104810135016084013511620007475762000b0f36873583016101048101350160848101350160640162004a24565b60208301526001600160401b03863582016101048101350160a4013511620007475762000b5036873583016101048101350160a48101350160640162004aaf565b60408301526001600160401b03863582016101048101350160c4013511620007475760209384939092909162000b9b9036908935016101048101350160c48101350160640162002f77565b606082015260a08201528152019201916200096d565b8780fd5b50509550509091929594604082015260a4833560c051610100516101e05161016051600435010101010101356060820152823560c051610100516101e0516101605160043501010101019260018060401b0360c48501351162000c9d5761010462000c819162000c326020966044369160c4810135010162002f77565b608085015262000c5d60e4823560c051610100516101e05161016051600435010101010101620049b0565b60a08501523560c051610100516101e05161016051600435010101010101620049b0565b60c082015281520191602060a0510160a0529291909162000810565b8680fd5b8380fd5b5080fd5b8280fd5b50506101a0516101405160600152610100516101e0516101605194956004359095010101929091506001600160401b0360a48401351162000ca55736604360a4850135850101121562000ca55762000d0f602460a48501358501013562002c61565b9062000d1f604051928362002b94565b602460a4850135850101358252602082019060a4850135610100516101e0516101605160043501010101366044602460a48901358901013560051b8301011162000db457604401915b610100516101e0516101605160043501010160a48701359081019087016024013560051b0160440183101562000db85760058335101562000db457823581526020928301920162000d68565b8480fd5b509350509290926080610140510152610100516101e0516101605160043501010160018060401b0360c48201351162000ca15762000e01906024369160c4810135010162004a24565b6101405160a00152610100516101e051610160516004350101016001600160401b0360e48201351162000ca15762000e44906024369160e4810135010162004aaf565b60c0610140510152610100516101e051610160516004350101016101048101359060018060401b03821162000db457602462000e84923692010162002f77565b60e0610140510152610140516040610120510152610120516101c0515260206101c051016101c052602060e0510160e052909162000376565b60208401858152849084600435604401356001600160401b03811162000ca55762000ef090600436918135010162002f77565b604084015282516001600160a01b03919062000f4990831662000f4062000f2162000f1b33620335e4565b62004ba8565b62000f3962000f33878a5116620335e4565b62004c0e565b9062004c65565b90331462004cac565b8251805182101562000fb6579062000faa62000fb0928462000f6d84339362004d46565b5151161462000fa362000f8462000f1b33620335e4565b62000f3962000f338862000f9a888c5162004d46565b515116620335e4565b9062004cac565b62004cdf565b62000f49565b62000fda62000fc5866200677e565b60405191829160208352602083019062002e26565b0390f35b503462000202576040366003190112620002025760209060ff906040906001600160a01b036200100d620029bc565b168152613f778452818120602435825284522054166040519015158152f35b503462000202576020366003190112620002025760c06200104f6004356200621c565b93604093919351958652602086015260408501526060840152608083015260a0820152f35b503462000202578060031936011262000202576020613f7254604051908152f35b50346200020257806003193601126200020257613f7590815491620010ba8362002c61565b91620010ca604051938462002b94565b8383526020938484018093835285832083915b838310620011475750505050604051928484019085855251809152604084019460408260051b8601019392955b828710620011185785850386f35b90919293828062001136600193603f198a8203018652885162002e26565b96019201960195929190926200110a565b600188819260409a99979a516200116c8162001164818962002cb6565b038262002b94565b81520192019201919096939596620010dd565b50346200020257602036600319011262000202576020906040906001600160a01b03620011ab620029bc565b168152611f4783522054604051908152f35b50346200020257602036600319011262000202576020620011e06004356200610a565b604051908152f35b5034620002025760203660031901126200020257604062001243916004358152613f76602052206200121a816200370e565b9060ff600782015491600960088201549101549060405195869560a0875260a087019062003273565b93602086015260408501526200125f606085018383166200350e565b60081c16151560808301520390f35b5034620002025760208060031936011262000ca557604051620012918162002ae9565b60405192620012a08462002b06565b80845260609384848201528460408201528252838383015283604083015283808301528360808301528060a08301528060c08301528060e083015280610100809301526004358152613f768352604090209160405192620013018462002ae9565b6200130c816200370e565b84526200131c600382016200351c565b8483019081529262001331600483016200351c565b604086019081529562001347600584016200351c565b868201908152926200135c600682016200351c565b956080880196875260078201549660a0890197885260088301549260c08a01938452600901549560e08a019460ff8816620013989087620052db565b868b019760081c60ff16151588526040519b8c9b8a8d52518c6101209b8c9101526101408d01620013c99162003273565b9451601f198d8703810160408f015295620013e49162002fcf565b905191858d830301908d0152620013fb9162002fcf565b905190838b82030160808c0152620014139162002fcf565b9051918982030160a08a01526200142a9162002fcf565b955160c08801525160e08701525190850162001446916200350e565b511515908301520390f35b5034620002025760203660031901126200020257600435906103e8821015620014ce575060031b6001810154600282015491620014c46005620014a560068401549362001164604051809481930162002cb6565b6040519485948552602085015260806040850152608084019062002e26565b9060608301520390f35b634e487b7160e01b81526032600452602490fd5b50346200020257806003193601126200020257611f42805490620015068262002c61565b9162001516604051938462002b94565b808352602083019184526020842084925b828410620016e4578585611f43805490620015428262002c61565b9362001552604051958662002b94565b82855260208501918152602081209080925b8484106200159a576200158b8662000fda89604051938493604085526040850190620030b7565b908382036020850152620030b7565b604051620015a88162002acd565b620015b860ff85541682620035e5565b60018401546020820152600284018054620015d38162002c61565b91620015e3604051938462002b94565b81835285526020808620869184015b8383106200165d57505050506001928260209260406006950152600387015460608201526040516200162d81620011648160048c0162002cb6565b608082015260ff6005880154818116151560a084015260081c16151560c082015281520193019301929162001564565b600190602060405191620016718362002ab1565b84548352838501549260ff8416620016898162002fc4565b8382015260ff600894851c16620016a08162002a18565b604082015260028601546060820152620016bd600387016200351c565b6080820152620016d060048701620036ac565b60a0820152815201920192019190620015f2565b604051620016f28162002acd565b6200170260ff84541682620035e5565b6001808401546020830152600284019081546200171f8162002c61565b926200172f604051948562002b94565b8184528a526020808b208b9185015b838310620017aa5750505050506001928260209260406006950152600386015460608201526040516200177a81620011648160048b0162002cb6565b608082015260ff6005870154818116151560a084015260081c16151560c082015281520192019301929062001527565b8490602060405191620017bd8362002ab1565b84548352838501549260ff8416620017d58162002fc4565b8382015260ff600894851c16620017ec8162002a18565b60408201526002860154606082015262001809600387016200351c565b60808201526200181c60048701620036ac565b60a08201528152019201920191906200173e565b50346200020257602036600319011262000202576020906040906001600160a01b036200185c620029bc565b168152611f4583522054604051908152f35b5034620002025760208060031936011262000ca5578160043591620018b14784111562000fa36200189f86620050f5565b620018aa47620050f5565b9062004d8e565b3382526200191c611f45808352620018f5604085205486111562000fa3620018d988620050f5565b338852848752620018ee6040892054620050f5565b9062004dfa565b3384528083526200190b856040862054620050ba565b929062000fa3620018d988620050f5565b3384528252806040842055156200195e575b508080809381811562001954575b3390f115620019485780f35b604051903d90823e3d90fd5b506108fc6200193c565b9050611f46805491620019718362004e62565b918593865b81811062001a645750506200198b8462004e62565b805192906001600160401b03841162001a50579080849392620019b18a98979662004ff7565b0191865280862090865b84811062001a31575050505050825b828110620019da5750506200192e565b9192509062001a279062000faa6001600160a01b03620019fb838662004d46565b511662001a088362004eb6565b90919082549060031b9160018060a01b03809116831b921b1916179055565b90849291620019ca565b83516001600160a01b03168184015589975092810192600101620019bb565b634e487b7160e01b88526041600452602488fd5b62001a6f8162004eb6565b90546001600160a01b03916003913391831b1c83160362001a9e575b505062001a989062004cdf565b62001976565b9662001ace91839862001ab562001a989562004eb6565b9054911b1c1662001ac7828962004d46565b5262004cdf565b95903862001a8b565b50346200020257806003193601126200020257613f7080546001600160a01b03191633179055613f73805460ff19166001908117909155604051909190819062001b218162002b3f565b5290611f428054600082558062001e31575b508252818060405162001b468162002b3f565b5262001e1d57611f438054600082558062001d9e575b508252612710613f745562001d9062001b7462005bee565b836040519162001b848362002b3f565b81835262001c866040519162001b9a8362002b3f565b8383526040519462001bac8662002b3f565b8486526040519362001bbe8562002b3f565b8585526040519462001bd08662002b3f565b8686526040519162001be28362002a7f565b8252602097888301526040820152606094858201526040519162001c068362002ab1565b8683526003888401528660408401528686840152608083015260a082015262001c2f8262004cef565b5262001c3b8162004cef565b506040519062001c4b8262002acd565b6004825287868301526040820152838382015260405162001c6c8162002b3f565b84815260808201528660a08201528660c082015262005cfa565b62001c9062005bee565b60405162001c9e8162002b3f565b83815260405162001caf8162002b3f565b84815260405162001cc08162002b3f565b85815260405162001cd18162002b3f565b8681526040519162001ce38362002b3f565b8783526040519362001cf58562002a7f565b8452888401526040830152848201526040519162001d138362002ab1565b8583526003878401528560408401528585840152608083015260a082015262001d3c8262004cef565b5262001d488162004cef565b50856040519462001d598662002acd565b60058652850152604084015282015260405162001d768162002b3f565b84815260808201528260a08201528360c082015262005d46565b611388611faf55611fb05580f35b92506006838102938185040362001e075760009382855260208520908101905b81811062001dce57505062001b5c565b8086849255868682015562001de66002820162005504565b86600382015562001dfa6004820162005399565b8660058201550162001dbe565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b82526041600452602482fd5b92506006838102938185040362001e075760009382855260208520908101905b81811062001e6157505062001b33565b8086849255868682015562001e796002820162005504565b86600382015562001e8d6004820162005399565b8660058201550162001e51565b503462000202578060031936011262000202576020604051338152f35b5034620002025780600319360112620002025762001ed462002bb8565b6040519162001ee38362002b22565b611faf548352611fb0549060209182850152611fb1546040850152611fb254606085015260405180611fb390848254918281520191845284842090845b8181106200202c575050508162001f3991038262002b94565b6080850152611fb4805462001f4e8162002c61565b9162001f5e604051938462002b94565b818352835283832083908584015b83831062001ffe575050505060a085015260405180928391611fb591808354928381520192855280852094905b82821062001fda5750505062001fb29250038262002b94565b60c083015260ff611fb65416151560e083015262000fda611fb7546040519384938462002ead565b85546001600160a01b03168452600195860195879550938101939091019062001f99565b60018781926040999899516200201a8162001164818962002cb6565b81520192019201919095949562001f6c565b82546001600160a01b03168452928601926001928301920162001f20565b5034620002025760203660031901126200020257600435906103e8821015620014ce5762000fda6200208260048460031b0162002c03565b6040519182918262002a39565b50346200020257806003193601126200020257604051611f4180548083529083526020808301937f68ffef30f3d6829c9938575e8bc340aa2a3398e927d767947dd5024d1581d59292915b828210620020f55762000fda85620020828189038262002b94565b83546001600160a01b031686529485019460019384019390910190620020da565b5034620002025760209081600319360112620002025760409062002139620029bc565b8160608451620021498162002a7f565b82815286810183905285810182905201526001600160a01b03168152611f40835220604051906200217a8262002a7f565b620021f581549160ff83161515845260ff8585019360081c1615158352600260405191620021b983620021b1816001850162002cb6565b038462002b94565b6040860192835201549260608501938452604051958695818752511515908601525115156040850152516080606085015260a084019062002e26565b905160808301520390f35b50346200020257602036600319011262000202576020620011e060043562005e1c565b50346200020257806003193601126200020257611faf546200227c6200224862033044565b916200225a6127109384831062004cac565b62002272611fb254611fb054111562000fa3620330b2565b611fb15462005eb0565b90506200228862033108565b50825b6103e88110620022b0575b6020620022a685858504620061de565b9050604051908152f35b909260ff60078360031b01541615620022fa5781620022e4620022f092620022dd62000faa969562005e1c565b906200608f565b949062000fa362033108565b929091926200228b565b929062002296565b50346200020257604036600319011262000202576001600160401b0360043581811162000ca9576200233990369060040162002f77565b916024359182116200020257602062002362846200235b366004870162002f77565b9062006518565b6040519015158152f35b503462000202578060031936011262000202576040516200238d8162002b3f565b604051613f0383825b606482106200252557505050620023ad8162002b5b565b815260405191620023be8362002b22565b613f67548352613f68549060209182850152613f69546040850152613f6a54606085015260405180613f6b90848254918281520191845284842090845b8181106200250757505050816200241491038262002b94565b6080850152613f6c8054620024298162002c61565b9162002439604051938462002b94565b818352835283832083908584015b838310620024d9575050505060a085015260405180928391613f6d91808354928381520192855280852094905b828210620024b5575050506200248d9250038262002b94565b60c083015260ff613f6e5416151560e083015262000fda613f6f546040519384938462002ead565b85546001600160a01b03168452600195860195879550938101939091019062002474565b6001878192604099989951620024f58162001164818962002cb6565b81520192019201919095949562002447565b82546001600160a01b031684529286019260019283019201620023fb565b600160208192855481520193019101909162002396565b5034620002025760208060031936011262000ca5576004356200256b4782111562000fa36200189f84620050f5565b33835282808080611f4794858752620025b0604083205482111562000fa36200259484620050f5565b338652898b52620025a96040872054620050f5565b906200526f565b338252858752620025f0620025ca826040852054620050ba565b919062000fa3620025db85620050f5565b3387528a8c52620025a96040882054620050f5565b338352868852604083205581811562002758575b3390f1156200274d57338352815260408220541562002621575080f35b611f48805491620026328362004e62565b918493855b818110620026f35750506200264c8462004e62565b805192906001600160401b038411620026df5781906200266c8562004fbc565b0191865280862090865b848110620026c3575050505050825b828110620026935750505080f35b620026bd9062000faa6001600160a01b03620026b0838662004d46565b511662001a088362004e9a565b62002685565b83516001600160a01b0316838201559281019260010162002676565b634e487b7160e01b87526041600452602487fd5b620026fe8162004e9a565b90546001600160a01b03916003913391831b1c8316036200272d575b5050620027279062004cdf565b62002637565b966200274491839862001ab5620027279562004e9a565b9590386200271a565b6040513d84823e3d90fd5b506108fc62002604565b50346200020257806003193601126200020257604051611f4680548083529083526020808301937f721f0813146d89d6f0f0dbb1451dd10acd9dadea7c30d73459c3079bc665b9a892915b828210620027c85762000fda85620020828189038262002b94565b83546001600160a01b031686529485019460019384019390910190620027ad565b50346200020257604036600319011262000202576004356024356001600160a01b0381169081900362000ca9576103e88210156200283b579160036040926020948352811b0183522054604051908152f35b634e487b7160e01b83526032600452602483fd5b50346200020257806003193601126200020257604051611f4880548083529083526020808301937f54b856f7ae688db523226c6d190d6c3f1578f46968ba7de0cc9e487420dbf24c92915b828210620028b55762000fda85620020828189038262002b94565b83546001600160a01b0316865294850194600193840193909101906200289a565b50346200020257806003193601126200020257602060ff613f73541660405190620029018162002a18565b8152f35b5034620002025760209081600319360112620002025762002925620029bc565b6200292f620052e8565b506001600160a01b03168152611f498252604080822090519190620029548362002b3f565b60405193849192915b606483106200298757610c808587620029768162002b5b565b8152620002006040518092620029ed565b600182819286548152019401920191926200295d565b90503462000ca5578160031936011262000ca557602090613f71548152f35b600435906001600160a01b0382168203620029d357565b600080fd5b35906001600160a01b0382168203620029d357565b516000915b6064831062002a0057505050565b600190825181526020809101920192019190620029f2565b6004111562002a2357565b634e487b7160e01b600052602160045260246000fd5b6020908160408183019282815285518094520193019160005b82811062002a61575050505090565b83516001600160a01b03168552938101939281019260010162002a52565b608081019081106001600160401b0382111762002a9b57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111762002a9b57604052565b60e081019081106001600160401b0382111762002a9b57604052565b61012081019081106001600160401b0382111762002a9b57604052565b606081019081106001600160401b0382111762002a9b57604052565b61010081019081106001600160401b0382111762002a9b57604052565b602081019081106001600160401b0382111762002a9b57604052565b610c8081019081106001600160401b0382111762002a9b57604052565b604081019081106001600160401b0382111762002a9b57604052565b601f909101601f19168101906001600160401b0382119082101762002a9b57604052565b6040519062002bc78262002b3f565b60405182611f4b6000835b6064821062002bec5750505062002be98262002b5b565b52565b600160208192855481520193019101909162002bd2565b9060405191828154918282526020928383019160005283600020936000905b82821062002c3d5750505062002c3b9250038362002b94565b565b85546001600160a01b03168452600195860195889550938101939091019062002c22565b6001600160401b03811162002a9b5760051b60200190565b90600182811c9216801562002cab575b602083101462002c9557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002c89565b906000929180549162002cc98362002c79565b91828252600193848116908160001462002d30575060011462002ced575b50505050565b90919394506000526020928360002092846000945b83861062002d1b57505050500101903880808062002ce7565b80548587018301529401938590820162002d02565b9294505050602093945060ff191683830152151560051b0101903880808062002ce7565b90815462002d628162002c61565b9260409362002d748551918262002b94565b828152809460208092019260005281600020906000935b85851062002d9b57505050505050565b6001848192845162002db38162001164818a62002cb6565b81520193019401939162002d8b565b90815180825260208080930193019160005b82811062002de3575050505090565b83516001600160a01b03168552938101939281019260010162002dd4565b60005b83811062002e155750506000910152565b818101518382015260200162002e04565b9060209162002e418151809281855285808601910162002e01565b601f01601f1916010190565b908082519081815260208091019281808460051b8301019501936000915b84831062002e7c5750505050505090565b909192939495848062002e9c600193601f198682030187528a5162002e26565b980193019301919493929062002e6b565b93929162002ebf85610ca093620029ed565b610cc080610c808701528151908601526020810151610ce08601526040810151610d008601526060810151610d2086015260e062002f4b62002f146080840151610100610d408a0152610dc089019062002dc2565b62002f3460a085015191610cbf1992838b830301610d608c015262002e4d565b9060c08501519089830301610d808a015262002dc2565b9101511515610da0860152930152565b6001600160401b03811162002a9b57601f01601f191660200190565b81601f82011215620029d35780359062002f918262002f5b565b9262002fa1604051948562002b94565b82845260208383010111620029d357816000926020809301838601378301015290565b6005111562002a2357565b90815180825260208080930193019160005b82811062002ff0575050505090565b83518552938101939281019260010162002fe1565b90815180825260208092019182818360051b82019501936000915b848310620030315750505050505090565b90919293949584806200304d83856001950387528a5162002fcf565b980193019301919493929062003020565b90815180825260208092019182818360051b82019501936000915b8483106200308a5750505050505090565b9091929394958480620030a683856001950387528a5162002dc2565b980193019301919493929062003079565b90815180825260208092019081926005928183851b82019601946000915b848310620030e7575050505050505090565b90919293949596818103835287519060e0808201835190600682101562002a235783929189945283850151848401528a60409182870151938386015283518091528561010082818801941b87010194019260005b8281106200319a5750505050509282916200317060019560608085015190840152608080850151908483039085015262002e26565b9160a08082015115159083015260c0809101511515910152990193019301919594939290620030d5565b91939596806200325f600193959760ff198b82030189528951908151815283820151620031c78162002fc4565b8482015287820151620031da8162002a18565b888201526060908183015182820152816200324f6200323e6200322d6080620032108189015160c080848a015288019062002fcf565b9560a0809901519881880391015287519080875286019062002e4d565b888701518582038a87015262003005565b8b8601518482038d8601526200305e565b9301519181840391015262002e26565b970195019101918b9695949391926200313b565b90606081019160018060a01b03815116825260208101519260606020840152835180915260808301602060808360051b86010195019160005b818110620032d55750505050906040620032d29392015190604081840391015262002e26565b90565b858703607f19018352835180516001600160a01b031688526020810151949793949293919290602682101562002a2357604091602084015201519060606040820152620033318251610100606084015261016083019062002e4d565b602083810151838303605f190160808501528051808452928201929101906000905b808210620034f3575050506040830151605f198383030160a0840152805180835260208301906020808260051b86010193019360005b8281106200346e57505050506060840151838203605f190160c0850152620033b29250620030b7565b608083015190605f198382030160e0840152602080835192838152019201906000905b8082106200344a575050506200343d8360209360e0620034266200340e879660a060019a0151605f198683030161010087015262003005565b60c0850151848203605f19016101208601526200305e565b92015190610140605f198285030191015262002e26565b98019401929101620032ac565b9091926020806001928651620034608162002fc4565b8152019401920190620033d5565b90919293602080600192601f19868203018852885190620034d76200349c835160e080855284019062002fcf565b8484015185840152604084015160408401526060840151606084015260808401511515608084015260a084015183820360a085015262002e26565b60c0928301511515919092015297019695019392910162003389565b90919260208060019286511515815201940192019062003353565b90600382101562002a235752565b9060405191828154918282526020928383019160005283600020936000905b828210620035545750505062002c3b9250038362002b94565b8554845260019586019588955093810193909101906200353b565b906040516200357e8162002acd565b60c060ff6006839562003591816200351c565b85526001810154602086015260028101546040860152600381015460608601528260048201541615156080860152604051620035d68162001164816005860162002cb6565b60a08601520154161515910152565b600682101562002a235752565b908154620036008162002c61565b9262003610604051948562002b94565b818452600090815260208082208186015b84841062003630575050505050565b600183819262003640856200351c565b81520192019301929062003621565b9081546200365d8162002c61565b926200366d604051948562002b94565b818452600090815260208082208186015b8484106200368d575050505050565b60018381926200369d8562002c03565b8152019201930192906200367e565b9060036060604051620036bf8162002a7f565b6200370a8195620036d08162002d54565b8352620036e060018201620035f2565b6020840152620036f3600282016200364f565b6040840152620021b1604051809681930162002cb6565b0152565b906040516200371d8162002b06565b82546001600160a01b03168152600183018054919384929091620037418262002c61565b9162003751604051938462002b94565b80835260208301916000526020600020916000905b828210620037935750505050916200370a6040926002946020840152620021b18451809681930162002cb6565b604051620037a18162002b06565b84546001600160a01b038116825260a01c60ff16602681101562002a23576020820152604051620037d28162002b22565b620037e06001870162002d54565b815260028601604051808260208294549384815201906000526020600020926000905b80601f83011062004753576200393c9454918181106200473c575b81811062004722575b81811062004708575b818110620046ee575b818110620046d5575b818110620046bb575b818110620046a1575b81811062004687575b8181106200466d575b81811062004653575b81811062004639575b8181106200461f575b81811062004605575b818110620045eb575b818110620045d1575b818110620045b7575b8181106200459d575b81811062004583575b81811062004569575b8181106200454f575b81811062004535575b8181106200451b575b81811062004501575b818110620044e7575b818110620044cd575b818110620044b3575b81811062004499575b8181106200447f575b81811062004465575b8181106200444b575b81811062004431575b1062004420575b50038262002b94565b6020820152600386018054620039528162002c61565b9162003962604051938462002b94565b81835260208301906000526020600020906000905b838210620043ff57505050506040820152600486018054620039998162002c61565b91620039a9604051938462002b94565b81835260208301906000526020600020906000905b838210620042af57505050506060820152600586016040519081602082549182815201916000526020600020906000915b81601f84011062003fa65784600997946020979460019a979462003b3594549181811062003f88575b81811062003f67575b81811062003f46575b81811062003f25575b81811062003f05575b81811062003ee4575b81811062003ec3575b81811062003ea2575b81811062003e81575b81811062003e60575b81811062003e3f575b81811062003e1e575b81811062003dfd575b81811062003ddc575b81811062003dbb575b81811062003d9a575b81811062003d79575b81811062003d58575b81811062003d37575b81811062003d16575b81811062003cf5575b81811062003cd4575b81811062003cb3575b81811062003c92575b81811062003c71575b81811062003c50575b81811062003c2f575b81811062003c0e575b81811062003bed575b81811062003bcc575b81811062003bab575b1062003b905750038262002b94565b608082015262003b4860068a01620035f2565b60a082015262003b5b60078a016200364f565b60c082015260405162003b7781620011648160088e0162002cb6565b60e0820152604082015281520194019101909262003766565b90889160f81c62003ba18162002fc4565b8152013862003933565b928a8d9160ff8560f01c1662003bc18162002fc4565b815201930162003b26565b928a8d9160ff8560e81c1662003be28162002fc4565b815201930162003b1d565b928a8d9160ff8560e01c1662003c038162002fc4565b815201930162003b14565b928a8d9160ff8560d81c1662003c248162002fc4565b815201930162003b0b565b928a8d9160ff8560d01c1662003c458162002fc4565b815201930162003b02565b928a8d9160ff8560c81c1662003c668162002fc4565b815201930162003af9565b928a8d9160ff8560c01c1662003c878162002fc4565b815201930162003af0565b928a8d9160ff8560b81c1662003ca88162002fc4565b815201930162003ae7565b928a8d9160ff8560b01c1662003cc98162002fc4565b815201930162003ade565b928a8d9160ff8560a81c1662003cea8162002fc4565b815201930162003ad5565b928a8d9160ff8560a01c1662003d0b8162002fc4565b815201930162003acc565b928a8d9160ff8560981c1662003d2c8162002fc4565b815201930162003ac3565b928a8d9160ff8560901c1662003d4d8162002fc4565b815201930162003aba565b928a8d9160ff8560881c1662003d6e8162002fc4565b815201930162003ab1565b928a8d9160ff8560801c1662003d8f8162002fc4565b815201930162003aa8565b928a8d9160ff8560781c1662003db08162002fc4565b815201930162003a9f565b928a8d9160ff8560701c1662003dd18162002fc4565b815201930162003a96565b928a8d9160ff8560681c1662003df28162002fc4565b815201930162003a8d565b928a8d9160ff8560601c1662003e138162002fc4565b815201930162003a84565b928a8d9160ff8560581c1662003e348162002fc4565b815201930162003a7b565b928a8d9160ff8560501c1662003e558162002fc4565b815201930162003a72565b928a8d9160ff8560481c1662003e768162002fc4565b815201930162003a69565b928a8d9160ff8560401c1662003e978162002fc4565b815201930162003a60565b928a8d9160ff8560381c1662003eb88162002fc4565b815201930162003a57565b928a8d9160ff8560301c1662003ed98162002fc4565b815201930162003a4e565b928a8d9160ff8560281c1662003efa8162002fc4565b815201930162003a45565b928a8d9160ff85831c1662003f1a8162002fc4565b815201930162003a3c565b928a8d9160ff8560181c1662003f3b8162002fc4565b815201930162003a33565b928a8d9160ff8560101c1662003f5c8162002fc4565b815201930162003a2a565b928a8d9160ff8560081c1662003f7d8162002fc4565b815201930162003a21565b928a8d9160ff851662003f9b8162002fc4565b815201930162003a18565b926001610400602092865460ff811662003fc08162002fc4565b825260ff8160081c1662003fd48162002fc4565b8583015260ff8160101c1662003fea8162002fc4565b604083015260ff8160181c16620040018162002fc4565b606083015260ff81861c16620040178162002fc4565b608083015260ff8160281c166200402e8162002fc4565b60a083015260ff8160301c16620040458162002fc4565b60c08301526200405b60ff8260381c1662002fc4565b60ff8160381c1660e083015260ff8160401c16620040798162002fc4565b61010083015260ff8160481c16620040918162002fc4565b61012083015260ff8160501c16620040a98162002fc4565b61014083015260ff8160581c16620040c18162002fc4565b61016083015260ff8160601c16620040d98162002fc4565b61018083015260ff8160681c16620040f18162002fc4565b6101a083015260ff8160701c16620041098162002fc4565b6101c083015260ff8160781c16620041218162002fc4565b6101e083015260ff8160801c16620041398162002fc4565b61020083015260ff8160881c16620041518162002fc4565b61022083015260ff8160901c16620041698162002fc4565b61024083015260ff8160981c16620041818162002fc4565b61026083015260ff8160a01c16620041998162002fc4565b61028083015260ff8160a81c16620041b18162002fc4565b6102a083015260ff8160b01c16620041c98162002fc4565b6102c083015260ff8160b81c16620041e18162002fc4565b6102e083015260ff8160c01c16620041f98162002fc4565b61030083015260ff8160c81c16620042118162002fc4565b61032083015260ff8160d01c16620042298162002fc4565b61034083015260ff8160d81c16620042418162002fc4565b61036083015260ff8160e01c16620042598162002fc4565b61038083015260ff8160e81c16620042718162002fc4565b6103a083015260ff8160f01c16620042898162002fc4565b6103c083015260f81c6200429d8162002fc4565b6103e0820152019401920191620039ef565b604051620042bd8162002acd565b620042cd60ff85541682620035e5565b60018401546020820152600284018054620042e88162002c61565b91620042f8604051938462002b94565b81835260208301906000526020600020906000905b8382106200437857505050506001928260209260406006950152600387015460608201526040516200434881620011648160048c0162002cb6565b608082015260ff6005880154818116151560a084015260081c16151560c0820152815201930191019091620039be565b6001906020604051916200438c8362002ab1565b85548352838601549260ff8416620043a48162002fc4565b8382015260ff600894851c16620043bb8162002a18565b604082015260028701546060820152620043d8600388016200351c565b6080820152620043eb60048801620036ac565b60a08201528152019301910190916200430d565b6007602060019262004411866200356f565b81520193019101909162003977565b60f81c151581526020013862003933565b92602060019160ff8560f01c16151581520193016200392c565b92602060019160ff8560e81c161515815201930162003923565b92602060019160ff8560e01c16151581520193016200391a565b92602060019160ff8560d81c161515815201930162003911565b92602060019160ff8560d01c161515815201930162003908565b92602060019160ff8560c81c1615158152019301620038ff565b92602060019160ff8560c01c1615158152019301620038f6565b92602060019160ff8560b81c1615158152019301620038ed565b92602060019160ff8560b01c1615158152019301620038e4565b92602060019160ff8560a81c1615158152019301620038db565b92602060019160ff8560a01c1615158152019301620038d2565b92602060019160ff8560981c1615158152019301620038c9565b92602060019160ff8560901c1615158152019301620038c0565b92602060019160ff8560881c1615158152019301620038b7565b92602060019160ff8560801c1615158152019301620038ae565b92602060019160ff8560781c1615158152019301620038a5565b92602060019160ff8560701c16151581520193016200389c565b92602060019160ff8560681c161515815201930162003893565b92602060019160ff8560601c16151581520193016200388a565b92602060019160ff8560581c161515815201930162003881565b92602060019160ff8560501c161515815201930162003878565b92602060019160ff8560481c16151581520193016200386f565b92602060019160ff8560401c161515815201930162003866565b92602060019160ff8560381c16151581520193016200385d565b92602060019160ff8560301c161515815201930162003854565b92602060019160ff8560281c16151581520193016200384b565b92602060019160ff85831c161515815201930162003842565b92602060019160ff8560181c161515815201930162003839565b92602060019160ff8560101c161515815201930162003830565b92602060019160ff8560081c161515815201930162003827565b92602060019160ff8516151581520193016200381e565b916020919350610400600191865460ff81161515825260ff8160081c1615158583015260ff8160101c161515604083015260ff816060828260181c161515818601528282608082828c1c16151581890152828260281c16151560a0890152828260c095828260301c161515878c0152828260381c16151560e08c0152828260401c1615156101008c0152828260481c1615156101208c0152828260501c1615156101408c0152828260581c1615156101608c01521c161515610180890152828260681c1615156101a0890152828260701c1615156101c0890152828260781c1615156101e08901521c161515610200860152828260881c161515610220860152828260901c161515610240860152828260981c161515610260860152828260a01c161515610280860152828260a81c1615156102a0860152828260b01c1615156102c0860152828260b81c1615156102e08601521c16151561030083015260ff8160c81c16151561032083015260ff8160d01c16151561034083015260ff8160d81c16151561036083015260ff8160e01c16151561038083015260ff8160e81c1615156103a083015260ff8160f01c1615156103c083015260f81c15156103e082015201940192018492939162003803565b9080601f83011215620029d357813590620049408262002c61565b9262004950604051948562002b94565b828452602092838086019160051b83010192808411620029d357848301915b848310620049805750505050505090565b82356001600160401b038111620029d3578691620049a48484809489010162002f77565b8152019201916200496f565b35908115158203620029d357565b81601f82011215620029d357803591620049d88362002c61565b92620049e8604051948562002b94565b808452602092838086019260051b820101928311620029d3578301905b82821062004a14575050505090565b8135815290830190830162004a05565b9080601f83011215620029d35781359062004a3f8262002c61565b9262004a4f604051948562002b94565b828452602092838086019160051b83010192808411620029d357848301915b84831062004a7f5750505050505090565b82356001600160401b038111620029d357869162004aa384848094890101620049be565b81520192019162004a6e565b9080601f83011215620029d35781359162004aca8362002c61565b9260409262004adc8451958662002b94565b8185526020938486019185600594851b86010194818611620029d357868101935b86851062004b1057505050505050505090565b84356001600160401b038111620029d357820183603f82011215620029d357888101359062004b3f8262002c61565b9162004b4e8751938462002b94565b808352868b8401918a1b83010191868311620029d35791878c94929593015b81811062004b8657505082935081520194019362004afd565b91938091939562004b9784620029d8565b8152019101918b9391949262004b6d565b9062002c3b604560405180947f496e76616c69642070726f6772616d20616464726573732e204d73672e73656e60208301526403232b91d160dd1b604083015262004bfd815180926020868601910162002e01565b810103602581018552018362002b94565b9062002c3b6040805180947f2c20616e642070726f6772616d206f70657261746f7220616464726573733a20602083015262004c54815180926020868601910162002e01565b810103602081018552018362002b94565b602062002c3b91939293604051948162004c89879351809286808701910162002e01565b820162004c9f8251809386808501910162002e01565b0103808552018362002b94565b1562004cb55750565b60405162461bcd60e51b81526020600482015290819062004cdb90602483019062002e26565b0390fd5b600019811462001e075760010190565b80511562004cfd5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101562004cfd5760400190565b80516002101562004cfd5760600190565b80516003101562004cfd5760800190565b805182101562004cfd5760209160051b010190565b7f496e76616c696420776974686472617720616d6f756e742e20416d6f756e743a8152600160fd1b602082015260210190565b600f62002c3b916020949360405195869262004dbe62004db083860162004d5b565b918281519485920162002e01565b016e0161030b732103130b630b731b29d1608d1b815262004de9825180936020878501910162002e01565b010360101981018552018362002b94565b601962002c3b916020949360405195869262004e1c62004db083860162004d5b565b01780161030b732103bb4ba34323930bbb0b136329031b0b9b41d1603d1b815262004e51825180936020878501910162002e01565b010360061981018552018362002b94565b9062004e6e8262002c61565b62004e7d604051918262002b94565b828152809262004e90601f199162002c61565b0190602036910137565b611f48805482101562004cfd5760005260206000200190600090565b611f46805482101562004cfd5760005260206000200190600090565b611f41805482101562004cfd5760005260206000200190600090565b613f02805482101562004cfd5760005260206000200190600090565b611f4a805482101562004cfd5760005260206000200190600090565b613efe805482101562004cfd5760005260206000200190600090565b613f00805482101562004cfd5760005260206000200190600090565b805482101562004cfd5760005260206000200190600090565b8181029291811591840414171562001e0757565b919082549060031b91821b91600019901b1916179055565b81811062004faf575050565b6000815560010162004fa3565b600160401b811162002a9b57611f489081549080835581811062004fdf57505050565b62002c3b926000526020600020918201910162004fa3565b600160401b811162002a9b57611f469081549080835581811062004fdf57505050565b805460008255806200502a575050565b62002c3b9160005260206000209081019062004fa3565b600160401b811162002a9b57613efe9081549080835581811062004fdf57505050565b600160401b811162002a9b57613f009081549080835581811062004fdf57505050565b611fb5805460008255806200502a575050565b90600160401b811162002a9b5781549080835581811062004fdf57505050565b9190828111620050cb576001920390565b50600091508190565b8115620050df570490565b634e487b7160e01b600052601260045260246000fd5b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8082101562005260575b506904ee2d6d415b85acef8160201b8083101562005250575b50662386f26fc100008083101562005240575b506305f5e1008083101562005230575b506127108083101562005220575b5060648210156200520f575b600a8092101562005204575b60019081602181860195620051918762002f5b565b96620051a1604051988962002b94565b808852620051b2601f199162002f5b565b01366020890137860101905b620051cb575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215620051fe57919082620051be565b620051c4565b91600101916200517c565b919060646002910491019162005170565b6004919392049101913862005164565b6008919392049101913862005156565b6010919392049101913862005146565b6020919392049101913862005133565b6040935081049150386200511a565b601e62002c3b91602094936040519586926200529162004db083860162004d5b565b017f2c20616e6420776974686472617761626c65206469766964656e64733a2000008152620052ca825180936020878501910162002e01565b010360011981018552018362002b94565b600382101562002a235752565b60405190620052f78262002b3f565b60405182620053068262002b5b565b610c8036833752565b906200531b8262002c61565b6040906200532c8251918262002b94565b83815280936200533f601f199162002c61565b019160005b838110620053525750505050565b6020908251620053628162002acd565b6000815282600081830152606080868401526000818401526080830152600060a0830152600060c083015282860101520162005344565b620053a5815462002c79565b9081620053b0575050565b81601f60009311600114620053c3575055565b908083918252620053e4601f60208420940160051c84016001850162004fa3565b5555565b8054906000815581620053f9575050565b6000526020600020908101905b81811062005412575050565b806200542060019262005399565b0162005406565b90600160401b811162002a9b578154918181558282106200544757505050565b600052602060002091820191015b81811062005461575050565b806200546f60019262005399565b0162005455565b805490600081558162005487575050565b6000526020600020908101905b818110620054a0575050565b80620054ae6001926200501a565b0162005494565b90600160401b811162002a9b57815491818155828210620054d557505050565b600052602060002091820191015b818110620054ef575050565b80620054fd6001926200501a565b01620054e3565b8054600091828155816200551757505050565b6001600160fd1b0382168203620055a45782526020822091600391821b8301925b838110620055465750505050565b808260089255826001820155826002820155620055658482016200501a565b6200557360048201620053e8565b620055816005820162005476565b6200558f6006820162005476565b6200559d6007820162005399565b0162005538565b634e487b7160e01b83526011600452602483fd5b600160401b821162002a9b57805490828155818310620055d757505050565b6001600160fd1b03828116830362001e07578316830362001e0757600090815260208120600392831b810193831b015b838110620056155750505050565b808260089255826001820155826002820155620056348482016200501a565b6200564260048201620053e8565b620056506005820162005476565b6200565e6006820162005476565b6200566c6007820162005399565b0162005607565b51600681101562002a235790565b90600681101562002a235760ff80198354169116179055565b90620056a68162002fc4565b60ff80198354169116179055565b90620056c08162002a18565b61ff0082549160081b169061ff001916179055565b9190601f8111620056e557505050565b62002c3b926000526020600020906020601f840160051c8301931062005714575b601f0160051c019062004fa3565b909150819062005706565b81519192916001600160401b03811162002a9b576200574b8162005744845462002c79565b84620056d5565b602080601f83116001146200578a5750819293946000926200577e575b50508160011b916000199060031b1c1916179055565b01519050388062005768565b90601f198316958460005282600020926000905b888210620057d957505083600195969710620057bf575b505050811b019055565b015160001960f88460031b161c19169055388080620057b5565b806001859682949686015181550195019301906200579e565b9060ff801983541691151516179055565b9061ff00825491151560081b169061ff001916179055565b8151600681101562002a235762005833908262005681565b602082015160018201556002810160408301516020815191620058578385620055b8565b01916000526020600020916000905b828210620058b857505050509060c0600562002c3b9360608401516003820155620058996080850151600483016200571f565b0191620058ad60a0820151151584620057f2565b015115159062005803565b805180518555620058f860018601620058e16020840151620058da8162002fc4565b826200569a565b604083015190620058f28262002a18565b620056b4565b60608101516002860155608081015180519060038701906001600160401b03831162002a9b576020906200592d84846200509a565b0190600052602060002060005b83811062005bd9575050505060a001518051805190600487019060209062005963848462005427565b01906000526020600020906000905b83821062005bb957505050506005850160208201516020815191620059988385620054b5565b019160005260206000206000925b82841062005b5557505050506006850160408201516020815191620059cc8385620054b5565b019160005260206000206000925b82841062005ae85750505050606001518051906001600160401b03821162002a9b5762005a1a8262005a10600789015462002c79565b60078901620056d5565b602090601f831160011462005a6d57928260089360209360019660009262005a61575b5050600019600383901b1c191690851b1760078801555b0194019101909262005866565b01519050388062005a3d565b906007870160005260206000209160005b601f198516811062005acf575083602093600196938793600897601f1981161062005ab5575b505050811b01600788015562005a54565b015160001960f88460031b161c1916905538808062005aa4565b9192602060018192868501518155019401920162005a7e565b80518051906001600160401b03821162002a9b5760209062005b0b83866200509a565b0183600052602060002060005b83811062005b37575050505060016020819201920193019290620059da565b82516001600160a01b03168183015560209092019160010162005b18565b80518051906001600160401b03821162002a9b5760209062005b7883866200509a565b0183600052602060002060005b83811062005ba4575050505060016020819201920193019290620059a6565b60019060208451940193818401550162005b85565b600160208262005bcc839451876200571f565b0193019101909162005972565b6001906020845194019381840155016200593a565b60409081519162005bff8362002b78565b60018352829160005b60208082101562005c725783516020929162005c248262002ab1565b60008252600081830152600086830152606060008184015280608084015286519062005c508262002a7f565b808252808383015280888301528082015260a083015282880101520162005c08565b505091925050565b611f43805482101562004cfd576000526006602060002091020190600090565b613efb805482101562004cfd576000526006602060002091020190600090565b611f42805482101562004cfd576000526006602060002091020190600090565b613efa805482101562004cfd576000526006602060002091020190600090565b611f428054600160401b81101562002a9b5762005d1d9160018201905562005cba565b91909162005d305762002c3b916200581b565b634e487b7160e01b600052600060045260246000fd5b611f438054600160401b81101562002a9b5762005d1d9160018201905562005c7a565b613efb8054600160401b81101562002a9b5762005d1d9160018201905562005c9a565b613efa8054600160401b81101562002a9b5762005d1d9160018201905562005cda565b1562005db757565b60405162461bcd60e51b815260206004820152603760248201527f73756d4469766964656e64576569676874466f72546f6b656e436c6173733a206044820152766469766964656e64576569676874206f766572666c6f7760481b6064820152608490fd5b6103e881101562004cfd5762005e4a8162005e436002620032d29460031b01549162005f36565b9062005eb0565b919062005daf565b6103e881101562004cfd5762005e4a8162005e43611fba620032d29460031b01549162005fe5565b90811562005ea757606462005e938184029384620050d4565b0362005e9f5760019190565b600091508190565b60019150600090565b9190821562005ec85762005e938184029384620050d4565b5060019150600090565b1562005eda57565b60405162461bcd60e51b815260206004820152602e60248201527f746f74616c546f6b656e73506572546f6b656e436c6173733a20746f74616c5460448201526d6f6b656e73206f766572666c6f7760901b6064820152608490fd5b6103e8811015908162004cfd57600390811b906004928383019182549260009582879601935b85871062005f6e575050505050505090565b97969091929394959762005fd05762005fc48862005fbc62005f9662000faa9a9b8762004f5e565b905490881b1c6001600160a01b031660009081526020899052604081205490946200608f565b999062005ed2565b95949392919062005f5c565b603282634e487b7160e01b6000525260246000fd5b6103e8811015908162004cfd5790600391821b90611fbc820190815490600094611fbb869501915b8386106200601e5750505050505090565b9590919293949562004cfd576200607186620060696200604362000faa998962004f5e565b905490861b1c6001600160a01b031660009081526020879052604081205490946200608f565b989062005ed2565b94939291906200600d565b906001820191821062005e9f5760019190565b9190820191821062005e9f5760019190565b15620060a957565b60405162461bcd60e51b815260206004820152603360248201527f73756d566f74696e67576569676874466f72546f6b656e436c6173733a20766f60448201527274696e67576569676874206f766572666c6f7760681b6064820152608490fd5b6103e881101562004cfd57620061318162005e436001620032d29460031b01549162005f36565b9190620060a1565b6103e881101562004cfd57620061318162005e43611fb9620032d29460031b01549162005fe5565b611faf54620061736200224862033044565b9190506200618062033108565b5060009081925b6103e88410620061a4575b6200619f935004620061de565b905090565b9160ff60078560031b01541615620061d75783620022e4620061d092620022dd62000faa969762005e1c565b9262006187565b9162006192565b908015620061f657620061f191620050d4565b600191565b5050600090600090565b9190820180921162001e0757565b9190820391821162001e0757565b906107b2906301e1853e80840483810180821162001e07576001820181811162001e0757604583019082821162001e075760646200625f92049060021c6200620e565b9561017183019682881162001e075762006280906101908099049062006200565b9084840294848604148415171562001e075762015180948583029280840487149015171562001e0757620062c092620062b99162006200565b906200620e565b91600495869108159586620064df575b506040516101a081016001600160401b03811182821017620064ca57604052600c9687825261018080366020850137601f91826200630e8562004cef565b5215620064c05760ff601d5b16620063268462004d13565b5281620063338462004d24565b52601e620063418462004d35565b528251881015620064ab578160a0840152825160051015620064ab57601e60c0840152825160061015620064ab578160e0840152825160071015620064ab5781610100840152825160081015620064ab57601e610120840152825160091015620064ab57816101408401528251600a1015620064ab57601e6101608401528251600b1015620064ab57820152600096905b81881062006426575b50508282049460018601809611620064115760018701809711620064115750949392603c80610e10809585060494840604920690565b601190634e487b7160e01b6000525260246000fd5b90969262006435848362004d46565b51858102908082048714901517156200648e578110620064a3576200645b848362004d46565b5190858202918083048714901517156200648e5762006486916200647f916200620e565b9362004cdf565b9690620063d2565b601188634e487b7160e01b6000525260246000fd5b9296620063db565b603288634e487b7160e01b6000525260246000fd5b60ff601c6200631a565b604187634e487b7160e01b6000525260246000fd5b909550606486061590811591620064fa575b509438620062d0565b905085061538620064f1565b90815181101562004cfd570160200190565b908151815111620065cf576000905b6200653683518251906200620e565b8211620065c75760019260005b8251811015620065bc576001600160f81b0319806200656e62006567848862006200565b8562006506565b5116906200657d838662006506565b5116036200659657620065909062004cdf565b62006543565b5092509060005b620065b457620065ad9062004cdf565b9062006527565b505050600190565b50929190916200659d565b505050600090565b5050600090565b611f4680549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004eb6565b611f4a80549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004f0a565b611fb5805490600160401b82101562002a9b576001820180825582101562004cfd576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b611fb3805490600160401b82101562002a9b576001820180825582101562004cfd576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b611f4180549190600160401b83101562002a9b578262001a0891600162002c3b9501905562004ed2565b60405190620066f98262002b78565b60188252772a343290383937b3b930b69034b99032bc32b1baba32b21760411b6020830152565b604051906200672f8262002b06565b603a82527930b33a32b9103b37ba34b7339030b7321030b8383937bb30b61760311b6040837f5468652070656e64696e672070726f6772616d2069732065786563757465642060208201520152565b90600091825b60208083019081518051871015620069155781620067a788620067af9362004d46565b510162007387565b6026928382101562002a2357601a9182036200686d5787620067d2915162004d46565b5192828401519081101562002a2357036200682b5750936200681c6200682492620068146200680d60a0604062000faa9a0151015162004cef565b5162004cef565b51906200608f565b959062007395565b9262006784565b6064906040519062461bcd60e51b82526004820152601b60248201527a2a34329037b831b7b2329034b9903737ba102820acafa1a0a9a41760291b6044820152fd5b929190506200688681620067a789869a979a5162004d46565b8281101562002a2357601403620068bf575050906200681c62000faa95620022dd620068b88462006824965162004d46565b51620073e2565b620068d190620067a785855162004d46565b9081101562002a2357601514620068ef575b50620068249062004cdf565b906200681c6200690e95620022dd620068b88462006824965162004d46565b90620068e3565b5050509092508034106000146200698b5760405162461bcd60e51b815260206004820152603760248201527f546865207061796d656e74206973206e6f7420656e6f7567682e205468652074604482015276037ba30b6103830bcb6b2b73a1039b437bab6321031329604d1b6064820152608490fd5b8034116200720c575b50613f739182549260ff841693620069ac8562002a18565b600194808603620069e657505050620069dc919250620069d6620069d08262007479565b62007550565b620075da565b620032d2620066ea565b620069f18162002a18565b600281148080620071ff575b1562006e285750505062006a11826200748e565b1562006de95762006a22826200748e565b1562006dad5762006a5b90602080930190600260ff8560018060a01b0362006a4b865162004cef565b5151169460409687915162004cef565b510151015192541662006a6e8162002a18565b0362006d6d5781600052613f778085528360002092613f7880549485600052875260ff86600020541662006d2f5783519480600052613f7693848952600396878960002001540362006cc95783600052885286600020906000528752856000208960ff19825416179055886000905b62006b27575b505050505050742a3432903b37ba329034b99032bc32b1baba32b21760591b9192935062006b1062032533565b519162006b1d8362002b78565b6015835282015290565b845181101562006cc35786825480600052858a5262006b4c8389846000200162004f5e565b905490891b1c908a84888b62006b63838d62004d46565b511562006c2157505050505062006bc662006ba685549283600052888d52620022dd62006b9887600480986000200162004f5e565b9054908d1b1c91896203241d565b9092600052878c5262006bbf85858d6000200162004f5e565b9062004f8b565b1562006bdf575062006bd89062004cdf565b8962006add565b875162461bcd60e51b8152908101899052601c60248201527b766f74696e6720666f7220706f776572596573206f766572666c6f7760201b6044820152606490fd5b9062006c5e62006c7096620022dd87999462006bbf979860005284895262006c5187600580986000200162004f5e565b9054911b1c918d6203241d565b959097600052528c6000200162004f5e565b1562006c815762006bd89062004cdf565b865162461bcd60e51b815260048101899052601b60248201527a766f74696e6720666f7220706f7765724e6f206f766572666c6f7760281b6044820152606490fd5b62006ae3565b875162461bcd60e51b8152600481018a9052603960248201527f746865206e756d626572206f6620766f74657320646f6573206e6f74206d6174604482015278636820746865206e756d626572206f6620706f6c696369657360381b6064820152608490fd5b855162461bcd60e51b81526004810188905260176024820152761d9bdd195c881a185cc8185b1c9958591e481d9bdd1959604a1b6044820152606490fd5b825162461bcd60e51b8152600481018590526019602482015278766f74696e67206973206e6f7420696e2070726f677265737360381b6044820152606490fd5b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74652070726f6772616d60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527624b73b30b634b2103b37ba34b73390383937b3b930b69760491b6044820152606490fd5b62006e3882979495969762002a18565b60038214918280620071f2575b1562006ec75750505050505062006e5c81620074f5565b1562006e775762006e6d906202f2b7565b620032d262006720565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420657865637574696e672070656e64696e672070726f677261604482015261369760f11b6064820152608490fd5b62006ed28162002a18565b8180620071e4575b80620071d7575b156200710157505050509060ff9062006ef962032745565b54169062006f078262002a18565b810362006fc5575062006f1a8162007479565b1562006f345780620069d6620069d0620069dc9362007479565b60405162461bcd60e51b815260206004820152605f60248201527f54686520766f74696e672069732072656a656374656420616e64206e6f77204460448201527f41524320697320696e2069646c652073746174652e2054686520696e7075742060648201527f70726f6772616d206973206e6f7420612076616c69642070726f6772616d2e00608482015260a490fd5b8062006fd360039262002a18565b146200700c57505b60405162006fe98162002b78565b6013815272283937b3b930b6903a32b936b4b730ba32b21760691b602082015290565b6200701781620074f5565b15620070285762006e6d906202f2b7565b60405162461bcd60e51b815260206004820152609960248201527f54686520766f74696e672069732070617373656420616e64206e6f772044415260448201527f4320697320696e20657865637574696e672070656e64696e672073746174652e60648201527f2054686520696e7075742070726f6772616d206973206e6f7420612076616c6960848201527f6420455845435554455f50454e44494e475f50524f4752414d20746f2065786560a48201527831baba32903a3432903832b73234b73390383937b3b930b69760391b60c482015260e490fd5b6200710c8162002a18565b8215620071c2575b505080620071b4575b6200712c575050505062006fdb565b60ff19161790556200713e8162007479565b15620071585780620069d6620069d0620069dc9362007479565b60405162461bcd60e51b815260206004820152602e60248201527f5b4572726f72203030335d5468652070726f6772616d206973206e6f7420612060448201526d3b30b634b210383937b3b930b69760911b6064820152608490fd5b50613f72544210156200711d565b620071cf91925062002a18565b388062007114565b50613f7254421062006ee1565b50613f715442101562006eda565b50613f7254421062006e45565b50613f71544210620069fd565b60018060a01b039081845116600052611f4590816020526040600020541562007302575b6200723c9034620050ba565b9015620072be576200725f9083865116600052826020526040600020546200608f565b9290156200727d578451166000526020526040600020553862006994565b60405162461bcd60e51b81526020600482015260196024820152782a3432903732bb903130b630b731b29037bb32b9333637bb9760391b6044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527b2a3432903830bcb6b2b73a103932ba3ab9371037bb32b9333637bb9760211b6044820152606490fd5b611f4654939291906000805b86811062007344575b506200723c92939495501562007330575b905062007230565b6200733e84875116620065d6565b62007328565b84620073508262004eb6565b919054818b51169260031b1c161462007374576200736e9062004cdf565b6200730e565b5093945084935060016200723c62007317565b51602681101562002a235790565b156200739d57565b60405162461bcd60e51b815260206004820152601f60248201527f54686520746f74616c207061796d656e7420697320746f6f206c617267652e006044820152606490fd5b906000805b6040840160a0620073fc818351015162004d13565b51518410156200747157926200681c62007461604094620074598562007451866200743f8b620074468362000faa9f9e6200743f90620074679e51015162004d13565b5162004d46565b519451015162004d24565b519062005eb0565b929062007395565b6200608f565b91929050620073e7565b509093505050565b6020015151156200748957600190565b600090565b602001516001815103620074b257620074ab620032d29162004cef565b51620074b8565b50600090565b6020810151602681101562002a2357602003620074b2576040015160a081015151620074b25760c081015151620074b25751516200748957600190565b602001516001815103620074b25762007512620032d29162004cef565b516020810151602681101562002a2357602103620074b2576040015160a081015151620074b25760c081015151620074b25751516200748957600190565b156200755857565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642070726f6772616d60881b6044820152606490fd5b60809060208152602a60208201527f5468652070726f6772616d2069732064656e6965642062792074686520706c7560408201526967696e2073797374656d60b01b60608201520190565b620075e58162015182565b5162014c9357600681101562002a23576003811462014c3a5780620076425760405162461bcd60e51b8152602060048201526016602482015275151a19481c1c9bd9dc985b481a5cc81a5b9d985b1a5960521b6044820152606490fd5b600481036200b0db5750600080611f4a54905b8181106200b094575b5050156200b078575b60005b60209081830151918251821015620076cf57620076c181611f49620076a7620076a162000faa95620067a788620076c99a62004d46565b62033353565b9160018060a01b03885116600052526040600020620242c3565b429162004f8b565b6200766a565b50505060005b60208083015180518310156200771d57620076fa91620067a784620076a19362004d46565b90606482101562004cfd5762007717914290611f4b015562004cdf565b620076d5565b505050906000905b602083015180518310156200b0725782620077409162004d46565b516020810180516026908181101562002a2357156200b02f5781518181101562002a23576001036200798e5750506040809101906200778460c08351015162004cef565b5192620077a660a06200779b818651015162004cef565b519451015162004d13565b5195620077b785518551146202df8a565b620077c685518851146202dff0565b60005b85518110156200790c57620077df818662004d46565b516103e8908181101562004cfd57600160ff6007620078079360031b0154161515146202e052565b62007813828a62004d46565b5162007820838862004d46565b51908282101562004cfd5760066200783e9260031b0154906200608f565b906200784b848962004d46565b51918383101562004cfd576006620078689360031b01556202e0aa565b62007874828a62004d46565b519062007882838862004d46565b518181101562004cfd576001600160a01b039392620078c29160039086620078ab878e62004d46565b5116600052811b016020528760002054906200608f565b620078ce848a62004d46565b519283101562004cfd57600362000faa936200790696620078f0878e62004d46565b5116600052811b0160205287600020556202e109565b620077c9565b5093926200792991929650620079229062032f53565b9262032e37565b945192620079378462002b3f565b60008452600036813760005b835181101562007971578062000faa620079626200796b938762004d46565b51878a62032a46565b62007943565b509450926020925062007985915062004cdf565b91905062007725565b81518181101562002a235760020362007c255750506040809101805192835195620079d3620079c260a08097015162004cef565b519562007446818651015162004d13565b5193875186510362007bd257875184510362007b7e57875185510362007b27575060005b855181101562007b115762007a0d818762004d46565b51906103e8918281101562004cfd5762007a3360ff6007809360031b015416156202e162565b62007a3f828962004d46565b518381101562004cfd5760031b01805460ff1916600117905562007a64818a62004d46565b5162007a71828962004d46565b51908382101562004cfd57600562007a8d9260031b016200571f565b62007a99818662004d46565b5162007aa6828962004d46565b518381101562004cfd5760031b6001015562007ac3818762004d46565b5162007ad0828962004d46565b518381101562004cfd5760031b6002015562007aed818862004d46565b519182101562004cfd576000600662007b0b9360031b015562004cdf565b620079f7565b5095509390506020925062007985915062004cdf565b5162461bcd60e51b815260206004820152603c6024820152600080516020620337ec83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b5162461bcd60e51b81526020600482015260396024820152600080516020620337ec8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b5162461bcd60e51b81526020600482015260386024820152600080516020620337ec8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b819593949295518181101562002a235760030362008221575050604084019062007c5460c08351015162004cef565b519362007c6b60a06200779b818651015162004cef565b519362007c80865185511462000fa3620331b7565b62007c93865186511462000fa3620331b7565b60005b865181101562007cfc5762007cac818662004d46565b51906103e882101562004cfd57600362007cf69260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b51111562000fa3620332bb565b62007c96565b50909493919460005b855181101562007e305762007d1b818662004d46565b51906103e88083101562004cfd57600360018060a01b0393848c5116600052811b0160205262007d5e60406000205462007d56848962004d46565b5190620050ba565b9062007d6b848a62004d46565b51918383101562004cfd57600362007d9a93878f5116600052811b0160205260406000205562000fa3620332bb565b62007da6828862004d46565b518181101562004cfd576003908462007dc0858c62004d46565b5116600052811b0160205262007de160406000205462006814848962004d46565b62007ded848a62004d46565b519283101562004cfd57600362000faa9362007e2a9662007e0f878e62004d46565b5116600052811b0160205260406000205562000fa362033320565b62007d05565b5091509162007e4762007e4e919695949662032f53565b9562032e37565b926040519462007e5e8662002b78565b6001865260203681880137516001600160a01b031662007e7e8662004cef565b526000905b86518210156200820c5762007e99828862004d46565b516104c05262007eaa855162004e62565b9660009462007eba885162004e62565b610ae0528594865b885181101562007f91578a8962007ef26001600160a01b0362007ee6858462004d46565b51166104c05162032d3b565b158062007f4b575b62007f13575b505062007f0d9062004cdf565b62007ec2565b9862007f409162001ac782859c62007f3762007f0d9760018060a01b039262004d46565b51169262004d46565b9790508a8962007f00565b5050506103e86104c051101562004cfd576001600160a01b0362007f70828b62004d46565b511660005260036104c051811b016020528a89604060002054151562007efa565b509098949897969291939760005b885181101562008033576103e86104c051101562004cfd576001600160a01b0362007fcb828b62004d46565b511660005260036104c051811b016020526040600020541562007ffa575b62007ff49062004cdf565b62007f9f565b9962007ff4906200802a906001600160a01b03620080198e8d62004d46565b511662001ac782610ae05162004d46565b9a905062007fe9565b5098509694939291956104c0516103e8811015806107405262004cfd5760031b60040154966200806e62008068878a62006200565b62004e62565b996000998a6104e0525b6107405162004cfd576104e0518a8110156200812d57620080ad620080ca9160006107405260046104c05160031b0162004f5e565b9054610ae05160039290921b1c6001600160a01b03169062032dea565b15620080e9575b620080df6104e05162004cdf565b6104e05262008078565b99808c62001ac762008126936200810d6104e05160046104c05160031b0162004f5e565b905460039190911b1c6001600160a01b03169262004d46565b99620080d1565b509a939794969299919850946000915b838310620081d257505050506107405162004cfd578051906001600160401b03821162002a9b576020906200817c8360046104c05160031b016200509a565b0160046104c05160031b01600052602060002060005b838110620081b45750505050620081a99062004cdf565b909295919562007e83565b82516001600160a01b03168183015560209092019160010162008192565b6200820590620081fe906001600160a01b03620081f0868662004d46565b511662001ac7828962004d46565b9262004cdf565b916200813d565b91945050620079859194506020925062004cdf565b819593949295518181101562002a2357600403620084a9575050604080920160c0946200826262008256878451015162004cef565b51968351015162004d13565b51946200827960a06200779b818651015162004cef565b51936200828e885188511462000fa3620331b7565b620082a1885185511462000fa3620331b7565b620082b4885186511462000fa3620331b7565b60005b88518110156200831c57620082cd818662004d46565b51906103e882101562004cfd5762008316916003906001600160a01b03620082f6848e62004d46565b5116600052811b0160205262000faa886000205462007ce9838a62004d46565b620082b7565b50909691959294939660005b83518110156200845d576200833e818862004d46565b51906103e8918281101562004cfd576001600160a01b03906003908262008366858a62004d46565b5116600052811b01602052620083878b62007d56848b600020549262004d46565b9062008394848c62004d46565b51918583101562004cfd576003620083cd9385620083b3888d62004d46565b5116600052811b016020528a6000205562000fa3620332bb565b620083d9828a62004d46565b518381101562004cfd5760039082620083f3858b62004d46565b5116600052811b01602052620084148b62006814848b600020549262004d46565b91905062008423838b62004d46565b519384101562004cfd57620084579360039162008441858b62004d46565b5116600052811b01602052876000205562004cdf565b62008328565b50946200848092975062007e4791939450620084799062032f53565b9362032e37565b9260005b835181101562007971578062000faa62007962620084a3938762004d46565b62008484565b8195949593929351908082101562002a23576005918203620084db575050506020919262000faa62007985926202ec1a565b82518181101562002a23576006036200874c575050509060408092016200850760c08251015162004cef565b51946200852960a06200851e818551015162004cef565b519351015162004d13565b51928651835103620086fb578651845103620086af5760005b8751811015620085a75762008558818562004d46565b51906103e882101562004cfd57620085a1916003906001600160a01b0362008581848d62004d46565b5116600052811b0160205262000faa876000205462007ce9838962004d46565b62008542565b509092919260005b87518110156200865b57620085c5818662004d46565b516103e88082101562004cfd576001600160a01b03929160039084620085ec858e62004d46565b5116600052811b016020526200860c886000205462007d56848962004d46565b62008618848a62004d46565b519283101562004cfd57600362000faa9362008655966200863b8f889062004d46565b5116600052811b01602052896000205562000fa3620332bb565b620085af565b50959262008670919250620079229062032f53565b9251946200867e8662002b3f565b60008652600036813760005b835181101562007971578062000faa62007962620086a9938762004d46565b6200868a565b845162461bcd60e51b8152602060048201526030602482015260008051602062033aec83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b845162461bcd60e51b815260206004820152603560248201526000805160206203372c8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b82518181101562002a23576007036200889b575050506040809101936200877860c08651015162004cef565b51926200878a60a08751015162004cef565b5195515191620087a2855188511462000fa3620331b7565b60005b855181101562007b1157620088959062000faa6001600160a01b03826002886200887d8e620088728e620088688f89620087e08a8562004d46565b51166000526200881c896200881481611f409a8b6020526200880e60ff8760002054161562000fa362033288565b62004d46565b519662004d46565b51968a6200885283519b8c96620088338862002a7f565b600188526060602089019860008a528781019b8c52019b8c5262004d46565b51166000526020526000209751151588620057f2565b5115158662005803565b51600185016200571f565b519101556200888d838a62004d46565b5116620066c0565b620087a5565b82519596959394928185101562002a235760089485036200899257505050620088cd60c0604080950151015162004cef565b519360005b85518110156200897d5762008977906001600160a01b0380620088f6838a62004d46565b5116600052611f4090816020526200894c60ff620089236001828c600020541615151462000fa3620331e7565b8262008930868d62004d46565b5116600052836020528960002054891c161562000fa36203324f565b62008958838a62004d46565b51166000526020528560002061010061ff001982541617905562004cdf565b620088d2565b50949093506020925062007985915062004cdf565b80518281101562002a235760090362008a6657505050620089bc60c0604080950151015162004cef565b519360005b85518110156200897d5762008a6090866001600160a01b0380620089e6848462004d46565b511660005262008a396001898362008a1b87611f4097886020526200880e8660ff8097600020541615151462000fa3620331e7565b5116600052846020528a600020548a1c1615151462000fa36203321a565b62008a45838a62004d46565b51166000526020528560002061ff0019815416905562004cdf565b620089c1565b809192939597969450518281101562002a2357600a0362008b445750505060408094019162008aab60a062008aa060c08651015162004cef565b519451015162004cef565b519162008ac0845184511462000fa3620331b7565b60005b8451811015620079715762008b3e906001600160a01b038062008ae7838962004d46565b5116600052611f408060205262008b0e600160ff8c600020541615151462000fa3620331e7565b62008b1a838862004d46565b519162008b28848a62004d46565b5116600052602052600289600020015562004cdf565b62008ac3565b80969496518281101562002a2357600b0362008c125750505060408092019362008b7360c08651015162004cef565b519451519162008b8b865184511462000fa3620331b7565b60005b8651811015620079715762008c0c9062000faa6001600160a01b038062008bb6848c62004d46565b5116600052611f408060205262008bdd600160ff8b600020541615151462000fa3620331e7565b62008be9848962004d46565b519162008bf7858d62004d46565b5116600052602052600188600020016200571f565b62008b8e565b80969394929596518281101562002a2357600c0362008d1257505060400160609182825101519362008c44856202d698565b60005b855181101562008cfc5760c062008c6382878751015162004d46565b5101511562008cbf5762008c8762008c8082878751015162004d46565b5162005cfa565b611f425460001981019190821162001e07578762008ca962008cb99362005cba565b5001805460ff1916905562004cdf565b62008c47565b62008cda62008cd382878751015162004d46565b5162005d46565b611f425460001981019190821162001e07578762008ca962008cb99362005c7a565b5095915093506020925062007985915062004cdf565b809695949396518281101562002a2357600d0362008e3657505060400193602062008d4260a08751015162004cef565b51955101519162008d5786518451146202dd8c565b60005b865181101562007971578062008d7562008de5928662004d46565b511562008deb5762008d9862008d8c828a62004d46565b51611f4254116202de15565b62008dc160ff8762008db662008daf858d62004d46565b5162005cba565b50015416156202de6d565b8562008dd262008daf838b62004d46565b5001805460ff1916600117905562004cdf565b62008d5a565b62008e0762008dfb828a62004d46565b51611f4354116202de15565b62008e2560ff8762008db662008e1e858d62004d46565b5162005c7a565b8562008dd262008e1e838b62004d46565b80518281101562002a2357600e0362008ef457505060400193602062008e6160a08751015162004cef565b51955101519162008e7686518451146202dd8c565b60005b865181101562007971578062008e9462008ea0928662004d46565b5162008ea65762004cdf565b62008e79565b62008ec262008eb6828a62004d46565b51611f4254116202dece565b62008ee360ff8762008ed962008daf858d62004d46565b500154166202df27565b8562008ca962008daf838b62004d46565b809693949596518281101562002a2357600f0362008fbf57505060400160609182825101519362008f25856202d698565b60005b855181101562008cfc5760c062008f4482878751015162004d46565b5101511562008f895762008f6162008c8082878751015162004d46565b611f425460001981019190821162001e07578762008dd262008f839362005cba565b62008f28565b62008f9d62008cd382878751015162004d46565b611f425460001981019190821162001e07578762008dd262008f839362005c7a565b8091929394969550518281101562002a235760100362009064575050604001519062008ff460a0608084015193015162004cef565b519362009009835186511462000fa3620331b7565b60005b835181101562009051578062000faa6200902b6200904b938762004d46565b51620090378162002fc4565b62009043838a62004d46565b51906202d55c565b6200900c565b5093509160209150620079859062004cdf565b80959295518281101562002a2357601103620092ed575050906040809401916200909960a062008aa060c08651015162004cef565b5191620090aa84518451146202d510565b60005b845181101562009122576200911c9062000faa6001600160a01b0380620090d5848a62004d46565b5116600052611f4580602052620090f68b6000205462006814868b62004d46565b91909262009105868c62004d46565b51166000526020528a6000205562000fa36203316d565b620090ad565b509394509162009133915062032e37565b90611f46928354946200914c6200806885518862006200565b91600093845b888110620092ad575060005b865181101562009205576000805b8a8110620091b6575b50156200918e575b620091889062004cdf565b6200915e565b946200918890620091ad906001600160a01b03620081f0898b62004d46565b9590506200917d565b620091c18162004eb6565b90546001600160a01b0360039290921b1c811690620091e1858c62004d46565b511614620091fa57620091f49062004cdf565b6200916c565b505060013862009175565b50965094909350620092178362004e62565b805191906001600160401b03831162002a9b57602090620092388462004ff7565b0190600052602060002060005b8381106200928f575050505060005b8281106200926c575050506200798560209162004cdf565b620092899062000faa6001600160a01b03620019fb838662004d46565b62009254565b82516001600160a01b03168183015560209092019160010162009245565b94620092e0620092e791620092c28862004eb6565b905460039190911b1c6001600160a01b031662001ac7828962004d46565b9562004cdf565b62009152565b80518281101562002a23576012036200955c5750506040809401916200931e60a062008aa060c08651015162004cef565b51916200932f84518451146202d510565b60005b845181101562009381576200937b9062000faa6001600160a01b03806200935a848a62004d46565b5116600052611f4580602052620090f68b6000205462007d56868b62004d46565b62009332565b509491509291620093929062032e37565b90611f468054620093a38162004e62565b9260009485925b808410620094575750505050620093c18362004e62565b805191906001600160401b03831162002a9b57602090620093e28462004ff7565b0190600052602060002060005b83811062009439575050505060005b82811062009416575050506200798560209162004cdf565b620094339062000faa6001600160a01b03620019fb838662004d46565b620093fe565b82516001600160a01b031681830155602090920191600101620093ef565b9297600097929597949194998a5b86518110156200954a576200947a8b62004eb6565b90546001600160a01b0360039290921b1c8116906200949a838a62004d46565b511614620094b357620094ad9062004cdf565b62009465565b509950976001979592979491945b806200951a575b15620094e057620094d99062004cdf565b92620093aa565b9562009513620094d991620094f58962004eb6565b905460039190911b1c6001600160a01b031662001ac7828a62004d46565b9662004cdf565b50620095268162004eb6565b60018060a01b0391549060031b1c16600052611f45602052826000205415620094c8565b509998909897959297949194620094c1565b80959295518281101562002a2357601303620095bd57505060408091015101519260005b8451811015620095ac578062000faa6200959f620095a6938862004d46565b516202f24b565b62009580565b509250906200798560209162004cdf565b8051918083101562002a235760149283036200976057505050604080910190620095ec60c08351015162004cef565b51926200960360a06200779b818651015162004cef565b51956200961485518551146202df8a565b6200962385518851146202dff0565b60005b85518110156200970b576200963c818962004d46565b5162009649828762004d46565b516103e8918282101562004cfd5760066200966a9260031b0154906200608f565b9062009677848962004d46565b51918383101562004cfd576006620096949360031b01556202e0aa565b620096a0828a62004d46565b5190620096ae838862004d46565b518181101562004cfd576001600160a01b039392620096d79160039086620078ab878e62004d46565b620096e3848a62004d46565b519283101562004cfd57600362000faa936200970596620078f0878e62004d46565b62009626565b5093926200972191929650620079229062032f53565b9451926200972f8462002b3f565b60008452600036813760005b835181101562007971578062000faa620079626200975a938762004d46565b6200973b565b819694959396518181101562002a2357601590810362009cd7575050505060408401906200979360c08351015162004cef565b5193620097aa60a06200779b818651015162004cef565b5193620097bf865185511462000fa3620331b7565b620097d2865186511462000fa3620331b7565b60005b86518110156200982e57620097eb818662004d46565b51906103e882101562004cfd576003620098289260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b620097d5565b50909493919460005b85518110156200993f576200984d818662004d46565b51906103e88083101562004cfd57600360018060a01b0393848c5116600052811b016020526200988860406000205462007d56848962004d46565b9062009895848a62004d46565b51918383101562004cfd576003620098c493878f5116600052811b0160205260406000205562000fa3620332bb565b620098d0828862004d46565b518181101562004cfd5760039084620098ea858c62004d46565b5116600052811b016020526200990b60406000205462006814848962004d46565b62009917848a62004d46565b519283101562004cfd57600362000faa93620099399662007e0f878e62004d46565b62009837565b5091509162007e4762009956919695949662032f53565b9260405194620099668662002b78565b6001865260203681880137516001600160a01b0316620099868662004cef565b526000905b86518210156200820c57620099a1828862004d46565b516103a052620099b2855162004e62565b96600094620099c2885162004e62565b610580528594865b885181101562009a90578a89620099fa6001600160a01b03620099ee858462004d46565b51166103a05162032d3b565b158062009a4a575b62009a1b575b505062009a159062004cdf565b620099ca565b9862009a3f9162001ac782859c62007f3762009a159760018060a01b039262004d46565b9790508a8962009a08565b5050506103e86103a051101562004cfd576001600160a01b0362009a6f828b62004d46565b511660005260036103a051811b016020528a89604060002054151562009a02565b509098949897969291939760005b885181101562009b32576103e86103a051101562004cfd576001600160a01b0362009aca828b62004d46565b511660005260036103a051811b016020526040600020541562009af9575b62009af39062004cdf565b62009a9e565b9962009af39062009b29906001600160a01b0362009b188e8d62004d46565b511662001ac7826105805162004d46565b9a905062009ae8565b5098509694939291956103a0516103e8811015806105c05262004cfd5760031b600401549662009b6762008068878a62006200565b996000998a610200525b6105c05162004cfd57610200518a81101562009c0d5762009ba662009bc39160006105c05260046103a05160031b0162004f5e565b90546105805160039290921b1c6001600160a01b03169062032dea565b1562009be2575b62009bd86102005162004cdf565b6102005262009b71565b99808c62001ac762009c06936200810d6102005160046103a05160031b0162004f5e565b9962009bca565b509a939794969299919850946000915b83831062009cb257505050506105c05162004cfd578051906001600160401b03821162002a9b5760209062009c5c8360046103a05160031b016200509a565b0160046103a05160031b01600052602060002060005b83811062009c94575050505062009c899062004cdf565b90929591956200998b565b82516001600160a01b03168183015560209092019160010162009c72565b62009cd090620081fe906001600160a01b03620081f0868662004d46565b9162009c1d565b82979496959751918083101562002a2357601692830362009d4457505050505060c0604062009d0a920151015162004cef565b519260005b8451811015620095ac5762009d3e9062000faa6001600160a01b0362009d36838962004d46565b511662006675565b62009d0f565b83518181101562002a235760170362009d9d5760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b83518181101562002a235760180362009e1057505050505060c0604062009dc8920151015162004cef565b51611fb6805460ff191660011790559260005b8451811015620095ac5762009e0a9062000faa6001600160a01b0362009e02838962004d46565b51166200662a565b62009ddb565b83979697518181101562002a235760190362009f8457505050505060008080604080940160a08082510151805162009f4b575b5050519060e08201519162009e676200680d60c060018060a01b0393015162004cef565b511690602083519301915af1903d1562009f42573d9162009e888362002f5b565b9262009e978351948562002b94565b83523d6000602085013e5b1562009eb75750506200798560209162004cdf565b62004cdb925062009f23815192600080516020620338cc833981519152602085015278039bab1b1b2b9b9b33ab617102932ba3ab937103230ba309d1603d1b8385015283815162009f12816059946020868601910162002e01565b810103603981018552018362002b94565b5162461bcd60e51b815260206004820152918291602483019062002e26565b60609162009ea2565b62009f569062004cef565b515162009f65575b8062009e43565b8192506200680d9062009f7b9251015162004cef565b51903862009f5e565b83518181101562002a2357601a036200a084575050505062009faf60a0604080940151015162004cef565b519062009fc060038351146202d510565b62009fcb8262004cef565b519262009fe462009fdc8462004d13565b519362004d24565b51926200a04a5750509162007985916001602094146000146200a043576200a023906200a016611fb19182546200608f565b90915562000fa362033108565b62000faa611fb26200a03681546200607c565b90915562000fa362033142565b5062004cdf565b60649250519062461bcd60e51b825260206004830152602482015273496e76616c6964207061796d656e74207479706560601b6044820152fd5b909192809450518181101562002a2357601b036200a51957505050505091906200a0c4611faf546200225a6200a0b962033044565b612710831062004cac565b50506200a0d062033108565b506000805b6103e881106200a4a8575b50506200a0ec62006161565b6200a0fa613f745462004e62565b9060009485935b6103e88510156200a49b5760ff60078660031b015416156200a25a5760009560028660031b0154156200a24b57869796975b62004cfd5760048660031b01548810156200a232576200a15b886004600389901b0162004f5e565b600160a01b6001900391549060031b1c1696876000528660031b600301602052604097858960002054906200a1909162005eb0565b99906200a19c62033108565b6200a1a79162004cac565b6000998960031b600201546200a1bd9162005eb0565b91906200a1c962033108565b6200a1d49162004cac565b828b52611f476020528a20908154906200a1ee916200608f565b9091556200a1fb62033108565b6200a2069162004cac565b6200a212828862004d46565b526200a21e9062004cdf565b976200a22a9062004cdf565b97966200a133565b91946200a2429196975062004cdf565b9390946200a101565b91946200a24291965062004cdf565b949592915092505b6200a26d8262004e62565b91600091825b8281106200a40557505050611f48908154926200a29562008068858462006200565b9360009081905b8082106200a3ca57505060005b8381106200a3265750508351939150506001600160401b03831162002a9b576020906200a2d68462004fbc565b0190600052602060002060005b8381106200a3085750505050620079856020916000611fb1556000611fb25562004cdf565b82516001600160a01b0316818301556020909201916001016200a2e3565b6000805b8381106200a382575b50156200a34c575b6200a3469062004cdf565b6200a2a9565b906200a346906200a379906001600160a01b036200a36b858762004d46565b511662001ac7828a62004d46565b9190506200a33b565b6001600160a01b03806200a397858862004d46565b5116906200a3a6838b62004d46565b5116146200a3bf576200a3b99062004cdf565b6200a32a565b50506001386200a333565b9091620081fe6200a3fe916200a3e08562004e9a565b905460039190911b1c6001600160a01b031662001ac7828b62004d46565b906200a29c565b6000805b8581106200a453575b50156200a42b575b6200a4259062004cdf565b6200a273565b926200a425906200a44a906001600160a01b03620081f0878662004d46565b9390506200a41a565b6001600160a01b03806200a468858762004d46565b5116906200a477838a62004d46565b5116146200a490576200a48a9062004cdf565b6200a409565b50506001386200a412565b949592915092506200a262565b806003959394951b9060ff600783015416156200a50e576200a4f86200746162000faa946200a4ec6200a5049560026200a4e28762005e1c565b9101549062005eb0565b929062000fa362033108565b939062000fa362033108565b939291936200a0d5565b50939291936200a0e0565b83518181101562002a2357601c036200a5725760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b83518181101562002a2357601d036200a598575b50505050506200798560209162004cdf565b839795969497518181101562002a2357601e036200ae665750505050604084019060a0906200a5cb828451015162004cef565b51516200a5dc838551015162004d13565b5151036200ade9576200a5f3828451015162004cef565b51516200a604838551015162004d24565b5151036200ad6d576200a61b828451015162004cef565b51946200a62c838551015162004d13565b51916200a65d6200a641858751015162004d24565b51946200a652818851015162004cef565b519651015162004d13565b519585518751036200ad0a5760005b86518110156200a6c5576200a682818862004d46565b51906103e882101562004cfd5760036200a6bf9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b6200a66c565b5090969192939660005b86518110156200a76e576200a6e5818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526200a71d60406000205462007d56838b62004d46565b91906200a72b828a62004d46565b51906103e882101562004cfd576200a76893600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b6200a6cf565b5093979550936200a7829096929662032f53565b96604051966200a7928862002b78565b60018852602036818a013786516001600160a01b03166200a7b38962004cef565b52604051966200a7c38862002b3f565b600088526000610460525b895161046051908110156200ab8b576200a7e9908b62004d46565b51610520526200a7fa885162004e62565b996000976200a80a8b5162004e62565b610920528897895b8b518110156200a8d8578d8c6200a8426001600160a01b036200a836858462004d46565b51166105205162032d3b565b15806200a892575b6200a863575b50506200a85d9062004cdf565b6200a812565b9b6200a8879162001ac782859f62007f376200a85d9760018060a01b039262004d46565b9a90508d8c6200a850565b5050506103e861052051101562004cfd576001600160a01b036200a8b7828e62004d46565b5116600052600361052051811b016020528d8c60406000205415156200a84a565b50909b989a99949691929395979b60005b8b518110156200a97d576103e861052051101562004cfd576001600160a01b036200a915828e62004d46565b5116600052600361052051811b01602052604060002054156200a944575b6200a93e9062004cdf565b6200a8e9565b9c6200a9746200a93e918f6200a9638f9160018060a01b039262004d46565b511662001ac7826109205162004d46565b9d90506200a933565b509a9b509895969193969490929461052051996103e88b10159b8c62004cfd578d9b60031b600401549d6200a9b3908f62006200565b6200a9be9062004e62565b6103205260006108c0528c6000610640525b62004cfd57610640519c8e8e10156200aa8e57506200aa1c6200a9ff60009e60046105205160031b0162004f5e565b90546109205160039290921b1c6001600160a01b03169062032dea565b156200aa3c575b8c6200aa326106405162004cdf565b610640526200a9d0565b6200aa546106405160046105205160031b0162004f5e565b60018060a01b0391549060031b1c166200aa756108c0516103205162004d46565b526200aa846108c05162004cdf565b6108c0526200aa23565b939d509396999094979b50999094979960005b8281106200ab3f5750505062004cfd5761032051516001600160401b03811162002a9b576200aada8160046105205160031b016200509a565b602061032051019060046105205160031b0160005260206000209160005b8281106200ab2157505050506200ab126104605162004cdf565b6104605295989094986200a7ce565b81516001600160a01b0316818501556020909101906001016200aaf8565b6200ab85906001600160a01b036200ab58828562004d46565b51166200ab6c6108c0516103205162004d46565b526200ab7b6108c05162004cdf565b6108c05262004cdf565b6200aaa1565b5094929750929750939450600094855b87518110156200ac0b576200abce6200abc66200abb9838962004d46565b5162007451848d62004d46565b91906202f07a565b806200abe7575b506200abe19062004cdf565b6200ab9b565b906200abfc6200ac04986200abe1936200608f565b98906202f0c7565b906200abd5565b509650945092909150806200ac2f575b5050620079856020915b913880806200a586565b6200ac629060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b92906202f120565b60018060a01b03835116600052602052604060002055600080611f4654905b8181106200acc0575b5050916200798591602093156200aca4575b50916200ac1b565b516200acb9906001600160a01b0316620065d6565b386200ac9c565b6200accb8162004eb6565b9054855160039290921b1c6001600160a01b039081169116146200acfa576200acf49062004cdf565b6200ac81565b506001915082905060206200ac8a565b60405162461bcd60e51b815260206004820152603560248201527f546865206c656e677468206f6620746f6b656e436c61737320616e6420746f6b604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b60405162461bcd60e51b81526020600482015260596024820152600080516020620339ec83398151915260448201527f642070726963654172726179206973206e6f7420657175616c2061742042415460648201527810d217d095549397d513d2d15394d7d0539117d49151955391603a1b608482015260a490fd5b60405162461bcd60e51b815260206004820152605a6024820152600080516020620339ec83398151915260448201527f6420616d6f756e744172726179206973206e6f7420657175616c2061742042416064820152791510d217d095549397d513d2d15394d7d0539117d4915195539160321b608482015260a490fd5b839794969597518181101562002a2357601f036200aeaa57505050506020916200aea46200ae9d6040620079859401515162004cef565b516202f281565b6200ac25565b83518181101562002a23576020036200aed0575b5050505050620079856020916200ac25565b83518181101562002a235760218091036200aeed575b506200aebe565b8451828110156200b01a576022036200af2d5750505050505062007985602091611fb660ff1981541690556200af2262005087565b91388080806200aee6565b8451828110156200b01a576023036200af54575b505050505050620079856020916200af22565b845194828610156200b01a5760248096036200af72575b506200af41565b8051838110156200b006576025146200af6b5751918210156200aff25750036200afb65750506020916200afaa62007985926202e1ae565b9138808080806200af6b565b60405162461bcd60e51b8152602060048201529182015275496e76616c6964206f7065726174696f6e207479706560501b604482015260649150fd5b8490634e487b7160e01b6000526004526000fd5b8683634e487b7160e01b6000526004526000fd5b50634e487b7160e01b60005260045260246000fd5b60405162461bcd60e51b815260206004820152601b60248201527a13dc195c985d1a5bdb881d1e5c19481a5cc81d5b9919599a5b9959602a1b6044820152606490fd5b50915050565b80516200b08e906001600160a01b031662006600565b62007667565b6200b09f8162004f0a565b9054855160039290921b1c6001600160a01b039081169116146200b0ce576200b0c89062004cdf565b62007655565b505050600138806200765e565b600281036200b0ff5760405162461bcd60e51b81528062004cdb600482016200758f565b6001146200b10a5750565b6200b118611f43546200530f565b805190600160401b821162002a9b57613efb5482613efb5580831062014bbf575b50602001613efb60005260206000206000915b83831062014b9e575050505060005b611f43548110156200b194578062000faa6200b17b6200b18e9362005c7a565b506200b1878362005c9a565b90620150c9565b6200b15b565b506200b1a3611f42546200530f565b805190600160401b821162002a9b57613efa5482613efa5580831062014b02575b50602001613efa60005260206000206000915b83831062014ae1575050505060005b611f42548110156200b218578062000faa6200b2066200b2129362005cba565b506200b1878362005cda565b6200b1e6565b5060005b6103e8811015806200b3c957600160ff611fbf8460031b0154161515146200b251575b506200b24b9062004cdf565b6200b21c565b916000835b62004cfd57611fbc8360031b01548110156200b2c0576200b2b7929350600092816200b28b8593611fbc8860031b0162004f5e565b9054600391821b1c6001600160a01b031660009081529087901b611fbb01602052604081205562004cdf565b9093926200b256565b5091604051906200b2d18262002b3f565b6000825262004cfd578051906001600160401b03821162002a9b576020906200b30283611fbc8660031b016200509a565b01611fbc8360031b01600052602060002060005b8381106200b3ab57505050611fbf600383901b908101805460ff191690556000611fb88201819055611fb98201819055611fba8201819055611fbd90910180546200b24b9493506200b3689062002c79565b601f908181116200b389575b5050556000611fbe8260031b0155906200b23f565b6200b3a39183855260208520910160051c81019062004fa3565b38806200b374565b82516001600160a01b0316818301556020909201916001016200b316565b505060005b6103e8811062014a53575060005b611f41548110156200b43757806200b3f86200b4319262004ed2565b60018060a01b0391549060031b1c16600052613ef860205260006002604082208281556200b4296001820162005399565b015562004cdf565b6200b3dc565b506200b446611f415462004e62565b8051906001600160401b03821162002a9b57600160401b821162002a9b57602090613ef95483613ef95580841062014a31575b5001613ef9600052602060002060005b83811062014a13575050505060005b611f41548110156200b50a576200b4af8162004ed2565b9054613ef95460039290921b1c6001600160a01b0316919081101562004cfd57613ef96000526000805160206203398c833981519152810180546001600160a01b0319169092179091556200b5049062004cdf565b6200b498565b509060005b611f41548110156200b5c957806200b52b6200b57e9262004ed2565b9060018060a01b03918291549060031b1c16600052611f40602052604080600020916200b5588462004ed2565b90549060031b1c16600052613ef8602052600020908082036200b584575b505062004cdf565b6200b50f565b600280916200b5aa60ff6200b59d8184541687620057f2565b825460081c168562005803565b6200b5bc600182016001860162014d65565b015491015538806200b576565b5060005b613f02548110156200b61b57806200b5e96200b6159262004eee565b60018060a01b0391549060031b1c16600052613f0160205262000faa6040600020606481019062004fa3565b6200b5cd565b506200b62a611f4a5462004e62565b8051906001600160401b03821162002a9b57600160401b821162002a9b57602090613f025483613f0255808410620149f1575b5001613f02600052602060002060005b838110620149d3575050505060005b611f4a548110156200b6bf578062000faa6200b69c6200b6b99362004f0a565b905460039190911b1c6001600160a01b031662001a088362004eee565b6200b67c565b5060005b611f4a548110156200b74a57806200b6df6200b7319262004f0a565b9060018060a01b03918291549060031b1c16600052611f49602052604080600020916200b70c8462004f0a565b90549060031b1c16600052613f01602052600020908082036200b73757505062004cdf565b6200b6c3565b6200b742916201514b565b38806200b576565b50611f4b80546000905b60648210620149ba575050611faf54613f675550611fb054613f6855611fb154613f6955611fb254613f6a55611fb3546001600160401b03811162002a9b57600160401b811162002a9b57613f6b5481613f6b558082106201498c575b50613f6b60009081527f0c040229f6fc4874d4176ee508a0872dc89a48e51cc9b61a792006f29e06275480546000805160206203376c83398151915291905b8484106201496a575050505050611fb454600160401b811162002a9b57613f6c5481613f6c5580821062014928575b50613f6c6000908152600080516020620337ac8339815191527fcdf85548d0b3537a0f46212d2994f9493fe1dfa88d3af4ddb0cac3c506fd3f595b8383106201490a575050611fb5549150506001600160401b03811162002a9b57600160401b811162002a9b57613f6d5481613f6d55808210620148dc575b50613f6d60009081527f70c3d981fef3a436e3d026045c487f2278cccbfa7f9e11fbd3c1406b0017bd5d80546000805160206203396c83398151915291905b848410620148ba57505050505060ff611fb65416151560ff8019613f6e5416911617613f6e5560005b613efe548110156200b94a57806200b91c6200b9449262004f26565b905460039190911b1c6001600160a01b03166000908152613efd602052604081205562004cdf565b6200b900565b506200b959611f465462004e62565b8051906001600160401b03821162002a9b576020906200b9798362005041565b01613efe600052602060002060005b8381106201489c575050505060005b611f46548110156200b9da578062000faa6200b9b76200b9d49362004eb6565b905460039190911b1c6001600160a01b031662001a088362004f26565b6200b997565b5060005b611f46548110156200ba4957806200b9fa6200ba439262004eb6565b9060018060a01b03918291549060031b1c16600052611f4560205260408060002054916200ba288462004eb6565b90549060031b1c16600052613efd6020526000205562004cdf565b6200b9de565b5060005b613f00548110156200ba9757806200ba696200ba919262004f42565b905460039190911b1c6001600160a01b03166000908152613eff602052604081205562004cdf565b6200ba4d565b506200baa6611f485462004e62565b8051906001600160401b03821162002a9b576020906200bac68362005064565b01613f00600052602060002060005b8381106201487e575050505060005b611f48548110156200bb27578062000faa6200bb046200bb219362004e9a565b905460039190911b1c6001600160a01b031662001a088362004f42565b6200bae4565b5060005b611f48548110156200bb9657806200bb476200bb909262004e9a565b9060018060a01b03918291549060031b1c16600052611f4760205260408060002054916200bb758462004e9a565b90549060031b1c16600052613eff6020526000205562004cdf565b6200bb2b565b50613f02546000805b82811062014839575b501562014803575b5060005b60208301519081518110156200bc0c5762000faa620076c16200bbe6620076a16020620067a7866200bc069862004d46565b86516001600160a01b03166000908152613f0160205260409020620242c3565b6200bbb4565b505060005b602083015180518210156200bc5957620076a16020620067a7846200bc369462004d46565b90606482101562004cfd576200bc53914290613f03015562004cdf565b6200bc11565b5050906000905b6020810151805183101562010f2357826200bc7b9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036200c24d57604001906200bcbc60c08351015162004cef565b51936200bcd360a06200779b818651015162004cef565b51916200bce486518551146202df8a565b6200bcf386518451146202dff0565b60005b86518110156200be51576200bd0c818662004d46565b516103e881101562004cfd57600160ff611fbf6200bd339360031b0154161515146202e052565b6200bd3f818562004d46565b516200bd4c828762004d46565b51906103e882101562004cfd57611fbe6200bd6d9260031b0154906200608f565b906200bd7a838862004d46565b51916103e883101562004cfd57611fbe6200bd9a9360031b01556202e0aa565b6200bda6818562004d46565b516200bdb3828762004d46565b51906103e882101562004cfd576200bdf691611fbb906001600160a01b036200bddd868d62004d46565b511660005260031b01602052604060002054906200608f565b91906200be04828862004d46565b51906103e882101562004cfd576200be4b9362000faa92611fbb906001600160a01b036200be33878f62004d46565b511660005260031b016020526040600020556202e109565b6200bcf6565b50926200be68919250620084799095949562032f53565b916040516200be778162002b3f565b6000815260003681376000945b80518610156200c233576200be9a868262004d46565b516102c0526200beab855162004e62565b966000946200bebb845162004e62565b6105a05260009460005b88518110156200bf8d578a896200bef56001600160a01b036200bee9858462004d46565b51166102c05162032d92565b15806200bf45575b6200bf16575b50506200bf109062004cdf565b6200bec5565b986200bf3a9162001ac782859c62007f376200bf109760018060a01b039262004d46565b9790508a896200bf03565b5050506103e86102c051101562004cfd576001600160a01b036200bf6a828b62004d46565b5116600052611fbb6102c05160031b016020528a8960406000205415156200befd565b50909895979498969291939660005b88518110156200c02b576103e86102c051101562004cfd576001600160a01b03806200bfc9838c62004d46565b5116600052611fbb6102c05160031b01602052604060002054156200bffb575b506200bff59062004cdf565b6200bf9c565b819b6200c023916200c0126200bff5948d62004d46565b511662001ac7826105a05162004d46565b9a906200bfe9565b509850969592919093966102c0516103e8811015806103e05262004cfd5760031b611fbc0154986200c06262008068898c62006200565b6108a0526000610a80526000610ac0525b6103e05162004cfd57610ac0518a8110156200c13c576200c0a96200c0c99160006103e052611fbc6102c05160031b0162004f5e565b90546105a0516001600160a01b03939260031b9190911c83169062032dea565b156200c0e9575b506200c0df610ac05162004cdf565b610ac0526200c073565b60006103e0526200c108610ac051611fbc6102c05160031b0162004f5e565b90549060031b1c166200c122610a80516108a05162004d46565b526200c131610a805162004cdf565b610a8052386200c0d0565b50979294959093985095909560005b8281106200c1e7575050506103e05162004cfd576108a051516001600160401b03811162002a9b576200c18981611fbc6102c05160031b016200509a565b60206108a05101611fbc6102c05160031b01600052602060002060005b8381106200c1c957505050506200c1bd9062004cdf565b9492959091956200be84565b82516001600160a01b0316818301556020909201916001016200c1a6565b6200c22d906001600160a01b036200c200828562004d46565b51166200c214610a80516108a05162004d46565b526200c223610a805162004cdf565b610a805262004cdf565b6200c14b565b5050939092506200c245915062004cdf565b90916200bc60565b906020829493940151602681101562002a23576002036200c404576040809201908151938451916200c2a46200c28860a08098015162004cef565b51966200c299818751015162004d13565b519551015162004d24565b5194835187510362007bd257835185510362007b7e57835186510362007b27575060005b86518110156200c3f1576200c2de818862004d46565b516103e881101562004cfd5760ff611fbf6200c3019260031b015416156202e162565b6200c30d818862004d46565b516103e881101562004cfd5760031b611fbf01805460ff191660011790556200c337818562004d46565b516200c344828962004d46565b51906103e882101562004cfd57611fbd6200c3639260031b016200571f565b6200c36f818662004d46565b516200c37c828962004d46565b516103e881101562004cfd5760031b611fb901556200c39c818762004d46565b516200c3a9828962004d46565b516103e881101562004cfd5760031b611fba01556200c3c9818862004d46565b51906103e882101562004cfd576000611fbe6200c3eb9360031b015562004cdf565b6200c2c8565b509592509350506200c245915062004cdf565b9092916020840151602681101562002a23576003036200ca2a5760408401906200c43360c08351015162004cef565b51906200c44a60a06200779b818651015162004cef565b51936200c45f835185511462000fa3620331b7565b6200c472835186511462000fa3620331b7565b60005b83518110156200c4d0576200c48b818662004d46565b51906103e882101562004cfd57611fbb6200c4ca9260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200c475565b509095919560005b87518110156200c61e576200c4ee818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b016020526200c52860406000205462007d56838962004d46565b906200c535838862004d46565b51916103e883101562004cfd57611fbb6200c56e9360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b6200c57a818662004d46565b516103e881101562004cfd57611fbb906001600160a01b036200c59e848c62004d46565b511660005260031b016020526200c5c060406000205462006814838962004d46565b91906200c5ce828862004d46565b51906103e882101562004cfd576200c61893611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b511660005260031b0160205260406000205562000fa362033320565b6200c4d8565b50926200c63d919294506200c6369096959662032f53565b9462032e37565b92604051906200c64d8262002b78565b6001825260203681840137516001600160a01b03166200c66d8262004cef565b526000945b80518610156200c233576200c688868262004d46565b51610220526200c699855162004e62565b966000946200c6a9845162004e62565b6104005260009460005b88518110156200c77b578a896200c6e36001600160a01b036200c6d7858462004d46565b51166102205162032d92565b15806200c733575b6200c704575b50506200c6fe9062004cdf565b6200c6b3565b986200c7289162001ac782859c62007f376200c6fe9760018060a01b039262004d46565b9790508a896200c6f1565b5050506103e861022051101562004cfd576001600160a01b036200c758828b62004d46565b5116600052611fbb6102205160031b016020528a8960406000205415156200c6eb565b50909895979498969291939660005b88518110156200c820576103e861022051101562004cfd576001600160a01b036200c7b6828b62004d46565b5116600052611fbb6102205160031b01602052604060002054156200c7e7575b6200c7e19062004cdf565b6200c78a565b996200c7e1906200c817906001600160a01b036200c8068e8d62004d46565b511662001ac7826104005162004d46565b9a90506200c7d6565b50985096959291909396610220516103e8811015806104a05262004cfd5760031b611fbc0154986200c85762008068898c62006200565b6103c0526000610a40526000610540525b6104a05162004cfd57610540518a8110156200c933576200c89e6200c8bb9160006104a052611fbc6102205160031b0162004f5e565b90546104005160039290921b1c6001600160a01b03169062032dea565b156200c8da575b6200c8d06105405162004cdf565b610540526200c868565b60006104a0526200c8f961054051611fbc6102205160031b0162004f5e565b60018060a01b0391549060031b1c166200c91a610a40516103c05162004d46565b526200c929610a405162004cdf565b610a40526200c8c2565b50979294959093985095909560005b8281106200c9de575050506104a05162004cfd576103c051516001600160401b03811162002a9b576200c98081611fbc6102205160031b016200509a565b60206103c05101611fbc6102205160031b01600052602060002060005b8381106200c9c057505050506200c9b49062004cdf565b9492959091956200c672565b82516001600160a01b0316818301556020909201916001016200c99d565b6200ca24906001600160a01b036200c9f7828562004d46565b51166200ca0b610a40516103c05162004d46565b526200ca1a610a405162004cdf565b610a405262004cdf565b6200c942565b90926020810151602681101562002a23576004036200d0575760400160c0936200ca686200ca5c868451015162004cef565b51958351015162004d13565b51906200ca7f60a06200779b818651015162004cef565b51936200ca94875184511462000fa3620331b7565b6200caa7875185511462000fa3620331b7565b6200caba875186511462000fa3620331b7565b60005b87518110156200cb25576200cad3818662004d46565b51906103e882101562004cfd576200cb1f91611fbb906001600160a01b036200cafd848d62004d46565b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200cabd565b509095919593929360005b83518110156200cc88576200cb46818762004d46565b516103e881101562004cfd57611fbb906001600160a01b036200cb6a848862004d46565b511660005260031b016020526200cb8c60406000205462007d56838862004d46565b906200cb99838962004d46565b51916103e883101562004cfd576200cbdf92611fbb906001600160a01b036200cbc3878b62004d46565b511660005260031b0160205260406000205562000fa3620332bb565b6200cbeb818762004d46565b516103e881101562004cfd57611fbb906001600160a01b036200cc0f848c62004d46565b511660005260031b016020526200cc3160406000205462006814838862004d46565b9190506200cc40818862004d46565b51916103e883101562004cfd576200cc8292611fbb906001600160a01b036200cc6a858e62004d46565b511660005260031b0160205260406000205562004cdf565b6200cb30565b5091936200cca491935062007e47620084799197969762032f53565b6000945b80518610156200c233576200ccbe868262004d46565b51610280526200cccf855162004e62565b966000946200ccdf845162004e62565b6107005260009460005b88518110156200cdb1578a896200cd196001600160a01b036200cd0d858462004d46565b51166102805162032d92565b15806200cd69575b6200cd3a575b50506200cd349062004cdf565b6200cce9565b986200cd5e9162001ac782859c62007f376200cd349760018060a01b039262004d46565b9790508a896200cd27565b5050506103e861028051101562004cfd576001600160a01b036200cd8e828b62004d46565b5116600052611fbb6102805160031b016020528a8960406000205415156200cd21565b50909895979498969291939660005b88518110156200ce4f576103e861028051101562004cfd576001600160a01b03806200cded838c62004d46565b5116600052611fbb6102805160031b01602052604060002054156200ce1f575b506200ce199062004cdf565b6200cdc0565b819b6200ce47916200ce366200ce19948d62004d46565b511662001ac7826107005162004d46565b9a906200ce0d565b50985096959291909396610280516103e881101580610a005262004cfd5760031b611fbc0154986200ce8662008068898c62006200565b610260526000610780526000610620525b610a005162004cfd57610620518a8110156200cf60576200cecd6200ceed916000610a0052611fbc6102805160031b0162004f5e565b9054610700516001600160a01b03939260031b9190911c83169062032dea565b156200cf0d575b506200cf036106205162004cdf565b610620526200ce97565b6000610a00526200cf2c61062051611fbc6102805160031b0162004f5e565b90549060031b1c166200cf46610780516102605162004d46565b526200cf556107805162004cdf565b61078052386200cef4565b50979294959093985095909560005b8281106200d00b57505050610a005162004cfd5761026051516001600160401b03811162002a9b576200cfad81611fbc6102805160031b016200509a565b60206102605101611fbc6102805160031b01600052602060002060005b8381106200cfed57505050506200cfe19062004cdf565b9492959091956200cca8565b82516001600160a01b0316818301556020909201916001016200cfca565b6200d051906001600160a01b036200d024828562004d46565b51166200d038610780516102605162004d46565b526200d0476107805162004cdf565b6107805262004cdf565b6200cf6f565b92906020840151602681101562002a23576005036200d5b15760408401906200d08a60a06200851e818551015162004cef565b519282518451036200ad0a5760005b83518110156200d0f4576200d0af818562004d46565b51906103e882101562004cfd57611fbb6200d0ee9260018060a01b038a511660005260031b0160205262000faa60406000205462007ce9838962004d46565b6200d099565b509060005b83518110156200d19b576200d10f818562004d46565b516103e881101562004cfd57611fbb9060018060a01b0389511660005260031b016020526200d14960406000205462007d56838862004d46565b91906200d157828762004d46565b51906103e882101562004cfd576200d19593611fbb62000faa9360018060a01b038d511660005260031b0160205260406000205562000fa3620332bb565b6200d0f9565b50916200d1ac919495935062032f53565b92604051926200d1bc8462002b78565b6001845260203681860137516001600160a01b03166200d1dc8462004cef565b52604051926200d1ec8462002b3f565b6000845260003681376000945b80518610156200c233576200d20f868262004d46565b516107c0526200d220855162004e62565b966000946200d230845162004e62565b6102405260009460005b88518110156200d302578a896200d26a6001600160a01b036200d25e858462004d46565b51166107c05162032d92565b15806200d2ba575b6200d28b575b50506200d2859062004cdf565b6200d23a565b986200d2af9162001ac782859c62007f376200d2859760018060a01b039262004d46565b9790508a896200d278565b5050506103e86107c051101562004cfd576001600160a01b036200d2df828b62004d46565b5116600052611fbb6107c05160031b016020528a8960406000205415156200d272565b50909895979498969291939660005b88518110156200d3a7576103e86107c051101562004cfd576001600160a01b036200d33d828b62004d46565b5116600052611fbb6107c05160031b01602052604060002054156200d36e575b6200d3689062004cdf565b6200d311565b996200d368906200d39e906001600160a01b036200d38d8e8d62004d46565b511662001ac7826102405162004d46565b9a90506200d35d565b509850969592919093966107c0516103e8811015806109e05262004cfd5760031b611fbc0154986200d3de62008068898c62006200565b610560526000610420526000610480525b6109e05162004cfd57610480518a8110156200d4ba576200d4256200d4429160006109e052611fbc6107c05160031b0162004f5e565b90546102405160039290921b1c6001600160a01b03169062032dea565b156200d461575b6200d4576104805162004cdf565b610480526200d3ef565b60006109e0526200d48061048051611fbc6107c05160031b0162004f5e565b60018060a01b0391549060031b1c166200d4a1610420516105605162004d46565b526200d4b06104205162004cdf565b610420526200d449565b50979294959093985095909560005b8281106200d565575050506109e05162004cfd5761056051516001600160401b03811162002a9b576200d50781611fbc6107c05160031b016200509a565b60206105605101611fbc6107c05160031b01600052602060002060005b8381106200d54757505050506200d53b9062004cdf565b9492959091956200d1f9565b82516001600160a01b0316818301556020909201916001016200d524565b6200d5ab906001600160a01b036200d57e828562004d46565b51166200d592610420516105605162004d46565b526200d5a16104205162004cdf565b6104205262004cdf565b6200d4c9565b926020810151602681101562002a23576006036200db9a576040016200d5dc60c08251015162004cef565b51936200d5f360a06200851e818551015162004cef565b519285518351036200db485785518451036200dafb5760005b86518110156200d674576200d622818562004d46565b51906103e882101562004cfd576200d66e91611fbb906001600160a01b036200d64c848c62004d46565b511660005260031b0160205262000faa60406000205462007ce9838962004d46565b6200d60c565b509060005b86518110156200d718576200d68f818562004d46565b516103e881101562004cfd57611fbb906001600160a01b036200d6b3848b62004d46565b511660005260031b016020526200d6d560406000205462007d56838862004d46565b91906200d6e3828762004d46565b51906103e882101562004cfd576200d7129362000faa92611fbb906001600160a01b036200cbc3878f62004d46565b6200d679565b50916200d72f919350620084799095949562032f53565b91604051926200d73f8462002b3f565b6000845260003681376000945b80518610156200c233576200d762868262004d46565b51610aa0526200d773855162004e62565b966000946200d783845162004e62565b6109c05260009460005b88518110156200d855578a896200d7bd6001600160a01b036200d7b1858462004d46565b5116610aa05162032d92565b15806200d80d575b6200d7de575b50506200d7d89062004cdf565b6200d78d565b986200d8029162001ac782859c62007f376200d7d89760018060a01b039262004d46565b9790508a896200d7cb565b5050506103e8610aa051101562004cfd576001600160a01b036200d832828b62004d46565b5116600052611fbb610aa05160031b016020528a8960406000205415156200d7c5565b50909895979498969291939660005b88518110156200d8f3576103e8610aa051101562004cfd576001600160a01b03806200d891838c62004d46565b5116600052611fbb610aa05160031b01602052604060002054156200d8c3575b506200d8bd9062004cdf565b6200d864565b819b6200d8eb916200d8da6200d8bd948d62004d46565b511662001ac7826109c05162004d46565b9a906200d8b1565b50985096959291909396610aa0516103e8811015806102e05262004cfd5760031b611fbc0154986200d92a62008068898c62006200565b6109a05260006102a05260006107e0525b6102e05162004cfd576107e0518a8110156200da04576200d9716200d9919160006102e052611fbc610aa05160031b0162004f5e565b90546109c0516001600160a01b03939260031b9190911c83169062032dea565b156200d9b1575b506200d9a76107e05162004cdf565b6107e0526200d93b565b60006102e0526200d9d06107e051611fbc610aa05160031b0162004f5e565b90549060031b1c166200d9ea6102a0516109a05162004d46565b526200d9f96102a05162004cdf565b6102a052386200d998565b50979294959093985095909560005b8281106200daaf575050506102e05162004cfd576109a051516001600160401b03811162002a9b576200da5181611fbc610aa05160031b016200509a565b60206109a05101611fbc610aa05160031b01600052602060002060005b8381106200da9157505050506200da859062004cdf565b9492959091956200d74c565b82516001600160a01b0316818301556020909201916001016200da6e565b6200daf5906001600160a01b036200dac8828562004d46565b51166200dadc6102a0516109a05162004d46565b526200daeb6102a05162004cdf565b6102a05262004cdf565b6200da13565b60405162461bcd60e51b8152602060048201526030602482015260008051602062033aec83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201526000805160206203372c8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b602081949293940151602681101562002a23576007036200dd3557604001916200dbc960c08451015162004cef565b51916200dbdb60a08551015162004cef565b51935151916200dbf3845186511462000fa3620331b7565b60005b84518110156200dd23576001600160a01b03806200dc15838862004d46565b5116600052613ef8806020526200dc3960ff604060002054161562000fa362033288565b60026200dc47848862004d46565b516200dcb16200dc58868c62004d46565b5191620088728b604051966200dc6e8862002a7f565b60018852886200dc958b60208b01946000865260408c0197885260608c01998a5262004d46565b51166000526020526200886860406000209751151588620057f2565b519101556200dcc1828762004d46565b51613ef954929116600160401b83101562002a9b576001830180613ef95583101562004cfd57613ef96000526000805160206203398c83398151915290920180546001600160a01b0319169092179091556200dd1d9062004cdf565b6200dbf6565b5094915092506200c245915062004cdf565b6020810151602681101562002a23576008036200de235760c060406200dd5f920151015162004cef565b519160005b83518110156200de14576200de0e906001600160a01b03806200dd88838862004d46565b5116600052613ef890816020526200ddb1600160ff6040600020541615151462000fa3620331e7565b806200ddbe848962004d46565b5116600052816020526200dde260ff60406000205460081c161562000fa36203324f565b6200ddee838862004d46565b5116600052602052604060002061010061ff001982541617905562004cdf565b6200dd64565b50926200c24591925062004cdf565b6020810151602681101562002a23576009036200df025760c060406200de4d920151015162004cef565b519160005b83518110156200de14576200defc906001600160a01b03806200de76838862004d46565b5116600052613ef890816020526200de9f600160ff6040600020541615151462000fa3620331e7565b806200deac848962004d46565b5116600052816020526200ded4600160ff60406000205460081c1615151462000fa36203321a565b6200dee0838862004d46565b5116600052602052604060002061ff0019815416905562004cdf565b6200de52565b6020810151602681101562002a2357600a036200dfea57604001906200df3e60a06200df3360c08551015162004cef565b519351015162004cef565b51926200df53835185511462000fa3620331b7565b60005b83518110156200dfd9576200dfd3906001600160a01b03806200df7a838862004d46565b5116600052613ef8806020526200dfa2600160ff6040600020541615151462000fa3620331e7565b6200dfae838962004d46565b51916200dfbc848962004d46565b511660005260205260026040600020015562004cdf565b6200df56565b50939092506200c245915062004cdf565b602081949392940151602681101562002a2357600b036200e0ca57604001926200e01960c08551015162004cef565b51935151916200e031855184511462000fa3620331b7565b60005b85518110156200e0ba576200e0b49062000faa6001600160a01b03806200e05c848b62004d46565b5116600052613ef8806020526200e084600160ff6040600020541615151462000fa3620331e7565b6200e090848962004d46565b51916200e09e858c62004d46565b511660005260205260016040600020016200571f565b6200e034565b509350916200c245915062004cdf565b9091926020820151602681101562002a2357600c036200e1b557606060408301510151926200e0f9846202d698565b60005b84518110156200dfd95760c06200e11c8260606040880151015162004d46565b510151156200e170576200e1446200e13d8260606040880151015162004d46565b5162005d8c565b613efa54908160001981011162001e0757600562008ca96200e16a936000190162005cda565b6200e0fc565b6200e18f6200e1888260606040880151015162004d46565b5162005d69565b613efb54908160001981011162001e0757600562008ca96200e16a936000190162005c9a565b9291906020810151602681101562002a2357600d036200e2bf576040019260206200e1e560a08651015162004cef565b5194510151916200e1fa85518451146202dd8c565b60005b85518110156200e0ba57806200e2186200e26c928662004d46565b51156200e272576200e23b6200e22f828962004d46565b51613efa54116202de15565b6200e25a60ff600562008db66200e253858c62004d46565b5162005cda565b600562008dd26200e253838a62004d46565b6200e1fd565b6200e28e6200e282828962004d46565b51613efb54116202de15565b6200e2ad60ff600562008db66200e2a6858c62004d46565b5162005c9a565b600562008dd26200e2a6838a62004d46565b6020810151602681101562002a2357600e036200e3b8576040019260206200e2ec60a08651015162004cef565b5194510151916200e30185518451146202dd8c565b60005b85518110156200e0ba57806200e31f6200e36c928662004d46565b51156200e372576200e3426200e336828962004d46565b51613efa54116202dece565b6200e35a60ff600562008ed96200e253858c62004d46565b600562008ca96200e253838a62004d46565b6200e304565b6200e38e6200e382828962004d46565b51613efb54116202dece565b6200e3a660ff600562008ed96200e2a6858c62004d46565b600562008ca96200e2a6838a62004d46565b9091926020820151602681101562002a2357600f036200e49557606060408301510151926200e3e7846202d698565b60005b84518110156200dfd95760c06200e40a8260606040880151015162004d46565b510151156200e457576200e42b6200e13d8260606040880151015162004d46565b613efa54908160001981011162001e0757600562008dd26200e451936000190162005cda565b6200e3ea565b6200e46f6200e1888260606040880151015162004d46565b613efb54908160001981011162001e0757600562008dd26200e451936000190162005c9a565b9291906020810151602681101562002a23576010036200e5da5760400151926200e4c860a0608086015195015162004cef565b51916200e4dd855184511462000fa3620331b7565b60005b85518110156200e0ba57806200e4fb6200e570928862004d46565b516200e5078162002fc4565b6200e513828762004d46565b51906200e5208162002fc4565b6200e5376200e52e620332ea565b82151562004cac565b6200e5428162002fc4565b600181036200e57657506200e5666200e55a620332ea565b61271083111562004cac565b613f675562004cdf565b6200e4e0565b6200e5818162002fc4565b600281036200e5955750613f685562004cdf565b6200e5a08162002fc4565b600381036200e5b45750613f695562004cdf565b806200e5c260049262002fc4565b146200e5cf575062004cdf565b613f6a55386200a043565b6020810151602681101562002a23576011036200e87d57604001906200e60b60a06200df3360c08551015162004cef565b51936200e61c83518651146202d510565b60005b83518110156200e69c576200e696906200e6766001600160a01b03806200e647848962004d46565b5116600052613efd90816020526200e66a60406000205462006814868d62004d46565b939062000fa36203316d565b6200e682848962004d46565b511660005260205260406000205562004cdf565b6200e61f565b509350906200e6ab9062032e37565b90613efe54936200e6c26200806884518762006200565b9060009260005b8781106200e83d575060005b85518110156200e78a576000805b8981106200e73b575b50156200e705575b6200e6ff9062004cdf565b6200e6d5565b936200e6ff906200e732906001600160a01b036200e724888a62004d46565b511662001ac7828862004d46565b9490506200e6f4565b6200e7468162004f26565b90546001600160a01b0360039290921b1c8116906200e766858b62004d46565b5116146200e77f576200e7799062004cdf565b6200e6e3565b50506001386200e6ec565b5095509392506200e79b8262004e62565b8051906001600160401b03821162002a9b576020906200e7bb8362005041565b01613efe600052602060002060005b8381106200e81f575050505060005b8281106200e7ef575050506200c2459062004cdf565b6200e8199062000faa6001600160a01b036200e80c838662004d46565b511662001a088362004f26565b6200e7d9565b82516001600160a01b0316818301556020909201916001016200e7ca565b936200e8706200e877916200e8528762004f26565b905460039190911b1c6001600160a01b031662001ac7828862004d46565b9462004cdf565b6200e6c9565b6020819492940151602681101562002a23576012036200eac157604001906200e8b160a06200df3360c08551015162004cef565b51936200e8c283518651146202d510565b60005b83518110156200e916576200e910906200e6766001600160a01b03806200e8ed848962004d46565b5116600052613efd90816020526200e66a60406000205462007d56868d62004d46565b6200e8c5565b50935091906200e9269062032e37565b613efe546200e9358162004e62565b906000926000915b8083106200e9e8575050506200e9538262004e62565b8051906001600160401b03821162002a9b576020906200e9738362005041565b01613efe600052602060002060005b8381106200e9ca575050505060005b8281106200e9a7575050506200c2459062004cdf565b6200e9c49062000faa6001600160a01b036200e80c838662004d46565b6200e991565b82516001600160a01b0316818301556020909201916001016200e982565b91956000959193959760005b85518110156200eab2576200ea098962004f26565b90546001600160a01b0360039290921b1c8116906200ea29838962004d46565b5116146200ea42576200ea3c9062004cdf565b6200e9f4565b509750956001959391955b806200ea81575b156200ea6c576200ea659062004cdf565b916200e93d565b936200e8706200ea65916200e8528762004f26565b506200ea8d8162004f26565b60018060a01b0391549060031b1c16600052613efd602052604060002054156200ea54565b5097969096959391956200ea4d565b6020819493940151602681101562002a23576013036200eb625760408091015101519160005b83518110156200de14576200eafd818562004d46565b5190613efc54600160401b81101562002a9b576001810180613efc5581101562004cfd57613efc6000526200eb5c9262000faa916007027f6710e0bb821cd3dfcfba05f5136082a6d0bca8d604d6d14bfd93de2dd49659d2016202f19f565b6200eae7565b602081949392940151602681101562002a23576014036200f0a457604001906200eb9160c08351015162004cef565b51936200eba860a06200779b818651015162004cef565b51916200ebb986518551146202df8a565b6200ebc886518451146202dff0565b60005b86518110156200ecc2576200ebe1818562004d46565b516200ebee828762004d46565b51906103e882101562004cfd57611fbe6200ec0f9260031b0154906200608f565b906200ec1c838862004d46565b51916103e883101562004cfd57611fbe6200ec3c9360031b01556202e0aa565b6200ec48818562004d46565b516200ec55828762004d46565b51906103e882101562004cfd576200ec7f91611fbb906001600160a01b036200bddd868d62004d46565b91906200ec8d828862004d46565b51906103e882101562004cfd576200ecbc9362000faa92611fbb906001600160a01b036200be33878f62004d46565b6200ebcb565b50926200ecd9919250620084799095949562032f53565b916040516200ece88162002b3f565b6000815260003681376000945b80518610156200c233576200ed0b868262004d46565b516106e0526200ed1c855162004e62565b966000946200ed2c845162004e62565b6103005260009460005b88518110156200edfe578a896200ed666001600160a01b036200ed5a858462004d46565b51166106e05162032d92565b15806200edb6575b6200ed87575b50506200ed819062004cdf565b6200ed36565b986200edab9162001ac782859c62007f376200ed819760018060a01b039262004d46565b9790508a896200ed74565b5050506103e86106e051101562004cfd576001600160a01b036200eddb828b62004d46565b5116600052611fbb6106e05160031b016020528a8960406000205415156200ed6e565b50909895979498969291939660005b88518110156200ee9c576103e86106e051101562004cfd576001600160a01b03806200ee3a838c62004d46565b5116600052611fbb6106e05160031b01602052604060002054156200ee6c575b506200ee669062004cdf565b6200ee0d565b819b6200ee94916200ee836200ee66948d62004d46565b511662001ac7826103005162004d46565b9a906200ee5a565b509850969592919093966106e0516103e8811015806103405262004cfd5760031b611fbc0154986200eed362008068898c62006200565b610440526000610900526000610980525b6103405162004cfd57610980518a8110156200efad576200ef1a6200ef3a91600061034052611fbc6106e05160031b0162004f5e565b9054610300516001600160a01b03939260031b9190911c83169062032dea565b156200ef5a575b506200ef506109805162004cdf565b610980526200eee4565b6000610340526200ef7961098051611fbc6106e05160031b0162004f5e565b90549060031b1c166200ef93610900516104405162004d46565b526200efa26109005162004cdf565b61090052386200ef41565b50979294959093985095909560005b8281106200f058575050506103405162004cfd5761044051516001600160401b03811162002a9b576200effa81611fbc6106e05160031b016200509a565b60206104405101611fbc6106e05160031b01600052602060002060005b8381106200f03a57505050506200f02e9062004cdf565b9492959091956200ecf5565b82516001600160a01b0316818301556020909201916001016200f017565b6200f09e906001600160a01b036200f071828562004d46565b51166200f085610900516104405162004d46565b526200f0946109005162004cdf565b6109005262004cdf565b6200efbc565b926020840151602681101562002a23576015036200f6a55760408401906200f0d160c08351015162004cef565b51906200f0e860a06200779b818651015162004cef565b51936200f0fd835185511462000fa3620331b7565b6200f110835186511462000fa3620331b7565b60005b83518110156200f16e576200f129818662004d46565b51906103e882101562004cfd57611fbb6200f1689260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b6200f113565b509095919560005b87518110156200f2a0576200f18c818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b016020526200f1c660406000205462007d56838962004d46565b906200f1d3838862004d46565b51916103e883101562004cfd57611fbb6200f20c9360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b6200f218818662004d46565b516103e881101562004cfd57611fbb906001600160a01b036200f23c848c62004d46565b511660005260031b016020526200f25e60406000205462006814838962004d46565b91906200f26c828862004d46565b51906103e882101562004cfd576200f29a93611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b6200f176565b50926200f2b8919294506200c6369096959662032f53565b92604051906200f2c88262002b78565b6001825260203681840137516001600160a01b03166200f2e88262004cef565b526000945b80518610156200c233576200f303868262004d46565b51610a60526200f314855162004e62565b966000946200f324845162004e62565b6108405260009460005b88518110156200f3f6578a896200f35e6001600160a01b036200f352858462004d46565b5116610a605162032d92565b15806200f3ae575b6200f37f575b50506200f3799062004cdf565b6200f32e565b986200f3a39162001ac782859c62007f376200f3799760018060a01b039262004d46565b9790508a896200f36c565b5050506103e8610a6051101562004cfd576001600160a01b036200f3d3828b62004d46565b5116600052611fbb610a605160031b016020528a8960406000205415156200f366565b50909895979498969291939660005b88518110156200f49b576103e8610a6051101562004cfd576001600160a01b036200f431828b62004d46565b5116600052611fbb610a605160031b01602052604060002054156200f462575b6200f45c9062004cdf565b6200f405565b996200f45c906200f492906001600160a01b036200f4818e8d62004d46565b511662001ac7826108405162004d46565b9a90506200f451565b50985096959291909396610a60516103e8811015806106805262004cfd5760031b611fbc0154986200f4d262008068898c62006200565b6108605260006106c0526000610880525b6106805162004cfd57610880518a8110156200f5ae576200f5196200f53691600061068052611fbc610a605160031b0162004f5e565b90546108405160039290921b1c6001600160a01b03169062032dea565b156200f555575b6200f54b6108805162004cdf565b610880526200f4e3565b6000610680526200f57461088051611fbc610a605160031b0162004f5e565b60018060a01b0391549060031b1c166200f5956106c0516108605162004d46565b526200f5a46106c05162004cdf565b6106c0526200f53d565b50979294959093985095909560005b8281106200f659575050506106805162004cfd5761086051516001600160401b03811162002a9b576200f5fb81611fbc610a605160031b016200509a565b60206108605101611fbc610a605160031b01600052602060002060005b8381106200f63b57505050506200f62f9062004cdf565b9492959091956200f2ed565b82516001600160a01b0316818301556020909201916001016200f618565b6200f69f906001600160a01b036200f672828562004d46565b51166200f6866106c0516108605162004d46565b526200f6956106c05162004cdf565b6106c05262004cdf565b6200f5bd565b9091926020810151602681101562002a23576016036200f7575760c060406200f6d2920151015162004cef565b519160005b83518110156200de14576001600160a01b036200f6f5828662004d46565b51613f6b54929116600160401b83101562002a9b576001830180613f6b5583101562004cfd57613f6b6000526000805160206203376c83398151915290920180546001600160a01b0319169092179091556200f7519062004cdf565b6200f6d7565b6020810151602681101562002a23576017036200f7b45760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a23576018036200f8725760c060406200f7de920151015162004cef565b5191600160ff19613f6e541617613f6e5560005b83518110156200de14576001600160a01b036200f810828662004d46565b51613f6d54929116600160401b83101562002a9b576001830180613f6d5583101562004cfd57613f6d6000526000805160206203396c83398151915290920180546001600160a01b0319169092179091556200f86c9062004cdf565b6200f7f2565b602081949293940151602681101562002a23576019036200f89a575b506200c2459062004cdf565b6020810151602681101562002a2357601a036200fa115760a060406200f8c4920151015162004cef565b51906200f8d560038351146202d510565b6200f8e08262004cef565b516200f8f062009fdc8462004d13565b51926200f9d5576200c245926001036200f9ce576200f9176200f97591613f69546200608f565b613f6955604051906200f92a8262002b06565b603282527f6469766964656e6461626c652062616c616e6365206f766572666c6f772077686020830152710cadc40e0e4dec6cae6e6d2dcce40c6c2e6d60731b604083015262004cac565b6200f9c76200f987613f6a546200607c565b613f6a55604051906200f99a8262002b78565b601a8252796469766964656e647320636f756e746572206f766572666c6f7760301b602083015262004cac565b906200f88e565b506200f9c7565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b6020810151602681101562002a2357601b036200ffa157509190613f67546200fa3d6200a0b962033044565b613f6a54613f685411156200fa5c6200fa55620330b2565b8262004cac565b613f6954906200fa6d838362005eb0565b50506200fa7962033108565b506000805b6103e882106200ff52575b5050906200fab96200fabf93926200faaf6200faa462033044565b612710861062004cac565b62000fa3620330b2565b62005eb0565b90506200facb62033108565b5060009060005b6103e881106200fe7f575b50906127106200faee9204620061de565b90506200fafe613f745462004e62565b906000946000905b6103e88210156200fe72578160031b9460ff611fbf87015416156200fc5c57600096611fba870154156200fc4b57600098975b62004cfd57611fbc8701548910156200fc31576200fb5c89611fbc890162004f5e565b600160a01b6001900391549060031b1c169788600052611fbb8801602052604098868a60002054906200fb8f9162005eb0565b9a906200fb9b62033108565b6200fba69162004cac565b60009a611fba8b01546200fbba9162005eb0565b91906200fbc662033108565b6200fbd19162004cac565b82600052613eff602052600020908154906200fbed916200608f565b9091556200fbfa62033108565b6200fc059162004cac565b6200fc11828962004d46565b526200fc1d9062004cdf565b986200fc299062004cdf565b98976200fb39565b929095506200fc439196975062004cdf565b90946200fb06565b929095506200fc4391965062004cdf565b95969392509350505b6200fc708262004e62565b9160009160005b8281106200fddc57505050613f0054916200fc9762008068848462006200565b926000906000905b8082106200fdbf57505060005b8381106200fd295750508251929150506001600160401b03821162002a9b576020906200fcd98362005064565b01613f00600052602060002060005b8381106200fd0b57505050506200c245906000613f69556000613f6a556200f9c7565b82516001600160a01b0316818301556020909201916001016200fce8565b6000805b8381106200fd77575b50156200fd4f575b6200fd499062004cdf565b6200fcac565b906200fd49906200fd6e906001600160a01b03620081f0858762004d46565b9190506200fd3e565b6001600160a01b03806200fd8c858862004d46565b5116906200fd9b838a62004d46565b5116146200fdb4576200fdae9062004cdf565b6200fd2d565b50506001386200fd36565b9091620081fe6200fdd591620094f58562004f42565b906200fc9f565b6000805b8581106200fe2a575b50156200fe02575b6200fdfc9062004cdf565b6200fc77565b926200fdfc906200fe21906001600160a01b03620081f0878662004d46565b9390506200fdf1565b6001600160a01b03806200fe3f858762004d46565b5116906200fe4e838a62004d46565b5116146200fe67576200fe619062004cdf565b6200fde0565b50506001386200fde9565b939495929150506200fc65565b90918160039695961b60ff611fbf82015416156200ff4657611fba810154611fbc8201546000928391825b8184106200fee65750505050620074616200fedd936200fed562000faa979694620022e49462005eb0565b929062005daf565b9493946200fad2565b94929462004cfd576200ff3f856200ff376200ff0b62000faa98611fbc870162004f5e565b905460039190911b1c6001600160a01b03166000908152611fbb8601602052604081205490966200608f565b979062005ed2565b926200feaa565b5091909493946200fadd565b8160039897981b60ff611fbf82015416156200ff9757916200a4f8620074616200ff8d936200a4ec62000faa96611fba6200a4e28762005e52565b909695966200fa7e565b509695966200fa89565b6020810151602681101562002a2357601c036200fffe5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d0362010022575b506200c245906200f9c7565b9290916020840151602681101562002a2357601e036201075857604084019060a09062010053828451015162004cef565b515162010064838551015162004d13565b5151036200ade9576201007b828451015162004cef565b51516201008c838551015162004d24565b5151036200ad6d57620100a3828451015162004cef565b5194620100b4838551015162004d13565b5191620100c96200a641858751015162004d24565b519585518751036200ad0a5760005b86518110156201013357620100ee818862004d46565b51906103e882101562004cfd57611fbb6201012d9260018060a01b038d511660005260031b0160205262000faa60406000205462007ce9838c62004d46565b620100d8565b5090969192939660005b8651811015620101e05762010153818862004d46565b516103e881101562004cfd57611fbb9060018060a01b038c511660005260031b016020526201018d60406000205462007d56838b62004d46565b91906201019b828a62004d46565b51906103e882101562004cfd57620101da93611fbb62000faa938f60018060a01b0390511660005260031b0160205260406000205562000fa3620332bb565b6201013d565b5093969297955093620101f39062032f53565b9660405196620102038862002b78565b60018852602036818a013786516001600160a01b0316620102248962004cef565b5260405196620102348862002b3f565b600088526000610600525b89516106005190811015620105fa576201025a908b62004d46565b51610960526201026b885162004e62565b996000976201027b8b5162004e62565b6103605260009760005b8b518110156201034d578d8c620102b56001600160a01b03620102a9858462004d46565b51166109605162032d92565b158062010305575b620102d6575b5050620102d09062004cdf565b62010285565b9b620102fa9162001ac782859f62007f37620102d09760018060a01b039262004d46565b9a90508d8c620102c3565b5050506103e861096051101562004cfd576001600160a01b036201032a828e62004d46565b5116600052611fbb6109605160031b016020528d8c6040600020541515620102bd565b50909b989a99949691929395979b60005b8b51811015620103f4576103e861096051101562004cfd576001600160a01b036201038a828e62004d46565b5116600052611fbb6109605160031b0160205260406000205415620103bb575b620103b59062004cdf565b6201035e565b9c620103eb620103b5918f620103da8f9160018060a01b039262004d46565b511662001ac7826103605162004d46565b9d9050620103aa565b509b5098959092949691939661096051996103e88b10159c8d62004cfd576201042c62008068611fbc8f9e60031b01549e8f62006200565b6108005260006107a0528d60009e5b62004cfd578d8f1015620104fc575060009d620104846201046782611fbc6109605160031b0162004f5e565b90546103605160039290921b1c6001600160a01b03169062032dea565b156201049e575b620104978f9162004cdf565b9e6201043b565b620104979e5060009e8f91620104bf81611fbc6109605160031b0162004f5e565b60018060a01b0391549060031b1c16620104e06107a0516108005162004d46565b52620104ef6107a05162004cdf565b6107a0529150506201048b565b9396999b929d509396999094979b5060005b828110620105ae5750505062004cfd5761080051516001600160401b03811162002a9b576201054881611fbc6109605160031b016200509a565b6020610800510190611fbc6109605160031b0160005260206000209160005b828110620105905750505050620105816106005162004cdf565b6106005295989094986201023f565b81516001600160a01b03168185015560209091019060010162010567565b620105f4906001600160a01b03620105c7828562004d46565b5116620105db6107a0516108005162004d46565b52620105ea6107a05162004cdf565b6107a05262004cdf565b6201050e565b509492975094955091965060009460005b87518110156201065e57620106296200abc66200abb9838962004d46565b8062010642575b506201063c9062004cdf565b6201060b565b906200abfc62010657986201063c936200608f565b9062010630565b5096509450915091806201067c575b506200c24591505b9062010016565b620106a79060018060a01b038451166000526200ac5a613efd9182602052604060002054906200608f565b60018060a01b03845116600052602052604060002055600091600092613efe54935b84811062010713575b506201066d57516001600160a01b031691600160401b81101562002a9b576200c2459262001a088260016201070c9401613efe5562004f26565b386201066d565b6201071e8162004f26565b9054845160039290921b1c6001600160a01b039081169116146201074d57620107479062004cdf565b620106c9565b5050600138620106d2565b9190926020810151602681101562002a2357601f03620107d3576040620107829101515162004cef565b5190613f6c54600160401b81101562002a9b576001810180613f6c5581101562004cfd57613f6c6000526200c24592620107cd91600080516020620337ac833981519152016200571f565b62010675565b6020810151602681101562002a2357602003620107f7575b506200c2459062010675565b6020810151602681101562002a2357602114620107eb576020810151602681101562002a23576022036201087d57506200c2459060ff19613f6e5416613f6e55613f6d546000613f6d558062010851575b505b90620107eb565b613f6d60005262010876906000805160206203396c8339815191529081019062004fa3565b3862010848565b6020810151602681101562002a2357602303620108a1575b506200c245906201084a565b6020810151602681101562002a235760241462010895576020810151602681101562002a235760251462010895579290916020840151602681101562002a235760150362010ee5576040840190620108fe60c08351015162004cef565b51906201091560a06200779b818651015162004cef565b51936201092a835185511462000fa3620331b7565b6201093d835186511462000fa3620331b7565b60005b83518110156201099b5762010956818662004d46565b51906103e882101562004cfd57611fbb620109959260018060a01b038b511660005260031b0160205262000faa60406000205462007ce9838a62004d46565b62010940565b509095919560005b875181101562010acd57620109b9818662004d46565b516103e881101562004cfd57611fbb9060018060a01b0386511660005260031b01602052620109f360406000205462007d56838962004d46565b9062010a00838862004d46565b51916103e883101562004cfd57611fbb62010a399360018060a01b0389511660005260031b0160205260406000205562000fa3620332bb565b62010a45818662004d46565b516103e881101562004cfd57611fbb906001600160a01b0362010a69848c62004d46565b511660005260031b0160205262010a8b60406000205462006814838962004d46565b919062010a99828862004d46565b51906103e882101562004cfd5762010ac793611fbb62000faa938d6200c5fc8760018060a01b039262004d46565b620109a3565b509262010ae5919294506200c6369096959662032f53565b926040519062010af58262002b78565b6001825260203681840137516001600160a01b031662010b158262004cef565b526000945b805186101562010ed25762010b30868262004d46565b516106a05262010b41855162004e62565b9660009462010b51845162004e62565b6103805260009460005b885181101562010c23578a8962010b8b6001600160a01b0362010b7f858462004d46565b51166106a05162032d92565b158062010bdb575b62010bac575b505062010ba69062004cdf565b62010b5b565b9862010bd09162001ac782859c62007f3762010ba69760018060a01b039262004d46565b9790508a8962010b99565b5050506103e86106a051101562004cfd576001600160a01b0362010c00828b62004d46565b5116600052611fbb6106a05160031b016020528a89604060002054151562010b93565b50909895979498969291939660005b885181101562010cc8576103e86106a051101562004cfd576001600160a01b0362010c5e828b62004d46565b5116600052611fbb6106a05160031b016020526040600020541562010c8f575b62010c899062004cdf565b62010c32565b9962010c899062010cbf906001600160a01b0362010cae8e8d62004d46565b511662001ac7826103805162004d46565b9a905062010c7e565b509850969592919093966106a0516103e8811015806106605262004cfd5760031b611fbc01549862010cff62008068898c62006200565b6105e0526000610820526000610500525b6106605162004cfd57610500518a81101562010ddb5762010d4662010d6391600061066052611fbc6106a05160031b0162004f5e565b90546103805160039290921b1c6001600160a01b03169062032dea565b1562010d82575b62010d786105005162004cdf565b6105005262010d10565b60006106605262010da161050051611fbc6106a05160031b0162004f5e565b60018060a01b0391549060031b1c1662010dc2610820516105e05162004d46565b5262010dd16108205162004cdf565b6108205262010d6a565b50979294959093985095909560005b82811062010e86575050506106605162004cfd576105e051516001600160401b03811162002a9b5762010e2881611fbc6106a05160031b016200509a565b60206105e05101611fbc6106a05160031b01600052602060002060005b83811062010e68575050505062010e5c9062004cdf565b94929590919562010b1a565b82516001600160a01b03168183015560209092019160010162010e45565b62010ecc906001600160a01b0362010e9f828562004d46565b511662010eb3610820516105e05162004d46565b5262010ec26108205162004cdf565b6108205262004cdf565b62010dea565b5050939092506200c24591509062010895565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7065726174696f6e207479706560501b6044820152606490fd5b5091905062010f32826201561e565b9290600681101562002a23576002810362010f625760405162461bcd60e51b81528062004cdb600482016200758f565b6003810362011ef65750613f738054600260ff821662010f828162002a18565b1462011eb15760ff19166002179055613f78549060018201821162001e075760018201613f7855611f44549092600019929060005b8651811015620110335762010fda8462010fd2838a62004d46565b511062032899565b84600262010ff462010fed848b62004d46565b516202f17f565b500154106201100f575b620110099062004cdf565b62010fb7565b93506201100960026201102762010fed878a62004d46565b50015494905062010ffe565b5090936000199360005b8751811015620110aa57620110588562010fd2838b62004d46565b8560036201106b62010fed848c62004d46565b5001541062011086575b620110809062004cdf565b6201103d565b94506201108060036201109e62010fed888b62004d46565b50015495905062011075565b5091946001919350620110be875162004e62565b620110ca885162004e62565b620110d6895162004e62565b90620110e38a5162004e62565b9260405197620110f38962002ae9565b88526020880152604087015260608601526080850152600060a0850152600060c0850152600260e0850152600061010085015201600052613f766020526040600020825160018060a01b0381511660018060a01b03198354161782556020810151805190600160401b821162002a9b57600184015482600186015580831062011cf2575b5060200190600184016000526020600020916000905b8282106201168d57505050506040620111ac910151600283016200571f565b60208301518051906001600160401b03821162002a9b5760206003840191620111d684846200509a565b0190600052602060002060005b83811062011678575050505060408301518051906001600160401b03821162002a9b57602060048401916201121984846200509a565b0190600052602060002060005b83811062011663575050505060608301518051906001600160401b03821162002a9b57602060058401916201125c84846200509a565b0190600052602060002060005b8381106201164e575050505060808301518051906001600160401b03821162002a9b57602060068401916201129f84846200509a565b0190600052602060002060005b83811062011639575050505060a0830151600782015560c0830151600882015560e08301519290600901600384101562002a235761010062011304926201130b9560ff80198554169116178355015115159062005803565b426200608f565b9015620115f957613f7854600052613f7660205280600760406000200155613f715562011349613f785491826000526007604060002001546200608f565b919015620115b657600052613f7660205280600860406000200155613f7255613f78546000526009604060002001600260ff1982541617905560005b8251811015620113cb578062000faa620113a4620113c5938662004d46565b51613f7854600052613f7660205262006bbf83600360406000200162004f5e565b62011385565b506000915b8051831015620115b157613f78549283600052613f766020526201140d6201140082600360406000200162004f5e565b90549060031b1c6202f17f565b5054916201141b8362004e62565b9260005b818110620115665750506000906000915b8451831015620115355762011446838662004d46565b516103e8908181101562004cfd5760031b6001015462011467858862004d46565b519182101562004cfd576006620114849260031b01549062005eb0565b9015620114f15762011496916200608f565b929015620114b057620114a99062004cdf565b9162011430565b60405162461bcd60e51b8152602060048201526019602482015278746f74616c566f74696e67506f776572206f766572666c6f7760381b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f63757272656e74436c617373566f74696e67506f776572206f766572666c6f776044820152fd5b90956201155f945062000faa9250600052613f7660205262006bbf83600660406000200162004f5e565b91620113d0565b620115ab9087600052613f766020526201159881620115916201140088600360406000200162004f5e565b5062004f5e565b90549060031b1c62001ac7828862004d46565b6201141f565b509050565b60405162461bcd60e51b815260206004820152601b60248201527a657865637574696e6720656e642074696d65206f766572666c6f7760281b6044820152606490fd5b60405162461bcd60e51b8152602060048201526018602482015277766f74696e6720656e642074696d65206f766572666c6f7760401b6044820152606490fd5b600190602084519401938184015501620112ac565b60019060208451940193818401550162011269565b60019060208451940193818401550162011226565b600190602084519401938184015501620111e3565b805180518554602083015190916001600160a01b031690602681101562002a23576001600160a81b03199092161760a09190911b60ff60a01b161785556040015180518051906001870190602090620116e7848462005427565b01906000526020600020906000905b83821062011cd25750505050602081015180516001600160401b03811162002a9b57602060028801926201172b83856203239f565b019160005260206000209060005b8160051c811062011c965750601f198116810362011c51575b5050506040810151805190600160401b821162002a9b57600387015482600389015580831062011bc9575b50602001600387016000526020600020906000905b83821062011ba857505050506060810151805190600160401b821162002a9b57600487015482600489015580831062011b27575b50602001600487016000526020600020906000905b83821062011b065750505050608081015180516001600160401b03811162002a9b57602060058801926201181083856203239f565b019160005260206000209060005b8160051c811062011ac75750601f1981169283820362011a78575b505050506006850160a08201516020815191620118578385620054b5565b019160005260206000206000925b82841062011a1457505050506007850160c082015160208151916201188b8385620054b5565b019160005260206000206000925b828410620119a7575050505060e001518051906001600160401b03821162002a9b57620118d982620118cf600889015462002c79565b60088901620056d5565b602090601f83116001146201192c57928260099360209360019660009262011920575b5050600019600383901b1c191690851b1760088801555b019401910190926201118d565b015190503880620118fc565b906008870160005260206000209160005b601f19851681106201198e575083602093600196938793600997601f1981161062011974575b505050811b01600888015562011913565b015160001960f88460031b161c1916905538808062011963565b919260206001819286850151815501940192016201193d565b80518051906001600160401b03821162002a9b57602090620119ca83866200509a565b0183600052602060002060005b838110620119f657505050506001602081920192019301929062011899565b82516001600160a01b031681830155602090920191600101620119d7565b80518051906001600160401b03821162002a9b5760209062011a3783866200509a565b0183600052602060002060005b83811062011a6357505050506001602081920192019301929062011865565b60019060208451940193818401550162011a44565b6000936000905b808403821062011a9b5750505060051c01553880808062011839565b909194602062011abc6001928589519162011ab68362002fc4565b62032409565b960192019062011a7f565b6000805b6020811062011ae25750838201556001016201181e565b9490602062011afc6001928885519162011ab68362002fc4565b9201950162011acb565b600660208262011b1a60019451876200581b565b01930191019091620117db565b600681810204810362001e0757600683810204830362001e07576004880160005260206000208360060281015b826006028201811062011b69575050620117c6565b806000600692556000600182015562011b856002820162005504565b6000600382015562011b9a6004820162005399565b600060058201550162011b54565b600760208262011bbc60019451876202f19f565b0193019101909162011792565b600781810204810362001e0757600783810204830362001e07576003880160005260206000208360070281015b826007028201811062011c0b5750506201177d565b8062011c196007926200501a565b6000600182015560006002820155600060038201556000600482015562011c436005820162005399565b600060068201550162011bf6565b60009260005b601f1983168303811062011c7557505060051c015538808062011752565b9093602062011c8c60019284885115159162032409565b9501910162011c57565b6000805b6020811062011cb157508382015560010162011739565b9490602062011cc860019288855115159162032409565b9201950162011c9a565b600160208262011ce5839451876200571f565b01930191019091620116f6565b600981810204810362001e0757600983810204830362001e07576001850160005260206000208360090281015b826009028201811062011d3457505062011177565b6000815562011d4660018201620053e8565b62011d5b600282018054906000815562032377565b6003810154600060038301558062011e3b575b506004810154600060048301558062011dcc575b508062011d9b6005600993018054906000815562032377565b62011da96006820162005476565b62011db76007820162005476565b62011dc56008820162005399565b0162011d1f565b600681810204810362001e0757600482016000526020600020906006028101905b81811062011dfc575062011d82565b806000600692556000600182015562011e186002820162005504565b6000600382015562011e2d6004820162005399565b600060058201550162011ded565b600781810204810362001e0757600382016000526020600020906007028101905b81811062011e6b575062011d6e565b8062011e796007926200501a565b6000600182015560006002820155600060038201556000600482015562011ea36005820162005399565b600060068201550162011e5c565b60405162461bcd60e51b815260206004820152601d60248201527f766f74696e6720697320616c726561647920696e2070726f67726573730000006044820152606490fd5b6005919293501462011f055750565b90600080611f4a54905b818110620147bc575b505015620147a0575b60005b602083015190815181101562011f7c5762000faa620076c162011f56620076a16020620067a78662011f769862004d46565b86516001600160a01b03166000908152611f4960205260409020620242c3565b62011f24565b505060005b6020830151805182101562011fc957620076a16020620067a78462011fa69462004d46565b90606482101562004cfd5762011fc3914290611f4b015562004cdf565b62011f81565b50506000905b602083015180518310156200b072578262011fea9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036201223257604001906201202b60c08351015162004cef565b51936201204260a06200779b818651015162004cef565b51916201205386518551146202df8a565b6201206286518451146202dff0565b60005b8651811015620121b9576201207b818662004d46565b516103e881101562004cfd57600160ff6007620120a19360031b0154161515146202e052565b620120ad818562004d46565b51620120ba828762004d46565b51906103e882101562004cfd576006620120da9260031b0154906200608f565b90620120e7838862004d46565b51916103e883101562004cfd576006620121069360031b01556202e0aa565b62012112818562004d46565b516201211f828762004d46565b51906103e882101562004cfd5762012160916003906001600160a01b0362012148868d62004d46565b5116600052811b01602052604060002054906200608f565b91906201216e828862004d46565b51906103e882101562004cfd57620121b39362000faa926003906001600160a01b036201219c878f62004d46565b5116600052811b016020526040600020556202e109565b62012065565b5094915091620121cd620121d49162032f53565b9162032e37565b9360405192620121e48462002b3f565b60008452600036813760005b835181101562012215578062000faa620079626201220f938762004d46565b620121f0565b509450926020925062012229915062004cdf565b91905062011fcf565b9091926020820151602681101562002a2357600203620123c9576040809201908151938451916201226c6200c28860a08098015162004cef565b5194835187510362007bd257835185510362007b7e57835186510362007b27575060005b8651811015620123b357620122a6818862004d46565b516103e881101562004cfd5760ff6007620122c89260031b015416156202e162565b620122d4818862004d46565b516103e881101562004cfd5760031b600701805460ff19166001179055620122fd818562004d46565b516201230a828962004d46565b51906103e882101562004cfd576005620123289260031b016200571f565b62012334818662004d46565b5162012341828962004d46565b516103e881101562004cfd5760031b6001015562012360818762004d46565b516201236d828962004d46565b516103e881101562004cfd5760031b600201556201238c818862004d46565b51906103e882101562004cfd5760006006620123ad9360031b015562004cdf565b62012290565b5095915093506020925062012229915062004cdf565b9291906020810151602681101562002a2357600303620123f6576020919262000faa62012229926202e1ae565b6020810151602681101562002a23576004036201269e576201242060c06040830151015162004cef565b51936201243560c06040840151015162004d13565b51906201245c60a06040620124508282880151015162004cef565b51950151015162004d13565b519362012471875184511462000fa3620331b7565b62012484875185511462000fa3620331b7565b62012497875186511462000fa3620331b7565b60005b87518110156201250057620124b0818662004d46565b51906103e882101562004cfd57620124fa916003906001600160a01b03620124d9848d62004d46565b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b6201249a565b509095919593929360005b83518110156201265b5762012521818762004d46565b516103e881101562004cfd576003906001600160a01b0362012544848862004d46565b5116600052811b016020526201256560406000205462007d56838862004d46565b9062012572838962004d46565b51916103e883101562004cfd57620125b6926003906001600160a01b036201259b878b62004d46565b5116600052811b0160205260406000205562000fa3620332bb565b620125c2818762004d46565b516103e881101562004cfd576003906001600160a01b03620125e5848c62004d46565b5116600052811b016020526201260660406000205462006814838862004d46565b91905062012615818862004d46565b51916103e883101562004cfd5762012655926003906001600160a01b036201263e858e62004d46565b5116600052811b0160205260406000205562004cdf565b6201250b565b50936201267591929693506200847962007e479162032f53565b9260005b835181101562012215578062000faa6200796262012698938762004d46565b62012679565b6020810151602681101562002a2357600503620126c8576020919262000faa62012229926202ec1a565b6020810151602681101562002a23576006036201288f57620126f260c06040830151015162004cef565b51936201271960a060406201270d8282870151015162004cef565b51940151015162004d13565b519285518351036200db485785518451036200dafb5760005b8651811015620127985762012748818562004d46565b51906103e882101562004cfd5762012792916003906001600160a01b0362012771848c62004d46565b5116600052811b0160205262000faa60406000205462007ce9838962004d46565b62012732565b509060005b86518110156201283957620127b3818562004d46565b516103e881101562004cfd576003906001600160a01b03620127d6848b62004d46565b5116600052811b01602052620127f760406000205462007d56838862004d46565b919062012805828762004d46565b51906103e882101562004cfd57620128339362000faa926003906001600160a01b036201259b878f62004d46565b6201279d565b5094916201284e919350620121cd9062032f53565b91604051946201285e8662002b3f565b60008652600036813760005b835181101562012215578062000faa6200796262012889938762004d46565b6201286a565b6020810151602681101562002a2357600703620129a15760400192620128ba60c08551015162004cef565b5191620128cc60a08651015162004cef565b5194515191620128e4845187511462000fa3620331b7565b60005b845181101562012215576201299b9062000faa6001600160a01b03806201290f848a62004d46565b51166000528660028b6201298b6201294e876201294681611f4097886020526200880e60ff604060002054161562000fa362033288565b519362004d46565b5191620088728d60405196620129648862002a7f565b60018852886200dc958c60208b01946000865260408c0197885260608c01998a5262004d46565b519101556200888d838962004d46565b620128e7565b6020819493940151602681101562002a235760080362012a385760c06040620129ce920151015162004cef565b519160005b835181101562012a265762012a20906001600160a01b0380620129f7838862004d46565b5116600052611f4090816020526200ddb1600160ff6040600020541615151462000fa3620331e7565b620129d3565b50926020919250620122299062004cdf565b6020810151602681101562002a235760090362012aba5760c0604062012a62920151015162004cef565b519160005b835181101562012a265762012ab4906001600160a01b038062012a8b838862004d46565b5116600052611f4090816020526200de9f600160ff6040600020541615151462000fa3620331e7565b62012a67565b6020810151602681101562002a2357600a0362012b68576040019062012aeb60a06200df3360c08551015162004cef565b519262012b00835185511462000fa3620331b7565b60005b835181101562012b555762012b4f906001600160a01b038062012b27838862004d46565b5116600052611f40806020526200dfa2600160ff6040600020541615151462000fa3620331e7565b62012b03565b5093620122299193506020925062004cdf565b602081949392940151602681101562002a2357600b0362012c1b576040019262012b9760c08551015162004cef565b519351519162012baf855184511462000fa3620331b7565b60005b855181101562012c085762012c029062000faa6001600160a01b038062012bda848b62004d46565b5116600052611f40806020526200e084600160ff6040600020541615151462000fa3620331e7565b62012bb2565b5093509160209150620122299062004cdf565b9091926020820151602681101562002a2357600c0362012cf8576060604083015101519262012c4a846202d698565b60005b845181101562012b555760c062012c6d8260606040880151015162004d46565b5101511562012cba5762012c8e62008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca962012cb4936000190162005cba565b62012c4d565b62012cd262008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca962012cb4936000190162005c7a565b9291906020810151602681101562002a2357600d0362012ddc5760400192602062012d2860a08651015162004cef565b51945101519162012d3d85518451146202dd8c565b60005b855181101562012c08578062012d5b62012d9c928662004d46565b511562012da25762012d7262008d8c828962004d46565b62012d8a60ff600562008db662008daf858c62004d46565b600562008dd262008daf838a62004d46565b62012d40565b62012db262008dfb828962004d46565b62012dca60ff600562008db662008e1e858c62004d46565b600562008dd262008e1e838a62004d46565b6020819492940151602681101562002a2357600e0362012e8b5760400190602062012e0c60a08451015162004cef565b51925101519362012e2183518651146202dd8c565b60005b835181101562012c08578062012e3f62012e4b928862004d46565b5162012e515762004cdf565b62012e24565b62012e6162008eb6828762004d46565b62012e7960ff600562008ed962008daf858a62004d46565b600562008ca962008daf838862004d46565b906020829493940151602681101562002a2357600f0362012f69576060604083015101519262012ebb846202d698565b60005b845181101562012b555760c062012ede8260606040880151015162004d46565b5101511562012f2b5762012eff62008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262012f25936000190162005cba565b62012ebe565b62012f4362008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262012f25936000190162005c7a565b906020819493940151602681101562002a235760100362012fda57604001519062012f9d60a0608084015193015162004cef565b519362012fb2835186511462000fa3620331b7565b60005b835181101562012c08578062000faa6200902b62012fd4938762004d46565b62012fb5565b6020819492940151602681101562002a23576011036201323c57604001906201300e60a06200df3360c08551015162004cef565b51936201301f83518651146202d510565b60005b83518110156201309957620130939062000faa6001600160a01b03806201304a848962004d46565b5116600052611f45806020526201306c60406000205462006814868d62004d46565b9190926201307b868b62004d46565b511660005260205260406000205562000fa36203316d565b62013022565b50935090620130a89062032e37565b90611f465493620130bf6200806884518762006200565b9060009260005b87811062013221575060005b855181101562013179576000805b8981106201312a575b501562013102575b620130fc9062004cdf565b620130d2565b93620130fc9062013121906001600160a01b036200e724888a62004d46565b949050620130f1565b620131358162004eb6565b90546001600160a01b0360039290921b1c81169062013155858b62004d46565b5116146201316e57620131689062004cdf565b620130e0565b5050600138620130e9565b5095509392506201318a8262004e62565b8051906001600160401b03821162002a9b57602090620131aa8362004ff7565b01611f46600052602060002060005b83811062013203575050505060005b828110620131e0575050506201222960209162004cdf565b620131fd9062000faa6001600160a01b03620019fb838662004d46565b620131c8565b82516001600160a01b031681830155602090920191600101620131b9565b936200e87062013236916200e8528762004eb6565b620130c6565b6020819492940151602681101562002a23576012036201348157604001906201327060a06200df3360c08551015162004cef565b51936201328183518651146202d510565b60005b8351811015620132d457620132ce9062000faa6001600160a01b0380620132ac848962004d46565b5116600052611f45806020526201306c60406000205462007d56868d62004d46565b62013284565b5093509190620132e49062032e37565b611f4654620132f38162004e62565b906000926000915b808310620133a857505050620133118262004e62565b8051906001600160401b03821162002a9b57602090620133318362004ff7565b01611f46600052602060002060005b8381106201338a575050505060005b82811062013367575050506201222960209162004cdf565b620133849062000faa6001600160a01b03620019fb838662004d46565b6201334f565b82516001600160a01b03168183015560209092019160010162013340565b91956000959193959760005b85518110156201347257620133c98962004eb6565b90546001600160a01b0360039290921b1c811690620133e9838962004d46565b5116146201340257620133fc9062004cdf565b620133b4565b509750956001959391955b8062013441575b156201342c57620134259062004cdf565b91620132fb565b936200e87062013425916200e8528762004eb6565b506201344d8162004eb6565b60018060a01b0391549060031b1c16600052611f456020526040600020541562013414565b5097969096959391956201340d565b6020810151602681101562002a2357601303620134da5760408091015101519260005b8451811015620134c9578062000faa6200959f620134c3938862004d46565b620134a4565b509250906201222960209162004cdf565b6020810151602681101562002a23576014036201368757604001906201350560c08351015162004cef565b51936201351c60a06200779b818651015162004cef565b51916201352d86518551146202df8a565b6201353c86518451146202dff0565b60005b8651811015620136325762013555818562004d46565b5162013562828762004d46565b51906103e882101562004cfd576006620135829260031b0154906200608f565b906201358f838862004d46565b51916103e883101562004cfd576006620135ae9360031b01556202e0aa565b620135ba818562004d46565b51620135c7828762004d46565b51906103e882101562004cfd57620135f0916003906001600160a01b0362012148868d62004d46565b9190620135fe828862004d46565b51906103e882101562004cfd576201362c9362000faa926003906001600160a01b036201219c878f62004d46565b6201353f565b5094915091620121cd620136469162032f53565b9360405192620136568462002b3f565b60008452600036813760005b835181101562012215578062000faa6200796262013681938762004d46565b62013662565b6020810151602681101562002a2357601503620136b1576020919262000faa62012229926202e1ae565b6020810151602681101562002a23576016036201370d5760c06040620136db920151015162004cef565b519260005b8451811015620134c957620137079062000faa6001600160a01b0362009d36838962004d46565b620136e0565b6020810151602681101562002a23576017036201376a5760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601803620137d55760c0604062013794920151015162004cef565b5192600160ff19611fb6541617611fb65560005b8451811015620134c957620137cf9062000faa6001600160a01b0362009e02838962004d46565b620137a8565b6020819392930151602681101562002a23576019036201394a5760008091604082910160a08082510151805162013911575b5050519060e0820151916201382b6200680d60c060018060a01b0393015162004cef565b511690602083519301915af13d1562013908573d906201384b8262002f5b565b916201385b604051938462002b94565b82523d6000602084013e5b156201387a57506201222960209162004cdf565b62004cdb90620138e760405191600080516020620338cc833981519152602084015278039bab1b1b2b9b9b33ab617102932ba3ab937103230ba309d1603d1b6040840152828151620138d6816059946020868601910162002e01565b810103603981018452018262002b94565b60405162461bcd60e51b815260206004820152918291602483019062002e26565b60609062013866565b6201391c9062004cef565b51516201392b575b8062013807565b8192506200680d90620139419251015162004cef565b51903862013924565b6020810151602681101562002a2357601a0362013a005760a0604062013974920151015162004cef565b516201398460038251146202d510565b6201398f8162004cef565b5191620139a8620139a08362004d13565b519262004d24565b51916200f9d55760209262012229926001036200a04357620139d2620139e091611fb1546200608f565b611fb15562000fa362033108565b62000faa620139f2611fb2546200607c565b611fb25562000fa362033142565b6020810151602681101562002a2357601b0362013e305750919062013a30611faf546200225a6200a0b962033044565b505062013a3c62033108565b506000805b6103e8811062013de4575b505062013a5862006161565b62013a66613f745462004e62565b906000946000905b6103e882101562013dd7578160031b9460ff6007870154161562013bbf5760009660028701541562013bae57600098975b62004cfd57600487015489101562013b945762013ac0896004890162004f5e565b9054600391821b1c6001600160a01b031660008181529189016020526040918290205491999162013af390889062005eb0565b9a9062013aff62033108565b62013b0a9162004cac565b60009a60028b015462013b1d9162005eb0565b919062013b2962033108565b62013b349162004cac565b82600052611f476020526000209081549062013b50916200608f565b90915562013b5d62033108565b62013b689162004cac565b62013b74828962004d46565b5262013b809062004cdf565b9862013b8c9062004cdf565b989762013a9f565b9290955062013ba69196975062004cdf565b909462013a6e565b9290955062013ba691965062004cdf565b95969392509350505b62013bd38262004e62565b9160009160005b82811062013d4157505050611f48549162013bfa62008068848462006200565b926000906000905b80821062013d2457505060005b83811062013c8e5750508251929150506001600160401b03821162002a9b5760209062013c3c8362004fbc565b01611f48600052602060002060005b83811062013c705750505050620122296020916000611fb1556000611fb25562004cdf565b82516001600160a01b03168183015560209092019160010162013c4b565b6000805b83811062013cdc575b501562013cb4575b62013cae9062004cdf565b62013c0f565b9062013cae9062013cd3906001600160a01b03620081f0858762004d46565b91905062013ca3565b6001600160a01b038062013cf1858862004d46565b51169062013d00838a62004d46565b51161462013d195762013d139062004cdf565b62013c92565b505060013862013c9b565b9091620081fe62013d3a91620094f58562004e9a565b9062013c02565b6000805b85811062013d8f575b501562013d67575b62013d619062004cdf565b62013bda565b9262013d619062013d86906001600160a01b03620081f0878662004d46565b93905062013d56565b6001600160a01b038062013da4858762004d46565b51169062013db3838a62004d46565b51161462013dcc5762013dc69062004cdf565b62013d45565b505060013862013d4e565b9394959291505062013bc8565b8060039594951b9060ff6007830154161562013e26576200a4f86200746162000faa946200a4ec62013e1d9560026200a4e28762005e1c565b93929362013a41565b5093929362013a4c565b6020810151602681101562002a2357601c0362013e8d5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d0362013eb3575b506201222960209162004cdf565b9290916020840151602681101562002a2357601e03620145d557604084019060a09062013ee4828451015162004cef565b515162013ef5838551015162004d13565b5151036200ade95762013f0c828451015162004cef565b515162013f1d838551015162004d24565b5151036200ad6d5762013f34828451015162004cef565b519462013f45838551015162004d13565b519162013f5a6200a641858751015162004d24565b519585518751036200ad0a5760005b865181101562013fc25762013f7f818862004d46565b51906103e882101562004cfd57600362013fbc9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b62013f69565b5090969192939660005b86518110156201406b5762013fe2818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526201401a60406000205462007d56838b62004d46565b919062014028828a62004d46565b51906103e882101562004cfd576201406593600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b62013fcc565b50939692979550936201407e9062032f53565b96604051966201408e8862002b78565b60018852602036818a013786516001600160a01b0316620140af8962004cef565b5260405196620140bf8862002b3f565b600088526000610760525b895161076051908110156201447c57620140e5908b62004d46565b5161072052620140f6885162004e62565b99600097620141068b5162004e62565b6109405260009760005b8b51811015620141d6578d8c620141406001600160a01b0362014134858462004d46565b51166107205162032d3b565b158062014190575b62014161575b50506201415b9062004cdf565b62014110565b9b620141859162001ac782859f62007f376201415b9760018060a01b039262004d46565b9a90508d8c6201414e565b5050506103e861072051101562004cfd576001600160a01b03620141b5828e62004d46565b5116600052600361072051811b016020528d8c604060002054151562014148565b50909b989a99949691929395979b60005b8b518110156201427b576103e861072051101562004cfd576001600160a01b0362014213828e62004d46565b5116600052600361072051811b016020526040600020541562014242575b6201423c9062004cdf565b620141e7565b9c620142726201423c918f620142618f9160018060a01b039262004d46565b511662001ac7826109405162004d46565b9d905062014231565b509b5098959092949691939661072051996103e88b10159c8d62004cfd57620142b26200806860048f9e60031b01549e8f62006200565b6108e0526000610a20528d60009e5b62004cfd578d8f101562014380575060009d62014309620142ec8260046107205160031b0162004f5e565b90546109405160039290921b1c6001600160a01b03169062032dea565b1562014323575b6201431c8f9162004cdf565b9e620142c1565b6201431c9e5060009e8f91620143438160046107205160031b0162004f5e565b60018060a01b0391549060031b1c1662014364610a20516108e05162004d46565b5262014373610a205162004cdf565b610a205291505062014310565b9396999b929d509396999094979b5060005b828110620144305750505062004cfd576108e051516001600160401b03811162002a9b57620143cb8160046107205160031b016200509a565b60206108e051019060046107205160031b0160005260206000209160005b828110620144125750505050620144036107605162004cdf565b610760529598909498620140ca565b81516001600160a01b031681850155602090910190600101620143e9565b62014476906001600160a01b0362014449828562004d46565b51166201445d610a20516108e05162004d46565b526201446c610a205162004cdf565b610a205262004cdf565b62014392565b509492975094955091965060009460005b8751811015620144e057620144ab6200abc66200abb9838962004d46565b80620144c4575b50620144be9062004cdf565b6201448d565b906200abfc620144d998620144be936200608f565b90620144b2565b5096509450929091508062014502575b5050620122296020915b915062013ea5565b6201452d9060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b60018060a01b03835116600052602052604060002055600080611f4654905b8181106201458b575b5050916201222991602093156201456f575b5091620144f0565b5162014584906001600160a01b0316620065d6565b3862014567565b620145968162004eb6565b9054855160039290921b1c6001600160a01b03908116911614620145c557620145bf9062004cdf565b6201454c565b5060019150829050602062014555565b9190926020810151602681101562002a2357601f0362014610576020916201460a6200ae9d6040620122299401515162004cef565b620144fa565b6020810151602681101562002a235760200362014636575b5062012229602091620144fa565b6020810151602681101562002a2357602180910362014657575b5062014628565b602082015160268110156200b01a57602203620146945750506201222960209160ff19611fb65416611fb6556201468d62005087565b9162014650565b602082015160268110156200b01a57602303620146bb575b5050620122296020916201468d565b60208201519060268210156201478c576024809203620146dd575b50620146ac565b602083015160268110156201477957602514620146d65760208301519060268210156201476557506015036201472857506020916201472062012229926202e1ae565b9138620146d6565b60649060166040519162461bcd60e51b83526020600484015282015275496e76616c6964206f7065726174696f6e207479706560501b6044820152fd5b9050634e487b7160e01b6000526004526000fd5b50634e487b7160e01b6000526004526000fd5b634e487b7160e01b60005260045260246000fd5b8151620147b6906001600160a01b031662006600565b62011f21565b620147c78162004f0a565b9054865160039290921b1c6001600160a01b03908116911614620147f657620147f09062004cdf565b62011f0f565b5050506001388062011f18565b82516001600160a01b0316600160401b82101562002a9b5762001a08826001620148329401613f025562004eee565b386200bbb0565b620148448162004eee565b9054865160039290921b1c6001600160a01b0390811691161462014873576201486d9062004cdf565b6200bb9f565b50506001386200bba8565b82516001600160a01b0316818301556020909201916001016200bad5565b82516001600160a01b0316818301556020909201916001016200b988565b600191820180546001600160a01b03909216848601559390910192906200b8d7565b613f6d60005262014903906000805160206203396c83398151915290810190830162004fa3565b386200b898565b600180826201491b82948662014d65565b019201920191906200b85a565b613f6c600052600080516020620337ac833981519152908282015b8183018110620149555750506200b81f565b806201496360019262005399565b0162014943565b600191820180546001600160a01b03909216848601559390910192906200b7f0565b613f6b600052620149b3906000805160206203376c83398151915290810190830162004fa3565b386200b7b1565b6001809193019182549381613f0301550190916200b754565b82516001600160a01b0316818301556020909201916001016200b66d565b62014a0c90613f026000528484600020918201910162004fa3565b386200b65d565b82516001600160a01b0316818301556020909201916001016200b489565b62014a4c90613ef96000528484600020918201910162004fa3565b386200b479565b8062014a759160031b600160ff60078301541615151462014a7b575062004cdf565b6200b3ce565b62014a8e60048201611fbc830162014efe565b611fbf8101600160ff19825416179055805481611fb801556001810154611fb98201556002810154611fba82015562014acf60058201611fbd830162014d65565b611fbe6006820154910155386200a043565b600660208262014af560019451866200581b565b019201920191906200b1d7565b600681810204810362001e0757600683810204830362001e0757613efa6000527f2dfc264c6ecd0c6ea7ea3726867a09cc7eed901a6e437c010038bab559d48ed86006840281015b826006028201811062014b5f5750506200b1c4565b806000600692556000600182015562014b7b6002820162005504565b6000600382015562014b906004820162005399565b600060058201550162014b4a565b600660208262014bb260019451866200581b565b019201920191906200b14c565b8060060290600682040362001e07578260060260068104840362001e0757600090613efb82526020822092830192015b82811062014bff5750506200b139565b80826006925582600182015562014c196002820162005504565b82600382015562014c2d6004820162005399565b8260058201550162014bef565b608460405162461bcd60e51b815260206004820152604060248201526000805160206203394c83398151915260448201527f656d2073686f756c64206e6f742072657475726e20766f7465206e65656465646064820152fd5b60405162461bcd60e51b815260206004820152604760248201526000805160206203394c83398151915260448201527f656d2073686f756c64206e6f742072657475726e206120766f74696e672072756064820152661b19481b1a5cdd60ca1b608482015260a490fd5b81811462014d61578154916001600160401b03831162002a9b5762014d2383836200509a565b60005260206000209060005260206000208154916000925b84841062014d4a575050505050565b600180919201938454928185015501929062014d3b565b5050565b9080821462014d615762014d7a815462002c79565b906001600160401b03821162002a9b57819062014da48262014d9d865462002c79565b86620056d5565b600090601f831160011462014ddd5760009262014dd15750508160011b916000199060031b1c1916179055565b01549050388062005768565b81526020808220858352818320935090601f1985169083905b82821062014e3257505090846001959493921062014e1857505050811b019055565b015460001960f88460031b161c19169055388080620057b5565b849581929585015481556001809101960194019062014df6565b81811462014d615781549162014e63838362005427565b6000526020600020906000526020600020906000905b83821062014e875750505050565b8062014e966001928562014d65565b92810192918101910162014e79565b81811462014d615781549162014ebc8383620054b5565b6000526020600020906000526020600020906000905b83821062014ee05750505050565b8062014eef6001928562014cfd565b92810192918101910162014ed2565b81811462014d61578154916001600160401b03831162002a9b5762014f2483836200509a565b60005260206000209060005260206000208154916000925b84841062014f4b575050505050565b600191820180546001600160a01b039092168486015593909101929062014f3c565b81811462014d615781549162014f848383620054b5565b6000526020600020906000526020600020906000905b83821062014fa85750505050565b8062014fb76001928562014efe565b92810192918101910162014f9a565b81811462014d615781549162014fdd8383620055b8565b6000526020600020906000526020600020906000905b838210620150015750505050565b8060019184036201501e575b600880910193019101909162014ff3565b805484556201504b8280860190830160ff906201503f82825416846200569a565b5460081c1690620056b4565b6002808201549085015562015067600380830190860162014cfd565b600480850190820180820362015080575b50506201500d565b6201508b9162014e4c565b6201509d600580830190860162014ea5565b620150af600680830190860162014f6d565b620150c1600780830190860162014d65565b388062015078565b919062005d3057808203620150dc575050565b60ff60058062002c3b94620150f5848654168262005681565b6001850154600182015562015111600286016002830162014fc6565b600385015460038201556201512d600486016004830162014d65565b0192016201513f8282541684620057f2565b5460081c169062005803565b9080821462014d6157908154906000915b606483106201516b5750505050565b60018091940192835494818401550191926201515c565b90611f42549060009060208401805151906201519e8262002c61565b91620151ae604051938462002b94565b808352620151bf601f199162002c61565b01366020840137620151d48151518662005eb0565b9015620155c657620151e69062004e62565b92849180515115620155bb57620152008793929362004e62565b95915b81515183101562015404576000958687805b8c8c83109182156201537d576201522e89895162004d46565b5194600092839662015241859662015a04565b620152528588846001948562015bb7565b6201533e575b508284118062015328575b15620152cd575050509183918b620152c3575b600685101562002a23578c8f95600314620152a3575b5050620152999062004cdf565b9190925062015215565b9b620152ba9162001ac78262015299959f62004d46565b9a908c6201528c565b60009b5062015276565b909391809593148062015312575b15620153045750600685101562002a23578c8f95600314620152a3575050620152999062004cdf565b945050620152999062004cdf565b5050600685101562002a23578e851515620152db565b5050600686101562002a23578f86151562015263565b92935093509450620153508462005cba565b5001549060ff620153618562005cba565b505416946003620153728662005cba565b500154933862015258565b50505050969096949391946201539f8162015399858a62004d46565b620035e5565b600681101562002a2357600314620153c6575b50620153be9062004cdf565b919262015203565b6000905b808210620153d95750620153b2565b9094620092e0620153fd91620153f0888c62004d46565b5162001ac7828c62004d46565b90620153ca565b9650505094509150600093845b83518610156201555657620154316201542b878662004d46565b62005673565b9060068083101562002a235760029283036201545c57505062015455909562004cdf565b9462015411565b6201546c6201542b898862004d46565b928184101562002a235760018094148062015542575b15620154975750505062015455909562004cdf565b620154ac6201542b8a899b9694959b62004d46565b928084101562002a23576004809414928362015516575b5082620154eb575b5050620154df575b50620154559062004cdf565b955062015455620154d3565b90915088101562015501578714153880620154cb565b602182634e487b7160e01b6000525260246000fd5b908093508a10156201552d578914159138620154c3565b602184634e487b7160e01b6000525260246000fd5b508183101562002a23578083141562015482565b925092909350600682101562002a235760038203620155b2575b6201557b8162004e62565b9360005b8281106201558e575050509190565b806201559f620155ac928462004d46565b5162001ac7828962004d46565b6201557f565b50600062015570565b509450505092509190565b60405162461bcd60e51b815260206004820152602a60248201527f546865206c656e677468206f6620766f74696e672072756c65206c697374206960448201526973206f766572666c6f7760b01b6064820152608490fd5b90611f43549060009060208401805151906201563a8262002c61565b916201564a604051938462002b94565b8083526201565b601f199162002c61565b01366020840137620156708151518662005eb0565b9015620155c657620156829062004e62565b92849180515115620155bb576201569c8793929362004e62565b95915b8151518310156201588a576000958680805b8c8c82109283156201581557620156ca89895162004d46565b5194600092620156eb848683829a620156e4849b62015a04565b8362015bb7565b620157d6575b81841180620157c0575b1562015764575050509083928b6201575a575b600685101562002a23578c8f956003146201573a575b5050620157319062004cdf565b909250620156b1565b9b620157519162001ac78262015731959f62004d46565b9a908c62015724565b60009b506201570e565b908094939592951480620157aa575b156201579c5750600685101562002a23578c8f956003146201573a575050620157319062004cdf565b945050620157319062004cdf565b5050600685101562002a23578e85151562015773565b5050600686101562002a23578f861515620156fb565b9450945090506001620157e98362005c7a565b5001549060ff620157fa8462005c7a565b5054169460036201580b8562005c7a565b50015494620156f1565b935050505096909694939194620158328162015399858a62004d46565b600681101562002a235760031462015859575b50620158519062004cdf565b91926201569f565b6000905b8082106201586c575062015845565b9094620092e06201588391620153f0888c62004d46565b906201585d565b9650505094509150600093845b8351861015620159ac57620158b16201542b878662004d46565b9060068083101562002a23576002928303620158dc575050620158d5909562004cdf565b9462015897565b620158ec6201542b898862004d46565b928184101562002a235760038094148062015998575b156201591757505050620158d5909562004cdf565b6201592c6201542b8a899b9694959b62004d46565b928084101562002a23576005809414928362015981575b50826201596b575b50506201595f575b50620158d59062004cdf565b9550620158d562015953565b90915088101562002a235787141538806201594b565b908093508a101562002a2357891415913862015943565b508183101562002a23578083141562015902565b925092909350600682101562002a235760038203620159fb575b620159d18162004e62565b9360005b828110620159e4575050509190565b806201559f620159f5928462004d46565b620159d5565b506000620159c6565b1562015a0c57565b60405162461bcd60e51b815260206004820152602860248201527f506c7567696e466163746f72793a20706c7567696e20696e646578206f7574206044820152676f662072616e676560c01b6064820152608490fd5b9062002c3b606160405180947f436865636b696e6720636f6e646974696f6e206578703a20706c7567696e206960208301527f6e646578206f7574206f662072616e67652c20706c7567696e20696e6465783a6040830152600160fd1b606083015262015ad9815180926020868601910162002e01565b810103604181018552018362002b94565b606d62002c3b919392936040519485917f436865636b696e6720636f6e646974696f6e206578703a206e6f646520696e6460208401527f6578206f7574206f662072616e67652c20706c7567696e20696e6465783a2000604084015262015b5c815180926020605f8701910162002e01565b82016d016103737b2329034b73232bc1d160951b605f82015262015b8a825180936020878501910162002e01565b0103604d81018552018362002b94565b805482101562004cfd5760005260206000209060031b0190600090565b93929190841562015f485762015be1611f4254841062000fa362015bdb86620050f5565b62015a62565b62015c18600262015bf28562005cba565b500154851062000fa362015c0686620050f5565b62015c1188620050f5565b9062015aea565b841562015f295762015c48600162015c3f86600262015c378862005cba565b500162015b9a565b50015460ff1690565b945b62015c558662002fc4565b8562015c6657505050505050600090565b62015c718662002fc4565b60039580870362015c885750505050505050600190565b62015c938162002fc4565b6004810362015ca85750505050505050600090565b62015cb38162002fc4565b6001810362015cc95750620032d2955062015f78565b91959392949062015cda8362002fc4565b600280931462015cf1575b50505050505050600090565b801562015f0b5762015d1b600162015d0f848662015c378962005cba565b50015460081c60ff1690565b935b811562015eef578562015d36848662015c378562005cba565b500154965b62015d468862004e62565b9860005b89811062015e645750505050505062015d638262002a18565b6001820362015dc657505050906001916000915b81831062015d855750505090565b9091928062015da3575b62015d9b909362004cdf565b919062015d77565b5062015d9b62015dbe62015db8858462004d46565b51151590565b905062015d8f565b62015dd18262002a18565b810362015e2b5750509060009182915b81831062015def5750505090565b909192801562015e0e575b62015e06909362004cdf565b919062015de1565b5062015e0662015e2362015db8858462004d46565b905062015dfa565b90915062015e398162002a18565b1462015e4d57503880808080808062015ce5565b62015e6062015db8620032d29262004cef565b1590565b808b62015ead828c8a8c8a8c1562015ece5762015ea3949262015e99949262015c3762015e919362005cba565b500162004f5e565b90549060031b1c90565b8787878b62015bb7565b62015ec162015ec89462000faa9362004d46565b9015159052565b62015d4a565b62015ee9949262015e99949262015c3762015e919362005c7a565b62015ea3565b8562015f01848662015c378562005c7a565b5001549662015d3b565b62015f22600162015d0f848662015c378962005c7a565b9362015d1d565b62015f41600162015c3f86600262015c378862005c7a565b9462015c4a565b62015f61611f4354841062000fa362015bdb86620050f5565b62015f72600262015bf28562005c7a565b62015c18565b9392600462015fc291866000146201619057600262015f9d878262015c378562005cba565b500154955b87156201617f57600262015c3762015fba9362005cba565b5001620036ac565b916032841115620161735760338410158062016167575b6201615a576097841015806201614e575b620161415760d38410158062016134575b620161285761012d841015806201611c575b6201610f576101918410158062016102575b620160f5576101af84101580620160e8575b620160db576101cd84101580620160ce575b620160c1576101f584101580620160b4575b620160a757610259841015806201609a575b6201608c57506102bd831015620160815750505050600090565b620032d293620241b4565b9050620032d293506202b4f1565b506102bc84111562016067565b50620032d293506201e3df565b5061025884111562016055565b50620032d293506202be55565b506101f484111562016043565b50620032d293506202c8b8565b506101cc84111562016031565b50620032d2935062023923565b506101ae8411156201601f565b50620032d2935062028765565b5061019084106201600d565b50620032d293620161ad565b5061012c84111562015ffb565b50620032d2935062023f9f565b5060b484111562015fea565b5050620032d2926201f03f565b50609584111562015fd9565b50620032d29362025742565b600262015c3762015fba9362005c7a565b6002620161a3878262015c378562005c7a565b5001549562015fa2565b9260d381146201677c5760d481146201676f5760d58114620167625760d68114620167555760d78114620167485760d881146201673b5760d981146201672f5760da8114620167225760db8114620167155760dc8114620167095760dd8114620166fa5760de8114620166eb5760df8114620166de5760e08114620166d15760e18114620166c55760e28114620166b85760e38114620166ab5760e481146201669f5760e58114620166905760e68114620166815760e78114620166745760e88114620166675760e981146201665a5760ea81146201664d5760eb8114620166405760ec8114620166335760ed8114620166265760ee8114620166195760ef81146201660c5760f08114620165ff5760f18114620165f25760f28114620165e55760f38114620165d85760f48114620165cb5760f58114620165be5760f68114620165b15760f78114620165a45760f88114620165975760f981146201658b5760fa81146201657f5760fb8114620165735760fc8114620165675760fd81146201655b5760fe81146201654f5760ff811462016543576101008114620165375761010181146201652b5761010281146201651f5761010381146201651357610104811462016507576101058114620164fb576101068114620164ef576101078114620164e3576101088114620164d7576101098114620164cb5761010a8114620164bf5761010b8114620164b35761010c8114620164a75761010d81146201649b5761010e81146201648f5761010f811462016483576101108114620164775761011181146201646b5761011281146201645f57610113811462016453576101148114620164475761011581146201643b57610116146201643057505050600090565b620032d2926201da96565b50620032d2926201d86d565b50620032d2926201d644565b50620032d2926201d341565b50620032d2926201d120565b50620032d2926201ceff565b50620032d2926201cccd565b50620032d2926201cb04565b50620032d2926201c93b565b50620032d2926201c703565b50620032d2926201c53c565b50620032d2926201c20d565b50620032d2926201bfdb565b50620032d2926201be12565b50620032d2926201bc49565b50620032d2926201ba84565b50620032d2926201b84c565b50620032d2926201b685565b50620032d2926201b34f565b50620032d2926201b0ef565b50620032d2926201af1e565b50620032d2926201ad3d565b50620032d2926201ab76565b50620032d2926201a920565b50620032d2926201a757565b50620032d2926201a58e565b50620032d2926201a2ad565b50620032d29262019fad565b50620032d29262019cc0565b50620032d292620199c0565b50620032d292506201983b565b50620032d29250620196f6565b50620032d2925062019584565b50620032d292506201943f565b50620032d29250620192fa565b50620032d29250620191b6565b50620032d2925062019041565b50620032d2925062018efd565b50620032d2925062018db9565b50620032d2925062018c78565b50620032d2925062018b35565b50620032d29250620189f4565b50620032d29250620188ab565b50620032d2925062018767565b50620032d2925062018623565b50620032d29250620184ae565b50620032d2925062018310565b50620032d29250620181cd565b509050620032d2915062018172565b509050620032d2915062018115565b50620032d29262017ed7565b50620032d2925062017d48565b50620032d2925062017bf9565b50620032d292620179e2565b50620032d292506201783a565b50620032d29250620176ed565b509050620032d2915062017692565b509050620032d2915062017625565b50620032d292620173d9565b50620032d292506201724a565b50620032d29250620170f5565b50620032d29262016ec7565b50620032d2925062016d0f565b50620032d2925062016bb3565b50620032d2925062016ab2565b50620032d2925062016985565b50620032d2925062016884565b50620032d2925090602001906001825151036201682b576001620167a1835162004cef565b515103620167d157620167b4906201dd9d565b919015620065cf576200680d620167cc915162004cef565b511090565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231313a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90602001906001825151036201692c576001620168a2835162004cef565b515103620168d257620168b5906201dd9d565b919015620065cf576200680d620168cd915162004cef565b511190565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231323a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b906020019060018251510362016a59576002620169a3835162004cef565b515103620169fd57620169b6906201dd9d565b9015620065cf57620169cd6200680d835162004cef565b518110159182620169dd57505090565b620169f7919250620169f0905162004cef565b5162004d13565b51101590565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231333a205468652055494e545f324441525241595b305d206c60448201526d32b733ba341034b9903737ba101960911b6064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231333a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b906020019060018251510362016b5a57600162016ad0835162004cef565b51510362016b005762016ae3906201dd9d565b919015620065cf576200680d62016afb915162004cef565b511490565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231343a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3231343a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90604001600191828251510362016cb5578262016bd1835162004cef565b51510362016c5b5762016be4906201e110565b15620065c757829160009182945b62016c00575b505050905090565b805185101562016c55576001600160a01b038062016c1f878462004d46565b51169062016c326200680d855162004cef565b51160362016c4d5762016c46849562004cdf565b9462016bf2565b505091505090565b62016bf8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3231353a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231353a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362016e6d578262016d2d835162004cef565b51511062016e135762016d40906201e110565b15620065c757600091835b62016d57575b50505090565b815183101562016e0d57600080855b62016d8f575b501562016d865762016d7f849362004cdf565b9262016d4b565b50505050600090565b62016da08396949295965162004cef565b515181101562016e02576001600160a01b038062016dbf888562004d46565b51169062016dd3836200743f875162004cef565b51161462016df5579062016de984939262004cdf565b90939594919262016d66565b5091809493503862016d6c565b949390929462016d6c565b62016d51565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3231363a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231363a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201709b578462016ee9845162004cef565b515103620170415762016efc906201e110565b1562016f9a5784931562016fb1576000935b62016f1a575050505090565b8051841015620051fe576001600160a01b038062016f39868462004d46565b5116600052611f4080845260409060ff8260002054161562016fa45760029262016f64888662004d46565b51166000528452600020015462016f806200680d855162004cef565b510362016f9a5762016f93859462004cdf565b9362016f0e565b5050505050600090565b5050505050505050600090565b6000935b62016fc1575050505090565b8051841015620051fe576001600160a01b038062016fe0868462004d46565b5116600052613ef880845260409060ff8260002054161562016fa4576002926201700b888662004d46565b511660005284526000200154620170276200680d855162004cef565b510362016f9a576201703a859462004cdf565b9362016fb5565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3231373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3231373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906040016001918282515103620171f0578262017113835162004cef565b515103620171965762017126906201e110565b91909115620065c757600091835b620171425750505050600090565b8051831015620171905783926001600160a01b038062017163838562004d46565b511690620171766200680d865162004cef565b511614620051c457620171899062004cdf565b9262017134565b62016d86565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3231383a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231383a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060400160019182825151036201737f578262017268835162004cef565b51511062017325576201727b906201e110565b15620065c75782916000935b620172955750505050600090565b815184101562017190576000835b620172bd575b50620172b6839462004cdf565b9362017287565b939291620172cc825162004cef565b51518510156201731c576001600160a01b0380620172eb868462004d46565b511690620172ff876200743f865162004cef565b51161462016c4d576201731483949562004cdf565b9092620172a3565b919293620172a9565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3231393a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3231393a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90916020809101906001938483515103620175cb5784620173fb845162004cef565b51510362017571576201740e906201e110565b9190911562016f9a57849315620174cf576000935b62017432575050505050600090565b8151841015620174c95784936001600160a01b03908162017454828662004d46565b5116600052611f4080845260409060ff82600020541662017485575b50506201747e915062004cdf565b9362017423565b8293620174956002948862004d46565b511660005284526000200154620174b16200680d865162004cef565b5114620174c15780388062017470565b505050505090565b62016f9a565b6000935b620174e2575050505050600090565b8151841015620174c95784936001600160a01b03908162017504828662004d46565b5116600052613ef880845260409060ff82600020541662017535575b50506201752e915062004cdf565b93620174d3565b8293620175456002948862004d46565b511660005284526000200154620175616200680d865162004cef565b5114620174c15780388062017520565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b62017630816201e110565b91909115620065cf57815115620065cf57600090815b835181101562017689576001600160a01b038062017665838762004d46565b5116908351160362017682576201767c9062004cdf565b62017646565b5050905090565b50505050600190565b6201769d816201e110565b91909115620065cf57815115620065cf5760005b8251811015620065c7576001600160a01b0380620176d0838662004d46565b51169083511614620065b457620176e79062004cdf565b620176b1565b906040016001918282515103620177e057826201770b835162004cef565b51510362017786576201771e906201e199565b15620065c757829160009182945b6201773957505050905090565b805185101562016c55576001600160a01b038062017758878462004d46565b5116906201776b6200680d855162004cef565b51160362016c4d576201777f849562004cdf565b946201772c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3232333a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232333a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017988578262017858835162004cef565b5151106201792e576201786b906201e199565b15620065c757600091835b620178815750505090565b815183101562016e0d57600080855b620178b0575b501562016d8657620178a9849362004cdf565b9262017876565b620178c18396949295965162004cef565b515181101562017923576001600160a01b0380620178e0888562004d46565b511690620178f4836200743f875162004cef565b5116146201791657906201790a84939262004cdf565b90939594919262017890565b5091809493503862017896565b949390929462017896565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3232343a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232343a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910190600193848351510362017b9f578462017a04845162004cef565b51510362017b455762017a17906201e199565b1562016f9a5784931562017ab5576000935b62017a35575050505090565b8051841015620051fe576001600160a01b038062017a54868462004d46565b5116600052611f4080845260409060ff8260002054161562016fa45760029262017a7f888662004d46565b51166000528452600020015462017a9b6200680d855162004cef565b510362016f9a5762017aae859462004cdf565b9362017a29565b6000935b62017ac5575050505090565b8051841015620051fe576001600160a01b038062017ae4868462004d46565b5116600052613ef880845260409060ff8260002054161562016fa45760029262017b0f888662004d46565b51166000528452600020015462017b2b6200680d855162004cef565b510362016f9a5762017b3e859462004cdf565b9362017ab9565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017cee578262017c17835162004cef565b51510362017c945762017c2a906201e199565b91909115620065c757600091835b62017c465750505050600090565b8051831015620171905783926001600160a01b038062017c67838562004d46565b51169062017c7a6200680d865162004cef565b511614620051c45762017c8d9062004cdf565b9262017c38565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3232363a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232363a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90604001600191828251510362017e7d578262017d66835162004cef565b51511062017e235762017d79906201e199565b15620065c75782916000935b62017d935750505050600090565b815184101562017190576000835b62017dbb575b5062017db4839462004cdf565b9362017d85565b93929162017dca825162004cef565b515185101562017e1a576001600160a01b038062017de9868462004d46565b51169062017dfd876200743f865162004cef565b51161462016c4d5762017e1283949562004cdf565b909262017da1565b91929362017da7565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3232373a2054686520414444524553535f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3232373a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90916020809101906001938483515103620180bb578462017ef9845162004cef565b515103620180615762017f0c906201e199565b9190911562016f9a5784931562017fbf576000935b62017f30575050505050600090565b8151841015620174c95784936001600160a01b03908162017f52828662004d46565b5116600052611f4080845260409060ff82600020541662017f83575b505062017f7c915062004cdf565b9362017f21565b829362017f936002948862004d46565b51166000528452600020015462017faf6200680d865162004cef565b5114620174c15780388062017f6e565b6000935b62017fd2575050505050600090565b8151841015620174c95784936001600160a01b03908162017ff4828662004d46565b5116600052613ef880845260409060ff82600020541662018025575b50506201801e915062004cdf565b9362017fc3565b8293620180356002948862004d46565b511660005284526000200154620180516200680d865162004cef565b5114620174c15780388062018010565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3232383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3232383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b62018120816201e199565b91909115620065cf57815115620065cf57600090815b835181101562017689576001600160a01b038062018155838762004d46565b5116908351160362017682576201816c9062004cdf565b62018136565b6201817d816201e199565b91909115620065cf57815115620065cf5760005b8251811015620065c7576001600160a01b0380620181b0838662004d46565b51169083511614620065b457620181c79062004cdf565b62018191565b906020016001918282515103620182b65782620181eb835162004cef565b5151036201825c57620181fe906201e1d2565b905015620065c757829160009182945b6201821b57505050905090565b805185101562016c555762018231858262004d46565b51620182426200680d845162004cef565b510362016c4d5762018255849562004cdf565b946201820e565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201845457826201832e835162004cef565b515110620183fa5762018341906201e1d2565b905015620065c757600091835b620183595750505090565b815183101562016e0d57600080855b62018388575b501562016d865762018381849362004cdf565b926201834e565b620183998396949295965162004cef565b5151811015620183ef57620183af868362004d46565b51620183c1826200743f865162004cef565b5114620183e25790620183d684939262004cdf565b90939594919262018368565b509180949350386201836e565b94939092946201836e565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3233323a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620185c9576002620184cd835162004cef565b5151036201856f57620184e0906201e1d2565b905091909115620065c757829160009182945b6201850057505050905090565b815185101562016c555762018516858362004d46565b51620185276200680d835162004cef565b5111801562018549575b62016c4d5762018542849562004cdf565b94620184f3565b5062018556858362004d46565b5162018567620169f0835162004cef565b511062018531565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201870d578262018641835162004cef565b515103620186b35762018654906201e1d2565b905015620065c757829160009182945b6201867157505050905090565b805185101562016c555762018687858262004d46565b51620186986200680d845162004cef565b51101562016c4d57620186ac849562004cdf565b9462018664565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018851578262018785835162004cef565b515103620187f75762018798906201e1d2565b905015620065c757829160009182945b620187b557505050905090565b805185101562016c5557620187cb858262004d46565b51620187dc6200680d845162004cef565b51111562016c4d57620187f0849562004cdf565b94620187a8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201899a5782620188c9835162004cef565b5151036201894057620188dc906201e1d2565b9093915015620065c7578060009384925b62018906575b5050506200680d620167cc915162004cef565b909193815185101562018939576200e870620189309162018928878562004d46565b519062006200565b919081620188ed565b93620188f3565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018adb578262018a12835162004cef565b51510362018a815762018a25906201e1d2565b9093915015620065c7578060009384925b62018a4f575b5050506200680d620168cd915162004cef565b909193815185101562018a7a576200e87062018a719162018928878562004d46565b91908162018a36565b9362018a3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600190818351510362018c1e57600262018b55845162004cef565b51510362018bc45762018b68906201e1d2565b90915015620065c757906000918183925b62018b92575b505050620169cd6200680d835162004cef565b909192825184101562018bbd576200647f62018bb49162018928868662004d46565b91908062018b79565b9262018b7f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233383a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018d5f578262018c96835162004cef565b51510362018d055762018ca9906201e1d2565b9093915015620065c7578060009384925b62018cd3575b5050506200680d62016afb915162004cef565b909193815185101562018cfe576200e87062018cf59162018928878562004d46565b91908162018cba565b9362018cc0565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3233393a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3233393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018ea3578262018dd7835162004cef565b51510362018e495762018dea906201e1d2565b9092915015620065c757600091835b62018e075750505050600090565b805183101562017190578262018e1f85948362004d46565b5162018e306200680d855162004cef565b5110620051c45762018e429062004cdf565b9262018df9565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362018fe7578262018f1b835162004cef565b51510362018f8d5762018f2e906201e1d2565b9291921562016d8657600092845b62018f4b575050505050600090565b8051841015620174c9578362018f6386958462004d46565b5162018f746200680d865162004cef565b5111620174c15762018f869062004cdf565b9362018f3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201915c57600262019060835162004cef565b515103620191025762019073906201e1d2565b929091921562016d8657600092845b62019091575050505050600090565b8051841015620174c95783620190a986958562004d46565b51620190ba6200680d855162004cef565b51111580620190db575b620174c157620190d49062004cdf565b9362019082565b50620190e8818562004d46565b51620190f9620169f0855162004cef565b511015620190c4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620192a05782620191d4835162004cef565b5151036201924657620191e7906201e1d2565b9291921562016d8657600092845b62019204575050505050600090565b8051841015620174c957836201921c86958462004d46565b516201922d6200680d865162004cef565b5114620174c1576201923f9062004cdf565b93620191f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620193e5578262019318835162004cef565b5151036201938b576201932b906201e1d2565b905091909115620065c757600091835b620193495750505050600090565b80518310156201719057826201936185948362004d46565b51620193726200680d855162004cef565b5110620051c457620193849062004cdf565b926201933b565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201952a57826201945d835162004cef565b515103620194d05762019470906201e1d2565b905091909115620065c757600091835b6201948e5750505050600090565b8051831015620171905782620194a685948362004d46565b51620194b76200680d855162004cef565b5111620051c457620194c99062004cdf565b9262019480565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036201969c576002620195a3835162004cef565b5151036201964257620195b6906201e1d2565b905015620065c757600091835b620195d15750505050600090565b8151831015620171905782620195e985948462004d46565b51620195fa6200680d845162004cef565b511115806201961b575b620051c457620196149062004cdf565b92620195c3565b5062019628818462004d46565b5162019639620169f0845162004cef565b51101562019604565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020016001918282515103620197e1578262019714835162004cef565b515103620197875762019727906201e1d2565b905091909115620065c757600091835b620197455750505050600090565b80518310156201719057826201975d85948362004d46565b516201976e6200680d855162004cef565b5114620051c457620197809062004cdf565b9262019737565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3234373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b90602001600191828251510362019966578262019859835162004cef565b5151106201990c576201986c906201e1d2565b905015620065c75782916000935b620198885750505050600090565b815184101562017190576000835b620198b0575b50620198a9839462004cdf565b936201987a565b939291620198bf825162004cef565b51518510156201990357620198d5848262004d46565b51620198e7866200743f855162004cef565b511462016c4d57620198fb83949562004cdf565b909262019896565b9192936201989c565b60405162461bcd60e51b815260206004820152603e60248201527f43452049445f3234383a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3234383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910190600193848351510362019c665784620199e2845162004cef565b51511062019c0c57620199f5906201e199565b9290921562016f9a5784931562019b09576000935b62019a16575050505090565b8251841015620051fe576001600160a01b038062019a35868662004d46565b5116600052611f40808452604060ff8160002054161562016fa457879160009384935b62019a7b575b505050501562016f9a5762019a74859462004cdf565b9362019a0a565b9092989591939662019a8e865162004cef565b51518a101562019afd578162019aa58a8362004d46565b5116600052838352600285600020015462019ac68b6200743f895162004cef565b511462019aea5762019adb8798999a62004cdf565b93919097999894929662019a58565b9650509396505050843880808062019a5e565b96938296995062019a5e565b6000935b62019b19575050505090565b8251841015620051fe576001600160a01b038062019b38868662004d46565b5116600052613ef8808452604060ff8160002054161562016fa457879160009384935b62019b7e575b505050501562016f9a5762019b77859462004cdf565b9362019b0d565b9092989591939662019b91865162004cef565b51518a101562019c00578162019ba88a8362004d46565b5116600052838352600285600020015462019bc98b6200743f895162004cef565b511462019bed5762019bde8798999a62004cdf565b93919097999894929662019b5b565b9650509396505050843880808062019b61565b96938296995062019b61565b60405162461bcd60e51b815260048101839052603e60248201527f43452049445f3234393a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3234393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6020809301600192838251510362019f53578362019cdf835162004cef565b51511062019ef95762019cf2906201e199565b9490941562016f9a5783921562019e045793926000905b62019d18575050505050600090565b8351811015620174c9576001600160a01b038062019d37838762004d46565b5116600052611f4080875260409160ff83600020541662019d6d575b5050509362019d6483949562004cdf565b90949362019d09565b6000929190865b62019d81575b5062019d53565b90929791939662019d93865162004cef565b515189101562019df9578162019daa898362004d46565b5116600052838352600285600020015462019dcb8a6200743f895162004cef565b511462019ded5762019ddf87989962004cdf565b939190979894929862019d74565b50505050505091505090565b969382985062019d7a565b93926000905b62019e19575050505050600090565b8351811015620174c9576001600160a01b038062019e38838762004d46565b5116600052613ef880875260409160ff83600020541662019e6e575b5050509362019e6583949562004cdf565b90949362019e0a565b6000929190865b62019e82575b5062019e54565b90929791939662019e94865162004cef565b515189101562019eee578162019eab898362004d46565b5116600052838352600285600020015462019ecc8a6200743f895162004cef565b511462019ded5762019ee087989962004cdf565b939190979894929862019e75565b969382985062019e7b565b60405162461bcd60e51b815260048101869052603e60248201527f43452049445f3235303a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3235303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a253578462019fcf845162004cef565b5151106201a1f95762019fe2906201e110565b9290921562016f9a578493156201a0f6576000935b6201a003575050505090565b8251841015620051fe576001600160a01b03806201a022868662004d46565b5116600052611f40808452604060ff8160002054161562016fa457879160009384935b6201a068575b505050501562016f9a576201a061859462004cdf565b9362019ff7565b909298959193966201a07b865162004cef565b51518a10156201a0ea57816201a0928a8362004d46565b511660005283835260028560002001546201a0b38b6200743f895162004cef565b51146201a0d7576201a0c88798999a62004cdf565b9391909799989492966201a045565b965050939650505084388080806201a04b565b9693829699506201a04b565b6000935b6201a106575050505090565b8251841015620051fe576001600160a01b03806201a125868662004d46565b5116600052613ef8808452604060ff8160002054161562016fa457879160009384935b6201a16b575b505050501562016f9a576201a164859462004cdf565b936201a0fa565b909298959193966201a17e865162004cef565b51518a10156201a1ed57816201a1958a8362004d46565b511660005283835260028560002001546201a1b68b6200743f895162004cef565b51146201a1da576201a1cb8798999a62004cdf565b9391909799989492966201a148565b965050939650505084388080806201a14e565b9693829699506201a14e565b60405162461bcd60e51b815260048101839052603e60248201527f43452049445f3235313a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b602080930160019283825151036201a53457836201a2cc835162004cef565b5151106201a4da576201a2df906201e110565b9490941562016f9a578392156201a3e55793926000905b6201a305575050505050600090565b8351811015620174c9576001600160a01b03806201a324838762004d46565b5116600052611f4080875260409160ff8360002054166201a35a575b505050936201a35183949562004cdf565b9094936201a2f6565b6000929190865b6201a36e575b506201a340565b9092979193966201a380865162004cef565b51518910156201a3da57816201a397898362004d46565b511660005283835260028560002001546201a3b88a6200743f895162004cef565b511462019ded576201a3cc87989962004cdf565b93919097989492986201a361565b96938298506201a367565b93926000905b6201a3fa575050505050600090565b8351811015620174c9576001600160a01b03806201a419838762004d46565b5116600052613ef880875260409160ff8360002054166201a44f575b505050936201a44683949562004cdf565b9094936201a3eb565b6000929190865b6201a463575b506201a435565b9092979193966201a475865162004cef565b51518910156201a4cf57816201a48c898362004d46565b511660005283835260028560002001546201a4ad8a6200743f895162004cef565b511462019ded576201a4c187989962004cdf565b93919097989492986201a456565b96938298506201a45c565b60405162461bcd60e51b815260048101869052603e60248201527f43452049445f3235323a205468652055494e543235365f324441525241595b30604482015260008051602062033a2c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3235323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a6fd57846201a5b0845162004cef565b5151036201a6a3576201a5c3906201e110565b1562016f9a578493156201a63a576000935b6201a5e1575050505090565b8051841015620051fe576001600160a01b036201a5ff858362004d46565b5116600052611f4582526040600020546201a61f6200680d855162004cef565b51101562016f9a576201a633859462004cdf565b936201a5d5565b6000935b6201a64a575050505090565b8051841015620051fe576001600160a01b036201a668858362004d46565b5116600052613efd82526040600020546201a6886200680d855162004cef565b51101562016f9a576201a69c859462004cdf565b936201a63e565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201a8c657846201a779845162004cef565b5151036201a86c576201a78c906201e110565b1562016f9a578493156201a803576000935b6201a7aa575050505090565b8051841015620051fe576001600160a01b036201a7c8858362004d46565b5116600052611f4582526040600020546201a7e86200680d855162004cef565b51111562016f9a576201a7fc859462004cdf565b936201a79e565b6000935b6201a813575050505090565b8051841015620051fe576001600160a01b036201a831858362004d46565b5116600052613efd82526040600020546201a8516200680d855162004cef565b51111562016f9a576201a865859462004cdf565b936201a807565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910160019384825151036201ab1c5760026201a942835162004cef565b5151036201aac2576201a955906201e110565b9290921562016f9a578493156201aa14576000935b6201a976575050505090565b8251841015620051fe576001600160a01b03806201a995868662004d46565b5116600052611f4580835260409081600020546201a9b86200680d875162004cef565b51119283156201a9de575b50505062016f9a576201a9d7859462004cdf565b936201a96a565b909192506201a9ee878762004d46565b51166000528252600020546201aa09620169f0845162004cef565b51103880806201a9c3565b6000935b6201aa24575050505090565b8251841015620051fe576001600160a01b03806201aa43868662004d46565b5116600052613efd80835260409081600020546201aa666200680d875162004cef565b51119283156201aa8c575b50505062016f9a576201aa85859462004cdf565b936201aa18565b909192506201aa9c878762004d46565b51166000528252600020546201aab7620169f0845162004cef565b51103880806201aa71565b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3235353a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052602e60248201527f43452049445f3235353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201ace357846201ab98845162004cef565b5151036201ac89576201abab906201e110565b1562016f9a578493156201ac21576000935b6201abc9575050505090565b8051841015620051fe576001600160a01b036201abe7858362004d46565b5116600052611f4582526040600020546201ac076200680d855162004cef565b510362016f9a576201ac1a859462004cdf565b936201abbd565b6000935b6201ac31575050505090565b8051841015620051fe576001600160a01b036201ac4f858362004d46565b5116600052613efd82526040600020546201ac6f6200680d855162004cef565b510362016f9a576201ac82859462004cdf565b936201ac25565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201aec457846201ad5f845162004cef565b5151036201ae6a576201ad72906201e110565b1562016f9a578493156201adfd5760009182945b6201ad97575b505050505050600090565b81518510156201adf75785946001600160a01b036201adb7828562004d46565b51168452611f45825260408420546201add56200680d875162004cef565b51106201adee576201ade79062004cdf565b946201ad86565b50505050505090565b6201ad8c565b60009182945b6201ae1357505050505050600090565b81518510156201adf75785946001600160a01b036201ae33828562004d46565b51168452613efd825260408420546201ae516200680d875162004cef565b51106201adee576201ae639062004cdf565b946201ae03565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909160208091019060019384835151036201b09557846201af40845162004cef565b5151036201b03b576201af53906201e110565b1562016f9a578493156201afce5760009182945b6201af7757505050505050600090565b81518510156201adf75785946001600160a01b036201af97828562004d46565b51168452611f45825260408420546201afb56200680d875162004cef565b51116201adee576201afc79062004cdf565b946201af67565b60009182945b6201afe457505050505050600090565b81518510156201adf75785946001600160a01b036201b004828562004d46565b51168452613efd825260408420546201b0226200680d875162004cef565b51116201adee576201b0349062004cdf565b946201afd4565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3235383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3235383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9091602080910160019384825151036201b2f55760026201b111835162004cef565b5151036201b29b576201b124906201e110565b9190911562016f9a578493156201b1e8576000935b6201b148575050505050600090565b8151841015620174c95784936001600160a01b03806201b169838662004d46565b5116600052611f4580865260409081600020546201b18c6200680d875162004cef565b51111592836201b1b1575b505050620174c1576201b1aa9062004cdf565b936201b139565b909192506201b1c1848762004d46565b51166000528552600020546201b1dc620169f0845162004cef565b5110153880806201b197565b6000935b6201b1fb575050505050600090565b8151841015620174c95784936001600160a01b03806201b21c838662004d46565b5116600052613efd80865260409081600020546201b23f6200680d875162004cef565b51111592836201b264575b505050620174c1576201b25d9062004cdf565b936201b1ec565b909192506201b274848762004d46565b51166000528552600020546201b28f620169f0845162004cef565b5110153880806201b24a565b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3235393a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052602e60248201527f43452049445f3235393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201b4cc57836201b36e845162004cef565b5151036201b47257156201b3f7576201b387906201e110565b15620065c757829160009182945b6201b3a257505050905090565b805185101562016c55576201b3cc6001600160a01b036201b3c4878462004d46565b51166201b583565b6201b3dc6200680d845162004cef565b51101562016c4d576201b3f0849562004cdf565b946201b395565b6201b402906201e110565b15620065c757829160009182945b6201b41d57505050905090565b805185101562016c55576201b4476001600160a01b036201b43f878462004d46565b51166201b526565b6201b4576200680d845162004cef565b51101562016c4d576201b46b849562004cdf565b946201b410565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60009081905b6103e882106201b53b57505090565b9091620081fe6201b57c916201b5758560031b60018060a01b038616600052611fbb8101602052611fb96040600020549101549062004f77565b9062006200565b906201b52c565b60009081905b6103e882106201b59857505090565b9091620081fe6201b5d0916201b575600386811b9060018060a01b038716600052810160205260016040600020549101549062004f77565b906201b589565b600091906201b632576000905b6103e882106201b5f357505090565b9091620081fe6201b62b916201b575600386811b9060018060a01b038716600052810160205260016040600020549101549062004f77565b906201b5e4565b81905b6103e882106201b64457505090565b9091620081fe6201b67e916201b5758560031b60018060a01b038616600052611fbb8101602052611fb96040600020549101549062004f77565b906201b635565b916020019060019283835151036201b7f257836201b6a4845162004cef565b5151036201b79857156201b725576201b6bd906201e110565b15620065c757829160009182945b6201b6d857505050905090565b805185101562016c55576201b6fa6001600160a01b036201b3c4878462004d46565b6201b70a6200680d845162004cef565b51111562016c4d576201b71e849562004cdf565b946201b6cb565b6201b730906201e110565b15620065c757829160009182945b6201b74b57505050905090565b805185101562016c55576201b76d6001600160a01b036201b43f878462004d46565b6201b77d6200680d845162004cef565b51111562016c4d576201b791849562004cdf565b946201b73e565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201ba2a5760026201b86c845162004cef565b5151036201b9d057156201b925576201b885906201e110565b91909115620065c757829160009182945b6201b8a357505050905090565b815185101562016c55576001600160a01b036201b8c6816201b3c4888662004d46565b6201b8d66200680d845162004cef565b51119081156201b8fa575b5062016c4d576201b8f3849562004cdf565b946201b896565b6201b90c91506201b3c4878562004d46565b6201b91c620169f0835162004cef565b5110386201b8e1565b6201b930906201e110565b91909115620065c757829160009182945b6201b94e57505050905090565b815185101562016c55576001600160a01b036201b971816201b43f888662004d46565b6201b9816200680d845162004cef565b51119081156201b9a5575b5062016c4d576201b99e849562004cdf565b946201b941565b6201b9b791506201b43f878562004d46565b6201b9c7620169f0835162004cef565b5110386201b98c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bbef57836201baa3845162004cef565b5151036201bb9557156201bb23576201babc906201e110565b15620065c757829160009182945b6201bad757505050905090565b805185101562016c55576201baf96001600160a01b036201b3c4878462004d46565b6201bb096200680d845162004cef565b510362016c4d576201bb1c849562004cdf565b946201baca565b6201bb2e906201e110565b15620065c757829160009182945b6201bb4957505050905090565b805185101562016c55576201bb6b6001600160a01b036201b43f878462004d46565b6201bb7b6200680d845162004cef565b510362016c4d576201bb8e849562004cdf565b946201bb3c565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bdb857836201bc68845162004cef565b5151036201bd5e57156201bcea576201bc81906201e110565b91909115620065c757600091835b6201bc9d5750505050600090565b8051831015620171905783926201bcc16001600160a01b036201b3c4838562004d46565b6201bcd16200680d855162004cef565b5110620051c4576201bce39062004cdf565b926201bc8f565b6201bcf5906201e110565b91909115620065c757600091835b6201bd115750505050600090565b8051831015620171905783926201bd356001600160a01b036201b43f838562004d46565b6201bd456200680d855162004cef565b5110620051c4576201bd579062004cdf565b926201bd03565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201bf8157836201be31845162004cef565b5151036201bf2757156201beb3576201be4a906201e110565b91909115620065c757600091835b6201be665750505050600090565b8051831015620171905783926201be8a6001600160a01b036201b3c4838562004d46565b6201be9a6200680d855162004cef565b5111620051c4576201beac9062004cdf565b926201be58565b6201bebe906201e110565b91909115620065c757600091835b6201beda5750505050600090565b8051831015620171905783926201befe6001600160a01b036201b43f838562004d46565b6201bf0e6200680d855162004cef565b5111620051c4576201bf209062004cdf565b926201becc565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c1b35760026201bffb845162004cef565b5151036201c15957156201c0b1576201c014906201e110565b15620065c757600091835b6201c02d5750505050600090565b8151831015620171905783926001600160a01b036201c052816201b3c4848762004d46565b6201c0626200680d855162004cef565b51111590816201c085575b50620051c4576201c07e9062004cdf565b926201c01f565b6201c09791506201b3c4838662004d46565b6201c0a7620169f0845162004cef565b511015386201c06d565b6201c0bc906201e110565b15620065c757600091835b6201c0d55750505050600090565b8151831015620171905783926001600160a01b036201c0fa816201b43f848762004d46565b6201c10a6200680d855162004cef565b51111590816201c12d575b50620051c4576201c1269062004cdf565b926201c0c7565b6201c13f91506201b43f838662004d46565b6201c14f620169f0845162004cef565b511015386201c115565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c38a57836201c22c845162004cef565b5151036201c33057156201c2b5576201c245906201e110565b15620065c757829160009182945b6201c26057505050905090565b805185101562016c55576201c28a6001600160a01b036201c282878462004d46565b51166201c43a565b6201c29a6200680d845162004cef565b51101562016c4d576201c2ae849562004cdf565b946201c253565b6201c2c0906201e110565b15620065c757829160009182945b6201c2db57505050905090565b805185101562016c55576201c3056001600160a01b036201c2fd878462004d46565b51166201c3e4565b6201c3156200680d845162004cef565b51101562016c4d576201c329849562004cdf565b946201c2ce565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236373a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60009081905b6103e882106201c3f957505090565b9091620081fe6201c433916201b5758560031b60018060a01b038616600052611fbb8101602052611fba6040600020549101549062004f77565b906201c3ea565b60009081905b6103e882106201c44f57505090565b9091620081fe6201c487916201b575600386811b9060018060a01b038716600052810160205260026040600020549101549062004f77565b906201c440565b600091906201c4e9576000905b6103e882106201c4aa57505090565b9091620081fe6201c4e2916201b575600386811b9060018060a01b038716600052810160205260026040600020549101549062004f77565b906201c49b565b81905b6103e882106201c4fb57505090565b9091620081fe6201c535916201b5758560031b60018060a01b038616600052611fbb8101602052611fba6040600020549101549062004f77565b906201c4ec565b916020019060019283835151036201c6a957836201c55b845162004cef565b5151036201c64f57156201c5dc576201c574906201e110565b15620065c757829160009182945b6201c58f57505050905090565b805185101562016c55576201c5b16001600160a01b036201c282878462004d46565b6201c5c16200680d845162004cef565b51111562016c4d576201c5d5849562004cdf565b946201c582565b6201c5e7906201e110565b15620065c757829160009182945b6201c60257505050905090565b805185101562016c55576201c6246001600160a01b036201c2fd878462004d46565b6201c6346200680d845162004cef565b51111562016c4d576201c648849562004cdf565b946201c5f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201c8e15760026201c723845162004cef565b5151036201c88757156201c7dc576201c73c906201e110565b91909115620065c757829160009182945b6201c75a57505050905090565b815185101562016c55576001600160a01b036201c77d816201c282888662004d46565b6201c78d6200680d845162004cef565b51119081156201c7b1575b5062016c4d576201c7aa849562004cdf565b946201c74d565b6201c7c391506201c282878562004d46565b6201c7d3620169f0835162004cef565b5110386201c798565b6201c7e7906201e110565b91909115620065c757829160009182945b6201c80557505050905090565b815185101562016c55576001600160a01b036201c828816201c2fd888662004d46565b6201c8386200680d845162004cef565b51119081156201c85c575b5062016c4d576201c855849562004cdf565b946201c7f8565b6201c86e91506201c2fd878562004d46565b6201c87e620169f0835162004cef565b5110386201c843565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3236393a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3236393a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020019060019283835151036201caaa57836201c95a845162004cef565b5151036201ca5057156201c9dc576201c973906201e110565b91909115620065c757600091835b6201c98f5750505050600090565b8051831015620171905783926201c9b36001600160a01b036201c282838562004d46565b6201c9c36200680d855162004cef565b5110620051c4576201c9d59062004cdf565b926201c981565b6201c9e7906201e110565b91909115620065c757600091835b6201ca035750505050600090565b8051831015620171905783926201ca276001600160a01b036201c2fd838562004d46565b6201ca376200680d855162004cef565b5110620051c4576201ca499062004cdf565b926201c9f5565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237303a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237303a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200190600192836201cb19845162004cef565b5151036201cc735783835151036201cc1957156201cba5576201cb3c906201e110565b91909115620065c757600091835b6201cb585750505050600090565b8051831015620171905783926201cb7c6001600160a01b036201c282838562004d46565b6201cb8c6200680d855162004cef565b5111620051c4576201cb9e9062004cdf565b926201cb4a565b6201cbb0906201e110565b91909115620065c757600091835b6201cbcc5750505050600090565b8051831015620171905783926201cbf06001600160a01b036201c2fd838562004d46565b6201cc006200680d855162004cef565b5111620051c4576201cc129062004cdf565b926201cbbe565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b916020019060026201cce0835162004cef565b5151036201cea55760019283835151036201ce4b57156201cda3576201cd06906201e110565b15620065c757600091835b6201cd1f5750505050600090565b8151831015620171905783926001600160a01b036201cd44816201c282848762004d46565b6201cd546200680d855162004cef565b51111590816201cd77575b50620051c4576201cd709062004cdf565b926201cd11565b6201cd8991506201c282838662004d46565b6201cd99620169f0845162004cef565b511015386201cd5f565b6201cdae906201e110565b15620065c757600091835b6201cdc75750505050600090565b8151831015620171905783926001600160a01b036201cdec816201c2fd848762004d46565b6201cdfc6200680d855162004cef565b51111590816201ce1f575b50620051c4576201ce189062004cdf565b926201cdb9565b6201ce3191506201c2fd838662004d46565b6201ce41620169f0845162004cef565b511015386201ce07565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3237323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3237323a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b919060208092019060019384835151036201d0c65760026201cf22845162004cef565b5151036201d06c57156201cfcd576201cf3b906201e110565b9290921562016d8657600092845b6201cf55575050505090565b8051841015620051fe576201cf6f6200680d845162004cef565b516103e881101562004cfd576001600160a01b036201cf8f868462004d46565b5116600052600390811b0182526040600020546201cfb2620169f0855162004cef565b51101562016f9a576201cfc6859462004cdf565b936201cf49565b6201cfd8906201e110565b9290921562016d8657600092845b6201cff2575050505090565b8051841015620051fe576201d00c6200680d845162004cef565b516103e881101562004cfd57611fbb906001600160a01b036201d030878562004d46565b511660005260031b0182526040600020546201d051620169f0855162004cef565b51101562016f9a576201d065859462004cdf565b936201cfe6565b60405162461bcd60e51b815260048101859052603160248201527f43452049445f3237333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208092019060019384835151036201d2e75760026201d143845162004cef565b5151036201d28d57156201d1ee576201d15c906201e110565b9290921562016d8657600092845b6201d176575050505090565b8051841015620051fe576201d1906200680d845162004cef565b516103e881101562004cfd576001600160a01b036201d1b0868462004d46565b5116600052600390811b0182526040600020546201d1d3620169f0855162004cef565b51111562016f9a576201d1e7859462004cdf565b936201d16a565b6201d1f9906201e110565b9290921562016d8657600092845b6201d213575050505090565b8051841015620051fe576201d22d6200680d845162004cef565b516103e881101562004cfd57611fbb906001600160a01b036201d251878562004d46565b511660005260031b0182526040600020546201d272620169f0855162004cef565b51111562016f9a576201d286859462004cdf565b936201d207565b60405162461bcd60e51b815260048101859052603160248201527f43452049445f3237343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916020809101600392836201d357835162004cef565b5151036201d5e55760019485835151036201d58b57156201d482576201d37d906201e110565b9390931562016f9a57600093855b6201d39857505050505090565b80518510156201d47c576201d3b26200680d845162004cef565b516103e8908181101562004cfd576001600160a01b03908490826201d3d88a8762004d46565b5116600052811b01865260409081600020546201d3fa620169f0885162004cef565b51119283156201d420575b5050506201ad8c576201d419869562004cdf565b946201d38b565b909192506201d4346200680d875162004cef565b519081101562004cfd5784916201d44c898662004d46565b5116600052811b018552600020546201d4716201d46a855162004cef565b5162004d24565b51103880806201d405565b620174c1565b6201d490909392936201e110565b9390931562016f9a57600093855b6201d4ab57505050505090565b80518510156201d47c576201d4c56200680d845162004cef565b516103e88082101562004cfd576001600160a01b0391826201d4e8898662004d46565b5116600052611fbb8091881b01855260409182600020546201d50f620169f0895162004cef565b51119384156201d536575b505050506201ad8c576201d52f869562004cdf565b946201d49e565b90919293506201d54b6200680d885162004cef565b519182101562004cfd576201d561898662004d46565b5116600052861b018352600020546201d57f6201d46a855162004cef565b5110388080806201d51a565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237353a205468652055494e543235365f324441525241595b306044820152705d206c656e677468206973206e6f74203360781b6064820152608490fd5b919060208092019060026201d65a835162004cef565b5151036201d8135760019384835151036201d7b957156201d716576201d680906201e110565b9290921562016d8657600092845b6201d69d575050505050600090565b8051841015620174c9576201d6b76200680d845162004cef565b51936103e885101562004cfd5785946001600160a01b036201d6da838562004d46565b5116600052600390811b0183526040600020546201d6fd620169f0865162004cef565b5110620174c1576201d70f9062004cdf565b936201d68e565b6201d721906201e110565b9290921562016d8657600092845b6201d73e575050505050600090565b8051841015620174c9576201d7586200680d845162004cef565b51936103e885101562004cfd578594611fbb906001600160a01b036201d77f848662004d46565b511660005260031b0183526040600020546201d7a0620169f0865162004cef565b5110620174c1576201d7b29062004cdf565b936201d72f565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b919060208092019060026201d883835162004cef565b5151036201da3c5760019384835151036201d9e257156201d93f576201d8a9906201e110565b9290921562016d8657600092845b6201d8c6575050505050600090565b8051841015620174c9576201d8e06200680d845162004cef565b51936103e885101562004cfd5785946001600160a01b036201d903838562004d46565b5116600052600390811b0183526040600020546201d926620169f0865162004cef565b5111620174c1576201d9389062004cdf565b936201d8b7565b6201d94a906201e110565b9290921562016d8657600092845b6201d967575050505050600090565b8051841015620174c9576201d9816200680d845162004cef565b51936103e885101562004cfd578594611fbb906001600160a01b036201d9a8848662004d46565b511660005260031b0183526040600020546201d9c9620169f0865162004cef565b5111620174c1576201d9db9062004cdf565b936201d958565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b916020809101600392836201daac835162004cef565b5151036201dd3e5760019485835151036201dce457156201dbd2576201dad2906201e110565b9390931562016f9a57600093855b6201daf057505050505050600090565b80518510156201adf7576201db0a6200680d845162004cef565b51946103e8958681101562004cfd5787966001600160a01b03918590836201db33868862004d46565b5116600052811b018752604080600020546201db54620169f0895162004cef565b51111592836201db79575b5050506201adee576201db729062004cdf565b946201dae0565b91985091506201db8e6200680d875162004cef565b519788101562004cfd57889785916201dba8858762004d46565b5116600052811b018652600020546201dbc66201d46a865162004cef565b5110153880806201db5f565b6201dbe0909392936201e110565b9390931562016f9a57600093855b6201dbfe57505050505050600090565b80518510156201adf7576201dc186200680d845162004cef565b51946103e88087101562004cfd5787966001600160a01b0390816201dc3e858762004d46565b5116600052611fbb8091891b01865260409081600020546201dc65620169f08a5162004cef565b51111593846201dc8b575b505050506201adee576201dc849062004cdf565b946201dbee565b9193509198506201dca16200680d885162004cef565b519081101562004cfd5789986201dcb9858762004d46565b5116600052871b018452600020546201dcd76201d46a865162004cef565b511015388080806201dc70565b60405162461bcd60e51b815260048101859052602e60248201527f43452049445f3237383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101849052603160248201527f43452049445f3237383a205468652055494e543235365f324441525241595b306044820152705d206c656e677468206973206e6f74203360781b6064820152608490fd5b6201dda8816201df2d565b156201df24576040810190606082510151511515806201dee9575b156201ddd55750516060015151600191565b604082510151511515806201ded0575b156201ddf75750516040015151600191565b60808251015151151590816201deb6575b50156201de1a57516080015151600191565b805160c081015151156201de6157506201de3960c08251015162004cef565b51516201de4a57505b600090600090565b60c06201de5a9151015162004cef565b5151600191565b602081015151156201de795750516020015151600191565b60a0015180516201de8d575b50506201de42565b6201de989062004cef565b51516201dea657806201de85565b60a06201de5a9151015162004cef565b602091500151602681101562002a2357601014386201de08565b506020810151602681101562002a23576013146201dde5565b50602081018051602681101562002a2357600c149081156201df0d575b506201ddc3565b905051602681101562002a2357600f14386201df06565b50600090600090565b6020018051906026908183101562002a235760018093146201e10b5780518281101562002a23576002146201e10b5780518281101562002a23576003146201e10b578051908282101562002a2357600480921462016d51578051838110156201e0f65760051462016d51578051838110156201e0f65760061462016d51578051838110156201e0f65760071462016d51578051838110156201e0f65760081462016d51578051838110156201e0f65760091462016d51578051838110156201e0f657600a1462016d51578051838110156201e0f657600b1462016d51578051838110156201e0f657600c1462016d51578051838110156201e0f657600d1462016d51578051838110156201e0f657600e1462016d51578051838110156201e0f657600f1462016d51578051838110156201e0f65760101462016d51578051838110156201e0f65760111462016d51578051838110156201e0f65760121462016d51578051838110156201e0f65760131462016d51578051838110156201e0f65760141462016d51578051838110156201e0f65760151462016d515751918210156201e0e15750601e14620032d25750600090565b602190634e487b7160e01b6000525260246000fd5b602183634e487b7160e01b6000525260246000fd5b505090565b6201e11b816201df2d565b156201e18a576020810151602681101562002a23576004146201e177576040015160c0015180516201e16557506040516201e1568162002b3f565b60008152600036813790600090565b6201e1709062004cef565b5190600190565b60c060406201e170920151015162004d13565b506040516201e1568162002b3f565b6020810151602681101562002a23576004146201e1bf57506040516201e1568162002b3f565b60c060406201e170920151015162004cef565b6201e1dd816201e322565b156201e3125760208101908151916026908184101562002a235760018094146201e2f75780518281101562002a23576003146201e2f7578051908282101562002a235760048092146201e2db578051838110156201e0f6576005146201e2db578051838110156201e0f6576006146201e2db578051838110156201e0f6576014146201e2db578051838110156201e0f6576015146201e2db5751918210156201e0e15750601e146201e2bd575050604051906201e29a8262002b3f565b60008252604051916201e2ad8362002b3f565b6000835260003681379190600090565b604001916201e2d660a06200779b818651015162004cef565b519190565b505050604001916201e2d660a06200779b818651015162004cef565b5050604001916201e2d660a06200779b818651015162004cef565b50604051906201e29a8262002b3f565b6020018051906026908183101562002a235760018093146201e10b5780518281101562002a2357600214620065c75780518281101562002a23576003146201e10b578051908282101562002a2357600480921462016d51578051838110156201e0f65760141462016d51578051838110156201e0f65760151462016d51578051838110156201e0f657601e1462016d51578051838110156201e0f65760051462016d515751918210156201e0e15750600614620032d25750600090565b916101f581146201e489576101f681146201e47d576101f781146201e471576101f881146201e465576101f981146201e459576101fa81146201e44d576101fb81146201e441576101fc146201e436575050600090565b620032d2916201eeda565b50620032d2916201ed35565b50620032d2916201ebd0565b50620032d2916201ea6b565b50620032d2916201e906565b50620032d2916201e761565b50620032d2916201e5fc565b50620032d291906020019060019182815151036201e5a257826201e4ae825162004cef565b5151036201e548576020820151602681101562002a2357600203620065c757600091835b6201e4e05750505050600090565b604081019260a0936201e4f7858251015162004d24565b51518210156201e54057816200743f87966201e5169351015162004d24565b516201e5276200680d855162004cef565b5110620051c4576201e5399062004cdf565b926201e4d2565b505062016d86565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201e70757826201e61b825162004cef565b5151036201e6ad576020820151602681101562002a2357600203620065c757600091835b6201e64d5750505050600090565b604081019260a0936201e664858251015162004d24565b51518210156201e54057816200743f87966201e6839351015162004d24565b516201e6946200680d855162004cef565b5111620051c4576201e6a69062004cdf565b926201e63f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201e8ac5760026201e781825162004cef565b5151036201e852576020820151602681101562002a2357600203620065c757600091835b6201e7b35750505050600090565b604081019260a0936201e7ca858251015162004d24565b51518210156201e5405781856201e7eb826200743f8a998651015162004d24565b516201e7fc6200680d885162004cef565b51111592836201e821575b505050620051c4576201e81a9062004cdf565b926201e7a5565b5101516201e83592506200743f9062004d24565b516201e846620169f0855162004cef565b5110158138806201e807565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ea1157826201e925825162004cef565b5151036201e9b7576020820151602681101562002a2357600203620065c757600091835b6201e9575750505050600090565b604081019260a0936201e96e858251015162004d24565b51518210156201e54057816200743f87966201e98d9351015162004d24565b516201e99e6200680d855162004cef565b5114620051c4576201e9b09062004cdf565b926201e949565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201eb7657826201ea8a825162004cef565b5151036201eb1c576020820151602681101562002a2357600203620065c757600091835b6201eabc5750505050600090565b604081019260a0936201ead3858251015162004d35565b51518210156201e54057816200743f87966201eaf29351015162004d13565b516201eb036200680d855162004cef565b5110620051c4576201eb159062004cdf565b926201eaae565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ecdb57826201ebef825162004cef565b5151036201ec81576020820151602681101562002a2357600203620065c757600091835b6201ec215750505050600090565b604081019260a0936201ec38858251015162004d35565b51518210156201e54057816200743f87966201ec579351015162004d13565b516201ec686200680d855162004cef565b5111620051c4576201ec7a9062004cdf565b926201ec13565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201ee805760026201ed55825162004cef565b5151036201ee26576020820151602681101562002a2357600203620065c757600091835b6201ed875750505050600090565b604081019260a0936201ed9e858251015162004d35565b51518210156201e5405781856201edbf826200743f8a998651015162004d13565b516201edd06200680d885162004cef565b51111592836201edf5575b505050620051c4576201edee9062004cdf565b926201ed79565b5101516201ee0992506200743f9062004d13565b516201ee1a620169f0855162004cef565b5110158138806201eddb565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036201efe557826201eef9825162004cef565b5151036201ef8b576020820151602681101562002a2357600203620065c757600091835b6201ef2b5750505050600090565b604081019260a0936201ef42858251015162004d35565b51518210156201e54057816200743f87966201ef619351015162004d13565b516201ef726200680d855162004cef565b5114620051c4576201ef849062004cdf565b926201ef1d565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3530383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3530383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91603381036201f129575060209150016001815151036201f0d95760016201f068825162004cef565b5151036201f086576200680d6201f080915162004cef565b51421190565b60405162461bcd60e51b815260206004820152602560248201527f43452049445f35313a2055494e543235365f324441525241595b305d20697320604482015264656d70747960d81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35313a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603481036201f212575060209150016001815151036201f1c25760016201f151825162004cef565b5151036201f16f576200680d6201f169915162004cef565b51421090565b60405162461bcd60e51b815260206004820152602560248201527f43452049445f35323a2055494e543235365f324441525241595b305d20697320604482015264656d70747960d81b6064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35323a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603581036201f324575060209150016001815151036201f2d45760026201f23a825162004cef565b5151036201f27a576201f2526200680d825162004cef565b5142101590816201f261575090565b6201f2739150620169f0905162004cef565b5142111590565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35333a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602260248201527f43452049445f35333a2055494e543235365f3244415252415920697320656d70604482015261747960f01b6064820152608490fd5b603681036201f428575060209150016001815151036201f3ce5760016201f34c825162004cef565b5151036201f37457620167cc6200680d6201f367426200621c565b5050505050925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35343a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603781036201f51f575060209150016001815151036201f4c55760016201f450825162004cef565b5151036201f46b57620168cd6200680d6201f367426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35353a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603881036201f623575060209150016001815151036201f5c95760026201f547825162004cef565b5151036201f56f576201f55a426200621c565b5050505050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603981036201f728575060209150016001815151036201f6ce5760016201f64b825162004cef565b5151036201f67457620167cc6200680d6201f666426200621c565b505050509390505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35373a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603a81036201f81f575060209150016001815151036201f7c55760016201f750825162004cef565b5151036201f76b57620168cd6200680d6201f666426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f35383a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603b81036201f924575060209150016001815151036201f8ca5760026201f847825162004cef565b5151036201f870576201f85a426200621c565b505050509050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f35393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f35393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603c81036201fa29575060209150016001815151036201f9cf5760016201f94c825162004cef565b5151036201f97557620167cc6200680d6201f967426200621c565b505050949150505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36303a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603d81036201fb20575060209150016001815151036201fac65760016201fa51825162004cef565b5151036201fa6c57620168cd6200680d6201f967426200621c565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36313a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36313a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603e81036201fc25575060209150016001815151036201fbcb5760026201fb48825162004cef565b5151036201fb71576201fb5b426200621c565b505050915050620169cd6200680d835162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f36323a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36323a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b603f81036201fd2a575060209150016001815151036201fcd05760016201fc4d825162004cef565b5151036201fc7657620167cc6200680d6201fc68426200621c565b505095925050505162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36333a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36333a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6040928184036201fe20575050602001906001825151036201fdc85760016201fd54835162004cef565b5151036201fd705750620168cd6200680d6201fc68426200621c565b5162461bcd60e51b815260206004820152603060248201527f43452049445f36343a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f36343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b604182036201ff22575050602001906001825151036201feca5760026201fe48835162004cef565b5151036201fe7257506201fe5c426200621c565b505092505050620169cd6200680d835162004cef565b5162461bcd60e51b815260206004820152603160248201527f43452049445f36353a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f36353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b9092604284036201ff3a5750620032d29250620215a8565b604384036201ff505750620032d29250620217b2565b60448481036201ff68575050620032d29250620219b4565b604585036201ff7f575050620032d2925062021c31565b604685036201ff96575050620032d2925062021e33565b604785036201ffad575050620032d2925062022035565b604885036201ffc4575050620032d2925062022318565b604985036201ffdb575050620032d2925062022625565b604a85036201fff2575050620032d2925062022903565b604b850362020009575050620032d2925062022ccb565b604c850362020020575050620032d2925062022e76565b604d850362020037575050620032d2925062022f7a565b604e85036202004e575050620032d29250620230d2565b604f850362020065575050620032d2925062023253565b605085036202007c575050620032d2925062023357565b91909293605181146000146202017857505090916020019160018351510362020120576001620200ad845162004cef565b515103620200c8575050620167cc6200680d47925162004cef565b907f43452049445f38313a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38313a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605281036202026d57505090916020019160018351510362020215576001620201a2845162004cef565b515103620201bd575050620168cd6200680d47925162004cef565b907f43452049445f38323a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38323a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b60538103620203835750509091602001916001835151036202032b57600262020297845162004cef565b515103620202d357505047620202b26200680d835162004cef565b5111159081620202c0575090565b9050620169f7620169f047925162004cef565b907f43452049445f38333a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b907f43452049445f38333a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605481036202047857505090916020019160018351510362020420576001620203ad845162004cef565b515103620203c857505062016afb6200680d47925162004cef565b907f43452049445f38343a2055494e543235365f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b907f43452049445f38343a2055494e543235365f32444152524159206d7573742068608492519162461bcd60e51b835260206004840152602d60248401528201526000805160206203378c8339815191526064820152fd5b605581036202063357506020840192600284515103620205db5760019283620204a2865162004d13565b51510362020584575090829160009586945b620204cf575b50505050506200680d620167cc915162004d13565b9091929395620204e28383015162004cef565b51518710156202057d5762020539908415620205445762009513906202051d6103e8620205158b6200743f8c5162004cef565b5110620234af565b6201b575620205328a6200743f8b5162004cef565b516200610a565b9392919083620204b4565b6200951390620205616103e8620205158b6200743f8c5162004cef565b6201b575620205768a6200743f8b5162004cef565b5162006139565b95620204ba565b7f43452049445f38353a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38353a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b60568103620207b6575060208401926002845151036202075e57600192836202065d865162004d13565b51510362020707575090829160009586945b6202068a575b50505050506200680d620168cd915162004d13565b90919293956202069d8383015162004cef565b51518710156202070057620206d8908415620206e35762009513906202051d6103e8620206d08b6200743f8c5162004cef565b511062023521565b93929190836202066f565b6200951390620205616103e8620206d08b6200743f8c5162004cef565b9562020675565b7f43452049445f38363a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38363a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b91949091605781036202097c5750602084019460028651510362020923576002620207e2875162004d13565b515103620208cb5750600092835b620207fe8287015162004cef565b51518510156202089157906202085685620207fe93898760001462020860576103e862020839620092e0946200743f62020841945162004cef565b511062023593565b6201b57562020532896200743f8d5162004cef565b94909150620207f0565b6103e862020839620092e0946200743f6202087c945162004cef565b6201b57562020576896200743f8d5162004cef565b93505093925050620208a86200680d835162004d13565b518110159182620208b857505090565b620169f7919250620169f0905162004d13565b6084907f43452049445f38373a20414444524553535f324441525241595b305d206d757385519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f38373a20414444524553535f32444152524159206d757374206885519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b909491906058810362020b335750602084019260028451510362020adb5760019283620209aa865162004d13565b51510362020a84575090829160009586945b620209d65750505050506200680d620167cc915162004d13565b9091929395620209e98383015162004cef565b51518710156202057d5762020a4090841562020a4b57620095139062020a246103e862020a1c8b6200743f8c5162004cef565b511062023605565b6201b57562020a398a6200743f8b5162004cef565b5162005e1c565b9392919083620209bc565b620095139062020a686103e862020a1c8b6200743f8c5162004cef565b6201b57562020a7d8a6200743f8b5162004cef565b5162005e52565b7f43452049445f38383a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38383a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b6059810362020cae5750602084019260028451510362020c56576001928362020b5d865162004d13565b51510362020bff575090829160009586945b62020b895750505050506200680d620168cd915162004d13565b909192939562020b9c8383015162004cef565b5151871015620207005762020bd790841562020be257620095139062020a246103e862020bcf8b6200743f8c5162004cef565b511062023677565b939291908362020b6f565b620095139062020a686103e862020bcf8b6200743f8c5162004cef565b7f43452049445f38393a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f38393a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b91949091605a810362020e3a5750602084019460028651510362020de157600262020cda875162004d13565b51510362020d895750600092835b62020cf68287015162004cef565b515185101562020891579062020d4e8562020cf693898760001462020d58576103e862020d31620092e0946200743f62020d39945162004cef565b5110620236e9565b6201b57562020a39896200743f8d5162004cef565b9490915062020ce8565b6103e862020d31620092e0946200743f62020d74945162004cef565b6201b57562020a7d896200743f8d5162004cef565b6084907f43452049445f39303a20414444524553535f324441525241595b305d206d757385519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f39303a20414444524553535f32444152524159206d757374206885519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b90949190605b8103620210135750602084019260028451510362020fbb576001928362020e68865162004d13565b51510362020f64575090829160009586945b62020e945750505050506200680d620167cc915162004d13565b909192939562020ea78383015162004cef565b51518710156202057d57831562020f17576103e862020ed98162020ed18a6200743f8b5162004cef565b51106202375b565b62020eea886200743f895162004cef565b519081101562004cfd5762020f0c916006620095139260031b01549062006200565b939291908362020e7a565b6103e862020f308162020ed18a6200743f8b5162004cef565b62020f41886200743f895162004cef565b519081101562004cfd5762020f0c91611fbe620095139260031b01549062006200565b7f43452049445f39313a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39313a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b605c8103620211e8575060208401926002845151036202119057600192836202103d865162004d13565b51510362021139575090829160009586945b620210695750505050506200680d620168cd915162004d13565b90919293956202107c8383015162004cef565b515187101562020700578315620210ec576103e8620210ae81620210a68a6200743f8b5162004cef565b5110620237cd565b620210bf886200743f895162004cef565b519081101562004cfd57620210e1916006620095139260031b01549062006200565b93929190836202104f565b6103e86202110581620210a68a6200743f8b5162004cef565b62021116886200743f895162004cef565b519081101562004cfd57620210e191611fbe620095139260031b01549062006200565b7f43452049445f39323a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39323a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b605d81969293949614600014620213c8575060208401926002845151036202136f57600262021218855162004d13565b515103620213175750600080955b620212348187015162004cef565b515187101562021300578315620212ae576103e89162021267836202125f8a6200743f8a5162004cef565b51106202383f565b62021278886200743f885162004cef565b519283101562004cfd576202129e620212a5916006620212349560031b01549062006200565b9762004cdf565b96915062021226565b6103e891620212c8836202125f8a6200743f8a5162004cef565b620212d9886200743f885162004cef565b519283101562004cfd576202129e620212a591611fbe620212349560031b01549062006200565b50929350935050620208a86200680d835162004d13565b6084907f43452049445f39333a20414444524553535f324441525241595b305d206d757387519162461bcd60e51b835260206004840152603160248401528201526000805160206203392c8339815191526064820152fd5b6084907f43452049445f39333a20414444524553535f32444152524159206d757374206887519162461bcd60e51b835260206004840152602d60248401528201526c185d99480c88195b195b595b9d609a1b6064820152fd5b9094929190605e0362016d86576020840192600284515103620215505760019283620213f5865162004d13565b515103620214f9575090829160009586945b62021422575b50505050506200680d62016afb915162004d13565b9091929395620214358383015162004cef565b5151871015620214f2578315620214a5576103e862021467816202145f8a6200743f8b5162004cef565b5110620238b1565b62021478886200743f895162004cef565b519081101562004cfd576202149a916006620095139260031b01549062006200565b939291908362021407565b6103e8620214be816202145f8a6200743f8b5162004cef565b620214cf886200743f895162004cef565b519081101562004cfd576202149a91611fbe620095139260031b01549062006200565b956202140d565b7f43452049445f39343a20414444524553535f324441525241595b305d206d7573608492519162461bcd60e51b8352602060048401526030602484015282015260008051602062033a6c8339815191526064820152fd5b5162461bcd60e51b815260206004820152602d60248201527f43452049445f39343a20414444524553535f32444152524159206d7573742068818401526c185d99480c88195b195b595b9d609a1b6064820152608490fd5b90604081019060018251510362021758576001620215c7835162004cef565b515103620216fe5760200191600183515103620216a4576001620215ec845162004cef565b5151036202164a571562021626576200680d6202161e620167cc926201b3c46200680d60018060a01b03925162004cef565b925162004cef565b6200680d6202161e620167cc926201b43f6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36363a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36363a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36363a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b9060408101906001825151036202195a576001620217d1835162004cef565b515103620219005760200191600183515103620218a6576001620217f6845162004cef565b5151036202184c571562021828576200680d6202161e620168cd926201b3c46200680d60018060a01b03925162004cef565b6200680d6202161e620168cd926201b43f6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36373a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36373a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36373a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b604082019160018351510362021bd7576001620219d2845162004cef565b51510362021b7d576020019060018251510362021b23576002620219f7835162004cef565b51510362021ac9571562021a6d5760018060a01b0362021a21816201b3c46200680d865162004cef565b62021a316200680d845162004cef565b511115928362021a415750505090565b62021a61929350620169f0916201b3c46200680d6202161e935162004cef565b51101538808062016d51565b60018060a01b0362021a89816201b43f6200680d865162004cef565b62021a996200680d845162004cef565b511115928362021aa95750505090565b62021a61929350620169f0916201b43f6200680d6202161e935162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f36383a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36383a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36383a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90604081019060018251510362021dd957600162021c50835162004cef565b51510362021d7f576020019160018351510362021d2557600162021c75845162004cef565b51510362021ccb571562021ca7576200680d6202161e620167cc926201c2826200680d60018060a01b03925162004cef565b6200680d6202161e620167cc926201c2fd6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36393a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f36393a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f36393a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90604081019060018251510362021fdb57600162021e52835162004cef565b51510362021f81576020019160018351510362021f2757600162021e77845162004cef565b51510362021ecd571562021ea9576200680d6202161e620168cd926201c2826200680d60018060a01b03925162004cef565b6200680d6202161e620168cd926201c2fd6200680d60018060a01b03925162004cef565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37303a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37303a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37303a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60408201916001835151036202224c57600162022053845162004cef565b515103620221f257602001906001825151036202219857600262022078835162004cef565b5151036202213e5715620220e25760018060a01b03620220a2816201c2826200680d865162004cef565b620220b26200680d845162004cef565b5111159283620220c25750505090565b62021a61929350620169f0916201c2826200680d6202161e935162004cef565b60018060a01b03620220fe816201c2fd6200680d865162004cef565b6202210e6200680d845162004cef565b51111592836202211e5750505090565b62021a61929350620169f0916201c2fd6200680d6202161e935162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f37313a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37313a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37313a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37313a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620222ae57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37323a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b906040808201916001835151036202255a57600162022338845162004cef565b515103620225015760200192600184515103620224a85760026202235d855162004cef565b5151036202244f5715620223e0576103e8906202238c82620223846200680d875162004cef565b5110620222a6565b6202239c6200680d855162004cef565b519182101562004cfd576003620169f092620167cc94620223c96200680d60018060a01b03925162004cef565b5116600052811b0160205260002054925162004cef565b6103e890620223f982620223846200680d875162004cef565b620224096200680d855162004cef565b519182101562004cfd57611fbb620169f092620167cc94620224376200680d60018060a01b03925162004cef565b511660005260031b0160205260002054925162004cef565b815162461bcd60e51b815260206004820152603160248201527f43452049445f37323a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37323a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37323a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37323a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620225bb57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37333a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b906040808201916001835151036202283857600162022645845162004cef565b515103620227df5760200192600184515103620227865760026202266a855162004cef565b5151036202272d5715620226d6576103e8906202269982620226916200680d875162004cef565b5110620225b3565b620226a96200680d855162004cef565b519182101562004cfd576003620169f092620168cd94620223c96200680d60018060a01b03925162004cef565b6103e890620226ef82620226916200680d875162004cef565b620226ff6200680d855162004cef565b519182101562004cfd57611fbb620169f092620168cd94620224376200680d60018060a01b03925162004cef565b815162461bcd60e51b815260206004820152603160248201527f43452049445f37333a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37333a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37333a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37333a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b156202289957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f37343a20746f6b656e436c617373496e6465782028706172616d6044820152600080516020620338ec833981519152606482015266662072616e676560c81b608482015260a490fd5b9060408082019260018451510362022c7257600162022923855162004cef565b51510362022c195760208093019260018451510362022bc157600391826202294c865162004cef565b51510362022b63571562022a5f576103e8916202297b83620229736200680d885162004cef565b511062022891565b6202298b6200680d865162004cef565b51928084101562004cfd5760018060a01b038281620229af6200680d8b5162004cef565b5116956000968752811b01845285852054620229d0620169f0895162004cef565b5111159788620229e6575b505050505050505090565b909192939495969750620229ff6200680d895162004cef565b519283101562022a4b57916201d46a95939162022a276200680d62022a3a9997955162004cef565b51168452811b0190522054925162004cef565b5110153880808080808080620229db565b634e487b7160e01b86526032600452602486fd5b6103e862022a7781620229736200680d885162004cef565b62022a876200680d865162004cef565b51908082101562004cfd5760018060a01b03938462022aab6200680d8a5162004cef565b5116946000958652611fbb8094831b0185528686205462022ad1620169f08a5162004cef565b511115988962022ae8575b50505050505050505090565b9091929394959697985062022b026200680d8a5162004cef565b519384101562022b4f579162022b3d9795939162022b2b6200680d6201d46a9997955162004cef565b511685521b0190522054925162004cef565b51101538808080808080808062022adc565b634e487b7160e01b87526032600452602487fd5b835162461bcd60e51b815260048101839052603160248201527f43452049445f37343a2055494e543235365f324441525241595b305d206d7573604482015270742068617665203320656c656d656e747360781b6064820152608490fd5b60849083519062461bcd60e51b82526004820152602d60248201527f43452049445f37343a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152fd5b815162461bcd60e51b815260206004820152603060248201527f43452049445f37343a20414444524553535f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b815162461bcd60e51b815260206004820152602d60248201527f43452049445f37343a20414444524553535f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b906020019060018251510362022d7557600162022ce9835162004cef565b51510362022d1b571562022d0957620167cc6200680d6202161e62022e38565b620167cc6200680d6202161e62022dcf565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37353a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37353a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6000805b6103e8811062022de1575090565b908160031b60ff611fbf820154161562022e325762022e1f62022e2c9262022e17611fb962022e2594015462005e438762005fe5565b9290620060a1565b62006200565b9162004cdf565b62022dd3565b50905090565b6000805b6103e8811062022e4a575090565b9060ff60078360031b015416156200619f5762022e2562022e70916201b575846200610a565b62022e3c565b906020019060018251510362022f2057600162022e94835162004cef565b51510362022ec6571562022eb457620168cd6200680d6202161e62022e38565b620168cd6200680d6202161e62022dcf565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37363a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37363a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202307857600262022f98835162004cef565b5151036202301e571562022fe25762022fb062022e38565b62022fc06200680d835162004cef565b511115908162022fce575090565b9050620169f7620169f06202161e62022e38565b62022fec62022dcf565b62022ffc6200680d835162004cef565b51111590816202300a575090565b9050620169f7620169f06202161e62022dcf565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f37373a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37373a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202317c576001620230f0835162004cef565b5151036202312257156202311057620167cc6200680d6202161e62023215565b620167cc6200680d6202161e620231d6565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37383a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37383a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b6000805b6103e88110620231e8575090565b9060ff611fbf8360031b015416156200619f5762022e256202320f916201b5758462005e52565b620231da565b6000805b6103e8811062023227575090565b9060ff60078360031b015416156200619f5762022e256202324d916201b5758462005e1c565b62023219565b9060200190600182515103620232fd57600162023271835162004cef565b515103620232a357156202329157620168cd6200680d6202161e62023215565b620168cd6200680d6202161e620231d6565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f37393a2055494e543235365f324441525241595b305d206d7573604482015260008051602062033a6c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f37393a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b90602001906001825151036202345557600262023375835162004cef565b515103620233fb5715620233bf576202338d62023215565b6202339d6200680d835162004cef565b5111159081620233ab575090565b9050620169f7620169f06202161e62023215565b620233c9620231d6565b620233d96200680d835162004cef565b5111159081620233e7575090565b9050620169f7620169f06202161e620231d6565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f38303a2055494e543235365f324441525241595b305d206d757360448201526000805160206203392c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f38303a2055494e543235365f32444152524159206d757374206860448201526000805160206203378c8339815191526064820152608490fd5b15620234b757565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38353a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202352957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38363a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202359b57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38373a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202360d57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38383a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202367f57565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f38393a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620236f157565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39303a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202376357565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39313a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620237d557565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39323a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b156202384757565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39333a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b15620238b957565b60405162461bcd60e51b815260206004820152604760248201527f43452049445f39343a20746f6b656e436c617373496e6465782028706172616d60448201526000805160206203390c833981519152606482015266662072616e676560c81b608482015260a490fd5b9161019181146202398b5761019281146202397f576101938114620239735761019681146202396757610197146202395c575050600090565b620032d29162023ec1565b50620032d29162023ddc565b50620032d29162023c37565b50620032d29162023af6565b50620032d2919060200190600191828151510362023a9c5782620239b0825162004cef565b51510362023a42576020820151602681101562002a2357600a03620065c757600091835b620239e25750505050600090565b604081019260a093620239f9858251015162004cef565b51518210156201e54057816200743f879662023a189351015162004cef565b5162023a296200680d855162004cef565b5114620051c45762023a3b9062004cdf565b92620239d4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3430313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600191828151510362023bdd576020820151602681101562002a2357600a03620065c75782916000935b62023b335750505050600090565b6040810160a062023b48818351015162004cef565b51518610156201e54057906000855b62023b73575b50505062023b6c839462004cdf565b9362023b25565b62023b7f855162004cef565b515181101562023bd75762023b9d876200743f858551015162004cef565b5162023baf826200743f885162004cef565b511462023bcd579062023bc486939262004cdf565b90919262023b57565b5050505050905090565b62023b5d565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430323a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200190600191828151510362023d8257600262023c57825162004cef565b51510362023d28576020820151602681101562002a2357600a03620065c757600091835b62023c895750505050600090565b604081019260a09362023ca0858251015162004cef565b51518210156201e54057818562023cc1826200743f8a998651015162004cef565b5162023cd26200680d885162004cef565b511115928362023cf7575b505050620051c45762023cf09062004cdf565b9262023c7b565b51015162023d0b92506200743f9062004cef565b5162023d1c620169f0855162004cef565b51101581388062023cdd565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3430333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3430333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b600191828151510362023e68576020820151602681101562002a2357600b03620065c757600091835b62023e135750505050600090565b60408101515192835181101562023e615762023e4a62023e3582879662004d46565b5162023e42855162004cef565b51906203358c565b620051c45762023e5a9062004cdf565b9262023e05565b5062016d86565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3430363a2054686520535452494e475f4152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b600191828151510362023f46576020820151602681101562002a2357600b03620065c757600091835b62023ef85750505050600090565b60408101515192835181101562023e615762023f2f62023f1a82879662004d46565b5162023f27855162004cef565b519062006518565b620051c45762023f3f9062004cdf565b9262023eea565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3430373a2054686520535452494e475f4152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b916097811462023fc35760981462023fb8575050600090565b620032d291620240d4565b50602001805151620032d29290600019016202407b57600162023fe7835162004cef565b515103620240215760200151602681101562002a23576200680d6202161e620240109262033353565b51146202401c57600090565b600190565b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3135313a205468652055494e545f324441525241595b305d206c6044820152600080516020620338ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3135313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b919091602080930160019182825151036202415b57938293946000935b62024100575050505050600090565b6202410c835162004cef565b5151841015620174c9578181015193602685101562002a235762024131869562033353565b62024142826200743f875162004cef565b5114620174c157620241549062004cdf565b93620240f1565b60405162461bcd60e51b815260048101869052602b60248201527f43452049445f3135323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b926102bd8114620242b7576102be8114620242ab576102bf81146202429f576102c0811462024293576102c1811462024287576102c281146202427b576102c381146202426f576102c4811462024263576102c5811462024257576102c681146202424b576102c781146202423f576102c8146202423457505050600090565b620032d292620254dc565b50620032d292620252e1565b50620032d292620250dc565b50620032d29262024e6c565b50620032d29262024c67565b50620032d29262024a58565b50620032d29262024939565b50620032d29262024812565b50620032d292620246eb565b50620032d29262024591565b50620032d2926202443d565b50620032d292620242d4565b606482101562004cfd570190600090565b91602080910192600184515103620243e3576001620242f4855162004cef565b51510362024389571562024350576202161e62024342620167cc936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b90620242c3565b90549060031b1c426200620e565b6202161e62024342620167cc936202433b620076a16200680d9560018060a01b03845116600052613f0181526040600020930162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91602080910192600184515103620245375760016202445d855162004cef565b515103620244dd5715620244a4576202161e62024342620168cd936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b6202161e62024342620168cd936202433b620076a16200680d9560018060a01b03845116600052611f4981526040600020930162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160208091019260018451510362024691576002620245b1855162004cef565b515103620246375715620246035781516001600160a01b03166000908152611f49825260409020620245f39262024342926202433b91620076a1910162007387565b620169cd6200680d835162004cef565b81516001600160a01b03166000908152611f49825260409020620245f39262024342926202433b91620076a1910162007387565b60405162461bcd60e51b815260048101839052603160248201527f43452049445f3730333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3730333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620247b857600162024709845162004cef565b5151036202475e57156202474c57620076a1602062024729920162007387565b606481101562004cfd576200680d6202161e620167cc92611f4b0154426200620e565b620076a1602062024729920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620248df57600162024830845162004cef565b5151036202488557156202487357620076a1602062024850920162007387565b606481101562004cfd576200680d6202161e620168cd92611f4b0154426200620e565b620076a1602062024850920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9160200191600183515103620249fe57600262024957845162004cef565b515103620249a457156202499257620076a1602062024977920162007387565b606481101562004cfd57620245f390611f4b0154426200620e565b620076a1602062024977920162007387565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3730363a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3730363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909291604093848201600193848251510362024c0e578462024a7b835162004cef565b51510362024bb5579584959660001462024b27576000945b62024aa357505050505050600090565b62024aaf825162004cef565b51518510156201adf757859460018060a01b0362024ad3826200743f865162004cef565b51166000526020611f49815262024b0e6200680d62024b0462024342866000206202433b620076a1878c0162007387565b9288015162004cef565b51106201adee5762024b209062004cdf565b9462024a93565b6000945b62024b3b57505050505050600090565b62024b47825162004cef565b51518510156201adf757859460018060a01b0362024b6b826200743f865162004cef565b51166000526020611f49815262024b9c6200680d62024b0462024342866000206202433b620076a1878c0162007387565b51106201adee5762024bae9062004cdf565b9462024b2b565b865162461bcd60e51b815260206004820152603160248201527f43452049445f3730373a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b865162461bcd60e51b815260206004820152602e60248201527f43452049445f3730373a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b909291604093848201600193848251510362024e13578462024c8a835162004cef565b51510362024dba579584959660001462024d2c576000945b62024cb257505050505050600090565b62024cbe825162004cef565b51518510156201adf757859460018060a01b0362024ce2826200743f865162004cef565b51166000526020611f49815262024d136200680d62024b0462024342866000206202433b620076a1878c0162007387565b51116201adee5762024d259062004cdf565b9462024ca2565b6000945b62024d4057505050505050600090565b62024d4c825162004cef565b51518510156201adf757859460018060a01b0362024d70826200743f865162004cef565b51166000526020611f49815262024da16200680d62024b0462024342866000206202433b620076a1878c0162007387565b51116201adee5762024db39062004cdf565b9462024d30565b865162461bcd60e51b815260206004820152603160248201527f43452049445f3730383a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b865162461bcd60e51b815260206004820152602e60248201527f43452049445f3730383a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b929160408082019260019384815151036202508357600262024e8f825162004cef565b5151036202502a5784959660001462024f66576000945b62024eb657505050505050600090565b62024ec2815162004cef565b51518510156201adf757859460018060a01b0362024ee6826200743f855162004cef565b51166000526020611f49815262024f0f62024342866000206202433b620076a185890162007387565b9086019062024f236200680d835162004cef565b51811015918262024f48575b50506201adee5762024f419062004cdf565b9462024ea6565b62024f5b919250620169f0905162004cef565b511015388062024f2f565b6000945b62024f7a57505050505050600090565b62024f86815162004cef565b51518510156201adf757859460018060a01b0362024faa826200743f855162004cef565b51166000526020611f49815262024fd362024342866000206202433b620076a185890162007387565b9086019062024fe76200680d835162004cef565b5181101591826202500c575b50506201adee57620250059062004cdf565b9462024f6a565b6202501f919250620169f0905162004cef565b511015388062024ff3565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3730393a2054686520414444524553535f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3730393a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b92916040808201926001938481515103620252885784620250fe825162004cef565b5151036202522f57849596600014620251a5576000945b6202512257505050505090565b6202512e815162004cef565b51518510156201d47c5760018060a01b0362025150866200743f845162004cef565b51166000526020611f4981526202518b6200680d6202518162024342876000206202433b620076a1878a0162007387565b9287015162004cef565b51116201ad8c576202519e869562004cdf565b9462025115565b6000945b620251b657505050505090565b620251c2815162004cef565b51518510156201d47c5760018060a01b03620251e4866200743f845162004cef565b51166000526020611f498152620252156200680d6202518162024342876000206202433b620076a1878a0162007387565b51116201ad8c5762025228869562004cdf565b94620251a9565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731303a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731303a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9291604080820192600193848151510362025483578462025303825162004cef565b5151036202542a57849596600014620253a0576000945b6202532757505050505090565b62025333815162004cef565b51518510156201d47c5760018060a01b0362025355866200743f845162004cef565b51166000526020611f498152620253866200680d6202518162024342876000206202433b620076a1878a0162007387565b51106201ad8c5762025399869562004cdf565b946202531a565b6000945b620253b157505050505090565b620253bd815162004cef565b51518510156201d47c5760018060a01b03620253df866200743f845162004cef565b51166000526020611f498152620254106200680d6202518162024342876000206202433b620076a1878a0162007387565b51106201ad8c5762025423869562004cdf565b94620253a4565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731313a2054686520414444524553535f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731313a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b92916040808201926001938481515103620256e9576002620254ff825162004cef565b5151036202569057849596600014620255d1576000945b6202552357505050505090565b6202552f815162004cef565b51518510156201d47c5760018060a01b0362025551866200743f845162004cef565b51166000526020611f4981526202557a62024342856000206202433b620076a185880162007387565b908501906202558e6200680d835162004cef565b518110918215620255b4575b50506201ad8c57620255ad869562004cdf565b9462025516565b620255c7919250620169f0905162004cef565b511038806202559a565b6000945b620255e257505050505090565b620255ee815162004cef565b51518510156201d47c5760018060a01b0362025610866200743f845162004cef565b51166000526020613f0181526202563962024342856000206202433b620076a185880162007387565b908501906202564d6200680d835162004cef565b51811091821562025673575b50506201ad8c576202566c869562004cdf565b94620255d5565b62025686919250620169f0905162004cef565b5110388062025659565b825162461bcd60e51b815260206004820152603160248201527f43452049445f3731323a2054686520414444524553535f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b825162461bcd60e51b815260206004820152602e60248201527f43452049445f3731323a2054686520414444524553535f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6001938085036202575a5750620032d2935062025e2a565b60028103620257705750620032d2935062025f14565b600381036202587a575050906040019180835151036202581e5762025796835162004cef565b515103620257bf57620257b96200680d60018060a01b0380935116935162004cef565b51161490565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f333a20414444524553535f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f333a20414444524553535f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b60049080820362025893575050620032d2935062026059565b60058103620258aa575050620032d293506202619e565b60068103620258c1575050620032d29350620262e3565b60078103620258d8575050620032d293506202651f565b60088103620258ef575050620032d293506202677d565b6009810362025906575050620032d29350620269bd565b600a81036202591d575050620032d2935062026bf1565b600b810362025934575050620032d2935062026ef3565b600c81036202594b575050620032d293506202711f565b600d810362025962575050620032d293506202736f565b600e810362025979575050620032d2935062027568565b600f810362025990575050620032d29350620278b8565b60108103620259a7575050620032d2935062027ab1565b60118103620259be575050620032d2935062027bd1565b60128103620259d5575050620032d2935062027cf1565b60138103620259ec575050620032d2935062027e87565b6014810362025a03575050620032d2935062027fa7565b6015810362025a1a575050620032d29350620280c7565b6019810362025a31575050620032d2935062028250565b601a810362025a48575050620032d2935062028388565b601b810362025a5f575050620032d29350620284c0565b601c8195929394951460001462025ba2575060200193808551510362025b495762025a8b855162004cef565b51510362025af057506000901562025aca5750516001600160a01b03166000908152611f47602052604090205490620167cc906200680d905162004cef565b90516001600160a01b03168152613eff602052604090205490620167cc906200680d9081565b60849060206040519162461bcd60e51b8352820152603260248201527f43452049445f32383a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152fd5b60405162461bcd60e51b8152602081840152602f60248201527f43452049445f32383a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b601d810362025cdd575060200193808551510362025c845762025bc6855162004cef565b51510362025c2b57506000901562025c055750516001600160a01b03166000908152611f47602052604090205490620168cd906200680d905162004cef565b90516001600160a01b03168152613eff602052604090205490620168cd906200680d9081565b60849060206040519162461bcd60e51b8352820152603260248201527f43452049445f32393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152fd5b60405162461bcd60e51b8152602081840152602f60248201527f43452049445f32393a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b601e810362025e0f5750602001938451510362025db657600262025d02855162004cef565b51510362025d5d57506000901562025d3f5750516001600160a01b03166000908152611f476020526040902054620169cd6200680d835162004cef565b90516001600160a01b03168152613eff6020526040902054620245f3565b60849060206040519162461bcd60e51b8352820152603360248201527f43452049445f33303a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152fd5b60849060206040519162461bcd60e51b8352820152602f60248201527f43452049445f33303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152fd5b9294509291601f14159050620065c757620032d2926202862f565b91909160018251510362025ebb571562025e8757620032d29160018060a01b03905116600052611f406020526200116462025e8162025e726001604060002001935162004cef565b51926040519283809262002cb6565b6203358c565b620032d29160018060a01b03905116600052613ef86020526200116462025e8162025e726001604060002001935162004cef565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f313a20535452494e475f4152524159206d75737420686176652060448201526a1bdb9948195b195b595b9d60aa1b6064820152608490fd5b916020019160018351510362025ffd57600162025f32845162004cef565b51510362025f9e571562025f6f57516001600160a01b03166000908152611f406020526040902060020154905162016afb906200680d9062004cef565b516001600160a01b03166000908152613ef86020526040902060020154905162016afb906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f323a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f323a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b91602001916001835151036202614257600162026077845162004cef565b515103620260e35715620260b457516001600160a01b03166000908152611f4060205260409020600201549051620167cc906200680d9062004cef565b516001600160a01b03166000908152613ef860205260409020600201549051620167cc906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f343a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f343a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b916020019160018351510362026287576001620261bc845162004cef565b515103620262285715620261f957516001600160a01b03166000908152611f4060205260409020600201549051620168cd906200680d9062004cef565b516001600160a01b03166000908152613ef860205260409020600201549051620168cd906200680d9062004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f353a2055494e543235365f324441525241595b305d206d757374604482015270081a185d99481bdb9948195b195b595b9d607a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f353a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b9091602080910191600183515103620264c357600262026304845162004cef565b51510362026463576202631c6200680d845162004cef565b516202632d620169f0855162004cef565b5110620263dd5715620263ae5760018060a01b039081845116600052611f4091828252600260406000200154620263696200680d865162004cef565b51111594856202637b57505050505090565b909192939450511660005252620263a0620169f0600260406000200154925162004cef565b5110153880808080620174c1565b60018060a01b039081845116600052613ef891828252600260406000200154620263696200680d865162004cef565b60405162461bcd60e51b815260048101839052605260248201527f43452049445f363a2055494e543235365f324441525241595b305d5b305d206d60448201527f757374206265206c657373207468616e206f7220657175616c20746f2055494e606482015271543235365f324441525241595b305d5b315d60701b608482015260a490fd5b60405162461bcd60e51b815260048101839052603260248201527f43452049445f363a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f363a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b9092919260208094019060019283835151036202669e5762026542835162004cef565b515115620266365794839495600014620265c6576000935b62026569575050505050600090565b62026575835162004cef565b5151841015620174c957849360018060a01b03835116600052611f408252600260406000200154620265ad826200743f875162004cef565b5114620174c157620265bf9062004cdf565b936202655a565b6000935b620265d9575050505050600090565b620265e5835162004cef565b5151841015620174c957849360018060a01b03835116600052613ef882526002604060002001546202661d826200743f875162004cef565b5114620174c1576202662f9062004cdf565b93620265ca565b60405162461bcd60e51b815260048101879052603a60248201527f43452049445f373a2055494e543235365f324441525241595b305d206d757374604482015279081a185d9948185d081b19585cdd081bdb9948195b195b595b9d60321b6064820152608490fd5b60405162461bcd60e51b815260048101879052602e60248201527f43452049445f373a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b156202670257565b60405162461bcd60e51b815260206004820152605860248201527f43452049445f383a2055494e543235365f324441525241595b305d5b305d2028604482015260008051602062033a8c833981519152606482015277081d1a19481b195b99dd1a081bd9881d1bdad95b931a5cdd60421b608482015260a490fd5b9160200191600183515103620268de5760026202679b845162004cef565b5151036202687e5780156202686157620267c96103e8620267c16200680d865162004cef565b5110620266fa565b156202681757620267df6200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b01602052620167cc620169f0604060002054925162004cef565b620268276200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b01602052620167cc620169f0604060002054925162004cef565b620268786103e8620267c16200680d865162004cef565b620267c9565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f383a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f383a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b156202694257565b60405162461bcd60e51b815260206004820152605860248201527f43452049445f393a2055494e543235365f324441525241595b305d5b305d2028604482015260008051602062033a8c833981519152606482015277081d1a19481b195b99dd1a081bd9881d1bdad95b931a5cdd60421b608482015260a490fd5b916020019160018351510362026b1e576002620269db845162004cef565b51510362026abe57801562026aa15762026a096103e862026a016200680d865162004cef565b51106202693a565b1562026a575762026a1f6200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b01602052620168cd620169f0604060002054925162004cef565b62026a676200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b01602052620168cd620169f0604060002054925162004cef565b62026ab86103e862026a016200680d865162004cef565b62026a09565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f393a2055494e543235365f324441525241595b305d206d75737460448201527120686176652074776f20656c656d656e747360701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f393a2055494e543235365f32444152524159206d75737420686160448201526d1d99481bdb9948195b195b595b9d60921b6064820152608490fd5b1562026b8257565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31303a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b91909160208092019160018351510362026e23576003918262026c15855162004cef565b51510362026dc057801562026da35762026c436103e862026c3b6200680d875162004cef565b511062026b7a565b1562026cfe5762026c596200680d845162004cef565b51916103e88084101562004cfd5785516001600160a01b03908116600090815294831b830184526040852054865162026c9790620169f09062004cef565b511115968762026cac575b5050505050505090565b909192939495965062026cc46200680d885162004cef565b519283101562022a4b5751168452811b0190526040902054905162026cee906201d46a9062004cef565b5110153880808080808062026ca2565b62026d0e6200680d845162004cef565b516103e88082101562004cfd5760018060a01b039384875116946000958652611fbb8094831b018552604086205462026d4c620169f0895162004cef565b511115978862026d6157505050505050505090565b90919293949596975062026d7a6200680d895162004cef565b519384101562022b4f57511685521b0190526040902054905162022a3a906201d46a9062004cef565b62026dba6103e862026c3b6200680d875162004cef565b62026c43565b60405162461bcd60e51b815260048101839052603560248201527f43452049445f31303a2055494e543235365f324441525241595b305d206d757360448201527474206861766520746872656520656c656d656e747360581b6064820152608490fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f31303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152fd5b1562026e8457565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31313a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b91602001916001835151036202704e57600262026f11845162004cef565b51510362026ff457801562026fd75762026f3f6103e862026f376200680d865162004cef565b511062026e7c565b1562026f8d5762026f556200680d835162004cef565b516103e881101562004cfd5760039160018060a01b03905116600052811b0160205262016afb620169f0604060002054925162004cef565b62026f9d6200680d835162004cef565b516103e881101562004cfd57611fbb9160018060a01b0390511660005260031b0160205262016afb620169f0604060002054925162004cef565b62026fee6103e862026f376200680d865162004cef565b62026f3f565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31313a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31313a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b15620270b057565b60405162461bcd60e51b815260206004820152605960248201527f43452049445f31323a2055494e543235365f324441525241595b305d5b305d20604482015260008051602062033aac83398151915260648201526000805160206203380c833981519152608482015260a490fd5b9160200191600183515103620273155760026202713d845162004cef565b515103620272bb5780156202729e576202716b6103e8620271636200680d865162004cef565b5110620270a8565b156202721057620271816200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620271d56200680d855162004cef565b5191821015620014ce57506202161e620167cc926006620169f09360031b015490620050d4565b634e487b7160e01b81526011600452602490fd5b620272206200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc57620272766200680d855162004cef565b5191821015620014ce57506202161e620167cc92611fbe620169f09360031b015490620050d4565b620272b56103e8620271636200680d865162004cef565b6202716b565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31323a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31323a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202750e5760026202738d845162004cef565b515103620274b457156202742657620273ab6200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620273ff6200680d855162004cef565b5191821015620014ce57506202161e620168cd926006620169f09360031b015490620050d4565b620274366200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc576202748c6200680d855162004cef565b5191821015620014ce57506202161e620168cd92611fbe620169f09360031b015490620050d4565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31333a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31333a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b906020809301916001835151036202785e57600262027588845162004cef565b515103620278045715620276c857620275a66200680d835162004cef565b516103e8908181101562004cfd5760018060a01b03948584511693600094855260038093811b0182526040852054606481029080820460641490151715620276b457620275f86200680d885162004cef565b518581101562022b4f57841b600601546202761391620050d4565b62027623620169f0885162004cef565b511115968762027637575050505050505090565b90919293949596506202764f6200680d885162004cef565b51918583101562022b4f5751168552821b8201905260408320546064808202949180159086049091141715620271fc576202768f6200680d865162004cef565b5192831015620014ce57501b6006015462026cee916201d46a916202161e91620050d4565b634e487b7160e01b86526011600452602486fd5b620276d86200680d835162004cef565b51906103e88083101562004cfd5760018060a01b039485835116936000948552611fbb809160031b018252604085205493606485029480860460641490151715620276b4576202772d6200680d885162004cef565b51948486101562022b4f576202774e90611fbe809760031b015490620050d4565b6202775e620169f0895162004cef565b51111597886202777357505050505050505090565b9091929394959697506202778c6200680d895162004cef565b519185831015620277f0575116865260031b019052604083205492606484029380850460641490151715620271fc57620277cb6200680d865162004cef565b5191821015620014ce575060031b015462022a3a916201d46a916202161e91620050d4565b634e487b7160e01b88526032600452602488fd5b60405162461bcd60e51b815260048101859052603360248201527f43452049445f31343a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260048101859052602f60248201527f43452049445f31343a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027a57576002620278d6845162004cef565b515103620279fd57156202796f57620278f46200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b03166000908152600392831b90920160205260408220546064808202939180159085049091141715620271fc57620279486200680d855162004cef565b5191821015620014ce57506202161e62016afb926006620169f09360031b015490620050d4565b6202797f6200680d835162004cef565b51906103e8908183101562004cfd57516001600160a01b0316600090815260039290921b611fbb0160205260408220546064808202939180159085049091141715620271fc57620279d56200680d855162004cef565b5191821015620014ce57506202161e62016afb92611fbe620169f09360031b015490620050d4565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31353a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31353a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027b7757600162027acf845162004cef565b51510362027b1d57801562027afd576202161e6200680d91620167cc9360018060a01b03905116906201b5d7565b5051620167cc906200680d906202161e906001600160a01b03166201b583565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31363a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027c9757600162027bef845162004cef565b51510362027c3d57801562027c1d576202161e6200680d91620168cd9360018060a01b03905116906201b5d7565b5051620168cd906200680d906202161e906001600160a01b03166201b583565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31373a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31373a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b90916020019060018251510362027e2d57600262027d10835162004cef565b51510362027dd357801562027d815782516001600160a01b039062027d38908216836201b5d7565b62027d486200680d855162004cef565b511115938462027d59575050505090565b62027d74939450916202161e91620169f0935116906201b5d7565b51101538808080620051c4565b5081516001600160a01b039062027d9a9082166201b583565b62027daa6200680d845162004cef565b511115928362027dba5750505090565b62021a61929350620169f0916202161e9151166201b583565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f31383a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31383a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362027f4d57600162027ea5845162004cef565b51510362027ef357801562027ed3576202161e6200680d91620167cc9360018060a01b03905116906201c48e565b5051620167cc906200680d906202161e906001600160a01b03166201c43a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f31393a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f31393a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202806d57600162027fc5845162004cef565b5151036202801357801562027ff3576202161e6200680d91620168cd9360018060a01b03905116906201c48e565b5051620168cd906200680d906202161e906001600160a01b03166201c43a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32303a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32303a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b909160200190600182515103620281f6576002620280e6835162004cef565b5151036202819c5780156202814a5782516001600160a01b03906202810e908216836201c48e565b6202811e6200680d855162004cef565b51111593846202812f575050505090565b62027d74939450916202161e91620169f0935116906201c48e565b5081516001600160a01b0390620281639082166201c43a565b620281736200680d845162004cef565b5111159283620281835750505090565b62021a61929350620169f0916202161e9151166201c43a565b60405162461bcd60e51b815260206004820152603360248201527f43452049445f32313a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32313a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b91602001916001835151036202832e5760016202826e845162004cef565b515103620282d45715620282a857516001600160a01b03166000908152611f4560205260409020549051620167cc906200680d9062004cef565b516001600160a01b03166000908152613efd60205260409020549051620167cc906200680d9062004cef565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32353a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32353a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b916020019160018351510362028466576001620283a6845162004cef565b5151036202840c5715620283e057516001600160a01b03166000908152611f4560205260409020549051620168cd906200680d9062004cef565b516001600160a01b03166000908152613efd60205260409020549051620168cd906200680d9062004cef565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f32363a2055494e543235365f324441525241595b305d206d757360448201526000805160206203386c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f32363a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b9091602080910191600183515103620285d5576002620284e1845162004cef565b5151036202857b57156202854f5760018060a01b039081845116600052611f45918282526040600020546202851b6200680d865162004cef565b51111594856202852d57505050505090565b909192939450511660005252620263a0620169f0604060002054925162004cef565b60018060a01b039081845116600052613efd918282526040600020546202851b6200680d865162004cef565b60405162461bcd60e51b815260048101839052603360248201527f43452049445f32373a2055494e543235365f324441525241595b305d206d75736044820152600080516020620337cc8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f32373a2055494e543235365f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b909160400160019283825151036202870b57839215620286aa576000925b6202865b5750505050600090565b62028667825162004cef565b51518310156201719057839260018060a01b03808351169062028690836200743f875162004cef565b511614620051c457620286a39062004cdf565b926202864d565b6000925b620286bc5750505050600090565b620286c8825162004cef565b51518310156201719057839260018060a01b038083511690620286f1836200743f875162004cef565b511614620051c457620287049062004cdf565b92620286ae565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f33313a20414444524553535f32444152524159206d7573742068604482015260008051602062033a4c8339815191526064820152608490fd5b9161012d8114620289f85761012e8114620289ec5761012f8114620289e0576101308114620289d4576101318114620289c8576101328114620289bc576101338114620289b0576101348114620289a4576101358114620289985761013681146202898c5761013781146202898057610138811462028974576101398114620289685761013a81146202895c5761013b8114620289505761013c8114620289445761013d8114620289375761013e81146202892a5761013f81146202891d5761014081146202891057610141811462028904576101428114620288f8576101438114620288ec576101448114620288e0576101458114620288d4576101468114620288c8576101478114620288bc576101738114620288af576101748114620288a3576101751462028898575050600090565b620032d2916202b213565b50620032d2916202b050565b5050620032d2906202aff4565b50620032d2916202aea6565b50620032d2916202ab5c565b50620032d2916202a9e2565b50620032d2916202a861565b50620032d2916202a69c565b50620032d2916202a53a565b50620032d2916202a3bf565b5050620032d2906202a2b8565b5050620032d2906202a1a3565b5050620032d2906202a0a1565b5050620032d29062029f99565b50620032d29162029e18565b50620032d29162029c97565b50620032d29162029b14565b50620032d29162029991565b50620032d29162029810565b50620032d2916202968f565b50620032d2916202950c565b50620032d29162029389565b50620032d2916202924a565b50620032d2916202910b565b50620032d29162028fe6565b50620032d29162028ec2565b50620032d29162028d84565b50620032d29162028c46565b50620032d29162028b22565b50620032d2919060200190600191828151510362028ac9576020820151602681101562002a2357600d03620065c75762028a3383926202b3bf565b6000935b62028a455750505050600090565b62028a51825162004cef565b515184101562017190576000835b62028a79575b5062028a72839462004cdf565b9362028a37565b939291815185101562028ac05762028a97846200743f835162004cef565b5162028aa4868462004d46565b511462016c4d5762028ab883949562004cdf565b909262028a5f565b91929362028a65565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330313a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028bed576020820151602681101562002a2357600d03620065c75762028b5783926202b3bf565b6000935b62028b695750505050600090565b62028b75825162004cef565b515184101562017190576000835b62028b9d575b5062028b96839462004cdf565b9362028b5b565b939291815185101562028be45762028bbb846200743f835162004cef565b5162028bc8868462004d46565b511462016c4d5762028bdc83949562004cdf565b909262028b83565b91929362028b89565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330323a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028d2b576020820151602681101562002a2357600d03620065c75762028c7b83926202b3bf565b6000925b62028c8a5750505090565b62028c96825162004cef565b515183101562016e0d57600080855b62028cc5575b501562016d865762028cbe849362004cdf565b9262028c7f565b8295939194955181101562028d205762028ce5866200743f845162004cef565b5162028cf2828562004d46565b511462028d13579062028d0784939262004cdf565b90939594919262028ca5565b5091809493503862028cab565b949390929462028cab565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330333a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028e69576020820151602681101562002a2357600d03620065c75762028db983926202b3bf565b6000925b62028dc85750505090565b62028dd4825162004cef565b515183101562016e0d57600080855b62028e03575b501562016d865762028dfc849362004cdf565b9262028dbd565b8295939194955181101562028e5e5762028e23866200743f845162004cef565b5162028e30828562004d46565b511462028e51579062028e4584939262004cdf565b90939594919262028de3565b5091809493503862028de9565b949390929462028de9565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330343a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b9060200190600191828151510362028f8d576020820151602681101562002a2357600e03620065c75762028ef783926202b3bf565b6000935b62028f095750505050600090565b62028f15825162004cef565b515184101562017190576000835b62028f3d575b5062028f36839462004cdf565b9362028efb565b939291815185101562028f845762028f5b846200743f835162004cef565b5162028f68868462004d46565b511462016c4d5762028f7c83949562004cdf565b909262028f23565b91929362028f29565b60405162461bcd60e51b815260206004820152602b60248201527f43452049445f3330353a205468652055494e545f32444152524159206c656e6760448201526a7468206973206e6f74203160a81b6064820152608490fd5b90602001906001918281515103620290b1576020820151602681101562002a2357600e03620065c7576202901b83926202b3bf565b6000935b6202902d5750505050600090565b62029039825162004cef565b515184101562017190576000835b62029061575b506202905a839462004cdf565b936202901f565b9392918151851015620290a8576202907f846200743f835162004cef565b516202908c868462004d46565b511462016c4d57620290a083949562004cdf565b909262029047565b9192936202904d565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620291f0576020820151602681101562002a2357600e03620065c7576202914083926202b3bf565b6000925b6202914f5750505090565b6202915b825162004cef565b515183101562016e0d57600080855b6202918a575b501562016d865762029183849362004cdf565b9262029144565b82959391949551811015620291e557620291aa866200743f845162004cef565b51620291b7828562004d46565b5114620291d85790620291cc84939262004cdf565b9093959491926202916a565b5091809493503862029170565b949390929462029170565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330373a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202932f576020820151602681101562002a2357600e03620065c7576202927f83926202b3bf565b6000925b6202928e5750505090565b6202929a825162004cef565b515183101562016e0d57600080855b620292c9575b501562016d8657620292c2849362004cdf565b9262029283565b829593919495518110156202932457620292e9866200743f845162004cef565b51620292f6828562004d46565b51146202931757906202930b84939262004cdf565b909395949192620292a9565b50918094935038620292af565b9493909294620292af565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330383a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620294b2576002620293a9825162004cef565b51510362029458576020820151602681101562002a2357600d03620065c757620293d483926202b3bf565b906000925b620293e75750505050600090565b8151831015620171905782620293ff85948462004d46565b51620294106200680d845162004cef565b5111158062029431575b620051c4576202942a9062004cdf565b92620293d9565b506202943e818462004d46565b516202944f620169f0845162004cef565b5110156202941a565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3330393a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3330393a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620296355760026202952c825162004cef565b515103620295db576020820151602681101562002a2357600d03620065c7576202955783926202b3bf565b906000925b6202956a5750505050600090565b81518310156201719057826202958285948462004d46565b51620295936200680d845162004cef565b51111580620295b4575b620051c457620295ad9062004cdf565b926202955c565b50620295c1818462004d46565b51620295d2620169f0845162004cef565b5110156202959d565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331303a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331303a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b90602001906001918281515103620297b6576002620296af825162004cef565b5151036202975c576020820151602681101562002a2357600d03620065c757620296da83926202b3bf565b60009182945b620296ed57505050905090565b815185101562016c555762029703858362004d46565b51620297146200680d835162004cef565b5111801562029736575b62016c4d576202972f849562004cdf565b94620296e0565b5062029743858362004d46565b5162029754620169f0835162004cef565b51106202971e565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331313a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331313a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202993757600262029830825162004cef565b515103620298dd576020820151602681101562002a2357600d03620065c7576202985b83926202b3bf565b60009182945b6202986e57505050905090565b815185101562016c555762029884858362004d46565b51620298956200680d835162004cef565b51118015620298b7575b62016c4d57620298b0849562004cdf565b9462029861565b50620298c4858362004d46565b51620298d5620169f0835162004cef565b51106202989f565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331323a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029aba576002620299b1825162004cef565b51510362029a60576020820151602681101562002a2357600e03620065c757620299dc83926202b3bf565b906000925b620299ef5750505050600090565b815183101562017190578262029a0785948462004d46565b5162029a186200680d845162004cef565b5111158062029a39575b620051c45762029a329062004cdf565b92620299e1565b5062029a46818462004d46565b5162029a57620169f0845162004cef565b51101562029a22565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331333a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331333a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029c3d57600262029b34825162004cef565b51510362029be3576020820151602681101562002a2357600e03620065c75762029b5f83926202b3bf565b906000925b62029b725750505050600090565b815183101562017190578262029b8a85948462004d46565b5162029b9b6200680d845162004cef565b5111158062029bbc575b620051c45762029bb59062004cdf565b9262029b64565b5062029bc9818462004d46565b5162029bda620169f0845162004cef565b51101562029ba5565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331343a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331343a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029dbe57600262029cb7825162004cef565b51510362029d64576020820151602681101562002a2357600e03620065c75762029ce283926202b3bf565b60009182945b62029cf557505050905090565b815185101562016c555762029d0b858362004d46565b5162029d1c6200680d835162004cef565b5111801562029d3e575b62016c4d5762029d37849562004cdf565b9462029ce8565b5062029d4b858362004d46565b5162029d5c620169f0835162004cef565b511062029d26565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331353a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331353a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200190600191828151510362029f3f57600262029e38825162004cef565b51510362029ee5576020820151602681101562002a2357600e03620065c75762029e6383926202b3bf565b60009182945b62029e7657505050905090565b815185101562016c555762029e8c858362004d46565b5162029e9d6200680d835162004cef565b5111801562029ebf575b62016c4d5762029eb8849562004cdf565b9462029e69565b5062029ecc858362004d46565b5162029edd620169f0835162004cef565b511062029ea7565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3331363a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3331363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b6020808201908151602681101562002a2357600d1480156202a08b575b6202a03d57508051602681101562002a2357600f149081156202a026575b5062029fe05750600090565b6000805b606060408401510151805182101562017689576202a0058260c09262004d46565b5101511562022e325760406202a01d60609262004cdf565b91505062029fe4565b905051602681101562002a2357600c143862029fd4565b60009150815b816040850151015180518210156202a081576202a0638260019262004d46565b5115150362017682576202a07960409162004cdf565b90506202a043565b5050505050600190565b508151602681101562002a2357600e1462029fb6565b6020808201908151602681101562002a2357600d1480156202a18d575b6202a14957508051602681101562002a2357600f149081156202a132575b506202a0e85750600090565b6000805b6060604084015101518051821015620176895760c06202a10f8360019362004d46565b51015115151462022e325760406202a12960609262004cdf565b9150506202a0ec565b905051602681101562002a2357600c14386202a0dc565b60009150815b816040850151015180518210156202a081576202a16f8260019262004d46565b5115151462017682576202a18560409162004cdf565b90506202a14f565b508151602681101562002a2357600e146202a0be565b6020808201908151602681101562002a2357600d1480156202a2a2575b6202a25457508051602681101562002a2357600f149081156202a23d575b506202a1ea5750600090565b60005b6060604083015101518051821015620065c757819060c06202a213600193849362004d46565b5101511515146202a237575060406202a22e60609262004cdf565b9150506202a1ed565b91505090565b905051602681101562002a2357600c14386202a1de565b905060005b8160408401510151805182101562016d865781906202a27c600192839262004d46565b511515146202a29b57506202a29360409162004cdf565b90506202a259565b9250505090565b508151602681101562002a2357600e146202a1c0565b6020808201908151602681101562002a2357600d1480156202a3a9575b6202a36257508051602681101562002a2357600f149081156202a34b575b506202a2ff5750600090565b60005b6060604083015101518051821015620065c7576202a3238260c09262004d46565b510151156202a3445760406202a33b60609262004cdf565b9150506202a302565b5050600190565b905051602681101562002a2357600c14386202a2f3565b905060005b8160408401510151805182101562016d865781906202a38a600192839262004d46565b511515036202a29b57506202a3a160409162004cdf565b90506202a367565b508151602681101562002a2357600e146202a2d5565b60208092019160019283815151036202a4e0576202a3df84915162004cef565b5151036202a487578082018051602681101562002a2357600f141590816202a46f575b50620065c757600091835b6202a41b5750505050600090565b60408101926060845101519384518210156201e540576202a4566200680d60a0866202a449868b9a62004d46565b5101519351015162004cef565b5114620051c4576202a4689062004cdf565b926202a40d565b905051602681101562002a2357600c1415386202a402565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332313a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332313a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b60208092019160019283815151036202a642578183018051602681101562002a2357600f141590816202a62a575b5062016d865783926000945b6202a583575050505050600090565b6040810160608082510151518710156202a62257906000865b6202a5b8575b5050506202a5b1849562004cdf565b946202a574565b6202a5c4855162004cef565b51518110156202a61c57856202a5df89858551015162004d46565b5101516202a5f3826200743f885162004cef565b51146202a61157906202a60887939262004cdf565b9091926202a59c565b505050505050905090565b6202a5a2565b505062016f9a565b905051602681101562002a2357600c1415386202a568565b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b60208092019160019283815151036202a8075760026202a6bd825162004cef565b5151036202a7ad578183018051602681101562002a2357600f141590816202a795575b5062016d8657600092845b6202a6fa575050505050600090565b604081019360609485815101519586518310156202a78c57828691826202a723838c9b62004d46565b5101516202a7366200680d895162004cef565b51111593846202a75c575b50505050620174c1576202a7559062004cdf565b936202a6eb565b6202a76c93945051015162004d46565b5101516202a77f620169f0855162004cef565b511015848238806202a741565b50505062016f9a565b905051602681101562002a2357600c1415386202a6e0565b60405162461bcd60e51b815260048101839052603260248201527f43452049445f3332333a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3332333a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b602080920160019283825151036202a98957836202a880835162004cef565b5151036202a92a578083018051602681101562002a2357600f141590816202a912575b5062016d8657600092845b6202a8bd575050505050600090565b6060604082015101519384518110156202a90b57826202a8df82889762004d46565b5101516202a8f26200680d865162004cef565b5110620174c1576202a9049062004cdf565b936202a8ae565b5062016f9a565b905051602681101562002a2357600c1415386202a8a3565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332343a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f3332343a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152fd5b602080920160019283825151036202ab0357836202aa01835162004cef565b5151036202aaa4578083018051602681101562002a2357600f141590816202aa8c575b5062016d8657600092845b6202aa3e575050505050600090565b6060604082015101519384518110156202a90b57826202aa6082889762004d46565b5101516202aa736200680d865162004cef565b5111620174c1576202aa859062004cdf565b936202aa2f565b905051602681101562002a2357600c1415386202aa24565b6084906040519062461bcd60e51b82526004820152603260248201527f43452049445f3332353a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152fd5b6084906040519062461bcd60e51b82526004820152602f60248201527f43452049445f3332353a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152fd5b906020019060019182815151036202ae4c57826202ab7b825162004cef565b5151036202adec57602082018051602681101562002a2357600f141590816202add4575b50620065c7576000939291825b6202abbb575b50600093505050565b60408101946060808751015180518310156202adcb576202abe1836202abe89262004d46565b5162005673565b906006918281101562002a235715806202adb2575b6202ad58576202ac166202abe184838b51015162004d46565b8281101562002a23578614806202ad98575b6202ad58576202ac416202abe184838b51015162004d46565b8281101562002a2357600280911490816202ad7d575b506202ad58576202ac716202abe184838b51015162004d46565b8281101562002a2357600380911490816202ad62575b506202ad58576202aca16202abe184838b51015162004d46565b978289101562002a23576004809914806202ad3e575b6202ad3357836202acd0926202abe19251015162004d46565b908110156202ad1e5784959650600580911490816202ad03575b50620051c4576202acfb9062004cdf565b94936202abac565b90506202ad156200680d855162004cef565b5114386202acea565b602187634e487b7160e01b6000525260246000fd5b509496505050505050565b50886202ad506200680d885162004cef565b51146202acb7565b5093955050505050565b90506202ad746200680d875162004cef565b5114386202ac87565b90506202ad8f6200680d875162004cef565b5114386202ac57565b50856202adaa6200680d875162004cef565b51146202ac28565b506202adc36200680d865162004cef565b51156202abfd565b5050506202abb2565b905051602681101562002a2357600c1415386202ab9f565b60405162461bcd60e51b815260206004820152603260248201527f43452049445f3332363a205468652055494e545f3235365f324441525241595b604482015271305d206c656e677468206973206e6f74203160701b6064820152608490fd5b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3332363a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b906020019060019182815151036202af9a57602082018051602681101562002a2357600f141590816202af82575b50620065c75782916000935b6202aeee5750505050600090565b6040810160608082510151518610156201e54057906000855b6202af23575b5050506202af1c839462004cdf565b936202aee0565b6202af2f855162004cef565b51518110156202af7c57826202af4a88828551015162004d46565b5101516202af5e826200743f885162004cef565b511462023bcd57906202af7386939262004cdf565b9091926202af07565b6202af0d565b905051602681101562002a2357600c1415386202aed4565b60405162461bcd60e51b815260206004820152602f60248201527f43452049445f3332373a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b6020810151602681101562002a2357601303620074b25760005b60408083015101518051821015620065c757819060c06202b033600193849362004d46565b5101511515146202a23757506202b04a9062004cdf565b6202b00e565b6020918201805151600094936001939091600019016202b1b95760026202b078845162004cef565b5151036202b15f5781810151602681101562002a23576013036202b155576000959493929190835b6202b0af575b50505050909150565b604080820190808251015180518a10156202b14c578491826202b0d48c809462004d46565b5101516202b0e76200680d895162004cef565b51111593846202b11c575b505050506202b112576202b1098495969762004cdf565b9695946202b0a0565b5050509150915090565b6202b12c93945051015162004d46565b5101516202b13f620169f0855162004cef565b511015828838806202b0f2565b5050506202b0a6565b5060009450505050565b60405162461bcd60e51b815260048101839052603260248201527f43452049445f3337323a205468652055494e545f3235365f324441525241595b60448201526000805160206203374c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101839052602f60248201527f43452049445f3337323a205468652055494e545f3235365f3244415252415920604482015260008051602062033a0c8339815191526064820152608490fd5b9060200160019182825151036202b36457826202b231835162004cef565b5151036202b306576020810151602681101562002a2357601303620065c75782916000935b6202b2645750505050600090565b6040808301908082510151518610156201e54057906000855b6202b299575b5050506202b292839462004cdf565b936202b256565b6202b2a987848451015162004d46565b5151518110156202b300576202b2d1816202b2c989868651015162004d46565b515162004d46565b516202b2e26200680d865162004cef565b511462023bcd57906202b2f786939262004cdf565b9091926202b27d565b6202b283565b60405162461bcd60e51b815260206004820152603060248201527f43452049445f3337333a2054686520535452494e475f324441525241595b305d60448201526f206c656e677468206973206e6f74203160801b6064820152608490fd5b60405162461bcd60e51b815260206004820152602d60248201527f43452049445f3337333a2054686520535452494e475f32444152524159206c6560448201526c6e677468206973206e6f74203160981b6064820152608490fd5b6020908181018051602681101562002a2357600d149081156202b4da575b506202b3ff5750506040516202b3f38162002b3f565b60008152600036813790565b6040019160a0916202b4216202b419848651015162004cef565b515162004e62565b93600092835b6202b436868451015162004cef565b51518110156202b493576202b45081858551015162004d46565b516202b46e575b6202b4666202b4369162004cdf565b90506202b427565b936202b4666202b489828762001ac76202b436958c62004d46565b959150506202b457565b50935050506202b4a38162004e62565b9060005b8181106202b4b6575090925050565b806202b4c76202b4d4928762004d46565b5162001ac7828662004d46565b6202b4a7565b905051602681101562002a2357600e14386202b3dd565b9161025981146202b86d5761025a81146202b77d5761025b81146202b68d5761025c81146202b5775761025d81146202b56b5761025e81146202b55f5761025f81146202b55357610260146202b548575050600090565b620032d2916202bd2b565b50620032d2916202bbb1565b50620032d2916202baa0565b50620032d2916202b95d565b50602001906001825151036202b6335760026202b595835162004cef565b5151036202b5d957602001908151516202b5b46200680d835162004cef565b51111591826202b5c357505090565b620169f7919250620169f0905151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630343a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b7235760016202b6ab835162004cef565b5151036202b6c9576200680d602062016afb92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b8135760016202b79b835162004cef565b5151036202b7b9576200680d6020620168cd92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b50602001906001825151036202b9035760016202b88b835162004cef565b5151036202b8a9576200680d6020620167cc92015151925162004cef565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3630313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3630313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919091602080930160019182825151036202ba4657826202b97f835162004cef565b5151036202b9ec57938293946000935b6202b99e575050505050600090565b818101519384518110156202a90b576202b9c3620076a184620067a7848a9962004d46565b6202b9d36200680d865162004cef565b5114620174c1576202b9e59062004cdf565b936202b98f565b60405162461bcd60e51b815260048101869052603160248201527f43452049445f3630353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3630353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208091019060019182815151036202bb57578293946000945b6202bacb575050505050600090565b8281018051518610156202a90b576000855b6202baf8575b50506202baf1849562004cdf565b946202babc565b6202bb04845162004cef565b51518110156202bb51576202bb24620076a186620067a78a865162004d46565b6202bb35826200743f875162004cef565b511462023bcd57906202bb49869262004cdf565b90916202badd565b6202bae3565b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3630363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b91909160208093019060019182815151036202bcd157846202bbd4825162004cef565b5151920191825151036202bc565782939460009283955b6202bbfa575b50505050905090565b805180518710156202bc4f57620076a183620067a7896202bc1b9462004d46565b6202bc2c876200743f865162004cef565b51036202bc46576202bc3f859662004cdf565b956202bbeb565b50505091505090565b506202bbf1565b60405162461bcd60e51b815260048101869052604760248201527f43452049445f3630373a205468652055494e543235365f324441525241595b3060448201527f5d206c656e677468206973206e6f7420657175616c20746f2070726f6772616d606482015266040d8cadccee8d60cb1b608482015260a490fd5b60405162461bcd60e51b815260048101869052602e60248201527f43452049445f3630373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b919060208091019060019182815151036202bdfb578293946000935b6202bd53575050505090565b8281018051518510156202bdf457856000918183905b6202bd8b575b5050501562016f9a576202bd84859462004cdf565b936202bd47565b6202bd97865162004cef565b51518110156202bdee576202bdb7620076a188620067a78b865162004d46565b6202bdc8826200743f895162004cef565b51146202bde1576202bdda9062004cdf565b826202bd69565b505090508538806202bd6f565b6202bd6f565b50620051c4565b60405162461bcd60e51b815260048101839052602e60248201527f43452049445f3630383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b916101cd81146202bea7576101ce81146202be9b576101cf81146202be8f576101d0146202be84575050600090565b620032d2916202c4b5565b50620032d2916202c293565b50620032d2916202c0a0565b50620032d2919060200160019182825151036202c0465760026202becc835162004cef565b5151036202bfec576202bedf816202c6a8565b15620065c7576202bef0906202c705565b9180939150518251036202bf8157600092845b6202bf12575050505050600090565b8051841015620174c957836202bf2a86958362004d46565b516202bf3b6200680d855162004cef565b5114806202bf5b575b620174c1576202bf549062004cdf565b936202bf03565b506202bf68818562004d46565b516202bf79620169f0855162004cef565b51106202bf44565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436313a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c2395760026202c0bf835162004cef565b5151036202c1df576202c0d2816202c6a8565b15620065c7576202c0e3906202c705565b9180939150518251036202c17457600092845b6202c105575050505050600090565b8051841015620174c957836202c11d86958362004d46565b516202c12e6200680d855162004cef565b5114806202c14e575b620174c1576202c1479062004cdf565b936202c0f6565b506202c15b818562004d46565b516202c16c620169f0855162004cef565b51116202c137565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436323a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c45b5760036202c2b2835162004cef565b5151036202c401576202c2c5816202c6a8565b15620065c7576202c2d6906202c705565b9180939150518251036202c39657600092845b6202c2f8575050505050600090565b8051841015620174c957836202c31086958362004d46565b516202c3216200680d855162004cef565b5114806202c36f575b806202c348575b620174c1576202c3419062004cdf565b936202c2e9565b506202c355818562004d46565b516202c3666201d46a855162004cef565b5110156202c331565b506202c37c818562004d46565b516202c38d620169f0855162004cef565b5111156202c32a565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436333a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436333a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b9060200160019182825151036202c64e5760026202c4d4835162004cef565b5151036202c5f4576202c4e7816202c6a8565b15620065c7576202c4f8906202c705565b9180939150518251036202c58957600092845b6202c51a575050505050600090565b8051841015620174c957836202c53286958362004d46565b516202c5436200680d855162004cef565b5114806202c563575b620174c1576202c55c9062004cdf565b936202c50b565b506202c570818562004d46565b516202c581620169f0855162004cef565b51146202c54c565b60405162461bcd60e51b815260206004820152604860248201527f43452049445f3436343a2054686520746f6b656e20636c617373206c6973742060448201526000805160206203382c8339815191526064820152670e840d8cadccee8d60c31b608482015260a490fd5b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3436343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3436343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b6020018051602681101562002a23576014149081156202c6ed575b81156202c6d6575b506202401c57600090565b905051602681101562002a2357601e14386202c6cb565b80915051602681101562002a2357601514906202c6c3565b6202c710816202c6a8565b156202c81657602081018051602681101562002a23576014146202c801578051602681101562002a23576015146202c7ca5751602681101562002a2357601e146202c79857506040516202c7648162002b3f565b60008152604051916202c7778362002b3f565b60008352604051916202c78a8362002b3f565b600083526000368137929190565b604001906202c7ac60a08351015162004cef565b51906202c7c360a062007446818651015162004d13565b5191929190565b50604001906202c7df60a08351015162004cef565b51906202c7c360a06202c7f6818651015162004d24565b519451015162004d35565b50604001906202c7ac60a08351015162004cef565b60405162461bcd60e51b815260206004820152606860248201527f43452049445f3436313a20546865206f7065726174696f6e206973206e6f742060448201527f746f6b656e206f7065726174696f6e20776974682063617368287061792d746f60648201527f2d6d696e742c207061792d746f2d7472616e736665722c206275726e2d616e646084820152672d726566756e642960c01b60a482015260c490fd5b916101af81146202c962576101b081146202c956576101b181146202c94a576101b281146202c93e576101b381146202c932576101b481146202c926576101b581146202c91a576101b6146202c90f575050600090565b620032d2916202d3ab565b50620032d2916202d206565b50620032d2916202d0a1565b50620032d2916202cf3c565b50620032d2916202cdd7565b50620032d2916202cc32565b50620032d2916202cacd565b50620032d291906020019060019182815151036202ca7357826202c987825162004cef565b5151036202ca19576020820151602681101562002a2357601103620065c757600091835b6202c9b95750505050600090565b604081019260a0936202c9d0858251015162004cef565b51518210156201e54057816200743f87966202c9ef9351015162004cef565b516202ca006200680d855162004cef565b5110620051c4576202ca129062004cdf565b926202c9ab565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433313a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433313a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cbd857826202caec825162004cef565b5151036202cb7e576020820151602681101562002a2357601103620065c757600091835b6202cb1e5750505050600090565b604081019260a0936202cb35858251015162004cef565b51518210156201e54057816200743f87966202cb549351015162004cef565b516202cb656200680d855162004cef565b5111620051c4576202cb779062004cdf565b926202cb10565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433323a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433323a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cd7d5760026202cc52825162004cef565b5151036202cd23576020820151602681101562002a2357601103620065c757600091835b6202cc845750505050600090565b604081019260a0936202cc9b858251015162004cef565b51518210156201e5405781856202ccbc826200743f8a998651015162004cef565b516202cccd6200680d885162004cef565b51111592836202ccf2575b505050620051c4576202cceb9062004cdf565b926202cc76565b5101516202cd0692506200743f9062004cef565b516202cd17620169f0855162004cef565b5110158138806202ccd8565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433333a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433333a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202cee257826202cdf6825162004cef565b5151036202ce88576020820151602681101562002a2357601103620065c757600091835b6202ce285750505050600090565b604081019260a0936202ce3f858251015162004cef565b51518210156201e54057816200743f87966202ce5e9351015162004cef565b516202ce6f6200680d855162004cef565b5114620051c4576202ce819062004cdf565b926202ce1a565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433343a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433343a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d04757826202cf5b825162004cef565b5151036202cfed576020820151602681101562002a2357601203620065c757600091835b6202cf8d5750505050600090565b604081019260a0936202cfa4858251015162004cef565b51518210156201e54057816200743f87966202cfc39351015162004cef565b516202cfd46200680d855162004cef565b5110620051c4576202cfe69062004cdf565b926202cf7f565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433353a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433353a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d1ac57826202d0c0825162004cef565b5151036202d152576020820151602681101562002a2357601203620065c757600091835b6202d0f25750505050600090565b604081019260a0936202d109858251015162004cef565b51518210156201e54057816200743f87966202d1289351015162004cef565b516202d1396200680d855162004cef565b5111620051c4576202d14b9062004cdf565b926202d0e4565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433363a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433363a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d3515760026202d226825162004cef565b5151036202d2f7576020820151602681101562002a2357601203620065c757600091835b6202d2585750505050600090565b604081019260a0936202d26f858251015162004cef565b51518210156201e5405781856202d290826200743f8a998651015162004cef565b516202d2a16200680d885162004cef565b51111592836202d2c6575b505050620051c4576202d2bf9062004cdf565b926202d24a565b5101516202d2da92506200743f9062004cef565b516202d2eb620169f0855162004cef565b5110158138806202d2ac565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433373a205468652055494e543235365f324441525241595b306044820152600080516020620339ac8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433373a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b906020019060019182815151036202d4b657826202d3ca825162004cef565b5151036202d45c576020820151602681101562002a2357601203620065c757600091835b6202d3fc5750505050600090565b604081019260a0936202d413858251015162004cef565b51518210156201e54057816200743f87966202d4329351015162004cef565b516202d4436200680d855162004cef565b5114620051c4576202d4559062004cdf565b926202d3ee565b60405162461bcd60e51b815260206004820152603160248201527f43452049445f3433383a205468652055494e543235365f324441525241595b3060448201526000805160206203384c8339815191526064820152608490fd5b60405162461bcd60e51b815260206004820152602e60248201527f43452049445f3433383a205468652055494e543235365f32444152524159206c6044820152600080516020620338ac8339815191526064820152608490fd5b156202d51857565b60405162461bcd60e51b815260206004820152601c60248201527b496e76616c6964206e756d626572206f6620706172616d657465727360201b6044820152606490fd5b6202d5678162002fc4565b6202d5756200e52e620332ea565b6202d5808162002fc4565b600181036202d59e57506202d5986200e55a620332ea565b611faf55565b6202d5a98162002fc4565b600281036202d5b95750611fb055565b6202d5c48162002fc4565b600381036202d5d45750611fb155565b806202d5e260049262002fc4565b146202d5eb5750565b611fb255565b60609060208152601e60208201527f496e76616c69642072657475726e20747970653a20554e444546494e4544000060408201520190565b7f496e76616c69642061667465722d6f7020706c7567696e206c6576656c2e204c815264032bb32b6160dd1b602082015260250190565b7f496e76616c6964206265666f72652d6f7020706c7567696e206c6576656c2e2081526502632bb32b6160d51b602082015260260190565b9060005b8251811015620115b15760c06202d6b4828562004d46565b510151156202da6b576202d6cd6202abe1828562004d46565b60068082101562002a235760049182036202d818575060209060016003836202d6f7868962004d46565b51015106036202d7145750506202d70e9062004cdf565b6202d69c565b62004cdb82846202d7fd60636202d7456202d73e856202d735868e62004d46565b510151620050f5565b93620050f5565b92847f20697320776974682072657475726e2074797065205945535f414e445f534b4960409586519788946202d78162004db08388016202d660565b016000805160206203388c83398151915281526202d7aa82518093601396878501910162002e01565b01918201527f505f53414e44424f582c2073686f756c64206265206f6e206c6576656c205b3160338201526f2c20342c20372c2031302c202e2e2e5d60801b605382015203604381018552018362002b94565b5193849362461bcd60e51b8552840152602483019062002e26565b6202d8286202abe1848762004d46565b818110156201e0f6576001036202d938575060209060026003836202d84e868962004d46565b51015106036202d8655750506202d70e9062004cdf565b62004cdb82846202d7fd605d6202d8866202d73e856202d735868e62004d46565b92847f20697320776974682072657475726e20747970652053414e44424f585f4e454560409586519788946202d8c262004db08388016202d660565b016000805160206203388c83398151915281526202d8eb82518093601396878501910162002e01565b01918201527f4445442c2073686f756c64206265206f6e206c6576656c205b322c20352c20386033820152692c2031312c202e2e2e5d60b01b605382015203603d81018552018362002b94565b6202d9486202abe1848762004d46565b9081101562015501576002036202da4f576020906003826202d96b858862004d46565b510151066202d9815750506202d70e9062004cdf565b62004cdb82846202d7fd6202d9a76202d9a0846202d735858d62004d46565b92620050f5565b916202da4060409384519586936202d9c562004db08387016202d660565b016000805160206203388c83398151915281528151906202d9ef826013948d868501910162002e01565b01017f20697320776974682072657475726e2074797065204e4f2c2073686f756c642081527f6265206f6e206c6576656c205b332c20362c20392c2031322c202e2e2e5d00006020820152603e0190565b03601f19810184528362002b94565b60405162461bcd60e51b815290819062004cdb9082016202d5f1565b6202da7b6202abe1828562004d46565b6006908181101562002a23576005036202db965750602060016003826202daa3858862004d46565b51015106036202dab957506202d70e9062004cdf565b62004cdb826202db7960526202dada6202d73e866202d73581998c62004d46565b926040937f20697320776974682072657475726e2074797065205945532c2073686f756c6485519889936202db1562004db08387016202d629565b016000805160206203388c83398151915281528251906202db3f826013958c878501910162002e01565b01918201527f206265206f6e206c6576656c205b312c20342c20372c2031302c202e2e2e5d00603382015203603281018752018562002b94565b5192839262461bcd60e51b84526004840152602483019062002e26565b6202dba66202abe1838662004d46565b908082101562002a235760039182036202dcb557506002602091826202dbcd858862004d46565b51015106036202dbe357506202d70e9062004cdf565b62004cdb826202db79605c6202dc046202d73e866202d73581998c62004d46565b926040937f20697320776974682072657475726e207479706520564f54494e475f4e45454485519889936202dc3f62004db08387016202d629565b016000805160206203388c83398151915281528251906202dc69826013958c878501910162002e01565b01918201527f45442c2073686f756c64206265206f6e206c6576656c205b322c20352c20382c6033820152682031312c202e2e2e5d60b81b605382015203603c81018752018562002b94565b6202dcc56202abe1848762004d46565b9081101562002a23576002036202dd7157602090816202dce6848762004d46565b510151066202dcfb57506202d70e9062004cdf565b62004cdb826202db796202dd1a6202d9a0856202d73581988b62004d46565b916202dd6260409384519788936202dd3862004db08387016202d629565b016000805160206203388c83398151915281528151906202d9ef826013948b868501910162002e01565b03601f19810186528562002b94565b60405162461bcd60e51b81528062004cdb600482016202d5f1565b156202dd9457565b60405162461bcd60e51b815260206004820152604d60248201527f546865206c656e677468206f662074686520706c7567696e20696e646578657360448201527f20617272617920616e642074686520626f6f6c65616e206172726179206d757360648201526c74206265207468652073616d6560981b608482015260a490fd5b156202de1d57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420706c7567696e20696e64657820746f20626520656e61626c604482015261195960f21b6064820152608490fd5b156202de7557565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c656420697320616c726560448201526a18591e48195b98589b195960aa1b6064820152608490fd5b156202ded657565b60405162461bcd60e51b815260206004820152602360248201527f496e76616c696420706c7567696e20696e64657820746f2062652064697361626044820152621b195960ea1b6064820152608490fd5b156202df2f57565b60405162461bcd60e51b815260206004820152602d60248201527f54686520706c7567696e20746f2062652064697361626c656420697320616c7260448201526c1958591e48191a5cd8589b1959609a1b6064820152608490fd5b156202df9257565b60405162461bcd60e51b815260206004820152603060248201527f546865206c656e677468206f662074617267657420616e6420746f6b656e436c60448201526f185cdcc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b156202dff857565b60405162461bcd60e51b815260206004820152602c60248201527f546865206c656e677468206f662074617267657420616e6420616d6f756e742060448201526b1a5cc81b9bdd08195c5d585b60a21b6064820152608490fd5b156202e05a57565b60405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e20636c617373206973206e6f7420696e697469616c697a604482015261195960f21b6064820152608490fd5b156202e0b257565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20737570706c79206f662074686520746f6b656e206973604482015268206f766572666c6f7760b81b6064820152608490fd5b156202e11157565b60405162461bcd60e51b8152602060048201526024808201527f5468652062616c616e6365206f662074686520746f6b656e206973206f766572604482015263666c6f7760e01b6064820152608490fd5b156202e16a57565b606460405162461bcd60e51b815260206004820152602060248201527f54686520746f6b656e20697320616c726561647920696e697469616c697a65646044820152fd5b60408101906202e1c360c08351015162004cef565b51916202e1e560a06202e1da818451015162004cef565b519251015162004d13565b51936202e1fa845183511462000fa3620331b7565b6202e20d845186511462000fa3620331b7565b60005b84518110156202e26a576202e226818462004d46565b51906103e882101562004cfd576202e2649160018060a01b03865116600052600390811b0160205262000faa60406000205462007ce9838a62004d46565b6202e210565b5092919360005b83518110156202e395576202e287818462004d46565b51906103e8918281101562004cfd5760018060a01b03908189511660005260039081602091811b0181526202e2c760406000205462007d56868962004d46565b906202e2d4868a62004d46565b51918783101562004cfd57846202e30193878f5116600052811b01845260406000205562000fa3620332bb565b6202e30d848862004d46565b518581101562004cfd578290846202e326878c62004d46565b5116600052811b0181526202e34660406000205462006814868962004d46565b9190926202e355868a62004d46565b519687101562004cfd576202e38f9662000faa956202e375888d62004d46565b5116600052811b01905260406000205562000fa362033320565b6202e271565b5050620121cd6202e3a69162032f53565b90604051936202e3b68562002b78565b60018552602036818701376001600160a01b03610ba08190529051166202e3dd8562004cef565b526000935b81518510156202e700576202e3f8858362004d46565b51946202e406845162004e62565b916000936202e416825162004e62565b610b80528496855b87518110156202e4bf576202e445610ba0516202e43c838b62004d46565b51168b62032d3b565b15806202e487575b6202e464575b6202e45e9062004cdf565b6202e41e565b956202e47e6202e45e91610ba0516200a36b8a8c62004d46565b9690506202e453565b506103e88a101562004cfd57610ba0516202e4a3828a62004d46565b511660005260038a811b0160205260406000205415156202e44d565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202e559578762004cfd57610ba0516202e4fd828c62004d46565b51166000528b602052604060002054156202e524575b6202e51e9062004cdf565b6202e4dd565b976202e5506202e51e918b6202e53f8c610ba0519262004d46565b511662001ac782610b805162004d46565b9890506202e513565b5094959193965098509690959680610b405262004cfd5760040180610b005254956202e58a62008068868962006200565b610b605260009788610b20525b610b405162004cfd57610b2051888110156202e635576202e5c66202e5dc916000610b4052610b005162004f5e565b610ba05191549060031b1c16610b805162032dea565b156202e5fb575b6202e5f1610b205162004cdf565b610b20526202e597565b976202e62e906202e613610b2051610b005162004f5e565b610ba05191549060031b1c1662001ac782610b605162004d46565b976202e5e3565b5095939096509690969391936000915b8383106202e6cf5750505050610b405162004cfd57610b6051516001600160401b03811162002a9b576202e67d81610b00516200509a565b6020610b605101610b005160005260206000206000610ba051905b8481106202e6b85750505050506202e6b09062004cdf565b93926202e3e2565b60019060208386511695019481850155016202e698565b620081fe6202e6f991610ba0516202e6e8868662004d46565b511662001ac782610b605162004d46565b916202e645565b5050509050565b60408101906202e71c60c08351015162004cef565b51916202e73360a06202e1da818451015162004cef565b51936202e748845183511462000fa3620331b7565b6202e75b845186511462000fa3620331b7565b60005b84518110156202e7b8576202e774818462004d46565b51906103e882101562004cfd576202e7b29160018060a01b03865116600052600390811b0160205262000faa60406000205462007ce9838a62004d46565b6202e75e565b5092919360005b83518110156202e8c9576202e7d5818462004d46565b51906103e8918281101562004cfd5760018060a01b03908189511660005260039081602091811b0181526202e81560406000205462007d56868962004d46565b906202e822868a62004d46565b51918783101562004cfd57846202e84f93878f5116600052811b01845260406000205562000fa3620332bb565b6202e85b848862004d46565b518581101562004cfd578290846202e874878c62004d46565b5116600052811b0181526202e89460406000205462006814868962004d46565b9190926202e8a3868a62004d46565b519687101562004cfd576202e8c39662000faa956202e375888d62004d46565b6202e7bf565b5050620121cd6202e8da9162032f53565b90604051936202e8ea8562002b78565b60018552602036818701376001600160a01b03610b008190529051166202e9118562004cef565b526000935b81518510156202e700576202e92c858362004d46565b51946202e93a845162004e62565b916000936202e94a825162004e62565b610b60528496855b87518110156202e9ea576202e970610b00516202e43c838b62004d46565b15806202e9b2575b6202e98f575b6202e9899062004cdf565b6202e952565b956202e9a96202e98991610b00516200a36b8a8c62004d46565b9690506202e97e565b506103e88a101562004cfd57610b00516202e9ce828a62004d46565b511660005260038a811b0160205260406000205415156202e978565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202ea73578762004cfd57610b00516202ea28828c62004d46565b51166000528b602052604060002054156202ea4f575b6202ea499062004cdf565b6202ea08565b976202ea6a6202ea49918b6202e6e88c610b00519262004d46565b9890506202ea3e565b5094959193965098509690959680610ba05262004cfd5760040180610b405254956202eaa462008068868962006200565b610b205260009788610b80525b610ba05162004cfd57610b8051888110156202eb4f576202eae06202eaf6916000610ba052610b405162004f5e565b610b005191549060031b1c16610b605162032dea565b156202eb15575b6202eb0b610b805162004cdf565b610b80526202eab1565b976202eb48906202eb2d610b8051610b405162004f5e565b610b005191549060031b1c1662001ac782610b205162004d46565b976202eafd565b5095939096509690969391936000915b8383106202ebe95750505050610ba05162004cfd57610b2051516001600160401b03811162002a9b576202eb9781610b40516200509a565b6020610b205101610b405160005260206000206000610b0051905b8481106202ebd25750505050506202ebca9062004cdf565b93926202e916565b60019060208386511695019481850155016202ebb2565b620081fe6202ec1391610b00516202ec02868662004d46565b511662001ac782610b205162004d46565b916202eb5f565b9060408201916202ec3560a06200779b818651015162004cef565b519280518451036200ad0a5760005b81518110156202ec9e576202ec5a818362004d46565b51906103e882101562004cfd576202ec989160018060a01b03855116600052600390811b0160205262000faa60406000205462007ce9838962004d46565b6202ec44565b5060005b81518110156202ed3c576202ecb8818362004d46565b51906103e8918281101562004cfd5760018060a01b03908186511660005260039081602091811b0181526202ecf860406000205462007d56868c62004d46565b9190926202ed07868962004d46565b519687101562004cfd576202ed369662000faa958a5116600052811b01905260406000205562000fa3620332bb565b6202eca2565b506202ed4a91935062032f53565b604051926202ed598462002b78565b60018452602036818601376001600160a01b03610b008190529051166202ed808462004cef565b52604051906202ed908262002b3f565b6000825260003681376000935b81518510156202e700576202edb3858362004d46565b51946202edc1845162004e62565b916000936202edd1825162004e62565b610b60528496855b87518110156202ee71576202edf7610b00516202e43c838b62004d46565b15806202ee39575b6202ee16575b6202ee109062004cdf565b6202edd9565b956202ee306202ee1091610b00516200a36b8a8c62004d46565b9690506202ee05565b506103e88a101562004cfd57610b00516202ee55828a62004d46565b511660005260038a811b0160205260406000205415156202edff565b509793929096949195976000986103e88610159560031b9860038a019a5b89518110156202eefa578762004cfd57610b00516202eeaf828c62004d46565b51166000528b602052604060002054156202eed6575b6202eed09062004cdf565b6202ee8f565b976202eef16202eed0918b6202e6e88c610b00519262004d46565b9890506202eec5565b5094959193965098509690959680610ba05262004cfd5760040180610b205254956202ef2b62008068868962006200565b610b805260009788610b40525b610ba05162004cfd57610b4051888110156202efc0576202eae06202ef67916000610ba052610b205162004f5e565b156202ef86575b6202ef7c610b405162004cdf565b610b40526202ef38565b976202efb9906202ef9e610b4051610b205162004f5e565b610b005191549060031b1c1662001ac782610b805162004d46565b976202ef6e565b5095939096509690969391936000915b8383106202f05a5750505050610ba05162004cfd57610b8051516001600160401b03811162002a9b576202f00881610b20516200509a565b6020610b805101610b205160005260206000206000610b0051905b8481106202f0435750505050506202f03b9062004cdf565b93926202ed9d565b60019060208386511695019481850155016202f023565b620081fe6202f07391610b00516202e53f868662004d46565b916202efd0565b156202f08257565b60405162461bcd60e51b815260206004820152601d60248201527f54686520726566756e6420616d6f756e74206973206f766572666c6f770000006044820152606490fd5b156202f0cf57565b60405162461bcd60e51b815260206004820152602360248201527f54686520746f74616c20726566756e6420616d6f756e74206973206f766572666044820152626c6f7760e81b6064820152608490fd5b156202f12857565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20776974686472617761626c6520616d6f756e74206973604482015268206f766572666c6f7760b81b6064820152608490fd5b611f44805482101562004cfd576000526007602060002091020190600090565b815180519192916001600160401b03811162002a9b576202f1c181856200509a565b6020809201846000528260002060005b8381106202f238575050505060c08260069262002c3b95940151600185015560408101516002850155606081015160038501556202f2196080820151151560048601620057f2565b6202f22c60a0820151600586016200571f565b015115159101620057f2565b825182820155918401916001016202f1d1565b611f448054600160401b81101562002a9b576202f26e916001820190556202f17f565b91909162005d305762002c3b916202f19f565b611fb4908154600160401b81101562002a9b576001810180845581101562004cfd5762002c3b926000526020600020016200571f565b620069d06202f2c691620074f5565b613f78805480600052613f76908160205260ff60096040600020015460081c16620322fb57613f73600160ff19825416179055600052602052600960406000200161010061ff0019825416179055546000526202f32760406000206200370e565b90600080611f4a54905b818110620322b4575b50501562032298575b60005b60208301519081518110156202f37e5762000faa620076c162011f56620076a16020620067a7866202f3789862004d46565b6202f346565b505060005b602083015180518210156202f3cb57620076a16020620067a7846202f3a89462004d46565b90606482101562004cfd576202f3c5914290611f4b015562004cdf565b6202f383565b50506000905b602083015180518310156200b07257826202f3ec9162004d46565b516020810151602681101562002a2357156200b02f576020810151602681101562002a23576001036202f5fd57604001906202f42d60c08351015162004cef565b51936202f44460a06200779b818651015162004cef565b51916202f45586518551146202df8a565b6202f46486518451146202dff0565b60005b86518110156202f58b576202f47d818662004d46565b516103e881101562004cfd57600160ff60076202f4a39360031b0154161515146202e052565b6202f4af818562004d46565b516202f4bc828762004d46565b51906103e882101562004cfd576202f4de906006809360031b0154906200608f565b6202f4ea848962004d46565b51926103e884101562004cfd576202f5079360031b01556202e0aa565b6202f513818562004d46565b516202f520828762004d46565b51906103e882101562004cfd576202f549916003906001600160a01b0362012148868d62004d46565b91906202f557828862004d46565b51906103e882101562004cfd576202f5859362000faa926003906001600160a01b036201219c878f62004d46565b6202f467565b5094915091620121cd6202f59f9162032f53565b93604051926202f5af8462002b3f565b60008452600036813760005b83518110156202f5e0578062000faa620079626202f5da938762004d46565b6202f5bb565b50945092602092506202f5f4915062004cdf565b9190506202f3d1565b602081949293940151602681101562002a23576002036202f895576040018051928351906202f635620079c260a08097015162004cef565b519382518651036202f8405782518451036202f7ea5782518551036202f7915760005b86518110156202f77b576202f66e818862004d46565b516103e881101562004cfd5760ff60076202f6909260031b015416156202e162565b6202f69c818862004d46565b516103e881101562004cfd5760031b600701805460ff191660011790556202f6c5818562004d46565b516202f6d2828962004d46565b51906103e882101562004cfd5760056202f6f09260031b016200571f565b6202f6fc818662004d46565b516202f709828962004d46565b516103e881101562004cfd5760031b600101556202f728818762004d46565b516202f735828962004d46565b516103e881101562004cfd5760031b600201556202f754818862004d46565b51906103e882101562004cfd57600060066202f7759360031b015562004cdf565b6202f658565b509591509350602092506202f5f4915062004cdf565b60405162461bcd60e51b815260206004820152603c6024820152600080516020620337ec83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b60405162461bcd60e51b81526020600482015260396024820152600080516020620337ec8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b60405162461bcd60e51b81526020600482015260386024820152600080516020620337ec8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b602081949392940151602681101562002a23576003036202f8c3576020919262000faa6202f5f4926202e707565b6020810151602681101562002a23576004036202faf95760400160c0936202f8f36200ca5c868451015162004cef565b51906202f90a60a06200779b818651015162004cef565b51936202f91f875184511462000fa3620331b7565b6202f932875185511462000fa3620331b7565b6202f945875186511462000fa3620331b7565b60005b87518110156202f98d576202f95e818662004d46565b51906103e882101562004cfd576202f987916003906001600160a01b03620124d9848d62004d46565b6202f948565b509095919593929360005b83518110156202fab6576202f9ae818762004d46565b516103e881101562004cfd576003906001600160a01b036202f9d1848862004d46565b5116600052811b016020526202f9f260406000205462007d56838862004d46565b906202f9ff838962004d46565b51916103e883101562004cfd576202fa28926003906001600160a01b036201259b878b62004d46565b6202fa34818762004d46565b516103e881101562004cfd576003906001600160a01b036202fa57848c62004d46565b5116600052811b016020526202fa7860406000205462006814838862004d46565b9190506202fa87818862004d46565b51916103e883101562004cfd576202fab0926003906001600160a01b036201263e858e62004d46565b6202f998565b50936202fad091929693506200847962007e479162032f53565b9260005b83518110156202f5e0578062000faa620079626202faf3938762004d46565b6202fad4565b92906020840151602681101562002a2357600503620300585760408401906202fb2c60a06200851e818551015162004cef565b519282518451036200ad0a5760005b83518110156202fb94576202fb51818562004d46565b51906103e882101562004cfd5760036202fb8e9260018060a01b038a5116600052811b0160205262000faa60406000205462007ce9838962004d46565b6202fb3b565b509060005b83518110156202fc37576202fbaf818562004d46565b516103e881101562004cfd5760039060018060a01b03895116600052811b016020526202fbe760406000205462007d56838862004d46565b91906202fbf5828762004d46565b51906103e882101562004cfd576202fc3193600362000faa9360018060a01b038d5116600052811b0160205260406000205562000fa3620332bb565b6202fb99565b50916202fc48919495935062032f53565b92604051926202fc588462002b78565b6001845260203681860137516001600160a01b03166202fc788462004cef565b52604051926202fc888462002b3f565b6000845260003681376000945b805186101562030044576202fcab868262004d46565b516109e0526202fcbc855162004e62565b966000946202fccc845162004e62565b6109005260009460005b88518110156202fd9c578a896202fd066001600160a01b036202fcfa858462004d46565b51166109e05162032d3b565b15806202fd56575b6202fd27575b50506202fd219062004cdf565b6202fcd6565b986202fd4b9162001ac782859c62007f376202fd219760018060a01b039262004d46565b9790508a896202fd14565b5050506103e86109e051101562004cfd576001600160a01b036202fd7b828b62004d46565b511660005260036109e051811b016020528a8960406000205415156202fd0e565b50909895979498969291939660005b88518110156202fe3f576103e86109e051101562004cfd576001600160a01b036202fdd7828b62004d46565b511660005260036109e051811b01602052604060002054156202fe06575b6202fe009062004cdf565b6202fdab565b996202fe00906202fe36906001600160a01b036202fe258e8d62004d46565b511662001ac7826109005162004d46565b9a90506202fdf5565b509850969592919093966109e0516103e881101580610ac05262004cfd5760031b60040154986202fe7562008068898c62006200565b610940526000610ae05260006108e0525b610ac05162004cfd576108e0518a8110156202ff4f576202febb6202fed8916000610ac05260046109e05160031b0162004f5e565b90546109005160039290921b1c6001600160a01b03169062032dea565b156202fef7575b6202feed6108e05162004cdf565b6108e0526202fe86565b6000610ac0526202ff156108e05160046109e05160031b0162004f5e565b60018060a01b0391549060031b1c166202ff36610ae0516109405162004d46565b526202ff45610ae05162004cdf565b610ae0526202fedf565b50979294959093985095909560005b8281106202fff857505050610ac05162004cfd5761094051516001600160401b03811162002a9b576202ff9b8160046109e05160031b016200509a565b6020610940510160046109e05160031b01600052602060002060005b8381106202ffda57505050506202ffce9062004cdf565b9492959091956202fc95565b82516001600160a01b0316818301556020909201916001016202ffb7565b6203003e906001600160a01b0362030011828562004d46565b511662030025610ae0516109405162004d46565b5262030034610ae05162004cdf565b610ae05262004cdf565b6202ff5e565b5050936202f5f49193506020925062004cdf565b90926020810151602681101562002a2357600603620301f0576040016203008460c08251015162004cef565b51936203009b60a06200851e818551015162004cef565b519285518351036200db485785518451036200dafb5760005b8651811015620300f957620300ca818562004d46565b51906103e882101562004cfd57620300f3916003906001600160a01b0362012771848c62004d46565b620300b4565b509060005b86518110156203019a5762030114818562004d46565b516103e881101562004cfd576003906001600160a01b0362030137848b62004d46565b5116600052811b016020526203015860406000205462007d56838862004d46565b919062030166828762004d46565b51906103e882101562004cfd57620301949362000faa926003906001600160a01b036201259b878f62004d46565b620300fe565b509491620301af919350620121cd9062032f53565b9160405194620301bf8662002b3f565b60008652600036813760005b83518110156202f5e0578062000faa62007962620301ea938762004d46565b620301cb565b6020810151602681101562002a23576007036203027657604001926203021b60c08551015162004cef565b51916203022d60a08651015162004cef565b519451519162030245845187511462000fa3620331b7565b60005b84518110156202f5e057620302709062000faa6001600160a01b03806201290f848a62004d46565b62030248565b6020819493940151602681101562002a2357600803620302e45760c06040620302a3920151015162004cef565b519160005b8351811015620302d257620302cc906001600160a01b0380620129f7838862004d46565b620302a8565b509260209192506202f5f49062004cdf565b6020810151602681101562002a23576009036203033d5760c060406203030e920151015162004cef565b519160005b8351811015620302d25762030337906001600160a01b038062012a8b838862004d46565b62030313565b6020810151602681101562002a2357600a03620303c357604001906203036e60a06200df3360c08551015162004cef565b519262030383835185511462000fa3620331b7565b60005b8351811015620303b057620303aa906001600160a01b038062012b27838862004d46565b62030386565b50936202f5f49193506020925062004cdf565b602081949392940151602681101562002a2357600b036203044e5760400192620303f260c08551015162004cef565b51935151916203040a855184511462000fa3620331b7565b60005b85518110156203043b57620304359062000faa6001600160a01b038062012bda848b62004d46565b6203040d565b50935091602091506202f5f49062004cdf565b9091926020820151602681101562002a2357600c036203052b57606060408301510151926203047d846202d698565b60005b8451811015620303b05760c0620304a08260606040880151015162004d46565b51015115620304ed57620304c162008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca9620304e7936000190162005cba565b62030480565b6203050562008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008ca9620304e7936000190162005c7a565b9291906020810151602681101562002a2357600d0362030594576040019260206203055b60a08651015162004cef565b5194510151916203057085518451146202dd8c565b60005b85518110156203043b578062012d5b6203058e928662004d46565b62030573565b6020819492940151602681101562002a2357600e03620305fd57604001906020620305c460a08451015162004cef565b519251015193620305d983518651146202dd8c565b60005b83518110156203043b578062012e3f620305f7928862004d46565b620305dc565b906020829493940151602681101562002a2357600f03620306db57606060408301510151926203062d846202d698565b60005b8451811015620303b05760c0620306508260606040880151015162004d46565b510151156203069d576203067162008c808260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262030697936000190162005cba565b62030630565b620306b562008cd38260606040880151015162004d46565b611f4254908160001981011162001e0757600562008dd262030697936000190162005c7a565b906020819493940151602681101562002a23576010036203074c5760400151906203070f60a0608084015193015162004cef565b519362030724835186511462000fa3620331b7565b60005b83518110156203043b578062000faa6200902b62030746938762004d46565b62030727565b6020819492940151602681101562002a23576011036203096557604001906203078060a06200df3360c08551015162004cef565b51936203079183518651146202d510565b60005b8351811015620307c257620307bc9062000faa6001600160a01b03806201304a848962004d46565b62030794565b50935090620307d19062032e37565b90611f465493620307e86200806884518762006200565b9060009260005b8781106203094a575060005b8551811015620308a2576000805b89811062030853575b50156203082b575b620308259062004cdf565b620307fb565b9362030825906203084a906001600160a01b036200e724888a62004d46565b9490506203081a565b6203085e8162004eb6565b90546001600160a01b0360039290921b1c8116906203087e858b62004d46565b5116146203089757620308919062004cdf565b62030809565b505060013862030812565b509550939250620308b38262004e62565b8051906001600160401b03821162002a9b57602090620308d38362004ff7565b01611f46600052602060002060005b8381106203092c575050505060005b82811062030909575050506202f5f460209162004cdf565b620309269062000faa6001600160a01b03620019fb838662004d46565b620308f1565b82516001600160a01b031681830155602090920191600101620308e2565b936200e8706203095f916200e8528762004eb6565b620307ef565b6020819492940151602681101562002a235760120362030b8857604001906203099960a06200df3360c08551015162004cef565b5193620309aa83518651146202d510565b60005b8351811015620309db57620309d59062000faa6001600160a01b0380620132ac848962004d46565b620309ad565b5093509190620309eb9062032e37565b611f4654620309fa8162004e62565b906000926000915b80831062030aaf5750505062030a188262004e62565b8051906001600160401b03821162002a9b5760209062030a388362004ff7565b01611f46600052602060002060005b83811062030a91575050505060005b82811062030a6e575050506202f5f460209162004cdf565b62030a8b9062000faa6001600160a01b03620019fb838662004d46565b62030a56565b82516001600160a01b03168183015560209092019160010162030a47565b91956000959193959760005b855181101562030b795762030ad08962004eb6565b90546001600160a01b0360039290921b1c81169062030af0838962004d46565b51161462030b095762030b039062004cdf565b62030abb565b509750956001959391955b8062030b48575b1562030b335762030b2c9062004cdf565b9162030a02565b936200e87062030b2c916200e8528762004eb6565b5062030b548162004eb6565b60018060a01b0391549060031b1c16600052611f456020526040600020541562030b1b565b50979690969593919562030b14565b6020810151602681101562002a235760130362030be15760408091015101519260005b845181101562030bd0578062000faa6200959f62030bca938862004d46565b62030bab565b509250906202f5f460209162004cdf565b6020810151602681101562002a235760140362030d8e576040019062030c0c60c08351015162004cef565b519362030c2360a06200779b818651015162004cef565b519162030c3486518551146202df8a565b62030c4386518451146202dff0565b60005b865181101562030d395762030c5c818562004d46565b5162030c69828762004d46565b51906103e882101562004cfd57600662030c899260031b0154906200608f565b9062030c96838862004d46565b51916103e883101562004cfd57600662030cb59360031b01556202e0aa565b62030cc1818562004d46565b5162030cce828762004d46565b51906103e882101562004cfd5762030cf7916003906001600160a01b0362012148868d62004d46565b919062030d05828862004d46565b51906103e882101562004cfd5762030d339362000faa926003906001600160a01b036201219c878f62004d46565b62030c46565b5094915091620121cd62030d4d9162032f53565b936040519262030d5d8462002b3f565b60008452600036813760005b83518110156202f5e0578062000faa6200796262030d88938762004d46565b62030d69565b6020810151602681101562002a235760150362030db8576020919262000faa6202f5f4926202e707565b6020810151602681101562002a235760160362030e145760c0604062030de2920151015162004cef565b519260005b845181101562030bd05762030e0e9062000faa6001600160a01b0362009d36838962004d46565b62030de7565b6020810151602681101562002a235760170362030e715760405162461bcd60e51b81526020600482015260296024820152600080516020620339cc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a235760180362030edb5760c0604062030e9b920151015162004cef565b51611fb6805460ff191660011790559260005b845181101562030bd05762030ed59062000faa6001600160a01b0362009e02838962004d46565b62030eae565b6020819392930151602681101562002a235760190362030fc25760008091604082910160a08082510151805162030f89575b5050519060e08201519162030f316200680d60c060018060a01b0393015162004cef565b511690602083519301915af13d1562030f80573d9062030f518262002f5b565b9162030f61604051938462002b94565b82523d6000602084013e5b156201387a57506202f5f460209162004cdf565b60609062030f6c565b62030f949062004cef565b515162030fa3575b8062030f0d565b8192506200680d9062030fb99251015162004cef565b51903862030f9c565b6020810151602681101562002a2357601a03620310445760a0604062030fec920151015162004cef565b5162030ffc60038251146202d510565b620310078162004cef565b519162031018620139a08362004d13565b51916200f9d5576020926202f5f4926001036200a043576200a023906200a016611fb19182546200608f565b6020810151602681101562002a2357601b036203142f5750919062031074611faf546200225a6200a0b962033044565b50506203108062033108565b506000805b6103e88110620313e3575b50506203109c62006161565b90620310ab613f745462004e62565b906000946000905b6103e8821015620313d7578160031b9260ff60078501541615620311bf57600096600285015415620311a6576000975b62004cfd576004850154881015620311a6576203119f62031198899a62031112620311499b60048a0162004f5e565b60018060a01b0391549060031b1c1680600052600389016020526203113d8b60406000205462005eb0565b9c9062000fa362033108565b6203118c620311706203116460009e60028d01549062005eb0565b919062000fa362033108565b82600052611f476020526200a01660406000209182546200608f565b62001ac7828b62004d46565b9962004cdf565b97620310e3565b92909350620311b791965062004cdf565b9094620310b3565b95969392509350505b620311d38262004e62565b9160009160005b8281106203134157505050611f485491620311fa62008068848462006200565b926000906000905b8082106203132457505060005b8381106203128e5750508251929150506001600160401b03821162002a9b576020906203123c8362004fbc565b01611f48600052602060002060005b8381106203127057505050506202f5f46020916000611fb1556000611fb25562004cdf565b82516001600160a01b0316818301556020909201916001016203124b565b6000805b838110620312dc575b5015620312b4575b620312ae9062004cdf565b6203120f565b90620312ae90620312d3906001600160a01b03620081f0858762004d46565b919050620312a3565b6001600160a01b0380620312f1858862004d46565b51169062031300838a62004d46565b5116146203131957620313139062004cdf565b62031292565b50506001386203129b565b9091620081fe6203133a91620094f58562004e9a565b9062031202565b6000805b8581106203138f575b501562031367575b620313619062004cdf565b620311da565b92620313619062031386906001600160a01b03620081f0878662004d46565b93905062031356565b6001600160a01b0380620313a4858762004d46565b511690620313b3838a62004d46565b511614620313cc57620313c69062004cdf565b62031345565b50506001386203134e565b935050929390620311c8565b8060039594951b9060ff6007830154161562031425576200a4f86200746162000faa946200a4ec6203141c9560026200a4e28762005e1c565b93929362031085565b5093929362031090565b6020810151602681101562002a2357601c036203148c5760405162461bcd60e51b8152602060048201526029602482015260008051602062033acc8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b6020810151602681101562002a2357601d03620314b2575b506202f5f460209162004cdf565b9290916020840151602681101562002a2357601e0362031bc357604084019060a090620314e3828451015162004cef565b5151620314f4838551015162004d13565b5151036200ade9576203150b828451015162004cef565b51516203151c838551015162004d24565b5151036200ad6d5762031533828451015162004cef565b519462031544838551015162004d13565b5191620315596200a641858751015162004d24565b519585518751036200ad0a5760005b8651811015620315c1576203157e818862004d46565b51906103e882101562004cfd576003620315bb9260018060a01b038d5116600052811b0160205262000faa60406000205462007ce9838c62004d46565b62031568565b5090969192939660005b86518110156203166a57620315e1818862004d46565b516103e881101562004cfd5760039060018060a01b038c5116600052811b016020526203161960406000205462007d56838b62004d46565b919062031627828a62004d46565b51906103e882101562004cfd576203166493600362000faa938f60018060a01b03905116600052811b0160205260406000205562000fa3620332bb565b620315cb565b50939692979550936203167d9062032f53565b96604051966203168d8862002b78565b60018852602036818a013786516001600160a01b0316620316ae8962004cef565b5260405196620316be8862002b3f565b600088526000610a60525b8951610a60519081101562031a6a57620316e4908b62004d46565b51610a4052620316f5885162004e62565b99600097620317058b5162004e62565b6109c05260009760005b8b51811015620317d5578d8c6203173f6001600160a01b0362031733858462004d46565b5116610a405162032d3b565b15806203178f575b62031760575b50506203175a9062004cdf565b6203170f565b9b620317849162001ac782859f62007f376203175a9760018060a01b039262004d46565b9a90508d8c6203174d565b5050506103e8610a4051101562004cfd576001600160a01b03620317b4828e62004d46565b51166000526003610a4051811b016020528d8c604060002054151562031747565b50909b989a99949691929395979b60005b8b5181101562031869576103e8610a4051101562004cfd576001600160a01b0362031812828e62004d46565b51166000526003610a4051811b016020526040600020541562031841575b6203183b9062004cdf565b620317e6565b9c620318606203183b918f6200d8da8f9160018060a01b039262004d46565b9d905062031830565b509b50989590929496919396610a4051996103e88b10159c8d62004cfd57620318a06200806860048f9e60031b01549e8f62006200565b610960526000610980528d60009e5b62004cfd578d8f10156203196e575060009d620318f7620318da826004610a405160031b0162004f5e565b90546109c05160039290921b1c6001600160a01b03169062032dea565b1562031911575b6203190a8f9162004cdf565b9e620318af565b6203190a9e5060009e8f9162031931816004610a405160031b0162004f5e565b60018060a01b0391549060031b1c1662031952610980516109605162004d46565b52620319616109805162004cdf565b61098052915050620318fe565b9396999b929d509396999094979b5060005b82811062031a1e5750505062004cfd5761096051516001600160401b03811162002a9b57620319b9816004610a405160031b016200509a565b60206109605101906004610a405160031b0160005260206000209160005b82811062031a005750505050620319f1610a605162004cdf565b610a60529598909498620316c9565b81516001600160a01b031681850155602090910190600101620319d7565b62031a64906001600160a01b0362031a37828562004d46565b511662031a4b610980516109605162004d46565b5262031a5a6109805162004cdf565b6109805262004cdf565b62031980565b509492975094955091965060009460005b875181101562031ace5762031a996200abc66200abb9838962004d46565b8062031ab2575b5062031aac9062004cdf565b62031a7b565b906200abfc62031ac79862031aac936200608f565b9062031aa0565b5096509450929091508062031af0575b50506202f5f46020915b9150620314a4565b62031b1b9060018060a01b038351166000526200ac5a611f459182602052604060002054906200608f565b60018060a01b03835116600052602052604060002055600080611f4654905b81811062031b79575b5050916202f5f4916020931562031b5d575b509162031ade565b5162031b72906001600160a01b0316620065d6565b3862031b55565b62031b848162004eb6565b9054855160039290921b1c6001600160a01b0390811691161462031bb35762031bad9062004cdf565b62031b3a565b5060019150829050602062031b43565b9190926020810151602681101562002a2357601f0362031bfe5760209162031bf86200ae9d60406202f5f49401515162004cef565b62031ae8565b6020810151602681101562002a235760200362031c24575b506202f5f460209162031ae8565b6020810151602681101562002a2357602180910362031c45575b5062031c16565b602082015160268110156200b01a5760220362031c815750506202f5f4602091611fb660ff19815416905562031c7a62005087565b9162031c3e565b602082015160268110156200b01a5760230362031ca8575b50506202f5f460209162031c7a565b602082015160268110156200b01a5760241462031c9957602082015160268110156200b01a5760251462031c99576020829593949201519060268210156201478c575060150362010ee557604084019062031d0860c08351015162004cef565b519062031d1f60a06200779b818651015162004cef565b519362031d34835185511462000fa3620331b7565b62031d47835186511462000fa3620331b7565b60005b835181101562031da35762031d60818662004d46565b51906103e882101562004cfd57600362031d9d9260018060a01b038b5116600052811b0160205262000faa60406000205462007ce9838a62004d46565b62031d4a565b509095919560005b875181101562031ece5762031dc1818662004d46565b516103e881101562004cfd5760039060018060a01b03865116600052811b0160205262031df960406000205462007d56838962004d46565b9062031e06838862004d46565b51916103e883101562004cfd57600362031e3d9360018060a01b03895116600052811b0160205260406000205562000fa3620332bb565b62031e49818662004d46565b516103e881101562004cfd576003906001600160a01b0362031e6c848c62004d46565b5116600052811b0160205262031e8d60406000205462006814838962004d46565b919062031e9b828862004d46565b51906103e882101562004cfd5762031ec893600362000faa938d62007e0f8760018060a01b039262004d46565b62031dab565b509262031ee6919294506200c6369096959662032f53565b926040519062031ef68262002b78565b6001825260203681840137516001600160a01b031662031f168262004cef565b526000945b8051861015620322835762031f31868262004d46565b51610aa05262031f42855162004e62565b9660009462031f52845162004e62565b6109205260009460005b885181101562032022578a8962031f8c6001600160a01b0362031f80858462004d46565b5116610aa05162032d3b565b158062031fdc575b62031fad575b505062031fa79062004cdf565b62031f5c565b9862031fd19162001ac782859c62007f3762031fa79760018060a01b039262004d46565b9790508a8962031f9a565b5050506103e8610aa051101562004cfd576001600160a01b0362032001828b62004d46565b51166000526003610aa051811b016020528a89604060002054151562031f94565b50909895979498969291939660005b8851811015620320b4576103e8610aa051101562004cfd576001600160a01b036203205d828b62004d46565b51166000526003610aa051811b01602052604060002054156203208c575b620320869062004cdf565b62032031565b996203208690620320ab906001600160a01b036200a9638e8d62004d46565b9a90506203207b565b50985096959291909396610aa0516103e881101580610a205262004cfd5760031b6004015498620320ea62008068898c62006200565b610a00526000610a805260006109a0525b610a205162004cfd576109a0518a811015620321a7576200a9ff62032130916000610a20526004610aa05160031b0162004f5e565b156203214f575b620321456109a05162004cdf565b6109a052620320fb565b6000610a20526203216d6109a0516004610aa05160031b0162004f5e565b60018060a01b0391549060031b1c166203218e610a8051610a005162004d46565b526203219d610a805162004cdf565b610a805262032137565b50979294959093985095909560005b8281106203225057505050610a205162004cfd57610a0051516001600160401b03811162002a9b57620321f3816004610aa05160031b016200509a565b6020610a0051016004610aa05160031b01600052602060002060005b838110620322325750505050620322269062004cdf565b94929590919562031f1b565b82516001600160a01b0316818301556020909201916001016203220f565b6203227d906001600160a01b0362032269828562004d46565b51166200c214610a8051610a005162004d46565b620321b6565b5050936202f5f4919350602092509162031c99565b8151620322ae906001600160a01b031662006600565b6202f343565b620322bf8162004f0a565b9054865160039290921b1c6001600160a01b03908116911614620322ee57620322e89062004cdf565b6202f331565b505050600138806202f33a565b60405162461bcd60e51b815260206004820152604860248201527f5468652070656e64696e672070726f6772616d20686173206265656e2065786560448201527f63757465642c20616e642073686f756c64206e6f742062652065786563757465606482015267321030b3b0b4b71760c11b608482015260a490fd5b908062032382575050565b62002c3b91600052601f6020600020910160051c81019062004fa3565b90600160401b811162002a9b578154818355808210620323be57505050565b62002c3b92600052601f6020600020918180850160051c8401941680620323ed575b500160051c019062004fa3565b600019908186019182549160200360031b1c16905538620323e0565b9060ff809160031b9316831b921b19161790565b620324356203242e6000936202f17f565b506200356f565b92825b845180518210156203252b5781620324509162004d46565b516103e881101562004cfd57600390811b9460018060a01b038516600052602091860182526203248d604096600188600020549101549062005eb0565b919015620324f65790620324a1916200608f565b959015620324bc575050620324b69062004cdf565b62032438565b60649250519062461bcd60e51b825260048201526014602482015273746f74616c20706f776572206f766572666c6f7760601b6044820152fd5b865162461bcd60e51b815260048101849052600e60248201526d706f776572206f766572666c6f7760901b6044820152606490fd5b505092505090565b60005b613f78549081600052613f7691602092808452600393604092858460002001805486101562032694576203256f866203257b9262004f5e565b905490881b1c6202f17f565b509560ff60068098015416620325a3575b50505050506203259d915062004cdf565b62032536565b81600052838352620325cb620325bf8783886000200162004f5e565b905490831b1c6202f17f565b5096620325eb876001809a01549285600052878752886000200162004f5e565b905490831b1c91836000528585526203260b886005896000200162004f5e565b9054911b1c90600092606492838102938185041490151715620326805790620326349162004f77565b1062032678575b6203264757806203258c565b6009945060005252600020019060ff19918183825416179055613f73918254161790556000613f71556000613f7255565b50856203263b565b634e487b7160e01b84526011600452602484fd5b505050505050506000613f7854905b81600052613f76602052600380604060002001805483101562032719576006620326e0620326d48560ff9462004f5e565b905490851b1c6202f17f565b50015416156203271457620326f58262032929565b9081101562002a235762014d61576203270e9062004cdf565b620326a3565b505050565b50505060ff1990613f73600383825416179055600052613f766020526009604060002001908154169055565b613f785490600090828252613f769160209280845260039060409082828520015495620327728762002c61565b96620327818451988962002b94565b80885262032792601f199162002c61565b013682890137845b888652828252848487200154811015620327e35790620327d88262000faa620327c68897969562032929565b620327d2838d62004d46565b620052db565b90919293506203279a565b5050505090919350815b83518110156203285a5762032803818562004d46565b518281101562032846576001809114620328295750620328239062004cdf565b620327ed565b613f73805460ff191690911790555050613f71819055613f725550565b634e487b7160e01b84526021600452602484fd5b50909150613f7280544210600014620328815750613f739060ff19825416179055613f7155565b9050613f73600160ff1982541617905581613f715555565b15620328a157565b60405162461bcd60e51b815260206004820152601e60248201527f766f74696e672072756c6520696e646578206f7574206f662072616e676500006044820152606490fd5b15620328ee57565b60405162461bcd60e51b815260206004820152601360248201527263757272656e74596573206f766572666c6f7760681b6044820152606490fd5b613f785490600091808352613f76806020528260408520600301906203294f9162004f5e565b90549060031b1c62032961816202f17f565b50600101549383865282602052806040872060040190620329829162004f5e565b90549060031b1c9284875280602052816040882060050190620329a59162004f5e565b90549060031b1c9487526020526040862060060190620329c59162004f5e565b90549060031b1c90620329d8906202f17f565b506006015460ff1662032a24575062032a149262005e4362022e1f938362032a0462032a0c9562005e7a565b9690620328e6565b9290620328e6565b111562032a1e5790565b50600190565b6200fab9925062032a149362032a3e62032a0c9362005e7a565b9490620328e6565b9092919262032a56825162004e62565b60009162032a65815162004e62565b8390845b865181101562032b00576001600160a01b0362032a8c816202e43c848b62004d46565b158062032acb575b62032aac575b5062032aa69062004cdf565b62032a69565b819662032ac391620081f062032aa6948b62004d46565b959062032a9a565b506103e88a101562004cfd578062032ae4838a62004d46565b511660005260038a811b01602052604060002054151562032a94565b509295919694509260005b875181101562032b81576103e886101562004cfd576001600160a01b038062032b35838b62004d46565b5116600052600387811b016020526040600020541562032b62575b5062032b5c9062004cdf565b62032b0b565b819562032b79916200e72462032b5c948c62004d46565b949062032b50565b5092509450926103e8831015938462004cfd5760049586600395861b019687549462032bb262008068828862006200565b9460009689889a5b62032d2657818b101562032c5b57506000998b62032bf562032bdd838362004f5e565b90546001600160a01b0392918e1b1c82168a62032dea565b1562032c18575b50509062032c0d8b94939262004cdf565b9a9091929362032bba565b91998c95949392909162032c2e908c9062004f5e565b9054908d1b1c1662032c41828b62004d46565b5262032c4d9062004cdf565b9890919293508b3862032bfc565b9697949a98505091975092506000915b83831062032d01575050505062032cec578051926001600160401b03841162032cd7575062032c9b83836200509a565b602080910191600052806000209060005b84811062032cbb575050505050565b83516001600160a01b0316838201559281019260010162032cac565b604190634e487b7160e01b6000525260246000fd5b603283634e487b7160e01b6000525260246000fd5b62032d1f90620081fe906001600160a01b036200a36b868662004d46565b9162032c6b565b603285634e487b7160e01b6000525260246000fd5b9060005b6103e883101562004cfd576003600484821b01805483101562016f9a578262032d689162004f5e565b9054911b1c6001600160a01b0390811690831614620065b45762032d8c9062004cdf565b62032d3f565b9060005b6103e883101562004cfd576003611fbc84821b01805483101562016f9a578262032dc09162004f5e565b9054911b1c6001600160a01b0390811690831614620065b45762032de49062004cdf565b62032d96565b9060005b8251811015620065c7576001600160a01b038062032e0d838662004d46565b511690831614620065b45762032e239062004cdf565b62032dee565b801562001e07576000190190565b9081519060005b60001983810184811162001e075782101562032f05576001820180831162001e07575b84811062032e7c57505062032e769062004cdf565b62032e3e565b6001600160a01b038062032e91858962004d46565b51168162032ea0848a62004d46565b51161462032ebb575b5062032eb59062004cdf565b62032e61565b828692960182811162001e075762032eb59262032efe9262032ee262032ef7938b62004d46565b511662032ef0898b62004d46565b5262032e29565b9562032e29565b9062032ea9565b50509062032f138162004e62565b9060005b81811062032f26575090925050565b62032f4d906001600160a01b0362032f3f828862004d46565b511662001ac7828662004d46565b62032f17565b80519160005b60001984810185811162001e07578210156203300b576001820180831162001e07575b85811062032f9757505062032f919062004cdf565b62032f59565b62032fa3838662004d46565b5162032fb0828762004d46565b511462032fc9575b62032fc39062004cdf565b62032f7c565b948181019080821162001e075762032ffc620330039162032fef62032fc3948962004d46565b5162032ef08a8a62004d46565b9662032e29565b905062032fb8565b505090916203301a8162004e62565b9060005b8181106203302d575090925050565b806202b4c76203303e928762004d46565b6203301e565b604051620330528162002a7f565b604481527f496e76616c6964206469766964656e64207065726d797269616420706572207460208201527f72616e73616374696f6e2e2053686f756c64206265206c657373207468616e206040820152630313030360e41b606082015290565b604051620330c08162002b06565b603281527f4e6f20656e6f756768206e756d626572206f66207472616e73616374696f6e7360208201527108199bdc88191a5d9a59195b991cc81e595d60721b604082015290565b604051620331168162002b78565b601c81527b6469766964656e6473206f7065726174696f6e206f766572666c6f7760201b602082015290565b604051620331508162002b78565b600d81526c2ab735b737bbb71022b93937b960991b602082015290565b6040516203317b8162002b06565b602681527f4572726f7220696e20776974686472617761626c6520636173682063616c63756020820152653630ba34b7b760d11b604082015290565b604051620331c58162002b78565b6012815271496e76616c696420506172616d657465727360701b602082015290565b604051620331f58162002b78565b601581527413595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b602082015290565b604051620332288162002b78565b601781527613595b58995c881a5cc81b9bdd081cdd5cdc195b991959604a1b602082015290565b6040516203325d8162002b78565b601b81527a13595b58995c881a5cc8185b1c9958591e481cdd5cdc195b991959602a1b602082015290565b604051620332968162002b78565b60158152744d656d62657220616c72656164792065786973747360581b602082015290565b604051620332c98162002b78565b60118152704e6f20656e6f7567682062616c616e636560781b602082015290565b604051620332f88162002b78565b6018815277125b9d985b1a59081c185c985b595d195c881d1bc81cd95d60421b602082015290565b6040516203332e8162002b78565b6015815274546f6b656e20616d6f756e74206f766572666c6f7760581b602082015290565b602681101562002a23578015620074b2576001811462032a1e57600281146203358657600381146203358057600481146203357a57600581146203357457600681146203356e57600781146203356857600881146203356257600981146203355c57600a81146203355657600b81146203355057600c81146203354a57600d81146203354457600e81146203353e57600f81146203353857601081146203353257601181146203352c57601281146203352657601381146203352057601481146203351a57601581146203351457601681146203350e5760178114620335085760188114620335025760198114620334fc57601a8114620334f657601b8114620334f057601c8114620334ea57601d8114620334e457601e8114620334de57601f8114620334d85760208114620334d25760218114620334cc5760228114620334c65760238114620334c05760248114620334ba57602514620334b557600090565b602590565b50602490565b50602390565b50602290565b50602190565b50602090565b50601f90565b50601e90565b50601d90565b50601c90565b50601b90565b50601a90565b50601990565b50601890565b50601790565b50601690565b50601590565b50601490565b50601390565b50601290565b50601190565b50601090565b50600f90565b50600e90565b50600d90565b50600c90565b50600b90565b50600a90565b50600990565b50600890565b50600790565b50600690565b50600590565b50600490565b50600390565b50600290565b908151815103620065cf57600090815b835181101562017689576001600160f81b031980620335bc838762006506565b511690620335cb838562006506565b5116036201768257620335de9062004cdf565b6203359c565b60405190620335f38262002b06565b60288252604036602084013760005b601481106203361057505090565b60139080820391821162001e0757600382901b916001600160fd1b0381160362001e075760ff80831162001e0757600192620336599084901b6001600160a01b038616620050d4565b60f081168282160391821162001e07576203367d9060f41b600f60f81b16620336e6565b82841b916001600160ff1b038416840362001e0757620336ba9160001a620336a6848962006506565b5360f81b6001600160f81b031916620336e6565b92810180911162001e0757620336d9620336e09360001a918662006506565b5362004cdf565b62033602565b60f81c600a8110156203370f5760300160ff811162001e075760f81b6001600160f81b03191690565b60570160ff811162001e075760f81b6001600160f81b0319169056fe546865206c656e677468206f662061646472657373657320616e6420746f6b65305d206c656e677468206973206e6f742032000000000000000000000000000034dd862f2dd4c33543972cb453e26b9cc23a6eb518176c0de5db12d08007dc6d617665203120656c656d656e7400000000000000000000000000000000000000dd388e0eb473c306304080e96aea031c0fb4686a37f7b1a3c8a2301cd0627f0b7420686176652074776f20656c656d656e747300000000000000000000000000546865206c656e677468206f6620746f6b656e496e666f20616e6420746f6b656e20746865206c656e677468206f6620746f6b656e4c697374000000000000006c656e677468206973206e6f7420657175616c20746f207072696365206c69735d206c656e677468206973206e6f742031000000000000000000000000000000742068617665206f6e6520656c656d656e74000000000000000000000000000020706c7567696e207769746820696e6465782000000000000000000000000000656e677468206973206e6f7420310000000000000000000000000000000000005468652063616c6c20746f2074686520636f6e7472616374206973206e6f74202e55494e543235365f324441525241595b305d5b305d29206973206f7574206f2e55494e543235365f324441525241595b305d5b695d29206973206f7574206f742068617665203220656c656d656e7473000000000000000000000000000000546865206265666f7265206f7065726174696f6e20706c7567696e20737973748b3bb33683ac4daad017d30a0e9972b15e6854cd1f296e14295598f57ce03d506470626d4cb7d88e800a628455fe3f45216f254e8294f25d17ea4ac7e2f4f0a35d206c656e677468206973206e6f7420320000000000000000000000000000005265736572766564206f70636f6465206964203233206973206e6f7420696d70546865206c656e677468206f6620746f6b656e436c617373417272617920616e6c656e677468206973206e6f74203100000000000000000000000000000000005d206c656e677468206973206e6f742067726561746572207468616e20310000617665206f6e6520656c656d656e740000000000000000000000000000000000742068617665203120656c656d656e7400000000000000000000000000000000746f6b656e206c6576656c205829206d757374206265206c657373207468616e28746f6b656e206c6576656c205829206d757374206265206c657373207468615265736572766564206f70636f6465206964203238206973206e6f7420696d70546865206c656e677468206f662061646472657373657320616e6420616d6f75a26469706673582212200b7dff630712f4e35e13cd6b52bb4915fdb7f860f9ed94b9e17edff45824d9ad64736f6c63430008130033\",\n  \"linkReferences\": {},\n  \"deployedLinkReferences\": {}\n}\n"
  },
  {
    "path": "darc-js/src/darcBinary/DARC-test.json",
    "content": "{\n  \"_format\": \"hh-sol-artifact-1\",\n  \"contractName\": \"DARC\",\n  \"sourceName\": \"contracts/protocol/DARC.sol\",\n  \"abi\": [\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"idx\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"checkVotingResult\",\n      \"outputs\": [\n        {\n          \"internalType\": \"enum VotingStatus\",\n          \"name\": \"\",\n          \"type\": \"uint8\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"checkVotingResults\",\n      \"outputs\": [\n        {\n          \"internalType\": \"enum VotingStatus[]\",\n          \"name\": \"\",\n          \"type\": \"uint8[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"currentVotingEndTime\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"address\",\n              \"name\": \"programOperatorAddress\",\n              \"type\": \"address\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"operatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"internalType\": \"enum EnumOpcode\",\n                  \"name\": \"opcode\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"uint256[]\",\n                      \"name\": \"UINT256_ARRAY\",\n                      \"type\": \"uint256[]\"\n                    },\n                    {\n                      \"internalType\": \"address[]\",\n                      \"name\": \"ADDRESS_ARRAY\",\n                      \"type\": \"address[]\"\n                    },\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"bool[]\",\n                      \"name\": \"BOOL_ARRAY\",\n                      \"type\": \"bool[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"uint256[]\",\n                          \"name\": \"votingTokenClassList\",\n                          \"type\": \"uint256[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"approvalThresholdPercentage\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"executionPendingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsAbsoluteMajority\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct VotingRule[]\",\n                      \"name\": \"VOTING_RULE_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"enum EnumReturnType\",\n                          \"name\": \"returnType\",\n                          \"type\": \"uint8\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"level\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"id\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionNodeType\",\n                              \"name\": \"nodeType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumLogicalOperatorType\",\n                              \"name\": \"logicalOperator\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionExpression\",\n                              \"name\": \"conditionExpression\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"childList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"uint256[]\",\n                                  \"name\": \"UINT256_ARRAY\",\n                                  \"type\": \"uint256[]\"\n                                },\n                                {\n                                  \"internalType\": \"address[]\",\n                                  \"name\": \"ADDRESS_ARRAY\",\n                                  \"type\": \"address[]\"\n                                },\n                                {\n                                  \"internalType\": \"string[]\",\n                                  \"name\": \"STRING_ARRAY\",\n                                  \"type\": \"string[]\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[][]\",\n                                  \"name\": \"UINT256_2DARRAY\",\n                                  \"type\": \"uint256[][]\"\n                                },\n                                {\n                                  \"internalType\": \"address[][]\",\n                                  \"name\": \"ADDRESS_2DARRAY\",\n                                  \"type\": \"address[][]\"\n                                },\n                                {\n                                  \"internalType\": \"string[][]\",\n                                  \"name\": \"STRING_2DARRAY\",\n                                  \"type\": \"string[][]\"\n                                }\n                              ],\n                              \"internalType\": \"struct NodeParam\",\n                              \"name\": \"param\",\n                              \"type\": \"tuple\"\n                            }\n                          ],\n                          \"internalType\": \"struct ConditionNode[]\",\n                          \"name\": \"conditionNodes\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingRuleIndex\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsInitialized\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsBeforeOperation\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct Plugin[]\",\n                      \"name\": \"PLUGIN_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"internalType\": \"enum MachineParameter[]\",\n                      \"name\": \"PARAMETER_ARRAY\",\n                      \"type\": \"uint8[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct Param\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct Operation[]\",\n              \"name\": \"operations\",\n              \"type\": \"tuple[]\"\n            }\n          ],\n          \"internalType\": \"struct Program\",\n          \"name\": \"program\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"name\": \"entrance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"string\",\n          \"name\": \"\",\n          \"type\": \"string\"\n        }\n      ],\n      \"stateMutability\": \"payable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"executingPendingDeadline\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"finiteState\",\n      \"outputs\": [\n        {\n          \"internalType\": \"enum FiniteState\",\n          \"name\": \"\",\n          \"type\": \"uint8\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getCurrentDividendPerUnit\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getMemberInfo\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsInitialized\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsSuspended\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"name\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"role\",\n              \"type\": \"uint256\"\n            }\n          ],\n          \"internalType\": \"struct MemberInfo\",\n          \"name\": \"\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getMemberList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getMyInfo\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"\",\n          \"type\": \"address\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getNumberOfTokenClasses\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getPluginInfo\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"enum EnumReturnType\",\n              \"name\": \"returnType\",\n              \"type\": \"uint8\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"level\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"id\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionNodeType\",\n                  \"name\": \"nodeType\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumLogicalOperatorType\",\n                  \"name\": \"logicalOperator\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionExpression\",\n                  \"name\": \"conditionExpression\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"uint256[]\",\n                  \"name\": \"childList\",\n                  \"type\": \"uint256[]\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"uint256[]\",\n                      \"name\": \"UINT256_ARRAY\",\n                      \"type\": \"uint256[]\"\n                    },\n                    {\n                      \"internalType\": \"address[]\",\n                      \"name\": \"ADDRESS_ARRAY\",\n                      \"type\": \"address[]\"\n                    },\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"string[][]\",\n                      \"name\": \"STRING_2DARRAY\",\n                      \"type\": \"string[][]\"\n                    }\n                  ],\n                  \"internalType\": \"struct NodeParam\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct ConditionNode[]\",\n              \"name\": \"conditionNodes\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"votingRuleIndex\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"note\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEnabled\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsInitialized\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsBeforeOperation\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct Plugin[]\",\n          \"name\": \"\",\n          \"type\": \"tuple[]\"\n        },\n        {\n          \"components\": [\n            {\n              \"internalType\": \"enum EnumReturnType\",\n              \"name\": \"returnType\",\n              \"type\": \"uint8\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"level\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"uint256\",\n                  \"name\": \"id\",\n                  \"type\": \"uint256\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionNodeType\",\n                  \"name\": \"nodeType\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumLogicalOperatorType\",\n                  \"name\": \"logicalOperator\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"enum EnumConditionExpression\",\n                  \"name\": \"conditionExpression\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"internalType\": \"uint256[]\",\n                  \"name\": \"childList\",\n                  \"type\": \"uint256[]\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"uint256[]\",\n                      \"name\": \"UINT256_ARRAY\",\n                      \"type\": \"uint256[]\"\n                    },\n                    {\n                      \"internalType\": \"address[]\",\n                      \"name\": \"ADDRESS_ARRAY\",\n                      \"type\": \"address[]\"\n                    },\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"string[][]\",\n                      \"name\": \"STRING_2DARRAY\",\n                      \"type\": \"string[][]\"\n                    }\n                  ],\n                  \"internalType\": \"struct NodeParam\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct ConditionNode[]\",\n              \"name\": \"conditionNodes\",\n              \"type\": \"tuple[]\"\n            },\n            {\n              \"internalType\": \"uint256\",\n              \"name\": \"votingRuleIndex\",\n              \"type\": \"uint256\"\n            },\n            {\n              \"internalType\": \"string\",\n              \"name\": \"note\",\n              \"type\": \"string\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsEnabled\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsInitialized\",\n              \"type\": \"bool\"\n            },\n            {\n              \"internalType\": \"bool\",\n              \"name\": \"bIsBeforeOperation\",\n              \"type\": \"bool\"\n            }\n          ],\n          \"internalType\": \"struct Plugin[]\",\n          \"name\": \"\",\n          \"type\": \"tuple[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getSumDividendWeightByTokenClass\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getSumVotingWeightByTokenClass\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getTokenInfo\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"votingWeight\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"dividendWeight\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"string\",\n          \"name\": \"tokenInfo\",\n          \"type\": \"string\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"totalSupply\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"address\",\n          \"name\": \"tokenOwnerAddress\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getTokenOwnerBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"tokenClassIndex\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"getTokenOwners\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getWithdrawableCashBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getWithdrawableCashOwnerList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"member\",\n          \"type\": \"address\"\n        }\n      ],\n      \"name\": \"getWithdrawableDividendBalance\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"getWithdrawableDividendOwnerList\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address[]\",\n          \"name\": \"\",\n          \"type\": \"address[]\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"initialOwnerAddress\",\n      \"outputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"\",\n          \"type\": \"address\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"initialize\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256[]\",\n          \"name\": \"votingRuleIndices\",\n          \"type\": \"uint256[]\"\n        },\n        {\n          \"components\": [\n            {\n              \"internalType\": \"address\",\n              \"name\": \"programOperatorAddress\",\n              \"type\": \"address\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"operatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"internalType\": \"enum EnumOpcode\",\n                  \"name\": \"opcode\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"uint256[]\",\n                      \"name\": \"UINT256_ARRAY\",\n                      \"type\": \"uint256[]\"\n                    },\n                    {\n                      \"internalType\": \"address[]\",\n                      \"name\": \"ADDRESS_ARRAY\",\n                      \"type\": \"address[]\"\n                    },\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"bool[]\",\n                      \"name\": \"BOOL_ARRAY\",\n                      \"type\": \"bool[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"uint256[]\",\n                          \"name\": \"votingTokenClassList\",\n                          \"type\": \"uint256[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"approvalThresholdPercentage\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"executionPendingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsAbsoluteMajority\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct VotingRule[]\",\n                      \"name\": \"VOTING_RULE_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"enum EnumReturnType\",\n                          \"name\": \"returnType\",\n                          \"type\": \"uint8\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"level\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"id\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionNodeType\",\n                              \"name\": \"nodeType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumLogicalOperatorType\",\n                              \"name\": \"logicalOperator\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionExpression\",\n                              \"name\": \"conditionExpression\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"childList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"uint256[]\",\n                                  \"name\": \"UINT256_ARRAY\",\n                                  \"type\": \"uint256[]\"\n                                },\n                                {\n                                  \"internalType\": \"address[]\",\n                                  \"name\": \"ADDRESS_ARRAY\",\n                                  \"type\": \"address[]\"\n                                },\n                                {\n                                  \"internalType\": \"string[]\",\n                                  \"name\": \"STRING_ARRAY\",\n                                  \"type\": \"string[]\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[][]\",\n                                  \"name\": \"UINT256_2DARRAY\",\n                                  \"type\": \"uint256[][]\"\n                                },\n                                {\n                                  \"internalType\": \"address[][]\",\n                                  \"name\": \"ADDRESS_2DARRAY\",\n                                  \"type\": \"address[][]\"\n                                },\n                                {\n                                  \"internalType\": \"string[][]\",\n                                  \"name\": \"STRING_2DARRAY\",\n                                  \"type\": \"string[][]\"\n                                }\n                              ],\n                              \"internalType\": \"struct NodeParam\",\n                              \"name\": \"param\",\n                              \"type\": \"tuple\"\n                            }\n                          ],\n                          \"internalType\": \"struct ConditionNode[]\",\n                          \"name\": \"conditionNodes\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingRuleIndex\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsInitialized\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsBeforeOperation\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct Plugin[]\",\n                      \"name\": \"PLUGIN_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"internalType\": \"enum MachineParameter[]\",\n                      \"name\": \"PARAMETER_ARRAY\",\n                      \"type\": \"uint8[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct Param\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct Operation[]\",\n              \"name\": \"operations\",\n              \"type\": \"tuple[]\"\n            }\n          ],\n          \"internalType\": \"struct Program\",\n          \"name\": \"currentProgram\",\n          \"type\": \"tuple\"\n        }\n      ],\n      \"name\": \"initializeVoting\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"latestVotingItemIndex\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"address\",\n          \"name\": \"voter\",\n          \"type\": \"address\"\n        },\n        {\n          \"internalType\": \"bool[]\",\n          \"name\": \"votes\",\n          \"type\": \"bool[]\"\n        }\n      ],\n      \"name\": \"vote\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [],\n      \"name\": \"votingDeadline\",\n      \"outputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"votingItems\",\n      \"outputs\": [\n        {\n          \"components\": [\n            {\n              \"internalType\": \"address\",\n              \"name\": \"programOperatorAddress\",\n              \"type\": \"address\"\n            },\n            {\n              \"components\": [\n                {\n                  \"internalType\": \"address\",\n                  \"name\": \"operatorAddress\",\n                  \"type\": \"address\"\n                },\n                {\n                  \"internalType\": \"enum EnumOpcode\",\n                  \"name\": \"opcode\",\n                  \"type\": \"uint8\"\n                },\n                {\n                  \"components\": [\n                    {\n                      \"internalType\": \"uint256[]\",\n                      \"name\": \"UINT256_ARRAY\",\n                      \"type\": \"uint256[]\"\n                    },\n                    {\n                      \"internalType\": \"address[]\",\n                      \"name\": \"ADDRESS_ARRAY\",\n                      \"type\": \"address[]\"\n                    },\n                    {\n                      \"internalType\": \"string[]\",\n                      \"name\": \"STRING_ARRAY\",\n                      \"type\": \"string[]\"\n                    },\n                    {\n                      \"internalType\": \"bool[]\",\n                      \"name\": \"BOOL_ARRAY\",\n                      \"type\": \"bool[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"uint256[]\",\n                          \"name\": \"votingTokenClassList\",\n                          \"type\": \"uint256[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"approvalThresholdPercentage\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"executionPendingDurationInSeconds\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsAbsoluteMajority\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct VotingRule[]\",\n                      \"name\": \"VOTING_RULE_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"components\": [\n                        {\n                          \"internalType\": \"enum EnumReturnType\",\n                          \"name\": \"returnType\",\n                          \"type\": \"uint8\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"level\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"components\": [\n                            {\n                              \"internalType\": \"uint256\",\n                              \"name\": \"id\",\n                              \"type\": \"uint256\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionNodeType\",\n                              \"name\": \"nodeType\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumLogicalOperatorType\",\n                              \"name\": \"logicalOperator\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"enum EnumConditionExpression\",\n                              \"name\": \"conditionExpression\",\n                              \"type\": \"uint8\"\n                            },\n                            {\n                              \"internalType\": \"uint256[]\",\n                              \"name\": \"childList\",\n                              \"type\": \"uint256[]\"\n                            },\n                            {\n                              \"components\": [\n                                {\n                                  \"internalType\": \"uint256[]\",\n                                  \"name\": \"UINT256_ARRAY\",\n                                  \"type\": \"uint256[]\"\n                                },\n                                {\n                                  \"internalType\": \"address[]\",\n                                  \"name\": \"ADDRESS_ARRAY\",\n                                  \"type\": \"address[]\"\n                                },\n                                {\n                                  \"internalType\": \"string[]\",\n                                  \"name\": \"STRING_ARRAY\",\n                                  \"type\": \"string[]\"\n                                },\n                                {\n                                  \"internalType\": \"uint256[][]\",\n                                  \"name\": \"UINT256_2DARRAY\",\n                                  \"type\": \"uint256[][]\"\n                                },\n                                {\n                                  \"internalType\": \"address[][]\",\n                                  \"name\": \"ADDRESS_2DARRAY\",\n                                  \"type\": \"address[][]\"\n                                },\n                                {\n                                  \"internalType\": \"string[][]\",\n                                  \"name\": \"STRING_2DARRAY\",\n                                  \"type\": \"string[][]\"\n                                }\n                              ],\n                              \"internalType\": \"struct NodeParam\",\n                              \"name\": \"param\",\n                              \"type\": \"tuple\"\n                            }\n                          ],\n                          \"internalType\": \"struct ConditionNode[]\",\n                          \"name\": \"conditionNodes\",\n                          \"type\": \"tuple[]\"\n                        },\n                        {\n                          \"internalType\": \"uint256\",\n                          \"name\": \"votingRuleIndex\",\n                          \"type\": \"uint256\"\n                        },\n                        {\n                          \"internalType\": \"string\",\n                          \"name\": \"note\",\n                          \"type\": \"string\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsEnabled\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsInitialized\",\n                          \"type\": \"bool\"\n                        },\n                        {\n                          \"internalType\": \"bool\",\n                          \"name\": \"bIsBeforeOperation\",\n                          \"type\": \"bool\"\n                        }\n                      ],\n                      \"internalType\": \"struct Plugin[]\",\n                      \"name\": \"PLUGIN_ARRAY\",\n                      \"type\": \"tuple[]\"\n                    },\n                    {\n                      \"internalType\": \"enum MachineParameter[]\",\n                      \"name\": \"PARAMETER_ARRAY\",\n                      \"type\": \"uint8[]\"\n                    },\n                    {\n                      \"internalType\": \"uint256[][]\",\n                      \"name\": \"UINT256_2DARRAY\",\n                      \"type\": \"uint256[][]\"\n                    },\n                    {\n                      \"internalType\": \"address[][]\",\n                      \"name\": \"ADDRESS_2DARRAY\",\n                      \"type\": \"address[][]\"\n                    },\n                    {\n                      \"internalType\": \"bytes\",\n                      \"name\": \"BYTES\",\n                      \"type\": \"bytes\"\n                    }\n                  ],\n                  \"internalType\": \"struct Param\",\n                  \"name\": \"param\",\n                  \"type\": \"tuple\"\n                }\n              ],\n              \"internalType\": \"struct Operation[]\",\n              \"name\": \"operations\",\n              \"type\": \"tuple[]\"\n            }\n          ],\n          \"internalType\": \"struct Program\",\n          \"name\": \"program\",\n          \"type\": \"tuple\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"votingEndTime\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"executingEndTime\",\n          \"type\": \"uint256\"\n        },\n        {\n          \"internalType\": \"enum VotingStatus\",\n          \"name\": \"votingStatus\",\n          \"type\": \"uint8\"\n        },\n        {\n          \"internalType\": \"bool\",\n          \"name\": \"bIsProgramExecuted\",\n          \"type\": \"bool\"\n        }\n      ],\n      \"stateMutability\": \"view\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"amount\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"withdrawCash\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    },\n    {\n      \"inputs\": [\n        {\n          \"internalType\": \"uint256\",\n          \"name\": \"amount\",\n          \"type\": \"uint256\"\n        }\n      ],\n      \"name\": \"withdrawDividends\",\n      \"outputs\": [],\n      \"stateMutability\": \"nonpayable\",\n      \"type\": \"function\"\n    }\n  ],\n  \"bytecode\": \"0x6080806040523462000019576201532f90816200001f8239f35b600080fdfe6105008060405260043610156200001557600080fd5b600090813560e01c908163036ee8501462003f00575080630e5a3b291462003ba257806310ade3ea1462003b725780631797631d1462003aea5780631c75255a1462003a8457806323b65c7814620039fc5780632514a6b414620037e857806341d1a43814620037b457806356424cf414620036d35780635c00d98714620036825780635d0b184914620036605780635f1231ea14620035755780635f5d5f0014620034ed578063681ece9d14620034a857806379532bfe14620034865780637daa10ce14620034695780638129fc1c14620030a657806383e4cccf1462002e38578063864f9f7a1462002df957806386ad77e21462002acf5780638c7a63ae1462002a525780638f6561e014620029375780639543bf67146200182d5780639f36145f14620004c0578063a064c4f114620003f7578063acf80bc414620003b8578063aefca42a1462000396578063bba51030146200020c578063d5a172f214620001df5763d6a93c51146200018b57600080fd5b34620001dc5780600319360112620001dc575b6127108110620001b4575b602090604051908152f35b60ff60078260031b01541615620001d657620001d09062005ec0565b6200019e565b620001a9565b80fd5b5034620001dc5780600319360112620001dc5762027126546040516001600160a01b039091168152602090f35b5034620001dc5780600319360112620001dc576202712e548082526202712b916020908382526002938460408320015494620002656200024c8762004034565b966200025c604051988962004010565b80885262004034565b8685019290601f1901368437835b86855281865282604086200154811015620003405760405163083a348760e31b815260048101829052602487828281305afa91821562000335578792620002f2575b50620002c2838b62005f16565b906003831015620002e0575052620002da9062005ec0565b62000273565b634e487b7160e01b8852602160045287fd5b9091508781813d83116200032d575b6200030d818362004010565b81010312620003295751600381101562000329579038620002b5565b8680fd5b503d62000301565b6040513d89823e3d90fd5b505060408051858152875181870181905290948594928501935086905b8281106200036d57505050500390f35b91938395509080826200038560019483975162004131565b01950191019185949391926200035d565b5034620001dc5780600319360112620001dc5760206202712854604051908152f35b5034620001dc576020366003190112620001dc576020906040906001600160a01b03620003e462003f20565b1681526201388783522054604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac5762000439826200043260018260031b0154916200716f565b90620070e9565b90156200044b57602090604051908152f35b60405162461bcd60e51b815260206004820152603360248201527f73756d566f74696e67576569676874466f72546f6b656e436c6173733a20766f60448201527274696e67576569676874206f766572666c6f7760681b6064820152608490fd5b634e487b7160e01b81526032600452602490fd5b5034620001dc576020366003190112620001dc5760043581526202712b602052604080822081519182016001600160401b03811183821017620018195760405280546001600160a01b031682526001810180546200051e8162004034565b916200052e604051938462004010565b81835285526020808620869184015b838310620005a45762000579878787602083015260ff600682015491600860078201549101549060405195869560a0875260a0870190620058d3565b9360208601526040850152620005956060850183831662004131565b60081c16151560808301520390f35b6040516001600160401b03606082019081119082111762001805576060810160405282546001600160a01b0381168252602660a082901c60ff161015620017f15760a01c60ff1660208201526040516001600160401b03610140820190811190821117620017dd5761014081016040526200062260018501620054ae565b8152620006326002850162005503565b602082015262000645600385016200563a565b6040820152600484018a604051809283916020825491828152019184526020842093905b80601f8301106200160957620007ac945491818110620015f2575b818110620015d8575b818110620015be575b818110620015a4575b8181106200158b575b81811062001571575b81811062001557575b8181106200153d575b81811062001523575b81811062001509575b818110620014ef575b818110620014d5575b818110620014bb575b818110620014a1575b81811062001487575b8181106200146d575b81811062001453575b81811062001439575b8181106200141f575b81811062001405575b818110620013eb575b818110620013d1575b818110620013b7575b8181106200139d575b81811062001383575b81811062001369575b8181106200134f575b81811062001335575b8181106200131b575b81811062001301575b818110620012e7575b10620012d6575b509b9a999897969594939b038262004010565b60608a0152600583018054620007c28162004034565b91620007d2604051938462004010565b8183528c526020808d20908d9084015b838210620012a1575050505060808a015260068301988954620008058162004034565b9a620008156040519c8d62004010565b818c5260208c01908d528c6020812091815b8483106200112a57505050505090919293949596979860a0820152604051806007860190602082549182815201918d5260208d20908d915b81601f84011062000e215784600b97946020979460019a9794620009a694549181811062000e03575b81811062000de2575b81811062000dc1575b81811062000da0575b81811062000d80575b81811062000d5f575b81811062000d3e575b81811062000d1d575b81811062000cfc575b81811062000cdb575b81811062000cba575b81811062000c99575b81811062000c78575b81811062000c57575b81811062000c36575b81811062000c15575b81811062000bf4575b81811062000bd3575b81811062000bb2575b81811062000b91575b81811062000b70575b81811062000b4f575b81811062000b2e575b81811062000b0d575b81811062000aec575b81811062000acb575b81811062000aaa575b81811062000a89575b81811062000a68575b81811062000a47575b81811062000a26575b1062000a0b575b50038262004010565b60c0820152620009b96008880162005749565b60e0820152620009cc60098801620057a6565b610100820152604051620009f181620009e981600a8c016200559c565b038262004010565b61012082015260408201528152019201920191906200053d565b90889160f81c62000a1c816200418b565b815201386200099d565b928a8d9160ff8560f01c1662000a3c816200418b565b815201930162000996565b928a8d9160ff8560e81c1662000a5d816200418b565b81520193016200098d565b928a8d9160ff8560e01c1662000a7e816200418b565b815201930162000984565b928a8d9160ff8560d81c1662000a9f816200418b565b81520193016200097b565b928a8d9160ff8560d01c1662000ac0816200418b565b815201930162000972565b928a8d9160ff8560c81c1662000ae1816200418b565b815201930162000969565b928a8d9160ff8560c01c1662000b02816200418b565b815201930162000960565b928a8d9160ff8560b81c1662000b23816200418b565b815201930162000957565b928a8d9160ff8560b01c1662000b44816200418b565b81520193016200094e565b928a8d9160ff8560a81c1662000b65816200418b565b815201930162000945565b928a8d9160ff8560a01c1662000b86816200418b565b81520193016200093c565b928a8d9160ff8560981c1662000ba7816200418b565b815201930162000933565b928a8d9160ff8560901c1662000bc8816200418b565b81520193016200092a565b928a8d9160ff8560881c1662000be9816200418b565b815201930162000921565b928a8d9160ff8560801c1662000c0a816200418b565b815201930162000918565b928a8d9160ff8560781c1662000c2b816200418b565b81520193016200090f565b928a8d9160ff8560701c1662000c4c816200418b565b815201930162000906565b928a8d9160ff8560681c1662000c6d816200418b565b8152019301620008fd565b928a8d9160ff8560601c1662000c8e816200418b565b8152019301620008f4565b928a8d9160ff8560581c1662000caf816200418b565b8152019301620008eb565b928a8d9160ff8560501c1662000cd0816200418b565b8152019301620008e2565b928a8d9160ff8560481c1662000cf1816200418b565b8152019301620008d9565b928a8d9160ff8560401c1662000d12816200418b565b8152019301620008d0565b928a8d9160ff8560381c1662000d33816200418b565b8152019301620008c7565b928a8d9160ff8560301c1662000d54816200418b565b8152019301620008be565b928a8d9160ff8560281c1662000d75816200418b565b8152019301620008b5565b928a8d9160ff85831c1662000d95816200418b565b8152019301620008ac565b928a8d9160ff8560181c1662000db6816200418b565b8152019301620008a3565b928a8d9160ff8560101c1662000dd7816200418b565b81520193016200089a565b928a8d9160ff8560081c1662000df8816200418b565b815201930162000891565b928a8d9160ff851662000e16816200418b565b815201930162000888565b926001610400602092865460ff811662000e3b816200418b565b825260ff8160081c1662000e4f816200418b565b8583015260ff8160101c1662000e65816200418b565b604083015260ff8160181c1662000e7c816200418b565b606083015260ff81861c1662000e92816200418b565b608083015260ff8160281c1662000ea9816200418b565b60a083015262000ebf60ff8260301c166200418b565b60ff8160301c1660c083015260ff8160381c1662000edd816200418b565b60e083015260ff8160401c1662000ef4816200418b565b61010083015260ff8160481c1662000f0c816200418b565b61012083015260ff8160501c1662000f24816200418b565b61014083015260ff8160581c1662000f3c816200418b565b61016083015260ff8160601c1662000f54816200418b565b61018083015260ff8160681c1662000f6c816200418b565b6101a083015260ff8160701c1662000f84816200418b565b6101c083015260ff8160781c1662000f9c816200418b565b6101e083015260ff8160801c1662000fb4816200418b565b61020083015260ff8160881c1662000fcc816200418b565b61022083015260ff8160901c1662000fe4816200418b565b61024083015260ff8160981c1662000ffc816200418b565b61026083015260ff8160a01c1662001014816200418b565b61028083015260ff8160a81c166200102c816200418b565b6102a083015260ff8160b01c1662001044816200418b565b6102c083015260ff8160b81c166200105c816200418b565b6102e083015260ff8160c01c1662001074816200418b565b61030083015260ff8160c81c166200108c816200418b565b61032083015260ff8160d01c16620010a4816200418b565b61034083015260ff8160d81c16620010bc816200418b565b61036083015260ff8160e01c16620010d4816200418b565b61038083015260ff8160e81c16620010ec816200418b565b6103a083015260ff8160f01c1662001104816200418b565b6103c083015260f81c62001118816200418b565b6103e08201520194019201916200085f565b60405190620011398262003f9f565b6200114960ff865416836200572f565b6001850154602083015260028501805490620011658262004034565b9262001175604051948562004010565b82845290815260208082209084015b8383106200121357505050509d9e95969798999a9b9c9d600192826020926040600695015260038701546060820152604051620011ca81620009e98160048c016200559c565b608082015260ff6005880154818116151560a0840152818160081c16151560c084015260101c16151560e08201528152019301910190918e9d9c9b9a9998979695949d62000827565b60096020600192604051620012288162003f83565b855481526200126c60ff8688015481811662001244816200418b565b86850152818160081c166200125981620040ca565b604085015260101c16606083016200573c565b6200127a60028701620054ae565b60808201526200128d6003870162005803565b60a082015281520192019201919062001184565b600760209d9e969798999a9b9c9d600192620012bd86620056a8565b8152019301910190919c9b9a9998979695949c620007e2565b60f81c151581526020013862000799565b92602060019160ff8560f01c161515815201930162000792565b92602060019160ff8560e81c161515815201930162000789565b92602060019160ff8560e01c161515815201930162000780565b92602060019160ff8560d81c161515815201930162000777565b92602060019160ff8560d01c16151581520193016200076e565b92602060019160ff8560c81c161515815201930162000765565b92602060019160ff8560c01c16151581520193016200075c565b92602060019160ff8560b81c161515815201930162000753565b92602060019160ff8560b01c16151581520193016200074a565b92602060019160ff8560a81c161515815201930162000741565b92602060019160ff8560a01c161515815201930162000738565b92602060019160ff8560981c16151581520193016200072f565b92602060019160ff8560901c161515815201930162000726565b92602060019160ff8560881c16151581520193016200071d565b92602060019160ff8560801c161515815201930162000714565b92602060019160ff8560781c16151581520193016200070b565b92602060019160ff8560701c161515815201930162000702565b92602060019160ff8560681c1615158152019301620006f9565b92602060019160ff8560601c1615158152019301620006f0565b92602060019160ff8560581c1615158152019301620006e7565b92602060019160ff8560501c1615158152019301620006de565b92602060019160ff8560481c1615158152019301620006d5565b92602060019160ff8560401c1615158152019301620006cc565b92602060019160ff8560381c1615158152019301620006c3565b92602060019160ff8560301c1615158152019301620006ba565b92602060019160ff8560281c1615158152019301620006b1565b92602060019160ff85831c1615158152019301620006a8565b92602060019160ff8560181c16151581520193016200069f565b92602060019160ff8560101c161515815201930162000696565b92602060019160ff8560081c16151581520193016200068d565b92602060019160ff85161515815201930162000684565b916020919350610400600191865460ff81161515825260ff8160081c1615158583015260ff8160101c161515604083015260ff8160181c161515606083015260ff8160808282891c16151581860152828260281c16151560a0860152828260c092828260301c16151584890152828260381c16151560e0890152828260401c161515610100890152828260481c161515610120890152828260501c161515610140890152828260581c161515610160890152828260601c161515610180890152828260681c1615156101a0890152828260701c1615156101c0890152828260781c1615156101e08901521c161515610200860152828260881c161515610220860152828260901c161515610240860152828260981c161515610260860152828260a01c161515610280860152828260a81c1615156102a0860152828260b01c1615156102c0860152828260b81c1615156102e08601521c16151561030083015260ff8160c81c16151561032083015260ff8160d01c16151561034083015260ff8160d81c16151561036083015260ff8160e01c16151561038083015260ff8160e81c1615156103a083015260ff8160f01c1615156103c083015260f81c15156103e082015201940192018492939162000669565b634e487b7160e01b8a52604160045260248afd5b634e487b7160e01b8a52602160045260248afd5b634e487b7160e01b89526041600452602489fd5b634e487b7160e01b84526041600452602484fd5b5034620001dc576040366003190112620001dc576004356001600160401b03811162002933576200186390369060040162004571565b6024356001600160401b0381116200292f576200188590369060040162004861565b620271298054600260ff82166200189c81620040ca565b14620028ea5760ff191660021790556202712e54600181018111620028d657600181016202712e558391845b84518110156200192b57836002620018ec620018e5848962005f16565b5162013e1e565b5001541062001907575b620019019062005ec0565b620018c8565b92506200190160026200191f620018e5868862005f16565b500154939050620018f6565b509093918291825b85518110156200198f5784600362001950620018e5848a62005f16565b500154106200196b575b620019659062005ec0565b62001933565b935062001965600362001983620018e5878962005f16565b5001549490506200195a565b50600190950182526202712b602090815260408320865181546001600160a01b0319166001600160a01b03919091161781559501518051929591929190600160401b831162001f1557600182015483600184015580841062002694575b50602060019101910186526020862086915b83831062001f53575050505062001a16835162006032565b6202712e5485526202712b6020526004604086200181519160018060401b03831162001f155760209062001a4b84846200624a565b0190865260208620865b83811062001f3e575050505062001a6d835162006032565b6202712e5485526202712b6020526003604086200181519160018060401b03831162001f155760209062001aa284846200624a565b0190865260208620865b83811062001f29575050505062001ac4835162006032565b6202712e5485526202712b6020526005604086200181519160018060401b03831162001f155760209062001af984846200624a565b0190865260208620865b83811062001f00575050505062001b1b904262007231565b6202712e5485526202712b60205260066040862001551562001ec05762001b58906202712e5484526202712b602052600660408520015462007231565b60076040852001551562001e7d576202712e5482526202712b60205260086040832001600260ff1982541617905562001b92815162006032565b6202712e5483526202712b6020526002604084200181519160018060401b03831162001e695760209062001bc784846200624a565b0190845260208420845b83811062001e54578585815b815181101562001c44578062001c3862001bfc62001c3e938562005f16565b516202712e5486526202712b60205262001c1d836002604089200162006135565b90919082549060031b600019811b9283911b16911916179055565b62005ec0565b62001bdd565b50815b815181101562001e50576202712e54928381526202712b60205262001c8462001c77836002604085200162006135565b90549060031b1c62013e1e565b50549162001c928362006032565b92825b81811062001dff5750508182905b845182101562001dcf5762001cb9828662005f16565b5161271081101562001dbb5760031b6001015462001cd8838762005f16565b5161271081101562001da75760031b6006015462001cf691620070e9565b901562001d635762001d089162007231565b91901562001d225762001d1b9062005ec0565b9062001ca3565b60405162461bcd60e51b8152602060048201526019602482015278746f74616c566f74696e67506f776572206f766572666c6f7760381b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f63757272656e74436c617373566f74696e67506f776572206f766572666c6f776044820152fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b85526032600452602485fd5b905062001df9935062001c3891929586526202712b60205262001c1d836005604089200162006135565b62001c47565b62001e4a908785526202712b60205262001e308162001e2962001c7787600260408b200162006135565b5062006135565b90549060031b1c62001e43828862005f16565b5262005ec0565b62001c95565b8280f35b60019060208451940193818401550162001bd1565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152601b60248201527a657865637574696e6720656e642074696d65206f766572666c6f7760281b6044820152606490fd5b60405162461bcd60e51b8152602060048201526018602482015277766f74696e6720656e642074696d65206f766572666c6f7760401b6044820152606490fd5b60019060208451940193818401550162001b03565b634e487b7160e01b87526041600452602487fd5b60019060208451940193818401550162001aac565b60019060208451940193818401550162001a55565b805180518354602083015190916001600160a01b031690602681101562002680576001600160a81b03199092161760a09190911b60ff60a01b161783556040015180518051906001600160401b03821162002445576020600186019162001fbb84846200624a565b01908b5260208b208b5b8381106200266b575050505060208101518051906001600160401b03821162002445576020600286019162001ffb84846200624a565b01908b5260208b208b5b8381106200264d57505050506003830160408201519060208251926200202c8484620065ad565b01908b5260208b20908b905b8382106200262d5750505050606081015180516001600160401b0381116200244557602060048601926200206d838562013f81565b01918b5260208b20908b5b8160051c8110620025f25750601f1981168103620025af575b5050506080810151805190600160401b8211620024455760058501548260058701558083106200252c575b50602001600585018b5260208b20908b905b8382106200250b575050505060a0810151805190600160401b8211620024455760068501548260068701558083106200247a575b50602001600685018b5260208b20908b905b83821062002459575050505060c081015180516001600160401b03811162002445576020600786019262002149838562013f81565b01918b5260208b20908b5b8160051c8110620024075750601f1981168103620023bb575b5050506008830160e08201519060208251926200218b84846200663b565b01908b5260208b20908b905b83821062002358575050505060098301610100820151906020825192620021bf84846200663b565b01908b5260208b20908b905b838210620022d8575050505061012001518051906001600160401b038211620017dd576200220c8262002202600a8701546200555f565b600a87016200692c565b6020908a601f84116001146200225f57928060209360019693600b969262002253575b5050600019600383901b1c191690851b17600a8601555b01920192019190620019fe565b0151905038806200222f565b5090600a85018b5260208b20918b5b601f1985168110620022bf575083602093600196938793600b97601f19811610620022a5575b505050811b01600a86015562002246565b015160001960f88460031b161c1916905538808062002294565b919260206001819286850151815501940192016200226e565b80518051906001600160401b038211620023445760208f91620022fc84886200624a565b019085815260208120905b83811062002326575050505060016020819201930191019091620021cb565b82516001600160a01b03168183015560209092019160010162002307565b634e487b7160e01b8f52604160045260248ffd5b80518051906001600160401b038211620023445760208f916200237c84886200624a565b019085815260208120905b838110620023a657505050506001602081920193019101909162002197565b60019060208451940193818401550162002387565b8b928c5b601f19831683038110620023dd57505060051c01553880806200216d565b90936020620023fd60019284885191620023f7836200418b565b62013feb565b95019101620023bf565b8c8d5b602081106200242157508382015560010162002154565b949060206200243b60019288855191620023f7836200418b565b920195016200240a565b634e487b7160e01b8b52604160045260248bfd5b60066020826200246d600194518762006a8c565b0193019101909162002114565b6006818102048103620024f7576006838102048303620024f757600686018c5260208c208360060281015b8d8360060283018210620024bc5750505062002102565b90816006928255806001830155620024d76002830162006718565b806003830155620024eb600483016200651c565b600582015501620024a5565b634e487b7160e01b8c52601160045260248cfd5b60076020826200251f600194518762013e3f565b01930191019091620020ce565b6007818102048103620024f7576007838102048303620024f757600586018c5260208c208360070281015b8d83600702830182106200256e57505050620020bc565b906007916200257d82620061c7565b806001830155806002830155806003830155806004830155620025a3600583016200651c565b60068201550162002557565b8b928c5b601f19831683038110620025d157505060051c015538808062002091565b90936020620025e860019284885115159162013feb565b95019101620025b3565b8c8d5b602081106200260c57508382015560010162002078565b949060206200262360019288855115159162013feb565b92019501620025f5565b6001602082620026408394518762006976565b0193019101909162002038565b82516001600160a01b03168183015560209092019160010162002005565b60019060208451940193818401550162001fc5565b634e487b7160e01b8c52602160045260248cfd5b600b818102048103620028c257600b848102048403620028c2576001830188526020882084600b0281015b82600b0282018110620026d4575050620019ec565b898155620026e560018201620061c7565b620026f360028201620061c7565b62002701600382016200656e565b62002715600482018054908c815562013f59565b60058101548a60058301558062002853575b5060068101548a600683015580620027d6575b5080620027526007600b93018054908d815562013f59565b6200276060088201620065fc565b6200276e60098201620065fc565b8a600a82016200277f81546200555f565b8062002790575b50505001620026bf565b601f90818111600114620027ab575050555b8a388062002786565b6001620027c89284865260208620920160051c820191016200614e565b8160208120915555620027a2565b60068181020481036200283f57600682018b5260208b20906006028101905b8181106200280457506200273a565b808c600692558c60018201556200281e6002820162006718565b8c600382015562002832600482016200651c565b8c600582015501620027f5565b634e487b7160e01b8b52601160045260248bfd5b60078181020481036200283f57600582018b5260208b20906007028101905b81811062002881575062002727565b806200288f600792620061c7565b8c60018201558c60028201558c60038201558c6004820155620028b5600582016200651c565b8c60068201550162002872565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152601d60248201527f766f74696e6720697320616c726561647920696e2070726f67726573730000006044820152606490fd5b8280fd5b5080fd5b506020366003190112620001dc576004356001600160401b03811162002933576200296790369060040162004861565b805190916001600160a01b0391620029bc908316620029b3620029946200298e3362015052565b62005d89565b620029ac620029a68789511662015052565b62005def565b9062005e46565b90331462005e8d565b9060208301915b8251805182101562002a2a579062001c3862002a249284620029e784339362005f16565b5151161462002a1d620029fe6200298e3362015052565b620029ac620029a68862002a14888c5162005f16565b51511662015052565b9062005e8d565b620029c3565b62002a4e62002a3986620073da565b60405191829160208352602083019062004164565b0390f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac575060031b600181015460028201549162002ac5600562002aa6600684015493620009e960405180948193016200559c565b6040519485948552602085015260806040850152608084019062004164565b9060608301520390f35b5034620001dc5780600319360112620001dc576201388280549062002af48262004034565b9162002b04604051938462004010565b808352602083019184526020842084925b82841062002cc05785856201388380549062002b318262004034565b9362002b41604051958662004010565b82855260208501918152602081209080925b84841062002b895762002b7a8662002a4e896040519384936040855260408501906200431d565b9083820360208501526200431d565b60405162002b978162003f9f565b62002ba760ff855416826200572f565b6001840154602082015260028401805462002bc28162004034565b9162002bd2604051938462004010565b8183528552602080862090869084015b83821062002c5a575050505060019282602092604060069501526003870154606082015260405162002c1d81620009e98160048c016200559c565b608082015260ff6005880154818116151560a0840152818160081c16151560c084015260101c16151560e082015281520193019301929162002b53565b6009602060019260405162002c6f8162003f83565b8654815262002c8b60ff8689015481811662001244816200418b565b62002c9960028801620054ae565b608082015262002cac6003880162005803565b60a082015281520193019101909162002be2565b60405162002cce8162003f9f565b62002cde60ff845416826200572f565b60018084015460208301526002840190815462002cfb8162004034565b9262002d0b604051948562004010565b8184528a526020808b20908b9085015b83821062002d9457505050505060019282602092604060069501526003860154606082015260405162002d5781620009e98160048b016200559c565b608082015260ff6005870154818116151560a0840152818160081c16151560c084015260101c16151560e082015281520192019301929062002b15565b60096020869260405162002da88162003f83565b8654815262002dc460ff8689015481811662001244816200418b565b62002dd260028801620054ae565b608082015262002de56003880162005803565b60a082015281520193019101909162002d1b565b5034620001dc576020366003190112620001dc576020906040906001600160a01b0362002e2562003f20565b1681526201388583522054604051908152f35b5034620001dc576020806003193601126200293357816004359162002e7b4784111562002a1d62002e6986620062a5565b62002e7447620062a5565b9062005f5e565b33825262002ee76201388580835262002ec0604085205486111562002a1d62002ea488620062a5565b33885284875262002eb96040892054620062a5565b9062005fca565b33845280835262002ed68560408620546200626a565b929062002a1d62002ea488620062a5565b3384528252604083208190551562002f2a575b508080809381811562002f20575b3390f11562002f145780f35b604051903d90823e3d90fd5b506108fc62002f08565b90506201388680549162002f3e8362006032565b918593865b8181106200303a57505062002f588462006032565b805192906001600160401b0384116200302657908084939262002f7e8a989796620061a3565b0191865280862090865b84811062003007575050505050825b82811062002fa757505062002efa565b9192509062002ffd9062001c386001600160a01b0362002fc8838662005f16565b511662002fd58362006087565b9080546001600160a01b0360039390931b83811b80199092169390941690931b909216179055565b9084929162002f97565b83516001600160a01b0316818401558997509281019260010162002f88565b634e487b7160e01b88526041600452602488fd5b620030458162006087565b90546001600160a01b03916003913391831b1c83160362003074575b50506200306e9062005ec0565b62002f43565b966200309d9183986200308b6200306e9562006087565b9054911b1c1662001e43828962005f16565b95903862003061565b5034620001dc5780600319360112620001dc576202712680546001600160a01b0319163317905562027129805460ff191660019081179091556040519091908190620030f28162003fd8565b5290620138828054600082558062003400575b5082528180604051620031188162003fd8565b52620033ec5762013883805460008255806200336d575b5082526127106202712a5560405191620031498362003fbc565b818352805b602080821015620031c457604051602092916200316b8262003f83565b84825284818301528460408301526060858184015260809080828501528060405192620031988462003f83565b8184528185850152816040850152818085015283015260a090818301528301528287010152016200314e565b82846200335d87604051620031d98162003fd8565b848152604051620031ea8162003fd8565b858152604051620031fb8162003fd8565b8681526040516200320c8162003fd8565b8781526040516200321d8162003fd8565b888152604051916200322f8362003fd8565b89835260405193620032418562003fd8565b8a855260405195620032538762003f83565b8652602086015260408501526060840152608083015260a0820152604051916200327d8362003f83565b86835260036020840152866040840152866060840152608083015260a0820152620032a88262005ed0565b52620032b48162005ed0565b506200330b604051620032c78162003f9f565b60048152846020820152826040820152856060820152604051620032eb8162003fd8565b86815260808201528460a08201528460c08201528460e082015262006f66565b604051906200331a8262003f9f565b6002825283602083015260408201528360608201526040516200333d8162003fd8565b84815260808201528260a08201528260c08201528360e082015262006fb3565b6113886201388b556201388c5580f35b925060068381029381850403620033d65760009382855260208520908101905b8181106200339d5750506200312f565b80868492558686820155620033b56002820162006718565b866003820155620033c9600482016200651c565b866005820155016200338d565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b82526041600452602482fd5b925060068381029381850403620033d65760009382855260208520908101905b8181106200343057505062003105565b80868492558686820155620034486002820162006718565b8660038201556200345c600482016200651c565b8660058201550162003420565b5034620001dc5780600319360112620001dc576020604051338152f35b5034620001dc5780600319360112620001dc5760206202712d54604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac5762002a4e620034e060048460031b0162005503565b60405191829182620040eb565b5034620001dc5780600319360112620001dc576040516201388180548083529083526020808301937fcd6f7cece5c70f73af31bb8ed8b80ae1c2a9e5eb261bd5ab2d9374b0c38719c892915b828210620035545762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003539565b5034620001dc5760209081600319360112620001dc576040906200359862003f20565b8160608451620035a88162003f51565b82815286810183905285810182905201526001600160a01b031681526201388083522060405190620035da8262003f51565b6200365581549160ff83161515845260ff8585019360081c161515835260026040519162003619836200361181600185016200559c565b038462004010565b6040860192835201549260608501938452604051958695818752511515908601525115156040850152516080606085015260a084019062004164565b905160808301520390f35b5034620001dc5780600319360112620001dc5760206202712e54604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac576020620036cb620036c3846200043260028260031b0154916200716f565b91906200701f565b604051908152f35b5034620001dc5780600319360112620001dc576201388b5462003730620036f962014b3d565b916200370b6127109384831062005e8d565b620037256201388e546201388c54111562002a1d62014bab565b6201388d54620070e9565b90506200373c62014c01565b50825b82811062003762575b60206200375885858504620072bf565b9050604051908152f35b909260ff60078360031b01541615620037ac578162003796620037a2926200378f62001c3896956200708c565b9062007231565b949062002a1d62014c01565b929091926200373f565b929062003748565b5034620001dc576020366003190112620001dc576020620037d760043562014153565b620037e6604051809262004131565bf35b5034620001dc576020806003193601126200293357600435620038174782111562002a1d62002e6984620062a5565b3383528280808062013887948587526200385d604083205482111562002a1d6200384184620062a5565b338652898b52620038566040872054620062a5565b906200641f565b3382528587526200389d620038778260408520546200626a565b919062002a1d6200388885620062a5565b3387528a8c52620038566040882054620062a5565b3383528688526040832055818115620039f2575b3390f115620039e7573383528152604082205415620038ce575080f35b62013888805491620038e08362006032565b918493855b8181106200398d575050620038fa8462006032565b805192906001600160401b03841162001f155781906200391a8562006167565b0191865280862090865b84811062003971575050505050825b828110620039415750505080f35b6200396b9062001c386001600160a01b036200395e838662005f16565b511662002fd5836200606a565b62003933565b83516001600160a01b0316838201559281019260010162003924565b62003998816200606a565b90546001600160a01b03916003913391831b1c831603620039c7575b5050620039c19062005ec0565b620038e5565b96620039de9183986200308b620039c1956200606a565b959038620039b4565b6040513d84823e3d90fd5b506108fc620038b1565b5034620001dc5780600319360112620001dc576040516201388680548083529083526020808301937f4b58a51c867b7b693aaefb0acd6b55f4e7286e8436d34ab3cc63a1f2bfa35aa492915b82821062003a635762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003a48565b5034620001dc576040366003190112620001dc576004356024356001600160a01b038116908190036200292f5761271082101562003ad6579160036040926020948352811b0183522054604051908152f35b634e487b7160e01b83526032600452602483fd5b5034620001dc5780600319360112620001dc576040516201388880548083529083526020808301937ff9ab3ee50aab7a7cf5b7d30204dd21b5da7cc33690a7aec17b3653a822a635df92915b82821062003b515762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003b36565b5034620001dc5780600319360112620001dc57602060ff6202712954166040519062003b9e81620040ca565b8152f35b5034620001dc576040366003190112620001dc5762003bc062003f20565b60249081356001600160401b03811162003efc5762003be49036906004016200405a565b91600260ff62027129541662003bfa81620040ca565b0362003ebc576202712d5442101562003e7e5760018060a01b0382168085526202712c92602093808552604087206202712e91825491828a52875260ff60408a20541662003e4057875194828a526202712b95868952600260408c2001540362003dda578952865260408820908852855260408720956001968760ff198254161790558688905b62003c8a578880f35b815181101562003dd65762003ca0818362005f16565b511562003d50578254808a5285885262003cf58862001c1d848d60406003918c62003ce78d6200378f8762003cda81898989200162006135565b905490891b1c9262013fff565b979099835252200162006135565b1562003d0d5762003d069062005ec0565b8762003c81565b60405162461bcd60e51b815260048101889052601c818801527b766f74696e6720666f7220706f776572596573206f766572666c6f7760201b6044820152606490fd5b8254808a5285885262003d838862001c1d848d60406003918c62003ce78d6200378f8762003cda81898989200162006135565b1562003d945762003d069062005ec0565b60405162461bcd60e51b815260048101889052601b818801527a766f74696e6720666f7220706f7765724e6f206f766572666c6f7760281b6044820152606490fd5b8880f35b60405162461bcd60e51b8152600481018990526039818901527f746865206e756d626572206f6620766f74657320646f6573206e6f74206d6174604482015278636820746865206e756d626572206f6620706f6c696369657360381b6064820152608490fd5b60405162461bcd60e51b815260048101889052601781880152761d9bdd195c881a185cc8185b1c9958591e481d9bdd1959604a1b6044820152606490fd5b60649060176040519162461bcd60e51b835260206004840152820152761d9bdd1a5b99c81c195c9a5bd9081a185cc8195b991959604a1b6044820152fd5b60649060196040519162461bcd60e51b83526020600484015282015278766f74696e67206973206e6f7420696e2070726f677265737360381b6044820152fd5b8380fd5b905034620029335781600319360112620029335760209062027127548152f35b600435906001600160a01b038216820362003f3757565b600080fd5b35906001600160a01b038216820362003f3757565b608081019081106001600160401b0382111762003f6d57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111762003f6d57604052565b61010081019081106001600160401b0382111762003f6d57604052565b604081019081106001600160401b0382111762003f6d57604052565b602081019081106001600160401b0382111762003f6d57604052565b606081019081106001600160401b0382111762003f6d57604052565b601f909101601f19168101906001600160401b0382119082101762003f6d57604052565b6001600160401b03811162003f6d5760051b60200190565b3590811515820362003f3757565b81601f8201121562003f3757803591620040748362004034565b9262004084604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b828210620040b0575050505090565b838091620040be846200404c565b815201910190620040a1565b60041115620040d557565b634e487b7160e01b600052602160045260246000fd5b6020908160408183019282815285518094520193019160005b82811062004113575050505090565b83516001600160a01b03168552938101939281019260010162004104565b906003821015620040d55752565b60005b838110620041535750506000910152565b818101518382015260200162004142565b906020916200417f815180928185528580860191016200413f565b601f01601f1916010190565b60051115620040d557565b90815180825260208080930193019160005b828110620041b7575050505090565b835185529381019392810192600101620041a8565b90815180825260208080930193019160005b828110620041ed575050505090565b83516001600160a01b031685529381019392810192600101620041de565b908082519081815260208091019281808460051b8301019501936000915b8483106200423a5750505050505090565b90919293949584806200425a600193601f198682030187528a5162004164565b980193019301919493929062004229565b90815180825260208092019182818360051b82019501936000915b848310620042975750505050505090565b9091929394958480620042b383856001950387528a5162004196565b980193019301919493929062004286565b90815180825260208092019182818360051b82019501936000915b848310620042f05750505050505090565b90919293949584806200430c83856001950387528a51620041cc565b9801930193019194939290620042df565b9060208251918281520190819060208160051b84019401926000905b8282106200434957505050505090565b9091929394818103855285519061010080820183516006811015620040d557835260208401516020840152604084015191604084015281518091526101206020818501918360051b86010193019160005b818110620044045750505050600192602092620043d0849360608085015190840152608080850151908483039085015262004164565b9160a08082015115159083015260c08082015115159083015260e08091015115159101529701950192019092919262004339565b9091929361011f9c9b9c198682030184528451908151815260208201516200442c816200418b565b602082015260408201516200444181620040ca565b60408201526060820151603d811015620040d557606082015260a062004477608084015160c0608085015260c084019062004196565b9201519060a081840391015260a0620044f6620044e3620044d0620044bd620044aa865160c0895260c089019062004196565b602087015188820360208a0152620041cc565b604086015187820360408901526200420b565b606085015186820360608801526200426b565b60808401518582036080870152620042c4565b9101519160a081830391015281519081815260208101906020808460051b8301019401926000915b818310620045435750505050506020806001929e9d9e9601940191019190916200439a565b909192939460208062004563600193601f1986820301895289516200420b565b97019501930191906200451e565b81601f8201121562003f37578035916200458b8362004034565b926200459b604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b828210620045c7575050505090565b81358152908301908301620045b8565b81601f8201121562003f3757803591620045f18362004034565b9262004601604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b8282106200462d575050505090565b8380916200463b8462003f3c565b8152019101906200461e565b6001600160401b03811162003f6d57601f01601f191660200190565b929192620046718262004647565b9162004681604051938462004010565b82948184528183011162003f37578281602093846000960137010152565b9080601f8301121562003f3757816020620046bd9335910162004663565b90565b9080601f8301121562003f3757813590620046db8262004034565b92620046eb604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b8483106200471b5750505050505090565b82356001600160401b03811162003f375786916200473f848480948901016200469f565b8152019201916200470a565b9080601f8301121562003f3757813590620047668262004034565b9262004776604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b848310620047a65750505050505090565b82356001600160401b03811162003f37578691620047ca8484809489010162004571565b81520192019162004795565b9080601f8301121562003f3757813590620047f18262004034565b9262004801604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b848310620048315750505050505090565b82356001600160401b03811162003f375786916200485584848094890101620045d7565b81520192019162004820565b91908260409181610360528061040052031262003f375760408051929083016001600160401b0381118482101762003f6d57604052620048a2839162003f3c565b83526103605160208101356104808190526001600160401b03811162003f375761040051910190601f8201121562003f37573591620048e18362004034565b620048f0604051918262004010565b8381526020810161032052610400516104805161036051019060208660051b8301011162003f3757602090959392949501915b61048051610360510160208760051b820101841015620054a2578335906001600160401b03821162003f37578181016103c0526060601f198383016104005103011262003f37576040516103e08190529160608301906001600160401b0382118483101762004ca9576200499f92602092604052010162003f3c565b905260406103c0510135602681101562003f37576103e051602001526103c05160608101356103408190526001600160401b031062003f375761040051610140606083013583018203601f19011262003f375760405161046081905261014081019081106001600160401b0382111762004ca9576040526060820135820160200135916001600160401b03831162003f375762004a4792816060602093013501010162004571565b6104605152610340516103c051016040810135906001600160401b03821162003f3757602062004a7e9261040051920101620045d7565b6104605160200152610340516103c051016001600160401b0360608201351162003f37576104005162004aba91606081013501602001620046c0565b6104605160400152610340516103c051016080810135906001600160401b03821162003f3757602062004af492610400519201016200405a565b6104605160600152610340516103c05101936001600160401b0360a08601351162003f375761040051603f60a0870135870101121562003f375762004b43602060a08701358701013562004034565b9562004b53604051978862004010565b60a0860135808701602090810135808a5261040051610340516103c051938c01989493019092019160059190911b82016040011162003f3757604001945b610340516103c0510160a08901359081019089016020013560051b810160400187101562004cbe578635906001600160401b03821162003f37570190610400519060e09182603f19858303011262003f3757604051908382016001600160401b0381118382101762004ca9576040908152850135906001600160401b03821162003f3757604062004c259287010162004571565b8152606084013560208201526080840135604082015260a0840135606082015260c09262004c558486016200404c565b6080830152840135926001600160401b03841162003f375762004c9961010060209662004c8d8897604061040051918401016200469f565b60a0860152016200404c565b9082015281520195019462004b91565b60246000634e487b7160e01b81526041600452fd5b5050949793509450946080610460510152610340516103c0510160c08101356104e05260018060401b0360c08201351162003f3757610400519060c08101350190603f8201121562003f375762004d22602062004d30920135806104205262004034565b604051806103005262004010565b61030051610420519052602061030051016103a052610400516104205160051b9060406104e051610340516103c0510101928301011162003f37576040016103805292939092905b6104205160051b6104e051610340516103c05101019060406103805191830101811015620052bc5780356104c08190526001600160401b031062003f3757610100603f19823584016104005103011262003f3757604051610440819052916101008301916001600160401b0383118484101762004ca95760409283523501013590600682101562003f37575260606104c0516104e051610340516103c051010101013560206104405101526104c0516104e051610340516103c0510101019460018060401b0360808701351162003f375761040051605f6080880135880101121562003f375762004e8562004e77604060808901358901013562004034565b604051806104a05262004010565b6104a08051608088013580890160400135918290529151610400516104c0516104e051610340516103c0516020959095019a96940101019091019160051b82016060011162003f3757606001945b6104c0516104e051610340516103c05101010160808901359081019089016040013560051b8101606001871015620051a3578635906001600160401b03821162003f375701605f1960c081836104005103011262003f37576040519162004f3a8362003f83565b606081013583526080810135600581101562003f3757602084015260a0810135600481101562003f3757604084015260c0810135603d81101562003f3757606084015260e08101356001600160401b03811162003f37576104005162004fa591830160600162004571565b6080840152610100810135916001600160401b03831162003f375760c0908383016104005103011262003f37576040519162004fe18362003f83565b818101606001356001600160401b03811162003f3757610400516200500d918484010160600162004571565b8352818101608001356001600160401b03811162003f3757610400516200503b9184840101606001620045d7565b602084015281810160a001356001600160401b03811162003f3757610400516200506c9184840101606001620046c0565b604084015281810160c001356001600160401b03811162003f3757610400516200509d91848401016060016200474b565b60608401526001600160401b0382820160e001351162003f375761040051620050d29083830160e081013501606001620047d6565b60808401528181016101000135906001600160401b03821162003f37576104005192010190607f8201121562003f3757606081013590620051138262004034565b9162005123604051938462004010565b80835260208301916080610400519260051b82010191821162003f375760808101925b8284106200516d575050505060a08083019190915282015281526020958601950162004ed3565b83356001600160401b03811162003f375760209162005197839260806104005191870101620046c0565b81520193019262005146565b5050935093919094506104a051604061044051015260a06104c0516104e051610340516103c051010101013560606104405101526104c0516104e051610340516103c05101010160c08101359060018060401b03821162003f375760406200521292610400519201016200469f565b608061044051015260e06200523b816104c0516104e051610340516103c051010101016200404c565b60a0610440510152620052646101006104c0516104e051610340516103c051010101016200404c565b60c06104405101526200528d6101206104c0516104e051610340516103c051010101016200404c565b90610440510152610440516103a0515260206103a051016103a052602061038051016103805290929362004d78565b5050610300516104605160a00152610340516103c05193969495929301906001600160401b0360e08301351162003f3757610400519560e0830135830196603f8801121562003f375762005314602088013562004034565b9462005324604051968762004010565b60208881013580885261040051610340516103c051938a0198930160e0880135019160051b82016040011162003f3757604001955b604060208b013560051b60e0880135610340516103c05101010101871015620053985760058735101562003f3757863581526020968701960162005359565b509592989450959250955060c0610460510152610340516103c0510160018060401b036101008201351162003f375761040051620053e091610100810135016020016200474b565b6104605160e00152610340516103c051016001600160401b036101208201351162003f3757610400516200541e9161012081013501602001620047d6565b610460516101000152610340516103c05101610140810135906001600160401b03821162003f37570190610400519182603f8201121562003f3757602092816040856200546f940135910162004663565b6101206104605101526104605160406103e05101526103e051610320515281610320510161032052019193949262004923565b50945091602091500152565b9060405191828154918282526020928383019160005283600020936000905b828210620054e857505050620054e69250038362004010565b565b855484526001958601958895509381019390910190620054cd565b9060405191828154918282526020928383019160005283600020936000905b8282106200553b57505050620054e69250038362004010565b85546001600160a01b03168452600195860195889550938101939091019062005522565b90600182811c9216801562005591575b60208310146200557b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200556f565b9060009291805491620055af836200555f565b918282526001938481169081600014620056165750600114620055d3575b50505050565b90919394506000526020928360002092846000945b83861062005601575050505001019038808080620055cd565b805485870183015294019385908201620055e8565b9294505050602093945060ff191683830152151560051b01019038808080620055cd565b908154620056488162004034565b926040936200565a8551918262004010565b828152809460208092019260005281600020906000935b8585106200568157505050505050565b600184819284516200569981620009e9818a6200559c565b81520193019401939162005671565b60405190919060e081016001600160401b0381118282101762003f6d5760405260c060ff60068395620056db81620054ae565b855260018101546020860152600281015460408601526003810154606086015282600482015416151560808601526040516200572081620009e981600586016200559c565b60a08601520154161515910152565b6006821015620040d55752565b603d821015620040d55752565b908154620057578162004034565b9262005767604051948562004010565b818452600090815260208082208186015b84841062005787575050505050565b60018381926200579785620054ae565b81520192019301929062005778565b908154620057b48162004034565b92620057c4604051948562004010565b818452600090815260208082208186015b848410620057e4575050505050565b6001838192620057f48562005503565b815201920193019290620057d5565b9060405191620058138362003f83565b826200581f82620054ae565b8152600160056200583282850162005503565b936020948585015262005848600282016200563a565b60408501526200585b6003820162005749565b60608501526200586e60048201620057a6565b608085015201805490620058828262004034565b9462005892604051968762004010565b82865260009182528082208187015b848410620058b55750505050505060a00152565b85838192620058c4856200563a565b815201920193019290620058a1565b906020604082019260018060a01b0381511683520151916040602083015282518091526060820190602060608260051b8501019401926000905b8282106200591d57505050505090565b9091929394605f19828203018552855160018060a01b0381511682526020810151906026821015620040d557604091602084015201519060606040820152620059ab620059946200597d845161014060608601526101a085019062004196565b6020850151848203605f19016080860152620041cc565b6040840151838203605f190160a08501526200420b565b606083015190605f198382030160c0840152602080835192838152019201906000905b80821062005d6e57505050608083015190605f198382030160e0840152815180825260208201906020808260051b85010194019260005b82811062005cea57505050505060a083015190605f1983820301610100840152815190818152602081016020808460051b8401019401926000925b81841062005b0d57505050505060c083015190605f1983820301610120840152602080835192838152019201906000905b80821062005ae95750505062005adb8360209361012062005ac462005aab879660e060019a0151605f19868303016101408701526200426b565b610100850151848203605f1901610160860152620042c4565b92015190610180605f198285030191015262004164565b97019501939201906200590d565b909192602080600192865162005aff816200418b565b815201940192019062005a71565b9091929394601f9d9c9d1982820301845285519081516006811015620040d55781526020820151602082015260408201516101006040830152610100820181518091526101206020818501918360051b8601019301916000905b80821062005bd257505050509d9e9d8260209260e08062005ba286956060600199015160608601526080860151858203608087015262004164565b9360a0810151151560a085015260c0810151151560c0850152015115159101529701940194019293919062005a40565b9091929361011f1986820301845284519081518152602082015162005bf7816200418b565b6020820152604082015162005c0c81620040ca565b60408201526060820151603d811015620040d557606082015260a062005c42608084015160c0608085015260c084019062004196565b9201519060a081840391015260a062005c75620044e3620044d0620044bd620044aa865160c0895260c089019062004196565b9101519160a0818303910152815180825260208201906020808260051b8501019401926000915b80831062005cbc5750505050506020806001929601940192019062005b67565b909192939460208062005cdc600193601f1987820301895289516200420b565b970195019301919062005c9c565b9091929394602080600192601f1986820301885288519060c08062005d5862005d1d855160e0865260e086019062004196565b8686015187860152604086015160408601526060860151606086015260808601511515608086015260a086015185820360a087015262004164565b9301511515910152970195019392910162005a05565b909192602080600192865115158152019401920190620059ce565b90620054e6604560405180947f496e76616c69642070726f6772616d20616464726573732e204d73672e73656e60208301526403232b91d160dd1b604083015262005dde81518092602086860191016200413f565b810103602581018552018362004010565b90620054e66040805180947f2c20616e642070726f6772616d206f70657261746f7220616464726573733a20602083015262005e3581518092602086860191016200413f565b810103602081018552018362004010565b6020620054e691939293604051948162005e6a87935180928680870191016200413f565b820162005e80825180938680850191016200413f565b0103808552018362004010565b1562005e965750565b60405162461bcd60e51b81526020600482015290819062005ebc90602483019062004164565b0390fd5b6000198114620033d65760010190565b80511562005ede5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101562005ede5760400190565b80516002101562005ede5760600190565b805182101562005ede5760209160051b010190565b7f496e76616c696420776974686472617720616d6f756e742e20416d6f756e743a8152600160fd1b602082015260210190565b600f620054e6916020949360405195869262005f8e62005f8083860162005f2b565b91828151948592016200413f565b016e0161030b732103130b630b731b29d1608d1b815262005fb982518093602087850191016200413f565b010360101981018552018362004010565b6019620054e6916020949360405195869262005fec62005f8083860162005f2b565b01780161030b732103bb4ba34323930bbb0b136329031b0b9b41d1603d1b81526200602182518093602087850191016200413f565b010360061981018552018362004010565b906200603e8262004034565b6200604d604051918262004010565b828152809262006060601f199162004034565b0190602036910137565b62013888805482101562005ede5760005260206000200190600090565b62013886805482101562005ede5760005260206000200190600090565b62013881805482101562005ede5760005260206000200190600090565b6202711d805482101562005ede5760005260206000200190600090565b6201388a805482101562005ede5760005260206000200190600090565b62027119805482101562005ede5760005260206000200190600090565b6202711b805482101562005ede5760005260206000200190600090565b805482101562005ede5760005260206000200190600090565b8181106200615a575050565b600081556001016200614e565b600160401b811162003f6d5762013888908154908083558181106200618b57505050565b620054e692600052602060002091820191016200614e565b600160401b811162003f6d5762013886908154908083558181106200618b57505050565b80546000825580620061d7575050565b620054e6916000526020600020908101906200614e565b600160401b811162003f6d5762027119908154908083558181106200618b57505050565b600160401b811162003f6d576202711b908154908083558181106200618b57505050565b6201389180546000825580620061d7575050565b90600160401b811162003f6d578154908083558181106200618b57505050565b91908281116200627b576001920390565b50600091508190565b81156200628f570490565b634e487b7160e01b600052601260045260246000fd5b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8082101562006410575b506904ee2d6d415b85acef8160201b8083101562006400575b50662386f26fc1000080831015620063f0575b506305f5e10080831015620063e0575b5061271080831015620063d0575b506064821015620063bf575b600a80921015620063b4575b60019081602181860195620063418762004647565b9662006351604051988962004010565b80885262006362601f199162004647565b01366020890137860101905b6200637b575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215620063ae579190826200636e565b62006374565b91600101916200632c565b919060646002910491019162006320565b6004919392049101913862006314565b6008919392049101913862006306565b60109193920491019138620062f6565b60209193920491019138620062e3565b604093508104915038620062ca565b601e620054e691602094936040519586926200644162005f8083860162005f2b565b017f2c20616e6420776974686472617761626c65206469766964656e64733a20000081526200647a82518093602087850191016200413f565b010360011981018552018362004010565b90620064978262004034565b604090620064a88251918262004010565b8381528093620064bb601f199162004034565b019160005b838110620064ce5750505050565b6020908251620064de8162003f9f565b6000815282600081830152606080868401526000818401526080830152600060a0830152600060c0830152600060e0830152828601015201620064c0565b6200652881546200555f565b908162006533575050565b81601f6000931160011462006546575055565b818352602083206200656491601f0160051c8101906001016200614e565b8160208120915555565b80549060008155816200657f575050565b6000526020600020908101905b81811062006598575050565b80620065a66001926200651c565b016200658c565b90600160401b811162003f6d57815491818155828210620065cd57505050565b600052602060002091820191015b818110620065e7575050565b80620065f56001926200651c565b01620065db565b80549060008155816200660d575050565b6000526020600020908101905b81811062006626575050565b8062006634600192620061c7565b016200661a565b90600160401b811162003f6d578154918181558282106200665b57505050565b600052602060002091820191015b81811062006675575050565b8062006683600192620061c7565b0162006669565b80549060008155816200669b575050565b6000526020600020908101905b818110620066b4575050565b80620066c26001926200656e565b01620066a8565b90600160401b811162003f6d57815491818155828210620066e957505050565b600052602060002091820191015b81811062006703575050565b80620067116001926200656e565b01620066f7565b80546000808355816200672a57505050565b6009928284029284840403620067c757815260208120918201915b828110620067535750505050565b80828592558260018201556200676c60028201620061c7565b6200677a60038201620061c7565b6200678860048201620061c7565b62006796600582016200656e565b620067a460068201620065fc565b620067b260078201620065fc565b620067c0600882016200668a565b0162006745565b634e487b7160e01b82526011600452602482fd5b600160401b821162003f6d57805490828155818310620067fa57505050565b6009928284029284840403620033d6578084029084820403620033d65760009182526020822092830192015b828110620068345750505050565b80828592558260018201556200684d60028201620061c7565b6200685b60038201620061c7565b6200686960048201620061c7565b62006877600582016200656e565b6200688560068201620065fc565b6200689360078201620065fc565b620068a1600882016200668a565b0162006826565b516006811015620040d55790565b906006811015620040d55760ff80198354169116179055565b90620068db816200418b565b60ff80198354169116179055565b90620068f581620040ca565b61ff0082549160081b169061ff001916179055565b90603d811015620040d55762ff000082549160101b169062ff00001916179055565b9190601f81116200693c57505050565b620054e6926000526020600020906020601f840160051c830193106200696b575b601f0160051c01906200614e565b90915081906200695d565b81519192916001600160401b03811162003f6d57620069a2816200699b84546200555f565b846200692c565b602080601f8311600114620069e1575081929394600092620069d5575b50508160011b916000199060031b1c1916179055565b015190503880620069bf565b90601f198316958460005282600020926000905b88821062006a305750508360019596971062006a16575b505050811b019055565b015160001960f88460031b161c1916905538808062006a0c565b80600185968294968601518155019501930190620069f5565b9060ff801983541691151516179055565b9061ff00825491151560081b169061ff001916179055565b9062ff0000825491151560101b169062ff00001916179055565b81516006811015620040d55762006aa49082620068b6565b60208201516001820155600281016040830151602081519162006ac88385620067db565b01916000526020600020916000905b82821062006b3b57505050509060e06005620054e6936060840151600382015562006b0a60808501516004830162006976565b019162006b1e60a082015115158462006a49565b62006b3060c082015115158462006a5a565b015115159062006a72565b8051805185556001850162006b60602083015162006b59816200418b565b82620068cf565b62006b7b604083015162006b7481620040ca565b82620068e9565b6060820151603d811015620040d55762006b95916200690a565b60808101518051906001600160401b03821162003f6d5760209062006bbe8360028a016200624a565b0160028701600052602060002060005b83811062006ecd575050505060a0015180518051906001600160401b03821162003f6d576020600388019162006c0584846200624a565b0190600052602060002060005b83811062006eb8575050505060208101518051906001600160401b03821162003f6d576020600488019162006c4884846200624a565b0190600052602060002060005b83811062006e9a575050505060058501604082015190602082519262006c7c8484620065ad565b01906000526020600020906000905b83821062006e7a5750505050600685016060820151602081519162006cb183856200663b565b019160005260206000206000925b82841062006e165750505050600785016080820151602081519162006ce583856200663b565b019160005260206000206000925b82841062006da9575050505060a06008860191015190602082519262006d1a8484620066c9565b01906000526020600020906000905b83821062006d495750505050600960206001920194019101909262006ad7565b8051602081519162006d5c8387620065ad565b018460005260206000206000915b83831062006d8957505050506001602081920193019101909162006d29565b600160208262006d9c8394518662006976565b0192019201919062006d6a565b80518051906001600160401b03821162003f6d5760209062006dcc83866200624a565b0183600052602060002060005b83811062006df857505050506001602081920192019301929062006cf3565b82516001600160a01b03168183015560209092019160010162006dd9565b80518051906001600160401b03821162003f6d5760209062006e3983866200624a565b0183600052602060002060005b83811062006e6557505050506001602081920192019301929062006cbf565b60019060208451940193818401550162006e46565b600160208262006e8d8394518762006976565b0193019101909162006c8b565b82516001600160a01b03168183015560209092019160010162006c55565b60019060208451940193818401550162006c12565b60019060208451940193818401550162006bce565b62013883805482101562005ede576000526006602060002091020190600090565b62027116805482101562005ede576000526006602060002091020190600090565b62013882805482101562005ede576000526006602060002091020190600090565b62027115805482101562005ede576000526006602060002091020190600090565b620138828054600160401b81101562003f6d5762006f8a9160018201905562006f24565b91909162006f9d57620054e69162006a8c565b634e487b7160e01b600052600060045260246000fd5b620138838054600160401b81101562003f6d5762006f8a9160018201905562006ee2565b620271168054600160401b81101562003f6d5762006f8a9160018201905562006f03565b620271158054600160401b81101562003f6d5762006f8a9160018201905562006f45565b156200702757565b60405162461bcd60e51b815260206004820152603760248201527f73756d4469766964656e64576569676874466f72546f6b656e436c6173733a206044820152766469766964656e64576569676874206f766572666c6f7760481b6064820152608490fd5b61271081101562005ede57620036c381620004326002620046bd9460031b0154916200716f565b908115620070e0576064620070cc818402938462006284565b03620070d85760019190565b600091508190565b60019150600090565b919082156200710157620070cc818402938462006284565b5060019150600090565b156200711357565b60405162461bcd60e51b815260206004820152602e60248201527f746f74616c546f6b656e73506572546f6b656e436c6173733a20746f74616c5460448201526d6f6b656e73206f766572666c6f7760901b6064820152608490fd5b612710811015908162005ede57600390811b906004928383019182549260009582879601935b858710620071a7575050505050505090565b9796909192939495976200720957620071fd88620071f5620071cf62001c389a9b8762006135565b905490881b1c6001600160a01b0316600090815260208990526040812054909462007231565b99906200710b565b95949392919062007195565b603282634e487b7160e01b6000525260246000fd5b9060018201918210620070d85760019190565b91908201918210620070d85760019190565b6201388b5462007256620036f962014b3d565b9190506200726362014c01565b5060009081925b81841062007285575b62007280935004620072bf565b905090565b9160ff60078560031b01541615620072b8578362003796620072b1926200378f62001c3896976200708c565b926200726a565b9162007273565b908015620072d757620072d29162006284565b600191565b5050600090600090565b62013891805490600160401b82101562003f6d576001820180825582101562005ede576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b6201388f805490600160401b82101562003f6d576001820180825582101562005ede576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b6201388180549190600160401b83101562003f6d578262002fd5916001620054e695019055620060a4565b60405190620073b38262003fbc565b60188252772a343290383937b3b930b69034b99032bc32b1baba32b21760411b6020830152565b600091825b6020808401908151805187101562007570578162007402886200740a9362005f16565b510162007b47565b60269283821015620040d557601a918203620074c857876200742d915162005f16565b51928284015190811015620040d5570362007486575093620074776200747f926200746f6200746860e0604062001c389a0151015162005ed0565b5162005ed0565b519062007231565b959062007b55565b92620073df565b6064906040519062461bcd60e51b82526004820152601b60248201527a2a34329037b831b7b2329034b9903737ba102820acafa1a0a9a41760291b6044820152fd5b92919050620074e1816200740289869a979a5162005f16565b82811015620040d5576014036200751a575050906200747762001c38956200378f62007513846200747f965162005f16565b5162007ba2565b6200752c906200740285855162005f16565b90811015620040d5576015146200754a575b506200747f9062005ec0565b906200747762007569956200378f62007513846200747f965162005f16565b906200753e565b505050909250803410600014620075e65760405162461bcd60e51b815260206004820152603760248201527f546865207061796d656e74206973206e6f7420656e6f7567682e205468652074604482015276037ba30b6103830bcb6b2b73a1039b437bab6321031329604d1b6064820152608490fd5b803411620079bc575b5062027129805460ff81166200760581620040ca565b600181036200763b57505050806200762b62007625620076319362007c49565b62007c5e565b62007ce8565b620046bd620073a4565b6200764681620040ca565b600281148080620079ae575b15620077375750505050620076678162007c49565b15620076f857620076788162007c49565b15620076bc57620076899062007ce8565b604051620076978162003fbc565b60158152742a3432903b37ba329034b99032bc32b1baba32b21760591b602082015290565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74652070726f6772616d60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527624b73b30b634b2103b37ba34b73390383937b3b930b69760491b6044820152606490fd5b6200774282620040ca565b60038214918280620079a0575b156200782d575050505050620077658162007c49565b15620077dd57806200762b620076256200777f9362007c49565b6040516200778d8162003ff4565b603a81527f5468652070656e64696e672070726f6772616d2069732065786563757465642060208201527930b33a32b9103b37ba34b7339030b7321030b8383937bb30b61760311b604082015290565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420657865637574696e672070656e64696e672070726f677261604482015261369760f11b6064820152608490fd5b6200783881620040ca565b818062007991575b8062007983575b15620078715750505050906200763191600360ff198254161790556200762b620076258262007c49565b6200787c81620040ca565b82156200796e575b5050806200795f575b620078c657505050604051620078a38162003fbc565b6013815272283937b3b930b6903a32b936b4b730ba32b21760691b602082015290565b60ff19166001179055620078da8162007c49565b15620078f457806200762b62007625620076319362007c49565b60405162461bcd60e51b815260206004820152603e60248201527f5b4572726f72203030335d5468652070726f6772616d206973206e6f7420612060448201527f76616c696420657865637574652070656e64696e672070726f6772616d2e00006064820152608490fd5b5062027128544210156200788d565b6200797b919250620040ca565b388062007884565b506202712854421062007847565b50620271275442101562007840565b50620271285442106200774f565b506202712754421062007652565b60018060a01b0390818351166000526201388590816020526040600020541562007ab3575b620079ed90346200626a565b901562007a6f5762007a1090838551166000528260205260406000205462007231565b92901562007a2e5783511660005260205260406000205538620075ef565b60405162461bcd60e51b81526020600482015260196024820152782a3432903732bb903130b630b731b29037bb32b9333637bb9760391b6044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527b2a3432903830bcb6b2b73a103932ba3ab9371037bb32b9333637bb9760211b6044820152606490fd5b6000908162013886928354915b82811062007b0c575b501562007ada575b509050620079e1565b85518516600160401b82101562003f6d5762002fd582620079ed95600162007b059501905562006087565b3862007ad1565b8662007b188262006087565b919054818b51169260031b1c161462007b3c5762007b369062005ec0565b62007ac0565b505060013862007ac9565b516026811015620040d55790565b1562007b5d57565b60405162461bcd60e51b815260206004820152601f60248201527f54686520746f74616c207061796d656e7420697320746f6f206c617267652e006044820152606490fd5b6000805b604083019060e062007bbc818451015162005ef4565b515184101562007c415762007be18462007bda838651015162005ef4565b5162005f16565b51925101519283516002101562005ede5762007c3062007c2a62007c389362007c2260409662007c1a86606062001c389b015162005f16565b5190620070e9565b929062007b55565b62007231565b949062007b55565b91905062007ba6565b509250505090565b60200151511562007c5957600190565b600090565b1562007c6657565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642070726f6772616d60881b6044820152606490fd5b60809060208152602a60208201527f5468652070726f6772616d2069732064656e6965642062792074686520706c7560408201526967696e2073797374656d60b01b60608201520190565b62007cf38162011e7e565b51620118f3576006811015620040d557600381146201189a578062007d505760405162461bcd60e51b8152602060048201526016602482015275151a19481c1c9bd9dc985b481a5cc81a5b9d985b1a5960521b6044820152606490fd5b600481036200a4bf5750906000905b602083015180518310156200a4b9578262007d7a9162005f16565b5160208101805160269081811015620040d557156200a47657815181811015620040d55760010362007fc957505060408091019062007dbf6101008351015162005ed0565b519262007de160e062007dd6818651015162005ed0565b519451015162005ef4565b519562007df285518551146201314c565b62007e018551885114620131b2565b60005b855181101562007f475762007e1a818662005f16565b51612710908181101562005ede57600160ff600762007e429360031b01541615151462013214565b62007e4e828a62005f16565b5162007e5b838862005f16565b51908282101562005ede57600662007e799260031b01549062007231565b9062007e86848962005f16565b51918383101562005ede57600662007ea39360031b01556201326c565b62007eaf828a62005f16565b519062007ebd838862005f16565b518181101562005ede576001600160a01b03939262007efd916003908662007ee6878e62005f16565b5116600052811b0160205287600020549062007231565b62007f09848a62005f16565b519283101562005ede57600362001c389362007f419662007f2b878e62005f16565b5116600052811b016020528760002055620132cb565b62007e04565b50939262007f649192965062007f5d9062014a3f565b9262014923565b94519262007f728462003fd8565b60008452600036813760005b835181101562007fac578062001c3862007f9d62007fa6938762005f16565b51878a6201424f565b62007f7e565b509450926020925062007fc0915062005ec0565b91905062007d5f565b815181811015620040d5576002036200826d575050604080910180519282840151956200801b62007fff60e08097015162005ed0565b519562008010818651015162005ef4565b519451015162005f05565b519387518651036200821a578751845103620081c65787518551036200816f575060005b8551811015620081595762008055818762005f16565b5190612710918281101562005ede576200807b60ff6007809360031b0154161562013324565b62008087828962005f16565b518381101562005ede5760031b01805460ff19166001179055620080ac818a62005f16565b51620080b9828962005f16565b51908382101562005ede576005620080d59260031b0162006976565b620080e1818662005f16565b51620080ee828962005f16565b518381101562005ede5760031b600101556200810b818762005f16565b5162008118828962005f16565b518381101562005ede5760031b6002015562008135818862005f16565b519182101562005ede5760006006620081539360031b015562005ec0565b6200803f565b5095509390506020925062007fc0915062005ec0565b5162461bcd60e51b815260206004820152603c60248201526000805160206201521a83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b5162461bcd60e51b815260206004820152603960248201526000805160206201521a8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b5162461bcd60e51b815260206004820152603860248201526000805160206201521a8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b819493945181811015620040d5576003036200829757505060209162001c3862007fc092620138d6565b8195949293955181811015620040d5576004036200853c575050604080920161010094620082d9620082cd878451015162005ed0565b51968351015162005ef4565b5194620082f060e062007dd6818651015162005ed0565b519362008305885188511462002a1d62014cb0565b62008318885185511462002a1d62014cb0565b6200832b885186511462002a1d62014cb0565b60005b8851811015620083a05762008344818662005f16565b519061271082101562005ede576200839a916003906001600160a01b036200836d848e62005f16565b5116600052811b0160205262001c3888600020546200838d838a62005f16565b51111562002a1d62014db4565b6200832e565b50909691959294939660005b8351811015620084e957620083c2818862005f16565b5190612710918281101562005ede576001600160a01b039060039082620083ea858a62005f16565b5116600052811b01602052620084138b6200840b848b600020549262005f16565b51906200626a565b9062008420848c62005f16565b51918583101562005ede5760036200845993856200843f888d62005f16565b5116600052811b016020528a6000205562002a1d62014db4565b62008465828a62005f16565b518381101562005ede57600390826200847f858b62005f16565b5116600052811b01602052620084a08b6200746f848b600020549262005f16565b919050620084af838b62005f16565b519384101562005ede57620084e393600391620084cd858b62005f16565b5116600052811b01602052876000205562005ec0565b620083ac565b5094620085139297506200850c91939450620085059062014a3f565b9362014923565b9562014923565b9260005b835181101562007fac578062001c3862007f9d62008536938762005f16565b62008517565b8195949395519080821015620040d55760059182036200875257505050604091828501906200858060e062008575818551015162005ed0565b519351015162005ef4565b51928251845103620087015760005b8351811015620085e757620085a5818562005f16565b519061271082101562005ede576003620085e19260018060a01b038b5116600052811b0160205262001c3887600020546200838d838962005f16565b6200858f565b509092919260005b8451811015620086825762008605818662005f16565b51906127108083101562005ede57600360018060a01b0393848c5116600052811b016020526200863f88600020546200840b848962005f16565b6200864b848a62005f16565b519283101562005ede57600362001c38936200867c968e5116600052811b01602052896000205562002a1d62014db4565b620085ef565b509593926200869391925062014a3f565b91805193620086a28562003fbc565b6001855260203681870137516001600160a01b0316620086c28562005ed0565b525194620086d08662003fd8565b60008652600036813760005b835181101562007fac578062001c3862007f9d620086fb938762005f16565b620086dc565b845162461bcd60e51b81526020600482015260356024820152600080516020620151fa833981519152604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b82969394965181811015620040d557600603620089bd57505050906040809201620087836101008251015162005ed0565b51946200879a60e062008575818551015162005ed0565b519286518351036200896c578651845103620089205760005b87518110156200881857620087c9818562005f16565b519061271082101562005ede5762008812916003906001600160a01b03620087f2848d62005f16565b5116600052811b0160205262001c3887600020546200838d838962005f16565b620087b3565b509092919260005b8751811015620088cc5762008836818662005f16565b516127108082101562005ede576001600160a01b039291600390846200885d858e62005f16565b5116600052811b016020526200887d88600020546200840b848962005f16565b62008889848a62005f16565b519283101562005ede57600362001c3893620088c696620088ac8f889062005f16565b5116600052811b01602052896000205562002a1d62014db4565b62008820565b509592620088e191925062007f5d9062014a3f565b925194620088ef8662003fd8565b60008652600036813760005b835181101562007fac578062001c3862007f9d6200891a938762005f16565b620088fb565b845162461bcd60e51b81526020600482015260306024820152600080516020620152da83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b845162461bcd60e51b815260206004820152603560248201526000805160206201519a8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b825181811015620040d55760070362008b1057505050604080910193620089ea6101008651015162005ed0565b519282620089fd60e08851015162005ed0565b51965101519162008a16855188511462002a1d62014cb0565b60005b8551811015620081595762008b0a9062001c386001600160a01b038260028862008af28e62008ae78e62008add8f8962008a548a8562005f16565b511660005262008a918962008a8981620138809a8b60205262008a8360ff8760002054161562002a1d62014d81565b62005f16565b519662005f16565b51968a62008ac783519b8c9662008aa88862003f51565b600188526060602089019860008a528781019b8c52019b8c5262005f16565b5116600052602052600020975115158862006a49565b5115158662006a5a565b516001850162006976565b5191015562008b02838a62005f16565b511662007379565b62008a19565b82969596519281841015620040d557600893840362008c03575050506101009262008b4384604080950151015162005ed0565b519460005b865181101562008bed5762008be790876001600160a01b038062008b6d848462005f16565b511660005262008bbe888262008ba28662013880968760205262008a83600160ff8097600020541615151462002a1d62014ce0565b5116600052836020528960002054891c161562002a1d62014d48565b62008bca838b62005f16565b5116600052602052856000208761ff001982541617905562005ec0565b62008b48565b5095915093506020925062007fc0915062005ec0565b80959394955182811015620040d55760090362008cf25750505062008c32610100604080950151015162005ed0565b519360005b855181101562008cdd5762008cd790866001600160a01b038062008c5c848462005f16565b511660005262008cb06001898362008c928762013880978860205262008a838660ff8097600020541615151462002a1d62014ce0565b5116600052846020528a600020548a1c1615151462002a1d62014d13565b62008cbc838a62005f16565b51166000526020528560002061ff0019815416905562005ec0565b62008c37565b50949093506020925062007fc0915062005ec0565b80979694929395975182811015620040d557600a0362008dd2575050505060408094019162008d3860e062008d2d6101008651015162005ed0565b519451015162005ed0565b519162008d4d845184511462002a1d62014cb0565b60005b845181101562007fac5762008dcc906001600160a01b038062008d74838962005f16565b5116600052620138808060205262008d9c600160ff8c600020541615151462002a1d62014ce0565b62008da8838862005f16565b519162008db6848a62005f16565b5116600052602052600289600020015562005ec0565b62008d50565b809795975182811015620040d557600b0362008ea557505050506040809201938262008e046101008751015162005ed0565b51955101519162008e1d865184511462002a1d62014cb0565b60005b865181101562007fac5762008e9f9062001c386001600160a01b038062008e48848c62005f16565b5116600052620138808060205262008e70600160ff8b600020541615151462002a1d62014ce0565b62008e7c848962005f16565b519162008e8a858d62005f16565b51166000526020526001886000200162006976565b62008e20565b809794959396975182811015620040d557600c0362008fdd5750505060400160a09182825101519360005b855181101562008bed5760e062008eec82878751015162005f16565b5101511562008f745762008f1062008f0982878751015162005f16565b5162006f66565b620138828054600019929190838101908111620033d65762008f338a9162006f24565b5001805461ff00191661010017905554918201918211620033d6578762008f5e62008f6e9362006f24565b5001805460ff1916905562005ec0565b62008ed0565b62008f8f62008f8882878751015162005f16565b5162006fb3565b620138828054600019929190838101908111620033d65762008fb28a9162006ee2565b5001805461ff00191661010017905554918201918211620033d6578762008f5e62008f6e9362006ee2565b80979695939294975182811015620040d557600d03620091345750506040019460606200900f60e08851015162005ed0565b51965101519162009024875184511462012e8b565b60005b875181101562008159578080878a62009045620090d5958962005f16565b5115620090db57620090a66200908d8483620090786200906b620090b198889762005f16565b5162013882541162012f14565b62008a838d620090946200908d858562005f16565b5162006f24565b509060ff9889920154901c1662012f6c565b500154161562012fcd565b86620090c26200908d838c62005f16565b5001805460ff1916600117905562005ec0565b62009027565b620090a66200911c848362009107620090fa6200912398889762005f16565b5162013883541162012f14565b62008a838d620090946200911c858562005f16565b5162006ee2565b86620090c26200911c838c62005f16565b80979493975182811015620040d557600e036200921b5750506040019160606200916360e08551015162005ed0565b51935101519562009178845188511462012e8b565b60005b845181101562008159578062009196620091a2928a62005f16565b51620091a85762005ec0565b6200917b565b620091c5620091b8828862005f16565b516201388254116201302e565b6200920a87620091ef620091de6200908d858b62005f16565b5060ff9283910154891c1662013087565b88620092006200908d858b62005f16565b50015416620130e9565b8662008f5e6200908d838962005f16565b8091929350969495965182811015620040d557600f036200933657505060400160a09182825101519360005b855181101562008bed5760e06200926382878751015162005f16565b51015115620092d4576200928062008f0982878751015162005f16565b620138828054600019929190838101908111620033d657620092a38a9162006f24565b5001805461ff00191661010017905554918201918211620033d65787620090c2620092ce9362006f24565b62009247565b620092e862008f8882878751015162005f16565b620138828054600019929190838101908111620033d6576200930b8a9162006ee2565b5001805461ff00191661010017905554918201918211620033d65787620090c2620092ce9362006ee2565b80919293949695505182811015620040d557601003620093db57505060400151906200936b60e060c084015193015162005ed0565b519362009380835186511462002a1d62014cb0565b60005b8351811015620093c8578062001c38620093a2620093c2938762005f16565b51620093ae816200418b565b620093ba838a62005f16565b519062012df2565b62009383565b509350916020915062007fc09062005ec0565b809592955182811015620040d5576011036200967b575050906040809401916200941160e062008d2d6101008651015162005ed0565b519162009422845184511462012d98565b60005b84518110156200949b57620094959062001c386001600160a01b03806200944d848a62005f16565b511660005262013885806020526200946f8b600020546200746f868b62005f16565b9190926200947e868c62005f16565b51166000526020528a6000205562002a1d62014c66565b62009425565b5093945091620094ac915062014923565b906201388692835494620094cc620094c685518862012de4565b62006032565b91600093845b8881106200963b575060005b865181101562009593576000805b8a811062009544575b50156200950e575b620095089062005ec0565b620094de565b9462009508906200953b906001600160a01b036200952d898b62005f16565b511662001e43828962005f16565b959050620094fd565b6200954f8162006087565b90546001600160a01b0360039290921b1c8116906200956f858c62005f16565b5116146200958857620095829062005ec0565b620094ec565b5050600138620094f5565b50965094909350620095a58362006032565b805191906001600160401b03831162003f6d57602090620095c684620061a3565b0190600052602060002060005b8381106200961d575050505060005b828110620095fa5750505062007fc060209162005ec0565b620096179062001c386001600160a01b0362002fc8838662005f16565b620095e2565b82516001600160a01b031681830155602090920191600101620095d3565b946200966e6200967591620096508862006087565b905460039190911b1c6001600160a01b031662001e43828962005f16565b9562005ec0565b620094d2565b805182811015620040d557601203620098ee575050604080940191620096ad60e062008d2d6101008651015162005ed0565b5191620096be845184511462012d98565b60005b845181101562009711576200970b9062001c386001600160a01b0380620096e9848a62005f16565b511660005262013885806020526200946f8b600020546200840b868b62005f16565b620096c1565b509491509291620097229062014923565b90620138868054620097348162006032565b9260009485925b808410620097e85750505050620097528362006032565b805191906001600160401b03831162003f6d576020906200977384620061a3565b0190600052602060002060005b838110620097ca575050505060005b828110620097a75750505062007fc060209162005ec0565b620097c49062001c386001600160a01b0362002fc8838662005f16565b6200978f565b82516001600160a01b03168183015560209092019160010162009780565b9297600097929597949194998a5b8651811015620098dc576200980b8b62006087565b90546001600160a01b0360039290921b1c8116906200982b838a62005f16565b51161462009844576200983e9062005ec0565b620097f6565b509950976001979592979491945b80620098ab575b1562009871576200986a9062005ec0565b926200973b565b95620098a46200986a91620098868962006087565b905460039190911b1c6001600160a01b031662001e43828a62005f16565b9662005ec0565b50620098b78162006087565b60018060a01b0391549060031b1c166000526201388560205282600020541562009859565b50999890989795929794919462009852565b809592955182811015620040d5576013036200994f57505060400151608001519260005b84518110156200993e578062001c386200993162009938938862005f16565b5162013eeb565b62009912565b5092509062007fc060209162005ec0565b80519180831015620040d557601492830362009af3575050506040809101906200997f6101008351015162005ed0565b51926200999660e062007dd6818651015162005ed0565b5195620099a785518551146201314c565b620099b68551885114620131b2565b60005b855181101562009a9e57620099cf818962005f16565b51620099dc828762005f16565b51612710918282101562005ede576006620099fd9260031b01549062007231565b9062009a0a848962005f16565b51918383101562005ede57600662009a279360031b01556201326c565b62009a33828a62005f16565b519062009a41838862005f16565b518181101562005ede576001600160a01b03939262009a6a916003908662007ee6878e62005f16565b62009a76848a62005f16565b519283101562005ede57600362001c389362009a989662007f2b878e62005f16565b620099b9565b50939262009ab49192965062007f5d9062014a3f565b94519262009ac28462003fd8565b60008452600036813760005b835181101562007fac578062001c3862007f9d62009aed938762005f16565b62009ace565b815181811015620040d557601590810362009b1f57505050506020919262001c3862007fc092620138d6565b82519180831015620040d557601692830362009b88575050505050610100604062009b4e920151015162005ed0565b519260005b84518110156200993e5762009b829062001c386001600160a01b0362009b7a838962005f16565b51166200732d565b62009b53565b835181811015620040d55760170362009be15760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b835181811015620040d55760180362009c56575050505050610100604062009c0d920151015162005ed0565b5162013892805460ff191660011790559260005b84518110156200993e5762009c509062001c386001600160a01b0362009c48838962005f16565b5116620072e1565b62009c21565b839796975181811015620040d55760190362009c80575b50505050505062007fc060209162005ec0565b835181811015620040d557601a0362009d8d575050505062009cab60e0604080940151015162005ed0565b519062009cbc600383511462012d98565b62009cc78262005ed0565b519262009ce062009cd88462005ef4565b519362005f05565b519262009d535750509162007fc09160016020941460001462009d4c5762009d209062009d136201388d91825462007231565b90915562002a1d62014c01565b62009d416201388e62009d3481546200721e565b90915562002a1d62014c3b565b913880808062009c6d565b5062009d41565b60649250519062461bcd60e51b825260206004830152602482015273496e76616c6964207061796d656e74207479706560601b6044820152fd5b9091928094505181811015620040d557601b036200a2185750505050509062009dcd6201388b546200370b62009dc262014b3d565b612710831062005e8d565b505062009dd962014c01565b506000805b61271081106200a1b3575b505062009df562007243565b9062009e056202712a5462006032565b9060009384905b6127108210156200a1a8578160031b9260ff6007850154161562009f5d5760009760028501541562009f4b57889798975b62005ede57600485015488101562009f315762009e5e886004870162006135565b9054600391821b1c6001600160a01b0316600081815291870160205260409182902054919a9162009e91908a90620070e9565b9b9062009e9d62014c01565b62009ea89162005e8d565b60009b600289015462009ebb91620070e9565b9062009ec662014c01565b62009ed19162005e8d565b828d5262013887602052818d20549062009eeb9162007231565b90918d205562009efa62014c01565b62009f059162005e8d565b62009f11828962005f16565b5262009f1d9062005ec0565b9762009f299062005ec0565b979862009e3d565b9290935062009f4291965062005ec0565b90959462009e0c565b9290935062009f429196975062005ec0565b959392509350505b62009f708262006032565b91600091825b8281106200a11257505050620138889081549262009f99620094c6858462012de4565b9360009081905b8082106200a0d057505060005b8381106200a02c5750508351939150506001600160401b03831162003f6d5760209062009fda8462006167565b0190600052602060002060005b8381106200a00e575050505062007fc060209160006201388d5560006201388e5562009d41565b82516001600160a01b03168183015560209092019160010162009fe7565b6000805b8381106200a088575b50156200a052575b6200a04c9062005ec0565b62009fad565b906200a04c906200a07f906001600160a01b036200a071858762005f16565b511662001e43828a62005f16565b9190506200a041565b6001600160a01b03806200a09d858862005f16565b5116906200a0ac838b62005f16565b5116146200a0c5576200a0bf9062005ec0565b6200a030565b50506001386200a039565b90916200a1046200a10b916200a0e6856200606a565b905460039190911b1c6001600160a01b031662001e43828b62005f16565b9262005ec0565b9062009fa0565b6000805b8581106200a160575b50156200a138575b6200a1329062005ec0565b62009f76565b926200a132906200a157906001600160a01b036200952d878662005f16565b9390506200a127565b6001600160a01b03806200a175858762005f16565b5116906200a184838a62005f16565b5116146200a19d576200a1979062005ec0565b6200a116565b50506001386200a11f565b935050929062009f65565b8060031b9060ff600783015416156200a211576200a1ff62007c2a62001c38946200a1f36200a20b9560026200a1e9876200708c565b91015490620070e9565b929062002a1d62014c01565b939062002a1d62014c01565b62009dde565b5062009de9565b835181811015620040d557601c036200a2715760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b835181811015620040d557601d036200a297575b505050505062007fc060209162009d41565b835181811015620040d557601e146200a28557835181811015620040d557601f036200a2f057505050506020916200a2e66200a2df62007fc093604080910151015162005ed0565b5162013f22565b913880806200a285565b835181811015620040d5576020036200a316575b505050505062007fc06020916200a2e6565b835181811015620040d55760218091036200a333575b506200a304565b8451828110156200a461576022036200a3745750505050505062007fc06020916201389260ff1981541690556200a36962006236565b91388080806200a32c565b8451828110156200a461576023036200a39b575b50505050505062007fc06020916200a369565b845194828610156200a4615760248096036200a3b9575b506200a388565b8051838110156200a44d576025146200a3b25751918210156200a4395750036200a3fd5750506020916200a3f162007fc092620138d6565b9138808080806200a3b2565b60405162461bcd60e51b8152602060048201529182015275496e76616c6964206f7065726174696f6e207479706560501b604482015260649150fd5b8490634e487b7160e01b6000526004526000fd5b8683634e487b7160e01b6000526004526000fd5b50634e487b7160e01b60005260045260246000fd5b60405162461bcd60e51b815260206004820152601b60248201527a13dc195c985d1a5bdb881d1e5c19481a5cc81d5b9919599a5b9959602a1b6044820152606490fd5b50915050565b600281036200a4e35760405162461bcd60e51b81528062005ebc6004820162007c9d565b6001146200a4ee5750565b906200a4fe62013883546200648b565b805190600160401b821162003f6d5762027116548262027116558083106201181e575b506020016202711660005260206000206000915b838310620117fd575050505060005b62013883548110156200a57e578062001c386200a5656200a5789362006ee2565b506200a5718362006f03565b9062011db3565b6200a544565b506200a58e62013882546200648b565b805190600160401b821162003f6d57620271155482620271155580831062011760575b506020016202711560005260206000206000915b8383106201173f575050505060005b62013882548110156200a607578062001c386200a5f56200a6019362006f24565b506200a5718362006f45565b6200a5d4565b5060005b612710811015806200a7d357600160ff6201389a8460031b0154161515146200a641575b506200a63b9062005ec0565b6200a60b565b916000835b62005ede57620138978360031b01548110156200a6b3576200a6aa929350600092816200a67d8593620138978860031b0162006135565b9054600391821b1c6001600160a01b031660009081529087901b6201389601602052604081205562005ec0565b9093926200a646565b5091604051906200a6c48262003fd8565b6000825262005ede578051906001600160401b03821162003f6d576020906200a6f683620138978660031b016200624a565b01620138978360031b01600052602060002060005b8381106200a7b55750505050600381901b6201389a8101805460ff191690556000620138938201819055620138948201819055620138958201556201389801546200a63b91906200a75c906200555f565b601f908181116200a789575b50506000620138988260031b01556000620138998260031b0155906200a62f565b6200a7ad91620138988460031b016000526020600020910160051c8101906200614e565b38806200a768565b82516001600160a01b0316818301556020909201916001016200a70b565b505060005b6127108110620116aa575060005b62013881548110156200a84357806200a8036200a83d92620060a4565b60018060a01b0391549060031b1c166000526202711360205260006002604082208281556200a835600182016200651c565b015562005ec0565b6200a7e6565b506200a853620138815462006032565b8051906001600160401b03821162003f6d57600160401b821162003f6d57602090620271145483620271145580841062011687575b500162027114600052602060002060005b83811062011669575050505060005b62013881548110156200a91d576200a8c081620060a4565b9054620271145460039290921b1c6001600160a01b0316919081101562005ede57620271146000526000805160206201523a833981519152810180546001600160a01b0319169092179091556200a9179062005ec0565b6200a8a8565b509060005b62013881548110156200a9df57806200a93f6200a99492620060a4565b9060018060a01b03918291549060031b1c1660005262013880602052604080600020916200a96d84620060a4565b90549060031b1c1660005262027113602052600020908082036200a99a575b505062005ec0565b6200a922565b600280916200a9c060ff6200a9b3818454168762006a49565b825460081c168562006a5a565b6200a9d2600182016001860162011a34565b015491015538806200a98c565b5060005b6202711d548110156200aa3357806200aa006200aa2d92620060c1565b60018060a01b0391549060031b1c166000526202711c60205262001c38604060002060648101906200614e565b6200a9e3565b506200aa436201388a5462006032565b8051906001600160401b03821162003f6d57600160401b821162003f6d5760206202711d91825484845580851062011649575b500190600052602060002060005b8381106201162b575050505060005b6201388a548110156200aad7578062001c386200aab46200aad193620060de565b905460039190911b1c6001600160a01b031662002fd583620060c1565b6200aa93565b5060005b6201388a548110156200ab6557806200aaf86200ab4c92620060de565b9060018060a01b03918291549060031b1c1660005262013889602052604080600020916200ab2684620060de565b90549060031b1c166000526202711c602052600020908082036200ab5257505062005ec0565b6200aadb565b6200ab5d9162011e47565b38806200a98c565b506201388b546202711e556201388c546202711f556201388d5462027120556201388e5462027121556201388f546001600160401b03811162003f6d57600160401b811162003f6d576202712254816202712255808210620115fc575b506202712260009081527f846ab89c81ea9339188216a1864da1a19ebe28d411cbec99efa70ca6d389710d8054600080516020620151ba83398151915291905b848410620115da5750505050506201389054600160401b811162003f6d57620271235481620271235580821062011597575b50620271236000908152600080516020620151da8339815191527f7f73709277f72a9bc7b284375e83603a53394744e9fa86da811e86c2aa78e05e5b8383106201157957505062013891549150506001600160401b03811162003f6d57600160401b811162003f6d5762027124548162027124558082106201154a575b506202712460009081527f8f332db73d3937798ea82422156d059730b0b3058606439b57b7ae623e94536680546000805160206201525a83398151915291905b8484106201152857505050505060ff620138925416151560ff8019620271255416911617620271255560005b62027119548110156200ad6957806200ad3a6200ad6392620060fb565b905460039190911b1c6001600160a01b0316600090815262027118602052604081205562005ec0565b6200ad1d565b506200ad79620138865462006032565b8051906001600160401b03821162003f6d576020906200ad9983620061ee565b0162027119600052602060002060005b8381106201150a575050505060005b62013886548110156200adfc578062001c386200add96200adf69362006087565b905460039190911b1c6001600160a01b031662002fd583620060fb565b6200adb8565b5060005b62013886548110156200ae6e57806200ae1d6200ae689262006087565b9060018060a01b03918291549060031b1c166000526201388560205260408060002054916200ae4c8462006087565b90549060031b1c16600052620271186020526000205562005ec0565b6200ae00565b5060005b6202711b548110156200aebe57806200ae8f6200aeb89262006118565b905460039190911b1c6001600160a01b031660009081526202711a602052604081205562005ec0565b6200ae72565b506200aece620138885462006032565b8051906001600160401b03821162003f6d576020906200aeee8362006212565b016202711b600052602060002060005b838110620114ec575050505060005b62013888548110156200af51578062001c386200af2e6200af4b936200606a565b905460039190911b1c6001600160a01b031662002fd58362006118565b6200af0d565b5060005b62013888548110156200afc357806200af726200afbd926200606a565b9060018060a01b03918291549060031b1c166000526201388760205260408060002054916200afa1846200606a565b90549060031b1c166000526202711a6020526000205562005ec0565b6200af55565b50906000905b602083015180518310156200eb1357826200afe49162005f16565b5160208101516026811015620040d557156200a4765760208101516026811015620040d5576001036200b5c757604001906200b0266101008351015162005ed0565b51936200b03d60e062007dd6818651015162005ed0565b51916200b04e86518551146201314c565b6200b05d8651845114620131b2565b60005b86518110156200b1c0576200b076818662005f16565b5161271081101562005ede57600160ff6201389a6200b09e9360031b01541615151462013214565b6200b0aa818562005f16565b516200b0b7828762005f16565b519061271082101562005ede57620138996200b0d99260031b01549062007231565b906200b0e6838862005f16565b519161271083101562005ede57620138996200b1079360031b01556201326c565b6200b113818562005f16565b516200b120828762005f16565b519061271082101562005ede576200b1649162013896906001600160a01b036200b14b868d62005f16565b511660005260031b016020526040600020549062007231565b91906200b172828862005f16565b519061271082101562005ede576200b1ba9362001c389262013896906001600160a01b036200b1a2878f62005f16565b511660005260031b01602052604060002055620132cb565b6200b060565b50926200b1d7919250620085059095949562014a3f565b916040516200b1e68162003fd8565b6000815260003681376000945b80518610156200b5ad576200b209868262005f16565b51610360526200b21a855162006032565b966000946200b22a845162006032565b6103e05260009460005b88518110156200b306578a896200b2646001600160a01b036200b258858462005f16565b51166103605162014875565b15806200b2bd575b6200b285575b50506200b27f9062005ec0565b6200b234565b986200b2b29162001e4382859c6200b2a96200b27f9760018060a01b039262005f16565b51169262005f16565b9790508a896200b272565b50505061271061036051101562005ede576001600160a01b036200b2e2828b62005f16565b5116600052620138966103605160031b016020528a8960406000205415156200b26c565b50909895979498969291939660005b88518110156200b3a55761271061036051101562005ede576001600160a01b03806200b342838c62005f16565b5116600052620138966103605160031b01602052604060002054156200b375575b506200b36f9062005ec0565b6200b315565b819b6200b39d916200b38c6200b36f948d62005f16565b511662001e43826103e05162005f16565b9a906200b363565b5098509695929190939661036051612710811015806101205262005ede5760031b620138970154986200b3dd620094c6898c62012de4565b60e05260006102e0526000610400525b6101205162005ede57610400518a8110156200b4b7576200b4246200b44491600061012052620138976103605160031b0162006135565b90546103e0516001600160a01b03939260031b9190911c831690620148ce565b156200b464575b506200b45a6104005162005ec0565b610400526200b3ed565b6000610120526200b48461040051620138976103605160031b0162006135565b90549060031b1c166200b49d6102e05160e05162005f16565b526200b4ac6102e05162005ec0565b6102e052386200b44b565b50979294959093985095909560005b8281106200b562575050506101205162005ede5760e051516001600160401b03811162003f6d576200b50481620138976103605160031b016200624a565b602060e05101620138976103605160031b01600052602060002060005b8381106200b54457505050506200b5389062005ec0565b9492959091956200b1f3565b82516001600160a01b0316818301556020909201916001016200b521565b6200b5a7906001600160a01b036200b57b828562005f16565b51166200b58e6102e05160e05162005f16565b526200b59d6102e05162005ec0565b6102e05262005ec0565b6200b4c6565b5050939092506200b5bf915062005ec0565b90916200afc9565b9060208294939401516026811015620040d5576002036200b7865760408092019081519383850151916200b6206200b60460e08098015162005ed0565b51966200b615818751015162005ef4565b519551015162005f05565b519483518751036200821a578351855103620081c65783518651036200816f575060005b86518110156200b773576200b65a818862005f16565b5161271081101562005ede5760ff6201389a6200b67e9260031b0154161562013324565b6200b68a818862005f16565b5161271081101562005ede5760031b6201389a01805460ff191660011790556200b6b5818562005f16565b516200b6c2828962005f16565b519061271082101562005ede57620138986200b6e29260031b0162006976565b6200b6ee818662005f16565b516200b6fb828962005f16565b5161271081101562005ede5760031b6201389401556200b71c818762005f16565b516200b729828962005f16565b5161271081101562005ede5760031b6201389501556200b74a818862005f16565b519061271082101562005ede576000620138996200b76d9360031b015562005ec0565b6200b644565b509592509350506200b5bf915062005ec0565b92919060208101516026811015620040d5576003036200b7b1579162001c386200b5bf929362013370565b60208101516026811015620040d5576004036200ba7157604001610100936200b7ee6200b7e2868451015162005ed0565b51958351015162005ef4565b51906200b80560e062007dd6818651015162005ed0565b51936200b81a875184511462002a1d62014cb0565b6200b82d875185511462002a1d62014cb0565b6200b840875186511462002a1d62014cb0565b60005b87518110156200b8ac576200b859818662005f16565b519061271082101562005ede576200b8a69162013896906001600160a01b036200b884848d62005f16565b511660005260031b0160205262001c386040600020546200838d838a62005f16565b6200b843565b509095919593929360005b83518110156200ba13576200b8cd818762005f16565b5161271081101562005ede5762013896906001600160a01b036200b8f2848862005f16565b511660005260031b016020526200b9146040600020546200840b838862005f16565b906200b921838962005f16565b519161271083101562005ede576200b9689262013896906001600160a01b036200b94c878b62005f16565b511660005260031b0160205260406000205562002a1d62014db4565b6200b974818762005f16565b5161271081101562005ede5762013896906001600160a01b036200b999848c62005f16565b511660005260031b016020526200b9bb6040600020546200746f838862005f16565b9190506200b9ca818862005f16565b519161271083101562005ede576200ba0d9262013896906001600160a01b036200b9f5858e62005f16565b511660005260031b0160205260406000205562005ec0565b6200b8b7565b50936200ba2d9192969350620085056200850c9162014a3f565b9260005b83518110156200ba5f578062001c386200ba506200ba59938762005f16565b51878a62014544565b6200ba31565b5094509290506200b5bf915062005ec0565b9260208401516026811015620040d5576005036200bc8a5760408401906200baa360e062008575818551015162005ed0565b519282518451036200bc385760005b83518110156200bb0e576200bac8818562005f16565b519061271082101562005ede57620138966200bb089260018060a01b038a511660005260031b0160205262001c386040600020546200838d838962005f16565b6200bab2565b509060005b83518110156200bbb7576200bb29818562005f16565b5161271081101562005ede57620138969060018060a01b0389511660005260031b016020526200bb646040600020546200840b838862005f16565b91906200bb72828762005f16565b519061271082101562005ede576200bbb1936201389662001c389360018060a01b038d511660005260031b0160205260406000205562002a1d62014db4565b6200bb13565b50949250906200bbc79062014a3f565b90604051926200bbd78462003fbc565b6001845260203681860137516001600160a01b03166200bbf78462005ed0565b52604051946200bc078662003fd8565b60008652600036813760005b83518110156200ba5f578062001c386200ba506200bc32938762005f16565b6200bc13565b60405162461bcd60e51b81526020600482015260356024820152600080516020620151fa833981519152604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b909260208101516026811015620040d5576006036200c27f576040016200bcb76101008251015162005ed0565b51936200bcce60e062008575818551015162005ed0565b519285518351036200c22d5785518451036200c1e05760005b86518110156200bd50576200bcfd818562005f16565b519061271082101562005ede576200bd4a9162013896906001600160a01b036200bd28848c62005f16565b511660005260031b0160205262001c386040600020546200838d838962005f16565b6200bce7565b509060005b86518110156200bdf6576200bd6b818562005f16565b5161271081101562005ede5762013896906001600160a01b036200bd90848b62005f16565b511660005260031b016020526200bdb26040600020546200840b838862005f16565b91906200bdc0828762005f16565b519061271082101562005ede576200bdf09362001c389262013896906001600160a01b036200b94c878f62005f16565b6200bd55565b50916200be0d919350620085059095949562014a3f565b91604051926200be1d8462003fd8565b6000845260003681376000945b80518610156200b5ad576200be40868262005f16565b516102c0526200be51855162006032565b966000946200be61845162006032565b6103805260009460005b88518110156200bf34578a896200be9b6001600160a01b036200be8f858462005f16565b51166102c05162014875565b15806200beeb575b6200bebc575b50506200beb69062005ec0565b6200be6b565b986200bee09162001e4382859c6200b2a96200beb69760018060a01b039262005f16565b9790508a896200bea9565b5050506127106102c051101562005ede576001600160a01b036200bf10828b62005f16565b5116600052620138966102c05160031b016020528a8960406000205415156200bea3565b50909895979498969291939660005b88518110156200bfd3576127106102c051101562005ede576001600160a01b03806200bf70838c62005f16565b5116600052620138966102c05160031b01602052604060002054156200bfa3575b506200bf9d9062005ec0565b6200bf43565b819b6200bfcb916200bfba6200bf9d948d62005f16565b511662001e43826103805162005f16565b9a906200bf91565b509850969592919093966102c051612710811015806102605262005ede5760031b620138970154986200c00b620094c6898c62012de4565b6103c0526000610320526000610420525b6102605162005ede57610420518a8110156200c0e7576200c0536200c07391600061026052620138976102c05160031b0162006135565b9054610380516001600160a01b03939260031b9190911c831690620148ce565b156200c093575b506200c0896104205162005ec0565b610420526200c01c565b6000610260526200c0b361042051620138976102c05160031b0162006135565b90549060031b1c166200c0cd610320516103c05162005f16565b526200c0dc6103205162005ec0565b61032052386200c07a565b50979294959093985095909560005b8281106200c194575050506102605162005ede576103c051516001600160401b03811162003f6d576200c13581620138976102c05160031b016200624a565b60206103c05101620138976102c05160031b01600052602060002060005b8381106200c17657505050506200c16a9062005ec0565b9492959091956200be2a565b82516001600160a01b0316818301556020909201916001016200c153565b6200c1da906001600160a01b036200c1ad828562005f16565b51166200c1c1610320516103c05162005f16565b526200c1d06103205162005ec0565b6103205262005ec0565b6200c0f6565b60405162461bcd60e51b81526020600482015260306024820152600080516020620152da83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201526000805160206201519a8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b6020819492939401516026811015620040d5576007036200c42257604001916200c2af6101008451015162005ed0565b519160406200c2c360e08651015162005ed0565b5194510151916200c2dc845186511462002a1d62014cb0565b60005b84518110156200c410576001600160a01b03806200c2fe838862005f16565b511660005262027113806020526200c32360ff604060002054161562002a1d62014d81565b60026200c331848862005f16565b516200c39b6200c342868c62005f16565b519162008ae78b604051966200c3588862003f51565b60018852886200c37f8b60208b01946000865260408c0197885260608c01998a5262005f16565b511660005260205262008add6040600020975115158862006a49565b519101556200c3ab828762005f16565b516202711454929116600160401b83101562003f6d576001830180620271145583101562005ede57620271146000526000805160206201523a83398151915290920180546001600160a01b0319169092179091556200c40a9062005ec0565b6200c2df565b5094915092506200b5bf915062005ec0565b60208101516026811015620040d5576008036200c5125761010060406200c44d920151015162005ed0565b519160005b83518110156200c503576200c4fd906001600160a01b03806200c476838862005f16565b51166000526202711390816020526200c4a0600160ff6040600020541615151462002a1d62014ce0565b806200c4ad848962005f16565b5116600052816020526200c4d160ff60406000205460081c161562002a1d62014d48565b6200c4dd838862005f16565b5116600052602052604060002061010061ff001982541617905562005ec0565b6200c452565b50926200b5bf91925062005ec0565b60208101516026811015620040d5576009036200c5f35761010060406200c53d920151015162005ed0565b519160005b83518110156200c503576200c5ed906001600160a01b03806200c566838862005f16565b51166000526202711390816020526200c590600160ff6040600020541615151462002a1d62014ce0565b806200c59d848962005f16565b5116600052816020526200c5c5600160ff60406000205460081c1615151462002a1d62014d13565b6200c5d1838862005f16565b5116600052602052604060002061ff0019815416905562005ec0565b6200c542565b60208101516026811015620040d557600a036200c6dd57604001906200c63060e06200c6256101008551015162005ed0565b519351015162005ed0565b51926200c645835185511462002a1d62014cb0565b60005b83518110156200c6cc576200c6c6906001600160a01b03806200c66c838862005f16565b511660005262027113806020526200c695600160ff6040600020541615151462002a1d62014ce0565b6200c6a1838962005f16565b51916200c6af848962005f16565b511660005260205260026040600020015562005ec0565b6200c648565b50939092506200b5bf915062005ec0565b6020819493929401516026811015620040d557600b036200c7c2576040019260406200c70f6101008651015162005ed0565b5194510151916200c728855184511462002a1d62014cb0565b60005b85518110156200c7b2576200c7ac9062001c386001600160a01b03806200c753848b62005f16565b511660005262027113806020526200c77c600160ff6040600020541615151462002a1d62014ce0565b6200c788848962005f16565b51916200c796858c62005f16565b5116600052602052600160406000200162006976565b6200c72b565b509350916200b5bf915062005ec0565b90919260208201516026811015620040d557600c036200c9065760a0604083015101519260005b84518110156200c6cc5760e06200c8098260a06040880151015162005f16565b510151156200c88f576200c8316200c82a8260a06040880151015162005f16565b5162006ffb565b620271155480600019810111620033d6576200c8536005916000190162006f45565b5001805461ff00191661010017905562027115549060001982018210620033d657600562008f5e6200c889936000190162006f45565b6200c7e9565b6200c8ae6200c8a78260a06040880151015162005f16565b5162006fd7565b620271165480600019810111620033d6576200c8d06005916000190162006f03565b5001805461ff00191661010017905562027116549060001982018210620033d657600562008f5e6200c889936000190162006f03565b92919060208101516026811015620040d557600d036200ca4f576040019260606200c93660e08651015162005ed0565b5194510151916200c94b855184511462012e8b565b60005b85518110156200c7b257806200c9696200c9e3928662005f16565b51156200c9e9576200c98d6200c980828962005f16565b5162027115541162012f14565b6200c9b960ff60056200c9ac6200c9a5858c62005f16565b5162006f45565b50015460081c1662012f6c565b6200c9d160ff6005620090a66200c9a5858c62005f16565b6005620090c26200c9a5838a62005f16565b6200c94e565b6200ca066200c9f9828962005f16565b5162027116541162012f14565b6200ca2560ff60056200c9ac6200ca1e858c62005f16565b5162006f03565b6200ca3d60ff6005620090a66200ca1e858c62005f16565b6005620090c26200ca1e838a62005f16565b60208101516026811015620040d557600e036200cb87576040019260606200ca7c60e08651015162005ed0565b5194510151916200ca91855184511462012e8b565b60005b85518110156200c7b257806200caaf6200cb22928662005f16565b51156200cb28576200cad36200cac6828962005f16565b516202711554116201302e565b6200caf860ff60056200caeb6200c9a5858c62005f16565b50015460081c1662013087565b6200cb1060ff6005620092006200c9a5858c62005f16565b600562008f5e6200c9a5838a62005f16565b6200ca94565b6200cb456200cb38828962005f16565b516202711654116201302e565b6200cb5d60ff60056200caeb6200ca1e858c62005f16565b6200cb7560ff6005620092006200ca1e858c62005f16565b600562008f5e6200ca1e838a62005f16565b90919260208201516026811015620040d557600f036200ccbd5760a0604083015101519260005b84518110156200c6cc5760e06200cbce8260a06040880151015162005f16565b510151156200cc4d576200cbef6200c82a8260a06040880151015162005f16565b620271155480600019810111620033d6576200cc116005916000190162006f45565b5001805461ff00191661010017905562027115549060001982018210620033d6576005620090c26200cc47936000190162006f45565b6200cbae565b6200cc656200c8a78260a06040880151015162005f16565b620271165480600019810111620033d6576200cc876005916000190162006f03565b5001805461ff00191661010017905562027116549060001982018210620033d6576005620090c26200cc47936000190162006f03565b92919060208101516026811015620040d5576010036200ce075760400151926200ccf060e060c086015195015162005ed0565b51916200cd05855184511462002a1d62014cb0565b60005b85518110156200c7b257806200cd236200cd99928862005f16565b516200cd2f816200418b565b6200cd3b828762005f16565b51906200cd48816200418b565b6200cd5f6200cd5662014de3565b82151562005e8d565b6200cd6a816200418b565b600181036200cd9f57506200cd8e6200cd8262014de3565b61271083111562005e8d565b6202711e5562005ec0565b6200cd08565b6200cdaa816200418b565b600281036200cdbf57506202711f5562005ec0565b6200cdca816200418b565b600381036200cddf5750620271205562005ec0565b806200cded6004926200418b565b146200cdfb575b5062005ec0565b6202712155386200cdf4565b60208101516026811015620040d5576011036200d0ae57604001906200ce3960e06200c6256101008551015162005ed0565b51936200ce4a835186511462012d98565b60005b83518110156200cecb576200cec5906200cea56001600160a01b03806200ce75848962005f16565b51166000526202711890816020526200ce996040600020546200746f868d62005f16565b939062002a1d62014c66565b6200ceb1848962005f16565b511660005260205260406000205562005ec0565b6200ce4d565b509350906200ceda9062014923565b906202711954936200cef2620094c684518762012de4565b9060009260005b8781106200d06e575060005b85518110156200cfba576000805b8981106200cf6b575b50156200cf35575b6200cf2f9062005ec0565b6200cf05565b936200cf2f906200cf62906001600160a01b036200cf54888a62005f16565b511662001e43828862005f16565b9490506200cf24565b6200cf7681620060fb565b90546001600160a01b0360039290921b1c8116906200cf96858b62005f16565b5116146200cfaf576200cfa99062005ec0565b6200cf13565b50506001386200cf1c565b5095509392506200cfcb8262006032565b8051906001600160401b03821162003f6d576020906200cfeb83620061ee565b0162027119600052602060002060005b8381106200d050575050505060005b8281106200d020575050506200b5bf9062005ec0565b6200d04a9062001c386001600160a01b036200d03d838662005f16565b511662002fd583620060fb565b6200d00a565b82516001600160a01b0316818301556020909201916001016200cffb565b936200d0a16200d0a8916200d08387620060fb565b905460039190911b1c6001600160a01b031662001e43828862005f16565b9462005ec0565b6200cef9565b60208194929401516026811015620040d5576012036200d2f757604001906200d0e360e06200c6256101008551015162005ed0565b51936200d0f4835186511462012d98565b60005b83518110156200d149576200d143906200cea56001600160a01b03806200d11f848962005f16565b51166000526202711890816020526200ce996040600020546200840b868d62005f16565b6200d0f7565b50935091906200d1599062014923565b62027119546200d1698162006032565b906000926000915b8083106200d21d575050506200d1878262006032565b8051906001600160401b03821162003f6d576020906200d1a783620061ee565b0162027119600052602060002060005b8381106200d1ff575050505060005b8281106200d1dc575050506200b5bf9062005ec0565b6200d1f99062001c386001600160a01b036200d03d838662005f16565b6200d1c6565b82516001600160a01b0316818301556020909201916001016200d1b7565b91956000959193959760005b85518110156200d2e8576200d23e89620060fb565b90546001600160a01b0360039290921b1c8116906200d25e838962005f16565b5116146200d277576200d2719062005ec0565b6200d229565b509750956001959391955b806200d2b6575b156200d2a1576200d29a9062005ec0565b916200d171565b936200d0a16200d29a916200d08387620060fb565b506200d2c281620060fb565b60018060a01b0391549060031b1c1660005262027118602052604060002054156200d289565b5097969096959391956200d282565b60208194939401516026811015620040d5576013036200d39b5760400151608001519160005b83518110156200c503576200d333818562005f16565b51906202711754600160401b81101562003f6d576001810180620271175581101562005ede57620271176000526200d3959262001c38916007027f08f37177f6a5732df494aeff73d589b534878a053b84dfe1e41c467868b7c9fd0162013e3f565b6200d31d565b6020819493929401516026811015620040d5576014036200d8e457604001906200d3cb6101008351015162005ed0565b51936200d3e260e062007dd6818651015162005ed0565b51916200d3f386518551146201314c565b6200d4028651845114620131b2565b60005b86518110156200d500576200d41b818562005f16565b516200d428828762005f16565b519061271082101562005ede57620138996200d44a9260031b01549062007231565b906200d457838862005f16565b519161271083101562005ede57620138996200d4789360031b01556201326c565b6200d484818562005f16565b516200d491828762005f16565b519061271082101562005ede576200d4bc9162013896906001600160a01b036200b14b868d62005f16565b91906200d4ca828862005f16565b519061271082101562005ede576200d4fa9362001c389262013896906001600160a01b036200b1a2878f62005f16565b6200d405565b50926200d517919250620085059095949562014a3f565b916040516200d5268162003fd8565b6000815260003681376000945b80518610156200b5ad576200d549868262005f16565b516101e0526200d55a855162006032565b966000946200d56a845162006032565b6101005260009460005b88518110156200d63d578a896200d5a46001600160a01b036200d598858462005f16565b51166101e05162014875565b15806200d5f4575b6200d5c5575b50506200d5bf9062005ec0565b6200d574565b986200d5e99162001e4382859c6200b2a96200d5bf9760018060a01b039262005f16565b9790508a896200d5b2565b5050506127106101e051101562005ede576001600160a01b036200d619828b62005f16565b5116600052620138966101e05160031b016020528a8960406000205415156200d5ac565b50909895979498969291939660005b88518110156200d6dc576127106101e051101562005ede576001600160a01b03806200d679838c62005f16565b5116600052620138966101e05160031b01602052604060002054156200d6ac575b506200d6a69062005ec0565b6200d64c565b819b6200d6d4916200d6c36200d6a6948d62005f16565b511662001e43826101005162005f16565b9a906200d69a565b509850969592919093966101e051612710811015806101a05262005ede5760031b620138970154986200d714620094c6898c62012de4565b6103a052600061030052600060a0525b6101a05162005ede5760a0518a8110156200d7eb576200d75a6200d77a9160006101a052620138976101e05160031b0162006135565b9054610100516001600160a01b03939260031b9190911c831690620148ce565b156200d798575b506200d78f60a05162005ec0565b60a0526200d724565b60006101a0526200d7b760a051620138976101e05160031b0162006135565b90549060031b1c166200d7d1610300516103a05162005f16565b526200d7e06103005162005ec0565b61030052386200d781565b50979294959093985095909560005b8281106200d898575050506101a05162005ede576103a051516001600160401b03811162003f6d576200d83981620138976101e05160031b016200624a565b60206103a05101620138976101e05160031b01600052602060002060005b8381106200d87a57505050506200d86e9062005ec0565b9492959091956200d533565b82516001600160a01b0316818301556020909201916001016200d857565b6200d8de906001600160a01b036200d8b1828562005f16565b51166200d8c5610300516103a05162005f16565b526200d8d46103005162005ec0565b6103005262005ec0565b6200d7fa565b9260208401516026811015620040d5576015036200df155760408401906200d9126101008351015162005ed0565b51906200d92960e062007dd6818651015162005ed0565b51936200d93e835185511462002a1d62014cb0565b6200d951835186511462002a1d62014cb0565b60005b83518110156200d9b0576200d96a818662005f16565b519061271082101562005ede57620138966200d9aa9260018060a01b038b511660005260031b0160205262001c386040600020546200838d838a62005f16565b6200d954565b509095919560005b87518110156200db02576200d9ce818662005f16565b5161271081101562005ede57620138969060018060a01b0386511660005260031b016020526200da096040600020546200840b838962005f16565b906200da16838862005f16565b519161271083101562005ede57620138966200da509360018060a01b0389511660005260031b0160205260406000205562002a1d62014db4565b6200da5c818662005f16565b5161271081101562005ede5762013896906001600160a01b036200da81848c62005f16565b511660005260031b016020526200daa36040600020546200746f838962005f16565b91906200dab1828862005f16565b519061271082101562005ede576200dafc936201389662001c38938d6200dae08760018060a01b039262005f16565b511660005260031b0160205260406000205562002a1d62014e19565b6200d9b8565b50926200db21919294506200db1a9096959662014a3f565b9462014923565b92604051906200db318262003fbc565b6001825260203681840137516001600160a01b03166200db518262005ed0565b526000945b80518610156200b5ad576200db6c868262005f16565b51610240526200db7d855162006032565b966000946200db8d845162006032565b6102a05260009460005b88518110156200dc60578a896200dbc76001600160a01b036200dbbb858462005f16565b51166102405162014875565b15806200dc17575b6200dbe8575b50506200dbe29062005ec0565b6200db97565b986200dc0c9162001e4382859c6200b2a96200dbe29760018060a01b039262005f16565b9790508a896200dbd5565b50505061271061024051101562005ede576001600160a01b036200dc3c828b62005f16565b5116600052620138966102405160031b016020528a8960406000205415156200dbcf565b50909895979498969291939660005b88518110156200dd065761271061024051101562005ede576001600160a01b036200dc9b828b62005f16565b5116600052620138966102405160031b01602052604060002054156200dccd575b6200dcc79062005ec0565b6200dc6f565b996200dcc7906200dcfd906001600160a01b036200dcec8e8d62005f16565b511662001e43826102a05162005f16565b9a90506200dcbc565b5098509695929190939661024051612710811015806103405262005ede5760031b620138970154986200dd3e620094c6898c62012de4565b6101605260006102805260006101c0525b6103405162005ede576101c0518a8110156200de1c576200dd866200dda391600061034052620138976102405160031b0162006135565b90546102a05160039290921b1c6001600160a01b031690620148ce565b156200ddc2575b6200ddb86101c05162005ec0565b6101c0526200dd4f565b6000610340526200dde26101c051620138976102405160031b0162006135565b60018060a01b0391549060031b1c166200de03610280516101605162005f16565b526200de126102805162005ec0565b610280526200ddaa565b50979294959093985095909560005b8281106200dec9575050506103405162005ede5761016051516001600160401b03811162003f6d576200de6a81620138976102405160031b016200624a565b60206101605101620138976102405160031b01600052602060002060005b8381106200deab57505050506200de9f9062005ec0565b9492959091956200db56565b82516001600160a01b0316818301556020909201916001016200de88565b6200df0f906001600160a01b036200dee2828562005f16565b51166200def6610280516101605162005f16565b526200df056102805162005ec0565b6102805262005ec0565b6200de2b565b90919260208101516026811015620040d5576016036200dfcb5761010060406200df43920151015162005ed0565b519160005b83518110156200c503576001600160a01b036200df66828662005f16565b516202712254929116600160401b83101562003f6d576001830180620271225583101562005ede5762027122600052600080516020620151ba83398151915290920180546001600160a01b0319169092179091556200dfc59062005ec0565b6200df48565b60208101516026811015620040d5576017036200e0285760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d5576018036200e0ec5761010060406200e053920151015162005ed0565b5191600160ff1962027125541617620271255560005b83518110156200c503576001600160a01b036200e087828662005f16565b516202712454929116600160401b83101562003f6d576001830180620271245583101562005ede57620271246000526000805160206201525a83398151915290920180546001600160a01b0319169092179091556200e0e69062005ec0565b6200e069565b6020819492939401516026811015620040d5576019036200e114575b506200b5bf9062005ec0565b60208101516026811015620040d557601a036200e28f5760e060406200e13e920151015162005ed0565b51906200e14f600383511462012d98565b6200e15a8262005ed0565b516200e16a62009cd88462005ef4565b51926200e253576200b5bf926001036200e24c576200e1926200e1f191620271205462007231565b6202712055604051906200e1a68262003ff4565b603282527f6469766964656e6461626c652062616c616e6365206f766572666c6f772077686020830152710cadc40e0e4dec6cae6e6d2dcce40c6c2e6d60731b604083015262005e8d565b6200e2456200e20462027121546200721e565b6202712155604051906200e2188262003fbc565b601a8252796469766964656e647320636f756e746572206f766572666c6f7760301b602083015262005e8d565b906200e108565b506200e245565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b60208101516026811015620040d557601b036200e892575091906202711e546200e2bc62009dc262014b3d565b62027121546202711f5411156200e2dd6200e2d662014bab565b8262005e8d565b6202712054906200e2ef8383620070e9565b50506200e2fb62014c01565b506000805b61271082106200e7e6575b5050906200e33b6200e34193926200e3316200e32662014b3d565b612710861062005e8d565b62002a1d62014bab565b620070e9565b90506200e34d62014c01565b5060009060005b61271081106200e70e575b50906127106200e3709204620072bf565b90506200e3816202712a5462006032565b906000946000905b6127108210156200e701578160031b9460ff6201389a87015416156200e4e75760009662013895870154156200e4d657600098975b62005ede57620138978701548910156200e4bc576200e3e38962013897890162006135565b600160a01b6001900391549060031b1c169788600052620138968801602052604098868a60002054906200e41791620070e9565b9a906200e42362014c01565b6200e42e9162005e8d565b60009a620138958b01546200e44391620070e9565b906200e44e62014c01565b6200e4599162005e8d565b826000526202711a6020528160002054906200e4759162007231565b9091600020556200e48562014c01565b6200e4909162005e8d565b6200e49c828962005f16565b526200e4a89062005ec0565b986200e4b49062005ec0565b98976200e3be565b929095506200e4ce9196975062005ec0565b90946200e389565b929095506200e4ce91965062005ec0565b95969392509350505b6200e4fb8262006032565b9160009160005b8281106200e66b575050506202711b54916200e523620094c6848462012de4565b926000906000905b8082106200e64e57505060005b8381106200e5b85750508251929150506001600160401b03821162003f6d576020906200e5658362006212565b016202711b600052602060002060005b8381106200e59a57505050506200b5bf9060006202712055600062027121556200e245565b82516001600160a01b0316818301556020909201916001016200e575565b6000805b8381106200e606575b50156200e5de575b6200e5d89062005ec0565b6200e538565b906200e5d8906200e5fd906001600160a01b036200952d858762005f16565b9190506200e5cd565b6001600160a01b03806200e61b858862005f16565b5116906200e62a838a62005f16565b5116146200e643576200e63d9062005ec0565b6200e5bc565b50506001386200e5c5565b90916200a1046200e66491620098868562006118565b906200e52b565b6000805b8581106200e6b9575b50156200e691575b6200e68b9062005ec0565b6200e502565b926200e68b906200e6b0906001600160a01b036200952d878662005f16565b9390506200e680565b6001600160a01b03806200e6ce858762005f16565b5116906200e6dd838a62005f16565b5116146200e6f6576200e6f09062005ec0565b6200e66f565b50506001386200e678565b939495929150506200e4f0565b90918160039695961b60ff6201389a82015416156200e7da5762013895810154620138978201546000928391825b8184106200e778575050505062007c2a6200e76f936200e76762001c389796946200379694620070e9565b92906200701f565b9493946200e354565b94929462005ede576200e7d3856200e7cb6200e79e62001c389862013897870162006135565b905460039190911b1c6001600160a01b031660009081526201389686016020526040812054909662007231565b97906200710b565b926200e73c565b5091909493946200e35f565b8160039897981b60ff6201389a82015416156200e888576201389581015490600062013897820154916000926000925b8184106200e853575050505062007c2a6200e849936200a1f3846200e33b620036c36200a1ff9662001c389a98620070e9565b909695966200e300565b93929362005ede576200e881846200e8796200e79e62001c389762013897870162006135565b96906200710b565b926200e816565b509695966200e30b565b60208101516026811015620040d557601c036200e8ef5760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601d036200e913575b506200b5bf906200e245565b60208101516026811015620040d557601e146200e9075760208101516026811015620040d557601f036200e9a9576200e95490604080910151015162005ed0565b51906202712354600160401b81101562003f6d576001810180620271235581101562005ede57620271236000526200b5bf926200e9a291600080516020620151da8339815191520162006976565b906200e907565b9060208201516026811015620040d5576020036200e9ce575b6200b5bf91506200e9a2565b60208201516026811015620040d5576021146200e9c25760208201516026811015620040d5576022036200ea57576200b5bf915060ff196202712554166202712555620271245460006202712455806200ea2a575b506200e9c2565b620271246000526200ea50906000805160206201525a833981519152908101906200614e565b386200ea23565b60208201516026811015620040d5576023036200ea7b575b6200b5bf91506200e9c2565b60208201516026811015620040d5576024146200ea6f5760208201516026811015620040d5576025146200ea6f5760208201516026811015620040d5576015036200ead5576200eacf6200b5bf9262013370565b6200ea6f565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7065726174696f6e207479706560501b6044820152606490fd5b509190506200eb228162012292565b906006811015620040d557600281036200eb515760405162461bcd60e51b81528062005ebc6004820162007c9d565b600381036200ec045750303b1562003f3757906040518092639543bf6760e01b82526044820160406004840152815180915260206064840192019060005b8181106200ebea575050506200ebb58291600094600319848303016024850152620058d3565b038183305af180156200ebde576200ebca5750565b6001600160401b03811162003f6d57604052565b6040513d6000823e3d90fd5b82518452869450602093840193909201916001016200eb8f565b60059150146200ec115750565b906000905b602083015180518310156200a4b957826200ec319162005f16565b5160208101516026811015620040d557156200a4765760208101516026811015620040d5576001036200ee7a57604001906200ec736101008351015162005ed0565b51936200ec8a60e062007dd6818651015162005ed0565b51916200ec9b86518551146201314c565b6200ecaa8651845114620131b2565b60005b86518110156200ee01576200ecc3818662005f16565b5161271081101562005ede57600160ff60076200ece99360031b01541615151462013214565b6200ecf5818562005f16565b516200ed02828762005f16565b519061271082101562005ede5760066200ed229260031b01549062007231565b906200ed2f838862005f16565b519161271083101562005ede5760066200ed4e9360031b01556201326c565b6200ed5a818562005f16565b516200ed67828762005f16565b519061271082101562005ede576200eda8916003906001600160a01b036200ed90868d62005f16565b5116600052811b016020526040600020549062007231565b91906200edb6828862005f16565b519061271082101562005ede576200edfb9362001c38926003906001600160a01b036200ede4878f62005f16565b5116600052811b01602052604060002055620132cb565b6200ecad565b50949150916200ee156200ee1c9162014a3f565b9162014923565b93604051926200ee2c8462003fd8565b60008452600036813760005b83518110156200ee5d578062001c3862007f9d6200ee57938762005f16565b6200ee38565b50945092602092506200ee71915062005ec0565b9190506200ec16565b6020819492939401516026811015620040d5576002036200f115576040018051926040840151906200eeb562007fff60e08097015162005ed0565b519382518651036200f0c05782518451036200f06a5782518551036200f0115760005b86518110156200effb576200eeee818862005f16565b5161271081101562005ede5760ff60076200ef109260031b0154161562013324565b6200ef1c818862005f16565b5161271081101562005ede5760031b600701805460ff191660011790556200ef45818562005f16565b516200ef52828962005f16565b519061271082101562005ede5760056200ef709260031b0162006976565b6200ef7c818662005f16565b516200ef89828962005f16565b5161271081101562005ede5760031b600101556200efa8818762005f16565b516200efb5828962005f16565b5161271081101562005ede5760031b600201556200efd4818862005f16565b519061271082101562005ede57600060066200eff59360031b015562005ec0565b6200eed8565b509591509350602092506200ee71915062005ec0565b60405162461bcd60e51b815260206004820152603c60248201526000805160206201521a83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b60405162461bcd60e51b815260206004820152603960248201526000805160206201521a8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201526000805160206201521a8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b6020819493929401516026811015620040d5576003036200f143576020919262001c386200ee7192620138d6565b60208101516026811015620040d5576004036200f3ed576200f16e6101006040830151015162005ed0565b51936200f1846101006040840151015162005ef4565b51906200f1ab60e060406200f19f8282880151015162005ed0565b51950151015162005ef4565b51936200f1c0875184511462002a1d62014cb0565b6200f1d3875185511462002a1d62014cb0565b6200f1e6875186511462002a1d62014cb0565b60005b87518110156200f24f576200f1ff818662005f16565b519061271082101562005ede576200f249916003906001600160a01b036200f228848d62005f16565b5116600052811b0160205262001c386040600020546200838d838a62005f16565b6200f1e9565b509095919593929360005b83518110156200f3aa576200f270818762005f16565b5161271081101562005ede576003906001600160a01b036200f293848862005f16565b5116600052811b016020526200f2b46040600020546200840b838862005f16565b906200f2c1838962005f16565b519161271083101562005ede576200f305926003906001600160a01b036200f2ea878b62005f16565b5116600052811b0160205260406000205562002a1d62014db4565b6200f311818762005f16565b5161271081101562005ede576003906001600160a01b036200f334848c62005f16565b5116600052811b016020526200f3556040600020546200746f838862005f16565b9190506200f364818862005f16565b519161271083101562005ede576200f3a4926003906001600160a01b036200f38d858e62005f16565b5116600052811b0160205260406000205562005ec0565b6200f25a565b50936200f3c49192969350620085056200850c9162014a3f565b9260005b83518110156200ee5d578062001c3862007f9d6200f3e7938762005f16565b6200f3c8565b9260208401516026811015620040d5576005036200f5ab5760408401906200f41f60e062008575818551015162005ed0565b519282518451036200bc385760005b83518110156200f487576200f444818562005f16565b519061271082101562005ede5760036200f4819260018060a01b038a5116600052811b0160205262001c386040600020546200838d838962005f16565b6200f42e565b509060005b83518110156200f52a576200f4a2818562005f16565b5161271081101562005ede5760039060018060a01b03895116600052811b016020526200f4da6040600020546200840b838862005f16565b91906200f4e8828762005f16565b519061271082101562005ede576200f52493600362001c389360018060a01b038d5116600052811b0160205260406000205562002a1d62014db4565b6200f48c565b50949250906200f53a9062014a3f565b90604051926200f54a8462003fbc565b6001845260203681860137516001600160a01b03166200f56a8462005ed0565b52604051946200f57a8662003fd8565b60008652600036813760005b83518110156200ee5d578062001c3862007f9d6200f5a5938762005f16565b6200f586565b9260208101516026811015620040d5576006036200f764576040016200f5d76101008251015162005ed0565b51936200f5ee60e062008575818551015162005ed0565b519285518351036200c22d5785518451036200c1e05760005b86518110156200f66d576200f61d818562005f16565b519061271082101562005ede576200f667916003906001600160a01b036200f646848c62005f16565b5116600052811b0160205262001c386040600020546200838d838962005f16565b6200f607565b509060005b86518110156200f70e576200f688818562005f16565b5161271081101562005ede576003906001600160a01b036200f6ab848b62005f16565b5116600052811b016020526200f6cc6040600020546200840b838862005f16565b91906200f6da828762005f16565b519061271082101562005ede576200f7089362001c38926003906001600160a01b036200f2ea878f62005f16565b6200f672565b5094916200f7239193506200ee159062014a3f565b91604051946200f7338662003fd8565b60008652600036813760005b83518110156200ee5d578062001c3862007f9d6200f75e938762005f16565b6200f73f565b60208101516026811015620040d5576007036200f87b57604001926200f7906101008551015162005ed0565b519160406200f7a460e08751015162005ed0565b5195510151916200f7bd845187511462002a1d62014cb0565b60005b84518110156200ee5d576200f8759062001c386001600160a01b03806200f7e8848a62005f16565b51166000528660028b6200f8656200f828876200f8208162013880978860205262008a8360ff604060002054161562002a1d62014d81565b519362005f16565b519162008ae78d604051966200f83e8862003f51565b60018852886200c37f8c60208b01946000865260408c0197885260608c01998a5262005f16565b5191015562008b02838962005f16565b6200f7c0565b60208194939401516026811015620040d5576008036200f9145761010060406200f8a9920151015162005ed0565b519160005b83518110156200f902576200f8fc906001600160a01b03806200f8d2838862005f16565b51166000526201388090816020526200c4a0600160ff6040600020541615151462002a1d62014ce0565b6200f8ae565b509260209192506200ee719062005ec0565b60208101516026811015620040d5576009036200f9985761010060406200f93f920151015162005ed0565b519160005b83518110156200f902576200f992906001600160a01b03806200f968838862005f16565b51166000526201388090816020526200c590600160ff6040600020541615151462002a1d62014ce0565b6200f944565b60208101516026811015620040d557600a036200fa4857604001906200f9ca60e06200c6256101008551015162005ed0565b51926200f9df835185511462002a1d62014cb0565b60005b83518110156200fa35576200fa2f906001600160a01b03806200fa06838862005f16565b511660005262013880806020526200c695600160ff6040600020541615151462002a1d62014ce0565b6200f9e2565b50936200ee719193506020925062005ec0565b6020819493929401516026811015620040d557600b036200fb00576040019260406200fa7a6101008651015162005ed0565b5194510151916200fa93855184511462002a1d62014cb0565b60005b85518110156200faed576200fae79062001c386001600160a01b03806200fabe848b62005f16565b511660005262013880806020526200c77c600160ff6040600020541615151462002a1d62014ce0565b6200fa96565b50935091602091506200ee719062005ec0565b90919260208201516026811015620040d557600c036200fc365760a0604083015101519260005b84518110156200fa355760e06200fb478260a06040880151015162005f16565b510151156200fbc6576200fb6862008f098260a06040880151015162005f16565b620138825480600019810111620033d6576200fb8a6005916000190162006f24565b5001805461ff00191661010017905562013882549060001982018210620033d657600562008f5e6200fbc0936000190162006f24565b6200fb27565b6200fbde62008f888260a06040880151015162005f16565b620138825480600019810111620033d6576200fc006005916000190162006ee2565b5001805461ff00191661010017905562013882549060001982018210620033d657600562008f5e6200fbc0936000190162006ee2565b92919060208101516026811015620040d557600d036200fd4a576040019260606200fc6660e08651015162005ed0565b5194510151916200fc7b855184511462012e8b565b60005b85518110156200faed57806200fc996200fcf2928662005f16565b51156200fcf8576200fcb06200906b828962005f16565b6200fcc860ff60056200c9ac6200908d858c62005f16565b6200fce060ff6005620090a66200908d858c62005f16565b6005620090c26200908d838a62005f16565b6200fc7e565b6200fd08620090fa828962005f16565b6200fd2060ff60056200c9ac6200911c858c62005f16565b6200fd3860ff6005620090a66200911c858c62005f16565b6005620090c26200911c838a62005f16565b60208194929401516026811015620040d557600e036200fe11576040019060606200fd7a60e08451015162005ed0565b5192510151936200fd8f835186511462012e8b565b60005b83518110156200faed57806200fdad6200fdb9928862005f16565b516200fdbf5762005ec0565b6200fd92565b6200fdcf620091b8828762005f16565b6200fde760ff60056200caeb6200908d858a62005f16565b6200fdff60ff6005620092006200908d858a62005f16565b600562008f5e6200908d838862005f16565b9060208294939401516026811015620040d557600f036200ff485760a0604083015101519260005b84518110156200fa355760e06200fe598260a06040880151015162005f16565b510151156200fed8576200fe7a62008f098260a06040880151015162005f16565b620138825480600019810111620033d6576200fe9c6005916000190162006f24565b5001805461ff00191661010017905562013882549060001982018210620033d6576005620090c26200fed2936000190162006f24565b6200fe39565b6200fef062008f888260a06040880151015162005f16565b620138825480600019810111620033d6576200ff126005916000190162006ee2565b5001805461ff00191661010017905562013882549060001982018210620033d6576005620090c26200fed2936000190162006ee2565b9060208194939401516026811015620040d5576010036200ffb95760400151906200ff7c60e060c084015193015162005ed0565b51936200ff91835186511462002a1d62014cb0565b60005b83518110156200faed578062001c38620093a26200ffb3938762005f16565b6200ff94565b60208194929401516026811015620040d5576011036201021f57604001906200ffee60e06200c6256101008551015162005ed0565b51936200ffff835186511462012d98565b60005b83518110156201007a57620100749062001c386001600160a01b03806201002a848962005f16565b511660005262013885806020526201004d6040600020546200746f868d62005f16565b9190926201005c868b62005f16565b511660005260205260406000205562002a1d62014c66565b62010002565b50935090620100899062014923565b90620138865493620100a1620094c684518762012de4565b9060009260005b87811062010204575060005b85518110156201015b576000805b8981106201010c575b5015620100e4575b620100de9062005ec0565b620100b4565b93620100de9062010103906001600160a01b036200cf54888a62005f16565b949050620100d3565b620101178162006087565b90546001600160a01b0360039290921b1c81169062010137858b62005f16565b51161462010150576201014a9062005ec0565b620100c2565b5050600138620100cb565b5095509392506201016c8262006032565b8051906001600160401b03821162003f6d576020906201018c83620061a3565b0162013886600052602060002060005b838110620101e6575050505060005b828110620101c3575050506200ee7160209162005ec0565b620101e09062001c386001600160a01b0362002fc8838662005f16565b620101ab565b82516001600160a01b0316818301556020909201916001016201019c565b936200d0a162010219916200d0838762006087565b620100a8565b60208194929401516026811015620040d5576012036201046957604001906201025460e06200c6256101008551015162005ed0565b519362010265835186511462012d98565b60005b8351811015620102b957620102b39062001c386001600160a01b038062010290848962005f16565b511660005262013885806020526201004d6040600020546200840b868d62005f16565b62010268565b5093509190620102c99062014923565b6201388654620102d98162006032565b906000926000915b8083106201038f57505050620102f78262006032565b8051906001600160401b03821162003f6d576020906201031783620061a3565b0162013886600052602060002060005b83811062010371575050505060005b8281106201034e575050506200ee7160209162005ec0565b6201036b9062001c386001600160a01b0362002fc8838662005f16565b62010336565b82516001600160a01b03168183015560209092019160010162010327565b91956000959193959760005b85518110156201045a57620103b08962006087565b90546001600160a01b0360039290921b1c811690620103d0838962005f16565b511614620103e957620103e39062005ec0565b6201039b565b509750956001959391955b8062010428575b1562010413576201040c9062005ec0565b91620102e1565b936200d0a16201040c916200d0838762006087565b50620104348162006087565b60018060a01b0391549060031b1c166000526201388560205260406000205415620103fb565b509796909695939195620103f4565b60208101516026811015620040d557601303620104c25760400151608001519260005b8451811015620104b1578062001c3862009931620104ab938862005f16565b6201048c565b509250906200ee7160209162005ec0565b60208101516026811015620040d557601403620106705760400190620104ee6101008351015162005ed0565b51936201050560e062007dd6818651015162005ed0565b51916201051686518551146201314c565b620105258651845114620131b2565b60005b86518110156201061b576201053e818562005f16565b516201054b828762005f16565b519061271082101562005ede5760066201056b9260031b01549062007231565b9062010578838862005f16565b519161271083101562005ede576006620105979360031b01556201326c565b620105a3818562005f16565b51620105b0828762005f16565b519061271082101562005ede57620105d9916003906001600160a01b036200ed90868d62005f16565b9190620105e7828862005f16565b519061271082101562005ede57620106159362001c38926003906001600160a01b036200ede4878f62005f16565b62010528565b50949150916200ee156201062f9162014a3f565b93604051926201063f8462003fd8565b60008452600036813760005b83518110156200ee5d578062001c3862007f9d6201066a938762005f16565b6201064b565b60208101516026811015620040d5576015036201069a576020919262001c386200ee7192620138d6565b60208101516026811015620040d557601603620106f7576101006040620106c5920151015162005ed0565b519260005b8451811015620104b157620106f19062001c386001600160a01b0362009b7a838962005f16565b620106ca565b60208101516026811015620040d557601703620107545760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601803620107c25761010060406201077f920151015162005ed0565b5192600160ff1962013892541617620138925560005b8451811015620104b157620107bc9062001c386001600160a01b0362009c48838962005f16565b62010795565b60208193929301516026811015620040d557601903620107eb575b506200ee7160209162005ec0565b60208101516026811015620040d557601a03620108f4576201081660e0604080930151015162005ed0565b5162010826600382511462012d98565b620108318162005ed0565b51916201084a620108428362005ef4565b519262005f05565b5191620108ba5750916200ee7191600160209414600014620108b3576201087a62010889916201388d5462007231565b6201388d5562002a1d62014c01565b620108ab6201089c6201388e546200721e565b6201388e5562002a1d62014c3b565b9150620107dd565b50620108ab565b5162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b60208101516026811015620040d557601b0362010d2c57509190620109256201388b546200370b62009dc262014b3d565b50506201093162014c01565b506000805b612710811062010ce0575b50506201094d62007243565b6201095c6202712a5462006032565b906000946000905b61271082101562010cd3578160031b9460ff6007870154161562010ab75760009660028701541562010aa657600098975b62005ede57600487015489101562010a8c57620109b6896004890162006135565b9054600391821b1c6001600160a01b0316600081815291890160205260409182902054919991620109e9908890620070e9565b9a90620109f562014c01565b62010a009162005e8d565b60009a60028b015462010a1391620070e9565b9062010a1e62014c01565b62010a299162005e8d565b826000526201388760205281600020549062010a459162007231565b90916000205562010a5562014c01565b62010a609162005e8d565b62010a6c828962005f16565b5262010a789062005ec0565b9862010a849062005ec0565b989762010995565b9290955062010a9e9196975062005ec0565b909462010964565b9290955062010a9e91965062005ec0565b95969392509350505b62010acb8262006032565b9160009160005b82811062010c3d5750505062013888549162010af3620094c6848462012de4565b926000906000905b80821062010c2057505060005b83811062010b8a5750508251929150506001600160401b03821162003f6d5760209062010b358362006167565b0162013888600052602060002060005b83811062010b6c57505050506200ee7160209160006201388d5560006201388e55620108ab565b82516001600160a01b03168183015560209092019160010162010b45565b6000805b83811062010bd8575b501562010bb0575b62010baa9062005ec0565b62010b08565b9062010baa9062010bcf906001600160a01b036200952d858762005f16565b91905062010b9f565b6001600160a01b038062010bed858862005f16565b51169062010bfc838a62005f16565b51161462010c155762010c0f9062005ec0565b62010b8e565b505060013862010b97565b90916200a10462010c369162009886856200606a565b9062010afb565b6000805b85811062010c8b575b501562010c63575b62010c5d9062005ec0565b62010ad2565b9262010c5d9062010c82906001600160a01b036200952d878662005f16565b93905062010c52565b6001600160a01b038062010ca0858762005f16565b51169062010caf838a62005f16565b51161462010cc85762010cc29062005ec0565b62010c41565b505060013862010c4a565b9394959291505062010ac0565b8060039594951b9060ff6007830154161562010d22576200a1ff62007c2a62001c38946200a1f362010d199560026200a1e9876200708c565b93929362010936565b5093929362010941565b60208101516026811015620040d557601c0362010d895760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601d0362010daf575b506200ee71602091620108ab565b60208101516026811015620040d557601e1462010da15760208101516026811015620040d557601f0362010e035760209162010dfb6200a2df6200ee7193604080910151015162005ed0565b915062010da1565b60208101516026811015620040d55760200362010e29575b506200ee7160209162010dfb565b60208101516026811015620040d55760211462010e1b5760208101516026811015620040d55760220362010e7f57506200ee7160209160ff19620138925416620138925562010e7762006236565b915062010e1b565b60208101516026811015620040d55760230362010ea5575b506200ee7160209162010e77565b60208101516026811015620040d55760241462010e975760208101516026811015620040d55760251462010e975792909160208401516026811015620040d5576015036200ead557604084019062010f036101008351015162005ed0565b519062010f1a60e062007dd6818651015162005ed0565b519362010f2f835185511462002a1d62014cb0565b62010f42835186511462002a1d62014cb0565b60005b835181101562010f9e5762010f5b818662005f16565b519061271082101562005ede57600362010f989260018060a01b038b5116600052811b0160205262001c386040600020546200838d838a62005f16565b62010f45565b509095919560005b8751811015620110e45762010fbc818662005f16565b5161271081101562005ede5760039060018060a01b03865116600052811b0160205262010ff46040600020546200840b838962005f16565b9062011001838862005f16565b519161271083101562005ede576003620110389360018060a01b03895116600052811b0160205260406000205562002a1d62014db4565b62011044818662005f16565b5161271081101562005ede576003906001600160a01b0362011067848c62005f16565b5116600052811b01602052620110886040600020546200746f838962005f16565b919062011096828862005f16565b519061271082101562005ede57620110de93600362001c38938d620110c38760018060a01b039262005f16565b5116600052811b0160205260406000205562002a1d62014e19565b62010fa6565b5092620110fc919294506200db1a9096959662014a3f565b92604051906201110c8262003fbc565b6001825260203681840137516001600160a01b03166201112c8262005ed0565b526000945b8051861015620114d65762011147868262005f16565b516102205262011158855162006032565b9660009462011168845162006032565b6101405260009460005b885181101562011238578a89620111a26001600160a01b0362011196858462005f16565b5116610220516201480c565b1580620111f2575b620111c3575b5050620111bd9062005ec0565b62011172565b98620111e79162001e4382859c6200b2a9620111bd9760018060a01b039262005f16565b9790508a89620111b0565b50505061271061022051101562005ede576001600160a01b0362011217828b62005f16565b5116600052600361022051811b016020528a896040600020541515620111aa565b50909895979498969291939660005b8851811015620112db5761271061022051101562005ede576001600160a01b0362011273828b62005f16565b5116600052600361022051811b0160205260406000205415620112a2575b6201129c9062005ec0565b62011247565b996201129c90620112d2906001600160a01b03620112c18e8d62005f16565b511662001e43826101405162005f16565b9a905062011291565b5098509695929190939661022051612710811015806101805262005ede5760031b600401549862011311620094c6898c62012de4565b608052600061020052600060c0525b6101805162005ede5760c0518a811015620113e45762011354620113719160006101805260046102205160031b0162006135565b90546101405160039290921b1c6001600160a01b031690620148ce565b156201138e575b6201138560c05162005ec0565b60c05262011320565b600061018052620113ab60c05160046102205160031b0162006135565b60018060a01b0391549060031b1c16620113cb6102005160805162005f16565b52620113da6102005162005ec0565b6102005262011378565b50979294959093985095909560005b8281106201148b575050506101805162005ede57608051516001600160401b03811162003f6d576201142f8160046102205160031b016200624a565b60206080510160046102205160031b01600052602060002060005b8381106201146d5750505050620114619062005ec0565b94929590919562011131565b82516001600160a01b0316818301556020909201916001016201144a565b620114d0906001600160a01b03620114a4828562005f16565b5116620114b76102005160805162005f16565b52620114c66102005162005ec0565b6102005262005ec0565b620113f3565b5050936200ee7191935060209250915062010e97565b82516001600160a01b0316818301556020909201916001016200aefe565b82516001600160a01b0316818301556020909201916001016200ada9565b600191820180546001600160a01b03909216848601559390910192906200acf1565b6202712460005262011572906000805160206201525a8339815191529081019083016200614e565b386200acb1565b600180826201158a82948662011a34565b019201920191906200ac70565b62027123600052600080516020620151da833981519152908282015b8183018110620115c55750506200ac34565b80620115d36001926200651c565b01620115b3565b600191820180546001600160a01b03909216848601559390910192906200ac02565b620271226000526201162490600080516020620151ba8339815191529081019083016200614e565b386200abc2565b82516001600160a01b0316818301556020909201916001016200aa84565b620116629084600052858460002091820191016200614e565b386200aa76565b82516001600160a01b0316818301556020909201916001016200a899565b620116a39062027114600052848460002091820191016200614e565b386200a888565b80620116cc9160031b600160ff600783015416151514620116d2575062005ec0565b6200a7d8565b620116e660048201620138978301620119c5565b6201389a8101600160ff198254161790558054816201389301556001810154620138948201556002810154620138958201556201172c6005820162013898830162011a34565b620138996006820154910155386200cdf4565b600660208262011753600194518662006a8c565b019201920191906200a5c5565b6006818102048103620033d6576006838102048303620033d657620271156000527f0f9b10e190177c3c56fc6ce7689c8130c567df57aa02c08e7a090a59992adf926006840281015b8260060282018110620117be5750506200a5b1565b8060006006925560006001820155620117da6002820162006718565b60006003820155620117ef600482016200651c565b6000600582015501620117a9565b600660208262011811600194518662006a8c565b019201920191906200a535565b80600602906006820403620033d65782600602600681048403620033d6576000906202711682526020822092830192015b8281106201185f5750506200a521565b808260069255826001820155620118796002820162006718565b8260038201556201188d600482016200651c565b826005820155016201184f565b608460405162461bcd60e51b815260206004820152604060248201526000805160206201527a83398151915260448201527f656d2073686f756c64206e6f742072657475726e20766f7465206e65656465646064820152fd5b60405162461bcd60e51b815260206004820152604760248201526000805160206201527a83398151915260448201527f656d2073686f756c64206e6f742072657475726e206120766f74696e672072756064820152661b19481b1a5cdd60ca1b608482015260a490fd5b818114620119c1578154916001600160401b03831162003f6d576201198383836200624a565b60005260206000209060005260206000208154916000925b848410620119aa575050505050565b60018091920193845492818501550192906201199b565b5050565b818114620119c1578154916001600160401b03831162003f6d57620119eb83836200624a565b60005260206000209060005260206000208154916000925b84841062011a12575050505050565b600191820180546001600160a01b039092168486015593909101929062011a03565b90808214620119c15762011a4981546200555f565b906001600160401b03821162003f6d57819062011a738262011a6c86546200555f565b866200692c565b600090601f831160011462011aac5760009262011aa05750508160011b916000199060031b1c1916179055565b015490503880620069bf565b81526020808220858352818320935090601f1985169083905b82821062011b0157505090846001959493921062011ae757505050811b019055565b015460001960f88460031b161c1916905538808062006a0c565b849581929585015481556001809101960194019062011ac5565b818114620119c15781549162011b328383620065ad565b6000526020600020906000526020600020906000905b83821062011b565750505050565b8062011b656001928562011a34565b92810192918101910162011b48565b818114620119c15781549162011b8b83836200663b565b6000526020600020906000526020600020906000905b83821062011baf5750505050565b8062011bbe600192856201195d565b92810192918101910162011ba1565b818114620119c15781549162011be483836200663b565b6000526020600020906000526020600020906000905b83821062011c085750505050565b8062011c1760019285620119c5565b92810192918101910162011bfa565b818114620119c15781549162011c3d8383620066c9565b6000526020600020906000526020600020906000905b83821062011c615750505050565b8062011c706001928562011b1b565b92810192918101910162011c53565b818114620119c15781549162011c968383620067db565b6000526020600020906000526020600020906000905b83821062011cba5750505050565b80600191840362011cd7575b600980910193019101909162011cac565b805484558162011d198186019183019160ff62011cf88185541683620068cf565b83549362011d0d82600896871c1684620068e9565b5460101c16906200690a565b62011d2b60028084019087016201195d565b60038281019190860183870362011d46575b50505062011cc6565b62011daa9262011d56916201195d565b62011d686004808501908801620119c5565b62011d7a600580850190880162011b1b565b62011d8c600680850190880162011b74565b62011d9e600780850190880162011bcd565b80830190860162011c26565b38808062011d3d565b919062006f9d5780820362011dc6575050565b60ff600580620054e69462011ddf8486541682620068b6565b6001850154600182015562011dfb600286016002830162011c7f565b6003850154600382015562011e17600486016004830162011a34565b01920162011e29828254168462006a49565b62011e3b82825460081c168462006a5a565b5460101c169062006a72565b90808214620119c157908154906000915b6064831062011e675750505050565b600180919401928354948184015501919262011e58565b906201388254602060009301908151519062011e9a8262004034565b9162011eaa604051938462004010565b80835262011ebb601f199162004034565b0136602084013762011ed083515182620070e9565b90156201223a5762011ee29062006032565b90859284515115620122315762011ef98262006032565b965b8551518110156201207a5760008080805b86811062011f915750905062011f2e8162011f28858762005f16565b6200572f565b6006811015620040d55760031462011f53575b5062011f4d9062005ec0565b62011efb565b6000905b80821062011f66575062011f41565b9095620098a462011f8a9162011f7d898d62005f16565b5162001e43828a62005f16565b9062011f57565b62011faa8162011fa3878d5162005f16565b5162012653565b9390948083118062012066575b156201201d57505091838562012013575b6006811015620040d55760038e911462011ff3575b505062011fea9062005ec0565b91909162011f0c565b946201200a9162001e438262011fea959862005f16565b93908c62011fdd565b6000955062011fc8565b809492959195148062012052575b1562011fdd576006811015620040d55760038e911462011ff357505062011fea9062005ec0565b506006811015620040d5578015156201202b565b506006861015620040d55785151562011fb7565b5093505090929350600093845b8351861015620121cc57620120a7620120a1878662005f16565b620068a8565b90600680831015620040d5576002928303620120d2575050620120cb909562005ec0565b9462012087565b620120e2620120a1898862005f16565b9281841015620040d557600180941480620121b8575b156201210d57505050620120cb909562005ec0565b62012122620120a18a899b9694959b62005f16565b9280841015620040d557600480941492836201218c575b508262012161575b505062012155575b50620120cb9062005ec0565b9550620120cb62012149565b9091508810156201217757871415388062012141565b602182634e487b7160e01b6000525260246000fd5b908093508a1015620121a357891415913862012139565b602184634e487b7160e01b6000525260246000fd5b5081831015620040d55780831415620120f8565b9250929093506006821015620040d5576003820362012228575b620121f18162006032565b9360005b82811062012204575050509190565b806201221562012222928462005f16565b5162001e43828962005f16565b620121f5565b506000620121e6565b50909392505050565b60405162461bcd60e51b815260206004820152602a60248201527f546865206c656e677468206f6620766f74696e672072756c65206c697374206960448201526973206f766572666c6f7760b01b6064820152608490fd5b9062013883546020600093019081515190620122ae8262004034565b91620122be604051938462004010565b808352620122cf601f199162004034565b01366020840137620122e483515182620070e9565b90156201223a57620122f69062006032565b9085928451511562012231576201230d8262006032565b965b8551518110156201247b5760008080805b86811062012392575090506201233c8162011f28858762005f16565b6006811015620040d55760031462012361575b506201235b9062005ec0565b6201230f565b6000905b8082106201237457506201234f565b9095620098a46201238b9162011f7d898d62005f16565b9062012365565b620123ab81620123a4878d5162005f16565b51620126ef565b9390948083118062012467575b156201241e57505091838562012414575b6006811015620040d55760038e9114620123f4575b5050620123eb9062005ec0565b91909162012320565b946201240b9162001e4382620123eb959862005f16565b93908c620123de565b60009550620123c9565b809492959195148062012453575b15620123de576006811015620040d55760038e9114620123f4575050620123eb9062005ec0565b506006811015620040d5578015156201242c565b506006861015620040d557851515620123b8565b5093505090929350600093845b83518610156201259d57620124a2620120a1878662005f16565b90600680831015620040d5576002928303620124cd575050620124c6909562005ec0565b9462012488565b620124dd620120a1898862005f16565b9281841015620040d55760038094148062012589575b156201250857505050620124c6909562005ec0565b6201251d620120a18a899b9694959b62005f16565b9280841015620040d5576005809414928362012572575b50826201255c575b505062012550575b50620124c69062005ec0565b9550620124c662012544565b909150881015620040d55787141538806201253c565b908093508a1015620040d557891415913862012534565b5081831015620040d55780831415620124f3565b9250929093506006821015620040d55760038203620125ec575b620125c28162006032565b9360005b828110620125d5575050509190565b8062012215620125e6928462005f16565b620125c6565b506000620125b7565b15620125fd57565b60405162461bcd60e51b815260206004820152602860248201527f506c7567696e466163746f72793a20706c7567696e20696e646578206f7574206044820152676f662072616e676560c01b6064820152608490fd5b90916000809381936201266c62013882548310620125f5565b60ff60056201267b8462006f24565b50015460081c1615620126e3578282620126979260016201285b565b620126a3575b50929190565b8094506001929350620126b7915062006f24565b500154906003620126d860ff620126ce8662006f24565b5054169462006f24565b50015491386201269d565b50509150915080918190565b90916000809381936201270862013883548310620125f5565b60ff6005620127178462006ee2565b50015460081c1615620126e35782826201273292826201285b565b6201273d5750929190565b809450600192935062012751915062006ee2565b500154906003620126d860ff620127688662006ee2565b5054169462006ee2565b156201277a57565b60405162461bcd60e51b815260206004820152603160248201527f436865636b696e6720636f6e646974696f6e206578703a20706c7567696e20696044820152706e646578206f7574206f662072616e676560781b6064820152608490fd5b15620127e157565b60405162461bcd60e51b815260206004820152602f60248201527f436865636b696e6720636f6e646974696f6e206578703a206e6f646520696e6460448201526e6578206f7574206f662072616e676560881b6064820152608490fd5b805482101562005ede576000526009602060002091020190600090565b90929190801562012bca57620128776201388254831062012772565b620128936002620128888462006f24565b5001548410620127d9565b801562012bac57620128c36001620128ba856002620128b28762006f24565b50016201283e565b50015460ff1690565b620128ce816200418b565b80620128de575050505050600090565b620128e9816200418b565b60038103620128fc575050505050600190565b62012907816200418b565b600481036201291a575050505050600090565b62012925816200418b565b6001908082036201293e57505092620046bd9362012bf2565b9092936201294c826200418b565b600280921462012962575b505050505050600090565b821562012b8f576201298b846201297f8385620128b28a62006f24565b50015460081c60ff1690565b925b60009586865b62012b1d575b50620129a58762006032565b9760005b88811062012ac0575050505050620129c182620040ca565b81830362012a2057505091906000915b818310620129df5750505090565b90919280620129fd575b620129f5909362005ec0565b9190620129d1565b50620129f562012a1862012a12858462005f16565b51151590565b9050620129e9565b90915062012a2e82620040ca565b810362012a8757509060009182915b81831062012a4b5750505090565b909192801562012a6a575b62012a62909362005ec0565b919062012a3d565b5062012a6262012a7f62012a12858462005f16565b905062012a56565b6003915062012a9681620040ca565b1462012aa9575038808080808062012957565b62012abc62012a12620046bd9262005ed0565b1590565b808a62012afc62012af362012ae9848b62012ae18c82620128b28d62006ee2565b500162006135565b90549060031b1c90565b8686896201285b565b62012b1062012b179462001c389362005f16565b9015159052565b620129a9565b8462012b2f8582620128b28662006ee2565b50015481101562012b895762012b5562012ae9828762012ae18882620128b28962006ee2565b62012b6e575b62012b67879162005ec0565b9062012993565b9662012b6762012b7f889262005ec0565b9891505062012b5b565b62012999565b62012ba5846201297f8385620128b28a62006ee2565b926201298d565b62012bc46001620128ba856002620128b28762006ee2565b620128c3565b62012bdb6201388354831062012772565b62012bec6002620128888462006ee2565b62012893565b909291600362012c44918360001462012cc65760ff600162012c1b876002620128b28662006f24565b50015460101c16945b841562012cb5576002620128b262012c3c9362006f24565b500162005803565b91603d811015620040d557602c810362012c8557505062012c686020915162005ed0565b519101516026811015620040d55762012c819062014e4c565b1490565b9092906001810362012c9a5750505050600090565b60031462012caa57505050600090565b620046bd9262012d36565b6002620128b262012c3c9362006ee2565b60ff600162012cdc876002620128b28662006ee2565b50015460101c169462012c24565b1562012cf257565b606460405162461bcd60e51b815260206004820152602060248201527f4f70657261746f722061646472657373206973206e6f742070726f76696465646044820152fd5b9190608062007468920162012d5060018251511462012cea565b62012d6b600162012d62835162005ed0565b51511462012cea565b516001600160a01b0392839162012d83919062005ed0565b5116921562012d925751161490565b51161490565b1562012da057565b60405162461bcd60e51b815260206004820152601c60248201527b496e76616c6964206e756d626572206f6620706172616d657465727360201b6044820152606490fd5b91908201809211620033d657565b62012dfd816200418b565b62012e0b6200cd5662014de3565b62012e16816200418b565b6001810362012e35575062012e2e6200cd8262014de3565b6201388b55565b62012e40816200418b565b6002810362012e5157506201388c55565b62012e5c816200418b565b6003810362012e6d57506201388d55565b8062012e7b6004926200418b565b1462012e845750565b6201388e55565b1562012e9357565b60405162461bcd60e51b815260206004820152604d60248201527f546865206c656e677468206f662074686520706c7567696e20696e646578657360448201527f20617272617920616e642074686520626f6f6c65616e206172726179206d757360648201526c74206265207468652073616d6560981b608482015260a490fd5b1562012f1c57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420706c7567696e20696e64657820746f20626520656e61626c604482015261195960f21b6064820152608490fd5b1562012f7457565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c6564206973206e6f742060448201526a1a5b9a5d1a585b1a5e995960aa1b6064820152608490fd5b1562012fd557565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c656420697320616c726560448201526a18591e48195b98589b195960aa1b6064820152608490fd5b156201303657565b60405162461bcd60e51b815260206004820152602360248201527f496e76616c696420706c7567696e20696e64657820746f2062652064697361626044820152621b195960ea1b6064820152608490fd5b156201308f57565b60405162461bcd60e51b815260206004820152602c60248201527f54686520706c7567696e20746f2062652064697361626c6564206973206e6f7460448201526b081a5b9a5d1a585b1a5e995960a21b6064820152608490fd5b15620130f157565b60405162461bcd60e51b815260206004820152602d60248201527f54686520706c7567696e20746f2062652064697361626c656420697320616c7260448201526c1958591e48191a5cd8589b1959609a1b6064820152608490fd5b156201315457565b60405162461bcd60e51b815260206004820152603060248201527f546865206c656e677468206f662074617267657420616e6420746f6b656e436c60448201526f185cdcc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b15620131ba57565b60405162461bcd60e51b815260206004820152602c60248201527f546865206c656e677468206f662074617267657420616e6420616d6f756e742060448201526b1a5cc81b9bdd08195c5d585b60a21b6064820152608490fd5b156201321c57565b60405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e20636c617373206973206e6f7420696e697469616c697a604482015261195960f21b6064820152608490fd5b156201327457565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20737570706c79206f662074686520746f6b656e206973604482015268206f766572666c6f7760b81b6064820152608490fd5b15620132d357565b60405162461bcd60e51b8152602060048201526024808201527f5468652062616c616e6365206f662074686520746f6b656e206973206f766572604482015263666c6f7760e01b6064820152608490fd5b156201332c57565b606460405162461bcd60e51b815260206004820152602060248201527f54686520746f6b656e20697320616c726561647920696e697469616c697a65646044820152fd5b906040820190620133876101008351015162005ed0565b5191620133a960e06201339e818451015162005ed0565b519251015162005ef4565b5191620133be845183511462002a1d62014cb0565b620133d1845184511462002a1d62014cb0565b60005b84518110156201343057620133ea818462005f16565b519061271082101562005ede57620138966201342a9260018060a01b0389511660005260031b0160205262001c386040600020546200838d838862005f16565b620133d4565b50929160005b83518110156201355d576201344c818462005f16565b51906127108083101562005ede5760018060a01b0390818951166000526201389660039481602091871b0181526201348f6040600020546200840b878a62005f16565b906201349c878b62005f16565b51918583101562005ede5784620134ca938f899051166000528a1b01845260406000205562002a1d62014db4565b620134d6858962005f16565b518381101562005ede57829085620134ef888d62005f16565b5116600052871b0181526201350f6040600020546200746f878a62005f16565b9290936201351e878b62005f16565b519081101562005ede57620135579762001c38966201353e898e62005f16565b51166000521b01905260406000205562002a1d62014e19565b62013436565b50506200ee156201356e9162014a3f565b90604051936201357e8562003fbc565b60018552602036818701376001600160a01b036104e0819052905116620135a58562005ed0565b526000935b8151851015620138cf57620135c0858362005f16565b5194620135ce845162006032565b91600093620135de825162006032565b6104a0528496855b87518110156201368a576201360d6104e05162013604838b62005f16565b51168b62014875565b15806201364f575b6201362c575b620136269062005ec0565b620135e6565b956201364662013626916104e0516200a0718a8c62005f16565b9690506201361b565b506127108a101562005ede576104e0516201366b828a62005f16565b5116600052620138968a60031b01602052604060002054151562013615565b509793929096949195976000986127108610159560031b98620138968a019a5b895181101562013726578762005ede576104e051620136ca828c62005f16565b51166000528b60205260406000205415620136f1575b620136eb9062005ec0565b620136aa565b976201371d620136eb918b6201370c8c6104e0519262005f16565b511662001e43826104a05162005f16565b989050620136e0565b50949591939650985096909596806104605262005ede576201389701806104c052549562013759620094c6868962012de4565b6104805260009788610440525b6104605162005ede576104405188811015620138045762013795620137ab916000610460526104c05162006135565b6104e05191549060031b1c166104a051620148ce565b15620137ca575b620137c06104405162005ec0565b6104405262013766565b97620137fd90620137e2610440516104c05162006135565b6104e05191549060031b1c1662001e43826104805162005f16565b97620137b2565b5095939096509690969391936000915b8383106201389e57505050506104605162005ede5761048051516001600160401b03811162003f6d576201384c816104c0516200624a565b602061048051016104c051600052602060002060006104e051905b848110620138875750505050506201387f9062005ec0565b9392620135aa565b600190602083865116950194818501550162013867565b6200a104620138c8916104e051620138b7868662005f16565b511662001e43826104805162005f16565b9162013814565b5050509050565b6040810190620138ec6101008351015162005ed0565b51916201390360e06201339e818451015162005ed0565b519362013918845183511462002a1d62014cb0565b6201392b845186511462002a1d62014cb0565b60005b8451811015620139885762013944818462005f16565b519061271082101562005ede57620139829160018060a01b03865116600052600390811b0160205262001c386040600020546200838d838a62005f16565b6201392e565b5092919360005b835181101562013ab357620139a5818462005f16565b5190612710918281101562005ede5760018060a01b03908189511660005260039081602091811b018152620139e56040600020546200840b868962005f16565b90620139f2868a62005f16565b51918783101562005ede578462013a1f93878f5116600052811b01845260406000205562002a1d62014db4565b62013a2b848862005f16565b518581101562005ede5782908462013a44878c62005f16565b5116600052811b01815262013a646040600020546200746f868962005f16565b91909262013a73868a62005f16565b519687101562005ede5762013aad9662001c389562013a93888d62005f16565b5116600052811b01905260406000205562002a1d62014e19565b6201398f565b50506200ee1562013ac49162014a3f565b906040519362013ad48562003fbc565b60018552602036818701376001600160a01b036104e081905290511662013afb8562005ed0565b526000935b8151851015620138cf5762013b16858362005f16565b519462013b24845162006032565b9160009362013b34825162006032565b610460528496855b875181101562013bdd5762013b636104e05162013b5a838b62005f16565b51168b6201480c565b158062013ba5575b62013b82575b62013b7c9062005ec0565b62013b3c565b9562013b9c62013b7c916104e0516200a0718a8c62005f16565b96905062013b71565b506127108a101562005ede576104e05162013bc1828a62005f16565b511660005260038a811b01602052604060002054151562013b6b565b509793929096949195976000986127108610159560031b9860038a019a5b895181101562013c77578762005ede576104e05162013c1b828c62005f16565b51166000528b6020526040600020541562013c42575b62013c3c9062005ec0565b62013bfb565b9762013c6e62013c3c918b62013c5d8c6104e0519262005f16565b511662001e43826104605162005f16565b98905062013c31565b50949591939650985096909596806104405262005ede57600401806104a052549562013ca8620094c6868962012de4565b6104c05260009788610480525b6104405162005ede57610480518881101562013d535762013ce462013cfa916000610440526104a05162006135565b6104e05191549060031b1c1661046051620148ce565b1562013d19575b62013d0f6104805162005ec0565b6104805262013cb5565b9762013d4c9062013d31610480516104a05162006135565b6104e05191549060031b1c1662001e43826104c05162005f16565b9762013d01565b5095939096509690969391936000915b83831062013ded57505050506104405162005ede576104c051516001600160401b03811162003f6d5762013d9b816104a0516200624a565b60206104c051016104a051600052602060002060006104e051905b84811062013dd657505050505062013dce9062005ec0565b939262013b00565b600190602083865116950194818501550162013db6565b6200a10462013e17916104e05162013e06868662005f16565b511662001e43826104c05162005f16565b9162013d63565b62013884805482101562005ede576000526007602060002091020190600090565b815180519192916001600160401b03811162003f6d5762013e6181856200624a565b6020809201846000528260002060005b83811062013ed8575050505060c082600692620054e6959401516001850155604081015160028501556060810151600385015562013eb9608082015115156004860162006a49565b62013ecc60a08201516005860162006976565b01511515910162006a49565b8251828201559184019160010162013e71565b620138848054600160401b81101562003f6d5762013f0f9160018201905562013e1e565b91909162006f9d57620054e69162013e3f565b62013890908154600160401b81101562003f6d576001810180845581101562005ede57620054e69260005260206000200162006976565b908062013f64575050565b620054e691600052601f6020600020910160051c8101906200614e565b90600160401b811162003f6d57815481835580821062013fa057505050565b620054e692600052601f6020600020918180850160051c840194168062013fcf575b500160051c01906200614e565b600019908186019182549160200360031b1c1690553862013fc2565b9060031b60ff811b9283911b169119161790565b6000926201401962014012859462013e1e565b50620056a8565b9380935b85515185101562014107575061271084101562005ede5760039380851b9460018060a01b03851660005260209086018152620140666040966001886000205491015490620070e9565b93849115620140d257906201407b9162007231565b96901562014098575050620140909062005ec0565b93906201401d565b60649250519062461bcd60e51b825260048201526014602482015273746f74616c20706f776572206f766572666c6f7760601b6044820152fd5b875162461bcd60e51b815260048101849052600e60248201526d706f776572206f766572666c6f7760901b6044820152606490fd5b93505092505090565b156201411857565b60405162461bcd60e51b815260206004820152601360248201527263757272656e74596573206f766572666c6f7760681b6044820152606490fd5b6001620141608262013e1e565b5001546202712e546000928184526202712b908160205262014189816003604088200162006135565b90549060031b1c9183865280602052620141aa826004604089200162006135565b90549060031b1c93865260205260ff6006620141df620141d184600560408b200162006135565b90549060031b1c9362013e1e565b500154166201422d57506201421d92620004326201420f9383620142076201421595620070b3565b969062014110565b62012de4565b929062014110565b1115620142275790565b50600190565b6200e33b92506201421d93620142476201421593620070b3565b949062014110565b909291926201425f825162006032565b6000916201426e815162006032565b8390845b865181101562014309576001600160a01b03620142958162013b5a848b62005f16565b1580620142d4575b620142b5575b50620142af9062005ec0565b62014272565b8196620142cc916200952d620142af948b62005f16565b9590620142a3565b506127108a101562005ede5780620142ed838a62005f16565b511660005260038a811b0160205260406000205415156201429d565b509295919694509260005b87518110156201438a5761271086101562005ede576001600160a01b03806201433e838b62005f16565b5116600052600387811b01602052604060002054156201436b575b50620143659062005ec0565b62014314565b819562014382916200cf5462014365948c62005f16565b949062014359565b509250945092612710831015938462005ede5760049586600395861b0196875494620143bb620094c6828862012de4565b9460009689889a5b6201452f57818b10156201446457506000998b620143fe620143e6838362006135565b90546001600160a01b0392918e1b1c82168a620148ce565b1562014421575b505090620144168b94939262005ec0565b9a90919293620143c3565b91998c95949392909162014437908c9062006135565b9054908d1b1c166201444a828b62005f16565b52620144569062005ec0565b9890919293508b3862014405565b9697949a98505091975092506000915b8383106201450a5750505050620144f5578051926001600160401b038411620144e05750620144a483836200624a565b602080910191600052806000209060005b848110620144c4575050505050565b83516001600160a01b03168382015592810192600101620144b5565b604190634e487b7160e01b6000525260246000fd5b603283634e487b7160e01b6000525260246000fd5b62014528906200a104906001600160a01b036200a071868662005f16565b9162014474565b603285634e487b7160e01b6000525260246000fd5b9092919262014554825162006032565b60009162014563815162006032565b8390845b865181101562014601576001600160a01b036201458a8162013604848b62005f16565b1580620145c9575b620145aa575b50620145a49062005ec0565b62014567565b8196620145c1916200952d620145a4948b62005f16565b959062014598565b506127108a101562005ede5780620145e2838a62005f16565b5116600052620138968a60031b01602052604060002054151562014592565b509295919694509260005b8751811015620146855761271086101562005ede576001600160a01b038062014636838b62005f16565b5116600052620138968760031b016020526040600020541562014666575b50620146609062005ec0565b6201460c565b81956201467d916200cf5462014660948c62005f16565b949062014654565b509250945092612710831015938462005ede5762013897600394851b0195865493620146b6620094c6828762012de4565b936000958887995b62005ede57818a10156201475f57506000988a620146f9620146e1838362006135565b90546001600160a01b0392918d1b1c821689620148ce565b156201471c575b505090620147118a94939262005ec0565b9990919293620146be565b91988b95949392909162014732908b9062006135565b9054908c1b1c1662014745828a62005f16565b52620147519062005ec0565b9790919293508a3862014700565b96945050919795509295506000915b838310620147d9575050505062005ede578151916001600160401b03831162003f6d576201479d83836200624a565b602080910191600052806000209060005b848110620147bd575050505050565b83516001600160a01b03168382015592810192600101620147ae565b62014805906200a104906001600160a01b03620147f7868662005f16565b511662001e43828b62005f16565b916201476e565b9060005b61271083101562005ede576003600484821b0180548310156201486b5782620148399162006135565b9054911b1c6001600160a01b039081169083161462014863576201485d9062005ec0565b62014810565b505050600190565b5050505050600090565b9060005b61271083101562005ede5760036201389784821b0180548310156201486b5782620148a49162006135565b9054911b1c6001600160a01b03908116908316146201486357620148c89062005ec0565b62014879565b9060005b82518110156201490d576001600160a01b0380620148f1838662005f16565b5116908316146201486357620149079062005ec0565b620148d2565b505050600090565b8015620033d6576000190190565b9081519060005b600019838101848111620033d657821015620149f15760018201808311620033d6575b84811062014968575050620149629062005ec0565b6201492a565b6001600160a01b03806201497d858962005f16565b5116816201498c848a62005f16565b511614620149a7575b50620149a19062005ec0565b6201494d565b8286929601828111620033d657620149a192620149ea92620149ce620149e3938b62005f16565b5116620149dc898b62005f16565b5262014915565b9562014915565b9062014995565b505090620149ff8162006032565b9060005b81811062014a12575090925050565b62014a39906001600160a01b0362014a2b828862005f16565b511662001e43828662005f16565b62014a03565b80519160005b600019848101858111620033d65782101562014af75760018201808311620033d6575b85811062014a8357505062014a7d9062005ec0565b62014a45565b62014a8f838662005f16565b5162014a9c828762005f16565b511462014ab5575b62014aaf9062005ec0565b62014a68565b9481810190808211620033d65762014ae862014aef9162014adb62014aaf948962005f16565b51620149dc8a8a62005f16565b9662014915565b905062014aa4565b5050909162014b068162006032565b9060005b81811062014b19575090925050565b8062014b2a62014b37928762005f16565b5162001e43828662005f16565b62014b0a565b60405162014b4b8162003f51565b604481527f496e76616c6964206469766964656e64207065726d797269616420706572207460208201527f72616e73616374696f6e2e2053686f756c64206265206c657373207468616e206040820152630313030360e41b606082015290565b60405162014bb98162003ff4565b603281527f4e6f20656e6f756768206e756d626572206f66207472616e73616374696f6e7360208201527108199bdc88191a5d9a59195b991cc81e595d60721b604082015290565b60405162014c0f8162003fbc565b601c81527b6469766964656e6473206f7065726174696f6e206f766572666c6f7760201b602082015290565b60405162014c498162003fbc565b600d81526c2ab735b737bbb71022b93937b960991b602082015290565b60405162014c748162003ff4565b602681527f4572726f7220696e20776974686472617761626c6520636173682063616c63756020820152653630ba34b7b760d11b604082015290565b60405162014cbe8162003fbc565b6012815271496e76616c696420506172616d657465727360701b602082015290565b60405162014cee8162003fbc565b601581527413595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b602082015290565b60405162014d218162003fbc565b601781527613595b58995c881a5cc81b9bdd081cdd5cdc195b991959604a1b602082015290565b60405162014d568162003fbc565b601b81527a13595b58995c881a5cc8185b1c9958591e481cdd5cdc195b991959602a1b602082015290565b60405162014d8f8162003fbc565b60158152744d656d62657220616c72656164792065786973747360581b602082015290565b60405162014dc28162003fbc565b60118152704e6f20656e6f7567682062616c616e636560781b602082015290565b60405162014df18162003fbc565b6018815277125b9d985b1a59081c185c985b595d195c881d1bc81cd95d60421b602082015290565b60405162014e278162003fbc565b6015815274546f6b656e20616d6f756e74206f766572666c6f7760581b602082015290565b6026811015620040d55780156201503a57600181146201422757600281146201503457600381146201502e57600481146201502857600581146201502257600681146201501c57600781146201501657600881146201501057600981146201500a57600a81146201500457600b811462014ffe57600c811462014ff857600d811462014ff257600e811462014fec57600f811462014fe6576010811462014fe0576011811462014fda576012811462014fd4576013811462014fce576014811462014fc8576015811462014fc2576018811462014fbc576017811462014fb6576019811462014fb057601a811462014faa57601b811462014fa457601c811462014f9e57601d811462014f9857601e811462014f9257601f811462014f8c576020811462014f865760211462014f8157600090565b602190565b50602090565b50601f90565b50601e90565b50601d90565b50601c90565b50601b90565b50601a90565b50601990565b50601790565b50601690565b50601590565b50601490565b50601390565b50601290565b50601190565b50601090565b50600f90565b50600e90565b50600d90565b50600c90565b50600b90565b50600a90565b50600990565b50600890565b50600790565b50600690565b50600590565b50600490565b50600390565b50600290565b50600090565b90815181101562005ede570160200190565b60405190620150618262003ff4565b60288252604036602084013760005b601481106201507e57505090565b601390808203918211620033d657600382901b916001600160fd1b03811603620033d65760ff808311620033d657600192620150c79084901b6001600160a01b03861662006284565b60f0811682821603918211620033d657620150eb9060f41b600f60f81b1662015154565b82841b916001600160ff1b0384168403620033d657620151289160001a62015114848962015040565b5360f81b6001600160f81b03191662015154565b928101809111620033d657620151476201514e9360001a918662015040565b5362005ec0565b62015070565b60f81c600a8110156201517d5760300160ff8111620033d65760f81b6001600160f81b03191690565b60570160ff8111620033d65760f81b6001600160f81b0319169056fe546865206c656e677468206f662061646472657373657320616e6420746f6b651f4fe3ad533e3985b88710ce05a205152f02825e155777f3bcb8b3bbfcfb03a24ad859a97f543436e70c22b09d31fb4c7b9e987d7a008c98817c9b50a97b1224546865206c656e677468206f6620746f6b656e436c61737320616e6420746f6b546865206c656e677468206f6620746f6b656e496e666f20616e6420746f6b658e71c125ecfe4aeed61c8cf4b09183dd0bf2a3230d826486f04e5f6f0de58e2c18baa939e2e21be0e012ec26e9ec87e9e6faa065bd9f5835250457786300ece8546865206265666f7265206f7065726174696f6e20706c7567696e20737973745265736572766564206f70636f6465206964203233206973206e6f7420696d705265736572766564206f70636f6465206964203238206973206e6f7420696d70546865206c656e677468206f662061646472657373657320616e6420616d6f75a2646970667358221220e5753ec11d4a1791a7993a88596fd3f192a66b2cad89bef95cd62431981be63f64736f6c63430008110033\",\n  \"deployedBytecode\": \"0x6105008060405260043610156200001557600080fd5b600090813560e01c908163036ee8501462003f00575080630e5a3b291462003ba257806310ade3ea1462003b725780631797631d1462003aea5780631c75255a1462003a8457806323b65c7814620039fc5780632514a6b414620037e857806341d1a43814620037b457806356424cf414620036d35780635c00d98714620036825780635d0b184914620036605780635f1231ea14620035755780635f5d5f0014620034ed578063681ece9d14620034a857806379532bfe14620034865780637daa10ce14620034695780638129fc1c14620030a657806383e4cccf1462002e38578063864f9f7a1462002df957806386ad77e21462002acf5780638c7a63ae1462002a525780638f6561e014620029375780639543bf67146200182d5780639f36145f14620004c0578063a064c4f114620003f7578063acf80bc414620003b8578063aefca42a1462000396578063bba51030146200020c578063d5a172f214620001df5763d6a93c51146200018b57600080fd5b34620001dc5780600319360112620001dc575b6127108110620001b4575b602090604051908152f35b60ff60078260031b01541615620001d657620001d09062005ec0565b6200019e565b620001a9565b80fd5b5034620001dc5780600319360112620001dc5762027126546040516001600160a01b039091168152602090f35b5034620001dc5780600319360112620001dc576202712e548082526202712b916020908382526002938460408320015494620002656200024c8762004034565b966200025c604051988962004010565b80885262004034565b8685019290601f1901368437835b86855281865282604086200154811015620003405760405163083a348760e31b815260048101829052602487828281305afa91821562000335578792620002f2575b50620002c2838b62005f16565b906003831015620002e0575052620002da9062005ec0565b62000273565b634e487b7160e01b8852602160045287fd5b9091508781813d83116200032d575b6200030d818362004010565b81010312620003295751600381101562000329579038620002b5565b8680fd5b503d62000301565b6040513d89823e3d90fd5b505060408051858152875181870181905290948594928501935086905b8281106200036d57505050500390f35b91938395509080826200038560019483975162004131565b01950191019185949391926200035d565b5034620001dc5780600319360112620001dc5760206202712854604051908152f35b5034620001dc576020366003190112620001dc576020906040906001600160a01b03620003e462003f20565b1681526201388783522054604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac5762000439826200043260018260031b0154916200716f565b90620070e9565b90156200044b57602090604051908152f35b60405162461bcd60e51b815260206004820152603360248201527f73756d566f74696e67576569676874466f72546f6b656e436c6173733a20766f60448201527274696e67576569676874206f766572666c6f7760681b6064820152608490fd5b634e487b7160e01b81526032600452602490fd5b5034620001dc576020366003190112620001dc5760043581526202712b602052604080822081519182016001600160401b03811183821017620018195760405280546001600160a01b031682526001810180546200051e8162004034565b916200052e604051938462004010565b81835285526020808620869184015b838310620005a45762000579878787602083015260ff600682015491600860078201549101549060405195869560a0875260a0870190620058d3565b9360208601526040850152620005956060850183831662004131565b60081c16151560808301520390f35b6040516001600160401b03606082019081119082111762001805576060810160405282546001600160a01b0381168252602660a082901c60ff161015620017f15760a01c60ff1660208201526040516001600160401b03610140820190811190821117620017dd5761014081016040526200062260018501620054ae565b8152620006326002850162005503565b602082015262000645600385016200563a565b6040820152600484018a604051809283916020825491828152019184526020842093905b80601f8301106200160957620007ac945491818110620015f2575b818110620015d8575b818110620015be575b818110620015a4575b8181106200158b575b81811062001571575b81811062001557575b8181106200153d575b81811062001523575b81811062001509575b818110620014ef575b818110620014d5575b818110620014bb575b818110620014a1575b81811062001487575b8181106200146d575b81811062001453575b81811062001439575b8181106200141f575b81811062001405575b818110620013eb575b818110620013d1575b818110620013b7575b8181106200139d575b81811062001383575b81811062001369575b8181106200134f575b81811062001335575b8181106200131b575b81811062001301575b818110620012e7575b10620012d6575b509b9a999897969594939b038262004010565b60608a0152600583018054620007c28162004034565b91620007d2604051938462004010565b8183528c526020808d20908d9084015b838210620012a1575050505060808a015260068301988954620008058162004034565b9a620008156040519c8d62004010565b818c5260208c01908d528c6020812091815b8483106200112a57505050505090919293949596979860a0820152604051806007860190602082549182815201918d5260208d20908d915b81601f84011062000e215784600b97946020979460019a9794620009a694549181811062000e03575b81811062000de2575b81811062000dc1575b81811062000da0575b81811062000d80575b81811062000d5f575b81811062000d3e575b81811062000d1d575b81811062000cfc575b81811062000cdb575b81811062000cba575b81811062000c99575b81811062000c78575b81811062000c57575b81811062000c36575b81811062000c15575b81811062000bf4575b81811062000bd3575b81811062000bb2575b81811062000b91575b81811062000b70575b81811062000b4f575b81811062000b2e575b81811062000b0d575b81811062000aec575b81811062000acb575b81811062000aaa575b81811062000a89575b81811062000a68575b81811062000a47575b81811062000a26575b1062000a0b575b50038262004010565b60c0820152620009b96008880162005749565b60e0820152620009cc60098801620057a6565b610100820152604051620009f181620009e981600a8c016200559c565b038262004010565b61012082015260408201528152019201920191906200053d565b90889160f81c62000a1c816200418b565b815201386200099d565b928a8d9160ff8560f01c1662000a3c816200418b565b815201930162000996565b928a8d9160ff8560e81c1662000a5d816200418b565b81520193016200098d565b928a8d9160ff8560e01c1662000a7e816200418b565b815201930162000984565b928a8d9160ff8560d81c1662000a9f816200418b565b81520193016200097b565b928a8d9160ff8560d01c1662000ac0816200418b565b815201930162000972565b928a8d9160ff8560c81c1662000ae1816200418b565b815201930162000969565b928a8d9160ff8560c01c1662000b02816200418b565b815201930162000960565b928a8d9160ff8560b81c1662000b23816200418b565b815201930162000957565b928a8d9160ff8560b01c1662000b44816200418b565b81520193016200094e565b928a8d9160ff8560a81c1662000b65816200418b565b815201930162000945565b928a8d9160ff8560a01c1662000b86816200418b565b81520193016200093c565b928a8d9160ff8560981c1662000ba7816200418b565b815201930162000933565b928a8d9160ff8560901c1662000bc8816200418b565b81520193016200092a565b928a8d9160ff8560881c1662000be9816200418b565b815201930162000921565b928a8d9160ff8560801c1662000c0a816200418b565b815201930162000918565b928a8d9160ff8560781c1662000c2b816200418b565b81520193016200090f565b928a8d9160ff8560701c1662000c4c816200418b565b815201930162000906565b928a8d9160ff8560681c1662000c6d816200418b565b8152019301620008fd565b928a8d9160ff8560601c1662000c8e816200418b565b8152019301620008f4565b928a8d9160ff8560581c1662000caf816200418b565b8152019301620008eb565b928a8d9160ff8560501c1662000cd0816200418b565b8152019301620008e2565b928a8d9160ff8560481c1662000cf1816200418b565b8152019301620008d9565b928a8d9160ff8560401c1662000d12816200418b565b8152019301620008d0565b928a8d9160ff8560381c1662000d33816200418b565b8152019301620008c7565b928a8d9160ff8560301c1662000d54816200418b565b8152019301620008be565b928a8d9160ff8560281c1662000d75816200418b565b8152019301620008b5565b928a8d9160ff85831c1662000d95816200418b565b8152019301620008ac565b928a8d9160ff8560181c1662000db6816200418b565b8152019301620008a3565b928a8d9160ff8560101c1662000dd7816200418b565b81520193016200089a565b928a8d9160ff8560081c1662000df8816200418b565b815201930162000891565b928a8d9160ff851662000e16816200418b565b815201930162000888565b926001610400602092865460ff811662000e3b816200418b565b825260ff8160081c1662000e4f816200418b565b8583015260ff8160101c1662000e65816200418b565b604083015260ff8160181c1662000e7c816200418b565b606083015260ff81861c1662000e92816200418b565b608083015260ff8160281c1662000ea9816200418b565b60a083015262000ebf60ff8260301c166200418b565b60ff8160301c1660c083015260ff8160381c1662000edd816200418b565b60e083015260ff8160401c1662000ef4816200418b565b61010083015260ff8160481c1662000f0c816200418b565b61012083015260ff8160501c1662000f24816200418b565b61014083015260ff8160581c1662000f3c816200418b565b61016083015260ff8160601c1662000f54816200418b565b61018083015260ff8160681c1662000f6c816200418b565b6101a083015260ff8160701c1662000f84816200418b565b6101c083015260ff8160781c1662000f9c816200418b565b6101e083015260ff8160801c1662000fb4816200418b565b61020083015260ff8160881c1662000fcc816200418b565b61022083015260ff8160901c1662000fe4816200418b565b61024083015260ff8160981c1662000ffc816200418b565b61026083015260ff8160a01c1662001014816200418b565b61028083015260ff8160a81c166200102c816200418b565b6102a083015260ff8160b01c1662001044816200418b565b6102c083015260ff8160b81c166200105c816200418b565b6102e083015260ff8160c01c1662001074816200418b565b61030083015260ff8160c81c166200108c816200418b565b61032083015260ff8160d01c16620010a4816200418b565b61034083015260ff8160d81c16620010bc816200418b565b61036083015260ff8160e01c16620010d4816200418b565b61038083015260ff8160e81c16620010ec816200418b565b6103a083015260ff8160f01c1662001104816200418b565b6103c083015260f81c62001118816200418b565b6103e08201520194019201916200085f565b60405190620011398262003f9f565b6200114960ff865416836200572f565b6001850154602083015260028501805490620011658262004034565b9262001175604051948562004010565b82845290815260208082209084015b8383106200121357505050509d9e95969798999a9b9c9d600192826020926040600695015260038701546060820152604051620011ca81620009e98160048c016200559c565b608082015260ff6005880154818116151560a0840152818160081c16151560c084015260101c16151560e08201528152019301910190918e9d9c9b9a9998979695949d62000827565b60096020600192604051620012288162003f83565b855481526200126c60ff8688015481811662001244816200418b565b86850152818160081c166200125981620040ca565b604085015260101c16606083016200573c565b6200127a60028701620054ae565b60808201526200128d6003870162005803565b60a082015281520192019201919062001184565b600760209d9e969798999a9b9c9d600192620012bd86620056a8565b8152019301910190919c9b9a9998979695949c620007e2565b60f81c151581526020013862000799565b92602060019160ff8560f01c161515815201930162000792565b92602060019160ff8560e81c161515815201930162000789565b92602060019160ff8560e01c161515815201930162000780565b92602060019160ff8560d81c161515815201930162000777565b92602060019160ff8560d01c16151581520193016200076e565b92602060019160ff8560c81c161515815201930162000765565b92602060019160ff8560c01c16151581520193016200075c565b92602060019160ff8560b81c161515815201930162000753565b92602060019160ff8560b01c16151581520193016200074a565b92602060019160ff8560a81c161515815201930162000741565b92602060019160ff8560a01c161515815201930162000738565b92602060019160ff8560981c16151581520193016200072f565b92602060019160ff8560901c161515815201930162000726565b92602060019160ff8560881c16151581520193016200071d565b92602060019160ff8560801c161515815201930162000714565b92602060019160ff8560781c16151581520193016200070b565b92602060019160ff8560701c161515815201930162000702565b92602060019160ff8560681c1615158152019301620006f9565b92602060019160ff8560601c1615158152019301620006f0565b92602060019160ff8560581c1615158152019301620006e7565b92602060019160ff8560501c1615158152019301620006de565b92602060019160ff8560481c1615158152019301620006d5565b92602060019160ff8560401c1615158152019301620006cc565b92602060019160ff8560381c1615158152019301620006c3565b92602060019160ff8560301c1615158152019301620006ba565b92602060019160ff8560281c1615158152019301620006b1565b92602060019160ff85831c1615158152019301620006a8565b92602060019160ff8560181c16151581520193016200069f565b92602060019160ff8560101c161515815201930162000696565b92602060019160ff8560081c16151581520193016200068d565b92602060019160ff85161515815201930162000684565b916020919350610400600191865460ff81161515825260ff8160081c1615158583015260ff8160101c161515604083015260ff8160181c161515606083015260ff8160808282891c16151581860152828260281c16151560a0860152828260c092828260301c16151584890152828260381c16151560e0890152828260401c161515610100890152828260481c161515610120890152828260501c161515610140890152828260581c161515610160890152828260601c161515610180890152828260681c1615156101a0890152828260701c1615156101c0890152828260781c1615156101e08901521c161515610200860152828260881c161515610220860152828260901c161515610240860152828260981c161515610260860152828260a01c161515610280860152828260a81c1615156102a0860152828260b01c1615156102c0860152828260b81c1615156102e08601521c16151561030083015260ff8160c81c16151561032083015260ff8160d01c16151561034083015260ff8160d81c16151561036083015260ff8160e01c16151561038083015260ff8160e81c1615156103a083015260ff8160f01c1615156103c083015260f81c15156103e082015201940192018492939162000669565b634e487b7160e01b8a52604160045260248afd5b634e487b7160e01b8a52602160045260248afd5b634e487b7160e01b89526041600452602489fd5b634e487b7160e01b84526041600452602484fd5b5034620001dc576040366003190112620001dc576004356001600160401b03811162002933576200186390369060040162004571565b6024356001600160401b0381116200292f576200188590369060040162004861565b620271298054600260ff82166200189c81620040ca565b14620028ea5760ff191660021790556202712e54600181018111620028d657600181016202712e558391845b84518110156200192b57836002620018ec620018e5848962005f16565b5162013e1e565b5001541062001907575b620019019062005ec0565b620018c8565b92506200190160026200191f620018e5868862005f16565b500154939050620018f6565b509093918291825b85518110156200198f5784600362001950620018e5848a62005f16565b500154106200196b575b620019659062005ec0565b62001933565b935062001965600362001983620018e5878962005f16565b5001549490506200195a565b50600190950182526202712b602090815260408320865181546001600160a01b0319166001600160a01b03919091161781559501518051929591929190600160401b831162001f1557600182015483600184015580841062002694575b50602060019101910186526020862086915b83831062001f53575050505062001a16835162006032565b6202712e5485526202712b6020526004604086200181519160018060401b03831162001f155760209062001a4b84846200624a565b0190865260208620865b83811062001f3e575050505062001a6d835162006032565b6202712e5485526202712b6020526003604086200181519160018060401b03831162001f155760209062001aa284846200624a565b0190865260208620865b83811062001f29575050505062001ac4835162006032565b6202712e5485526202712b6020526005604086200181519160018060401b03831162001f155760209062001af984846200624a565b0190865260208620865b83811062001f00575050505062001b1b904262007231565b6202712e5485526202712b60205260066040862001551562001ec05762001b58906202712e5484526202712b602052600660408520015462007231565b60076040852001551562001e7d576202712e5482526202712b60205260086040832001600260ff1982541617905562001b92815162006032565b6202712e5483526202712b6020526002604084200181519160018060401b03831162001e695760209062001bc784846200624a565b0190845260208420845b83811062001e54578585815b815181101562001c44578062001c3862001bfc62001c3e938562005f16565b516202712e5486526202712b60205262001c1d836002604089200162006135565b90919082549060031b600019811b9283911b16911916179055565b62005ec0565b62001bdd565b50815b815181101562001e50576202712e54928381526202712b60205262001c8462001c77836002604085200162006135565b90549060031b1c62013e1e565b50549162001c928362006032565b92825b81811062001dff5750508182905b845182101562001dcf5762001cb9828662005f16565b5161271081101562001dbb5760031b6001015462001cd8838762005f16565b5161271081101562001da75760031b6006015462001cf691620070e9565b901562001d635762001d089162007231565b91901562001d225762001d1b9062005ec0565b9062001ca3565b60405162461bcd60e51b8152602060048201526019602482015278746f74616c566f74696e67506f776572206f766572666c6f7760381b6044820152606490fd5b606460405162461bcd60e51b815260206004820152602060248201527f63757272656e74436c617373566f74696e67506f776572206f766572666c6f776044820152fd5b634e487b7160e01b86526032600452602486fd5b634e487b7160e01b85526032600452602485fd5b905062001df9935062001c3891929586526202712b60205262001c1d836005604089200162006135565b62001c47565b62001e4a908785526202712b60205262001e308162001e2962001c7787600260408b200162006135565b5062006135565b90549060031b1c62001e43828862005f16565b5262005ec0565b62001c95565b8280f35b60019060208451940193818401550162001bd1565b634e487b7160e01b85526041600452602485fd5b60405162461bcd60e51b815260206004820152601b60248201527a657865637574696e6720656e642074696d65206f766572666c6f7760281b6044820152606490fd5b60405162461bcd60e51b8152602060048201526018602482015277766f74696e6720656e642074696d65206f766572666c6f7760401b6044820152606490fd5b60019060208451940193818401550162001b03565b634e487b7160e01b87526041600452602487fd5b60019060208451940193818401550162001aac565b60019060208451940193818401550162001a55565b805180518354602083015190916001600160a01b031690602681101562002680576001600160a81b03199092161760a09190911b60ff60a01b161783556040015180518051906001600160401b03821162002445576020600186019162001fbb84846200624a565b01908b5260208b208b5b8381106200266b575050505060208101518051906001600160401b03821162002445576020600286019162001ffb84846200624a565b01908b5260208b208b5b8381106200264d57505050506003830160408201519060208251926200202c8484620065ad565b01908b5260208b20908b905b8382106200262d5750505050606081015180516001600160401b0381116200244557602060048601926200206d838562013f81565b01918b5260208b20908b5b8160051c8110620025f25750601f1981168103620025af575b5050506080810151805190600160401b8211620024455760058501548260058701558083106200252c575b50602001600585018b5260208b20908b905b8382106200250b575050505060a0810151805190600160401b8211620024455760068501548260068701558083106200247a575b50602001600685018b5260208b20908b905b83821062002459575050505060c081015180516001600160401b03811162002445576020600786019262002149838562013f81565b01918b5260208b20908b5b8160051c8110620024075750601f1981168103620023bb575b5050506008830160e08201519060208251926200218b84846200663b565b01908b5260208b20908b905b83821062002358575050505060098301610100820151906020825192620021bf84846200663b565b01908b5260208b20908b905b838210620022d8575050505061012001518051906001600160401b038211620017dd576200220c8262002202600a8701546200555f565b600a87016200692c565b6020908a601f84116001146200225f57928060209360019693600b969262002253575b5050600019600383901b1c191690851b17600a8601555b01920192019190620019fe565b0151905038806200222f565b5090600a85018b5260208b20918b5b601f1985168110620022bf575083602093600196938793600b97601f19811610620022a5575b505050811b01600a86015562002246565b015160001960f88460031b161c1916905538808062002294565b919260206001819286850151815501940192016200226e565b80518051906001600160401b038211620023445760208f91620022fc84886200624a565b019085815260208120905b83811062002326575050505060016020819201930191019091620021cb565b82516001600160a01b03168183015560209092019160010162002307565b634e487b7160e01b8f52604160045260248ffd5b80518051906001600160401b038211620023445760208f916200237c84886200624a565b019085815260208120905b838110620023a657505050506001602081920193019101909162002197565b60019060208451940193818401550162002387565b8b928c5b601f19831683038110620023dd57505060051c01553880806200216d565b90936020620023fd60019284885191620023f7836200418b565b62013feb565b95019101620023bf565b8c8d5b602081106200242157508382015560010162002154565b949060206200243b60019288855191620023f7836200418b565b920195016200240a565b634e487b7160e01b8b52604160045260248bfd5b60066020826200246d600194518762006a8c565b0193019101909162002114565b6006818102048103620024f7576006838102048303620024f757600686018c5260208c208360060281015b8d8360060283018210620024bc5750505062002102565b90816006928255806001830155620024d76002830162006718565b806003830155620024eb600483016200651c565b600582015501620024a5565b634e487b7160e01b8c52601160045260248cfd5b60076020826200251f600194518762013e3f565b01930191019091620020ce565b6007818102048103620024f7576007838102048303620024f757600586018c5260208c208360070281015b8d83600702830182106200256e57505050620020bc565b906007916200257d82620061c7565b806001830155806002830155806003830155806004830155620025a3600583016200651c565b60068201550162002557565b8b928c5b601f19831683038110620025d157505060051c015538808062002091565b90936020620025e860019284885115159162013feb565b95019101620025b3565b8c8d5b602081106200260c57508382015560010162002078565b949060206200262360019288855115159162013feb565b92019501620025f5565b6001602082620026408394518762006976565b0193019101909162002038565b82516001600160a01b03168183015560209092019160010162002005565b60019060208451940193818401550162001fc5565b634e487b7160e01b8c52602160045260248cfd5b600b818102048103620028c257600b848102048403620028c2576001830188526020882084600b0281015b82600b0282018110620026d4575050620019ec565b898155620026e560018201620061c7565b620026f360028201620061c7565b62002701600382016200656e565b62002715600482018054908c815562013f59565b60058101548a60058301558062002853575b5060068101548a600683015580620027d6575b5080620027526007600b93018054908d815562013f59565b6200276060088201620065fc565b6200276e60098201620065fc565b8a600a82016200277f81546200555f565b8062002790575b50505001620026bf565b601f90818111600114620027ab575050555b8a388062002786565b6001620027c89284865260208620920160051c820191016200614e565b8160208120915555620027a2565b60068181020481036200283f57600682018b5260208b20906006028101905b8181106200280457506200273a565b808c600692558c60018201556200281e6002820162006718565b8c600382015562002832600482016200651c565b8c600582015501620027f5565b634e487b7160e01b8b52601160045260248bfd5b60078181020481036200283f57600582018b5260208b20906007028101905b81811062002881575062002727565b806200288f600792620061c7565b8c60018201558c60028201558c60038201558c6004820155620028b5600582016200651c565b8c60068201550162002872565b634e487b7160e01b88526011600452602488fd5b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152601d60248201527f766f74696e6720697320616c726561647920696e2070726f67726573730000006044820152606490fd5b8280fd5b5080fd5b506020366003190112620001dc576004356001600160401b03811162002933576200296790369060040162004861565b805190916001600160a01b0391620029bc908316620029b3620029946200298e3362015052565b62005d89565b620029ac620029a68789511662015052565b62005def565b9062005e46565b90331462005e8d565b9060208301915b8251805182101562002a2a579062001c3862002a249284620029e784339362005f16565b5151161462002a1d620029fe6200298e3362015052565b620029ac620029a68862002a14888c5162005f16565b51511662015052565b9062005e8d565b620029c3565b62002a4e62002a3986620073da565b60405191829160208352602083019062004164565b0390f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac575060031b600181015460028201549162002ac5600562002aa6600684015493620009e960405180948193016200559c565b6040519485948552602085015260806040850152608084019062004164565b9060608301520390f35b5034620001dc5780600319360112620001dc576201388280549062002af48262004034565b9162002b04604051938462004010565b808352602083019184526020842084925b82841062002cc05785856201388380549062002b318262004034565b9362002b41604051958662004010565b82855260208501918152602081209080925b84841062002b895762002b7a8662002a4e896040519384936040855260408501906200431d565b9083820360208501526200431d565b60405162002b978162003f9f565b62002ba760ff855416826200572f565b6001840154602082015260028401805462002bc28162004034565b9162002bd2604051938462004010565b8183528552602080862090869084015b83821062002c5a575050505060019282602092604060069501526003870154606082015260405162002c1d81620009e98160048c016200559c565b608082015260ff6005880154818116151560a0840152818160081c16151560c084015260101c16151560e082015281520193019301929162002b53565b6009602060019260405162002c6f8162003f83565b8654815262002c8b60ff8689015481811662001244816200418b565b62002c9960028801620054ae565b608082015262002cac6003880162005803565b60a082015281520193019101909162002be2565b60405162002cce8162003f9f565b62002cde60ff845416826200572f565b60018084015460208301526002840190815462002cfb8162004034565b9262002d0b604051948562004010565b8184528a526020808b20908b9085015b83821062002d9457505050505060019282602092604060069501526003860154606082015260405162002d5781620009e98160048b016200559c565b608082015260ff6005870154818116151560a0840152818160081c16151560c084015260101c16151560e082015281520192019301929062002b15565b60096020869260405162002da88162003f83565b8654815262002dc460ff8689015481811662001244816200418b565b62002dd260028801620054ae565b608082015262002de56003880162005803565b60a082015281520193019101909162002d1b565b5034620001dc576020366003190112620001dc576020906040906001600160a01b0362002e2562003f20565b1681526201388583522054604051908152f35b5034620001dc576020806003193601126200293357816004359162002e7b4784111562002a1d62002e6986620062a5565b62002e7447620062a5565b9062005f5e565b33825262002ee76201388580835262002ec0604085205486111562002a1d62002ea488620062a5565b33885284875262002eb96040892054620062a5565b9062005fca565b33845280835262002ed68560408620546200626a565b929062002a1d62002ea488620062a5565b3384528252604083208190551562002f2a575b508080809381811562002f20575b3390f11562002f145780f35b604051903d90823e3d90fd5b506108fc62002f08565b90506201388680549162002f3e8362006032565b918593865b8181106200303a57505062002f588462006032565b805192906001600160401b0384116200302657908084939262002f7e8a989796620061a3565b0191865280862090865b84811062003007575050505050825b82811062002fa757505062002efa565b9192509062002ffd9062001c386001600160a01b0362002fc8838662005f16565b511662002fd58362006087565b9080546001600160a01b0360039390931b83811b80199092169390941690931b909216179055565b9084929162002f97565b83516001600160a01b0316818401558997509281019260010162002f88565b634e487b7160e01b88526041600452602488fd5b620030458162006087565b90546001600160a01b03916003913391831b1c83160362003074575b50506200306e9062005ec0565b62002f43565b966200309d9183986200308b6200306e9562006087565b9054911b1c1662001e43828962005f16565b95903862003061565b5034620001dc5780600319360112620001dc576202712680546001600160a01b0319163317905562027129805460ff191660019081179091556040519091908190620030f28162003fd8565b5290620138828054600082558062003400575b5082528180604051620031188162003fd8565b52620033ec5762013883805460008255806200336d575b5082526127106202712a5560405191620031498362003fbc565b818352805b602080821015620031c457604051602092916200316b8262003f83565b84825284818301528460408301526060858184015260809080828501528060405192620031988462003f83565b8184528185850152816040850152818085015283015260a090818301528301528287010152016200314e565b82846200335d87604051620031d98162003fd8565b848152604051620031ea8162003fd8565b858152604051620031fb8162003fd8565b8681526040516200320c8162003fd8565b8781526040516200321d8162003fd8565b888152604051916200322f8362003fd8565b89835260405193620032418562003fd8565b8a855260405195620032538762003f83565b8652602086015260408501526060840152608083015260a0820152604051916200327d8362003f83565b86835260036020840152866040840152866060840152608083015260a0820152620032a88262005ed0565b52620032b48162005ed0565b506200330b604051620032c78162003f9f565b60048152846020820152826040820152856060820152604051620032eb8162003fd8565b86815260808201528460a08201528460c08201528460e082015262006f66565b604051906200331a8262003f9f565b6002825283602083015260408201528360608201526040516200333d8162003fd8565b84815260808201528260a08201528260c08201528360e082015262006fb3565b6113886201388b556201388c5580f35b925060068381029381850403620033d65760009382855260208520908101905b8181106200339d5750506200312f565b80868492558686820155620033b56002820162006718565b866003820155620033c9600482016200651c565b866005820155016200338d565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b82526041600452602482fd5b925060068381029381850403620033d65760009382855260208520908101905b8181106200343057505062003105565b80868492558686820155620034486002820162006718565b8660038201556200345c600482016200651c565b8660058201550162003420565b5034620001dc5780600319360112620001dc576020604051338152f35b5034620001dc5780600319360112620001dc5760206202712d54604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac5762002a4e620034e060048460031b0162005503565b60405191829182620040eb565b5034620001dc5780600319360112620001dc576040516201388180548083529083526020808301937fcd6f7cece5c70f73af31bb8ed8b80ae1c2a9e5eb261bd5ab2d9374b0c38719c892915b828210620035545762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003539565b5034620001dc5760209081600319360112620001dc576040906200359862003f20565b8160608451620035a88162003f51565b82815286810183905285810182905201526001600160a01b031681526201388083522060405190620035da8262003f51565b6200365581549160ff83161515845260ff8585019360081c161515835260026040519162003619836200361181600185016200559c565b038462004010565b6040860192835201549260608501938452604051958695818752511515908601525115156040850152516080606085015260a084019062004164565b905160808301520390f35b5034620001dc5780600319360112620001dc5760206202712e54604051908152f35b5034620001dc576020366003190112620001dc5760043590612710821015620004ac576020620036cb620036c3846200043260028260031b0154916200716f565b91906200701f565b604051908152f35b5034620001dc5780600319360112620001dc576201388b5462003730620036f962014b3d565b916200370b6127109384831062005e8d565b620037256201388e546201388c54111562002a1d62014bab565b6201388d54620070e9565b90506200373c62014c01565b50825b82811062003762575b60206200375885858504620072bf565b9050604051908152f35b909260ff60078360031b01541615620037ac578162003796620037a2926200378f62001c3896956200708c565b9062007231565b949062002a1d62014c01565b929091926200373f565b929062003748565b5034620001dc576020366003190112620001dc576020620037d760043562014153565b620037e6604051809262004131565bf35b5034620001dc576020806003193601126200293357600435620038174782111562002a1d62002e6984620062a5565b3383528280808062013887948587526200385d604083205482111562002a1d6200384184620062a5565b338652898b52620038566040872054620062a5565b906200641f565b3382528587526200389d620038778260408520546200626a565b919062002a1d6200388885620062a5565b3387528a8c52620038566040882054620062a5565b3383528688526040832055818115620039f2575b3390f115620039e7573383528152604082205415620038ce575080f35b62013888805491620038e08362006032565b918493855b8181106200398d575050620038fa8462006032565b805192906001600160401b03841162001f155781906200391a8562006167565b0191865280862090865b84811062003971575050505050825b828110620039415750505080f35b6200396b9062001c386001600160a01b036200395e838662005f16565b511662002fd5836200606a565b62003933565b83516001600160a01b0316838201559281019260010162003924565b62003998816200606a565b90546001600160a01b03916003913391831b1c831603620039c7575b5050620039c19062005ec0565b620038e5565b96620039de9183986200308b620039c1956200606a565b959038620039b4565b6040513d84823e3d90fd5b506108fc620038b1565b5034620001dc5780600319360112620001dc576040516201388680548083529083526020808301937f4b58a51c867b7b693aaefb0acd6b55f4e7286e8436d34ab3cc63a1f2bfa35aa492915b82821062003a635762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003a48565b5034620001dc576040366003190112620001dc576004356024356001600160a01b038116908190036200292f5761271082101562003ad6579160036040926020948352811b0183522054604051908152f35b634e487b7160e01b83526032600452602483fd5b5034620001dc5780600319360112620001dc576040516201388880548083529083526020808301937ff9ab3ee50aab7a7cf5b7d30204dd21b5da7cc33690a7aec17b3653a822a635df92915b82821062003b515762002a4e85620034e08189038262004010565b83546001600160a01b03168652948501946001938401939091019062003b36565b5034620001dc5780600319360112620001dc57602060ff6202712954166040519062003b9e81620040ca565b8152f35b5034620001dc576040366003190112620001dc5762003bc062003f20565b60249081356001600160401b03811162003efc5762003be49036906004016200405a565b91600260ff62027129541662003bfa81620040ca565b0362003ebc576202712d5442101562003e7e5760018060a01b0382168085526202712c92602093808552604087206202712e91825491828a52875260ff60408a20541662003e4057875194828a526202712b95868952600260408c2001540362003dda578952865260408820908852855260408720956001968760ff198254161790558688905b62003c8a578880f35b815181101562003dd65762003ca0818362005f16565b511562003d50578254808a5285885262003cf58862001c1d848d60406003918c62003ce78d6200378f8762003cda81898989200162006135565b905490891b1c9262013fff565b979099835252200162006135565b1562003d0d5762003d069062005ec0565b8762003c81565b60405162461bcd60e51b815260048101889052601c818801527b766f74696e6720666f7220706f776572596573206f766572666c6f7760201b6044820152606490fd5b8254808a5285885262003d838862001c1d848d60406003918c62003ce78d6200378f8762003cda81898989200162006135565b1562003d945762003d069062005ec0565b60405162461bcd60e51b815260048101889052601b818801527a766f74696e6720666f7220706f7765724e6f206f766572666c6f7760281b6044820152606490fd5b8880f35b60405162461bcd60e51b8152600481018990526039818901527f746865206e756d626572206f6620766f74657320646f6573206e6f74206d6174604482015278636820746865206e756d626572206f6620706f6c696369657360381b6064820152608490fd5b60405162461bcd60e51b815260048101889052601781880152761d9bdd195c881a185cc8185b1c9958591e481d9bdd1959604a1b6044820152606490fd5b60649060176040519162461bcd60e51b835260206004840152820152761d9bdd1a5b99c81c195c9a5bd9081a185cc8195b991959604a1b6044820152fd5b60649060196040519162461bcd60e51b83526020600484015282015278766f74696e67206973206e6f7420696e2070726f677265737360381b6044820152fd5b8380fd5b905034620029335781600319360112620029335760209062027127548152f35b600435906001600160a01b038216820362003f3757565b600080fd5b35906001600160a01b038216820362003f3757565b608081019081106001600160401b0382111762003f6d57604052565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111762003f6d57604052565b61010081019081106001600160401b0382111762003f6d57604052565b604081019081106001600160401b0382111762003f6d57604052565b602081019081106001600160401b0382111762003f6d57604052565b606081019081106001600160401b0382111762003f6d57604052565b601f909101601f19168101906001600160401b0382119082101762003f6d57604052565b6001600160401b03811162003f6d5760051b60200190565b3590811515820362003f3757565b81601f8201121562003f3757803591620040748362004034565b9262004084604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b828210620040b0575050505090565b838091620040be846200404c565b815201910190620040a1565b60041115620040d557565b634e487b7160e01b600052602160045260246000fd5b6020908160408183019282815285518094520193019160005b82811062004113575050505090565b83516001600160a01b03168552938101939281019260010162004104565b906003821015620040d55752565b60005b838110620041535750506000910152565b818101518382015260200162004142565b906020916200417f815180928185528580860191016200413f565b601f01601f1916010190565b60051115620040d557565b90815180825260208080930193019160005b828110620041b7575050505090565b835185529381019392810192600101620041a8565b90815180825260208080930193019160005b828110620041ed575050505090565b83516001600160a01b031685529381019392810192600101620041de565b908082519081815260208091019281808460051b8301019501936000915b8483106200423a5750505050505090565b90919293949584806200425a600193601f198682030187528a5162004164565b980193019301919493929062004229565b90815180825260208092019182818360051b82019501936000915b848310620042975750505050505090565b9091929394958480620042b383856001950387528a5162004196565b980193019301919493929062004286565b90815180825260208092019182818360051b82019501936000915b848310620042f05750505050505090565b90919293949584806200430c83856001950387528a51620041cc565b9801930193019194939290620042df565b9060208251918281520190819060208160051b84019401926000905b8282106200434957505050505090565b9091929394818103855285519061010080820183516006811015620040d557835260208401516020840152604084015191604084015281518091526101206020818501918360051b86010193019160005b818110620044045750505050600192602092620043d0849360608085015190840152608080850151908483039085015262004164565b9160a08082015115159083015260c08082015115159083015260e08091015115159101529701950192019092919262004339565b9091929361011f9c9b9c198682030184528451908151815260208201516200442c816200418b565b602082015260408201516200444181620040ca565b60408201526060820151603d811015620040d557606082015260a062004477608084015160c0608085015260c084019062004196565b9201519060a081840391015260a0620044f6620044e3620044d0620044bd620044aa865160c0895260c089019062004196565b602087015188820360208a0152620041cc565b604086015187820360408901526200420b565b606085015186820360608801526200426b565b60808401518582036080870152620042c4565b9101519160a081830391015281519081815260208101906020808460051b8301019401926000915b818310620045435750505050506020806001929e9d9e9601940191019190916200439a565b909192939460208062004563600193601f1986820301895289516200420b565b97019501930191906200451e565b81601f8201121562003f37578035916200458b8362004034565b926200459b604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b828210620045c7575050505090565b81358152908301908301620045b8565b81601f8201121562003f3757803591620045f18362004034565b9262004601604051948562004010565b808452602092838086019260051b82010192831162003f37578301905b8282106200462d575050505090565b8380916200463b8462003f3c565b8152019101906200461e565b6001600160401b03811162003f6d57601f01601f191660200190565b929192620046718262004647565b9162004681604051938462004010565b82948184528183011162003f37578281602093846000960137010152565b9080601f8301121562003f3757816020620046bd9335910162004663565b90565b9080601f8301121562003f3757813590620046db8262004034565b92620046eb604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b8483106200471b5750505050505090565b82356001600160401b03811162003f375786916200473f848480948901016200469f565b8152019201916200470a565b9080601f8301121562003f3757813590620047668262004034565b9262004776604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b848310620047a65750505050505090565b82356001600160401b03811162003f37578691620047ca8484809489010162004571565b81520192019162004795565b9080601f8301121562003f3757813590620047f18262004034565b9262004801604051948562004010565b828452602092838086019160051b8301019280841162003f3757848301915b848310620048315750505050505090565b82356001600160401b03811162003f375786916200485584848094890101620045d7565b81520192019162004820565b91908260409181610360528061040052031262003f375760408051929083016001600160401b0381118482101762003f6d57604052620048a2839162003f3c565b83526103605160208101356104808190526001600160401b03811162003f375761040051910190601f8201121562003f37573591620048e18362004034565b620048f0604051918262004010565b8381526020810161032052610400516104805161036051019060208660051b8301011162003f3757602090959392949501915b61048051610360510160208760051b820101841015620054a2578335906001600160401b03821162003f37578181016103c0526060601f198383016104005103011262003f37576040516103e08190529160608301906001600160401b0382118483101762004ca9576200499f92602092604052010162003f3c565b905260406103c0510135602681101562003f37576103e051602001526103c05160608101356103408190526001600160401b031062003f375761040051610140606083013583018203601f19011262003f375760405161046081905261014081019081106001600160401b0382111762004ca9576040526060820135820160200135916001600160401b03831162003f375762004a4792816060602093013501010162004571565b6104605152610340516103c051016040810135906001600160401b03821162003f3757602062004a7e9261040051920101620045d7565b6104605160200152610340516103c051016001600160401b0360608201351162003f37576104005162004aba91606081013501602001620046c0565b6104605160400152610340516103c051016080810135906001600160401b03821162003f3757602062004af492610400519201016200405a565b6104605160600152610340516103c05101936001600160401b0360a08601351162003f375761040051603f60a0870135870101121562003f375762004b43602060a08701358701013562004034565b9562004b53604051978862004010565b60a0860135808701602090810135808a5261040051610340516103c051938c01989493019092019160059190911b82016040011162003f3757604001945b610340516103c0510160a08901359081019089016020013560051b810160400187101562004cbe578635906001600160401b03821162003f37570190610400519060e09182603f19858303011262003f3757604051908382016001600160401b0381118382101762004ca9576040908152850135906001600160401b03821162003f3757604062004c259287010162004571565b8152606084013560208201526080840135604082015260a0840135606082015260c09262004c558486016200404c565b6080830152840135926001600160401b03841162003f375762004c9961010060209662004c8d8897604061040051918401016200469f565b60a0860152016200404c565b9082015281520195019462004b91565b60246000634e487b7160e01b81526041600452fd5b5050949793509450946080610460510152610340516103c0510160c08101356104e05260018060401b0360c08201351162003f3757610400519060c08101350190603f8201121562003f375762004d22602062004d30920135806104205262004034565b604051806103005262004010565b61030051610420519052602061030051016103a052610400516104205160051b9060406104e051610340516103c0510101928301011162003f37576040016103805292939092905b6104205160051b6104e051610340516103c05101019060406103805191830101811015620052bc5780356104c08190526001600160401b031062003f3757610100603f19823584016104005103011262003f3757604051610440819052916101008301916001600160401b0383118484101762004ca95760409283523501013590600682101562003f37575260606104c0516104e051610340516103c051010101013560206104405101526104c0516104e051610340516103c0510101019460018060401b0360808701351162003f375761040051605f6080880135880101121562003f375762004e8562004e77604060808901358901013562004034565b604051806104a05262004010565b6104a08051608088013580890160400135918290529151610400516104c0516104e051610340516103c0516020959095019a96940101019091019160051b82016060011162003f3757606001945b6104c0516104e051610340516103c05101010160808901359081019089016040013560051b8101606001871015620051a3578635906001600160401b03821162003f375701605f1960c081836104005103011262003f37576040519162004f3a8362003f83565b606081013583526080810135600581101562003f3757602084015260a0810135600481101562003f3757604084015260c0810135603d81101562003f3757606084015260e08101356001600160401b03811162003f37576104005162004fa591830160600162004571565b6080840152610100810135916001600160401b03831162003f375760c0908383016104005103011262003f37576040519162004fe18362003f83565b818101606001356001600160401b03811162003f3757610400516200500d918484010160600162004571565b8352818101608001356001600160401b03811162003f3757610400516200503b9184840101606001620045d7565b602084015281810160a001356001600160401b03811162003f3757610400516200506c9184840101606001620046c0565b604084015281810160c001356001600160401b03811162003f3757610400516200509d91848401016060016200474b565b60608401526001600160401b0382820160e001351162003f375761040051620050d29083830160e081013501606001620047d6565b60808401528181016101000135906001600160401b03821162003f37576104005192010190607f8201121562003f3757606081013590620051138262004034565b9162005123604051938462004010565b80835260208301916080610400519260051b82010191821162003f375760808101925b8284106200516d575050505060a08083019190915282015281526020958601950162004ed3565b83356001600160401b03811162003f375760209162005197839260806104005191870101620046c0565b81520193019262005146565b5050935093919094506104a051604061044051015260a06104c0516104e051610340516103c051010101013560606104405101526104c0516104e051610340516103c05101010160c08101359060018060401b03821162003f375760406200521292610400519201016200469f565b608061044051015260e06200523b816104c0516104e051610340516103c051010101016200404c565b60a0610440510152620052646101006104c0516104e051610340516103c051010101016200404c565b60c06104405101526200528d6101206104c0516104e051610340516103c051010101016200404c565b90610440510152610440516103a0515260206103a051016103a052602061038051016103805290929362004d78565b5050610300516104605160a00152610340516103c05193969495929301906001600160401b0360e08301351162003f3757610400519560e0830135830196603f8801121562003f375762005314602088013562004034565b9462005324604051968762004010565b60208881013580885261040051610340516103c051938a0198930160e0880135019160051b82016040011162003f3757604001955b604060208b013560051b60e0880135610340516103c05101010101871015620053985760058735101562003f3757863581526020968701960162005359565b509592989450959250955060c0610460510152610340516103c0510160018060401b036101008201351162003f375761040051620053e091610100810135016020016200474b565b6104605160e00152610340516103c051016001600160401b036101208201351162003f3757610400516200541e9161012081013501602001620047d6565b610460516101000152610340516103c05101610140810135906001600160401b03821162003f37570190610400519182603f8201121562003f3757602092816040856200546f940135910162004663565b6101206104605101526104605160406103e05101526103e051610320515281610320510161032052019193949262004923565b50945091602091500152565b9060405191828154918282526020928383019160005283600020936000905b828210620054e857505050620054e69250038362004010565b565b855484526001958601958895509381019390910190620054cd565b9060405191828154918282526020928383019160005283600020936000905b8282106200553b57505050620054e69250038362004010565b85546001600160a01b03168452600195860195889550938101939091019062005522565b90600182811c9216801562005591575b60208310146200557b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200556f565b9060009291805491620055af836200555f565b918282526001938481169081600014620056165750600114620055d3575b50505050565b90919394506000526020928360002092846000945b83861062005601575050505001019038808080620055cd565b805485870183015294019385908201620055e8565b9294505050602093945060ff191683830152151560051b01019038808080620055cd565b908154620056488162004034565b926040936200565a8551918262004010565b828152809460208092019260005281600020906000935b8585106200568157505050505050565b600184819284516200569981620009e9818a6200559c565b81520193019401939162005671565b60405190919060e081016001600160401b0381118282101762003f6d5760405260c060ff60068395620056db81620054ae565b855260018101546020860152600281015460408601526003810154606086015282600482015416151560808601526040516200572081620009e981600586016200559c565b60a08601520154161515910152565b6006821015620040d55752565b603d821015620040d55752565b908154620057578162004034565b9262005767604051948562004010565b818452600090815260208082208186015b84841062005787575050505050565b60018381926200579785620054ae565b81520192019301929062005778565b908154620057b48162004034565b92620057c4604051948562004010565b818452600090815260208082208186015b848410620057e4575050505050565b6001838192620057f48562005503565b815201920193019290620057d5565b9060405191620058138362003f83565b826200581f82620054ae565b8152600160056200583282850162005503565b936020948585015262005848600282016200563a565b60408501526200585b6003820162005749565b60608501526200586e60048201620057a6565b608085015201805490620058828262004034565b9462005892604051968762004010565b82865260009182528082208187015b848410620058b55750505050505060a00152565b85838192620058c4856200563a565b815201920193019290620058a1565b906020604082019260018060a01b0381511683520151916040602083015282518091526060820190602060608260051b8501019401926000905b8282106200591d57505050505090565b9091929394605f19828203018552855160018060a01b0381511682526020810151906026821015620040d557604091602084015201519060606040820152620059ab620059946200597d845161014060608601526101a085019062004196565b6020850151848203605f19016080860152620041cc565b6040840151838203605f190160a08501526200420b565b606083015190605f198382030160c0840152602080835192838152019201906000905b80821062005d6e57505050608083015190605f198382030160e0840152815180825260208201906020808260051b85010194019260005b82811062005cea57505050505060a083015190605f1983820301610100840152815190818152602081016020808460051b8401019401926000925b81841062005b0d57505050505060c083015190605f1983820301610120840152602080835192838152019201906000905b80821062005ae95750505062005adb8360209361012062005ac462005aab879660e060019a0151605f19868303016101408701526200426b565b610100850151848203605f1901610160860152620042c4565b92015190610180605f198285030191015262004164565b97019501939201906200590d565b909192602080600192865162005aff816200418b565b815201940192019062005a71565b9091929394601f9d9c9d1982820301845285519081516006811015620040d55781526020820151602082015260408201516101006040830152610100820181518091526101206020818501918360051b8601019301916000905b80821062005bd257505050509d9e9d8260209260e08062005ba286956060600199015160608601526080860151858203608087015262004164565b9360a0810151151560a085015260c0810151151560c0850152015115159101529701940194019293919062005a40565b9091929361011f1986820301845284519081518152602082015162005bf7816200418b565b6020820152604082015162005c0c81620040ca565b60408201526060820151603d811015620040d557606082015260a062005c42608084015160c0608085015260c084019062004196565b9201519060a081840391015260a062005c75620044e3620044d0620044bd620044aa865160c0895260c089019062004196565b9101519160a0818303910152815180825260208201906020808260051b8501019401926000915b80831062005cbc5750505050506020806001929601940192019062005b67565b909192939460208062005cdc600193601f1987820301895289516200420b565b970195019301919062005c9c565b9091929394602080600192601f1986820301885288519060c08062005d5862005d1d855160e0865260e086019062004196565b8686015187860152604086015160408601526060860151606086015260808601511515608086015260a086015185820360a087015262004164565b9301511515910152970195019392910162005a05565b909192602080600192865115158152019401920190620059ce565b90620054e6604560405180947f496e76616c69642070726f6772616d20616464726573732e204d73672e73656e60208301526403232b91d160dd1b604083015262005dde81518092602086860191016200413f565b810103602581018552018362004010565b90620054e66040805180947f2c20616e642070726f6772616d206f70657261746f7220616464726573733a20602083015262005e3581518092602086860191016200413f565b810103602081018552018362004010565b6020620054e691939293604051948162005e6a87935180928680870191016200413f565b820162005e80825180938680850191016200413f565b0103808552018362004010565b1562005e965750565b60405162461bcd60e51b81526020600482015290819062005ebc90602483019062004164565b0390fd5b6000198114620033d65760010190565b80511562005ede5760200190565b634e487b7160e01b600052603260045260246000fd5b80516001101562005ede5760400190565b80516002101562005ede5760600190565b805182101562005ede5760209160051b010190565b7f496e76616c696420776974686472617720616d6f756e742e20416d6f756e743a8152600160fd1b602082015260210190565b600f620054e6916020949360405195869262005f8e62005f8083860162005f2b565b91828151948592016200413f565b016e0161030b732103130b630b731b29d1608d1b815262005fb982518093602087850191016200413f565b010360101981018552018362004010565b6019620054e6916020949360405195869262005fec62005f8083860162005f2b565b01780161030b732103bb4ba34323930bbb0b136329031b0b9b41d1603d1b81526200602182518093602087850191016200413f565b010360061981018552018362004010565b906200603e8262004034565b6200604d604051918262004010565b828152809262006060601f199162004034565b0190602036910137565b62013888805482101562005ede5760005260206000200190600090565b62013886805482101562005ede5760005260206000200190600090565b62013881805482101562005ede5760005260206000200190600090565b6202711d805482101562005ede5760005260206000200190600090565b6201388a805482101562005ede5760005260206000200190600090565b62027119805482101562005ede5760005260206000200190600090565b6202711b805482101562005ede5760005260206000200190600090565b805482101562005ede5760005260206000200190600090565b8181106200615a575050565b600081556001016200614e565b600160401b811162003f6d5762013888908154908083558181106200618b57505050565b620054e692600052602060002091820191016200614e565b600160401b811162003f6d5762013886908154908083558181106200618b57505050565b80546000825580620061d7575050565b620054e6916000526020600020908101906200614e565b600160401b811162003f6d5762027119908154908083558181106200618b57505050565b600160401b811162003f6d576202711b908154908083558181106200618b57505050565b6201389180546000825580620061d7575050565b90600160401b811162003f6d578154908083558181106200618b57505050565b91908281116200627b576001920390565b50600091508190565b81156200628f570490565b634e487b7160e01b600052601260045260246000fd5b6000908072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8082101562006410575b506904ee2d6d415b85acef8160201b8083101562006400575b50662386f26fc1000080831015620063f0575b506305f5e10080831015620063e0575b5061271080831015620063d0575b506064821015620063bf575b600a80921015620063b4575b60019081602181860195620063418762004647565b9662006351604051988962004010565b80885262006362601f199162004647565b01366020890137860101905b6200637b575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a835304918215620063ae579190826200636e565b62006374565b91600101916200632c565b919060646002910491019162006320565b6004919392049101913862006314565b6008919392049101913862006306565b60109193920491019138620062f6565b60209193920491019138620062e3565b604093508104915038620062ca565b601e620054e691602094936040519586926200644162005f8083860162005f2b565b017f2c20616e6420776974686472617761626c65206469766964656e64733a20000081526200647a82518093602087850191016200413f565b010360011981018552018362004010565b90620064978262004034565b604090620064a88251918262004010565b8381528093620064bb601f199162004034565b019160005b838110620064ce5750505050565b6020908251620064de8162003f9f565b6000815282600081830152606080868401526000818401526080830152600060a0830152600060c0830152600060e0830152828601015201620064c0565b6200652881546200555f565b908162006533575050565b81601f6000931160011462006546575055565b818352602083206200656491601f0160051c8101906001016200614e565b8160208120915555565b80549060008155816200657f575050565b6000526020600020908101905b81811062006598575050565b80620065a66001926200651c565b016200658c565b90600160401b811162003f6d57815491818155828210620065cd57505050565b600052602060002091820191015b818110620065e7575050565b80620065f56001926200651c565b01620065db565b80549060008155816200660d575050565b6000526020600020908101905b81811062006626575050565b8062006634600192620061c7565b016200661a565b90600160401b811162003f6d578154918181558282106200665b57505050565b600052602060002091820191015b81811062006675575050565b8062006683600192620061c7565b0162006669565b80549060008155816200669b575050565b6000526020600020908101905b818110620066b4575050565b80620066c26001926200656e565b01620066a8565b90600160401b811162003f6d57815491818155828210620066e957505050565b600052602060002091820191015b81811062006703575050565b80620067116001926200656e565b01620066f7565b80546000808355816200672a57505050565b6009928284029284840403620067c757815260208120918201915b828110620067535750505050565b80828592558260018201556200676c60028201620061c7565b6200677a60038201620061c7565b6200678860048201620061c7565b62006796600582016200656e565b620067a460068201620065fc565b620067b260078201620065fc565b620067c0600882016200668a565b0162006745565b634e487b7160e01b82526011600452602482fd5b600160401b821162003f6d57805490828155818310620067fa57505050565b6009928284029284840403620033d6578084029084820403620033d65760009182526020822092830192015b828110620068345750505050565b80828592558260018201556200684d60028201620061c7565b6200685b60038201620061c7565b6200686960048201620061c7565b62006877600582016200656e565b6200688560068201620065fc565b6200689360078201620065fc565b620068a1600882016200668a565b0162006826565b516006811015620040d55790565b906006811015620040d55760ff80198354169116179055565b90620068db816200418b565b60ff80198354169116179055565b90620068f581620040ca565b61ff0082549160081b169061ff001916179055565b90603d811015620040d55762ff000082549160101b169062ff00001916179055565b9190601f81116200693c57505050565b620054e6926000526020600020906020601f840160051c830193106200696b575b601f0160051c01906200614e565b90915081906200695d565b81519192916001600160401b03811162003f6d57620069a2816200699b84546200555f565b846200692c565b602080601f8311600114620069e1575081929394600092620069d5575b50508160011b916000199060031b1c1916179055565b015190503880620069bf565b90601f198316958460005282600020926000905b88821062006a305750508360019596971062006a16575b505050811b019055565b015160001960f88460031b161c1916905538808062006a0c565b80600185968294968601518155019501930190620069f5565b9060ff801983541691151516179055565b9061ff00825491151560081b169061ff001916179055565b9062ff0000825491151560101b169062ff00001916179055565b81516006811015620040d55762006aa49082620068b6565b60208201516001820155600281016040830151602081519162006ac88385620067db565b01916000526020600020916000905b82821062006b3b57505050509060e06005620054e6936060840151600382015562006b0a60808501516004830162006976565b019162006b1e60a082015115158462006a49565b62006b3060c082015115158462006a5a565b015115159062006a72565b8051805185556001850162006b60602083015162006b59816200418b565b82620068cf565b62006b7b604083015162006b7481620040ca565b82620068e9565b6060820151603d811015620040d55762006b95916200690a565b60808101518051906001600160401b03821162003f6d5760209062006bbe8360028a016200624a565b0160028701600052602060002060005b83811062006ecd575050505060a0015180518051906001600160401b03821162003f6d576020600388019162006c0584846200624a565b0190600052602060002060005b83811062006eb8575050505060208101518051906001600160401b03821162003f6d576020600488019162006c4884846200624a565b0190600052602060002060005b83811062006e9a575050505060058501604082015190602082519262006c7c8484620065ad565b01906000526020600020906000905b83821062006e7a5750505050600685016060820151602081519162006cb183856200663b565b019160005260206000206000925b82841062006e165750505050600785016080820151602081519162006ce583856200663b565b019160005260206000206000925b82841062006da9575050505060a06008860191015190602082519262006d1a8484620066c9565b01906000526020600020906000905b83821062006d495750505050600960206001920194019101909262006ad7565b8051602081519162006d5c8387620065ad565b018460005260206000206000915b83831062006d8957505050506001602081920193019101909162006d29565b600160208262006d9c8394518662006976565b0192019201919062006d6a565b80518051906001600160401b03821162003f6d5760209062006dcc83866200624a565b0183600052602060002060005b83811062006df857505050506001602081920192019301929062006cf3565b82516001600160a01b03168183015560209092019160010162006dd9565b80518051906001600160401b03821162003f6d5760209062006e3983866200624a565b0183600052602060002060005b83811062006e6557505050506001602081920192019301929062006cbf565b60019060208451940193818401550162006e46565b600160208262006e8d8394518762006976565b0193019101909162006c8b565b82516001600160a01b03168183015560209092019160010162006c55565b60019060208451940193818401550162006c12565b60019060208451940193818401550162006bce565b62013883805482101562005ede576000526006602060002091020190600090565b62027116805482101562005ede576000526006602060002091020190600090565b62013882805482101562005ede576000526006602060002091020190600090565b62027115805482101562005ede576000526006602060002091020190600090565b620138828054600160401b81101562003f6d5762006f8a9160018201905562006f24565b91909162006f9d57620054e69162006a8c565b634e487b7160e01b600052600060045260246000fd5b620138838054600160401b81101562003f6d5762006f8a9160018201905562006ee2565b620271168054600160401b81101562003f6d5762006f8a9160018201905562006f03565b620271158054600160401b81101562003f6d5762006f8a9160018201905562006f45565b156200702757565b60405162461bcd60e51b815260206004820152603760248201527f73756d4469766964656e64576569676874466f72546f6b656e436c6173733a206044820152766469766964656e64576569676874206f766572666c6f7760481b6064820152608490fd5b61271081101562005ede57620036c381620004326002620046bd9460031b0154916200716f565b908115620070e0576064620070cc818402938462006284565b03620070d85760019190565b600091508190565b60019150600090565b919082156200710157620070cc818402938462006284565b5060019150600090565b156200711357565b60405162461bcd60e51b815260206004820152602e60248201527f746f74616c546f6b656e73506572546f6b656e436c6173733a20746f74616c5460448201526d6f6b656e73206f766572666c6f7760901b6064820152608490fd5b612710811015908162005ede57600390811b906004928383019182549260009582879601935b858710620071a7575050505050505090565b9796909192939495976200720957620071fd88620071f5620071cf62001c389a9b8762006135565b905490881b1c6001600160a01b0316600090815260208990526040812054909462007231565b99906200710b565b95949392919062007195565b603282634e487b7160e01b6000525260246000fd5b9060018201918210620070d85760019190565b91908201918210620070d85760019190565b6201388b5462007256620036f962014b3d565b9190506200726362014c01565b5060009081925b81841062007285575b62007280935004620072bf565b905090565b9160ff60078560031b01541615620072b8578362003796620072b1926200378f62001c3896976200708c565b926200726a565b9162007273565b908015620072d757620072d29162006284565b600191565b5050600090600090565b62013891805490600160401b82101562003f6d576001820180825582101562005ede576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b6201388f805490600160401b82101562003f6d576001820180825582101562005ede576000908152602090200180546001600160a01b0319166001600160a01b03909216919091179055565b6201388180549190600160401b83101562003f6d578262002fd5916001620054e695019055620060a4565b60405190620073b38262003fbc565b60188252772a343290383937b3b930b69034b99032bc32b1baba32b21760411b6020830152565b600091825b6020808401908151805187101562007570578162007402886200740a9362005f16565b510162007b47565b60269283821015620040d557601a918203620074c857876200742d915162005f16565b51928284015190811015620040d5570362007486575093620074776200747f926200746f6200746860e0604062001c389a0151015162005ed0565b5162005ed0565b519062007231565b959062007b55565b92620073df565b6064906040519062461bcd60e51b82526004820152601b60248201527a2a34329037b831b7b2329034b9903737ba102820acafa1a0a9a41760291b6044820152fd5b92919050620074e1816200740289869a979a5162005f16565b82811015620040d5576014036200751a575050906200747762001c38956200378f62007513846200747f965162005f16565b5162007ba2565b6200752c906200740285855162005f16565b90811015620040d5576015146200754a575b506200747f9062005ec0565b906200747762007569956200378f62007513846200747f965162005f16565b906200753e565b505050909250803410600014620075e65760405162461bcd60e51b815260206004820152603760248201527f546865207061796d656e74206973206e6f7420656e6f7567682e205468652074604482015276037ba30b6103830bcb6b2b73a1039b437bab6321031329604d1b6064820152608490fd5b803411620079bc575b5062027129805460ff81166200760581620040ca565b600181036200763b57505050806200762b62007625620076319362007c49565b62007c5e565b62007ce8565b620046bd620073a4565b6200764681620040ca565b600281148080620079ae575b15620077375750505050620076678162007c49565b15620076f857620076788162007c49565b15620076bc57620076899062007ce8565b604051620076978162003fbc565b60158152742a3432903b37ba329034b99032bc32b1baba32b21760591b602082015290565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c696420766f74652070726f6772616d60601b6044820152606490fd5b60405162461bcd60e51b815260206004820152601760248201527624b73b30b634b2103b37ba34b73390383937b3b930b69760491b6044820152606490fd5b6200774282620040ca565b60038214918280620079a0575b156200782d575050505050620077658162007c49565b15620077dd57806200762b620076256200777f9362007c49565b6040516200778d8162003ff4565b603a81527f5468652070656e64696e672070726f6772616d2069732065786563757465642060208201527930b33a32b9103b37ba34b7339030b7321030b8383937bb30b61760311b604082015290565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420657865637574696e672070656e64696e672070726f677261604482015261369760f11b6064820152608490fd5b6200783881620040ca565b818062007991575b8062007983575b15620078715750505050906200763191600360ff198254161790556200762b620076258262007c49565b6200787c81620040ca565b82156200796e575b5050806200795f575b620078c657505050604051620078a38162003fbc565b6013815272283937b3b930b6903a32b936b4b730ba32b21760691b602082015290565b60ff19166001179055620078da8162007c49565b15620078f457806200762b62007625620076319362007c49565b60405162461bcd60e51b815260206004820152603e60248201527f5b4572726f72203030335d5468652070726f6772616d206973206e6f7420612060448201527f76616c696420657865637574652070656e64696e672070726f6772616d2e00006064820152608490fd5b5062027128544210156200788d565b6200797b919250620040ca565b388062007884565b506202712854421062007847565b50620271275442101562007840565b50620271285442106200774f565b506202712754421062007652565b60018060a01b0390818351166000526201388590816020526040600020541562007ab3575b620079ed90346200626a565b901562007a6f5762007a1090838551166000528260205260406000205462007231565b92901562007a2e5783511660005260205260406000205538620075ef565b60405162461bcd60e51b81526020600482015260196024820152782a3432903732bb903130b630b731b29037bb32b9333637bb9760391b6044820152606490fd5b60405162461bcd60e51b815260206004820152601c60248201527b2a3432903830bcb6b2b73a103932ba3ab9371037bb32b9333637bb9760211b6044820152606490fd5b6000908162013886928354915b82811062007b0c575b501562007ada575b509050620079e1565b85518516600160401b82101562003f6d5762002fd582620079ed95600162007b059501905562006087565b3862007ad1565b8662007b188262006087565b919054818b51169260031b1c161462007b3c5762007b369062005ec0565b62007ac0565b505060013862007ac9565b516026811015620040d55790565b1562007b5d57565b60405162461bcd60e51b815260206004820152601f60248201527f54686520746f74616c207061796d656e7420697320746f6f206c617267652e006044820152606490fd5b6000805b604083019060e062007bbc818451015162005ef4565b515184101562007c415762007be18462007bda838651015162005ef4565b5162005f16565b51925101519283516002101562005ede5762007c3062007c2a62007c389362007c2260409662007c1a86606062001c389b015162005f16565b5190620070e9565b929062007b55565b62007231565b949062007b55565b91905062007ba6565b509250505090565b60200151511562007c5957600190565b600090565b1562007c6657565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642070726f6772616d60881b6044820152606490fd5b60809060208152602a60208201527f5468652070726f6772616d2069732064656e6965642062792074686520706c7560408201526967696e2073797374656d60b01b60608201520190565b62007cf38162011e7e565b51620118f3576006811015620040d557600381146201189a578062007d505760405162461bcd60e51b8152602060048201526016602482015275151a19481c1c9bd9dc985b481a5cc81a5b9d985b1a5960521b6044820152606490fd5b600481036200a4bf5750906000905b602083015180518310156200a4b9578262007d7a9162005f16565b5160208101805160269081811015620040d557156200a47657815181811015620040d55760010362007fc957505060408091019062007dbf6101008351015162005ed0565b519262007de160e062007dd6818651015162005ed0565b519451015162005ef4565b519562007df285518551146201314c565b62007e018551885114620131b2565b60005b855181101562007f475762007e1a818662005f16565b51612710908181101562005ede57600160ff600762007e429360031b01541615151462013214565b62007e4e828a62005f16565b5162007e5b838862005f16565b51908282101562005ede57600662007e799260031b01549062007231565b9062007e86848962005f16565b51918383101562005ede57600662007ea39360031b01556201326c565b62007eaf828a62005f16565b519062007ebd838862005f16565b518181101562005ede576001600160a01b03939262007efd916003908662007ee6878e62005f16565b5116600052811b0160205287600020549062007231565b62007f09848a62005f16565b519283101562005ede57600362001c389362007f419662007f2b878e62005f16565b5116600052811b016020528760002055620132cb565b62007e04565b50939262007f649192965062007f5d9062014a3f565b9262014923565b94519262007f728462003fd8565b60008452600036813760005b835181101562007fac578062001c3862007f9d62007fa6938762005f16565b51878a6201424f565b62007f7e565b509450926020925062007fc0915062005ec0565b91905062007d5f565b815181811015620040d5576002036200826d575050604080910180519282840151956200801b62007fff60e08097015162005ed0565b519562008010818651015162005ef4565b519451015162005f05565b519387518651036200821a578751845103620081c65787518551036200816f575060005b8551811015620081595762008055818762005f16565b5190612710918281101562005ede576200807b60ff6007809360031b0154161562013324565b62008087828962005f16565b518381101562005ede5760031b01805460ff19166001179055620080ac818a62005f16565b51620080b9828962005f16565b51908382101562005ede576005620080d59260031b0162006976565b620080e1818662005f16565b51620080ee828962005f16565b518381101562005ede5760031b600101556200810b818762005f16565b5162008118828962005f16565b518381101562005ede5760031b6002015562008135818862005f16565b519182101562005ede5760006006620081539360031b015562005ec0565b6200803f565b5095509390506020925062007fc0915062005ec0565b5162461bcd60e51b815260206004820152603c60248201526000805160206201521a83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b5162461bcd60e51b815260206004820152603960248201526000805160206201521a8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b5162461bcd60e51b815260206004820152603860248201526000805160206201521a8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b819493945181811015620040d5576003036200829757505060209162001c3862007fc092620138d6565b8195949293955181811015620040d5576004036200853c575050604080920161010094620082d9620082cd878451015162005ed0565b51968351015162005ef4565b5194620082f060e062007dd6818651015162005ed0565b519362008305885188511462002a1d62014cb0565b62008318885185511462002a1d62014cb0565b6200832b885186511462002a1d62014cb0565b60005b8851811015620083a05762008344818662005f16565b519061271082101562005ede576200839a916003906001600160a01b036200836d848e62005f16565b5116600052811b0160205262001c3888600020546200838d838a62005f16565b51111562002a1d62014db4565b6200832e565b50909691959294939660005b8351811015620084e957620083c2818862005f16565b5190612710918281101562005ede576001600160a01b039060039082620083ea858a62005f16565b5116600052811b01602052620084138b6200840b848b600020549262005f16565b51906200626a565b9062008420848c62005f16565b51918583101562005ede5760036200845993856200843f888d62005f16565b5116600052811b016020528a6000205562002a1d62014db4565b62008465828a62005f16565b518381101562005ede57600390826200847f858b62005f16565b5116600052811b01602052620084a08b6200746f848b600020549262005f16565b919050620084af838b62005f16565b519384101562005ede57620084e393600391620084cd858b62005f16565b5116600052811b01602052876000205562005ec0565b620083ac565b5094620085139297506200850c91939450620085059062014a3f565b9362014923565b9562014923565b9260005b835181101562007fac578062001c3862007f9d62008536938762005f16565b62008517565b8195949395519080821015620040d55760059182036200875257505050604091828501906200858060e062008575818551015162005ed0565b519351015162005ef4565b51928251845103620087015760005b8351811015620085e757620085a5818562005f16565b519061271082101562005ede576003620085e19260018060a01b038b5116600052811b0160205262001c3887600020546200838d838962005f16565b6200858f565b509092919260005b8451811015620086825762008605818662005f16565b51906127108083101562005ede57600360018060a01b0393848c5116600052811b016020526200863f88600020546200840b848962005f16565b6200864b848a62005f16565b519283101562005ede57600362001c38936200867c968e5116600052811b01602052896000205562002a1d62014db4565b620085ef565b509593926200869391925062014a3f565b91805193620086a28562003fbc565b6001855260203681870137516001600160a01b0316620086c28562005ed0565b525194620086d08662003fd8565b60008652600036813760005b835181101562007fac578062001c3862007f9d620086fb938762005f16565b620086dc565b845162461bcd60e51b81526020600482015260356024820152600080516020620151fa833981519152604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b82969394965181811015620040d557600603620089bd57505050906040809201620087836101008251015162005ed0565b51946200879a60e062008575818551015162005ed0565b519286518351036200896c578651845103620089205760005b87518110156200881857620087c9818562005f16565b519061271082101562005ede5762008812916003906001600160a01b03620087f2848d62005f16565b5116600052811b0160205262001c3887600020546200838d838962005f16565b620087b3565b509092919260005b8751811015620088cc5762008836818662005f16565b516127108082101562005ede576001600160a01b039291600390846200885d858e62005f16565b5116600052811b016020526200887d88600020546200840b848962005f16565b62008889848a62005f16565b519283101562005ede57600362001c3893620088c696620088ac8f889062005f16565b5116600052811b01602052896000205562002a1d62014db4565b62008820565b509592620088e191925062007f5d9062014a3f565b925194620088ef8662003fd8565b60008652600036813760005b835181101562007fac578062001c3862007f9d6200891a938762005f16565b620088fb565b845162461bcd60e51b81526020600482015260306024820152600080516020620152da83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b845162461bcd60e51b815260206004820152603560248201526000805160206201519a8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b825181811015620040d55760070362008b1057505050604080910193620089ea6101008651015162005ed0565b519282620089fd60e08851015162005ed0565b51965101519162008a16855188511462002a1d62014cb0565b60005b8551811015620081595762008b0a9062001c386001600160a01b038260028862008af28e62008ae78e62008add8f8962008a548a8562005f16565b511660005262008a918962008a8981620138809a8b60205262008a8360ff8760002054161562002a1d62014d81565b62005f16565b519662005f16565b51968a62008ac783519b8c9662008aa88862003f51565b600188526060602089019860008a528781019b8c52019b8c5262005f16565b5116600052602052600020975115158862006a49565b5115158662006a5a565b516001850162006976565b5191015562008b02838a62005f16565b511662007379565b62008a19565b82969596519281841015620040d557600893840362008c03575050506101009262008b4384604080950151015162005ed0565b519460005b865181101562008bed5762008be790876001600160a01b038062008b6d848462005f16565b511660005262008bbe888262008ba28662013880968760205262008a83600160ff8097600020541615151462002a1d62014ce0565b5116600052836020528960002054891c161562002a1d62014d48565b62008bca838b62005f16565b5116600052602052856000208761ff001982541617905562005ec0565b62008b48565b5095915093506020925062007fc0915062005ec0565b80959394955182811015620040d55760090362008cf25750505062008c32610100604080950151015162005ed0565b519360005b855181101562008cdd5762008cd790866001600160a01b038062008c5c848462005f16565b511660005262008cb06001898362008c928762013880978860205262008a838660ff8097600020541615151462002a1d62014ce0565b5116600052846020528a600020548a1c1615151462002a1d62014d13565b62008cbc838a62005f16565b51166000526020528560002061ff0019815416905562005ec0565b62008c37565b50949093506020925062007fc0915062005ec0565b80979694929395975182811015620040d557600a0362008dd2575050505060408094019162008d3860e062008d2d6101008651015162005ed0565b519451015162005ed0565b519162008d4d845184511462002a1d62014cb0565b60005b845181101562007fac5762008dcc906001600160a01b038062008d74838962005f16565b5116600052620138808060205262008d9c600160ff8c600020541615151462002a1d62014ce0565b62008da8838862005f16565b519162008db6848a62005f16565b5116600052602052600289600020015562005ec0565b62008d50565b809795975182811015620040d557600b0362008ea557505050506040809201938262008e046101008751015162005ed0565b51955101519162008e1d865184511462002a1d62014cb0565b60005b865181101562007fac5762008e9f9062001c386001600160a01b038062008e48848c62005f16565b5116600052620138808060205262008e70600160ff8b600020541615151462002a1d62014ce0565b62008e7c848962005f16565b519162008e8a858d62005f16565b51166000526020526001886000200162006976565b62008e20565b809794959396975182811015620040d557600c0362008fdd5750505060400160a09182825101519360005b855181101562008bed5760e062008eec82878751015162005f16565b5101511562008f745762008f1062008f0982878751015162005f16565b5162006f66565b620138828054600019929190838101908111620033d65762008f338a9162006f24565b5001805461ff00191661010017905554918201918211620033d6578762008f5e62008f6e9362006f24565b5001805460ff1916905562005ec0565b62008ed0565b62008f8f62008f8882878751015162005f16565b5162006fb3565b620138828054600019929190838101908111620033d65762008fb28a9162006ee2565b5001805461ff00191661010017905554918201918211620033d6578762008f5e62008f6e9362006ee2565b80979695939294975182811015620040d557600d03620091345750506040019460606200900f60e08851015162005ed0565b51965101519162009024875184511462012e8b565b60005b875181101562008159578080878a62009045620090d5958962005f16565b5115620090db57620090a66200908d8483620090786200906b620090b198889762005f16565b5162013882541162012f14565b62008a838d620090946200908d858562005f16565b5162006f24565b509060ff9889920154901c1662012f6c565b500154161562012fcd565b86620090c26200908d838c62005f16565b5001805460ff1916600117905562005ec0565b62009027565b620090a66200911c848362009107620090fa6200912398889762005f16565b5162013883541162012f14565b62008a838d620090946200911c858562005f16565b5162006ee2565b86620090c26200911c838c62005f16565b80979493975182811015620040d557600e036200921b5750506040019160606200916360e08551015162005ed0565b51935101519562009178845188511462012e8b565b60005b845181101562008159578062009196620091a2928a62005f16565b51620091a85762005ec0565b6200917b565b620091c5620091b8828862005f16565b516201388254116201302e565b6200920a87620091ef620091de6200908d858b62005f16565b5060ff9283910154891c1662013087565b88620092006200908d858b62005f16565b50015416620130e9565b8662008f5e6200908d838962005f16565b8091929350969495965182811015620040d557600f036200933657505060400160a09182825101519360005b855181101562008bed5760e06200926382878751015162005f16565b51015115620092d4576200928062008f0982878751015162005f16565b620138828054600019929190838101908111620033d657620092a38a9162006f24565b5001805461ff00191661010017905554918201918211620033d65787620090c2620092ce9362006f24565b62009247565b620092e862008f8882878751015162005f16565b620138828054600019929190838101908111620033d6576200930b8a9162006ee2565b5001805461ff00191661010017905554918201918211620033d65787620090c2620092ce9362006ee2565b80919293949695505182811015620040d557601003620093db57505060400151906200936b60e060c084015193015162005ed0565b519362009380835186511462002a1d62014cb0565b60005b8351811015620093c8578062001c38620093a2620093c2938762005f16565b51620093ae816200418b565b620093ba838a62005f16565b519062012df2565b62009383565b509350916020915062007fc09062005ec0565b809592955182811015620040d5576011036200967b575050906040809401916200941160e062008d2d6101008651015162005ed0565b519162009422845184511462012d98565b60005b84518110156200949b57620094959062001c386001600160a01b03806200944d848a62005f16565b511660005262013885806020526200946f8b600020546200746f868b62005f16565b9190926200947e868c62005f16565b51166000526020528a6000205562002a1d62014c66565b62009425565b5093945091620094ac915062014923565b906201388692835494620094cc620094c685518862012de4565b62006032565b91600093845b8881106200963b575060005b865181101562009593576000805b8a811062009544575b50156200950e575b620095089062005ec0565b620094de565b9462009508906200953b906001600160a01b036200952d898b62005f16565b511662001e43828962005f16565b959050620094fd565b6200954f8162006087565b90546001600160a01b0360039290921b1c8116906200956f858c62005f16565b5116146200958857620095829062005ec0565b620094ec565b5050600138620094f5565b50965094909350620095a58362006032565b805191906001600160401b03831162003f6d57602090620095c684620061a3565b0190600052602060002060005b8381106200961d575050505060005b828110620095fa5750505062007fc060209162005ec0565b620096179062001c386001600160a01b0362002fc8838662005f16565b620095e2565b82516001600160a01b031681830155602090920191600101620095d3565b946200966e6200967591620096508862006087565b905460039190911b1c6001600160a01b031662001e43828962005f16565b9562005ec0565b620094d2565b805182811015620040d557601203620098ee575050604080940191620096ad60e062008d2d6101008651015162005ed0565b5191620096be845184511462012d98565b60005b845181101562009711576200970b9062001c386001600160a01b0380620096e9848a62005f16565b511660005262013885806020526200946f8b600020546200840b868b62005f16565b620096c1565b509491509291620097229062014923565b90620138868054620097348162006032565b9260009485925b808410620097e85750505050620097528362006032565b805191906001600160401b03831162003f6d576020906200977384620061a3565b0190600052602060002060005b838110620097ca575050505060005b828110620097a75750505062007fc060209162005ec0565b620097c49062001c386001600160a01b0362002fc8838662005f16565b6200978f565b82516001600160a01b03168183015560209092019160010162009780565b9297600097929597949194998a5b8651811015620098dc576200980b8b62006087565b90546001600160a01b0360039290921b1c8116906200982b838a62005f16565b51161462009844576200983e9062005ec0565b620097f6565b509950976001979592979491945b80620098ab575b1562009871576200986a9062005ec0565b926200973b565b95620098a46200986a91620098868962006087565b905460039190911b1c6001600160a01b031662001e43828a62005f16565b9662005ec0565b50620098b78162006087565b60018060a01b0391549060031b1c166000526201388560205282600020541562009859565b50999890989795929794919462009852565b809592955182811015620040d5576013036200994f57505060400151608001519260005b84518110156200993e578062001c386200993162009938938862005f16565b5162013eeb565b62009912565b5092509062007fc060209162005ec0565b80519180831015620040d557601492830362009af3575050506040809101906200997f6101008351015162005ed0565b51926200999660e062007dd6818651015162005ed0565b5195620099a785518551146201314c565b620099b68551885114620131b2565b60005b855181101562009a9e57620099cf818962005f16565b51620099dc828762005f16565b51612710918282101562005ede576006620099fd9260031b01549062007231565b9062009a0a848962005f16565b51918383101562005ede57600662009a279360031b01556201326c565b62009a33828a62005f16565b519062009a41838862005f16565b518181101562005ede576001600160a01b03939262009a6a916003908662007ee6878e62005f16565b62009a76848a62005f16565b519283101562005ede57600362001c389362009a989662007f2b878e62005f16565b620099b9565b50939262009ab49192965062007f5d9062014a3f565b94519262009ac28462003fd8565b60008452600036813760005b835181101562007fac578062001c3862007f9d62009aed938762005f16565b62009ace565b815181811015620040d557601590810362009b1f57505050506020919262001c3862007fc092620138d6565b82519180831015620040d557601692830362009b88575050505050610100604062009b4e920151015162005ed0565b519260005b84518110156200993e5762009b829062001c386001600160a01b0362009b7a838962005f16565b51166200732d565b62009b53565b835181811015620040d55760170362009be15760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b835181811015620040d55760180362009c56575050505050610100604062009c0d920151015162005ed0565b5162013892805460ff191660011790559260005b84518110156200993e5762009c509062001c386001600160a01b0362009c48838962005f16565b5116620072e1565b62009c21565b839796975181811015620040d55760190362009c80575b50505050505062007fc060209162005ec0565b835181811015620040d557601a0362009d8d575050505062009cab60e0604080940151015162005ed0565b519062009cbc600383511462012d98565b62009cc78262005ed0565b519262009ce062009cd88462005ef4565b519362005f05565b519262009d535750509162007fc09160016020941460001462009d4c5762009d209062009d136201388d91825462007231565b90915562002a1d62014c01565b62009d416201388e62009d3481546200721e565b90915562002a1d62014c3b565b913880808062009c6d565b5062009d41565b60649250519062461bcd60e51b825260206004830152602482015273496e76616c6964207061796d656e74207479706560601b6044820152fd5b9091928094505181811015620040d557601b036200a2185750505050509062009dcd6201388b546200370b62009dc262014b3d565b612710831062005e8d565b505062009dd962014c01565b506000805b61271081106200a1b3575b505062009df562007243565b9062009e056202712a5462006032565b9060009384905b6127108210156200a1a8578160031b9260ff6007850154161562009f5d5760009760028501541562009f4b57889798975b62005ede57600485015488101562009f315762009e5e886004870162006135565b9054600391821b1c6001600160a01b0316600081815291870160205260409182902054919a9162009e91908a90620070e9565b9b9062009e9d62014c01565b62009ea89162005e8d565b60009b600289015462009ebb91620070e9565b9062009ec662014c01565b62009ed19162005e8d565b828d5262013887602052818d20549062009eeb9162007231565b90918d205562009efa62014c01565b62009f059162005e8d565b62009f11828962005f16565b5262009f1d9062005ec0565b9762009f299062005ec0565b979862009e3d565b9290935062009f4291965062005ec0565b90959462009e0c565b9290935062009f429196975062005ec0565b959392509350505b62009f708262006032565b91600091825b8281106200a11257505050620138889081549262009f99620094c6858462012de4565b9360009081905b8082106200a0d057505060005b8381106200a02c5750508351939150506001600160401b03831162003f6d5760209062009fda8462006167565b0190600052602060002060005b8381106200a00e575050505062007fc060209160006201388d5560006201388e5562009d41565b82516001600160a01b03168183015560209092019160010162009fe7565b6000805b8381106200a088575b50156200a052575b6200a04c9062005ec0565b62009fad565b906200a04c906200a07f906001600160a01b036200a071858762005f16565b511662001e43828a62005f16565b9190506200a041565b6001600160a01b03806200a09d858862005f16565b5116906200a0ac838b62005f16565b5116146200a0c5576200a0bf9062005ec0565b6200a030565b50506001386200a039565b90916200a1046200a10b916200a0e6856200606a565b905460039190911b1c6001600160a01b031662001e43828b62005f16565b9262005ec0565b9062009fa0565b6000805b8581106200a160575b50156200a138575b6200a1329062005ec0565b62009f76565b926200a132906200a157906001600160a01b036200952d878662005f16565b9390506200a127565b6001600160a01b03806200a175858762005f16565b5116906200a184838a62005f16565b5116146200a19d576200a1979062005ec0565b6200a116565b50506001386200a11f565b935050929062009f65565b8060031b9060ff600783015416156200a211576200a1ff62007c2a62001c38946200a1f36200a20b9560026200a1e9876200708c565b91015490620070e9565b929062002a1d62014c01565b939062002a1d62014c01565b62009dde565b5062009de9565b835181811015620040d557601c036200a2715760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b835181811015620040d557601d036200a297575b505050505062007fc060209162009d41565b835181811015620040d557601e146200a28557835181811015620040d557601f036200a2f057505050506020916200a2e66200a2df62007fc093604080910151015162005ed0565b5162013f22565b913880806200a285565b835181811015620040d5576020036200a316575b505050505062007fc06020916200a2e6565b835181811015620040d55760218091036200a333575b506200a304565b8451828110156200a461576022036200a3745750505050505062007fc06020916201389260ff1981541690556200a36962006236565b91388080806200a32c565b8451828110156200a461576023036200a39b575b50505050505062007fc06020916200a369565b845194828610156200a4615760248096036200a3b9575b506200a388565b8051838110156200a44d576025146200a3b25751918210156200a4395750036200a3fd5750506020916200a3f162007fc092620138d6565b9138808080806200a3b2565b60405162461bcd60e51b8152602060048201529182015275496e76616c6964206f7065726174696f6e207479706560501b604482015260649150fd5b8490634e487b7160e01b6000526004526000fd5b8683634e487b7160e01b6000526004526000fd5b50634e487b7160e01b60005260045260246000fd5b60405162461bcd60e51b815260206004820152601b60248201527a13dc195c985d1a5bdb881d1e5c19481a5cc81d5b9919599a5b9959602a1b6044820152606490fd5b50915050565b600281036200a4e35760405162461bcd60e51b81528062005ebc6004820162007c9d565b6001146200a4ee5750565b906200a4fe62013883546200648b565b805190600160401b821162003f6d5762027116548262027116558083106201181e575b506020016202711660005260206000206000915b838310620117fd575050505060005b62013883548110156200a57e578062001c386200a5656200a5789362006ee2565b506200a5718362006f03565b9062011db3565b6200a544565b506200a58e62013882546200648b565b805190600160401b821162003f6d57620271155482620271155580831062011760575b506020016202711560005260206000206000915b8383106201173f575050505060005b62013882548110156200a607578062001c386200a5f56200a6019362006f24565b506200a5718362006f45565b6200a5d4565b5060005b612710811015806200a7d357600160ff6201389a8460031b0154161515146200a641575b506200a63b9062005ec0565b6200a60b565b916000835b62005ede57620138978360031b01548110156200a6b3576200a6aa929350600092816200a67d8593620138978860031b0162006135565b9054600391821b1c6001600160a01b031660009081529087901b6201389601602052604081205562005ec0565b9093926200a646565b5091604051906200a6c48262003fd8565b6000825262005ede578051906001600160401b03821162003f6d576020906200a6f683620138978660031b016200624a565b01620138978360031b01600052602060002060005b8381106200a7b55750505050600381901b6201389a8101805460ff191690556000620138938201819055620138948201819055620138958201556201389801546200a63b91906200a75c906200555f565b601f908181116200a789575b50506000620138988260031b01556000620138998260031b0155906200a62f565b6200a7ad91620138988460031b016000526020600020910160051c8101906200614e565b38806200a768565b82516001600160a01b0316818301556020909201916001016200a70b565b505060005b6127108110620116aa575060005b62013881548110156200a84357806200a8036200a83d92620060a4565b60018060a01b0391549060031b1c166000526202711360205260006002604082208281556200a835600182016200651c565b015562005ec0565b6200a7e6565b506200a853620138815462006032565b8051906001600160401b03821162003f6d57600160401b821162003f6d57602090620271145483620271145580841062011687575b500162027114600052602060002060005b83811062011669575050505060005b62013881548110156200a91d576200a8c081620060a4565b9054620271145460039290921b1c6001600160a01b0316919081101562005ede57620271146000526000805160206201523a833981519152810180546001600160a01b0319169092179091556200a9179062005ec0565b6200a8a8565b509060005b62013881548110156200a9df57806200a93f6200a99492620060a4565b9060018060a01b03918291549060031b1c1660005262013880602052604080600020916200a96d84620060a4565b90549060031b1c1660005262027113602052600020908082036200a99a575b505062005ec0565b6200a922565b600280916200a9c060ff6200a9b3818454168762006a49565b825460081c168562006a5a565b6200a9d2600182016001860162011a34565b015491015538806200a98c565b5060005b6202711d548110156200aa3357806200aa006200aa2d92620060c1565b60018060a01b0391549060031b1c166000526202711c60205262001c38604060002060648101906200614e565b6200a9e3565b506200aa436201388a5462006032565b8051906001600160401b03821162003f6d57600160401b821162003f6d5760206202711d91825484845580851062011649575b500190600052602060002060005b8381106201162b575050505060005b6201388a548110156200aad7578062001c386200aab46200aad193620060de565b905460039190911b1c6001600160a01b031662002fd583620060c1565b6200aa93565b5060005b6201388a548110156200ab6557806200aaf86200ab4c92620060de565b9060018060a01b03918291549060031b1c1660005262013889602052604080600020916200ab2684620060de565b90549060031b1c166000526202711c602052600020908082036200ab5257505062005ec0565b6200aadb565b6200ab5d9162011e47565b38806200a98c565b506201388b546202711e556201388c546202711f556201388d5462027120556201388e5462027121556201388f546001600160401b03811162003f6d57600160401b811162003f6d576202712254816202712255808210620115fc575b506202712260009081527f846ab89c81ea9339188216a1864da1a19ebe28d411cbec99efa70ca6d389710d8054600080516020620151ba83398151915291905b848410620115da5750505050506201389054600160401b811162003f6d57620271235481620271235580821062011597575b50620271236000908152600080516020620151da8339815191527f7f73709277f72a9bc7b284375e83603a53394744e9fa86da811e86c2aa78e05e5b8383106201157957505062013891549150506001600160401b03811162003f6d57600160401b811162003f6d5762027124548162027124558082106201154a575b506202712460009081527f8f332db73d3937798ea82422156d059730b0b3058606439b57b7ae623e94536680546000805160206201525a83398151915291905b8484106201152857505050505060ff620138925416151560ff8019620271255416911617620271255560005b62027119548110156200ad6957806200ad3a6200ad6392620060fb565b905460039190911b1c6001600160a01b0316600090815262027118602052604081205562005ec0565b6200ad1d565b506200ad79620138865462006032565b8051906001600160401b03821162003f6d576020906200ad9983620061ee565b0162027119600052602060002060005b8381106201150a575050505060005b62013886548110156200adfc578062001c386200add96200adf69362006087565b905460039190911b1c6001600160a01b031662002fd583620060fb565b6200adb8565b5060005b62013886548110156200ae6e57806200ae1d6200ae689262006087565b9060018060a01b03918291549060031b1c166000526201388560205260408060002054916200ae4c8462006087565b90549060031b1c16600052620271186020526000205562005ec0565b6200ae00565b5060005b6202711b548110156200aebe57806200ae8f6200aeb89262006118565b905460039190911b1c6001600160a01b031660009081526202711a602052604081205562005ec0565b6200ae72565b506200aece620138885462006032565b8051906001600160401b03821162003f6d576020906200aeee8362006212565b016202711b600052602060002060005b838110620114ec575050505060005b62013888548110156200af51578062001c386200af2e6200af4b936200606a565b905460039190911b1c6001600160a01b031662002fd58362006118565b6200af0d565b5060005b62013888548110156200afc357806200af726200afbd926200606a565b9060018060a01b03918291549060031b1c166000526201388760205260408060002054916200afa1846200606a565b90549060031b1c166000526202711a6020526000205562005ec0565b6200af55565b50906000905b602083015180518310156200eb1357826200afe49162005f16565b5160208101516026811015620040d557156200a4765760208101516026811015620040d5576001036200b5c757604001906200b0266101008351015162005ed0565b51936200b03d60e062007dd6818651015162005ed0565b51916200b04e86518551146201314c565b6200b05d8651845114620131b2565b60005b86518110156200b1c0576200b076818662005f16565b5161271081101562005ede57600160ff6201389a6200b09e9360031b01541615151462013214565b6200b0aa818562005f16565b516200b0b7828762005f16565b519061271082101562005ede57620138996200b0d99260031b01549062007231565b906200b0e6838862005f16565b519161271083101562005ede57620138996200b1079360031b01556201326c565b6200b113818562005f16565b516200b120828762005f16565b519061271082101562005ede576200b1649162013896906001600160a01b036200b14b868d62005f16565b511660005260031b016020526040600020549062007231565b91906200b172828862005f16565b519061271082101562005ede576200b1ba9362001c389262013896906001600160a01b036200b1a2878f62005f16565b511660005260031b01602052604060002055620132cb565b6200b060565b50926200b1d7919250620085059095949562014a3f565b916040516200b1e68162003fd8565b6000815260003681376000945b80518610156200b5ad576200b209868262005f16565b51610360526200b21a855162006032565b966000946200b22a845162006032565b6103e05260009460005b88518110156200b306578a896200b2646001600160a01b036200b258858462005f16565b51166103605162014875565b15806200b2bd575b6200b285575b50506200b27f9062005ec0565b6200b234565b986200b2b29162001e4382859c6200b2a96200b27f9760018060a01b039262005f16565b51169262005f16565b9790508a896200b272565b50505061271061036051101562005ede576001600160a01b036200b2e2828b62005f16565b5116600052620138966103605160031b016020528a8960406000205415156200b26c565b50909895979498969291939660005b88518110156200b3a55761271061036051101562005ede576001600160a01b03806200b342838c62005f16565b5116600052620138966103605160031b01602052604060002054156200b375575b506200b36f9062005ec0565b6200b315565b819b6200b39d916200b38c6200b36f948d62005f16565b511662001e43826103e05162005f16565b9a906200b363565b5098509695929190939661036051612710811015806101205262005ede5760031b620138970154986200b3dd620094c6898c62012de4565b60e05260006102e0526000610400525b6101205162005ede57610400518a8110156200b4b7576200b4246200b44491600061012052620138976103605160031b0162006135565b90546103e0516001600160a01b03939260031b9190911c831690620148ce565b156200b464575b506200b45a6104005162005ec0565b610400526200b3ed565b6000610120526200b48461040051620138976103605160031b0162006135565b90549060031b1c166200b49d6102e05160e05162005f16565b526200b4ac6102e05162005ec0565b6102e052386200b44b565b50979294959093985095909560005b8281106200b562575050506101205162005ede5760e051516001600160401b03811162003f6d576200b50481620138976103605160031b016200624a565b602060e05101620138976103605160031b01600052602060002060005b8381106200b54457505050506200b5389062005ec0565b9492959091956200b1f3565b82516001600160a01b0316818301556020909201916001016200b521565b6200b5a7906001600160a01b036200b57b828562005f16565b51166200b58e6102e05160e05162005f16565b526200b59d6102e05162005ec0565b6102e05262005ec0565b6200b4c6565b5050939092506200b5bf915062005ec0565b90916200afc9565b9060208294939401516026811015620040d5576002036200b7865760408092019081519383850151916200b6206200b60460e08098015162005ed0565b51966200b615818751015162005ef4565b519551015162005f05565b519483518751036200821a578351855103620081c65783518651036200816f575060005b86518110156200b773576200b65a818862005f16565b5161271081101562005ede5760ff6201389a6200b67e9260031b0154161562013324565b6200b68a818862005f16565b5161271081101562005ede5760031b6201389a01805460ff191660011790556200b6b5818562005f16565b516200b6c2828962005f16565b519061271082101562005ede57620138986200b6e29260031b0162006976565b6200b6ee818662005f16565b516200b6fb828962005f16565b5161271081101562005ede5760031b6201389401556200b71c818762005f16565b516200b729828962005f16565b5161271081101562005ede5760031b6201389501556200b74a818862005f16565b519061271082101562005ede576000620138996200b76d9360031b015562005ec0565b6200b644565b509592509350506200b5bf915062005ec0565b92919060208101516026811015620040d5576003036200b7b1579162001c386200b5bf929362013370565b60208101516026811015620040d5576004036200ba7157604001610100936200b7ee6200b7e2868451015162005ed0565b51958351015162005ef4565b51906200b80560e062007dd6818651015162005ed0565b51936200b81a875184511462002a1d62014cb0565b6200b82d875185511462002a1d62014cb0565b6200b840875186511462002a1d62014cb0565b60005b87518110156200b8ac576200b859818662005f16565b519061271082101562005ede576200b8a69162013896906001600160a01b036200b884848d62005f16565b511660005260031b0160205262001c386040600020546200838d838a62005f16565b6200b843565b509095919593929360005b83518110156200ba13576200b8cd818762005f16565b5161271081101562005ede5762013896906001600160a01b036200b8f2848862005f16565b511660005260031b016020526200b9146040600020546200840b838862005f16565b906200b921838962005f16565b519161271083101562005ede576200b9689262013896906001600160a01b036200b94c878b62005f16565b511660005260031b0160205260406000205562002a1d62014db4565b6200b974818762005f16565b5161271081101562005ede5762013896906001600160a01b036200b999848c62005f16565b511660005260031b016020526200b9bb6040600020546200746f838862005f16565b9190506200b9ca818862005f16565b519161271083101562005ede576200ba0d9262013896906001600160a01b036200b9f5858e62005f16565b511660005260031b0160205260406000205562005ec0565b6200b8b7565b50936200ba2d9192969350620085056200850c9162014a3f565b9260005b83518110156200ba5f578062001c386200ba506200ba59938762005f16565b51878a62014544565b6200ba31565b5094509290506200b5bf915062005ec0565b9260208401516026811015620040d5576005036200bc8a5760408401906200baa360e062008575818551015162005ed0565b519282518451036200bc385760005b83518110156200bb0e576200bac8818562005f16565b519061271082101562005ede57620138966200bb089260018060a01b038a511660005260031b0160205262001c386040600020546200838d838962005f16565b6200bab2565b509060005b83518110156200bbb7576200bb29818562005f16565b5161271081101562005ede57620138969060018060a01b0389511660005260031b016020526200bb646040600020546200840b838862005f16565b91906200bb72828762005f16565b519061271082101562005ede576200bbb1936201389662001c389360018060a01b038d511660005260031b0160205260406000205562002a1d62014db4565b6200bb13565b50949250906200bbc79062014a3f565b90604051926200bbd78462003fbc565b6001845260203681860137516001600160a01b03166200bbf78462005ed0565b52604051946200bc078662003fd8565b60008652600036813760005b83518110156200ba5f578062001c386200ba506200bc32938762005f16565b6200bc13565b60405162461bcd60e51b81526020600482015260356024820152600080516020620151fa833981519152604482015274195b905b5bdd5b9d081a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b909260208101516026811015620040d5576006036200c27f576040016200bcb76101008251015162005ed0565b51936200bcce60e062008575818551015162005ed0565b519285518351036200c22d5785518451036200c1e05760005b86518110156200bd50576200bcfd818562005f16565b519061271082101562005ede576200bd4a9162013896906001600160a01b036200bd28848c62005f16565b511660005260031b0160205262001c386040600020546200838d838962005f16565b6200bce7565b509060005b86518110156200bdf6576200bd6b818562005f16565b5161271081101562005ede5762013896906001600160a01b036200bd90848b62005f16565b511660005260031b016020526200bdb26040600020546200840b838862005f16565b91906200bdc0828762005f16565b519061271082101562005ede576200bdf09362001c389262013896906001600160a01b036200b94c878f62005f16565b6200bd55565b50916200be0d919350620085059095949562014a3f565b91604051926200be1d8462003fd8565b6000845260003681376000945b80518610156200b5ad576200be40868262005f16565b516102c0526200be51855162006032565b966000946200be61845162006032565b6103805260009460005b88518110156200bf34578a896200be9b6001600160a01b036200be8f858462005f16565b51166102c05162014875565b15806200beeb575b6200bebc575b50506200beb69062005ec0565b6200be6b565b986200bee09162001e4382859c6200b2a96200beb69760018060a01b039262005f16565b9790508a896200bea9565b5050506127106102c051101562005ede576001600160a01b036200bf10828b62005f16565b5116600052620138966102c05160031b016020528a8960406000205415156200bea3565b50909895979498969291939660005b88518110156200bfd3576127106102c051101562005ede576001600160a01b03806200bf70838c62005f16565b5116600052620138966102c05160031b01602052604060002054156200bfa3575b506200bf9d9062005ec0565b6200bf43565b819b6200bfcb916200bfba6200bf9d948d62005f16565b511662001e43826103805162005f16565b9a906200bf91565b509850969592919093966102c051612710811015806102605262005ede5760031b620138970154986200c00b620094c6898c62012de4565b6103c0526000610320526000610420525b6102605162005ede57610420518a8110156200c0e7576200c0536200c07391600061026052620138976102c05160031b0162006135565b9054610380516001600160a01b03939260031b9190911c831690620148ce565b156200c093575b506200c0896104205162005ec0565b610420526200c01c565b6000610260526200c0b361042051620138976102c05160031b0162006135565b90549060031b1c166200c0cd610320516103c05162005f16565b526200c0dc6103205162005ec0565b61032052386200c07a565b50979294959093985095909560005b8281106200c194575050506102605162005ede576103c051516001600160401b03811162003f6d576200c13581620138976102c05160031b016200624a565b60206103c05101620138976102c05160031b01600052602060002060005b8381106200c17657505050506200c16a9062005ec0565b9492959091956200be2a565b82516001600160a01b0316818301556020909201916001016200c153565b6200c1da906001600160a01b036200c1ad828562005f16565b51166200c1c1610320516103c05162005f16565b526200c1d06103205162005ec0565b6103205262005ec0565b6200c0f6565b60405162461bcd60e51b81526020600482015260306024820152600080516020620152da83398151915260448201526f1b9d1cc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b60405162461bcd60e51b815260206004820152603560248201526000805160206201519a8339815191526044820152741b90db185cdcd95cc81a5cc81b9bdd08195c5d585b605a1b6064820152608490fd5b6020819492939401516026811015620040d5576007036200c42257604001916200c2af6101008451015162005ed0565b519160406200c2c360e08651015162005ed0565b5194510151916200c2dc845186511462002a1d62014cb0565b60005b84518110156200c410576001600160a01b03806200c2fe838862005f16565b511660005262027113806020526200c32360ff604060002054161562002a1d62014d81565b60026200c331848862005f16565b516200c39b6200c342868c62005f16565b519162008ae78b604051966200c3588862003f51565b60018852886200c37f8b60208b01946000865260408c0197885260608c01998a5262005f16565b511660005260205262008add6040600020975115158862006a49565b519101556200c3ab828762005f16565b516202711454929116600160401b83101562003f6d576001830180620271145583101562005ede57620271146000526000805160206201523a83398151915290920180546001600160a01b0319169092179091556200c40a9062005ec0565b6200c2df565b5094915092506200b5bf915062005ec0565b60208101516026811015620040d5576008036200c5125761010060406200c44d920151015162005ed0565b519160005b83518110156200c503576200c4fd906001600160a01b03806200c476838862005f16565b51166000526202711390816020526200c4a0600160ff6040600020541615151462002a1d62014ce0565b806200c4ad848962005f16565b5116600052816020526200c4d160ff60406000205460081c161562002a1d62014d48565b6200c4dd838862005f16565b5116600052602052604060002061010061ff001982541617905562005ec0565b6200c452565b50926200b5bf91925062005ec0565b60208101516026811015620040d5576009036200c5f35761010060406200c53d920151015162005ed0565b519160005b83518110156200c503576200c5ed906001600160a01b03806200c566838862005f16565b51166000526202711390816020526200c590600160ff6040600020541615151462002a1d62014ce0565b806200c59d848962005f16565b5116600052816020526200c5c5600160ff60406000205460081c1615151462002a1d62014d13565b6200c5d1838862005f16565b5116600052602052604060002061ff0019815416905562005ec0565b6200c542565b60208101516026811015620040d557600a036200c6dd57604001906200c63060e06200c6256101008551015162005ed0565b519351015162005ed0565b51926200c645835185511462002a1d62014cb0565b60005b83518110156200c6cc576200c6c6906001600160a01b03806200c66c838862005f16565b511660005262027113806020526200c695600160ff6040600020541615151462002a1d62014ce0565b6200c6a1838962005f16565b51916200c6af848962005f16565b511660005260205260026040600020015562005ec0565b6200c648565b50939092506200b5bf915062005ec0565b6020819493929401516026811015620040d557600b036200c7c2576040019260406200c70f6101008651015162005ed0565b5194510151916200c728855184511462002a1d62014cb0565b60005b85518110156200c7b2576200c7ac9062001c386001600160a01b03806200c753848b62005f16565b511660005262027113806020526200c77c600160ff6040600020541615151462002a1d62014ce0565b6200c788848962005f16565b51916200c796858c62005f16565b5116600052602052600160406000200162006976565b6200c72b565b509350916200b5bf915062005ec0565b90919260208201516026811015620040d557600c036200c9065760a0604083015101519260005b84518110156200c6cc5760e06200c8098260a06040880151015162005f16565b510151156200c88f576200c8316200c82a8260a06040880151015162005f16565b5162006ffb565b620271155480600019810111620033d6576200c8536005916000190162006f45565b5001805461ff00191661010017905562027115549060001982018210620033d657600562008f5e6200c889936000190162006f45565b6200c7e9565b6200c8ae6200c8a78260a06040880151015162005f16565b5162006fd7565b620271165480600019810111620033d6576200c8d06005916000190162006f03565b5001805461ff00191661010017905562027116549060001982018210620033d657600562008f5e6200c889936000190162006f03565b92919060208101516026811015620040d557600d036200ca4f576040019260606200c93660e08651015162005ed0565b5194510151916200c94b855184511462012e8b565b60005b85518110156200c7b257806200c9696200c9e3928662005f16565b51156200c9e9576200c98d6200c980828962005f16565b5162027115541162012f14565b6200c9b960ff60056200c9ac6200c9a5858c62005f16565b5162006f45565b50015460081c1662012f6c565b6200c9d160ff6005620090a66200c9a5858c62005f16565b6005620090c26200c9a5838a62005f16565b6200c94e565b6200ca066200c9f9828962005f16565b5162027116541162012f14565b6200ca2560ff60056200c9ac6200ca1e858c62005f16565b5162006f03565b6200ca3d60ff6005620090a66200ca1e858c62005f16565b6005620090c26200ca1e838a62005f16565b60208101516026811015620040d557600e036200cb87576040019260606200ca7c60e08651015162005ed0565b5194510151916200ca91855184511462012e8b565b60005b85518110156200c7b257806200caaf6200cb22928662005f16565b51156200cb28576200cad36200cac6828962005f16565b516202711554116201302e565b6200caf860ff60056200caeb6200c9a5858c62005f16565b50015460081c1662013087565b6200cb1060ff6005620092006200c9a5858c62005f16565b600562008f5e6200c9a5838a62005f16565b6200ca94565b6200cb456200cb38828962005f16565b516202711654116201302e565b6200cb5d60ff60056200caeb6200ca1e858c62005f16565b6200cb7560ff6005620092006200ca1e858c62005f16565b600562008f5e6200ca1e838a62005f16565b90919260208201516026811015620040d557600f036200ccbd5760a0604083015101519260005b84518110156200c6cc5760e06200cbce8260a06040880151015162005f16565b510151156200cc4d576200cbef6200c82a8260a06040880151015162005f16565b620271155480600019810111620033d6576200cc116005916000190162006f45565b5001805461ff00191661010017905562027115549060001982018210620033d6576005620090c26200cc47936000190162006f45565b6200cbae565b6200cc656200c8a78260a06040880151015162005f16565b620271165480600019810111620033d6576200cc876005916000190162006f03565b5001805461ff00191661010017905562027116549060001982018210620033d6576005620090c26200cc47936000190162006f03565b92919060208101516026811015620040d5576010036200ce075760400151926200ccf060e060c086015195015162005ed0565b51916200cd05855184511462002a1d62014cb0565b60005b85518110156200c7b257806200cd236200cd99928862005f16565b516200cd2f816200418b565b6200cd3b828762005f16565b51906200cd48816200418b565b6200cd5f6200cd5662014de3565b82151562005e8d565b6200cd6a816200418b565b600181036200cd9f57506200cd8e6200cd8262014de3565b61271083111562005e8d565b6202711e5562005ec0565b6200cd08565b6200cdaa816200418b565b600281036200cdbf57506202711f5562005ec0565b6200cdca816200418b565b600381036200cddf5750620271205562005ec0565b806200cded6004926200418b565b146200cdfb575b5062005ec0565b6202712155386200cdf4565b60208101516026811015620040d5576011036200d0ae57604001906200ce3960e06200c6256101008551015162005ed0565b51936200ce4a835186511462012d98565b60005b83518110156200cecb576200cec5906200cea56001600160a01b03806200ce75848962005f16565b51166000526202711890816020526200ce996040600020546200746f868d62005f16565b939062002a1d62014c66565b6200ceb1848962005f16565b511660005260205260406000205562005ec0565b6200ce4d565b509350906200ceda9062014923565b906202711954936200cef2620094c684518762012de4565b9060009260005b8781106200d06e575060005b85518110156200cfba576000805b8981106200cf6b575b50156200cf35575b6200cf2f9062005ec0565b6200cf05565b936200cf2f906200cf62906001600160a01b036200cf54888a62005f16565b511662001e43828862005f16565b9490506200cf24565b6200cf7681620060fb565b90546001600160a01b0360039290921b1c8116906200cf96858b62005f16565b5116146200cfaf576200cfa99062005ec0565b6200cf13565b50506001386200cf1c565b5095509392506200cfcb8262006032565b8051906001600160401b03821162003f6d576020906200cfeb83620061ee565b0162027119600052602060002060005b8381106200d050575050505060005b8281106200d020575050506200b5bf9062005ec0565b6200d04a9062001c386001600160a01b036200d03d838662005f16565b511662002fd583620060fb565b6200d00a565b82516001600160a01b0316818301556020909201916001016200cffb565b936200d0a16200d0a8916200d08387620060fb565b905460039190911b1c6001600160a01b031662001e43828862005f16565b9462005ec0565b6200cef9565b60208194929401516026811015620040d5576012036200d2f757604001906200d0e360e06200c6256101008551015162005ed0565b51936200d0f4835186511462012d98565b60005b83518110156200d149576200d143906200cea56001600160a01b03806200d11f848962005f16565b51166000526202711890816020526200ce996040600020546200840b868d62005f16565b6200d0f7565b50935091906200d1599062014923565b62027119546200d1698162006032565b906000926000915b8083106200d21d575050506200d1878262006032565b8051906001600160401b03821162003f6d576020906200d1a783620061ee565b0162027119600052602060002060005b8381106200d1ff575050505060005b8281106200d1dc575050506200b5bf9062005ec0565b6200d1f99062001c386001600160a01b036200d03d838662005f16565b6200d1c6565b82516001600160a01b0316818301556020909201916001016200d1b7565b91956000959193959760005b85518110156200d2e8576200d23e89620060fb565b90546001600160a01b0360039290921b1c8116906200d25e838962005f16565b5116146200d277576200d2719062005ec0565b6200d229565b509750956001959391955b806200d2b6575b156200d2a1576200d29a9062005ec0565b916200d171565b936200d0a16200d29a916200d08387620060fb565b506200d2c281620060fb565b60018060a01b0391549060031b1c1660005262027118602052604060002054156200d289565b5097969096959391956200d282565b60208194939401516026811015620040d5576013036200d39b5760400151608001519160005b83518110156200c503576200d333818562005f16565b51906202711754600160401b81101562003f6d576001810180620271175581101562005ede57620271176000526200d3959262001c38916007027f08f37177f6a5732df494aeff73d589b534878a053b84dfe1e41c467868b7c9fd0162013e3f565b6200d31d565b6020819493929401516026811015620040d5576014036200d8e457604001906200d3cb6101008351015162005ed0565b51936200d3e260e062007dd6818651015162005ed0565b51916200d3f386518551146201314c565b6200d4028651845114620131b2565b60005b86518110156200d500576200d41b818562005f16565b516200d428828762005f16565b519061271082101562005ede57620138996200d44a9260031b01549062007231565b906200d457838862005f16565b519161271083101562005ede57620138996200d4789360031b01556201326c565b6200d484818562005f16565b516200d491828762005f16565b519061271082101562005ede576200d4bc9162013896906001600160a01b036200b14b868d62005f16565b91906200d4ca828862005f16565b519061271082101562005ede576200d4fa9362001c389262013896906001600160a01b036200b1a2878f62005f16565b6200d405565b50926200d517919250620085059095949562014a3f565b916040516200d5268162003fd8565b6000815260003681376000945b80518610156200b5ad576200d549868262005f16565b516101e0526200d55a855162006032565b966000946200d56a845162006032565b6101005260009460005b88518110156200d63d578a896200d5a46001600160a01b036200d598858462005f16565b51166101e05162014875565b15806200d5f4575b6200d5c5575b50506200d5bf9062005ec0565b6200d574565b986200d5e99162001e4382859c6200b2a96200d5bf9760018060a01b039262005f16565b9790508a896200d5b2565b5050506127106101e051101562005ede576001600160a01b036200d619828b62005f16565b5116600052620138966101e05160031b016020528a8960406000205415156200d5ac565b50909895979498969291939660005b88518110156200d6dc576127106101e051101562005ede576001600160a01b03806200d679838c62005f16565b5116600052620138966101e05160031b01602052604060002054156200d6ac575b506200d6a69062005ec0565b6200d64c565b819b6200d6d4916200d6c36200d6a6948d62005f16565b511662001e43826101005162005f16565b9a906200d69a565b509850969592919093966101e051612710811015806101a05262005ede5760031b620138970154986200d714620094c6898c62012de4565b6103a052600061030052600060a0525b6101a05162005ede5760a0518a8110156200d7eb576200d75a6200d77a9160006101a052620138976101e05160031b0162006135565b9054610100516001600160a01b03939260031b9190911c831690620148ce565b156200d798575b506200d78f60a05162005ec0565b60a0526200d724565b60006101a0526200d7b760a051620138976101e05160031b0162006135565b90549060031b1c166200d7d1610300516103a05162005f16565b526200d7e06103005162005ec0565b61030052386200d781565b50979294959093985095909560005b8281106200d898575050506101a05162005ede576103a051516001600160401b03811162003f6d576200d83981620138976101e05160031b016200624a565b60206103a05101620138976101e05160031b01600052602060002060005b8381106200d87a57505050506200d86e9062005ec0565b9492959091956200d533565b82516001600160a01b0316818301556020909201916001016200d857565b6200d8de906001600160a01b036200d8b1828562005f16565b51166200d8c5610300516103a05162005f16565b526200d8d46103005162005ec0565b6103005262005ec0565b6200d7fa565b9260208401516026811015620040d5576015036200df155760408401906200d9126101008351015162005ed0565b51906200d92960e062007dd6818651015162005ed0565b51936200d93e835185511462002a1d62014cb0565b6200d951835186511462002a1d62014cb0565b60005b83518110156200d9b0576200d96a818662005f16565b519061271082101562005ede57620138966200d9aa9260018060a01b038b511660005260031b0160205262001c386040600020546200838d838a62005f16565b6200d954565b509095919560005b87518110156200db02576200d9ce818662005f16565b5161271081101562005ede57620138969060018060a01b0386511660005260031b016020526200da096040600020546200840b838962005f16565b906200da16838862005f16565b519161271083101562005ede57620138966200da509360018060a01b0389511660005260031b0160205260406000205562002a1d62014db4565b6200da5c818662005f16565b5161271081101562005ede5762013896906001600160a01b036200da81848c62005f16565b511660005260031b016020526200daa36040600020546200746f838962005f16565b91906200dab1828862005f16565b519061271082101562005ede576200dafc936201389662001c38938d6200dae08760018060a01b039262005f16565b511660005260031b0160205260406000205562002a1d62014e19565b6200d9b8565b50926200db21919294506200db1a9096959662014a3f565b9462014923565b92604051906200db318262003fbc565b6001825260203681840137516001600160a01b03166200db518262005ed0565b526000945b80518610156200b5ad576200db6c868262005f16565b51610240526200db7d855162006032565b966000946200db8d845162006032565b6102a05260009460005b88518110156200dc60578a896200dbc76001600160a01b036200dbbb858462005f16565b51166102405162014875565b15806200dc17575b6200dbe8575b50506200dbe29062005ec0565b6200db97565b986200dc0c9162001e4382859c6200b2a96200dbe29760018060a01b039262005f16565b9790508a896200dbd5565b50505061271061024051101562005ede576001600160a01b036200dc3c828b62005f16565b5116600052620138966102405160031b016020528a8960406000205415156200dbcf565b50909895979498969291939660005b88518110156200dd065761271061024051101562005ede576001600160a01b036200dc9b828b62005f16565b5116600052620138966102405160031b01602052604060002054156200dccd575b6200dcc79062005ec0565b6200dc6f565b996200dcc7906200dcfd906001600160a01b036200dcec8e8d62005f16565b511662001e43826102a05162005f16565b9a90506200dcbc565b5098509695929190939661024051612710811015806103405262005ede5760031b620138970154986200dd3e620094c6898c62012de4565b6101605260006102805260006101c0525b6103405162005ede576101c0518a8110156200de1c576200dd866200dda391600061034052620138976102405160031b0162006135565b90546102a05160039290921b1c6001600160a01b031690620148ce565b156200ddc2575b6200ddb86101c05162005ec0565b6101c0526200dd4f565b6000610340526200dde26101c051620138976102405160031b0162006135565b60018060a01b0391549060031b1c166200de03610280516101605162005f16565b526200de126102805162005ec0565b610280526200ddaa565b50979294959093985095909560005b8281106200dec9575050506103405162005ede5761016051516001600160401b03811162003f6d576200de6a81620138976102405160031b016200624a565b60206101605101620138976102405160031b01600052602060002060005b8381106200deab57505050506200de9f9062005ec0565b9492959091956200db56565b82516001600160a01b0316818301556020909201916001016200de88565b6200df0f906001600160a01b036200dee2828562005f16565b51166200def6610280516101605162005f16565b526200df056102805162005ec0565b6102805262005ec0565b6200de2b565b90919260208101516026811015620040d5576016036200dfcb5761010060406200df43920151015162005ed0565b519160005b83518110156200c503576001600160a01b036200df66828662005f16565b516202712254929116600160401b83101562003f6d576001830180620271225583101562005ede5762027122600052600080516020620151ba83398151915290920180546001600160a01b0319169092179091556200dfc59062005ec0565b6200df48565b60208101516026811015620040d5576017036200e0285760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d5576018036200e0ec5761010060406200e053920151015162005ed0565b5191600160ff1962027125541617620271255560005b83518110156200c503576001600160a01b036200e087828662005f16565b516202712454929116600160401b83101562003f6d576001830180620271245583101562005ede57620271246000526000805160206201525a83398151915290920180546001600160a01b0319169092179091556200e0e69062005ec0565b6200e069565b6020819492939401516026811015620040d5576019036200e114575b506200b5bf9062005ec0565b60208101516026811015620040d557601a036200e28f5760e060406200e13e920151015162005ed0565b51906200e14f600383511462012d98565b6200e15a8262005ed0565b516200e16a62009cd88462005ef4565b51926200e253576200b5bf926001036200e24c576200e1926200e1f191620271205462007231565b6202712055604051906200e1a68262003ff4565b603282527f6469766964656e6461626c652062616c616e6365206f766572666c6f772077686020830152710cadc40e0e4dec6cae6e6d2dcce40c6c2e6d60731b604083015262005e8d565b6200e2456200e20462027121546200721e565b6202712155604051906200e2188262003fbc565b601a8252796469766964656e647320636f756e746572206f766572666c6f7760301b602083015262005e8d565b906200e108565b506200e245565b60405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b60208101516026811015620040d557601b036200e892575091906202711e546200e2bc62009dc262014b3d565b62027121546202711f5411156200e2dd6200e2d662014bab565b8262005e8d565b6202712054906200e2ef8383620070e9565b50506200e2fb62014c01565b506000805b61271082106200e7e6575b5050906200e33b6200e34193926200e3316200e32662014b3d565b612710861062005e8d565b62002a1d62014bab565b620070e9565b90506200e34d62014c01565b5060009060005b61271081106200e70e575b50906127106200e3709204620072bf565b90506200e3816202712a5462006032565b906000946000905b6127108210156200e701578160031b9460ff6201389a87015416156200e4e75760009662013895870154156200e4d657600098975b62005ede57620138978701548910156200e4bc576200e3e38962013897890162006135565b600160a01b6001900391549060031b1c169788600052620138968801602052604098868a60002054906200e41791620070e9565b9a906200e42362014c01565b6200e42e9162005e8d565b60009a620138958b01546200e44391620070e9565b906200e44e62014c01565b6200e4599162005e8d565b826000526202711a6020528160002054906200e4759162007231565b9091600020556200e48562014c01565b6200e4909162005e8d565b6200e49c828962005f16565b526200e4a89062005ec0565b986200e4b49062005ec0565b98976200e3be565b929095506200e4ce9196975062005ec0565b90946200e389565b929095506200e4ce91965062005ec0565b95969392509350505b6200e4fb8262006032565b9160009160005b8281106200e66b575050506202711b54916200e523620094c6848462012de4565b926000906000905b8082106200e64e57505060005b8381106200e5b85750508251929150506001600160401b03821162003f6d576020906200e5658362006212565b016202711b600052602060002060005b8381106200e59a57505050506200b5bf9060006202712055600062027121556200e245565b82516001600160a01b0316818301556020909201916001016200e575565b6000805b8381106200e606575b50156200e5de575b6200e5d89062005ec0565b6200e538565b906200e5d8906200e5fd906001600160a01b036200952d858762005f16565b9190506200e5cd565b6001600160a01b03806200e61b858862005f16565b5116906200e62a838a62005f16565b5116146200e643576200e63d9062005ec0565b6200e5bc565b50506001386200e5c5565b90916200a1046200e66491620098868562006118565b906200e52b565b6000805b8581106200e6b9575b50156200e691575b6200e68b9062005ec0565b6200e502565b926200e68b906200e6b0906001600160a01b036200952d878662005f16565b9390506200e680565b6001600160a01b03806200e6ce858762005f16565b5116906200e6dd838a62005f16565b5116146200e6f6576200e6f09062005ec0565b6200e66f565b50506001386200e678565b939495929150506200e4f0565b90918160039695961b60ff6201389a82015416156200e7da5762013895810154620138978201546000928391825b8184106200e778575050505062007c2a6200e76f936200e76762001c389796946200379694620070e9565b92906200701f565b9493946200e354565b94929462005ede576200e7d3856200e7cb6200e79e62001c389862013897870162006135565b905460039190911b1c6001600160a01b031660009081526201389686016020526040812054909662007231565b97906200710b565b926200e73c565b5091909493946200e35f565b8160039897981b60ff6201389a82015416156200e888576201389581015490600062013897820154916000926000925b8184106200e853575050505062007c2a6200e849936200a1f3846200e33b620036c36200a1ff9662001c389a98620070e9565b909695966200e300565b93929362005ede576200e881846200e8796200e79e62001c389762013897870162006135565b96906200710b565b926200e816565b509695966200e30b565b60208101516026811015620040d557601c036200e8ef5760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601d036200e913575b506200b5bf906200e245565b60208101516026811015620040d557601e146200e9075760208101516026811015620040d557601f036200e9a9576200e95490604080910151015162005ed0565b51906202712354600160401b81101562003f6d576001810180620271235581101562005ede57620271236000526200b5bf926200e9a291600080516020620151da8339815191520162006976565b906200e907565b9060208201516026811015620040d5576020036200e9ce575b6200b5bf91506200e9a2565b60208201516026811015620040d5576021146200e9c25760208201516026811015620040d5576022036200ea57576200b5bf915060ff196202712554166202712555620271245460006202712455806200ea2a575b506200e9c2565b620271246000526200ea50906000805160206201525a833981519152908101906200614e565b386200ea23565b60208201516026811015620040d5576023036200ea7b575b6200b5bf91506200e9c2565b60208201516026811015620040d5576024146200ea6f5760208201516026811015620040d5576025146200ea6f5760208201516026811015620040d5576015036200ead5576200eacf6200b5bf9262013370565b6200ea6f565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7065726174696f6e207479706560501b6044820152606490fd5b509190506200eb228162012292565b906006811015620040d557600281036200eb515760405162461bcd60e51b81528062005ebc6004820162007c9d565b600381036200ec045750303b1562003f3757906040518092639543bf6760e01b82526044820160406004840152815180915260206064840192019060005b8181106200ebea575050506200ebb58291600094600319848303016024850152620058d3565b038183305af180156200ebde576200ebca5750565b6001600160401b03811162003f6d57604052565b6040513d6000823e3d90fd5b82518452869450602093840193909201916001016200eb8f565b60059150146200ec115750565b906000905b602083015180518310156200a4b957826200ec319162005f16565b5160208101516026811015620040d557156200a4765760208101516026811015620040d5576001036200ee7a57604001906200ec736101008351015162005ed0565b51936200ec8a60e062007dd6818651015162005ed0565b51916200ec9b86518551146201314c565b6200ecaa8651845114620131b2565b60005b86518110156200ee01576200ecc3818662005f16565b5161271081101562005ede57600160ff60076200ece99360031b01541615151462013214565b6200ecf5818562005f16565b516200ed02828762005f16565b519061271082101562005ede5760066200ed229260031b01549062007231565b906200ed2f838862005f16565b519161271083101562005ede5760066200ed4e9360031b01556201326c565b6200ed5a818562005f16565b516200ed67828762005f16565b519061271082101562005ede576200eda8916003906001600160a01b036200ed90868d62005f16565b5116600052811b016020526040600020549062007231565b91906200edb6828862005f16565b519061271082101562005ede576200edfb9362001c38926003906001600160a01b036200ede4878f62005f16565b5116600052811b01602052604060002055620132cb565b6200ecad565b50949150916200ee156200ee1c9162014a3f565b9162014923565b93604051926200ee2c8462003fd8565b60008452600036813760005b83518110156200ee5d578062001c3862007f9d6200ee57938762005f16565b6200ee38565b50945092602092506200ee71915062005ec0565b9190506200ec16565b6020819492939401516026811015620040d5576002036200f115576040018051926040840151906200eeb562007fff60e08097015162005ed0565b519382518651036200f0c05782518451036200f06a5782518551036200f0115760005b86518110156200effb576200eeee818862005f16565b5161271081101562005ede5760ff60076200ef109260031b0154161562013324565b6200ef1c818862005f16565b5161271081101562005ede5760031b600701805460ff191660011790556200ef45818562005f16565b516200ef52828962005f16565b519061271082101562005ede5760056200ef709260031b0162006976565b6200ef7c818662005f16565b516200ef89828962005f16565b5161271081101562005ede5760031b600101556200efa8818762005f16565b516200efb5828962005f16565b5161271081101562005ede5760031b600201556200efd4818862005f16565b519061271082101562005ede57600060066200eff59360031b015562005ec0565b6200eed8565b509591509350602092506200ee71915062005ec0565b60405162461bcd60e51b815260206004820152603c60248201526000805160206201521a83398151915260448201527b1b911a5d9a59195b9915d95a59da1d081a5cc81b9bdd08195c5d585b60221b6064820152608490fd5b60405162461bcd60e51b815260206004820152603960248201526000805160206201521a8339815191526044820152781b959bdd1a5b99d41bddd95c881a5cc81b9bdd08195c5d585b603a1b6064820152608490fd5b60405162461bcd60e51b815260206004820152603860248201526000805160206201521a8339815191526044820152771b925b99195e105c9c985e481a5cc81b9bdd08195c5d585b60421b6064820152608490fd5b6020819493929401516026811015620040d5576003036200f143576020919262001c386200ee7192620138d6565b60208101516026811015620040d5576004036200f3ed576200f16e6101006040830151015162005ed0565b51936200f1846101006040840151015162005ef4565b51906200f1ab60e060406200f19f8282880151015162005ed0565b51950151015162005ef4565b51936200f1c0875184511462002a1d62014cb0565b6200f1d3875185511462002a1d62014cb0565b6200f1e6875186511462002a1d62014cb0565b60005b87518110156200f24f576200f1ff818662005f16565b519061271082101562005ede576200f249916003906001600160a01b036200f228848d62005f16565b5116600052811b0160205262001c386040600020546200838d838a62005f16565b6200f1e9565b509095919593929360005b83518110156200f3aa576200f270818762005f16565b5161271081101562005ede576003906001600160a01b036200f293848862005f16565b5116600052811b016020526200f2b46040600020546200840b838862005f16565b906200f2c1838962005f16565b519161271083101562005ede576200f305926003906001600160a01b036200f2ea878b62005f16565b5116600052811b0160205260406000205562002a1d62014db4565b6200f311818762005f16565b5161271081101562005ede576003906001600160a01b036200f334848c62005f16565b5116600052811b016020526200f3556040600020546200746f838862005f16565b9190506200f364818862005f16565b519161271083101562005ede576200f3a4926003906001600160a01b036200f38d858e62005f16565b5116600052811b0160205260406000205562005ec0565b6200f25a565b50936200f3c49192969350620085056200850c9162014a3f565b9260005b83518110156200ee5d578062001c3862007f9d6200f3e7938762005f16565b6200f3c8565b9260208401516026811015620040d5576005036200f5ab5760408401906200f41f60e062008575818551015162005ed0565b519282518451036200bc385760005b83518110156200f487576200f444818562005f16565b519061271082101562005ede5760036200f4819260018060a01b038a5116600052811b0160205262001c386040600020546200838d838962005f16565b6200f42e565b509060005b83518110156200f52a576200f4a2818562005f16565b5161271081101562005ede5760039060018060a01b03895116600052811b016020526200f4da6040600020546200840b838862005f16565b91906200f4e8828762005f16565b519061271082101562005ede576200f52493600362001c389360018060a01b038d5116600052811b0160205260406000205562002a1d62014db4565b6200f48c565b50949250906200f53a9062014a3f565b90604051926200f54a8462003fbc565b6001845260203681860137516001600160a01b03166200f56a8462005ed0565b52604051946200f57a8662003fd8565b60008652600036813760005b83518110156200ee5d578062001c3862007f9d6200f5a5938762005f16565b6200f586565b9260208101516026811015620040d5576006036200f764576040016200f5d76101008251015162005ed0565b51936200f5ee60e062008575818551015162005ed0565b519285518351036200c22d5785518451036200c1e05760005b86518110156200f66d576200f61d818562005f16565b519061271082101562005ede576200f667916003906001600160a01b036200f646848c62005f16565b5116600052811b0160205262001c386040600020546200838d838962005f16565b6200f607565b509060005b86518110156200f70e576200f688818562005f16565b5161271081101562005ede576003906001600160a01b036200f6ab848b62005f16565b5116600052811b016020526200f6cc6040600020546200840b838862005f16565b91906200f6da828762005f16565b519061271082101562005ede576200f7089362001c38926003906001600160a01b036200f2ea878f62005f16565b6200f672565b5094916200f7239193506200ee159062014a3f565b91604051946200f7338662003fd8565b60008652600036813760005b83518110156200ee5d578062001c3862007f9d6200f75e938762005f16565b6200f73f565b60208101516026811015620040d5576007036200f87b57604001926200f7906101008551015162005ed0565b519160406200f7a460e08751015162005ed0565b5195510151916200f7bd845187511462002a1d62014cb0565b60005b84518110156200ee5d576200f8759062001c386001600160a01b03806200f7e8848a62005f16565b51166000528660028b6200f8656200f828876200f8208162013880978860205262008a8360ff604060002054161562002a1d62014d81565b519362005f16565b519162008ae78d604051966200f83e8862003f51565b60018852886200c37f8c60208b01946000865260408c0197885260608c01998a5262005f16565b5191015562008b02838962005f16565b6200f7c0565b60208194939401516026811015620040d5576008036200f9145761010060406200f8a9920151015162005ed0565b519160005b83518110156200f902576200f8fc906001600160a01b03806200f8d2838862005f16565b51166000526201388090816020526200c4a0600160ff6040600020541615151462002a1d62014ce0565b6200f8ae565b509260209192506200ee719062005ec0565b60208101516026811015620040d5576009036200f9985761010060406200f93f920151015162005ed0565b519160005b83518110156200f902576200f992906001600160a01b03806200f968838862005f16565b51166000526201388090816020526200c590600160ff6040600020541615151462002a1d62014ce0565b6200f944565b60208101516026811015620040d557600a036200fa4857604001906200f9ca60e06200c6256101008551015162005ed0565b51926200f9df835185511462002a1d62014cb0565b60005b83518110156200fa35576200fa2f906001600160a01b03806200fa06838862005f16565b511660005262013880806020526200c695600160ff6040600020541615151462002a1d62014ce0565b6200f9e2565b50936200ee719193506020925062005ec0565b6020819493929401516026811015620040d557600b036200fb00576040019260406200fa7a6101008651015162005ed0565b5194510151916200fa93855184511462002a1d62014cb0565b60005b85518110156200faed576200fae79062001c386001600160a01b03806200fabe848b62005f16565b511660005262013880806020526200c77c600160ff6040600020541615151462002a1d62014ce0565b6200fa96565b50935091602091506200ee719062005ec0565b90919260208201516026811015620040d557600c036200fc365760a0604083015101519260005b84518110156200fa355760e06200fb478260a06040880151015162005f16565b510151156200fbc6576200fb6862008f098260a06040880151015162005f16565b620138825480600019810111620033d6576200fb8a6005916000190162006f24565b5001805461ff00191661010017905562013882549060001982018210620033d657600562008f5e6200fbc0936000190162006f24565b6200fb27565b6200fbde62008f888260a06040880151015162005f16565b620138825480600019810111620033d6576200fc006005916000190162006ee2565b5001805461ff00191661010017905562013882549060001982018210620033d657600562008f5e6200fbc0936000190162006ee2565b92919060208101516026811015620040d557600d036200fd4a576040019260606200fc6660e08651015162005ed0565b5194510151916200fc7b855184511462012e8b565b60005b85518110156200faed57806200fc996200fcf2928662005f16565b51156200fcf8576200fcb06200906b828962005f16565b6200fcc860ff60056200c9ac6200908d858c62005f16565b6200fce060ff6005620090a66200908d858c62005f16565b6005620090c26200908d838a62005f16565b6200fc7e565b6200fd08620090fa828962005f16565b6200fd2060ff60056200c9ac6200911c858c62005f16565b6200fd3860ff6005620090a66200911c858c62005f16565b6005620090c26200911c838a62005f16565b60208194929401516026811015620040d557600e036200fe11576040019060606200fd7a60e08451015162005ed0565b5192510151936200fd8f835186511462012e8b565b60005b83518110156200faed57806200fdad6200fdb9928862005f16565b516200fdbf5762005ec0565b6200fd92565b6200fdcf620091b8828762005f16565b6200fde760ff60056200caeb6200908d858a62005f16565b6200fdff60ff6005620092006200908d858a62005f16565b600562008f5e6200908d838862005f16565b9060208294939401516026811015620040d557600f036200ff485760a0604083015101519260005b84518110156200fa355760e06200fe598260a06040880151015162005f16565b510151156200fed8576200fe7a62008f098260a06040880151015162005f16565b620138825480600019810111620033d6576200fe9c6005916000190162006f24565b5001805461ff00191661010017905562013882549060001982018210620033d6576005620090c26200fed2936000190162006f24565b6200fe39565b6200fef062008f888260a06040880151015162005f16565b620138825480600019810111620033d6576200ff126005916000190162006ee2565b5001805461ff00191661010017905562013882549060001982018210620033d6576005620090c26200fed2936000190162006ee2565b9060208194939401516026811015620040d5576010036200ffb95760400151906200ff7c60e060c084015193015162005ed0565b51936200ff91835186511462002a1d62014cb0565b60005b83518110156200faed578062001c38620093a26200ffb3938762005f16565b6200ff94565b60208194929401516026811015620040d5576011036201021f57604001906200ffee60e06200c6256101008551015162005ed0565b51936200ffff835186511462012d98565b60005b83518110156201007a57620100749062001c386001600160a01b03806201002a848962005f16565b511660005262013885806020526201004d6040600020546200746f868d62005f16565b9190926201005c868b62005f16565b511660005260205260406000205562002a1d62014c66565b62010002565b50935090620100899062014923565b90620138865493620100a1620094c684518762012de4565b9060009260005b87811062010204575060005b85518110156201015b576000805b8981106201010c575b5015620100e4575b620100de9062005ec0565b620100b4565b93620100de9062010103906001600160a01b036200cf54888a62005f16565b949050620100d3565b620101178162006087565b90546001600160a01b0360039290921b1c81169062010137858b62005f16565b51161462010150576201014a9062005ec0565b620100c2565b5050600138620100cb565b5095509392506201016c8262006032565b8051906001600160401b03821162003f6d576020906201018c83620061a3565b0162013886600052602060002060005b838110620101e6575050505060005b828110620101c3575050506200ee7160209162005ec0565b620101e09062001c386001600160a01b0362002fc8838662005f16565b620101ab565b82516001600160a01b0316818301556020909201916001016201019c565b936200d0a162010219916200d0838762006087565b620100a8565b60208194929401516026811015620040d5576012036201046957604001906201025460e06200c6256101008551015162005ed0565b519362010265835186511462012d98565b60005b8351811015620102b957620102b39062001c386001600160a01b038062010290848962005f16565b511660005262013885806020526201004d6040600020546200840b868d62005f16565b62010268565b5093509190620102c99062014923565b6201388654620102d98162006032565b906000926000915b8083106201038f57505050620102f78262006032565b8051906001600160401b03821162003f6d576020906201031783620061a3565b0162013886600052602060002060005b83811062010371575050505060005b8281106201034e575050506200ee7160209162005ec0565b6201036b9062001c386001600160a01b0362002fc8838662005f16565b62010336565b82516001600160a01b03168183015560209092019160010162010327565b91956000959193959760005b85518110156201045a57620103b08962006087565b90546001600160a01b0360039290921b1c811690620103d0838962005f16565b511614620103e957620103e39062005ec0565b6201039b565b509750956001959391955b8062010428575b1562010413576201040c9062005ec0565b91620102e1565b936200d0a16201040c916200d0838762006087565b50620104348162006087565b60018060a01b0391549060031b1c166000526201388560205260406000205415620103fb565b509796909695939195620103f4565b60208101516026811015620040d557601303620104c25760400151608001519260005b8451811015620104b1578062001c3862009931620104ab938862005f16565b6201048c565b509250906200ee7160209162005ec0565b60208101516026811015620040d557601403620106705760400190620104ee6101008351015162005ed0565b51936201050560e062007dd6818651015162005ed0565b51916201051686518551146201314c565b620105258651845114620131b2565b60005b86518110156201061b576201053e818562005f16565b516201054b828762005f16565b519061271082101562005ede5760066201056b9260031b01549062007231565b9062010578838862005f16565b519161271083101562005ede576006620105979360031b01556201326c565b620105a3818562005f16565b51620105b0828762005f16565b519061271082101562005ede57620105d9916003906001600160a01b036200ed90868d62005f16565b9190620105e7828862005f16565b519061271082101562005ede57620106159362001c38926003906001600160a01b036200ede4878f62005f16565b62010528565b50949150916200ee156201062f9162014a3f565b93604051926201063f8462003fd8565b60008452600036813760005b83518110156200ee5d578062001c3862007f9d6201066a938762005f16565b6201064b565b60208101516026811015620040d5576015036201069a576020919262001c386200ee7192620138d6565b60208101516026811015620040d557601603620106f7576101006040620106c5920151015162005ed0565b519260005b8451811015620104b157620106f19062001c386001600160a01b0362009b7a838962005f16565b620106ca565b60208101516026811015620040d557601703620107545760405162461bcd60e51b815260206004820152602960248201526000805160206201529a8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601803620107c25761010060406201077f920151015162005ed0565b5192600160ff1962013892541617620138925560005b8451811015620104b157620107bc9062001c386001600160a01b0362009c48838962005f16565b62010795565b60208193929301516026811015620040d557601903620107eb575b506200ee7160209162005ec0565b60208101516026811015620040d557601a03620108f4576201081660e0604080930151015162005ed0565b5162010826600382511462012d98565b620108318162005ed0565b51916201084a620108428362005ef4565b519262005f05565b5191620108ba5750916200ee7191600160209414600014620108b3576201087a62010889916201388d5462007231565b6201388d5562002a1d62014c01565b620108ab6201089c6201388e546200721e565b6201388e5562002a1d62014c3b565b9150620107dd565b50620108ab565b5162461bcd60e51b8152602060048201526014602482015273496e76616c6964207061796d656e74207479706560601b6044820152606490fd5b60208101516026811015620040d557601b0362010d2c57509190620109256201388b546200370b62009dc262014b3d565b50506201093162014c01565b506000805b612710811062010ce0575b50506201094d62007243565b6201095c6202712a5462006032565b906000946000905b61271082101562010cd3578160031b9460ff6007870154161562010ab75760009660028701541562010aa657600098975b62005ede57600487015489101562010a8c57620109b6896004890162006135565b9054600391821b1c6001600160a01b0316600081815291890160205260409182902054919991620109e9908890620070e9565b9a90620109f562014c01565b62010a009162005e8d565b60009a60028b015462010a1391620070e9565b9062010a1e62014c01565b62010a299162005e8d565b826000526201388760205281600020549062010a459162007231565b90916000205562010a5562014c01565b62010a609162005e8d565b62010a6c828962005f16565b5262010a789062005ec0565b9862010a849062005ec0565b989762010995565b9290955062010a9e9196975062005ec0565b909462010964565b9290955062010a9e91965062005ec0565b95969392509350505b62010acb8262006032565b9160009160005b82811062010c3d5750505062013888549162010af3620094c6848462012de4565b926000906000905b80821062010c2057505060005b83811062010b8a5750508251929150506001600160401b03821162003f6d5760209062010b358362006167565b0162013888600052602060002060005b83811062010b6c57505050506200ee7160209160006201388d5560006201388e55620108ab565b82516001600160a01b03168183015560209092019160010162010b45565b6000805b83811062010bd8575b501562010bb0575b62010baa9062005ec0565b62010b08565b9062010baa9062010bcf906001600160a01b036200952d858762005f16565b91905062010b9f565b6001600160a01b038062010bed858862005f16565b51169062010bfc838a62005f16565b51161462010c155762010c0f9062005ec0565b62010b8e565b505060013862010b97565b90916200a10462010c369162009886856200606a565b9062010afb565b6000805b85811062010c8b575b501562010c63575b62010c5d9062005ec0565b62010ad2565b9262010c5d9062010c82906001600160a01b036200952d878662005f16565b93905062010c52565b6001600160a01b038062010ca0858762005f16565b51169062010caf838a62005f16565b51161462010cc85762010cc29062005ec0565b62010c41565b505060013862010c4a565b9394959291505062010ac0565b8060039594951b9060ff6007830154161562010d22576200a1ff62007c2a62001c38946200a1f362010d199560026200a1e9876200708c565b93929362010936565b5093929362010941565b60208101516026811015620040d557601c0362010d895760405162461bcd60e51b81526020600482015260296024820152600080516020620152ba8339815191526044820152683632b6b2b73a32b21760b91b6064820152608490fd5b60208101516026811015620040d557601d0362010daf575b506200ee71602091620108ab565b60208101516026811015620040d557601e1462010da15760208101516026811015620040d557601f0362010e035760209162010dfb6200a2df6200ee7193604080910151015162005ed0565b915062010da1565b60208101516026811015620040d55760200362010e29575b506200ee7160209162010dfb565b60208101516026811015620040d55760211462010e1b5760208101516026811015620040d55760220362010e7f57506200ee7160209160ff19620138925416620138925562010e7762006236565b915062010e1b565b60208101516026811015620040d55760230362010ea5575b506200ee7160209162010e77565b60208101516026811015620040d55760241462010e975760208101516026811015620040d55760251462010e975792909160208401516026811015620040d5576015036200ead557604084019062010f036101008351015162005ed0565b519062010f1a60e062007dd6818651015162005ed0565b519362010f2f835185511462002a1d62014cb0565b62010f42835186511462002a1d62014cb0565b60005b835181101562010f9e5762010f5b818662005f16565b519061271082101562005ede57600362010f989260018060a01b038b5116600052811b0160205262001c386040600020546200838d838a62005f16565b62010f45565b509095919560005b8751811015620110e45762010fbc818662005f16565b5161271081101562005ede5760039060018060a01b03865116600052811b0160205262010ff46040600020546200840b838962005f16565b9062011001838862005f16565b519161271083101562005ede576003620110389360018060a01b03895116600052811b0160205260406000205562002a1d62014db4565b62011044818662005f16565b5161271081101562005ede576003906001600160a01b0362011067848c62005f16565b5116600052811b01602052620110886040600020546200746f838962005f16565b919062011096828862005f16565b519061271082101562005ede57620110de93600362001c38938d620110c38760018060a01b039262005f16565b5116600052811b0160205260406000205562002a1d62014e19565b62010fa6565b5092620110fc919294506200db1a9096959662014a3f565b92604051906201110c8262003fbc565b6001825260203681840137516001600160a01b03166201112c8262005ed0565b526000945b8051861015620114d65762011147868262005f16565b516102205262011158855162006032565b9660009462011168845162006032565b6101405260009460005b885181101562011238578a89620111a26001600160a01b0362011196858462005f16565b5116610220516201480c565b1580620111f2575b620111c3575b5050620111bd9062005ec0565b62011172565b98620111e79162001e4382859c6200b2a9620111bd9760018060a01b039262005f16565b9790508a89620111b0565b50505061271061022051101562005ede576001600160a01b0362011217828b62005f16565b5116600052600361022051811b016020528a896040600020541515620111aa565b50909895979498969291939660005b8851811015620112db5761271061022051101562005ede576001600160a01b0362011273828b62005f16565b5116600052600361022051811b0160205260406000205415620112a2575b6201129c9062005ec0565b62011247565b996201129c90620112d2906001600160a01b03620112c18e8d62005f16565b511662001e43826101405162005f16565b9a905062011291565b5098509695929190939661022051612710811015806101805262005ede5760031b600401549862011311620094c6898c62012de4565b608052600061020052600060c0525b6101805162005ede5760c0518a811015620113e45762011354620113719160006101805260046102205160031b0162006135565b90546101405160039290921b1c6001600160a01b031690620148ce565b156201138e575b6201138560c05162005ec0565b60c05262011320565b600061018052620113ab60c05160046102205160031b0162006135565b60018060a01b0391549060031b1c16620113cb6102005160805162005f16565b52620113da6102005162005ec0565b6102005262011378565b50979294959093985095909560005b8281106201148b575050506101805162005ede57608051516001600160401b03811162003f6d576201142f8160046102205160031b016200624a565b60206080510160046102205160031b01600052602060002060005b8381106201146d5750505050620114619062005ec0565b94929590919562011131565b82516001600160a01b0316818301556020909201916001016201144a565b620114d0906001600160a01b03620114a4828562005f16565b5116620114b76102005160805162005f16565b52620114c66102005162005ec0565b6102005262005ec0565b620113f3565b5050936200ee7191935060209250915062010e97565b82516001600160a01b0316818301556020909201916001016200aefe565b82516001600160a01b0316818301556020909201916001016200ada9565b600191820180546001600160a01b03909216848601559390910192906200acf1565b6202712460005262011572906000805160206201525a8339815191529081019083016200614e565b386200acb1565b600180826201158a82948662011a34565b019201920191906200ac70565b62027123600052600080516020620151da833981519152908282015b8183018110620115c55750506200ac34565b80620115d36001926200651c565b01620115b3565b600191820180546001600160a01b03909216848601559390910192906200ac02565b620271226000526201162490600080516020620151ba8339815191529081019083016200614e565b386200abc2565b82516001600160a01b0316818301556020909201916001016200aa84565b620116629084600052858460002091820191016200614e565b386200aa76565b82516001600160a01b0316818301556020909201916001016200a899565b620116a39062027114600052848460002091820191016200614e565b386200a888565b80620116cc9160031b600160ff600783015416151514620116d2575062005ec0565b6200a7d8565b620116e660048201620138978301620119c5565b6201389a8101600160ff198254161790558054816201389301556001810154620138948201556002810154620138958201556201172c6005820162013898830162011a34565b620138996006820154910155386200cdf4565b600660208262011753600194518662006a8c565b019201920191906200a5c5565b6006818102048103620033d6576006838102048303620033d657620271156000527f0f9b10e190177c3c56fc6ce7689c8130c567df57aa02c08e7a090a59992adf926006840281015b8260060282018110620117be5750506200a5b1565b8060006006925560006001820155620117da6002820162006718565b60006003820155620117ef600482016200651c565b6000600582015501620117a9565b600660208262011811600194518662006a8c565b019201920191906200a535565b80600602906006820403620033d65782600602600681048403620033d6576000906202711682526020822092830192015b8281106201185f5750506200a521565b808260069255826001820155620118796002820162006718565b8260038201556201188d600482016200651c565b826005820155016201184f565b608460405162461bcd60e51b815260206004820152604060248201526000805160206201527a83398151915260448201527f656d2073686f756c64206e6f742072657475726e20766f7465206e65656465646064820152fd5b60405162461bcd60e51b815260206004820152604760248201526000805160206201527a83398151915260448201527f656d2073686f756c64206e6f742072657475726e206120766f74696e672072756064820152661b19481b1a5cdd60ca1b608482015260a490fd5b818114620119c1578154916001600160401b03831162003f6d576201198383836200624a565b60005260206000209060005260206000208154916000925b848410620119aa575050505050565b60018091920193845492818501550192906201199b565b5050565b818114620119c1578154916001600160401b03831162003f6d57620119eb83836200624a565b60005260206000209060005260206000208154916000925b84841062011a12575050505050565b600191820180546001600160a01b039092168486015593909101929062011a03565b90808214620119c15762011a4981546200555f565b906001600160401b03821162003f6d57819062011a738262011a6c86546200555f565b866200692c565b600090601f831160011462011aac5760009262011aa05750508160011b916000199060031b1c1916179055565b015490503880620069bf565b81526020808220858352818320935090601f1985169083905b82821062011b0157505090846001959493921062011ae757505050811b019055565b015460001960f88460031b161c1916905538808062006a0c565b849581929585015481556001809101960194019062011ac5565b818114620119c15781549162011b328383620065ad565b6000526020600020906000526020600020906000905b83821062011b565750505050565b8062011b656001928562011a34565b92810192918101910162011b48565b818114620119c15781549162011b8b83836200663b565b6000526020600020906000526020600020906000905b83821062011baf5750505050565b8062011bbe600192856201195d565b92810192918101910162011ba1565b818114620119c15781549162011be483836200663b565b6000526020600020906000526020600020906000905b83821062011c085750505050565b8062011c1760019285620119c5565b92810192918101910162011bfa565b818114620119c15781549162011c3d8383620066c9565b6000526020600020906000526020600020906000905b83821062011c615750505050565b8062011c706001928562011b1b565b92810192918101910162011c53565b818114620119c15781549162011c968383620067db565b6000526020600020906000526020600020906000905b83821062011cba5750505050565b80600191840362011cd7575b600980910193019101909162011cac565b805484558162011d198186019183019160ff62011cf88185541683620068cf565b83549362011d0d82600896871c1684620068e9565b5460101c16906200690a565b62011d2b60028084019087016201195d565b60038281019190860183870362011d46575b50505062011cc6565b62011daa9262011d56916201195d565b62011d686004808501908801620119c5565b62011d7a600580850190880162011b1b565b62011d8c600680850190880162011b74565b62011d9e600780850190880162011bcd565b80830190860162011c26565b38808062011d3d565b919062006f9d5780820362011dc6575050565b60ff600580620054e69462011ddf8486541682620068b6565b6001850154600182015562011dfb600286016002830162011c7f565b6003850154600382015562011e17600486016004830162011a34565b01920162011e29828254168462006a49565b62011e3b82825460081c168462006a5a565b5460101c169062006a72565b90808214620119c157908154906000915b6064831062011e675750505050565b600180919401928354948184015501919262011e58565b906201388254602060009301908151519062011e9a8262004034565b9162011eaa604051938462004010565b80835262011ebb601f199162004034565b0136602084013762011ed083515182620070e9565b90156201223a5762011ee29062006032565b90859284515115620122315762011ef98262006032565b965b8551518110156201207a5760008080805b86811062011f915750905062011f2e8162011f28858762005f16565b6200572f565b6006811015620040d55760031462011f53575b5062011f4d9062005ec0565b62011efb565b6000905b80821062011f66575062011f41565b9095620098a462011f8a9162011f7d898d62005f16565b5162001e43828a62005f16565b9062011f57565b62011faa8162011fa3878d5162005f16565b5162012653565b9390948083118062012066575b156201201d57505091838562012013575b6006811015620040d55760038e911462011ff3575b505062011fea9062005ec0565b91909162011f0c565b946201200a9162001e438262011fea959862005f16565b93908c62011fdd565b6000955062011fc8565b809492959195148062012052575b1562011fdd576006811015620040d55760038e911462011ff357505062011fea9062005ec0565b506006811015620040d5578015156201202b565b506006861015620040d55785151562011fb7565b5093505090929350600093845b8351861015620121cc57620120a7620120a1878662005f16565b620068a8565b90600680831015620040d5576002928303620120d2575050620120cb909562005ec0565b9462012087565b620120e2620120a1898862005f16565b9281841015620040d557600180941480620121b8575b156201210d57505050620120cb909562005ec0565b62012122620120a18a899b9694959b62005f16565b9280841015620040d557600480941492836201218c575b508262012161575b505062012155575b50620120cb9062005ec0565b9550620120cb62012149565b9091508810156201217757871415388062012141565b602182634e487b7160e01b6000525260246000fd5b908093508a1015620121a357891415913862012139565b602184634e487b7160e01b6000525260246000fd5b5081831015620040d55780831415620120f8565b9250929093506006821015620040d5576003820362012228575b620121f18162006032565b9360005b82811062012204575050509190565b806201221562012222928462005f16565b5162001e43828962005f16565b620121f5565b506000620121e6565b50909392505050565b60405162461bcd60e51b815260206004820152602a60248201527f546865206c656e677468206f6620766f74696e672072756c65206c697374206960448201526973206f766572666c6f7760b01b6064820152608490fd5b9062013883546020600093019081515190620122ae8262004034565b91620122be604051938462004010565b808352620122cf601f199162004034565b01366020840137620122e483515182620070e9565b90156201223a57620122f69062006032565b9085928451511562012231576201230d8262006032565b965b8551518110156201247b5760008080805b86811062012392575090506201233c8162011f28858762005f16565b6006811015620040d55760031462012361575b506201235b9062005ec0565b6201230f565b6000905b8082106201237457506201234f565b9095620098a46201238b9162011f7d898d62005f16565b9062012365565b620123ab81620123a4878d5162005f16565b51620126ef565b9390948083118062012467575b156201241e57505091838562012414575b6006811015620040d55760038e9114620123f4575b5050620123eb9062005ec0565b91909162012320565b946201240b9162001e4382620123eb959862005f16565b93908c620123de565b60009550620123c9565b809492959195148062012453575b15620123de576006811015620040d55760038e9114620123f4575050620123eb9062005ec0565b506006811015620040d5578015156201242c565b506006861015620040d557851515620123b8565b5093505090929350600093845b83518610156201259d57620124a2620120a1878662005f16565b90600680831015620040d5576002928303620124cd575050620124c6909562005ec0565b9462012488565b620124dd620120a1898862005f16565b9281841015620040d55760038094148062012589575b156201250857505050620124c6909562005ec0565b6201251d620120a18a899b9694959b62005f16565b9280841015620040d5576005809414928362012572575b50826201255c575b505062012550575b50620124c69062005ec0565b9550620124c662012544565b909150881015620040d55787141538806201253c565b908093508a1015620040d557891415913862012534565b5081831015620040d55780831415620124f3565b9250929093506006821015620040d55760038203620125ec575b620125c28162006032565b9360005b828110620125d5575050509190565b8062012215620125e6928462005f16565b620125c6565b506000620125b7565b15620125fd57565b60405162461bcd60e51b815260206004820152602860248201527f506c7567696e466163746f72793a20706c7567696e20696e646578206f7574206044820152676f662072616e676560c01b6064820152608490fd5b90916000809381936201266c62013882548310620125f5565b60ff60056201267b8462006f24565b50015460081c1615620126e3578282620126979260016201285b565b620126a3575b50929190565b8094506001929350620126b7915062006f24565b500154906003620126d860ff620126ce8662006f24565b5054169462006f24565b50015491386201269d565b50509150915080918190565b90916000809381936201270862013883548310620125f5565b60ff6005620127178462006ee2565b50015460081c1615620126e35782826201273292826201285b565b6201273d5750929190565b809450600192935062012751915062006ee2565b500154906003620126d860ff620127688662006ee2565b5054169462006ee2565b156201277a57565b60405162461bcd60e51b815260206004820152603160248201527f436865636b696e6720636f6e646974696f6e206578703a20706c7567696e20696044820152706e646578206f7574206f662072616e676560781b6064820152608490fd5b15620127e157565b60405162461bcd60e51b815260206004820152602f60248201527f436865636b696e6720636f6e646974696f6e206578703a206e6f646520696e6460448201526e6578206f7574206f662072616e676560881b6064820152608490fd5b805482101562005ede576000526009602060002091020190600090565b90929190801562012bca57620128776201388254831062012772565b620128936002620128888462006f24565b5001548410620127d9565b801562012bac57620128c36001620128ba856002620128b28762006f24565b50016201283e565b50015460ff1690565b620128ce816200418b565b80620128de575050505050600090565b620128e9816200418b565b60038103620128fc575050505050600190565b62012907816200418b565b600481036201291a575050505050600090565b62012925816200418b565b6001908082036201293e57505092620046bd9362012bf2565b9092936201294c826200418b565b600280921462012962575b505050505050600090565b821562012b8f576201298b846201297f8385620128b28a62006f24565b50015460081c60ff1690565b925b60009586865b62012b1d575b50620129a58762006032565b9760005b88811062012ac0575050505050620129c182620040ca565b81830362012a2057505091906000915b818310620129df5750505090565b90919280620129fd575b620129f5909362005ec0565b9190620129d1565b50620129f562012a1862012a12858462005f16565b51151590565b9050620129e9565b90915062012a2e82620040ca565b810362012a8757509060009182915b81831062012a4b5750505090565b909192801562012a6a575b62012a62909362005ec0565b919062012a3d565b5062012a6262012a7f62012a12858462005f16565b905062012a56565b6003915062012a9681620040ca565b1462012aa9575038808080808062012957565b62012abc62012a12620046bd9262005ed0565b1590565b808a62012afc62012af362012ae9848b62012ae18c82620128b28d62006ee2565b500162006135565b90549060031b1c90565b8686896201285b565b62012b1062012b179462001c389362005f16565b9015159052565b620129a9565b8462012b2f8582620128b28662006ee2565b50015481101562012b895762012b5562012ae9828762012ae18882620128b28962006ee2565b62012b6e575b62012b67879162005ec0565b9062012993565b9662012b6762012b7f889262005ec0565b9891505062012b5b565b62012999565b62012ba5846201297f8385620128b28a62006ee2565b926201298d565b62012bc46001620128ba856002620128b28762006ee2565b620128c3565b62012bdb6201388354831062012772565b62012bec6002620128888462006ee2565b62012893565b909291600362012c44918360001462012cc65760ff600162012c1b876002620128b28662006f24565b50015460101c16945b841562012cb5576002620128b262012c3c9362006f24565b500162005803565b91603d811015620040d557602c810362012c8557505062012c686020915162005ed0565b519101516026811015620040d55762012c819062014e4c565b1490565b9092906001810362012c9a5750505050600090565b60031462012caa57505050600090565b620046bd9262012d36565b6002620128b262012c3c9362006ee2565b60ff600162012cdc876002620128b28662006ee2565b50015460101c169462012c24565b1562012cf257565b606460405162461bcd60e51b815260206004820152602060248201527f4f70657261746f722061646472657373206973206e6f742070726f76696465646044820152fd5b9190608062007468920162012d5060018251511462012cea565b62012d6b600162012d62835162005ed0565b51511462012cea565b516001600160a01b0392839162012d83919062005ed0565b5116921562012d925751161490565b51161490565b1562012da057565b60405162461bcd60e51b815260206004820152601c60248201527b496e76616c6964206e756d626572206f6620706172616d657465727360201b6044820152606490fd5b91908201809211620033d657565b62012dfd816200418b565b62012e0b6200cd5662014de3565b62012e16816200418b565b6001810362012e35575062012e2e6200cd8262014de3565b6201388b55565b62012e40816200418b565b6002810362012e5157506201388c55565b62012e5c816200418b565b6003810362012e6d57506201388d55565b8062012e7b6004926200418b565b1462012e845750565b6201388e55565b1562012e9357565b60405162461bcd60e51b815260206004820152604d60248201527f546865206c656e677468206f662074686520706c7567696e20696e646578657360448201527f20617272617920616e642074686520626f6f6c65616e206172726179206d757360648201526c74206265207468652073616d6560981b608482015260a490fd5b1562012f1c57565b60405162461bcd60e51b815260206004820152602260248201527f496e76616c696420706c7567696e20696e64657820746f20626520656e61626c604482015261195960f21b6064820152608490fd5b1562012f7457565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c6564206973206e6f742060448201526a1a5b9a5d1a585b1a5e995960aa1b6064820152608490fd5b1562012fd557565b60405162461bcd60e51b815260206004820152602b60248201527f54686520706c7567696e20746f20626520656e61626c656420697320616c726560448201526a18591e48195b98589b195960aa1b6064820152608490fd5b156201303657565b60405162461bcd60e51b815260206004820152602360248201527f496e76616c696420706c7567696e20696e64657820746f2062652064697361626044820152621b195960ea1b6064820152608490fd5b156201308f57565b60405162461bcd60e51b815260206004820152602c60248201527f54686520706c7567696e20746f2062652064697361626c6564206973206e6f7460448201526b081a5b9a5d1a585b1a5e995960a21b6064820152608490fd5b15620130f157565b60405162461bcd60e51b815260206004820152602d60248201527f54686520706c7567696e20746f2062652064697361626c656420697320616c7260448201526c1958591e48191a5cd8589b1959609a1b6064820152608490fd5b156201315457565b60405162461bcd60e51b815260206004820152603060248201527f546865206c656e677468206f662074617267657420616e6420746f6b656e436c60448201526f185cdcc81a5cc81b9bdd08195c5d585b60821b6064820152608490fd5b15620131ba57565b60405162461bcd60e51b815260206004820152602c60248201527f546865206c656e677468206f662074617267657420616e6420616d6f756e742060448201526b1a5cc81b9bdd08195c5d585b60a21b6064820152608490fd5b156201321c57565b60405162461bcd60e51b815260206004820152602260248201527f54686520746f6b656e20636c617373206973206e6f7420696e697469616c697a604482015261195960f21b6064820152608490fd5b156201327457565b60405162461bcd60e51b815260206004820152602960248201527f54686520746f74616c20737570706c79206f662074686520746f6b656e206973604482015268206f766572666c6f7760b81b6064820152608490fd5b15620132d357565b60405162461bcd60e51b8152602060048201526024808201527f5468652062616c616e6365206f662074686520746f6b656e206973206f766572604482015263666c6f7760e01b6064820152608490fd5b156201332c57565b606460405162461bcd60e51b815260206004820152602060248201527f54686520746f6b656e20697320616c726561647920696e697469616c697a65646044820152fd5b906040820190620133876101008351015162005ed0565b5191620133a960e06201339e818451015162005ed0565b519251015162005ef4565b5191620133be845183511462002a1d62014cb0565b620133d1845184511462002a1d62014cb0565b60005b84518110156201343057620133ea818462005f16565b519061271082101562005ede57620138966201342a9260018060a01b0389511660005260031b0160205262001c386040600020546200838d838862005f16565b620133d4565b50929160005b83518110156201355d576201344c818462005f16565b51906127108083101562005ede5760018060a01b0390818951166000526201389660039481602091871b0181526201348f6040600020546200840b878a62005f16565b906201349c878b62005f16565b51918583101562005ede5784620134ca938f899051166000528a1b01845260406000205562002a1d62014db4565b620134d6858962005f16565b518381101562005ede57829085620134ef888d62005f16565b5116600052871b0181526201350f6040600020546200746f878a62005f16565b9290936201351e878b62005f16565b519081101562005ede57620135579762001c38966201353e898e62005f16565b51166000521b01905260406000205562002a1d62014e19565b62013436565b50506200ee156201356e9162014a3f565b90604051936201357e8562003fbc565b60018552602036818701376001600160a01b036104e0819052905116620135a58562005ed0565b526000935b8151851015620138cf57620135c0858362005f16565b5194620135ce845162006032565b91600093620135de825162006032565b6104a0528496855b87518110156201368a576201360d6104e05162013604838b62005f16565b51168b62014875565b15806201364f575b6201362c575b620136269062005ec0565b620135e6565b956201364662013626916104e0516200a0718a8c62005f16565b9690506201361b565b506127108a101562005ede576104e0516201366b828a62005f16565b5116600052620138968a60031b01602052604060002054151562013615565b509793929096949195976000986127108610159560031b98620138968a019a5b895181101562013726578762005ede576104e051620136ca828c62005f16565b51166000528b60205260406000205415620136f1575b620136eb9062005ec0565b620136aa565b976201371d620136eb918b6201370c8c6104e0519262005f16565b511662001e43826104a05162005f16565b989050620136e0565b50949591939650985096909596806104605262005ede576201389701806104c052549562013759620094c6868962012de4565b6104805260009788610440525b6104605162005ede576104405188811015620138045762013795620137ab916000610460526104c05162006135565b6104e05191549060031b1c166104a051620148ce565b15620137ca575b620137c06104405162005ec0565b6104405262013766565b97620137fd90620137e2610440516104c05162006135565b6104e05191549060031b1c1662001e43826104805162005f16565b97620137b2565b5095939096509690969391936000915b8383106201389e57505050506104605162005ede5761048051516001600160401b03811162003f6d576201384c816104c0516200624a565b602061048051016104c051600052602060002060006104e051905b848110620138875750505050506201387f9062005ec0565b9392620135aa565b600190602083865116950194818501550162013867565b6200a104620138c8916104e051620138b7868662005f16565b511662001e43826104805162005f16565b9162013814565b5050509050565b6040810190620138ec6101008351015162005ed0565b51916201390360e06201339e818451015162005ed0565b519362013918845183511462002a1d62014cb0565b6201392b845186511462002a1d62014cb0565b60005b8451811015620139885762013944818462005f16565b519061271082101562005ede57620139829160018060a01b03865116600052600390811b0160205262001c386040600020546200838d838a62005f16565b6201392e565b5092919360005b835181101562013ab357620139a5818462005f16565b5190612710918281101562005ede5760018060a01b03908189511660005260039081602091811b018152620139e56040600020546200840b868962005f16565b90620139f2868a62005f16565b51918783101562005ede578462013a1f93878f5116600052811b01845260406000205562002a1d62014db4565b62013a2b848862005f16565b518581101562005ede5782908462013a44878c62005f16565b5116600052811b01815262013a646040600020546200746f868962005f16565b91909262013a73868a62005f16565b519687101562005ede5762013aad9662001c389562013a93888d62005f16565b5116600052811b01905260406000205562002a1d62014e19565b6201398f565b50506200ee1562013ac49162014a3f565b906040519362013ad48562003fbc565b60018552602036818701376001600160a01b036104e081905290511662013afb8562005ed0565b526000935b8151851015620138cf5762013b16858362005f16565b519462013b24845162006032565b9160009362013b34825162006032565b610460528496855b875181101562013bdd5762013b636104e05162013b5a838b62005f16565b51168b6201480c565b158062013ba5575b62013b82575b62013b7c9062005ec0565b62013b3c565b9562013b9c62013b7c916104e0516200a0718a8c62005f16565b96905062013b71565b506127108a101562005ede576104e05162013bc1828a62005f16565b511660005260038a811b01602052604060002054151562013b6b565b509793929096949195976000986127108610159560031b9860038a019a5b895181101562013c77578762005ede576104e05162013c1b828c62005f16565b51166000528b6020526040600020541562013c42575b62013c3c9062005ec0565b62013bfb565b9762013c6e62013c3c918b62013c5d8c6104e0519262005f16565b511662001e43826104605162005f16565b98905062013c31565b50949591939650985096909596806104405262005ede57600401806104a052549562013ca8620094c6868962012de4565b6104c05260009788610480525b6104405162005ede57610480518881101562013d535762013ce462013cfa916000610440526104a05162006135565b6104e05191549060031b1c1661046051620148ce565b1562013d19575b62013d0f6104805162005ec0565b6104805262013cb5565b9762013d4c9062013d31610480516104a05162006135565b6104e05191549060031b1c1662001e43826104c05162005f16565b9762013d01565b5095939096509690969391936000915b83831062013ded57505050506104405162005ede576104c051516001600160401b03811162003f6d5762013d9b816104a0516200624a565b60206104c051016104a051600052602060002060006104e051905b84811062013dd657505050505062013dce9062005ec0565b939262013b00565b600190602083865116950194818501550162013db6565b6200a10462013e17916104e05162013e06868662005f16565b511662001e43826104c05162005f16565b9162013d63565b62013884805482101562005ede576000526007602060002091020190600090565b815180519192916001600160401b03811162003f6d5762013e6181856200624a565b6020809201846000528260002060005b83811062013ed8575050505060c082600692620054e6959401516001850155604081015160028501556060810151600385015562013eb9608082015115156004860162006a49565b62013ecc60a08201516005860162006976565b01511515910162006a49565b8251828201559184019160010162013e71565b620138848054600160401b81101562003f6d5762013f0f9160018201905562013e1e565b91909162006f9d57620054e69162013e3f565b62013890908154600160401b81101562003f6d576001810180845581101562005ede57620054e69260005260206000200162006976565b908062013f64575050565b620054e691600052601f6020600020910160051c8101906200614e565b90600160401b811162003f6d57815481835580821062013fa057505050565b620054e692600052601f6020600020918180850160051c840194168062013fcf575b500160051c01906200614e565b600019908186019182549160200360031b1c1690553862013fc2565b9060031b60ff811b9283911b169119161790565b6000926201401962014012859462013e1e565b50620056a8565b9380935b85515185101562014107575061271084101562005ede5760039380851b9460018060a01b03851660005260209086018152620140666040966001886000205491015490620070e9565b93849115620140d257906201407b9162007231565b96901562014098575050620140909062005ec0565b93906201401d565b60649250519062461bcd60e51b825260048201526014602482015273746f74616c20706f776572206f766572666c6f7760601b6044820152fd5b875162461bcd60e51b815260048101849052600e60248201526d706f776572206f766572666c6f7760901b6044820152606490fd5b93505092505090565b156201411857565b60405162461bcd60e51b815260206004820152601360248201527263757272656e74596573206f766572666c6f7760681b6044820152606490fd5b6001620141608262013e1e565b5001546202712e546000928184526202712b908160205262014189816003604088200162006135565b90549060031b1c9183865280602052620141aa826004604089200162006135565b90549060031b1c93865260205260ff6006620141df620141d184600560408b200162006135565b90549060031b1c9362013e1e565b500154166201422d57506201421d92620004326201420f9383620142076201421595620070b3565b969062014110565b62012de4565b929062014110565b1115620142275790565b50600190565b6200e33b92506201421d93620142476201421593620070b3565b949062014110565b909291926201425f825162006032565b6000916201426e815162006032565b8390845b865181101562014309576001600160a01b03620142958162013b5a848b62005f16565b1580620142d4575b620142b5575b50620142af9062005ec0565b62014272565b8196620142cc916200952d620142af948b62005f16565b9590620142a3565b506127108a101562005ede5780620142ed838a62005f16565b511660005260038a811b0160205260406000205415156201429d565b509295919694509260005b87518110156201438a5761271086101562005ede576001600160a01b03806201433e838b62005f16565b5116600052600387811b01602052604060002054156201436b575b50620143659062005ec0565b62014314565b819562014382916200cf5462014365948c62005f16565b949062014359565b509250945092612710831015938462005ede5760049586600395861b0196875494620143bb620094c6828862012de4565b9460009689889a5b6201452f57818b10156201446457506000998b620143fe620143e6838362006135565b90546001600160a01b0392918e1b1c82168a620148ce565b1562014421575b505090620144168b94939262005ec0565b9a90919293620143c3565b91998c95949392909162014437908c9062006135565b9054908d1b1c166201444a828b62005f16565b52620144569062005ec0565b9890919293508b3862014405565b9697949a98505091975092506000915b8383106201450a5750505050620144f5578051926001600160401b038411620144e05750620144a483836200624a565b602080910191600052806000209060005b848110620144c4575050505050565b83516001600160a01b03168382015592810192600101620144b5565b604190634e487b7160e01b6000525260246000fd5b603283634e487b7160e01b6000525260246000fd5b62014528906200a104906001600160a01b036200a071868662005f16565b9162014474565b603285634e487b7160e01b6000525260246000fd5b9092919262014554825162006032565b60009162014563815162006032565b8390845b865181101562014601576001600160a01b036201458a8162013604848b62005f16565b1580620145c9575b620145aa575b50620145a49062005ec0565b62014567565b8196620145c1916200952d620145a4948b62005f16565b959062014598565b506127108a101562005ede5780620145e2838a62005f16565b5116600052620138968a60031b01602052604060002054151562014592565b509295919694509260005b8751811015620146855761271086101562005ede576001600160a01b038062014636838b62005f16565b5116600052620138968760031b016020526040600020541562014666575b50620146609062005ec0565b6201460c565b81956201467d916200cf5462014660948c62005f16565b949062014654565b509250945092612710831015938462005ede5762013897600394851b0195865493620146b6620094c6828762012de4565b936000958887995b62005ede57818a10156201475f57506000988a620146f9620146e1838362006135565b90546001600160a01b0392918d1b1c821689620148ce565b156201471c575b505090620147118a94939262005ec0565b9990919293620146be565b91988b95949392909162014732908b9062006135565b9054908c1b1c1662014745828a62005f16565b52620147519062005ec0565b9790919293508a3862014700565b96945050919795509295506000915b838310620147d9575050505062005ede578151916001600160401b03831162003f6d576201479d83836200624a565b602080910191600052806000209060005b848110620147bd575050505050565b83516001600160a01b03168382015592810192600101620147ae565b62014805906200a104906001600160a01b03620147f7868662005f16565b511662001e43828b62005f16565b916201476e565b9060005b61271083101562005ede576003600484821b0180548310156201486b5782620148399162006135565b9054911b1c6001600160a01b039081169083161462014863576201485d9062005ec0565b62014810565b505050600190565b5050505050600090565b9060005b61271083101562005ede5760036201389784821b0180548310156201486b5782620148a49162006135565b9054911b1c6001600160a01b03908116908316146201486357620148c89062005ec0565b62014879565b9060005b82518110156201490d576001600160a01b0380620148f1838662005f16565b5116908316146201486357620149079062005ec0565b620148d2565b505050600090565b8015620033d6576000190190565b9081519060005b600019838101848111620033d657821015620149f15760018201808311620033d6575b84811062014968575050620149629062005ec0565b6201492a565b6001600160a01b03806201497d858962005f16565b5116816201498c848a62005f16565b511614620149a7575b50620149a19062005ec0565b6201494d565b8286929601828111620033d657620149a192620149ea92620149ce620149e3938b62005f16565b5116620149dc898b62005f16565b5262014915565b9562014915565b9062014995565b505090620149ff8162006032565b9060005b81811062014a12575090925050565b62014a39906001600160a01b0362014a2b828862005f16565b511662001e43828662005f16565b62014a03565b80519160005b600019848101858111620033d65782101562014af75760018201808311620033d6575b85811062014a8357505062014a7d9062005ec0565b62014a45565b62014a8f838662005f16565b5162014a9c828762005f16565b511462014ab5575b62014aaf9062005ec0565b62014a68565b9481810190808211620033d65762014ae862014aef9162014adb62014aaf948962005f16565b51620149dc8a8a62005f16565b9662014915565b905062014aa4565b5050909162014b068162006032565b9060005b81811062014b19575090925050565b8062014b2a62014b37928762005f16565b5162001e43828662005f16565b62014b0a565b60405162014b4b8162003f51565b604481527f496e76616c6964206469766964656e64207065726d797269616420706572207460208201527f72616e73616374696f6e2e2053686f756c64206265206c657373207468616e206040820152630313030360e41b606082015290565b60405162014bb98162003ff4565b603281527f4e6f20656e6f756768206e756d626572206f66207472616e73616374696f6e7360208201527108199bdc88191a5d9a59195b991cc81e595d60721b604082015290565b60405162014c0f8162003fbc565b601c81527b6469766964656e6473206f7065726174696f6e206f766572666c6f7760201b602082015290565b60405162014c498162003fbc565b600d81526c2ab735b737bbb71022b93937b960991b602082015290565b60405162014c748162003ff4565b602681527f4572726f7220696e20776974686472617761626c6520636173682063616c63756020820152653630ba34b7b760d11b604082015290565b60405162014cbe8162003fbc565b6012815271496e76616c696420506172616d657465727360701b602082015290565b60405162014cee8162003fbc565b601581527413595b58995c88191bd95cc81b9bdd08195e1a5cdd605a1b602082015290565b60405162014d218162003fbc565b601781527613595b58995c881a5cc81b9bdd081cdd5cdc195b991959604a1b602082015290565b60405162014d568162003fbc565b601b81527a13595b58995c881a5cc8185b1c9958591e481cdd5cdc195b991959602a1b602082015290565b60405162014d8f8162003fbc565b60158152744d656d62657220616c72656164792065786973747360581b602082015290565b60405162014dc28162003fbc565b60118152704e6f20656e6f7567682062616c616e636560781b602082015290565b60405162014df18162003fbc565b6018815277125b9d985b1a59081c185c985b595d195c881d1bc81cd95d60421b602082015290565b60405162014e278162003fbc565b6015815274546f6b656e20616d6f756e74206f766572666c6f7760581b602082015290565b6026811015620040d55780156201503a57600181146201422757600281146201503457600381146201502e57600481146201502857600581146201502257600681146201501c57600781146201501657600881146201501057600981146201500a57600a81146201500457600b811462014ffe57600c811462014ff857600d811462014ff257600e811462014fec57600f811462014fe6576010811462014fe0576011811462014fda576012811462014fd4576013811462014fce576014811462014fc8576015811462014fc2576018811462014fbc576017811462014fb6576019811462014fb057601a811462014faa57601b811462014fa457601c811462014f9e57601d811462014f9857601e811462014f9257601f811462014f8c576020811462014f865760211462014f8157600090565b602190565b50602090565b50601f90565b50601e90565b50601d90565b50601c90565b50601b90565b50601a90565b50601990565b50601790565b50601690565b50601590565b50601490565b50601390565b50601290565b50601190565b50601090565b50600f90565b50600e90565b50600d90565b50600c90565b50600b90565b50600a90565b50600990565b50600890565b50600790565b50600690565b50600590565b50600490565b50600390565b50600290565b50600090565b90815181101562005ede570160200190565b60405190620150618262003ff4565b60288252604036602084013760005b601481106201507e57505090565b601390808203918211620033d657600382901b916001600160fd1b03811603620033d65760ff808311620033d657600192620150c79084901b6001600160a01b03861662006284565b60f0811682821603918211620033d657620150eb9060f41b600f60f81b1662015154565b82841b916001600160ff1b0384168403620033d657620151289160001a62015114848962015040565b5360f81b6001600160f81b03191662015154565b928101809111620033d657620151476201514e9360001a918662015040565b5362005ec0565b62015070565b60f81c600a8110156201517d5760300160ff8111620033d65760f81b6001600160f81b03191690565b60570160ff8111620033d65760f81b6001600160f81b0319169056fe546865206c656e677468206f662061646472657373657320616e6420746f6b651f4fe3ad533e3985b88710ce05a205152f02825e155777f3bcb8b3bbfcfb03a24ad859a97f543436e70c22b09d31fb4c7b9e987d7a008c98817c9b50a97b1224546865206c656e677468206f6620746f6b656e436c61737320616e6420746f6b546865206c656e677468206f6620746f6b656e496e666f20616e6420746f6b658e71c125ecfe4aeed61c8cf4b09183dd0bf2a3230d826486f04e5f6f0de58e2c18baa939e2e21be0e012ec26e9ec87e9e6faa065bd9f5835250457786300ece8546865206265666f7265206f7065726174696f6e20706c7567696e20737973745265736572766564206f70636f6465206964203233206973206e6f7420696d705265736572766564206f70636f6465206964203238206973206e6f7420696d70546865206c656e677468206f662061646472657373657320616e6420616d6f75a2646970667358221220e5753ec11d4a1791a7993a88596fd3f192a66b2cad89bef95cd62431981be63f64736f6c63430008110033\",\n  \"linkReferences\": {},\n  \"deployedLinkReferences\": {}\n}\n"
  },
  {
    "path": "darc-js/src/darcBinary/darcBinary.ts",
    "content": "import * as DARCTest from \"./DARC-test.json\";\n\nimport * as DARCLatest from \"./DARC-latest.json\";\n\nexport enum DARC_VERSION {\n  Test,\n  Latest,\n}\n\nexport type DARCBinaryStruct = {\n  version: DARC_VERSION,\n  bytecode: any;\n  abi: any;\n}\n\nexport function darcBinary(version: DARC_VERSION): DARCBinaryStruct{\n  if (version === DARC_VERSION.Test){\n    return {\n      version: DARC_VERSION.Test,\n      bytecode: DARCTest.bytecode,\n      abi: DARCTest.abi,\n    }\n  }\n\n  else if (version === DARC_VERSION.Latest){\n    return {\n      version: DARC_VERSION.Latest,\n      bytecode: DARCLatest.bytecode,\n      abi: DARCLatest.abi,\n    }\n  }\n\n  throw new Error(\"DARC version not supported yet.\");\n}"
  },
  {
    "path": "darc-js/src/darcjs.ts",
    "content": "/**\n * Below are core darcjs \n */\nexport {deployDARC} from './deployDARC/deployDARC';\nexport { transpile } from './SDK/transpiler';\nexport { DARC, InitParam } from './DARC/DARC';\nexport { darcBinary, DARCBinaryStruct, DARC_VERSION } from './darcBinary/darcBinary';\nexport { ethers } from 'ethers';\nexport {run} from './SDK/runtime';\n\n\n/**\n * Below are core interpreter functions for the By-law Script\n */\nexport { transpileAndRun } from \"./SDK/runtime\";\n\n/**\n * Below are all necessary functions for the SDK.\n */\nimport * as instructions from \"./SDK/includes\";\nimport { OperationStruct, OperationStructOutput, ProgramStruct, VotingRuleStruct, PluginStruct, PluginStructWithNode } from \"./types/basicTypes\";\nimport {ethers} from \"ethers\";\nimport * as DARC from \"./DARC/DARC\";\n\n/**\n * Below are return types\n */\nexport const UNDEFINED = 0;\nexport const SANDBOX_NEEDED = 1;\nexport const NO = 2;\nexport const VOTING_NEEDED = 3;\nexport const YES_AND_SKIP_SANDBOX = 4;\nexport const YES = 5;\n\nexport enum EnumReturnType {\n  UNDEFINED = 0,\n  SANDBOX_NEEDED = 1,\n  NO = 2,\n  VOTING_NEEDED = 3,\n  YES_AND_SKIP_SANDBOX = 4,\n  YES = 5\n}\n\nimport {\n  OPCODE_ID_1_BATCH_MINT_TOKENS,\n  OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES,\n  OPCODE_ID_3_BATCH_TRANSFER_TOKENS,\n  OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO,\n  OPCODE_ID_5_BATCH_BURN_TOKENS,\n  OPCODE_ID_6_BATCH_BURN_TOKENS_FROM,\n  OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS,\n  OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS,\n  OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS,\n  OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES,\n  OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES,\n  OPCODE_ID_12_BATCH_ADD_PLUGINS,\n  OPCODE_ID_13_BATCH_ENABLE_PLUGINS,\n  OPCODE_ID_14_BATCH_DISABLE_PLUGINS,\n  OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS,\n  OPCODE_ID_16_BATCH_SET_PARAMETERS,\n  OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES,\n  OPCODE_ID_19_BATCH_ADD_VOTING_RULES,\n  OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS,\n  OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS,\n  OPCODE_ID_22_ADD_EMERGENCY,\n  OPCODE_ID_24_CALL_EMERGENCY,\n  OPCODE_ID_25_CALL_CONTRACT_ABI,\n  OPCODE_ID_26_PAY_CASH,\n  OPCODE_ID_27_OFFER_DIVIDENDS,\n  OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS,\n  OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND,\n  OPCODE_ID_31_ADD_STORAGE_STRING,\n  OPCODE_ID_32_VOTE,\n  OPCODE_ID_33_EXECUTE_PENDING_PROGRAM,\n  OPCODE_ID_34_END_EMERGENCY,\n  OPCODE_ID_35_UPGRADE_TO_ADDRESS,\n  OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS,\n  OPCODE_ID_37_UPGRADE_TO_THE_LATEST\n} from \"./SDK/opcodes/opcodeTable\";\n\n/**\n * The core function of the SDK. It takes in a list of operations and a wallet, and then sends the operations to the DARC contract. This is different from the By-law Script, which compile and run the code directly.\n * @param operationList The list of operations to be sent to the DARC contract\n * @param wallet The wallet to be used to sign the transaction (provider must be set)\n * @param targetDARCAddress The address of the DARC contract to be used\n * @param notes The notes to be attached to the program\n * @param delegateToAddress If the signer is not the operator, but the operator has approved the signer to sign on its behalf, then the signer can set this parameter to the operator's address. Otherwise, leave it undefined.\n */\nexport async function executeOperationList(\n  operationList: OperationStruct[],\n  wallet: ethers.Wallet,\n  targetDARCAddress: string,\n  notes?: string,\n  delegateToAddress?: string\n  ) {\n  \n  const operatorAddress = delegateToAddress? delegateToAddress : wallet.address;\n  for (let i = 0; i < operationList.length; i++) {\n    operationList[i].operatorAddress = operatorAddress;\n  }\n  const program:ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    operations: operationList,\n    notes: notes? notes : \"\"\n  };\n\n  const attachedDARC = new DARC.DARC({\n    address: targetDARCAddress,\n    version: DARC.DARC_VERSION.Latest,\n    wallet: wallet,\n  });\n\n  await attachedDARC.entrance(program);\n}\n\n\n\n\nexport function batch_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_1_BATCH_MINT_TOKENS(addressArray, tokenClassArray, amountArray);\n  return operation;\n}\n\nexport function batch_create_token_classes(nameArray: string[], tokenIndexArray: bigint[] | number[], votingWeightArray: bigint[] | number[], dividendWeightArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES(nameArray, tokenIndexArray, votingWeightArray, dividendWeightArray);\n  return operation;\n}\n\nexport function batch_transfer_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_3_BATCH_TRANSFER_TOKENS(addressArray, tokenClassArray, amountArray);\n  return operation;\n}\n\nexport function batch_transfer_tokens_from_to(fromAddressArray: string[], toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO(fromAddressArray, toAddressArray, tokenClassArray, amountArray);\n  return operation;\n}\n\nexport function batch_burn_tokens(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_5_BATCH_BURN_TOKENS(tokenClassArray, amountArray);\n  return operation;\n}\n\nexport function batch_burn_tokens_from(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_6_BATCH_BURN_TOKENS_FROM(addressArray, tokenClassArray, amountArray);\n  return operation;\n}\n\nexport function batch_add_memberships(addressArray: string[], roleArray: bigint[] | number[], nameArray: string[]): OperationStruct {\n  let operation = OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS(addressArray, roleArray, nameArray);\n  return operation;\n}\n\nexport function batch_suspend_memberships(addressArray: string[]): OperationStruct {\n  let operation = OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS(addressArray);\n  return operation;\n}\n\nexport function batch_resume_memberships(addressArray: string[]): OperationStruct {\n  let operation = OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS(addressArray);\n  return operation;\n}\n\nexport function batch_change_member_roles(addressArray: string[], roleArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES(addressArray, roleArray);\n  return operation;\n}\n\nexport function batch_change_member_names(addressArray: string[], nameArray: string[]): OperationStruct {\n  let operation = OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES(addressArray, nameArray);\n  return operation;\n}\n\nexport function batch_add_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]): OperationStruct {\n  if (pluginArray instanceof Array && typeof pluginArray[0] !== \"object\") {\n    let operation = OPCODE_ID_12_BATCH_ADD_PLUGINS(pluginArray);\n    return operation;\n  }\n  let operation = OPCODE_ID_12_BATCH_ADD_PLUGINS(pluginArray);\n  return operation;\n}\n\nexport function batch_enable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]): OperationStruct {\n  let operation = OPCODE_ID_13_BATCH_ENABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n  return operation;\n}\n\nexport function batch_disable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]): OperationStruct {\n  let operation = OPCODE_ID_14_BATCH_DISABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n  return operation;\n}\n\nexport function batch_add_and_enable_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]): OperationStruct {\n  let operation = OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS(pluginArray);\n  return operation;\n}\n\nexport function batch_set_parameters(parameterIndexArray: bigint[] | number[], parameterValueArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_16_BATCH_SET_PARAMETERS(parameterIndexArray, parameterValueArray);\n  return operation;\n}\n\nexport function batch_add_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n  return operation;\n}\n\nexport function batch_reduce_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n  return operation;\n}\n\nexport function batch_add_voting_rules(ruleArray: VotingRuleStruct[]): OperationStruct {\n  let operation = OPCODE_ID_19_BATCH_ADD_VOTING_RULES(ruleArray);\n  return operation;\n}\n\nexport function batch_pay_to_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint): OperationStruct {\n  let operation = OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS(addressArray, tokenClassArray, amountArray, priceArray, dividendable);\n  return operation;\n}\n\nexport function batch_pay_to_transfer_tokens( toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint): OperationStruct {\n  let operation = OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS(toAddressArray, tokenClassArray, amountArray, priceArray, dividendable);\n  return operation;\n}\n\nexport function add_emergency(emergencyAddressArray: string[]): OperationStruct {\n  let operation = OPCODE_ID_22_ADD_EMERGENCY(emergencyAddressArray);\n  return operation;\n}\n\nexport function call_emergency(emergencyAddressArrayIndex: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_24_CALL_EMERGENCY(emergencyAddressArrayIndex);\n  return operation;\n}\n\nexport function call_contract_abi(contractAddress: string, abi: string | Uint8Array, value: bigint): OperationStruct {\n  let operation = OPCODE_ID_25_CALL_CONTRACT_ABI(contractAddress, abi, value);\n  return operation;\n}\n\nexport function pay_cash(amount: bigint, paymentType: bigint, dividendable: bigint): OperationStruct {\n  let operation = OPCODE_ID_26_PAY_CASH(amount, paymentType, dividendable);\n  return operation;\n}\n\nexport function offer_dividends(): OperationStruct {\n  let operation = OPCODE_ID_27_OFFER_DIVIDENDS();\n  return operation;\n}\n\nexport function set_approval_for_all_operations(address: string): OperationStruct {\n  let operation = OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS(address);\n  return operation;\n}\n\nexport function batch_burn_tokens_and_refund(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[]): OperationStruct {\n  let operation = OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND(tokenClassArray, amountArray, priceArray);\n  return operation;\n}\n\nexport function add_storage_string(value: string): OperationStruct {\n  let operation = OPCODE_ID_31_ADD_STORAGE_STRING(value);\n  return operation;\n}\n\nexport function vote(voteArray: boolean[]): OperationStruct {\n  let operation = OPCODE_ID_32_VOTE(voteArray);\n  return operation;\n}\n\nexport function execute_pending_program(): OperationStruct {\n  let operation = OPCODE_ID_33_EXECUTE_PENDING_PROGRAM();\n  return operation;\n}\n\nexport function end_emergency(): OperationStruct {\n  let operation = OPCODE_ID_34_END_EMERGENCY();\n  return operation;\n}\n\nexport function upgrade_to_address(newAddress: string): OperationStruct {\n  let operation = OPCODE_ID_35_UPGRADE_TO_ADDRESS(newAddress);\n  return operation;\n}\n\nexport function confirm_upgrade_from_address(newAddress: string): OperationStruct {\n  let operation = OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS(newAddress);\n  return operation;\n}\n\nexport function upgrade_to_the_latest(): OperationStruct {\n  let operation = OPCODE_ID_37_UPGRADE_TO_THE_LATEST();\n  return operation;\n}\n\n\n/**\n * Below are all condition nodes for composing plugins\n */\nexport {\n  batch_op_size_greater_than,\n  batch_op_size_less_than,\n  batch_op_size_in_range,\n  batch_op_size_equals,\n  batch_op_each_target_addresses_equals,\n  batch_op_each_target_addresses_in_list,\n  batch_op_each_target_addresses_in_member_role,\n  batch_op_any_target_address_equals,\n  batch_op_any_target_address_in_list,\n  batch_op_any_target_address_in_member_role,\n  batch_op_each_target_address_to_itself,\n  batch_op_any_target_address_to_itself,\n  batch_op_each_source_address_equals,\n  batch_op_each_source_address_in_list,\n  batch_op_each_source_address_in_member_role,\n  batch_op_any_source_address_equal,\n  batch_op_any_source_address_in_list,\n  batch_op_any_source_address_in_member_role,\n  batch_op_each_source_address_from_itself,\n  batch_op_any_source_address_from_itself,\n  batch_op_each_token_class_equals,\n  batch_op_each_token_class_in_list,\n  batch_op_each_token_class_in_range,\n  batch_op_each_token_class_greater_than,\n  batch_op_each_token_class_less_than,\n  batch_op_total_token_amount_greater_than,\n  batch_op_total_token_amount_less_than,\n  batch_op_total_token_amount_in_range,\n  batch_op_total_token_amount_equals,\n  batch_op_any_token_amount_greater_than,\n  batch_op_any_token_amount_less_than,\n  batch_op_any_token_amount_in_range,\n  batch_op_any_token_amount_equals,\n  batch_op_any_token_class_greater_than,\n  batch_op_any_token_class_less_than,\n  batch_op_any_token_class_in_range,\n  batch_op_any_token_class_equals,\n  batch_op_any_token_class_in_list,\n  batch_op_each_source_address_in_member_role_list,\n  batch_op_any_source_address_in_member_role_list,\n  batch_op_each_target_address_in_member_role_list,\n  batch_op_any_target_address_in_member_role_list,\n  batch_op_each_target_address_withdrawable_cash_greater_than,\n  batch_op_each_target_address_withdrawable_cash_less_than,\n  batch_op_each_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_withdrawable_cash_equals,\n  batch_op_any_target_address_withdrawable_cash_greater_than,\n  batch_op_any_target_address_withdrawable_cash_less_than,\n  batch_op_any_target_address_withdrawable_cash_in_range,\n  batch_op_each_target_address_total_voting_weight_greater_than,\n  batch_op_each_target_address_total_voting_weight_less_than,\n  batch_op_each_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_voting_weight_equals,\n  batch_op_any_target_address_total_voting_weight_greater_than,\n  batch_op_any_target_address_total_voting_weight_less_than,\n  batch_op_any_target_address_total_voting_weight_in_range,\n  batch_op_each_target_address_total_dividend_weight_greater_than,\n  batch_op_each_target_address_total_dividend_weight_less_than,\n  batch_op_each_target_address_total_dividend_weight_in_range,\n  batch_op_any_target_address_total_dividend_weight_greater_than,\n  batch_op_any_target_address_total_dividend_weight_less_than,\n  batch_op_any_target_address_total_dividend_weight_in_range,\n  batch_op_each_target_address_owns_token_x_greater_than,\n  batch_op_each_target_address_owns_token_x_less_than,\n  batch_op_each_target_address_owns_token_x_in_range,\n  batch_op_any_target_address_owns_token_x_greater_than,\n  batch_op_any_target_address_owns_token_x_less_than,\n  batch_op_any_target_address_owns_token_x_in_range\n} from \"./SDK/conditionNodes/Condition_BatchOp\";\n\nexport {\n  create_token_classes_any_token_dividend_weight_greater_than,\n  create_token_classes_any_token_dividend_weight_less_than,\n  create_token_classes_any_token_dividend_weight_in_range,\n  create_token_classes_any_token_dividend_weight_equals,\n  create_token_classes_any_voting_weight_greater_than,\n  create_token_classes_any_voting_weight_less_than,\n  create_token_classes_any_voting_weight_in_range,\n  create_token_classes_any_voting_weight_equals\n} from \"./SDK/conditionNodes/Condition_CreateTokenClass\";\n\nexport {\n  timestamp_greater_than,\n  timestamp_less_than,\n  timestamp_in_range,\n  date_year_greater_than,\n  date_year_less_than,\n  date_year_in_range,\n  date_month_greater_than,\n  date_month_less_than,\n  date_month_in_range,\n  date_day_greater_than,\n  date_day_less_than,\n  date_day_in_range,\n  date_hour_greater_than,\n  date_hour_less_than,\n  date_hour_in_range,\n  address_voting_weight_greater_than,\n  address_voting_weight_less_than,\n  address_voting_weight_in_range,\n  address_dividend_weight_greater_than,\n  address_dividend_weight_less_than,\n  address_dividend_weight_in_range,\n  address_token_x_greater_than,\n  address_token_x_less_than,\n  address_token_x_in_range,\n  total_voting_weight_greater_than,\n  total_voting_weight_less_than,\n  total_voting_weight_in_range,\n  total_dividend_weight_greater_than,\n  total_dividend_weight_less_than,\n  total_dividend_weight_in_range,\n  total_cash_greater_than,\n  total_cash_less_than,\n  total_cash_in_range,\n  total_cash_equals,\n  token_in_list_voting_weight_greater_than,\n  token_in_list_voting_weight_less_than,\n  token_in_list_voting_weight_in_range,\n  token_in_list_dividend_weight_greater_than,\n  token_in_list_dividend_weight_less_than,\n  token_in_list_dividend_weight_in_range,\n  token_in_list_amount_greater_than,\n  token_in_list_amount_less_than,\n  token_in_list_amount_in_range,\n  token_in_list_amount_equals,\n  address_voting_weight_percenrage_greater_than,\n  address_voting_weight_percenrage_less_than,\n  address_voting_weight_percenrage_in_range,\n  address_dividend_weight_percenrage_greater_than,\n  address_dividend_weight_percenrage_less_than,\n  address_dividend_weight_percenrage_in_range\n} from \"./SDK/conditionNodes/Condition_MachineState\";\n\nexport { change_member_role_to_any_role_equals, change_member_role_to_any_role_in_list, change_member_role_to_any_role_in_range, change_member_name_to_any_string_in_list, change_member_name_to_any_string_contains } from \"./SDK/conditionNodes/Condition_MembershipOp\";\n\nexport { operation_equals, operation_in_list, EnumOpcode } from \"./SDK/conditionNodes/Condition_Operation\";\n\nexport {\n  operation_by_operator_since_last_time_greater_than,\n  operation_by_operator_since_last_time_less_than,\n  operation_by_operator_since_last_time_in_range,\n  operation_global_since_last_time_greater_than,\n  operation_global_since_last_time_less_than,\n  operation_global_since_last_time_in_range,\n  operation_by_any_address_in_list_since_last_time_greater_than,\n  operation_by_any_address_in_list_since_last_time_less_than,\n  operation_by_any_address_in_list_since_last_time_in_range,\n  operation_by_each_address_in_list_since_last_time_greater_than,\n  operation_by_each_address_in_list_since_last_time_less_than,\n  operation_by_each_address_in_list_since_last_time_in_range\n} from \"./SDK/conditionNodes/Condition_OperationLog\";\n\nexport {\n  operator_name_equals,\n  operator_role_equals,\n  operator_address_equals,\n  operator_role_greater_than,\n  operator_role_less_than,\n  operator_role_in_range,\n  operator_role_in_list,\n  operator_token_x_amount_greater_than,\n  operator_token_x_amount_less_than,\n  operator_token_x_amount_in_range,\n  operator_token_x_amount_equals,\n  operator_token_x_percentage_greater_than,\n  operator_token_x_percentage_less_than,\n  operator_token_x_percentage_in_range,\n  operator_token_x_percentage_equals,\n  operator_voting_weight_greater_than,\n  operator_voting_weight_less_than,\n  operator_voting_weight_in_range,\n  operator_dividend_weight_greater_than,\n  operator_dividend_weight_less_than,\n  operator_dividend_weight_in_range,\n  operator_withdrawable_cash_greater_than,\n  operator_withdrawable_cash_less_than,\n  operator_withdrawable_cash_in_range,\n  operator_withdrawable_dividends_greater_than,\n  operator_withdrawable_dividends_less_than,\n  operator_withdrawable_dividends_in_range,\n  operator_address_in_list\n} from \"./SDK/conditionNodes/Condition_Operator\";\n\nexport {\n  enable_any_before_op_plugin_index_in_list,\n  enable_any_after_op_plugin_index_in_list,\n  enable_each_before_op_plugin_index_in_list,\n  enable_each_after_op_plugin_index_in_list,\n  disable_any_before_op_plugin_index_in_list,\n  disable_any_after_op_plugin_index_in_list,\n  disable_each_before_op_plugin_index_in_list,\n  disable_each_after_op_plugin_index_in_list,\n  enable_any_before_op_plugin_index_in_range,\n  enable_any_after_op_plugin_index_in_range,\n  enable_each_before_op_plugin_index_in_range,\n  enable_each_after_op_plugin_index_in_range,\n  disable_any_before_op_plugin_index_in_range,\n  disable_any_after_op_plugin_index_in_range,\n  disable_each_before_op_plugin_index_in_range,\n  disable_each_after_op_plugin_index_in_range,\n  are_all_plugins_before_operation,\n  are_all_plugins_after_operation,\n  is_any_plugin_before_operation,\n  is_any_plugin_after_operation,\n  add_plugin_any_level_equals,\n  add_plugin_any_level_in_list,\n  add_plugin_any_level_in_range,\n  add_plugin_any_level_greater_than,\n  add_plugin_any_level_less_than,\n  add_plugin_any_return_type_equals,\n  add_plugin_any_voting_rule_index_in_list,\n  add_any_voting_rule_is_absolute_majority,\n  add_any_voting_rule_approval_percentage_in_range,\n  add_any_voting_rule_token_class_contains\n} from \"./SDK/conditionNodes/Condition_PluginAndVoting\";\n\nexport { program_op_length_greater_than, program_op_length_less_than, program_op_length_in_range, program_op_length_equals, program_contains_op, program_contains_op_in_list, program_every_op_equals, program_every_op_in_list } from \"./SDK/conditionNodes/Condition_Program\";\n\nexport { token_x_op_any_price_greater_than, token_x_op_any_price_less_than, token_x_op_any_price_in_range, token_x_op_any_price_equals } from \"./SDK/conditionNodes/Condition_TokenAndCash\";\n\nexport {\n  add_withdrawable_balance_any_amount_greater_than,\n  add_withdrawable_balance_any_amount_less_than,\n  add_withdrawable_balance_any_amount_in_range,\n  add_withdrawable_balance_any_amount_equals,\n  reduce_withdrawable_balance_any_amount_greater_than,\n  reduce_withdrawable_balance_any_amount_less_than,\n  reduce_withdrawable_balance_any_amount_in_range,\n  reduce_withdrawable_balance_any_amount_equals\n} from \"./SDK/conditionNodes/Condition_Withdrawable\";"
  },
  {
    "path": "darc-js/src/deployDARC/deployDARC.ts",
    "content": "import {ethers} from 'ethers';\n\nimport {DARC_VERSION, DARCBinaryStruct, darcBinary} from '../darcBinary/darcBinary';\n\ntype RuntimeParam = {\n  address: string;\n  wallet: ethers.Wallet;\n  provider: ethers.providers.Provider;\n}\n\ntype DeployParam = {\n  wallet: ethers.Wallet;\n  provider: ethers.providers.Provider;\n}\n\nexport async function deployDARC(version: DARC_VERSION, signer: ethers.Wallet): Promise<string> {\n  const darcBinaryStruct = darcBinary(version);\n  const bytecode = darcBinaryStruct.bytecode;\n  const abi = darcBinaryStruct.abi;\n  const contractFactory = new ethers.ContractFactory(abi, bytecode, signer);\n  const contract = await contractFactory.deploy();\n  await contract.initialize()\n  const deployed_address =  contract.address;\n  return deployed_address;\n}\n"
  },
  {
    "path": "darc-js/src/index.ts",
    "content": "// /**\n//  * Below are core darcjs \n//  */\n// import {deployDARC} from './deployDARC/deployDARC';\n// import { transpile } from './SDK/transpiler';\n// import { InitParam } from './DARC/DARC';\n// import { darcBinary, DARCBinaryStruct, DARC_VERSION } from './darcBinary/darcBinary';\n\n// export {\n//   deployDARC, \n//   transpile, \n//   DARC, \n//   InitParam, \n//   darcBinary, \n//   DARCBinaryStruct, \n//   DARC_VERSION,\n//   ethers,\n// };\n\n// /**\n//  * Below are core interpreter functions for the By-law Script\n//  */\n// export { transpileAndRun } from \"./SDK/runtime\";\n\n// /**\n//  * Below are all necessary functions for the SDK.\n//  */\n// import * as instructions from \"./SDK/includes\";\n// import { OperationStruct, OperationStructOutput, ProgramStruct, VotingRuleStruct, PluginStruct, PluginStructWithNode } from \"./types/basicTypes\";\n// import {ethers} from \"ethers\";\n// import * as DARC from \"./DARC/DARC\";\n\n// import {\n//   OPCODE_ID_1_BATCH_MINT_TOKENS,\n//   OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES,\n//   OPCODE_ID_3_BATCH_TRANSFER_TOKENS,\n//   OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO,\n//   OPCODE_ID_5_BATCH_BURN_TOKENS,\n//   OPCODE_ID_6_BATCH_BURN_TOKENS_FROM,\n//   OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS,\n//   OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS,\n//   OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS,\n//   OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES,\n//   OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES,\n//   OPCODE_ID_12_BATCH_ADD_PLUGINS,\n//   OPCODE_ID_13_BATCH_ENABLE_PLUGINS,\n//   OPCODE_ID_14_BATCH_DISABLE_PLUGINS,\n//   OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS,\n//   OPCODE_ID_16_BATCH_SET_PARAMETERS,\n//   OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES,\n//   OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES,\n//   OPCODE_ID_19_BATCH_ADD_VOTING_RULES,\n//   OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS,\n//   OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS,\n//   OPCODE_ID_22_ADD_EMERGENCY,\n//   OPCODE_ID_24_CALL_EMERGENCY,\n//   OPCODE_ID_25_CALL_CONTRACT_ABI,\n//   OPCODE_ID_26_PAY_CASH,\n//   OPCODE_ID_27_OFFER_DIVIDENDS,\n//   OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS,\n//   OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND,\n//   OPCODE_ID_31_ADD_STORAGE_STRING,\n//   OPCODE_ID_32_VOTE,\n//   OPCODE_ID_33_EXECUTE_PENDING_PROGRAM,\n//   OPCODE_ID_34_END_EMERGENCY,\n//   OPCODE_ID_35_UPGRADE_TO_ADDRESS,\n//   OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS,\n//   OPCODE_ID_37_UPGRADE_TO_THE_LATEST\n// } from \"./SDK/opcodes/opcodeTable\";\n\n// /**\n//  * The core function of the SDK. It takes in a list of operations and a wallet, and then sends the operations to the DARC contract. This is different from the By-law Script, which compile and run the code directly.\n//  * @param operationList The list of operations to be sent to the DARC contract\n//  * @param wallet The wallet to be used to sign the transaction (provider must be set)\n//  * @param targetDARCAddress The address of the DARC contract to be used\n//  * @param notes The notes to be attached to the program\n//  * @param delegateToAddress If the signer is not the operator, but the operator has approved the signer to sign on its behalf, then the signer can set this parameter to the operator's address. Otherwise, leave it undefined.\n//  */\n// export async function executeOperationList(\n//   operationList: OperationStruct[],\n//   wallet: ethers.Wallet,\n//   targetDARCAddress: string,\n//   notes?: string,\n//   delegateToAddress?: string\n//   ) {\n  \n//   const operatorAddress = delegateToAddress? delegateToAddress : wallet.address;\n//   for (let i = 0; i < operationList.length; i++) {\n//     operationList[i].operatorAddress = operatorAddress;\n//   }\n//   const program:ProgramStruct = {\n//     programOperatorAddress: operatorAddress,\n//     operations: operationList,\n//     notes: notes? notes : \"\"\n//   };\n\n//   const attachedDARC = new DARC.DARC({\n//     address: targetDARCAddress,\n//     version: DARC.DARC_VERSION.Latest,\n//     wallet: wallet,\n//   });\n\n//   await attachedDARC.entrance(program);\n// }\n\n\n\n\n// export function batch_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_1_BATCH_MINT_TOKENS(addressArray, tokenClassArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_create_token_classes(nameArray: string[], tokenIndexArray: bigint[] | number[], votingWeightArray: bigint[] | number[], dividendWeightArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_2_BATCH_CREATE_TOKEN_CLASSES(nameArray, tokenIndexArray, votingWeightArray, dividendWeightArray);\n//   return operation;\n// }\n\n// export function batch_transfer_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_3_BATCH_TRANSFER_TOKENS(addressArray, tokenClassArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_transfer_tokens_from_to(fromAddressArray: string[], toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_4_BATCH_TRANSFER_TOKENS_FROM_TO(fromAddressArray, toAddressArray, tokenClassArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_burn_tokens(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_5_BATCH_BURN_TOKENS(tokenClassArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_burn_tokens_from(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_6_BATCH_BURN_TOKENS_FROM(addressArray, tokenClassArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_add_memberships(addressArray: string[], roleArray: bigint[] | number[], nameArray: string[]): OperationStruct {\n//   let operation = OPCODE_ID_7_BATCH_ADD_MEMBERSHIPS(addressArray, roleArray, nameArray);\n//   return operation;\n// }\n\n// export function batch_suspend_memberships(addressArray: string[]): OperationStruct {\n//   let operation = OPCODE_ID_8_BATCH_SUSPEND_MEMBERSHIPS(addressArray);\n//   return operation;\n// }\n\n// export function batch_resume_memberships(addressArray: string[]): OperationStruct {\n//   let operation = OPCODE_ID_9_BATCH_RESUME_MEMBERSHIPS(addressArray);\n//   return operation;\n// }\n\n// export function batch_change_member_roles(addressArray: string[], roleArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_10_BATCH_CHANGE_MEMBER_ROLES(addressArray, roleArray);\n//   return operation;\n// }\n\n// export function batch_change_member_names(addressArray: string[], nameArray: string[]): OperationStruct {\n//   let operation = OPCODE_ID_11_BATCH_CHANGE_MEMBER_NAMES(addressArray, nameArray);\n//   return operation;\n// }\n\n// export function batch_add_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]): OperationStruct {\n//   if (pluginArray instanceof Array && typeof pluginArray[0] !== \"object\") {\n//     let operation = OPCODE_ID_12_BATCH_ADD_PLUGINS(pluginArray);\n//     return operation;\n//   }\n//   let operation = OPCODE_ID_12_BATCH_ADD_PLUGINS(pluginArray);\n//   return operation;\n// }\n\n// export function batch_enable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]): OperationStruct {\n//   let operation = OPCODE_ID_13_BATCH_ENABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n//   return operation;\n// }\n\n// export function batch_disable_plugins(pluginIndexArray: bigint[] | number[], isBeforeOperationArray: boolean[]): OperationStruct {\n//   let operation = OPCODE_ID_14_BATCH_DISABLE_PLUGINS(pluginIndexArray, isBeforeOperationArray);\n//   return operation;\n// }\n\n// export function batch_add_and_enable_plugins(pluginArray: PluginStruct[] | PluginStructWithNode[]): OperationStruct {\n//   let operation = OPCODE_ID_15_BATCH_ADD_AND_ENABLE_PLUGINS(pluginArray);\n//   return operation;\n// }\n\n// export function batch_set_parameters(parameterIndexArray: bigint[] | number[], parameterValueArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_16_BATCH_SET_PARAMETERS(parameterIndexArray, parameterValueArray);\n//   return operation;\n// }\n\n// export function batch_add_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_17_BATCH_ADD_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_reduce_withdrawable_balances(addressArray: string[], amountArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_18_BATCH_REDUCE_WITHDRAWABLE_BALANCES(addressArray, amountArray);\n//   return operation;\n// }\n\n// export function batch_add_voting_rules(ruleArray: VotingRuleStruct[]): OperationStruct {\n//   let operation = OPCODE_ID_19_BATCH_ADD_VOTING_RULES(ruleArray);\n//   return operation;\n// }\n\n// export function batch_pay_to_mint_tokens(addressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint): OperationStruct {\n//   let operation = OPCODE_ID_20_BATCH_PAY_TO_MINT_TOKENS(addressArray, tokenClassArray, amountArray, priceArray, dividendable);\n//   return operation;\n// }\n\n// export function batch_pay_to_transfer_tokens( toAddressArray: string[], tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[], dividendable: bigint): OperationStruct {\n//   let operation = OPCODE_ID_21_BATCH_PAY_TO_TRANSFER_TOKENS(toAddressArray, tokenClassArray, amountArray, priceArray, dividendable);\n//   return operation;\n// }\n\n// export function add_emergency(emergencyAddressArray: string[]): OperationStruct {\n//   let operation = OPCODE_ID_22_ADD_EMERGENCY(emergencyAddressArray);\n//   return operation;\n// }\n\n// export function call_emergency(emergencyAddressArrayIndex: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_24_CALL_EMERGENCY(emergencyAddressArrayIndex);\n//   return operation;\n// }\n\n// export function call_contract_abi(contractAddress: string, abi: string | Uint8Array, value: bigint): OperationStruct {\n//   let operation = OPCODE_ID_25_CALL_CONTRACT_ABI(contractAddress, abi, value);\n//   return operation;\n// }\n\n// export function pay_cash(amount: bigint, paymentType: bigint, dividendable: bigint): OperationStruct {\n//   let operation = OPCODE_ID_26_PAY_CASH(amount, paymentType, dividendable);\n//   return operation;\n// }\n\n// export function offer_dividends(): OperationStruct {\n//   let operation = OPCODE_ID_27_OFFER_DIVIDENDS();\n//   return operation;\n// }\n\n// export function set_approval_for_all_operations(address: string): OperationStruct {\n//   let operation = OPCODE_ID_29_SET_APPROVAL_FOR_ALL_OPERATIONS(address);\n//   return operation;\n// }\n\n// export function batch_burn_tokens_and_refund(tokenClassArray: bigint[] | number[], amountArray: bigint[] | number[], priceArray: bigint[] | number[]): OperationStruct {\n//   let operation = OPCODE_ID_30_BATCH_BURN_TOKENS_AND_REFUND(tokenClassArray, amountArray, priceArray);\n//   return operation;\n// }\n\n// export function add_storage_string(value: string): OperationStruct {\n//   let operation = OPCODE_ID_31_ADD_STORAGE_STRING(value);\n//   return operation;\n// }\n\n// export function vote(voteArray: boolean[]): OperationStruct {\n//   let operation = OPCODE_ID_32_VOTE(voteArray);\n//   return operation;\n// }\n\n// export function execute_pending_program(): OperationStruct {\n//   let operation = OPCODE_ID_33_EXECUTE_PENDING_PROGRAM();\n//   return operation;\n// }\n\n// export function end_emergency(): OperationStruct {\n//   let operation = OPCODE_ID_34_END_EMERGENCY();\n//   return operation;\n// }\n\n// export function upgrade_to_address(newAddress: string): OperationStruct {\n//   let operation = OPCODE_ID_35_UPGRADE_TO_ADDRESS(newAddress);\n//   return operation;\n// }\n\n// export function confirm_upgrade_from_address(newAddress: string): OperationStruct {\n//   let operation = OPCODE_ID_36_CONFIRM_UPGRAED_FROM_ADDRESS(newAddress);\n//   return operation;\n// }\n\n// export function upgrade_to_the_latest(): OperationStruct {\n//   let operation = OPCODE_ID_37_UPGRADE_TO_THE_LATEST();\n//   return operation;\n// }\n\n\n// /**\n//  * Below are all condition nodes for composing plugins\n//  */\n// export {\n//   batch_op_size_greater_than,\n//   batch_op_size_less_than,\n//   batch_op_size_in_range,\n//   batch_op_size_equals,\n//   batch_op_each_target_addresses_equals,\n//   batch_op_each_target_addresses_in_list,\n//   batch_op_each_target_addresses_in_member_role,\n//   batch_op_any_target_address_equals,\n//   batch_op_any_target_address_in_list,\n//   batch_op_any_target_address_in_member_role,\n//   batch_op_each_target_address_to_itself,\n//   batch_op_any_target_address_to_itself,\n//   batch_op_each_source_address_equals,\n//   batch_op_each_source_address_in_list,\n//   batch_op_each_source_address_in_member_role,\n//   batch_op_any_source_address_equal,\n//   batch_op_any_source_address_in_list,\n//   batch_op_any_source_address_in_member_role,\n//   batch_op_each_source_address_from_itself,\n//   batch_op_any_source_address_from_itself,\n//   batch_op_each_token_class_equals,\n//   batch_op_each_token_class_in_list,\n//   batch_op_each_token_class_in_range,\n//   batch_op_each_token_class_greater_than,\n//   batch_op_each_token_class_less_than,\n//   batch_op_total_token_amount_greater_than,\n//   batch_op_total_token_amount_less_than,\n//   batch_op_total_token_amount_in_range,\n//   batch_op_total_token_amount_equals,\n//   batch_op_any_token_amount_greater_than,\n//   batch_op_any_token_amount_less_than,\n//   batch_op_any_token_amount_in_range,\n//   batch_op_any_token_amount_equals,\n//   batch_op_any_token_class_greater_than,\n//   batch_op_any_token_class_less_than,\n//   batch_op_any_token_class_in_range,\n//   batch_op_any_token_class_equals,\n//   batch_op_any_token_class_in_list,\n//   batch_op_each_source_address_in_member_role_list,\n//   batch_op_any_source_address_in_member_role_list,\n//   batch_op_each_target_address_in_member_role_list,\n//   batch_op_any_target_address_in_member_role_list,\n//   batch_op_each_target_address_withdrawable_cash_greater_than,\n//   batch_op_each_target_address_withdrawable_cash_less_than,\n//   batch_op_each_target_address_withdrawable_cash_in_range,\n//   batch_op_each_target_address_withdrawable_cash_equals,\n//   batch_op_any_target_address_withdrawable_cash_greater_than,\n//   batch_op_any_target_address_withdrawable_cash_less_than,\n//   batch_op_any_target_address_withdrawable_cash_in_range,\n//   batch_op_each_target_address_total_voting_weight_greater_than,\n//   batch_op_each_target_address_total_voting_weight_less_than,\n//   batch_op_each_target_address_total_voting_weight_in_range,\n//   batch_op_each_target_address_total_voting_weight_equals,\n//   batch_op_any_target_address_total_voting_weight_greater_than,\n//   batch_op_any_target_address_total_voting_weight_less_than,\n//   batch_op_any_target_address_total_voting_weight_in_range,\n//   batch_op_each_target_address_total_dividend_weight_greater_than,\n//   batch_op_each_target_address_total_dividend_weight_less_than,\n//   batch_op_each_target_address_total_dividend_weight_in_range,\n//   batch_op_any_target_address_total_dividend_weight_greater_than,\n//   batch_op_any_target_address_total_dividend_weight_less_than,\n//   batch_op_any_target_address_total_dividend_weight_in_range,\n//   batch_op_each_target_address_owns_token_x_greater_than,\n//   batch_op_each_target_address_owns_token_x_less_than,\n//   batch_op_each_target_address_owns_token_x_in_range,\n//   batch_op_any_target_address_owns_token_x_greater_than,\n//   batch_op_any_target_address_owns_token_x_less_than,\n//   batch_op_any_target_address_owns_token_x_in_range\n// } from \"./SDK/conditionNodes/Condition_BatchOp\";\n\n// export {\n//   create_token_classes_any_token_dividend_weight_greater_than,\n//   create_token_classes_any_token_dividend_weight_less_than,\n//   create_token_classes_any_token_dividend_weight_in_range,\n//   create_token_classes_any_token_dividend_weight_equals,\n//   create_token_classes_any_voting_weight_greater_than,\n//   create_token_classes_any_voting_weight_less_than,\n//   create_token_classes_any_voting_weight_in_range,\n//   create_token_classes_any_voting_weight_equals\n// } from \"./SDK/conditionNodes/Condition_CreateTokenClass\";\n\n// export {\n//   timestamp_greater_than,\n//   timestamp_less_than,\n//   timestamp_in_range,\n//   date_year_greater_than,\n//   date_year_less_than,\n//   date_year_in_range,\n//   date_month_greater_than,\n//   date_month_less_than,\n//   date_month_in_range,\n//   date_day_greater_than,\n//   date_day_less_than,\n//   date_day_in_range,\n//   date_hour_greater_than,\n//   date_hour_less_than,\n//   date_hour_in_range,\n//   address_voting_weight_greater_than,\n//   address_voting_weight_less_than,\n//   address_voting_weight_in_range,\n//   address_dividend_weight_greater_than,\n//   address_dividend_weight_less_than,\n//   address_dividend_weight_in_range,\n//   address_token_x_greater_than,\n//   address_token_x_less_than,\n//   address_token_x_in_range,\n//   total_voting_weight_greater_than,\n//   total_voting_weight_less_than,\n//   total_voting_weight_in_range,\n//   total_dividend_weight_greater_than,\n//   total_dividend_weight_less_than,\n//   total_dividend_weight_in_range,\n//   total_cash_greater_than,\n//   total_cash_less_than,\n//   total_cash_in_range,\n//   total_cash_equals,\n//   token_in_list_voting_weight_greater_than,\n//   token_in_list_voting_weight_less_than,\n//   token_in_list_voting_weight_in_range,\n//   token_in_list_dividend_weight_greater_than,\n//   token_in_list_dividend_weight_less_than,\n//   token_in_list_dividend_weight_in_range,\n//   token_in_list_amount_greater_than,\n//   token_in_list_amount_less_than,\n//   token_in_list_amount_in_range,\n//   token_in_list_amount_equals\n// } from \"./SDK/conditionNodes/Condition_MachineState\";\n\n// export { change_member_role_to_any_role_equals, change_member_role_to_any_role_in_list, change_member_role_to_any_role_in_range, change_member_name_to_any_string_in_list, change_member_name_to_any_string_contains } from \"./SDK/conditionNodes/Condition_MembershipOp\";\n\n// export { operation_equals, operation_in_list, EnumOpcode } from \"./SDK/conditionNodes/Condition_Operation\";\n\n// export {\n//   operation_by_operator_since_last_time_greater_than,\n//   operation_by_operator_since_last_time_less_than,\n//   operation_by_operator_since_last_time_in_range,\n//   operation_global_since_last_time_greater_than,\n//   operation_global_since_last_time_less_than,\n//   operation_global_since_last_time_in_range,\n//   operation_by_any_address_in_list_since_last_time_greater_than,\n//   operation_by_any_address_in_list_since_last_time_less_than,\n//   operation_by_any_address_in_list_since_last_time_in_range,\n//   operation_by_each_address_in_list_since_last_time_greater_than,\n//   operation_by_each_address_in_list_since_last_time_less_than,\n//   operation_by_each_address_in_list_since_last_time_in_range\n// } from \"./SDK/conditionNodes/Condition_OperationLog\";\n\n// export {\n//   operator_name_equals,\n//   operator_role_equals,\n//   operator_address_equals,\n//   operator_role_greater_than,\n//   operator_role_less_than,\n//   operator_role_in_range,\n//   operator_role_in_list,\n//   operator_token_x_amount_greater_than,\n//   operator_token_x_amount_less_than,\n//   operator_token_x_amount_in_range,\n//   operator_token_x_amount_equals,\n//   operator_token_x_percentage_greater_than,\n//   operator_token_x_percentage_less_than,\n//   operator_token_x_percentage_in_range,\n//   operator_token_x_percentage_equals,\n//   operator_voting_weight_greater_than,\n//   operator_voting_weight_less_than,\n//   operator_voting_weight_in_range,\n//   operator_dividend_weight_greater_than,\n//   operator_dividend_weight_less_than,\n//   operator_dividend_weight_in_range,\n//   operator_withdrawable_cash_greater_than,\n//   operator_withdrawable_cash_less_than,\n//   operator_withdrawable_cash_in_range,\n//   operator_withdrawable_dividends_greater_than,\n//   operator_withdrawable_dividends_less_than,\n//   operator_withdrawable_dividends_in_range,\n//   operator_address_in_list\n// } from \"./SDK/conditionNodes/Condition_Operator\";\n\n// export {\n//   enable_any_before_op_plugin_index_in_list,\n//   enable_any_after_op_plugin_index_in_list,\n//   enable_each_before_op_plugin_index_in_list,\n//   enable_each_after_op_plugin_index_in_list,\n//   disable_any_before_op_plugin_index_in_list,\n//   disable_any_after_op_plugin_index_in_list,\n//   disable_each_before_op_plugin_index_in_list,\n//   disable_each_after_op_plugin_index_in_list,\n//   enable_any_before_op_plugin_index_in_range,\n//   enable_any_after_op_plugin_index_in_range,\n//   enable_each_before_op_plugin_index_in_range,\n//   enable_each_after_op_plugin_index_in_range,\n//   disable_any_before_op_plugin_index_in_range,\n//   disable_any_after_op_plugin_index_in_range,\n//   disable_each_before_op_plugin_index_in_range,\n//   disable_each_after_op_plugin_index_in_range,\n//   are_all_plugins_before_operation,\n//   are_all_plugins_after_operation,\n//   is_any_plugin_before_operation,\n//   is_any_plugin_after_operation,\n//   add_plugin_any_level_equals,\n//   add_plugin_any_level_in_list,\n//   add_plugin_any_level_in_range,\n//   add_plugin_any_level_greater_than,\n//   add_plugin_any_level_less_than,\n//   add_plugin_any_return_type_equals,\n//   add_plugin_any_voting_rule_index_in_list,\n//   add_any_voting_rule_is_absolute_majority,\n//   add_any_voting_rule_approval_percentage_in_range,\n//   add_any_voting_rule_token_class_contains\n// } from \"./SDK/conditionNodes/Condition_PluginAndVoting\";\n\n// export { program_op_length_greater_than, program_op_length_less_than, program_op_length_in_range, program_op_length_equals, program_contains_op, program_contains_op_in_list, program_every_op_equals, program_every_op_in_list } from \"./SDK/conditionNodes/Condition_Program\";\n\n// export { token_x_op_any_price_greater_than, token_x_op_any_price_less_than, token_x_op_any_price_in_range, token_x_op_any_price_equals } from \"./SDK/conditionNodes/Condition_TokenAndCash\";\n\n// export {\n//   add_withdrawable_balance_any_amount_greater_than,\n//   add_withdrawable_balance_any_amount_less_than,\n//   add_withdrawable_balance_any_amount_in_range,\n//   add_withdrawable_balance_any_amount_equals,\n//   reduce_withdrawable_balance_any_amount_greater_than,\n//   reduce_withdrawable_balance_any_amount_less_than,\n//   reduce_withdrawable_balance_any_amount_in_range,\n//   reduce_withdrawable_balance_any_amount_equals\n// } from \"./SDK/conditionNodes/Condition_Withdrawable\";"
  },
  {
    "path": "darc-js/src/sdk.ts",
    "content": ""
  },
  {
    "path": "darc-js/src/types/basicTypes.ts",
    "content": "import type {\n  BaseContract,\n  BigNumber,\n  BigNumberish,\n  BytesLike,\n  CallOverrides,\n  ContractTransaction,\n  Overrides,\n  PayableOverrides,\n  PopulatedTransaction,\n  Signer,\n  utils,\n} from \"ethers\";\n\nimport {Node} from \"../SDK/Node\";\n\ntype PromiseOrValue<T> = T | Promise<T>;\n\n\nexport type VotingRuleStruct = {\n  votingTokenClassList: PromiseOrValue<BigNumberish>[];\n  approvalThresholdPercentage: PromiseOrValue<BigNumberish>;\n  votingDurationInSeconds: PromiseOrValue<BigNumberish>;\n  executionPendingDurationInSeconds: PromiseOrValue<BigNumberish>;\n  bIsEnabled: PromiseOrValue<boolean>;\n  notes: PromiseOrValue<string>;\n  bIsAbsoluteMajority: PromiseOrValue<boolean>;\n};\n\nexport type VotingRuleStructOutput = [\n  BigNumber[],\n  BigNumber,\n  BigNumber,\n  BigNumber,\n  boolean,\n  string,\n  boolean\n] & {\n  votingTokenClassList: BigNumber[];\n  approvalThresholdPercentage: BigNumber;\n  votingDurationInSeconds: BigNumber;\n  executionPendingDurationInSeconds: BigNumber;\n  bIsEnabled: boolean;\n  notes: string;\n  bIsAbsoluteMajority: boolean;\n};\n\nexport type NodeParamStruct = {\n  STRING_ARRAY: PromiseOrValue<string>[];\n  UINT256_2DARRAY: PromiseOrValue<BigNumberish>[][];\n  ADDRESS_2DARRAY: PromiseOrValue<string>[][];\n  BYTES: PromiseOrValue<BytesLike>;\n};\n\nexport type NodeParamStructOutput = [\n  string[],\n  BigNumber[][],\n  string[][],\n  string[][],\n  string\n] & {\n  STRING_ARRAY: string[];\n  UINT256_2DARRAY: BigNumber[][];\n  ADDRESS_2DARRAY: string[][];\n  BYTES: string;\n};\n\nexport type ConditionNodeStruct = {\n  id: PromiseOrValue<BigNumberish>;\n  nodeType: PromiseOrValue<BigNumberish>;\n  logicalOperator: PromiseOrValue<BigNumberish>;\n  conditionExpression: PromiseOrValue<BigNumberish>;\n  childList: PromiseOrValue<BigNumberish>[];\n  param: NodeParamStruct;\n};\n\nexport type ConditionNodeStructOutput = [\n  BigNumber,\n  number,\n  number,\n  number,\n  BigNumber[],\n  NodeParamStructOutput\n] & {\n  id: BigNumber;\n  nodeType: number;\n  logicalOperator: number;\n  conditionExpression: number;\n  childList: BigNumber[];\n  param: NodeParamStructOutput;\n};\n\nexport type PluginStruct = {\n  returnType: PromiseOrValue<BigNumberish>;\n  level: PromiseOrValue<BigNumberish>;\n  conditionNodes: ConditionNodeStruct[];\n  votingRuleIndex: PromiseOrValue<BigNumberish>;\n  notes: PromiseOrValue<string>;\n  bIsEnabled: PromiseOrValue<boolean>;\n  bIsBeforeOperation: PromiseOrValue<boolean>;\n};\n\nexport type PluginStructWithNode = {\n  returnType: PromiseOrValue<BigNumberish>;\n  level: PromiseOrValue<BigNumberish>;\n  conditionNodes: Node;\n  votingRuleIndex: PromiseOrValue<BigNumberish>;\n  notes: PromiseOrValue<string>;\n  bIsEnabled: PromiseOrValue<boolean>;\n  bIsBeforeOperation: PromiseOrValue<boolean>;\n};\n\nexport type PluginStructOutput = [\n  number,\n  BigNumber,\n  ConditionNodeStructOutput[],\n  BigNumber,\n  string,\n  boolean,\n  boolean,\n  boolean\n] & {\n  returnType: number;\n  level: BigNumber;\n  conditionNodes: ConditionNodeStructOutput[];\n  votingRuleIndex: BigNumber;\n  notes: string;\n  bIsEnabled: boolean;\n  bIsBeforeOperation: boolean;\n};\n\nexport type ParamStruct = {\n  STRING_ARRAY: PromiseOrValue<string>[];\n  BOOL_ARRAY: PromiseOrValue<boolean>[];\n  VOTING_RULE_ARRAY: VotingRuleStruct[];\n  PLUGIN_ARRAY: PluginStruct[];\n  PARAMETER_ARRAY: PromiseOrValue<BigNumberish>[];\n  UINT256_2DARRAY: PromiseOrValue<BigNumberish>[][];\n  ADDRESS_2DARRAY: PromiseOrValue<string>[][];\n  BYTES: PromiseOrValue<BytesLike>;\n};\n\nexport type ParamStructOutput = [\n  string[],\n  boolean[],\n  VotingRuleStructOutput[],\n  PluginStructOutput[],\n  number[],\n  BigNumber[][],\n  string[][],\n  string\n] & {\n  STRING_ARRAY: string[];\n  BOOL_ARRAY: boolean[];\n  VOTING_RULE_ARRAY: VotingRuleStructOutput[];\n  PLUGIN_ARRAY: PluginStructOutput[];\n  PARAMETER_ARRAY: number[];\n  UINT256_2DARRAY: BigNumber[][];\n  ADDRESS_2DARRAY: string[][];\n  BYTES: string;\n};\n\nexport type OperationStruct = {\n  operatorAddress: PromiseOrValue<string>;\n  opcode: PromiseOrValue<BigNumberish>;\n  param: ParamStruct;\n};\n\nexport type OperationStructOutput = [string, number, ParamStructOutput] & {\n  operatorAddress: string;\n  opcode: number;\n  param: ParamStructOutput;\n};\n\nexport type ProgramStruct = {\n  programOperatorAddress: PromiseOrValue<string>;\n  operations: OperationStruct[];\n  notes: PromiseOrValue<string>;\n};\n\nexport type ProgramStructOutput = [string, OperationStructOutput[], string] & {\n  programOperatorAddress: string;\n  operations: OperationStructOutput[];\n  notes: string;\n};"
  },
  {
    "path": "darc-js/tests/basic-DARC-test/dashboard-test.ts",
    "content": "import {ethers} from 'ethers';\nimport { expect } from 'chai';\nimport { deployDARC } from '../../src/deployDARC/deployDARC';\n\nimport 'mocha';\n//import { setTimeout } from \"timers/promises\";\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/'); \nimport { DARC_VERSION, darcBinary } from '../../src/darcBinary/darcBinary';\nimport * as DARC from '../../src/DARC/DARC';\nimport { OperationStruct, ProgramStruct } from '../../src/types/basicTypes';\n\ndescribe('class DARC dashboard test', \n  () => { \n    it('should return true', async () => { \n\n\n      /**\n       * create a signer with a private key\n       * Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)\n       * Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\n       * \n       * (This is a test account, do not use it for anything other than testing)\n       */\n\n      const provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n      const signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\n\n      const wallet_address = ethers.utils.getAddress('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266');\n\n\n      const darc_contract_address = \n      await deployDARC(DARC_VERSION.Latest, signer);\n\n      console.log(\"Class DARC dashboard test - deployed at: \" + darc_contract_address);\n\n      const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n      const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n      const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n  \n      // create a token class first\n      //const my_addr = await darc.getMyInfo();\n      //console.log(\"my_addr: \" + my_addr);\n      //console.log(JSON.stringify(wallet_address));\n\n      const mint_and_transfer_program:ProgramStruct = {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"mint_and_transfer_program\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0), BigInt(1)],  // token class = 0\n                [BigInt(100), BigInt(200)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n              ],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 3, // transfer tokens\n            param:{              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0),BigInt(0), BigInt(1), BigInt(1)],  // token class = 0\n                [BigInt(10), BigInt(20), BigInt(30), BigInt(40)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [target1, target2, target1, target2], \n              ],\n              BYTES: []\n            }\n          }\n        ], \n      };\n\n      const create_mint_and_transter_program:ProgramStruct = {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"create_token_class_mint_and_transter_program\",\n        operations: [{\n            operatorAddress: programOperatorAddress,\n            opcode: 2, // create token class\n            param: {\n              \n              \n              STRING_ARRAY: [\"Class1\", \"Class2\"],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                // [BigInt(0), BigInt(1)],\n                // [BigInt(10), BigInt(1)],\n                // [BigInt(10), BigInt(1)],\n                [BigInt(0), BigInt(1)],\n                [BigInt(1000), BigInt(200)],\n                [BigInt(300), BigInt(400)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0), BigInt(1)],  // token class = 0\n                [BigInt(100), BigInt(200)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n              ],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 3, // transfer tokens\n            param:{\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0),BigInt(0), BigInt(1), BigInt(1)],  // token class = 0\n                [BigInt(10), BigInt(20), BigInt(30), BigInt(40)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [target1, target2, target1, target2], \n              ],\n              BYTES: []\n            }\n          }\n        ], \n      };\n      const param = {\n        address: darc_contract_address,\n        wallet: signer,\n        provider: provider\n      };\n\n      const attached_local_darc2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer,\n        version: DARC_VERSION.Latest,\n      });\n\n      console.log(\"The attached contract of local_darc 2 is \" + attached_local_darc2.address());\n\n      await new Promise(resolve1 => setTimeout(resolve1, 100)); \n      // check the number of token classes. If it is 0, then create a token class first\n      const token_class_count = await attached_local_darc2.getNumberOfTokenClasses();\n\n      //console.log(\"token_class_count: \" + token_class_count.toString());\n\n      console.log(token_class_count.toString() === \"0\");\n      if (token_class_count.toString() === \"0\") {\n        await attached_local_darc2.entrance(create_mint_and_transter_program);\n        await attached_local_darc2.entrance(mint_and_transfer_program);\n\n      }\n      else {\n        await attached_local_darc2.entrance(mint_and_transfer_program);\n      }\n\n      //// Delay of 1000ms (1 second)\n      //await new Promise(resolve1 => setTimeout(resolve1, 100)); \n      // console.log(attached_local_darc2.address());\n      // console.log(\"Here is the token owner balance: \");\n      // console.log(\"target1: \" + target1);\n\n      const balance = await attached_local_darc2.getTokenOwnerBalance(BigInt(0), target1);\n      //console.log(\"balance: \" + balance.toString());\n\n      function json_stringifyWithBigInt(obj:any) {\n        return JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? `${v}n` : v);\n      }\n      //console.log(\"Token info: \\n\" + json_stringifyWithBigInt(await attached_local_darc2.getTokenInfo(BigInt(1))));\n\n      expect(balance.toString()).to.equal(\"20\");\n  }); \n});"
  },
  {
    "path": "darc-js/tests/basic-DARC-test/deploy-DARC-test.ts",
    "content": "import {ethers} from 'ethers';\nimport { expect } from 'chai';\nimport { deployDARC } from '../../src/deployDARC/deployDARC';\nimport {ProgramStruct} from '../../src/types/basicTypes';\n\nimport 'mocha';\n//import { setTimeout } from \"timers/promises\";\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/'); \n\nimport { DARC_VERSION, darcBinary } from '../../src/darcBinary/darcBinary';\nimport * as DARC from '../../src/DARC/DARC';\n\ndescribe('class DARC test', \n  () => { \n    it('should return true', async () => { \n\n\n      /**\n       * create a signer with a private key\n       * Account #0: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 (10000 ETH)\n       * Private Key: 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80\n       * \n       * (This is a test account, do not use it for anything other than testing)\n       */\n\n      const provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n      const signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\n\n      const wallet_address = ethers.utils.getAddress('0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266');\n\n\n      const darc_contract_address = \n      await deployDARC(DARC_VERSION.Latest, signer);\n\n      console.log(\"Class DARC test - deployed at: \" + darc_contract_address);\n\n      const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n      const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n      const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n  \n      // create a token class first\n      //const my_addr = await darc.getMyInfo();\n      //console.log(\"my_addr: \" + my_addr);\n      //console.log(JSON.stringify(wallet_address));\n\n      const mint_and_transfer_program:ProgramStruct = {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"mint_and_transfer_program\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0), BigInt(1)],  // token class = 0\n                [BigInt(100), BigInt(200)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n              ],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 3, // transfer tokens\n            param:{\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0),BigInt(0), BigInt(1), BigInt(1)],  // token class = 0\n                [BigInt(10), BigInt(20), BigInt(30), BigInt(40)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [target1, target2, target1, target2], \n              ],\n              BYTES: []\n            }\n          }\n        ], \n      };\n\n      const create_mint_and_transter_program: ProgramStruct = {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"create_token_class_mint_and_transter_program\",\n        operations: [{\n            operatorAddress: programOperatorAddress,\n            opcode: 2, // create token class\n            param: {\n              \n              \n              STRING_ARRAY: [\"Class1\", \"Class2\"],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                // [BigInt(0), BigInt(1)],\n                // [BigInt(10), BigInt(1)],\n                // [BigInt(10), BigInt(1)],\n                [BigInt(0), BigInt(1)],\n                [BigInt(1000), BigInt(200)],\n                [BigInt(300), BigInt(400)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0), BigInt(1)],  // token class = 0\n                [BigInt(100), BigInt(200)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n              ],\n              BYTES: []\n            }\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 3, // transfer tokens\n            param:{\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigInt(0),BigInt(0), BigInt(1), BigInt(1)],  // token class = 0\n                [BigInt(10), BigInt(20), BigInt(30), BigInt(40)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [target1, target2, target1, target2], \n              ],\n              BYTES: []\n            }\n          }\n        ], \n      };\n      const param = {\n        address: darc_contract_address,\n        wallet: signer,\n        provider: provider\n      };\n\n      const attached_local_darc2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer,\n        version: DARC_VERSION.Latest,\n      });\n\n      console.log(\"The attached contract of local_darc 2 is \" + attached_local_darc2.address());\n\n      await new Promise(resolve1 => setTimeout(resolve1, 100)); \n      // check the number of token classes. If it is 0, then create a token class first\n      const token_class_count = await attached_local_darc2.getNumberOfTokenClasses();\n\n      //console.log(\"token_class_count: \" + token_class_count.toString());\n\n      console.log(token_class_count.toString() === \"0\");\n      if (token_class_count.toString() === \"0\") {\n        await attached_local_darc2.entrance(create_mint_and_transter_program);\n        await attached_local_darc2.entrance(mint_and_transfer_program);\n\n      }\n      else {\n        await attached_local_darc2.entrance(mint_and_transfer_program);\n      }\n\n      //// Delay of 1000ms (1 second)\n      //await new Promise(resolve1 => setTimeout(resolve1, 100)); \n      // console.log(attached_local_darc2.address());\n      // console.log(\"Here is the token owner balance: \");\n      // console.log(\"target1: \" + target1);\n\n      const balance = await attached_local_darc2.getTokenOwnerBalance(BigInt(0), target1);\n      // console.log(\"balance: \" + balance.toString());\n\n      // function json_stringifyWithBigInt(obj: any) {\n      //   return JSON.stringify(obj, (_, v) => typeof v === 'bigint' ? `${v}n` : v);\n      // }\n\n      //console.log(\"Token info: \\n\" + json_stringifyWithBigInt(await attached_local_darc2.getTokenInfo(BigInt(1))));\n\n      expect(balance.toString()).to.equal(\"20\");\n  }); \n});"
  },
  {
    "path": "darc-js/tests/deploy-test.ts",
    "content": "import { DARC_VERSION } from '../src/darcBinary/darcBinary';\nimport { deployDARC } from '../src/deployDARC/deployDARC';\nimport { ethers } from 'ethers';\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\ndescribe('Deploy Test',\n  () => {\n    it('should deploy DARC successfully', async () => {\n      const address = await deployDARC(DARC_VERSION.Test, signer);\n\n      console.log(\"deployed at: \" + address);\n    });\n  }\n);"
  },
  {
    "path": "darc-js/tests/expression-test/expression-test.ts",
    "content": "import {EnumReturnType, executeOperationList, operator_address_equals} from \"../../src/darcjs\";\nimport { deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers, BigNumber } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\nimport { batch_add_and_enable_plugins, batch_mint_tokens, batch_create_token_classes, EnumOpcode } from \"../../src/darcjs\";\nimport {or, node, and, expression} from \"../../src/SDK/Node\";\nimport { transpileAndRun } from \"../../src/SDK/runtime\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// initialize signer 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 with private key\n\n\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\nconst signer1 = new ethers.Wallet('0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', provider);\nconst signer2 = new ethers.Wallet('0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', provider);\n\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n\nfunction toBigIntArray(array: number[]): bigint[] {\n  let bigIntArray: bigint[] = [];\n  for (let i = 0; i < array.length; i++) {\n    bigIntArray.push(BigInt(array[i]));\n  }\n  return bigIntArray;\n}\n\ndescribe('expression node basic test', () => {\n  it ('should run the program \"add and enable plugin\" with generated condition node list in SDK', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n\n        // operation 0\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n\n        // operation 1\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n\n        // operation 2\n        batch_add_and_enable_plugins(\n          [\n            // plugin 0: disable all operations\n            {\n              returnType: EnumReturnType.NO, // no\n              level: BigNumber.from(3), // level 3\n              votingRuleIndex: BigNumber.from(0),\n              notes: \"disable all program\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes:[{\n                id: BigNumber.from(0),\n                nodeType: BigNumber.from(3), // expression\n                logicalOperator: BigNumber.from(0), // no operator\n                conditionExpression: BigNumber.from(0), // always true\n                childList: [],\n                param: {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [],\n                  BYTES: []\n                }\n              }]\n            },\n            {\n              returnType: EnumReturnType.YES_AND_SKIP_SANDBOX, // yes and skip sandbox\n              level: BigInt(103),\n              votingRuleIndex: BigInt(0),\n              notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes: \n              or(\n                operator_address_equals(target1),\n                operator_address_equals(target2)\n              ).generateConditionNodeList()\n            }\n          ]\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    ).then(async ()=>{\n\n      const attached_local_darc_signer1 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer1,\n        version: DARC_VERSION.Latest,\n      });\n\n      const attached_local_darc_signer2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer2,\n        version: DARC_VERSION.Latest,\n      });\n\n      // signer 1 and signer 2 should be able to run the program\n      let isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer1,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer2,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      // and signer0 and programOperatorAddress should not be able to run the program\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n\n        isSuccess = false;\n      }\n      expect (isSuccess).to.equal(false);\n    });\n  });\n\n  it ('should also generate condition node automatically, without manually calling the function generateConditionNodeList', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n\n        // operation 0\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n\n        // operation 1\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n          \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n\n        // operation 2\n        batch_add_and_enable_plugins(\n          [\n            {\n              returnType: EnumReturnType.YES_AND_SKIP_SANDBOX, // yes and skip sandbox\n              level: BigInt(103),\n              votingRuleIndex: BigInt(0),\n              notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes: \n              or(\n                operator_address_equals(target1),\n                operator_address_equals(target2)\n              )\n            }\n          ]\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    );\n  });\n\n  it (\"should generate condition node successfully in bylaw script runtime\", async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n\n    const code = `\n\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n\n    batch_create_token_classes(['token_0', 'token_1'],\n    [0,1],\n    [10,20], \n    [20,30]);\n\n\n    batch_mint_tokens([ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n    \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n    [0, 1], [100,200]);\n\n    batch_add_and_enable_plugins(\n      [\n        // plugin 0: disable all operations\n        {\n          returnType: BigNumber.from(2), // no\n          level: BigNumber.from(3), // level 3\n          votingRuleIndex: BigNumber.from(0),\n          notes: \"disable all program\",\n          bIsEnabled: true,\n          bIsBeforeOperation: true,\n          conditionNodes: new TRUE() // always true\n        },\n        {\n          returnType: BigInt(4), // yes and skip sandbox\n          level: BigInt(103),\n          votingRuleIndex: BigInt(0),\n          notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n          bIsEnabled: true,\n          bIsBeforeOperation: true,\n          conditionNodes:\n          operator_address_equals(target1) | operator_address_equals(target2)\n              // or(\n              //   expression(3, {\n              //     STRING_ARRAY: [],\n              //     UINT256_2DARRAY: [],\n              //     ADDRESS_2DARRAY: [[target1]],\n              //     BYTES: []\n              //   }),\n              //   expression(3, {\n              //     STRING_ARRAY: [],\n              //     UINT256_2DARRAY: [],\n              //     ADDRESS_2DARRAY: [[target2]],\n              //     BYTES: []\n              //   })\n              // )\n        }\n      ]\n    )\n    `;\n    await transpileAndRun(code, signer, darc_contract_address, DARC_VERSION.Latest);\n    // it should \n\n\n    const attached_local_darc_signer1 = new DARC.DARC({\n      address: darc_contract_address,\n      wallet: signer1,\n      version: DARC_VERSION.Latest,\n    });\n\n    const attached_local_darc_signer2 = new DARC.DARC({\n      address: darc_contract_address,\n      wallet: signer2,\n      version: DARC_VERSION.Latest,\n    });\n\n    // signer 1 and signer 2 should be able to run the program\n    let isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer1,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n      isSuccess = false;\n    }\n\n    expect (isSuccess).to.equal(true);\n\n    isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer2,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n      isSuccess = false;\n    }\n\n    expect (isSuccess).to.equal(true);\n\n    // and signer0 and programOperatorAddress should not be able to run the program\n    isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n\n      isSuccess = false;\n    }\n    expect (isSuccess).to.equal(false);\n  });\n});"
  },
  {
    "path": "darc-js/tests/runtime-test/basic-runtime-test.ts",
    "content": "import {run, deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\n\n\n\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n/**\n * Here is the code:\n * 1. create a token class 0 with token info \"token_0\", voting weight 10, dividend weight 20\n *   create a token class 1 with token info \"token_1\", voting weight 20, dividend weight 30\n * 2. mint 100 token_0 and 200 token_1 to address 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266  \n */\nconst code = `\nbatch_create_token_classes(['token_0', 'token_1'],\n[0,1],\n[10,20], \n[20,30]);\nbatch_mint_tokens([ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n\"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n[0, 1], [100,200]);\n`;\n\ndescribe('Runtime execution test', () => {\n  it('should run the program', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n\n    await run(code, signer, darc_contract_address, DARC_VERSION.Latest).then(async ()=>{\n\n      const attached_local_darc2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer,\n        version: DARC_VERSION.Latest,\n      });\n\n      // read the token info and make sure that address 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 has 100 token_0 and 200 token_1\n      const token_info = await attached_local_darc2.getTokenInfo(BigInt(0));\n      const token_info1 = await attached_local_darc2.getTokenInfo(BigInt(1));\n      // check the token info\n      expect(token_info.votingWeight.toString()).to.equal(\"10\");\n      expect(token_info.dividendWeight.toString()).to.equal(\"20\");\n      expect(token_info.tokenInfo).to.equal(\"token_0\");\n      expect(token_info.totalSupply.toString()).to.equal(\"100\");\n      // check the token info 1\n      expect(token_info1.votingWeight.toString()).to.equal(\"20\");\n      expect(token_info1.dividendWeight.toString()).to.equal(\"30\");\n      expect(token_info1.tokenInfo).to.equal(\"token_1\");\n      expect(token_info1.totalSupply.toString()).to.equal(\"200\");\n\n      // check the token owner balance\n      const token_owner_balance = await attached_local_darc2.getTokenOwnerBalance(BigInt(0),my_wallet_address);\n      expect(token_owner_balance.toString()).to.equal(\"100\");\n      const token_owner_balance1 = await attached_local_darc2.getTokenOwnerBalance(BigInt(1),my_wallet_address);\n      expect(token_owner_balance1.toString()).to.equal(\"200\");\n    });\n\n  });\n});"
  },
  {
    "path": "darc-js/tests/runtime-test/pressure-mint-token-test.ts",
    "content": "import {run, deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\n\n\n\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n/**\n * Here is the code:\n * 1. create a token class 0 with token info \"token_0\", voting weight 10, dividend weight 20\n *   create a token class 1 with token info \"token_1\", voting weight 20, dividend weight 30\n * 2. mint 100 token_0 and 200 token_1 to address 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266  \n */\n\n\nconst code = `\nbatch_create_token_classes(['token_0', 'token_1'],\n[0,1],\n[10,20], \n[20,30]);\nbatch_mint_tokens([ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n\"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n[0, 1], [100,200]);\n`;\n\n\n\nconst code_pressure = `\naddressList = [];\ntokenClassList1 = [];\ntokenClassList2 = [];\ntokenNumberList = [];\nfor (let i = 0; i < 1000; i++) {\n  addressList.push(\"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\");\n  tokenClassList1.push(0);\n  tokenClassList2.push(1);\n  tokenNumberList.push(100);\n}\nbatch_create_token_classes(['token_0', 'token_1'],\n[0,1],\n[10,20], \n[20,30]);\nbatch_mint_tokens(addressList, tokenClassList1, tokenNumberList);\n`;\n\ndescribe('Pressure mint token execution test', () => {\n  it('should run the program', async () => {\n    await deployDARC(DARC_VERSION.Latest, signer).then(async (address:string) => {\n      await run(code_pressure, signer, address).then(async ()=>{\n\n        const attached_local_darc2 = new DARC.DARC({\n          address: address,\n          wallet: signer,\n          version: DARC_VERSION.Latest,\n        });\n  \n  \n        const token_owner_balance = await attached_local_darc2.getTokenOwnerBalance(BigInt(0),my_wallet_address);\n  \n        //console.log(\"token_info\", token_owner_balance);\n        expect(token_owner_balance.toString()).to.equal(\"100000\");\n      });\n    }\n    );\n  \n  });\n});"
  },
  {
    "path": "darc-js/tests/runtime-test/pressure-offer-dividends-test.ts",
    "content": ""
  },
  {
    "path": "darc-js/tests/runtime-test/transpileAndRun.ts",
    "content": "import {executeOperationList} from \"../../src/darcjs\";\nimport {run, deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers, BigNumber } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\nimport { batch_add_and_enable_plugins, batch_mint_tokens, batch_create_token_classes } from \"../../src/darcjs\";\nimport {or, node, and, expression} from \"../../src/SDK/Node\";\nimport { transpileAndRun } from \"../../src/SDK/runtime\";\nimport { transpile } from \"../../src/darcjs\";\n\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// initialize signer 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 with private key\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\nconst signer1 = new ethers.Wallet('0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', provider);\nconst signer2 = new ethers.Wallet('0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', provider);\n\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n\nfunction toBigIntArray(array: number[]): bigint[] {\n  let bigIntArray: bigint[] = [];\n  for (let i = 0; i < array.length; i++) {\n    bigIntArray.push(BigInt(array[i]));\n  }\n  return bigIntArray;\n}\n\ndescribe('transpile and execution test', () => {\n  it ('should run the by-law script with expression node, logical operation node generated successfully', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n\n    const code = `\n\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n\n    batch_create_token_classes(['token_0', 'token_1'],\n    [0,1],\n    [10,20], \n    [20,30]);\n\n\n    batch_mint_tokens([ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n    \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n    [0, 1], [100,200]);\n\n    batch_add_and_enable_plugins(\n      [\n        // plugin 0: disable all operations\n        {\n          returnType: BigNumber.from(2), // no\n          level: BigNumber.from(3), // level 3\n          votingRuleIndex: BigNumber.from(0),\n          notes: \"disable all program\",\n          bIsEnabled: true,\n          bIsBeforeOperation: true,\n          conditionNodes: new TRUE() // always true\n        },\n        {\n          returnType: BigInt(4), // yes and skip sandbox\n          level: BigInt(103),\n          votingRuleIndex: BigInt(0),\n          notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n          bIsEnabled: true,\n          bIsBeforeOperation: true,\n          conditionNodes:\n              or(\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target1]],\n                  BYTES: []\n                }),\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target2]],\n                  BYTES: []\n                })\n              )\n        }\n      ]\n    )\n    `;\n    await transpileAndRun(code, signer, darc_contract_address, DARC_VERSION.Latest);\n    // it should \n\n\n    const attached_local_darc_signer1 = new DARC.DARC({\n      address: darc_contract_address,\n      wallet: signer1,\n      version: DARC_VERSION.Latest,\n    });\n\n    const attached_local_darc_signer2 = new DARC.DARC({\n      address: darc_contract_address,\n      wallet: signer2,\n      version: DARC_VERSION.Latest,\n    });\n\n    // signer 1 and signer 2 should be able to run the program\n    let isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer1,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n      isSuccess = false;\n    }\n\n    expect (isSuccess).to.equal(true);\n\n    isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer2,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n      isSuccess = false;\n    }\n\n    expect (isSuccess).to.equal(true);\n\n    // and signer0 and programOperatorAddress should not be able to run the program\n    isSuccess = true;\n    try{\n      await executeOperationList([\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n      );\n    }\n    catch(e){\n\n      isSuccess = false;\n    }\n    expect (isSuccess).to.equal(false);\n  });\n});"
  },
  {
    "path": "darc-js/tests/runtime-test/transpiler-operator-test.ts",
    "content": "\nimport { expect } from 'chai';\nimport 'mocha';\nimport { transpile } from '../../src/SDK/transpiler';\nimport { Node } from '@babel/types';\n\ndescribe('Operator Test', \n  () => { \n    it('should return true', () => { \n\n      const code = `\n      let ConditionNode1 = new ConditionNode(ConditionNodeType.ExpressionNode, Expression.Operation_Equals, null, [1, 2]);\n      let ConditionNode2 = new ConditionNode(ConditionNodeType.ExpressionNode, Expression.Operation_Equals, null, [1, 2]);\n\n      let newConditionNode = ConditionNode1 + ConditionNode2;\n      `; \n      \n\n      const transpiled_result = transpile(code);\n\n      console.log(transpiled_result);\n      expect(true).to.equal(true);\n  }); \n});"
  },
  {
    "path": "darc-js/tests/sdk-test/basic-node-test.ts",
    "content": "import { expect } from 'chai';\nimport {Node, AND, OR, NOT, EXPRESSION, TRUE, FALSE, NodeType} from '../../src/SDK/Node';\n\nimport 'mocha';\n\n\n\ndescribe('darc.js SDK Node test', \n  () => { \n    it('should pass test case 1', async () => { \n\n      // create a new AND node with 10 expression\n      const andNode = new AND(\n        new EXPRESSION(7),\n        new EXPRESSION(1),\n        new EXPRESSION(2),\n      );\n\n      // create a new OR node with 10 expression\n      const orNode = new OR(\n        new EXPRESSION(3),\n        new EXPRESSION(4),\n        new EXPRESSION(5),\n      );\n\n      const AND_and_OR = new AND(\n        andNode,\n        orNode,\n      ); // this node will merge the andNode.\n\n      // serialize the AND_and_OR node\n      const serialized_AND_and_OR = AND_and_OR.generateConditionNodeList();\n\n      // 8 nodes in total\n      expect(serialized_AND_and_OR.length).to.equal(8);\n      \n      // all the nodes should have the correct id sequentially  \n      for (let i = 0; i < serialized_AND_and_OR.length; i++) {\n        expect(serialized_AND_and_OR[i].id).to.equal(BigInt(i));\n      }\n\n      // the first node should be AND node\n      expect(serialized_AND_and_OR[0].nodeType).to.equal(2);\n      expect(serialized_AND_and_OR[0].logicalOperator).to.equal(1);\n  }); \n\n  it ('should pass test case 2', async () => {\n\n    const expressionNode = new EXPRESSION(7);\n    const result = expressionNode.generateConditionNodeList();\n    expect(result.length).to.equal(1);\n    expect(result[0].id).to.equal(BigInt(0));\n  });\n\n  it ('should pass test case 3', async () => {\n    const trueNode = new TRUE();\n    const result = trueNode.generateConditionNodeList();\n    expect(result.length).to.equal(1);\n    expect(result[0].id).to.equal(BigInt(0));\n    expect (result[0].nodeType).to.equal(3);\n\n    const falseNode = new FALSE();\n    const result1 = falseNode.generateConditionNodeList();\n    expect(result1.length).to.equal(1);\n    expect(result1[0].id).to.equal(BigInt(0));\n    expect (result1[0].nodeType).to.equal(4);\n\n  });\n\n  it ('should pass test case 4', async () => {\n\n    const ORNode = new OR(\n      new OR(\n        new EXPRESSION(1),\n        new EXPRESSION(2),\n        new EXPRESSION(3),\n      ),\n\n      new OR(\n        new EXPRESSION(4),\n        new EXPRESSION(5),\n        new EXPRESSION(6),\n      ),\n\n      new OR(\n        new EXPRESSION(7),\n        new EXPRESSION(8),\n        new EXPRESSION(9),\n      ),\n    );\n\n    // should be a big OR node with 9 expression nodes\n    const result = ORNode.generateConditionNodeList();\n    expect(result.length).to.equal(10);\n    expect(result[0].nodeType).to.equal(2);\n    expect(result[0].logicalOperator).to.equal(2);\n    for (let i = 1; i < result.length; i++) {\n      expect(result[i].nodeType).to.equal(1);\n      expect(result[i].conditionExpression).to.equal(i);\n      expect(result[i].logicalOperator).to.equal(0);\n      expect(result[i].childList.length).to.equal(0);\n    }\n\n    // child list should be correct\n    expect(result[0].childList.length).to.equal(9);\n    for (let i = 1; i < result.length; i++) {\n      expect(result[0].childList[i - 1]).to.equal(BigInt(i));\n    }\n\n  });\n\n  it ('should pass test case 5', async () => {\n    const ANDNode = new AND(\n      new AND(\n        new EXPRESSION(1),\n        new EXPRESSION(2),\n        new EXPRESSION(3),\n      ),\n\n      new AND(\n        new EXPRESSION(4),\n        new EXPRESSION(5),\n        new EXPRESSION(6),\n      ),\n\n      new AND(\n        new EXPRESSION(7),\n        new EXPRESSION(8),\n        new EXPRESSION(9),\n      ),\n    );\n\n    // should be a big OR node with 9 expression nodes\n    const result = ANDNode.generateConditionNodeList();\n    expect(result.length).to.equal(10);\n    expect(result[0].nodeType).to.equal(2);\n    expect(result[0].logicalOperator).to.equal(1);\n    for (let i = 1; i < result.length; i++) {\n      expect(result[i].nodeType).to.equal(1);\n      expect(result[i].conditionExpression).to.equal(i);\n      expect(result[i].logicalOperator).to.equal(0);\n      expect(result[i].childList.length).to.equal(0);\n    }\n\n    // child list should be correct\n    expect(result[0].childList.length).to.equal(9);\n    for (let i = 1; i < result.length; i++) {\n      expect(result[0].childList[i - 1]).to.equal(BigInt(i));\n    }\n  });\n\n});"
  },
  {
    "path": "darc-js/tests/sdk-test/sdk-node-generation-test.ts",
    "content": "import {executeOperationList} from \"../../src/darcjs\";\nimport {run, deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers, BigNumber } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\nimport { batch_add_and_enable_plugins, batch_mint_tokens, batch_create_token_classes } from \"../../src/darcjs\";\nimport {or, node, and, expression} from \"../../src/SDK/Node\";\n\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// initialize signer 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 with private key\n\n\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\nconst signer1 = new ethers.Wallet('0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', provider);\nconst signer2 = new ethers.Wallet('0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', provider);\n\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n\nfunction toBigIntArray(array: number[]): bigint[] {\n  let bigIntArray: bigint[] = [];\n  for (let i = 0; i < array.length; i++) {\n    bigIntArray.push(BigInt(array[i]));\n  }\n  return bigIntArray;\n}\n\ndescribe('SDK node generation test', () => {\n  it ('should run the program \"add and enable plugin\" with generated condition node list in SDK', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n\n        // operation 0\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n\n        // operation 1\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n\n        // operation 2\n        batch_add_and_enable_plugins(\n          [\n            // plugin 0: disable all operations\n            {\n              returnType: BigNumber.from(2), // no\n              level: BigNumber.from(3), // level 3\n              votingRuleIndex: BigNumber.from(0),\n              notes: \"disable all program\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes:[{\n                id: BigNumber.from(0),\n                nodeType: BigNumber.from(3), // expression\n                logicalOperator: BigNumber.from(0), // no operator\n                conditionExpression: BigNumber.from(0), // always true\n                childList: [],\n                param: {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [],\n                  BYTES: []\n                }\n              }]\n            },\n            {\n              returnType: BigInt(4), // yes and skip sandbox\n              level: BigInt(103),\n              votingRuleIndex: BigInt(0),\n              notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes: \n              or(\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target1]],\n                  BYTES: []\n                }),\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target2]],\n                  BYTES: []\n                })\n              ).generateConditionNodeList()\n            }\n          ]\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    ).then(async ()=>{\n\n      const attached_local_darc_signer1 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer1,\n        version: DARC_VERSION.Latest,\n      });\n\n      const attached_local_darc_signer2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer2,\n        version: DARC_VERSION.Latest,\n      });\n\n      // signer 1 and signer 2 should be able to run the program\n      let isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer1,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer2,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      // and signer0 and programOperatorAddress should not be able to run the program\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n\n        isSuccess = false;\n      }\n      expect (isSuccess).to.equal(false);\n    });\n  });\n\n  it ('should also generate condition node automatically, without manually calling the function generateConditionNodeList', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n\n        // operation 0\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n\n        // operation 1\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \n          \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n\n        // operation 2\n        batch_add_and_enable_plugins(\n          [\n            {\n              returnType: BigInt(4), // yes and skip sandbox\n              level: BigInt(103),\n              votingRuleIndex: BigInt(0),\n              notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes: \n              or(\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target1]],\n                  BYTES: []\n                }),\n                expression(3, {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [[target2]],\n                  BYTES: []\n                })\n              )\n            }\n          ]\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    );\n  });\n});"
  },
  {
    "path": "darc-js/tests/sdk-test/sdk-test.ts",
    "content": "import {executeOperationList} from \"../../src/darcjs\";\nimport {run, deployDARC, DARC_VERSION} from '../../src/darcjs';\nimport { ethers, BigNumber } from 'ethers';\nimport * as DARC from '../../src/DARC/DARC';\nimport 'mocha';\nimport { expect } from 'chai';\nimport { batch_add_and_enable_plugins, batch_mint_tokens, batch_create_token_classes } from \"../../src/darcjs\";\nimport {or, node, and, expression} from \"../../src/SDK/Node\";\n\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst provider = new ethers.providers.JsonRpcProvider('http://127.0.0.1:8545/');\n\n// initialize signer 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 with private key\n\n\nconst signer = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80', provider);\n\nconst signer1 = new ethers.Wallet('0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a', provider);\nconst signer2 = new ethers.Wallet('0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6', provider);\n\nconst my_wallet_address = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n\nfunction toBigIntArray(array: number[]): bigint[] {\n  let bigIntArray: bigint[] = [];\n  for (let i = 0; i < array.length; i++) {\n    bigIntArray.push(BigInt(array[i]));\n  }\n  return bigIntArray;\n}\n\ndescribe('SDK execution test', () => {\n  it('should run the program in SDK', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    ).then(async ()=>{\n\n      const attached_local_darc2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer,\n        version: DARC_VERSION.Latest,\n      });\n\n      \n      // read the token info and make sure that address 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 has 100 token_0 and 200 token_1\n      const token_info = await attached_local_darc2.getTokenInfo(BigInt(0));\n      const token_info1 = await attached_local_darc2.getTokenInfo(BigInt(1));\n      // check the token info\n      expect(token_info.votingWeight.toString()).to.equal(\"10\");\n      expect(token_info.dividendWeight.toString()).to.equal(\"20\");\n      expect(token_info.tokenInfo).to.equal(\"token_0\");\n      expect(token_info.totalSupply.toString()).to.equal(\"100\");\n      // check the token info 1\n      expect(token_info1.votingWeight.toString()).to.equal(\"20\");\n      expect(token_info1.dividendWeight.toString()).to.equal(\"30\");\n      expect(token_info1.tokenInfo).to.equal(\"token_1\");\n      expect(token_info1.totalSupply.toString()).to.equal(\"200\");\n\n      // check the token owner balance\n      const token_owner_balance = await attached_local_darc2.getTokenOwnerBalance(BigInt(0),my_wallet_address);\n      expect(token_owner_balance.toString()).to.equal(\"100\");\n      const token_owner_balance1 = await attached_local_darc2.getTokenOwnerBalance(BigInt(1),my_wallet_address);\n      expect(token_owner_balance1.toString()).to.equal(\"200\");\n    });\n\n  });\n\n\n  it('should run the program \"add and enable plugin\" in SDK', async () => {\n    const darc_contract_address = await deployDARC(DARC_VERSION.Latest, signer);\n    await executeOperationList(\n      [\n\n        // operation 0\n        batch_create_token_classes(\n          ['token_0', 'token_1'],\n          toBigIntArray([0,1]),\n          toBigIntArray([10,20]), \n          toBigIntArray([20,30])\n        ),\n\n        // operation 1\n        batch_mint_tokens(\n          [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n          toBigIntArray([0, 1]), \n          toBigIntArray([100,200])\n        ),\n\n        // operation 2\n        batch_add_and_enable_plugins(\n          [\n            // plugin 0: disable all operations\n            {\n              returnType: BigNumber.from(2), // no\n              level: BigNumber.from(3), // level 3\n              votingRuleIndex: BigNumber.from(0),\n              notes: \"disable all program\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes:[{\n                id: BigNumber.from(0),\n                nodeType: BigNumber.from(3), // expression\n                logicalOperator: BigNumber.from(0), // no operator\n                conditionExpression: BigNumber.from(0), // always true\n                childList: [],\n                param: {\n                  STRING_ARRAY: [],\n                  UINT256_2DARRAY: [],\n                  ADDRESS_2DARRAY: [],\n                  BYTES: []\n                }\n              }]\n            },\n            {\n              returnType: BigInt(4), // yes and skip sandbox\n              level: BigInt(103),\n              votingRuleIndex: BigInt(0),\n              notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n              bIsEnabled: true,\n              bIsBeforeOperation: true,\n              conditionNodes:[\n                // node 0: boolean operator OR\n                {\n                  id: BigNumber.from(0),\n                  nodeType: BigNumber.from(2), // logical operator\n                  logicalOperator: BigNumber.from(2), // OR\n                  conditionExpression: 0, // no expression\n                  childList: [BigNumber.from(1), BigNumber.from(2)],\n                  param: {\n                    STRING_ARRAY: [],\n                    UINT256_2DARRAY: [],\n                    ADDRESS_2DARRAY: [],\n                    BYTES: []\n                  }\n                },\n        \n                // node 1: operatorAddress == target1\n                {\n                  id : BigNumber.from(1),\n                  nodeType: BigNumber.from(1), // expression\n                  logicalOperator: BigNumber.from(0), // no operator\n                  conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n                  childList: [],\n                  param: {\n                    STRING_ARRAY: [],\n                    UINT256_2DARRAY: [],\n                    ADDRESS_2DARRAY: [[target1]],\n                    BYTES: []\n                  }\n                },\n        \n                // node 2: operatorAddress == target2\n                {\n                  id : BigNumber.from(2),\n                  nodeType: BigNumber.from(1), // expression\n                  logicalOperator: BigNumber.from(0), // no operator\n                  conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n                  childList: [],\n                  param: {\n                    STRING_ARRAY: [],\n                    UINT256_2DARRAY: [],\n                    ADDRESS_2DARRAY: [[target2]],\n                    BYTES: []\n                  }\n                }\n              ]\n            }\n          ]\n        )\n      ],\n      signer,\n      darc_contract_address,\n      \"test program\"\n    ).then(async ()=>{\n\n      const attached_local_darc_signer1 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer1,\n        version: DARC_VERSION.Latest,\n      });\n\n      const attached_local_darc_signer2 = new DARC.DARC({\n        address: darc_contract_address,\n        wallet: signer2,\n        version: DARC_VERSION.Latest,\n      });\n\n      // signer 1 and signer 2 should be able to run the program\n      let isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer1,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer2,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n\n      expect (isSuccess).to.equal(true);\n\n      // and signer0 and programOperatorAddress should not be able to run the program\n      isSuccess = true;\n      try{\n        await executeOperationList([\n          batch_mint_tokens(\n            [ \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\", \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\"],\n            toBigIntArray([0, 1]), \n            toBigIntArray([100,200])\n          )\n        ],\n        signer,\n        darc_contract_address,\n        \"test program\"\n        );\n      }\n      catch(e){\n        isSuccess = false;\n      }\n      expect (isSuccess).to.equal(false);\n    });\n  });\n});"
  },
  {
    "path": "darc-js/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"outDir\": \"dist\",\n    \"target\": \"ES6\",\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"sourceMap\": true,\n    \"strict\": true,\n    \"moduleResolution\":\"node\",\n    \"resolveJsonModule\": true,\n    \"rootDir\": \"./src\"\n  },\n  \"include\": [\"src\"],\n}"
  },
  {
    "path": "darc-protocol/README.md",
    "content": "# DARC Protocol\n\nThis is the core protocol for the DARC(Decentralized Autonomous Regulated Corporation) project.\n\n## Installation\n\nSince Hardhat does not support any package management tools except npm, you need to use npm only to install the dependencies.\n\nTo install all dependencies, run the following command:\n\n```bash\nnpm install\n```\n\n## Compile\n\nTo compile the contracts, run the following command:\n\n```bash\nnpx hardhat compile\n```\n\nThe compiled contracts will be stored in the `artifacts` directory.\n\n## Test\n\nTo run the tests, first start the local hardhat network by running the following command:\n\n```bash\nnpx hardhat node\n```\n\nThen open another terminal and run all unit tests by running the following command:\n\n```bash\nnpx hardhat test\n```"
  },
  {
    "path": "darc-protocol/contracts/protocol/DARC.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"./Runtime/Runtime.sol\";\nimport \"./Program.sol\";\nimport \"hardhat/console.sol\";\nimport \"./Utilities/ErrorMsg.sol\";\nimport \"./Dashboard/Dashboard.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n\n/**\n * @title The base and top-level DARC virtual machine contract of DARC protocol\n * @notice This is the final and top-level contract of DARC protocol, which inherits all the other contracts\n */\ncontract DARC is Runtime, Dashboard {\n\n  /**\n   * @notice The core and only entrance for the DARC virtual machine\n   * @param program The program to be executed\n   * @return string The return message of the program\n   */\n  function entrance(Program memory program) public payable returns (string memory) {\n    require(program.programOperatorAddress == msg.sender, \n    string.concat(string.concat(\"Invalid program address. Msg.sender: \", StringUtils.toAsciiString(msg.sender)), string.concat(\", and program operator address: \", StringUtils.toAsciiString(program.programOperatorAddress))));\n    for (uint256 opIdx; opIdx < program.operations.length;opIdx++) {\n      require(program.operations[opIdx].operatorAddress == msg.sender, \n      string.concat(string.concat(\"Invalid program address. Msg.sender: \", StringUtils.toAsciiString(msg.sender)), string.concat(\", and program operator address: \", StringUtils.toAsciiString(program.operations[opIdx].operatorAddress))));\n    }\n    return runtimeEntrance(program);\n  }\n\n\n  /**\n   * This is the only way to withdraw cash from the DARC virtual machine\n   * @param amount The amount of cash to be withdrawn\n   */\n  function withdrawCash(uint256 amount) public {\n\n    // require the amount to be less than the balance of the DARC virtual machine \n    require(amount <= address(this).balance, string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and balance: \", Strings.toString(address(this).balance)));\n\n    // require the amount to be less than the message sender's balance\n    require(amount <= currentMachineState.withdrawableCashMap[msg.sender], string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and withdrawable cash: \", Strings.toString(currentMachineState.withdrawableCashMap[msg.sender])));\n\n    // first update the withdrawable cash map\n    bool bIsValid;\n    uint256 result;\n    (bIsValid, result) = SafeMathUpgradeable.trySub(currentMachineState.withdrawableCashMap[msg.sender], amount);\n    require(bIsValid, string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and withdrawable cash: \", Strings.toString(currentMachineState.withdrawableCashMap[msg.sender])));\n\n    currentMachineState.withdrawableCashMap[msg.sender] = result;\n\n    // if the message sender owns zero withdrawable cash balance, then remove it from the withdrawable cash owner list\n    if (currentMachineState.withdrawableCashMap[msg.sender] == 0) {\n      address[] memory newWithdrawableCashOwnerList = new address[](currentMachineState.withdrawableCashOwnerList.length);\n      uint256 pt;\n      for (uint256 index; index < currentMachineState.withdrawableCashOwnerList.length;index++) {\n        if (currentMachineState.withdrawableCashOwnerList[index] != msg.sender) {\n          newWithdrawableCashOwnerList[pt] = currentMachineState.withdrawableCashOwnerList[index];\n          pt++;\n        }\n      }\n\n      // update the withdrawable cash owner list\n      currentMachineState.withdrawableCashOwnerList = new address[](pt);\n      for (uint256 index; index < pt;index++) {\n        currentMachineState.withdrawableCashOwnerList[index] = newWithdrawableCashOwnerList[index];\n      }\n    }\n\n    // finally transfer the cash to the message sender\n    payable(msg.sender).transfer(amount);\n  }\n\n  /**\n   * This is the only way to withdraw dividends from the DARC virtual machine\n   * @param amount The amount of cash to be withdrawn\n   */\n  function withdrawDividends(uint256 amount) public {\n      \n      // require the amount to be less than the balance of the DARC virtual machine \n      require(amount <= address(this).balance, string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and balance: \", Strings.toString(address(this).balance)));\n  \n      // require the amount to be less than the message sender's balance\n      require(amount <= currentMachineState.withdrawableDividendMap[msg.sender], string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and withdrawable dividends: \", Strings.toString(currentMachineState.withdrawableDividendMap[msg.sender])));\n  \n      // first update the withdrawable cash map\n      bool bIsValid;\n      uint256 result;\n      (bIsValid, result) = SafeMathUpgradeable.trySub(currentMachineState.withdrawableDividendMap[msg.sender], amount);\n      require(bIsValid, string.concat(\"Invalid withdraw amount. Amount: \", Strings.toString(amount), \", and withdrawable dividends: \", Strings.toString(currentMachineState.withdrawableDividendMap[msg.sender])));\n  \n      currentMachineState.withdrawableDividendMap[msg.sender] = result;\n\n        \n      // finally transfer the cash to the message sender\n      payable(msg.sender).transfer(amount);\n  \n      // if the message sender owns zero withdrawable dividend balance, then remove it from the withdrawable dividend owner list\n      if (currentMachineState.withdrawableDividendMap[msg.sender] == 0) {\n        address[] memory newWithdrawableDividendsOwnerList = new address[](currentMachineState.withdrawableDividendOwnerList.length);\n        uint256 pt;\n        for (uint256 index; index < currentMachineState.withdrawableDividendOwnerList.length;index++) {\n          if (currentMachineState.withdrawableDividendOwnerList[index] != msg.sender) {\n            newWithdrawableDividendsOwnerList[pt] = currentMachineState.withdrawableDividendOwnerList[index];\n            pt++;\n          }\n        }\n  \n        // update the withdrawable cash owner list\n        currentMachineState.withdrawableDividendOwnerList = new address[](pt);\n        for (uint256 index; index < pt;index++) {\n          currentMachineState.withdrawableDividendOwnerList[index] = newWithdrawableDividendsOwnerList[index];\n        }\n      }\n\n  }\n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Dashboard/Dashboard.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"../Runtime/Executable/Executable.sol\";\n\n/**\n * @title DARC Dashboard\n * @author DARC Team\n * @notice The dashboard (a set of view functions) of the DARC machine state,\n * which is used to read the machine state, including machine state, voting state,\n * token information, plugin information, etc.\n */\ncontract Dashboard is Executable {\n  \n  /**\n   * @notice The getter function of the machine state plugins\n   */\n  function getPluginInfo() public view returns (Plugin[] memory, Plugin[] memory) {\n    return (currentMachineState.beforeOpPlugins, currentMachineState.afterOpPlugins);\n  }\n\n  /**\n   * @notice Get the available token classes\n   */\n  function getNumberOfTokenClasses() public view returns (uint256) {\n    uint256 i;\n    for (i=0; i < currentMachineState.tokenList.length; i++) {\n      if (!currentMachineState.tokenList[i].bIsInitialized) {\n        break;\n      }\n    }\n    return i;\n  }\n\n  /**\n   * @notice Get the token class information\n   * @param tokenClassIndex the index of the token class\n   */\n  function getTokenOwners(uint256 tokenClassIndex) public view returns (address[] memory) {\n    return currentMachineState.tokenList[tokenClassIndex].ownerList;\n  }\n\n  /**\n   * Get the current token information\n   * @param tokenClassIndex the index of the token class \n   */\n  function getTokenInfo(uint256 tokenClassIndex) public view returns (uint256 votingWeight, uint256 dividendWeight, string memory tokenInfo, uint256 totalSupply) {\n    return (currentMachineState.tokenList[tokenClassIndex].votingWeight, currentMachineState.tokenList[tokenClassIndex].dividendWeight, currentMachineState.tokenList[tokenClassIndex].tokenInfo, currentMachineState.tokenList[tokenClassIndex].totalSupply);\n  }\n\n  /**\n   * @notice Get the token class information\n   * @param tokenClassIndex the index of the token class\n   * @param tokenOwnerAddress the address of the token owner\n   */\n  function getTokenOwnerBalance(uint256 tokenClassIndex, address tokenOwnerAddress) public view returns (uint256) {\n    return currentMachineState.tokenList[tokenClassIndex].tokenBalance[tokenOwnerAddress];\n  }\n\n  /**\n   * @notice Get the member list keys\n   */\n  function getMemberList() public view returns (address[] memory) {\n    return currentMachineState.memberList;\n  }\n\n  /**\n   * @notice Get the member information\n   * @param member the address of the member\n   */\n  function getMemberInfo(address member) public view returns (MemberInfo memory) {\n    return currentMachineState.memberInfoMap[member];\n  }\n\n  /**\n   * @notice Get the current dividend balance of the address\n   */\n  function getWithdrawableCashBalance(address member) public view returns (uint256) {\n    return currentMachineState.withdrawableCashMap[member];\n  }\n\n  /**\n   * @notice Get the current list of the addresses that can withdraw the dividend\n   */\n  function getWithdrawableCashOwnerList() public view returns (address[] memory) {\n    return currentMachineState.withdrawableCashOwnerList;\n  }\n \n  /**\n   * @notice Get the current dividend balance of the address\n   * @param member the address of the member\n   */\n  function getWithdrawableDividendBalance(address member) public view returns (uint256) {\n    return currentMachineState.withdrawableDividendMap[member];\n  }\n\n  /**\n   * @notice Get the current list of the addresses that can withdraw the dividend\n   */\n  function getWithdrawableDividendOwnerList() public view returns (address[] memory) {\n    return currentMachineState.withdrawableDividendOwnerList;\n  }\n\n  function getMyInfo() public view returns (address) {\n    return msg.sender;\n  }\n\n  /**\n   * The getter function of total voting weight for a token class\n   * @param tokenClassIndex The index of the token class\n   */\n  function getSumVotingWeightByTokenClass(uint256 tokenClassIndex) public view returns (uint256) {\n    return sumVotingWeightForTokenClass(false, tokenClassIndex);\n  }\n\n  /**\n   * The getter function of total dividend weight for a token class\n   * @param tokenClassIndex The index of the token class\n   */\n  function getSumDividendWeightByTokenClass(uint256 tokenClassIndex) public view returns (uint256) {\n    return sumDividendWeightForTokenClass(false, tokenClassIndex);\n  }\n\n  /**\n   * Get the current dividend per unit\n   */\n  function getCurrentDividendPerUnit() public view returns (uint256) {\n    return currentDividendPerUnit(false);\n  }\n\n  /**\n   * Get all logs of DARC\n   */\n  function getDARClogs() public view returns (string[] memory) {\n    return DARClogs;\n  }\n\n  /**\n   * Get all voting items\n   */\n  function getVotingItemsByIndex(uint256 idx) public view returns (VotingItem memory) {\n    return votingItems[idx];\n  }\n\n  /**\n   * Get the latest voting item index\n   */\n  function getLatestVotingItemIndex() public view returns (uint256) {\n    return latestVotingItemIndex;\n  }\n\n  /**\n   * Get the global operation log\n   */\n  function getGlobalOperationLog() public view returns (OperationLog memory) {\n    return currentMachineState.globalOperationLog;\n  }\n\n  /**\n   * Get the operation log of the address\n   */\n  function getOperationLogByAddress(address addr) public view returns (OperationLog memory) {\n    return currentMachineState.operationLogMap[addr];\n  }\n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/MachineState.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"./Program.sol\";\nimport \"./Plugin.sol\";\n/**\n * @notice The token information of the DARC protocol\n * This struct is used to store the balance of each token class of each token owner  \n */\nstruct Token {\n  uint256 tokenClassIndex;\n  uint256 votingWeight;\n  uint256 dividendWeight;\n  mapping (address => uint256) tokenBalance;\n  address[] ownerList;\n  string tokenInfo;\n  uint256 totalSupply;\n  bool bIsInitialized;\n}\n\n/**\n * @notice The stock token owner information of the DARC protocol\n * This struct is used to store the role index number of each token owner\n */\nstruct MemberInfo {\n  bool bIsInitialized;\n  bool bIsSuspended;\n  string name;\n  uint256 role;\n}\n\n/**\n * @notice the operation log of the DARC protocol.\n * Notice: since \n */\nstruct OperationLog{\n  uint256[100] latestOperationTimestamp;\n}\n\n\n/**\n * @notice the machine state parameters of the DARC protocol\n */\nstruct MachineStateParameters{\n\n  /**\n   * @notice the dividend cycle of the DARC protocol\n   * The percentage of the dividend for each transaction from 0 to 10000\n   * For each dividend cycle, the dividend will be distributed to all the token owners\n   * The dividend will be calculated by the following formula:\n   * currentCashBalanceForDividends += \n   * NEW_TRANSACTION_INCOME * dividendPermyriadPerTransaction / 10000\n   *  */ \n  uint256 dividendPermyriadPerTransaction;\n\n  /**\n   * @notice the dividend cycle of the DARC protocol\n   * the number X of transactions for each dividend cycle \n   * after X transactions, all the dividends will be distributed\n   * and the currentCashForDividends will be reset to 0\n   */\n  uint256 dividendCycleOfTransactions;\n\n  /**\n   * @notice the current cash for dividends\n   */\n  uint256 currentCashBalanceForDividends;\n\n  /**\n   * @notice the current counter for dividendable transactions\n   */\n  uint256 dividendCycleCounter;\n\n  /**\n   * @notice the address list of the emergency agents\n   */\n  address[] emergencyAgentsAddressList;\n\n  /**\n   * @notice additional storage list in string format\n   * this is used to store the storage for additional information\n   * such as the IPFS hash value for important documents\n   * or tokens/NFTs for the token owners\n   */\n  string[] strStorageList;\n\n  /**\n   * @notice The list of the active emergency agents\n   * The emergency agents can be used to do all emergency operations \n   * of the DARC protocol\n   */\n  address[] activeEmergencyAgentsAddressList;\n\n  bool bIsEmergency;\n}\n\n/**\n *  the machine state of the DARC protocol\n */\nstruct MachineState {\n\n  /**\n   * The balance sheet and information of each token class\n   * TODO: make the length of the tokenList dynamic (not fixed to 10000)\n   */\n  Token[1000] tokenList;\n\n  /**\n   * The member list and internal role index number of each token owner,\n   * which can be used to represent the shareholders, co-founders, employees, \n   * board members, special agents, etc.\n   */\n  mapping (address => MemberInfo) memberInfoMap;\n\n  // the key of the memberInfoMap, the list of all the token owners\n  address[] memberList;\n\n  /**\n   * The list of before-operation restriction plugins\n   */\n  Plugin[] beforeOpPlugins;\n\n  /**\n   * The list of after-operation restriction plugins\n   * (after the operation is completed in the sandbox, \n   * the plugin will be executed)\n   */\n  Plugin[] afterOpPlugins;\n\n  /*\n    * The list of voting rules\n    */\n  VotingRule[] votingRuleList;\n\n\n  /**\n   * Cash withdrawal balance mapping, \n   * the withdrawal balance of each token owner as cash (ETH, BNB, Polygon, etc.)\n   */\n  mapping (address => uint256) withdrawableCashMap;\n\n  /**\n   * The list of cash withdrawal owners\n   */\n  address[] withdrawableCashOwnerList;\n\n  /**\n   * Cash withdrawal balance mapping, \n   * the withdrawal balance of each token owner as cash (ETH, BNB, Polygon, etc.)\n   */\n  mapping (address => uint256) withdrawableDividendMap;\n\n  /**\n   * The list of cash withdrawal owners\n   */\n  address[] withdrawableDividendOwnerList;\n\n  /**\n   * The history log of approved operations for each address\n   */\n  mapping (address => OperationLog) operationLogMap;\n\n  /**\n   * The list of addresses that have approved operations\n   */\n  address[] operationLogMapAddressList;\n\n  /**\n   * The opearation log of all operators in the DARC protocol\n   * Any operation in the DARC protocol executed by any address will be recorded here\n   */\n  OperationLog globalOperationLog;\n\n  /**\n   * The machine state parameters of the DARC protocol\n   */\n  MachineStateParameters machineStateParameters;\n\n  /**\n   * The current balance of the DARC protocol\n   */\n  uint256 currentBalance;\n}\n\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/MachineStateManager.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"./MachineState.sol\";\nimport \"./Plugin.sol\";\nimport \"./Utilities/ErrorMsg.sol\";\n\n// import openzeppelin upgradeable contracts safe math\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n/**\n * @title DARC Machine State Manager\n * @author DARC Team\n * @notice null\n */\n\nenum FiniteState {\n  UNDEFINED,\n  IDLE,\n  VOTING,\n  EXECUTING_PENDING\n}\n\n\n\n/**\n * @notice The core and base contract of DARC, the manager of the DARC machine state\n * Also this contains some basic function of the DARC machine state\n * \n */\ncontract MachineStateManager {\n  \n  /**\n   * ======== DARC Machine State ========\n   */\n  MachineState public currentMachineState;\n  MachineState public sandboxMachineState;\n\n\n  /**\n   * @notice The creator address of the DARC machine state\n   * this address is the initial owner of the DARC machine state\n   * but not the owner of the DARC machine state\n   * this is only used to initialize the DARC machine state\n   */\n  address public initialOwnerAddress;\n\n\n  /**\n   * ======== DARC Voting and Execution State ========\n   */\n  /**\n   * @notice the deadline of voting period\n   */\n  uint256 public votingDeadline;\n\n  /**\n   * @notice the deadline of executing pending period\n   */\n  uint256 public executingPendingDeadline;\n\n  /**\n   * @notice the finite state\n   */\n  FiniteState public finiteState;\n\n  /**\n   * Parameters and configs\n   */\n  uint256 dividendBufferSize;\n  \n  /**\n   * @notice The logs of the DARC machine state\n   */\n  string[] DARClogs;\n\n\n\n  /**\n   * @notice Initialize an empty state of the DARC machine state\n   */\n  function initialize() public  {\n    // the initial owner of the DARC machine state is the creator of the DARC machine state\n    initialOwnerAddress = msg.sender;\n    finiteState = FiniteState.IDLE;\n\n    currentMachineState.beforeOpPlugins = new Plugin[](0);\n    currentMachineState.afterOpPlugins = new Plugin[](0);\n\n    dividendBufferSize = 10000;\n    \n    /**\n     * We need to initialze the first plugin for both before operation \n     * plugin system and after operation plugin system.\n     * \n     * Before-op Rule: If the operation is executed by the initial owner, then skip the plugin system\n     * After-op Rule: If the operation is executed by the initial owner, then approve the operation\n     * \n     * Level: both before-op and after-op plugin system, level 1, the lowest level\n     */\n    ConditionNode[] memory conditionNodes = new ConditionNode[](1);\n    conditionNodes[0] = ConditionNode(\n      0,\n      EnumConditionNodeType.BOOLEAN_TRUE, \n      EnumLogicalOperatorType.UNDEFINED,\n\n      // expression: operation == initialOwnerAddress\n      0,\n      new uint256[](0),\n      NodeParam(\n        new string[](0),\n        new uint256[][](0),\n\n        // leave the address 2d array as 1x1\n        new address[][](0),\n        new bytes(0)\n      )\n    );\n\n\n    currentMachineState.beforeOpPlugins.push(Plugin(\n      EnumReturnType.YES_AND_SKIP_SANDBOX,\n      1,  //YES_AND_SKIP_SANDBOX can be set to level%3 == 1\n      conditionNodes,\n      0,\n      \"\",\n      true,\n      true\n    ));\n\n    ConditionNode[] memory conditionNodes_afterOp = new ConditionNode[](1);\n    conditionNodes_afterOp[0] = ConditionNode(\n      0,\n      EnumConditionNodeType.BOOLEAN_TRUE, \n      EnumLogicalOperatorType.UNDEFINED,\n\n      // expression: operation == initialOwnerAddress\n      0,\n      new uint256[](0),\n      NodeParam(\n        new string[](0),\n        new uint256[][](0),\n\n        // leave the address 2d array as 1x1\n        new address[][](0),\n        //new string[][](0),\n        new bytes(0)\n      )\n    );\n    currentMachineState.afterOpPlugins.push(Plugin(\n      EnumReturnType.YES, // \n      1,  // YES can be set to level%3 == 1\n      conditionNodes_afterOp,\n      0,\n      \"\",\n      true,\n      false\n    ));\n\n    // set dividend permyriad per transaction as 5000, which is 50%\n    currentMachineState.machineStateParameters.dividendPermyriadPerTransaction = 5000;\n\n    // set the dividend cycle of transactions as 1\n    currentMachineState.machineStateParameters.dividendCycleOfTransactions = 1;\n  }\n\n  /**\n   * @notice Clone the current state of the DARC machine state to the cloned state\n   * TODO: the function is not completed, it is just a draft\n   */\n  function cloneStateToSandbox() internal {\n    \n    // 1. clone the plugin list\n    sandboxMachineState.afterOpPlugins = new Plugin[](currentMachineState.afterOpPlugins.length);\n    for (uint256 i = 0; i < currentMachineState.afterOpPlugins.length; i++) {\n      sandboxMachineState.afterOpPlugins[i] = currentMachineState.afterOpPlugins[i];\n    }\n    sandboxMachineState.beforeOpPlugins = new Plugin[](currentMachineState.beforeOpPlugins.length);\n    for (uint256 i = 0; i < currentMachineState.beforeOpPlugins.length; i++) {\n      sandboxMachineState.beforeOpPlugins[i] = currentMachineState.beforeOpPlugins[i];\n    }\n\n    // 2. clone the token list\n    // 2.1 clean all the token info from the sandbox token info map\n    for (uint256 i = 0; i < sandboxMachineState.tokenList.length; i++) {\n\n      // if the token is initialized, then clean the token info\n      if (sandboxMachineState.tokenList[i].bIsInitialized == true) {\n        for (uint256 j = 0; j < sandboxMachineState.tokenList[i].ownerList.length; j++) {\n          delete sandboxMachineState.tokenList[i].tokenBalance[sandboxMachineState.tokenList[i].ownerList[j]];\n        }\n\n        sandboxMachineState.tokenList[i].ownerList = new address[](0);\n        sandboxMachineState.tokenList[i].bIsInitialized = false;\n        sandboxMachineState.tokenList[i].tokenClassIndex = 0;\n        sandboxMachineState.tokenList[i].votingWeight = 0;\n        sandboxMachineState.tokenList[i].dividendWeight = 0;\n        sandboxMachineState.tokenList[i].tokenInfo = \"\";\n        sandboxMachineState.tokenList[i].totalSupply = 0;\n      }\n    }\n\n    // 2.2 Clone the token list of the current state to the sandbox state\n    for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n      // if the token is initialized, then clone the token info\n      if (currentMachineState.tokenList[i].bIsInitialized == true) {\n        sandboxMachineState.tokenList[i].ownerList = currentMachineState.tokenList[i].ownerList;\n        sandboxMachineState.tokenList[i].bIsInitialized = true;\n        sandboxMachineState.tokenList[i].tokenClassIndex = currentMachineState.tokenList[i].tokenClassIndex;\n        sandboxMachineState.tokenList[i].votingWeight = currentMachineState.tokenList[i].votingWeight;\n        sandboxMachineState.tokenList[i].dividendWeight = currentMachineState.tokenList[i].dividendWeight;\n        sandboxMachineState.tokenList[i].tokenInfo = currentMachineState.tokenList[i].tokenInfo;\n        sandboxMachineState.tokenList[i].totalSupply = currentMachineState.tokenList[i].totalSupply;\n      }\n    }\n\n    // 3. clone the member list\n    // 3.1 clean all the member info from the member info map\n    for (uint256 i = 0; i < currentMachineState.memberList.length; i++) {\n      delete sandboxMachineState.memberInfoMap[currentMachineState.memberList[i]];\n    }\n    \n    // 3.2 delete the member list of the sandbox state and clone the member list of \n    // the current state to the sandbox state\n    sandboxMachineState.memberList = new address[](currentMachineState.memberList.length);\n    for (uint256 i = 0; i < currentMachineState.memberList.length; i++) {\n      sandboxMachineState.memberList[i] = currentMachineState.memberList[i];\n    }\n\n    // 3.3 clone the member info map of the current state to the sandbox state\n    for (uint256 i = 0; i < currentMachineState.memberList.length; i++) {\n      sandboxMachineState.memberInfoMap[currentMachineState.memberList[i]] \n        = currentMachineState.memberInfoMap[currentMachineState.memberList[i]];\n    }\n\n    // 4. Clone the operationLogMap\n    // 4.1 clean all the operation log from the operation log map\n    for (uint256 i = 0; i < sandboxMachineState.operationLogMapAddressList.length; i++) {\n      delete sandboxMachineState.operationLogMap[sandboxMachineState.operationLogMapAddressList[i]];\n    }\n    // 4.2 copy the operation log address list from current machine state to sandbox\n    sandboxMachineState.operationLogMapAddressList = new address[](currentMachineState.operationLogMapAddressList.length);\n    for (uint256 i = 0; i < currentMachineState.operationLogMapAddressList.length; i++) {\n      sandboxMachineState.operationLogMapAddressList[i] = currentMachineState.operationLogMapAddressList[i];\n    }\n    // 4.3 copy the operation log map from current machine state to sandbox\n    for (uint256 i = 0; i < currentMachineState.operationLogMapAddressList.length; i++) {\n      sandboxMachineState.operationLogMap[currentMachineState.operationLogMapAddressList[i]] \n        = currentMachineState.operationLogMap[currentMachineState.operationLogMapAddressList[i]];\n    }\n\n    // 4.4 copy the overall operation log from current machine state to sandbox\n    sandboxMachineState.globalOperationLog = currentMachineState.globalOperationLog;\n\n    // 5. Clone the machine state parameters\n    sandboxMachineState.machineStateParameters = currentMachineState.machineStateParameters;\n\n    // 6. Clone the withdrawable cash from sandbox to current machine state\n    // 6.1 clean all value in sandbox\n    for (uint256 i = 0; i < sandboxMachineState.withdrawableCashOwnerList.length; i++) {\n      delete sandboxMachineState.withdrawableCashMap[sandboxMachineState.withdrawableCashOwnerList[i]];\n    }\n\n    // 6.2 copy the withdrawable cash owner list from current machine state to sandbox\n    sandboxMachineState.withdrawableCashOwnerList = new address[](currentMachineState.withdrawableCashOwnerList.length);\n    for (uint256 i = 0; i < currentMachineState.withdrawableCashOwnerList.length; i++) {\n      sandboxMachineState.withdrawableCashOwnerList[i] = currentMachineState.withdrawableCashOwnerList[i];\n    }\n\n    // 6.3 copy the withdrawable cash map from current machine state to sandbox\n    for (uint256 i = 0; i < currentMachineState.withdrawableCashOwnerList.length; i++) {\n      sandboxMachineState.withdrawableCashMap[currentMachineState.withdrawableCashOwnerList[i]] \n        = currentMachineState.withdrawableCashMap[currentMachineState.withdrawableCashOwnerList[i]];\n    }\n\n    // 7. Clone the wirhdarwable dividends from sandbox to current machine state\n    // 7.1 clean all value in sandbox\n    for (uint256 i = 0; i < sandboxMachineState.withdrawableDividendOwnerList.length; i++) {\n      delete sandboxMachineState.withdrawableDividendMap[sandboxMachineState.withdrawableDividendOwnerList[i]];\n    }\n\n    // 7.2 copy the withdrawable dividends owner list from current machine state to sandbox\n    sandboxMachineState.withdrawableDividendOwnerList = new address[](currentMachineState.withdrawableDividendOwnerList.length);\n    for (uint256 i = 0; i < currentMachineState.withdrawableDividendOwnerList.length; i++) {\n      sandboxMachineState.withdrawableDividendOwnerList[i] = currentMachineState.withdrawableDividendOwnerList[i];\n    }\n\n    // 7.3 copy the withdrawable dividends map from current machine state to sandbox\n    for (uint256 i = 0; i < currentMachineState.withdrawableDividendOwnerList.length; i++) {\n      sandboxMachineState.withdrawableDividendMap[currentMachineState.withdrawableDividendOwnerList[i]] \n        = currentMachineState.withdrawableDividendMap[currentMachineState.withdrawableDividendOwnerList[i]];\n    }\n\n  }   \n\n\n  /**\n   * This function that get the total number of tokens for a certain token class\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   * @param tokenClassIndex The index of the token class\n   */\n  function totalTokensPerTokenClass(bool bIsSandbox, uint256 tokenClassIndex) internal view returns (uint256) {\n    if (bIsSandbox) {\n      uint256 numberOfOwners = sandboxMachineState.tokenList[tokenClassIndex].ownerList.length;\n      uint256 totalTokens = 0;\n      bool bIsValid = true;\n      for (uint256 i = 0; i < numberOfOwners; i++) {\n        address currentOwner = sandboxMachineState.tokenList[tokenClassIndex].ownerList[i];\n        uint256 currentNumberOfTokens = sandboxMachineState.tokenList[tokenClassIndex].tokenBalance[currentOwner];\n        (bIsValid, totalTokens) = SafeMathUpgradeable.tryAdd(totalTokens, currentNumberOfTokens);\n        require(bIsValid, \"totalTokensPerTokenClass: totalTokens overflow\");\n      }\n      return totalTokens;\n    } else {\n      uint256 numberOfOwners = currentMachineState.tokenList[tokenClassIndex].ownerList.length;\n      uint256 totalTokens = 0;\n      bool bIsValid = true;\n      for (uint256 i = 0; i < numberOfOwners; i++) {\n        address currentOwner = currentMachineState.tokenList[tokenClassIndex].ownerList[i];\n        uint256 currentNumberOfTokens = currentMachineState.tokenList[tokenClassIndex].tokenBalance[currentOwner];\n        (bIsValid, totalTokens) = SafeMathUpgradeable.tryAdd(totalTokens, currentNumberOfTokens);\n        require(bIsValid, \"totalTokensPerTokenClass: totalTokens overflow\");\n      }\n      return totalTokens;\n    }\n  }\n\n  /**\n   * Return the number of dividend weight for a certain token class\n   * @param bIsSandbox Whether is the sandbox\n   * @param tokenClassIndex The index of the token class \n   */\n  function sumDividendWeightForTokenClass( bool bIsSandbox, uint256 tokenClassIndex ) internal view returns (uint256) {\n    if (bIsSandbox) {\n      uint256 dividendWeightUnit = sandboxMachineState.tokenList[tokenClassIndex].dividendWeight;\n      bool bIsValid = true;\n      uint256 dividendWeight = 0;\n      (bIsValid, dividendWeight) = SafeMathUpgradeable.tryMul(dividendWeightUnit, totalTokensPerTokenClass(bIsSandbox, tokenClassIndex));\n      require(bIsValid, \"sumDividendWeightForTokenClass: dividendWeight overflow\");\n      return dividendWeight;\n    } else {\n      uint256 dividendWeightUnit = currentMachineState.tokenList[tokenClassIndex].dividendWeight;\n      bool bIsValid = true;\n      uint256 dividendWeight = 0;\n      (bIsValid, dividendWeight) = SafeMathUpgradeable.tryMul(dividendWeightUnit, totalTokensPerTokenClass(bIsSandbox, tokenClassIndex));\n      require(bIsValid, \"sumDividendWeightForTokenClass: dividendWeight overflow\");\n      return dividendWeight;\n    }\n  }\n\n  /**\n   * Return the number of voting weight for a certain token class\n   * @param bIsSandbox Whether is the sandbox\n   * @param tokenClassIndex The index of the token class \n   */\n  function sumVotingWeightForTokenClass ( bool bIsSandbox, uint256 tokenClassIndex ) internal view returns (uint256) {\n    if (bIsSandbox) {\n      uint256 votingWeightUnit = sandboxMachineState.tokenList[tokenClassIndex].votingWeight;\n      bool bIsValid = true;\n      uint256 votingWeight = 0;\n      (bIsValid, votingWeight) = SafeMathUpgradeable.tryMul(votingWeightUnit, totalTokensPerTokenClass(bIsSandbox, tokenClassIndex));\n      require(bIsValid, \"sumVotingWeightForTokenClass: votingWeight overflow\");\n      return votingWeight;\n    } else {\n      uint256 votingWeightUnit = currentMachineState.tokenList[tokenClassIndex].votingWeight;\n      bool bIsValid = true;\n      uint256 votingWeight = 0;\n      (bIsValid, votingWeight) = SafeMathUpgradeable.tryMul(votingWeightUnit, totalTokensPerTokenClass(bIsSandbox, tokenClassIndex));\n      require(bIsValid, \"sumVotingWeightForTokenClass: votingWeight overflow\");\n      return votingWeight;\n    }\n  }\n\n  /**\n   * Calculate the total voting weights of all tokens\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   * @return uint256 The total voting weights of all tokens\n   */\n  function totalVotingWeights(bool bIsSandbox) internal view returns (uint256) {\n    if (bIsSandbox) {\n      uint256 totalVotingWeight = 0;\n      for (uint256 i = 0; i < sandboxMachineState.tokenList.length; i++) {\n        if (sandboxMachineState.tokenList[i].bIsInitialized == false) {\n          break;\n        }\n        totalVotingWeight += sumVotingWeightForTokenClass(bIsSandbox, i);\n      }\n      return totalVotingWeight;\n    } else {\n      uint256 totalVotingWeight = 0;\n      for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n        if (currentMachineState.tokenList[i].bIsInitialized == false) {\n          break;\n        }\n        totalVotingWeight += sumVotingWeightForTokenClass(bIsSandbox, i);\n      }\n      return totalVotingWeight;\n    }\n  }\n\n  /**\n   * Calculate the total dividend weights of all tokens\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   * @return uint256 The total dividend weights of all tokens\n   */\n  function totalDividendWeights(bool bIsSandbox) internal view returns (uint256) {\n    if (bIsSandbox) {\n      uint256 totalDividendWeight = 0;\n      for (uint256 i = 0; i < sandboxMachineState.tokenList.length; i++) {\n        if (sandboxMachineState.tokenList[i].bIsInitialized == false) {\n          break;\n        }\n        totalDividendWeight += sumDividendWeightForTokenClass(bIsSandbox, i);\n      }\n      return totalDividendWeight;\n    } else {\n      uint256 totalDividendWeight = 0;\n      for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n        if (currentMachineState.tokenList[i].bIsInitialized == false) {\n          break;\n        }\n        totalDividendWeight += sumDividendWeightForTokenClass(bIsSandbox, i);\n      }\n      return totalDividendWeight;\n    }\n  }\n\n\n  /**\n   * Calculate the current dividend per unit\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   */\n\n  function currentDividendPerUnit(bool bIsSandbox) internal view returns(uint256) {\n    if (bIsSandbox) {\n      // make sure that the dividend per myriad per transaction is less than 10000\n      require(sandboxMachineState.machineStateParameters.dividendPermyriadPerTransaction < 10000, \n        ErrorMsg.By(15));\n\n      // make sure that cycle counter is less than the threashold\n      require(sandboxMachineState.machineStateParameters.dividendCycleCounter >= \n        sandboxMachineState.machineStateParameters.dividendCycleOfTransactions, ErrorMsg.By(16));\n\n      // 1. calculate the total amount of dividends to be offered\n      bool bIsValid = true;\n      uint256 totalDividends = 0;\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryMul(\n        sandboxMachineState.machineStateParameters.currentCashBalanceForDividends,\n        sandboxMachineState.machineStateParameters.dividendPermyriadPerTransaction);\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryDiv(\n      totalDividends,\n      10000);\n      require (bIsValid, ErrorMsg.By(12));\n\n      // 2. calculate the total dividends weight of all dividendable tokens\n      uint256 totalDividendsWeight = 0;\n\n      for (uint256 index=0; index < sandboxMachineState.tokenList.length; index++) {\n\n        if (sandboxMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n\n        (bIsValid, totalDividendsWeight) = SafeMathUpgradeable.tryAdd(\n          totalDividendsWeight,\n          sumDividendWeightForTokenClass(bIsSandbox, index));\n        require(bIsValid, ErrorMsg.By(12));\n      }\n\n      // 3. calculate the cash dividend per unit\n      uint256 cashPerUnit = 0;\n      (bIsValid, cashPerUnit) = SafeMathUpgradeable.tryDiv(\n        totalDividends,\n        totalDividendsWeight);\n      \n      return (cashPerUnit);\n    } else {\n      // make sure that the dividend per myriad per transaction is less than 1000\n      require(currentMachineState.machineStateParameters.dividendPermyriadPerTransaction < 10000, \n        ErrorMsg.By(15));\n\n      // make sure that cycle counter is less than the threashold\n      require(currentMachineState.machineStateParameters.dividendCycleCounter >= \n        currentMachineState.machineStateParameters.dividendCycleOfTransactions, ErrorMsg.By(16));\n\n      // 1. calculate the total amount of dividends to be offered\n      bool bIsValid = true;\n      uint256 totalDividends = 0;\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryMul(\n        currentMachineState.machineStateParameters.currentCashBalanceForDividends,\n        currentMachineState.machineStateParameters.dividendPermyriadPerTransaction);\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryDiv(\n      totalDividends,\n      10000);\n      require (bIsValid, ErrorMsg.By(12));\n\n      // 2. calculate the total dividends weight of all dividendable tokens\n      uint256 totalDividendsWeight = 0;\n\n      for (uint256 index=0; index < currentMachineState.tokenList.length; index++) {\n\n        if (currentMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n\n        (bIsValid, totalDividendsWeight) = SafeMathUpgradeable.tryAdd(\n          totalDividendsWeight,\n          sumDividendWeightForTokenClass(bIsSandbox, index));\n        require(bIsValid, ErrorMsg.By(12));\n      }\n\n      // 3. calculate the cash dividend per unit\n      uint256 cashPerUnit = 0;\n      (bIsValid, cashPerUnit) = SafeMathUpgradeable.tryDiv(\n        totalDividends,\n        totalDividendsWeight);\n      \n      return (cashPerUnit);\n    }\n  }\n\n  /**\n   * Calculate the total voting weight of all tokens owned by a certain address\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   * @param addr The address to be checked\n   */\n  function addressTotalVotingWeight(bool bIsSandbox, address addr) internal view returns (uint256) {\n      uint256 totalVotingWeight = 0;\n      if (!bIsSandbox) {\n          for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n              totalVotingWeight += currentMachineState.tokenList[i].tokenBalance[addr] * currentMachineState.tokenList[i].votingWeight;\n          }\n      } else {\n          for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n              totalVotingWeight += sandboxMachineState.tokenList[i].tokenBalance[addr] * sandboxMachineState.tokenList[i].votingWeight;\n          }\n      }\n      return totalVotingWeight;\n  }\n\n  /**\n   * Calculate the total dividend weight of all tokens owned by a certain address\n   * @param bIsSandbox The flag to indicate whether is the sandbox\n   * @param addr The address to be checked\n   */\n  function addressTotalDividendWeight(bool bIsSandbox, address addr) internal view returns (uint256) {\n      uint256 totalTokenBalance = 0;\n      if (!bIsSandbox) {\n          for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n              totalTokenBalance += currentMachineState.tokenList[i].tokenBalance[addr] * currentMachineState.tokenList[i].dividendWeight;\n          }\n      } else {\n          for (uint256 i = 0; i < currentMachineState.tokenList.length; i++) {\n              totalTokenBalance += sandboxMachineState.tokenList[i].tokenBalance[addr] * sandboxMachineState.tokenList[i].dividendWeight;\n          }\n      }\n      return totalTokenBalance;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Opcodes.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\n\n/*\n  * @notice opcode enum is used to represent the instruction of the DARC protocol.\n*/\n\nenum EnumOpcode {\n\n  /**\n   * @notice Invalid Operation\n   * ID: 0\n   */\n  UNDEFINED,\n\n  /**\n   * @notice Batch Mint Token Operation\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to mint new token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint new token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to mint\n   * \n   * ID: 1\n   */\n  BATCH_MINT_TOKENS,\n\n  /**\n   * @notice Batch Create Token Class Operation\n   * @param STRING_ARRAY[] string[] nameArray: the array of the name of the token class to create\n   * @param UINT256_2DARRAY[0] uint256[] tokenIndexArray: the array of the token index of the token class to create\n   * @param UINT256_2DARRAY[1] uint256[] votingWeightArray: the array of the voting weight of the token class to create\n   * @param UINT256_2DARRAY[2] uint256[] dividendWeightArray: the array of the dividend weight of the token class to create\n   * \n   * ID:2\n   */\n  BATCH_CREATE_TOKEN_CLASSES,\n\n  /**\n   * @notice Batch Transfer Token Operation\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * \n   * ID:3\n   */\n  BATCH_TRANSFER_TOKENS,\n\n  /**\n   * @notice Batch Transfer Token From Addr A to Addr B Operation\n   * @param ADDRESS_2DARRAY[0] address[] fromAddressArray (source): the array of the address to transfer token from\n   * @param ADDRESS_2DARRAY[1] address[] toAddressArray (target): the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * \n   * ID:4\n   */\n  BATCH_TRANSFER_TOKENS_FROM_TO,\n\n  /**\n   * @notice Batch Burn Token Operation\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * \n   * ID:5\n   */\n  BATCH_BURN_TOKENS,\n\n  /**\n   * @notice Batch Burn Token From Addr A Operation\n   * @param ADDRESS_2DARRAY[0] address[] fromAddressArray: the array of the address to burn token from\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * \n   * ID:6\n   */\n  BATCH_BURN_TOKENS_FROM,\n\n  /**\n   * @notice Batch Add Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to add as member\n   * @param UINT256_2DARRAY[0] uint256[] memberRoleArray: the array of the role of the member to add\n   * @param STRING_ARRAY string[] memberNameArray: the array of the name of the member to add\n   * \n   * ID:7\n   */\n  BATCH_ADD_MEMBERSHIPS,\n\n  /**\n   * @notice Batch Suspend Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to suspend as member\n   * \n   * ID:8\n   */\n  BATCH_SUSPEND_MEMBERSHIPS,\n\n  /**\n   * @notice Batch Resume Member Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to reinstate as member\n   * \n   * ID:9\n   */\n  BATCH_RESUME_MEMBERSHIPS,\n\n  /**\n   * @notice Batch Change Member Role Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to change role of as member\n   * @param UINT256_2DARRAY[0] uint256[] memberRoleArray: the array of the role of the member to change\n   * \n   * ID:10\n   */\n  BATCH_CHANGE_MEMBER_ROLES,\n\n  /**\n   * @notice Batch Change Member Name Operation\n   * @param ADDRESS_2DARRAY[0] address[] memberAddressArray: the array of the address to change name of as member\n   * @param STRING_ARRAY string[] memberNameArray: the array of the name of the member to change\n   * \n   * ID:11\n   */\n  BATCH_CHANGE_MEMBER_NAMES,\n\n  /**\n   * @notice Batch Add Emergency Agent Operation\n   * @param Plugin[] pluginList: the array of the plugins\n   * ID:12\n   */\n  BATCH_ADD_PLUGINS,\n\n  /**\n   * @notice Batch Enable Plugin Operation\n   * @param UINT256_ARRAY[0] uint256[] pluginIndexArray: the array of the plugins index to enable\n   * @param BOOL_ARRAY bool[] isBeforeOperationArray: the array of the flag to indicate if the plugin is before operation\n   * ID:13\n   */\n  BATCH_ENABLE_PLUGINS,\n\n  /**\n   * @notice Batch Disable Plugin Operation\n   * @param UINT256_ARRAY[0] uint256[] pluginIndexArray: the array of the plugins index to disable\n   * @param BOOL_ARRAY bool[] isBeforeOperationArray: the array of the flag to indicate if the plugin is before operation\n   * ID:14\n   */\n  BATCH_DISABLE_PLUGINS,\n\n  /**\n   * @notice Batch Add and Enable Plugin Operation\n   * @param Plugin[] pluginList: the array of the plugins\n   * ID:15\n   */\n  BATCH_ADD_AND_ENABLE_PLUGINS,\n\n  /**\n   * @notice Batch Set Parameter Operation\n   * @param MachineParameter[] parameterNameArray: the array of the parameter name\n   * @param UINT256_2DARRAY[0] uint256[] parameterValueArray: the array of the parameter value\n   * ID:16\n   */\n  BATCH_SET_PARAMETERS,\n\n  /**\n   * @notice Batch Add Withdrawable Balance Operation\n   * @param ADDRESS_2DARRAY[0] addressArray: the array of the address to add withdrawable balance\n   * @param UINT256_2DARRAY[0] amountArray: the array of the amount to add withdrawable balance\n   * ID:17\n   */\n  BATCH_ADD_WITHDRAWABLE_BALANCES,\n\n  /**\n   * @notice Batch Reduce Withdrawable Balance Operation\n   * @param ADDRESS_2DARRAY[0] addressArray: the array of the address to substract withdrawable balance\n   * @param UINT256_2DARRAY[0] amountArray: the array of the amount to substract withdrawable balance\n   * ID:18\n   */\n  BATCH_REDUCE_WITHDRAWABLE_BALANCES,\n\n  /**\n   * @notice Batch Add Voting Rules\n   * @param VotingRule[] votingRuleList: the array of the voting rules\n   * ID:19\n   */\n  BATCH_ADD_VOTING_RULES,\n\n\n  /**\n   * @notice Batch Pay to Mint Tokens Operation\n   * @param ADDRESS_2DARRAY[0] address[] addressArray: the array of the address to mint tokens\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint tokens\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount to mint tokens\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to mint\n   * @param UINT256_2DARRAY[3] uint256[1] dividendableFlag: the flag to indicate if the payment is dividendable. 1 for yes (pay for purchase), 0 for no (pay for investment)\n   * ID:20\n   */\n  BATCH_PAY_TO_MINT_TOKENS,\n\n  /**\n   * @notice Pay some cash to transfer tokens (can be used as product coins)\n   * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to transfer\n   * @ param UINT256_2DARRAY[3] uint256[1] dividendableFlag: the flag to indicate if the payment is dividendable. 1 for yes (pay for purchase), 0 for no (pay for investment)\n   * ID:21\n   */\n  BATCH_PAY_TO_TRANSFER_TOKENS,\n\n  /**\n   * @notice Add an array of address as emergency agents\n   *  (can be used as product NFTs with a new unique token class)\n   * @param ADDRESS_2DARRAY[0] address[] The array of the address to add as emergency agents \n   * ID:22\n   */\n  ADD_EMERGENCY,\n\n  /**\n   * @notice Reserved ID 23 DO NOT USE\n   * ID:23\n   */\n  RESERVED_ID_23,\n\n  /**\n   * @notice Call emergency agents to handle emergency situations\n   * @param UINT256_2DARRAY[0] address[] addressArray: the array of the emergency agents index to call\n   * ID:24\n   */\n  CALL_EMERGENCY,\n\n\n  /**\n   * @notice Call a contract with the given abi\n   * @param ADDRESS_2D[0][0] address contractAddress: the address of the contract to call\n   * @param bytes abi the encodedWithSignature abi of the function to call\n   * @param UINT256_2DARRAY[0][0] uint256 the value to send to the contract\n   * ID:25\n   */\n  CALL_CONTRACT_ABI,\n\n  /**\n   * @notice Pay some cash\n   * @param uint256 amount: the amount of cash to pay\n   * @param uint256 paymentType: the type of cash to pay, 0 for ethers/matic/original tokens\n   *  1 for USDT, 2 for USDC (right now only 0 is supported), 3 for DAI ...\n   * @param uint256 dividendable: the flag to indicate if the payment is dividendable, \n   * 0 for no (pay for investment), 1 for yes (pay for purchase)\n   * ID:26\n   */\n  PAY_CASH,\n\n  /**\n   * @notice Calculate the dividends and offer to token holders\n   *  by adding the dividends to the withdrawable balance of each token holder\n   * \n   * ID:27\n   */\n  OFFER_DIVIDENDS,\n\n  /**\n   * @notice Reserved ID 28 DO NOT USE\n   * ID:28\n   */\n  RESERVED_ID_28,\n\n  /**\n   * @notice Set the approval for all transfer operations by address\n   * @paran address: the address to set approval for all transfer operations\n   * ADDRESS_2DARRAY[0][0] targetAddress\n   * ID:29\n   */\n  SET_APPROVAL_FOR_ALL_OPERATIONS,\n\n\n  /**\n   * @notice Batch Burn tokens and Refund\n   * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn tokens from\n   * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n   * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to burn\n   * ID:30\n   */\n  BATCH_BURN_TOKENS_AND_REFUND,\n\n  /**\n   * @notice Add a string (IPFS,JSON,raw text) to the storage list permanently\n   * @paran STRING_ARRAY[0][0] text: the string text to add to the storage list\n   * ID:31\n   */\n  ADD_STORAGE_STRING,\n\n\n  /**\n   * Below are two operations than can be used during voting pending process\n   */\n\n  /**\n   * @notice Vote for a voting pending program\n   * @param bool[] voteArray: the array of the vote for each program\n   * ID:32\n   */\n  VOTE,\n\n  /**\n   * @notice Execute a program that has been voted and approved\n   * ID:33\n   */\n  EXECUTE_PENDING_PROGRAM,\n\n  /**\n   * @notice Emergency mode termination. Emergency agents cannot do anything after this operation\n   * ID:34\n   */\n  END_EMERGENCY,\n\n  /**\n   * @notice Upgrade the contract to a new contract address\n   * @param ADDRESS_2DARRAY[0][0] The address of the new contract\n   * ID:35\n   */\n  UPGRADE_TO_ADDRESS,\n\n  /**\n   * @notice Accepting current DARCs to be upgraded from the old contract address\n   * @param ADDRESS_2DARRAY[0][0] The address of the old contract\n   * ID:36\n   */\n  CONFIRM_UPGRAED_FROM_ADDRESS,\n\n  /**\n   * @notice Upgrade the contract to the latest version\n   * ID:37\n   */\n  UPGRADE_TO_THE_LATEST\n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/ConditionExpressionFactory.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Program.sol\";\n\nimport \"./Condition_Operator.sol\";\nimport \"./Condition_MachineState.sol\";\nimport \"./Condition_Operation.sol\";\nimport \"./Condition_BatchOp.sol\";\nimport \"./Condition_PluginAndVoting.sol\";\nimport \"./Condition_MembershipOp.sol\";\nimport \"./Condition_Withdrawable.sol\";\nimport \"./Condition_TokenAndCash.sol\";\nimport \"./Condition_CreateTokenClass.sol\";\nimport \"./Condition_Program.sol\";\nimport \"./Condition_OperationLog.sol\";\nimport \"./Condition_External.sol\";\n\n\n/**\n * @title The condition expression factory contract of DARC\n * @author DARC Team\n * @notice The factory contract is used to create and check all the condition expressions.\n */\ncontract ConditionExpressionFactory is  \n  Condition_Operator, Condition_MachineState, Condition_Operation, Condition_BatchOp, Condition_PluginAndVoting,\n  Condition_MembershipOp, Condition_Withdrawable, Condition_TokenAndCash,\n  Condition_CreateTokenClass, Condition_Program, Condition_OperationLog,\n  Condition_External\n{\n\n  /**\n   * @notice The entrance of the condition expression factory contract\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param operation The operation index to be checked\n   * @param program The program to be checked (for checking the program-related conditions, such as program length)\n   * @param pluginIndex The index of the plugin in the plugin system\n   * @param nodeIndex The index of the condition expression node in the condition expression tree\n   * @return bool The result of current condition expression \n   */\n  function conditionExpressionCheck(bool bIsBeforeOperation, Operation memory operation, Program memory program, uint256 pluginIndex, uint256 nodeIndex) internal view returns (bool) {\n    // get current condition expression node\n    uint256 exp = bIsBeforeOperation ?\n     currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].conditionExpression : \n     currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].conditionExpression;\n\n    // get current condition expression node's parameter list \n    NodeParam memory param = bIsBeforeOperation ?\n     currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].param : \n     currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].param;\n\n    if (exp <= 50) { return operatorExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    if (exp >= 51 && exp <= 149) { return machineStateExpressionCheck(bIsBeforeOperation, param, exp); }\n\n    if (exp >=151 && exp <= 180) { return operationExpressionCheck( operation, param, exp); }\n\n    if (exp >= 181 && exp <= 210) { return externalExpressionCheck(param, exp); }\n\n    if (exp >= 211 && exp <= 300) { return batchOpExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    if (exp >= 301 && exp < 400 ) { return pluginAndVotingOpExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    if (exp >= 401 && exp <= 430) { return membershipOpExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    if (exp >= 431 && exp <= 460) { return withdrawableExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    if (exp >= 461 && exp <= 500) { return tokenAndCashExpressionCheck(operation, param, exp);}\n\n    if (exp>=501 && exp <= 600) { return createTokenClassExpressionCheck(operation, param, exp); }\n\n    if (exp>=601 && exp <= 700) { return programExpressionCheck(program, param, exp); }\n\n    if (exp >= 701) { return operationLogExpressionCheck(bIsBeforeOperation, operation, param, exp); }\n\n    // default:\n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_BatchOp.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Batch Operation\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_BatchOp is MachineStateManager { \n  /**\n   * The function to check the batch operation related condition expression\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param op The operation to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function batchOpExpressionCheck(bool bIsBeforeOperation, Operation memory op, NodeParam memory param, uint256 id) internal view returns (bool)\n  {\n    if (id == 211) return ID_211_BATCH_OP_SIZE_GREATER_THAN(op, param);\n    if (id == 212) return ID_212_BATCH_OP_SIZE_LESS_THAN(op, param);\n    if (id == 213) return ID_213_BATCH_OP_SIZE_IN_RANGE(op, param);\n    if (id == 214) return ID_214_BATCH_OP_SIZE_EQUALS(op, param);\n    if (id == 215) return ID_215_BATCH_OP_EACH_TARGET_ADDRESSES_EQUALS(op, param);\n    if (id == 216) return ID_216_BATCH_OP_EACH_TARGET_ADDRESSES_IN_LIST(op, param);\n    if (id == 217) return ID_217_BATCH_OP_EACH_TARGET_ADDRESSES_IN_MEMBER_ROLE(bIsBeforeOperation, op, param);\n    if (id == 218) return ID_218_BATCH_OP_ANY_TARGET_ADDRESS_EQUALS(op, param);\n    if (id == 219) return ID_219_BATCH_OP_ANY_TARGET_ADDRESS_IN_LIST(op, param);\n    if (id == 220) return ID_220_BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE(bIsBeforeOperation, op, param);\n    if (id == 221) return ID_221_BATCH_OP_EACH_TARGET_ADDRESS_TO_ITSELF(op);\n    if (id == 222) return ID_222_BATCH_OP_ANY_TARGET_ADDRESS_TO_ITSELF(op);\n    if (id == 223) return ID_223_BATCH_OP_EACH_SOURCE_ADDRESS_EQUALS(op, param);\n    if (id == 224) return ID_224_BATCH_OP_EACH_SOURCE_ADDRESS_IN_LIST(op, param); \n    if (id == 225) return ID_225_BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE(bIsBeforeOperation, op, param);\n    if (id == 226) return ID_226_BATCH_OP_ANY_SOURCE_ADDRESS_EQUALS(op, param);\n    if (id == 227) return ID_227_BATCH_OP_ANY_SOURCE_ADDRESS_IN_LIST(op, param);\n    if (id == 228) return ID_228_BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE(bIsBeforeOperation, op, param);\n    if (id == 229) return ID_229_BATCH_OP_EACH_SOURCE_ADDRESS_FROM_ITSELF(op);\n    if (id == 230) return ID_230_BATCH_OP_ANY_SOURCE_ADDRESS_FROM_ITSELF(op);\n    if (id == 231) return ID_231_BATCH_OP_EACH_TOKEN_CLASS_EQUALS(op, param);\n    if (id == 232) return ID_232_BATCH_OP_EACH_TOKEN_CLASS_IN_LIST(op, param);\n    if (id == 233) return ID_233_BATCH_OP_EACH_TOKEN_CLASS_IN_RANGE(op, param);\n    if (id == 234) return ID_234_BATCH_OP_EACH_TOKEN_CLASS_GREATER_THAN(op, param);\n    if (id == 235) return ID_235_BATCH_OP_EACH_TOKEN_CLASS_LESS_THAN(op, param);\n    if (id == 236) return ID_236_BATCH_OP_TOTAL_TOKEN_AMOUNT_GREATER_THAN(op, param);\n    if (id == 237) return ID_237_BATCH_OP_TOTAL_TOKEN_AMOUNT_LESS_THAN(op, param);\n    if (id == 238) return ID_238_BATCH_OP_TOTAL_TOKEN_AMOUNT_IN_RANGE(op, param);\n    if (id == 239) return ID_239_BATCH_OP_TOTAL_TOKEN_AMOUNT_EQUALS(op, param);\n    if (id == 240) return ID_240_BATCH_OP_ANY_TOKEN_AMOUNT_GREATER_THAN(op, param);\n    if (id == 241) return ID_241_BATCH_OP_ANY_TOKEN_AMOUNT_LESS_THAN(op, param);\n    if (id == 242) return ID_242_BATCH_OP_ANY_TOKEN_AMOUNT_IN_RANGE(op, param);\n    if (id == 243) return ID_243_BATCH_OP_ANY_TOKEN_AMOUNT_EQUALS(op, param);\n    if (id == 244) return ID_244_BATCH_OP_ANY_TOKEN_CLASS_GREATER_THAN(op, param);\n    if (id == 245) return ID_245_BATCH_OP_ANY_TOKEN_CLASS_LESS_THAN(op, param);\n    if (id == 246) return ID_246_BATCH_OP_ANY_TOKEN_CLASS_IN_RANGE(op, param);\n    if (id == 247) return ID_247_BATCH_OP_ANY_TOKEN_CLASS_EQUALS(op, param);\n    if (id == 248) return ID_248_BATCH_OP_ANY_TOKEN_CLASS_IN_LIST(op, param);\n    if (id == 249) return ID_249_BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST(bIsBeforeOperation, op, param); \n    if (id == 250) return ID_250_BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST(bIsBeforeOperation, op, param);\n    if (id == 251) return ID_251_BATCH_OP_EACH_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST(bIsBeforeOperation, op, param);\n    if (id == 252) return ID_252_BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST(bIsBeforeOperation, op, param); \n    if (id == 253) return ID_253_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 254) return ID_254_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 255) return ID_255_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE(bIsBeforeOperation, op, param); \n    if (id == 256) return ID_256_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_EQUALS(bIsBeforeOperation, op, param);\n    if (id == 257) return ID_257_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 258) return ID_258_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 259) return ID_259_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 260) return ID_260_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 261) return ID_261_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 262) return ID_262_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 263) return ID_263_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_EQUALS(bIsBeforeOperation, op, param);\n    if (id == 264) return ID_264_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 265) return ID_265_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, op, param); \n    if (id == 266) return ID_266_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 267) return ID_267_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 268) return ID_268_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 269) return ID_269_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, op, param); \n    if (id == 270) return ID_270_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, op, param);\n    if (id == 271) return ID_271_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 272) return ID_272_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 273) return ID_273_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN(bIsBeforeOperation, op, param); \n    if (id == 274) return ID_274_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 275) return ID_275_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 276) return ID_276_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN(bIsBeforeOperation, op, param); \n    if (id == 277) return ID_277_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN(bIsBeforeOperation, op, param);\n    if (id == 278) return ID_278_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE(bIsBeforeOperation, op, param);\n    return false;\n  }\n\n  function ID_211_BATCH_OP_SIZE_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_211: The UINT_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_211: The UINT_2DARRAY[0] length is not 1\");\n    (bool bIsBatchOp, uint256 batchSize) = getBatchSize(op);\n    if (!bIsBatchOp) return false;\n    return batchSize > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_212_BATCH_OP_SIZE_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_212: The UINT_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_212: The UINT_2DARRAY[0] length is not 1\");\n    (bool bIsBatchOp, uint256 batchSize) = getBatchSize(op);\n    if (!bIsBatchOp) return false;\n    return batchSize < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_213_BATCH_OP_SIZE_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_213: The UINT_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_213: The UINT_2DARRAY[0] length is not 2\");\n    (bool bIsBatchOp, uint256 batchSize) = getBatchSize(op);\n    if (!bIsBatchOp) return false;\n    return batchSize >= param.UINT256_2DARRAY[0][0] && batchSize <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_214_BATCH_OP_SIZE_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_214: The UINT_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_214: The UINT_2DARRAY[0] length is not 1\");\n    (bool bIsBatchOp, uint256 batchSize) = getBatchSize(op);\n    if (!bIsBatchOp) return false;\n    return batchSize == param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_215_BATCH_OP_EACH_TARGET_ADDRESSES_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_215: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_215: The ADDRESS_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      if (targetAddressList[i] != param.ADDRESS_2DARRAY[0][0]) return false;\n    }\n    return true;\n  }\n\n  function ID_216_BATCH_OP_EACH_TARGET_ADDRESSES_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_216: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length >= 1, \"CE ID_216: The ADDRESS_2DARRAY[0] length is not greater than 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      bool bIsInList = false;\n      for (uint256 j = 0; j < param.ADDRESS_2DARRAY[0].length; j++) {\n        if (targetAddressList[i] == param.ADDRESS_2DARRAY[0][j]) {\n          bIsInList = true;\n          break;\n        }\n      }\n      if (!bIsInList) return false;\n    }\n    return true;\n  }\n\n  function ID_217_BATCH_OP_EACH_TARGET_ADDRESSES_IN_MEMBER_ROLE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_217: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_217: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (!currentMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        if (! (currentMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][0])) {\n          return false;\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (!sandboxMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        if (! (sandboxMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][0])) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  function ID_218_BATCH_OP_ANY_TARGET_ADDRESS_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_218: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_218: The ADDRESS_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      if (targetAddressList[i] == param.ADDRESS_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_219_BATCH_OP_ANY_TARGET_ADDRESS_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_219: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length >= 1, \"CE ID_219: The ADDRESS_2DARRAY[0] length is not greater than 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      for (uint256 j = 0; j < param.ADDRESS_2DARRAY[0].length; j++) {\n        if (targetAddressList[i] == param.ADDRESS_2DARRAY[0][j]) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_220_BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_220: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_220: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          if (currentMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][0]) {\n            return true;\n          }\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          if (sandboxMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][0]) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_221_BATCH_OP_EACH_TARGET_ADDRESS_TO_ITSELF(Operation memory op) private pure returns (bool)\n  {\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (targetAddressList.length == 0) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      if (targetAddressList[i] != op.operatorAddress) return false;\n    }\n    return true;\n  }\n\n  function ID_222_BATCH_OP_ANY_TARGET_ADDRESS_TO_ITSELF(Operation memory op) private pure returns (bool)\n  {\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (targetAddressList.length == 0) return false;\n    for (uint256 i = 0; i < targetAddressList.length; i++) {\n      if (targetAddressList[i] == op.operatorAddress) return true;\n    }\n    return false;\n  }\n\n  function ID_223_BATCH_OP_EACH_SOURCE_ADDRESS_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_223: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_223: The ADDRESS_2DARRAY[0] length is not 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      if (sourceAddressList[i] != param.ADDRESS_2DARRAY[0][0]) return false;\n    }\n    return true;\n  }\n\n  function ID_224_BATCH_OP_EACH_SOURCE_ADDRESS_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_224: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length >= 1, \"CE ID_224: The ADDRESS_2DARRAY[0] length is not greater than 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      bool bIsInList = false;\n      for (uint256 j = 0; j < param.ADDRESS_2DARRAY[0].length; j++) {\n        if (sourceAddressList[i] == param.ADDRESS_2DARRAY[0][j]) {\n          bIsInList = true;\n          break;\n        }\n      }\n      if (!bIsInList) return false;\n    }\n    return true;\n  }\n\n  function ID_225_BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_225: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_225: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (!currentMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        if (! (currentMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][0])) {\n          return false;\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (!sandboxMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        if (! (sandboxMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][0])) {\n          return false;\n        }\n      }\n    }\n    return true;\n  }\n\n  function ID_226_BATCH_OP_ANY_SOURCE_ADDRESS_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_226: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_226: The ADDRESS_2DARRAY[0] length is not 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      if (sourceAddressList[i] == param.ADDRESS_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_227_BATCH_OP_ANY_SOURCE_ADDRESS_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_227: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length >= 1, \"CE ID_227: The ADDRESS_2DARRAY[0] length is not greater than 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      for (uint256 j = 0; j < param.ADDRESS_2DARRAY[0].length; j++) {\n        if (sourceAddressList[i] == param.ADDRESS_2DARRAY[0][j]) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_228_BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_228: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_228: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (currentMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          if (currentMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][0]) {\n            return true;\n          }\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (sandboxMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          if (sandboxMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][0]) {\n            return true;\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_229_BATCH_OP_EACH_SOURCE_ADDRESS_FROM_ITSELF(Operation memory op) private pure returns (bool)\n  {\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (sourceAddressList.length == 0) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      if (sourceAddressList[i] != op.operatorAddress) return false;\n    }\n    return true;\n  }\n\n  function ID_230_BATCH_OP_ANY_SOURCE_ADDRESS_FROM_ITSELF(Operation memory op) private pure returns (bool)\n  {\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (sourceAddressList.length == 0) return false;\n    for (uint256 i = 0; i < sourceAddressList.length; i++) {\n      if (sourceAddressList[i] == op.operatorAddress) return true;\n    }\n    return false;\n  }\n\n  function ID_231_BATCH_OP_EACH_TOKEN_CLASS_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_231: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_231: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] != param.UINT256_2DARRAY[0][0]) return false;\n    }\n    return true;\n  }\n\n  function ID_232_BATCH_OP_EACH_TOKEN_CLASS_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_232: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_232: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      bool bIsInList = false;\n      for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n        if (tokenClassList[i] == param.UINT256_2DARRAY[0][j]) {\n          bIsInList = true;\n          break;\n        }\n      }\n      if (!bIsInList) return false;\n    }\n    return true;\n  }\n\n  function ID_233_BATCH_OP_EACH_TOKEN_CLASS_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_233: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_233: The UINT256_2DARRAY[0] length is not 2\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] < param.UINT256_2DARRAY[0][0] || tokenClassList[i] > param.UINT256_2DARRAY[0][1]) return false;\n    }\n    return true;\n  }\n\n  function ID_234_BATCH_OP_EACH_TOKEN_CLASS_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_234: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_234: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] <= param.UINT256_2DARRAY[0][0]) return false;\n    }\n    return true;\n  }\n\n  function ID_235_BATCH_OP_EACH_TOKEN_CLASS_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_235: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_235: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] >= param.UINT256_2DARRAY[0][0]) return false;\n    }\n    return true;\n  }\n\n  function ID_236_BATCH_OP_TOTAL_TOKEN_AMOUNT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_236: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_236: The UINT256_2DARRAY[0] length is not 1\");\n    (, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < tokenAmountList.length; i++) {\n      totalAmount += tokenAmountList[i];\n    }\n    return (totalAmount > param.UINT256_2DARRAY[0][0]);\n  }\n\n  function ID_237_BATCH_OP_TOTAL_TOKEN_AMOUNT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_237: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_237: The UINT256_2DARRAY[0] length is not 1\");\n    (, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < tokenAmountList.length; i++) {\n      totalAmount += tokenAmountList[i];\n    }\n    return (totalAmount < param.UINT256_2DARRAY[0][0]);\n  }\n\n  function ID_238_BATCH_OP_TOTAL_TOKEN_AMOUNT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_238: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_238: The UINT256_2DARRAY[0] length is not 2\");\n    (, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < tokenAmountList.length; i++) {\n      totalAmount += tokenAmountList[i];\n    }\n    return (totalAmount >= param.UINT256_2DARRAY[0][0] && totalAmount <= param.UINT256_2DARRAY[0][1]);\n  }\n\n  function ID_239_BATCH_OP_TOTAL_TOKEN_AMOUNT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_239: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_239: The UINT256_2DARRAY[0] length is not 1\");\n    (, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < tokenAmountList.length; i++) {\n      totalAmount += tokenAmountList[i];\n    }\n    return (totalAmount == param.UINT256_2DARRAY[0][0]);\n  }\n\n  function ID_240_BATCH_OP_ANY_TOKEN_AMOUNT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_240: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_240: The UINT256_2DARRAY[0] length is not 1\");\n    (, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenAmountList.length; i++) {\n      if (tokenAmountList[i] > param.UINT256_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_241_BATCH_OP_ANY_TOKEN_AMOUNT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_241: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_241: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenAmountList[i] < param.UINT256_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_242_BATCH_OP_ANY_TOKEN_AMOUNT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_242: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_242: The UINT256_2DARRAY[0] length is not 2\");\n    (uint256[] memory tokenClassList, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenAmountList[i] >= param.UINT256_2DARRAY[0][0] && tokenAmountList[i] <= param.UINT256_2DARRAY[0][1]) return true;\n    }\n    return false;\n  }\n\n  function ID_243_BATCH_OP_ANY_TOKEN_AMOUNT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_243: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_243: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, uint256[] memory tokenAmountList, bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenAmountList[i] == param.UINT256_2DARRAY[0][0] ) return true;\n    }\n    return false;\n  }\n\n  function ID_244_BATCH_OP_ANY_TOKEN_CLASS_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_244: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_244: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] > param.UINT256_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_245_BATCH_OP_ANY_TOKEN_CLASS_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_245: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_245: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] < param.UINT256_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_246_BATCH_OP_ANY_TOKEN_CLASS_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_246: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_246: The UINT256_2DARRAY[0] length is not 2\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] >= param.UINT256_2DARRAY[0][0] && tokenClassList[i] <= param.UINT256_2DARRAY[0][1]) return true;\n    }\n    return false;\n  }\n\n  function ID_247_BATCH_OP_ANY_TOKEN_CLASS_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_247: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_247: The UINT256_2DARRAY[0] length is not 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0]) return true;\n    }\n    return false;\n  }\n\n  function ID_248_BATCH_OP_ANY_TOKEN_CLASS_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_248: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_248: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (uint256[] memory tokenClassList, , bool bIsValid) = getTokenClassAndAmount(op);\n    if (!bIsValid) return false;\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n        if (tokenClassList[i] == param.UINT256_2DARRAY[0][j]) {\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_249_BATCH_OP_EACH_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_249: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_249: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (!currentMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        bool bIsInList = false;\n        for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n          if (currentMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (!sandboxMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        bool bIsInList = false;\n        for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n          if (sandboxMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_250_BATCH_OP_ANY_SOURCE_ADDRESS_IN_MEMBER_ROLE_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_250: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_250: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (address[] memory sourceAddressList, bool bIsValid) = getAllSourceAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (currentMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n            if (currentMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n              return true;\n            }\n          }\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < sourceAddressList.length; i++) {\n        if (sandboxMachineState.memberInfoMap[sourceAddressList[i]].bIsInitialized) {\n          for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n            if (sandboxMachineState.memberInfoMap[sourceAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n              return true;\n            }\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_251_BATCH_OP_EACH_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_251: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_251: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (!currentMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        bool bIsInList = false;\n        for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n          if (currentMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (!sandboxMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          return false;\n        }\n        bool bIsInList = false;\n        for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n          if (sandboxMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_252_BATCH_OP_ANY_TARGET_ADDRESS_IN_MEMBER_ROLE_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_252: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length >= 1, \"CE ID_252: The UINT256_2DARRAY[0] length is not greater than 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n            if (currentMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n              return true;\n            }\n          }\n        }\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.memberInfoMap[targetAddressList[i]].bIsInitialized) {\n          for (uint256 j = 0; j < param.UINT256_2DARRAY[0].length; j++) {\n            if (sandboxMachineState.memberInfoMap[targetAddressList[i]].role == param.UINT256_2DARRAY[0][j]) {\n              return true;\n            }\n          }\n        }\n      }\n    }\n    return false;\n  }\n\n  function ID_253_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_253: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_253: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_254_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_254: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_254: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_255_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_255: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_255: The UINT256_2DARRAY[0] length is not 2\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] < param.UINT256_2DARRAY[0][0] || currentMachineState.withdrawableCashMap[targetAddressList[i]] > param.UINT256_2DARRAY[0][1]) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] < param.UINT256_2DARRAY[0][0] || sandboxMachineState.withdrawableCashMap[targetAddressList[i]] > param.UINT256_2DARRAY[0][1]) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_256_BATCH_OP_EACH_TARGET_ADDRESS_WITHDRAWABLE_CASH_EQUALS(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_256: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_256: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] != param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] != param.UINT256_2DARRAY[0][0]) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_257_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_257: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_257: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] > param.UINT256_2DARRAY[0][0]) return true;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] > param.UINT256_2DARRAY[0][0]) return true;\n      }\n    }\n    return false;\n  }\n\n  function ID_258_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_258: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_258: The UINT256_2DARRAY[0] length is not 1\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (currentMachineState.withdrawableCashMap[targetAddressList[i]] < param.UINT256_2DARRAY[0][0]) return true;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] < param.UINT256_2DARRAY[0][0]) return true;\n      }\n    }\n    return false;\n  }\n\n  function ID_259_BATCH_OP_ANY_TARGET_ADDRESS_WITHDRAWABLE_CASH_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_259: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_259: The UINT256_2DARRAY[0] length is not 2\");\n    (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n    if (!bIsValid) return false;\n    if (bIsBeforeOperation){\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n          if (currentMachineState.withdrawableCashMap[targetAddressList[i]] >= param.UINT256_2DARRAY[0][0] && currentMachineState.withdrawableCashMap[targetAddressList[i]] <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n    }\n    else {\n      for (uint256 i = 0; i < targetAddressList.length; i++) {\n        if (sandboxMachineState.withdrawableCashMap[targetAddressList[i]] >= param.UINT256_2DARRAY[0][0] && sandboxMachineState.withdrawableCashMap[targetAddressList[i]] <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n    }\n    return false;\n  }\n\n  function ID_260_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_260: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_260: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_261_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_261: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_261: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_262_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_262: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_262: The UINT256_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) < param.UINT256_2DARRAY[0][0] || addressTotalVotingWeight(false, targetAddressList[index]) > param.UINT256_2DARRAY[0][1]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) < param.UINT256_2DARRAY[0][0] || addressTotalVotingWeight(true, targetAddressList[index]) > param.UINT256_2DARRAY[0][1]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_263_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_EQUALS(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_263: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_263: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) != param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) != param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_264_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_264: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_264: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) > param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) > param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_265_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_265: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_265: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(false, targetAddressList[index]) < param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalVotingWeight(true, targetAddressList[index]) < param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_266_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_266: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_266: The UINT256_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n          if (addressTotalVotingWeight(false, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(false, targetAddressList[index]) <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n          if (addressTotalVotingWeight(true, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(true, targetAddressList[index]) <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_267_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_267: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_267: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) <= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_268_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_268: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_268: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_269_BATCH_OP_EACH_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_269: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_269: The UINT256_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) < param.UINT256_2DARRAY[0][0] || addressTotalDividendWeight(false, targetAddressList[index]) > param.UINT256_2DARRAY[0][1]) return false;\n      }\n      return true;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) < param.UINT256_2DARRAY[0][0] || addressTotalDividendWeight(true, targetAddressList[index]) > param.UINT256_2DARRAY[0][1]) return false;\n      }\n      return true;\n    }\n  }\n\n  function ID_270_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_270: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_270: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) > param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) return false;\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) > param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_271_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_271: The UINT256_2DARRAY[0] length is not 1\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_271: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) {\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) < param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) {\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) < param.UINT256_2DARRAY[0][0]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_272_BATCH_OP_ANY_TARGET_ADDRESS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_272: The UINT256_2DARRAY[0] length is not 2\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_272: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) {\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(false, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(false, targetAddressList[index]) <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid) {\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (addressTotalDividendWeight(true, targetAddressList[index]) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(true, targetAddressList[index]) <= param.UINT256_2DARRAY[0][1]) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_273_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_273: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_273: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] <= param.UINT256_2DARRAY[0][1] ) return false;\n      }\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] <= param.UINT256_2DARRAY[0][1] ) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_274_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_274: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_274: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] >= param.UINT256_2DARRAY[0][1] ) return false;\n      }\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] >= param.UINT256_2DARRAY[0][1] ) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_275_BATCH_OP_EACH_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 3, \"CE ID_275: The UINT256_2DARRAY[0] length is not 3\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_275: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] < param.UINT256_2DARRAY[0][1] || currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] > param.UINT256_2DARRAY[0][2] ) return false;\n      }\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] < param.UINT256_2DARRAY[0][1] || sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] > param.UINT256_2DARRAY[0][2] ) return false;\n      }\n    }\n    return true;\n  }\n\n  function ID_276_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_276: The UINT256_2DARRAY[0] length is not 2\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_276: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] > param.UINT256_2DARRAY[0][1] ) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] > param.UINT256_2DARRAY[0][1] ) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_277_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_277: The UINT256_2DARRAY[0] length is not 2\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_277: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] < param.UINT256_2DARRAY[0][1] ) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] < param.UINT256_2DARRAY[0][1] ) return true;\n      }\n      return false;\n    }\n  }\n\n  function ID_278_BATCH_OP_ANY_TARGET_ADDRESS_OWNS_TOKEN_X_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool)\n  {\n    require(param.UINT256_2DARRAY[0].length == 3, \"CE ID_278: The UINT256_2DARRAY[0] length is not 3\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_278: The UINT256_2DARRAY length is not 1\");\n    if (bIsBeforeOperation) {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] >= param.UINT256_2DARRAY[0][1] && currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] <= param.UINT256_2DARRAY[0][2] ) return true;\n      }\n      return false;\n    }\n    else {\n      (address[] memory targetAddressList, bool bIsValid) = getAllTargetAddress(op);\n\n      if (!bIsValid){\n        return false;\n      }\n      for (uint256 index = 0; index < targetAddressList.length; index++) {\n        if (sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] >= param.UINT256_2DARRAY[0][1] && sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[targetAddressList[index]] <= param.UINT256_2DARRAY[0][2] ) return true;\n      }\n      return false;\n    }\n  }\n\n\n\n  // ----------------------------------------------------------\n  // below are helper functions for batch-op related operations\n  // ----------------------------------------------------------\n\n\n\n  /**\n   * @notice get the batch size of the batch operation\n   * @param op the operation to be checked\n   * @return bool the flag to indicate if the operation is a batch operation\n   * @return uint256 the batch size of the batch operation\n   */\n  function getBatchSize(Operation memory op) private pure returns (bool, uint256) {\n    bool bIsBatchOp = isBatchOp(op);\n    uint256 batchSize = 0;\n    if (!bIsBatchOp) return (false, batchSize);\n    if (op.param.PLUGIN_ARRAY.length != 0 && (op.opcode == EnumOpcode.BATCH_ADD_PLUGINS || op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS ) ) {\n      return (true, op.param.PLUGIN_ARRAY.length);\n    }\n    else if (op.param.VOTING_RULE_ARRAY.length != 0 && op.opcode == EnumOpcode.BATCH_ADD_VOTING_RULES) {\n      return (true, op.param.VOTING_RULE_ARRAY.length);\n    }\n    else if (op.param.PARAMETER_ARRAY.length != 0 && op.opcode == EnumOpcode.BATCH_SET_PARAMETERS) {\n      return (true, op.param.PARAMETER_ARRAY.length);\n    }\n    else if (op.param.ADDRESS_2DARRAY.length != 0) {\n      if (op.param.ADDRESS_2DARRAY[0].length != 0) {\n        return (true, op.param.ADDRESS_2DARRAY[0].length);\n      }\n    }\n    else if (op.param.BOOL_ARRAY.length != 0) {\n      return (true, op.param.BOOL_ARRAY.length);\n    }\n    else if (op.param.UINT256_2DARRAY.length !=0 ) {\n      if (op.param.UINT256_2DARRAY[0].length != 0) {\n        return (true, op.param.UINT256_2DARRAY[0].length);\n      }\n    }\n\n    return (false, batchSize);\n  }\n\n/**\n * @notice check if the operation is a batch operation\n * @param op the operation to be checked\n * @return bool the flag to indicate if the operation is a batch operation\n */\n  function isBatchOp(Operation memory op) private pure returns (bool) {\n    if (op.opcode == EnumOpcode.BATCH_MINT_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return true;\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_FROM) return true;\n    if (op.opcode == EnumOpcode.BATCH_ADD_MEMBERSHIPS) return true;\n    if (op.opcode == EnumOpcode.BATCH_SUSPEND_MEMBERSHIPS) return true;\n    if (op.opcode == EnumOpcode.BATCH_RESUME_MEMBERSHIPS) return true;\n    if (op.opcode == EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) return true;\n    if (op.opcode == EnumOpcode.BATCH_CHANGE_MEMBER_NAMES) return true;\n    if (op.opcode == EnumOpcode.BATCH_ADD_PLUGINS) return true;\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS) return true;\n    if (op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) return true;\n    if (op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS) return true;\n    if (op.opcode == EnumOpcode.BATCH_SET_PARAMETERS) return true;\n    if (op.opcode == EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return true;\n    if (op.opcode == EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return true;\n    if (op.opcode == EnumOpcode.BATCH_ADD_VOTING_RULES) return true;\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) return true;\n    return false;\n  }\n\n  /**\n   * @notice check if the operation is a token operation\n   * @param op the operation to be checked\n   * @return bool the flag to indicate if the operation is a token operation\n   */\n  function isTokenOp(Operation memory op) private pure returns (bool) {\n    if (op.opcode == EnumOpcode.BATCH_MINT_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false; // batch create token classes is not a token operation\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) return true;\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS) return true;\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_FROM) return true;\n\n    return false;\n  }\n\n  /**\n   * @notice get all target addresses of the batch operation\n   * @param op the operation to be checked\n   * @return address[] the target address list of the batch operation\n   * @return bool the flag to indicate if the operation is a batch operation\n   */\n  function getAllTargetAddress(Operation memory op) pure private returns (address[] memory, bool ) {\n    if (!isBatchOp(op)) return (new address[](0), false);\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) {\n       // ADDRESS_2DARRAY[0] is the source address list, ADDRESS_2DARRAY[1] is the target address list\n      return (op.param.ADDRESS_2DARRAY[1], true);\n    }\n    if (op.param.ADDRESS_2DARRAY.length != 0) {\n      return (op.param.ADDRESS_2DARRAY[0], true);\n    }\n    return (new address[](0), false);\n  }\n\n  /**\n   * @notice get all source addresses of the batch operation\n   * @param op the operation to be checked\n   * @return address[] the source address list of the batch operation\n   * @return bool the flag to indicate if the operation is a batch operation\n   */\n  function getAllSourceAddress(Operation memory op) pure private returns (address[] memory, bool ) {\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) {\n       // ADDRESS_2DARRAY[0] is the source address list, ADDRESS_2DARRAY[1] is the target address list\n      return (op.param.ADDRESS_2DARRAY[0], true);\n    }\n    return (new address[](0), false);\n  }\n\n  /**\n   * @notice get all token class and amount of the batch operation\n   * @param op the operation to be checked\n   * @return uint256[] the token class index list of the batch operation\n   * @return uint256[] the token amount list of the batch operation\n   * @return bool the flag to indicate if the operation is a batch operation\n   */\n  function getTokenClassAndAmount(Operation memory op) pure private returns (uint256[] memory, uint256[] memory, bool ) {\n    if (!isTokenOp(op)) return (new uint256[](0), new uint256[](0), false);\n    if (op.opcode == EnumOpcode.BATCH_MINT_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_FROM) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], true);\n    }\n    return (new uint256[](0), new uint256[](0), false);\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_CreateTokenClass.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Creation of Token Classes\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_CreateTokenClass is MachineStateManager { \n  function createTokenClassExpressionCheck(Operation memory op, NodeParam memory param, uint256 id) internal pure returns (bool) {\n\n    if (id == 501) { return ID_501_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_GREATER_THAN(op, param); }\n    if (id == 502) { return ID_502_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_LESS_THAN(op, param); }\n    if (id == 503) { return ID_503_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_IN_RANGE(op, param); }\n    if (id == 504) { return ID_504_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_EQUALS(op, param); }\n    if (id == 505) { return ID_505_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_GREATER_THAN(op, param); }\n    if (id == 506) { return ID_506_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_LESS_THAN(op, param); }\n    if (id == 507) { return ID_507_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_IN_RANGE(op, param); }\n    if (id == 508) { return ID_508_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_EQUALS(op, param); }\n    return false;\n  }\n\n  function ID_501_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_501: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_501: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[2].length; i++) {\n      if (op.param.UINT256_2DARRAY[2][i] > param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_502_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_502: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_502: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[2].length; i++) {\n      if (op.param.UINT256_2DARRAY[2][i] < param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_503_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_503: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_503: The UINT256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[2].length; i++) {\n      if (op.param.UINT256_2DARRAY[2][i] >= param.UINT256_2DARRAY[0][0] && op.param.UINT256_2DARRAY[2][i] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_504_CREATE_TOKEN_CLASSES_ANY_TOKEN_DIVIDEND_WEIGHT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_504: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_504: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[2].length; i++) {\n      if (op.param.UINT256_2DARRAY[2][i] == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_505_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_505: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_505: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[3].length; i++) {\n      if (op.param.UINT256_2DARRAY[1][i] > param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_506_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_506: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_506: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[3].length; i++) {\n      if (op.param.UINT256_2DARRAY[1][i] < param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_507_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_507: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_507: The UINT256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[3].length; i++) {\n      if (op.param.UINT256_2DARRAY[1][i] >= param.UINT256_2DARRAY[0][0] && op.param.UINT256_2DARRAY[1][i] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_508_CREATE_TOKEN_CLASSES_ANY_VOTING_WEIGHT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_508: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_508: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[3].length; i++) {\n      if (op.param.UINT256_2DARRAY[1][i] == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_External.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Oracle values\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"../Utilities/ExternalValueReader.sol\";\n\ncontract Condition_External is MachineStateManager { \n  /**\n   * The function to check the external(oracle) related condition expression\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function externalExpressionCheck(NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id== 181)  return ID_181_EXTERNAL_CALL_UINT256_RESULT_EQUALS(param);\n    if (id== 182)  return ID_182_EXTERNAL_CALL_UINT256_RESULT_GREATER_THAN(param);\n    if (id== 183)  return ID_183_EXTERNAL_CALL_UINT256_RESULT_LESS_THAN(param);\n    if (id== 184)  return ID_184_EXTERNAL_CALL_UINT256_RESULT_IN_RANGE(param);\n    if (id== 185)  return ID_185_EXTERNAL_CALL_STRING_RESULT_EQUALS(param);\n    return false;\n  }\n\n  function ID_181_EXTERNAL_CALL_UINT256_RESULT_EQUALS(NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_181: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_181: The ADDRESS_2DARRAY[0] length is not 1\");\n    (bool success, uint256 value) = ExternalValueReader.tryReadUINT256(param.ADDRESS_2DARRAY[0][0], param.BYTES);\n    if (!success) { return false; }\n    if (value == param.UINT256_2DARRAY[0][0]) { return true; }\n    return false;\n  }\n\n  function ID_182_EXTERNAL_CALL_UINT256_RESULT_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_182: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_182: The ADDRESS_2DARRAY[0] length is not 1\");\n    (bool success, uint256 value) = ExternalValueReader.tryReadUINT256(param.ADDRESS_2DARRAY[0][0], param.BYTES);\n    if (!success) { return false; }\n    if (value > param.UINT256_2DARRAY[0][0]) { return true; }\n    return false;\n  }\n\n  function ID_183_EXTERNAL_CALL_UINT256_RESULT_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_183: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_183: The ADDRESS_2DARRAY[0] length is not 1\");\n\n    (bool success, uint256 value) = ExternalValueReader.tryReadUINT256(param.ADDRESS_2DARRAY[0][0], param.BYTES);\n    if (!success) { return false; }\n    if (value < param.UINT256_2DARRAY[0][0]) { return true; }\n    return false;\n  }\n\n  function ID_184_EXTERNAL_CALL_UINT256_RESULT_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_184: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_184: The ADDRESS_2DARRAY[0] length is not 1\");\n\n    (bool success, uint256 value) = ExternalValueReader.tryReadUINT256(param.ADDRESS_2DARRAY[0][0], param.BYTES);\n    if (!success) { return false; }\n    if (value >= param.UINT256_2DARRAY[0][0] && value <= param.UINT256_2DARRAY[0][1]) { return true; }\n    return false;\n  }\n\n  function ID_185_EXTERNAL_CALL_STRING_RESULT_EQUALS(NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_185: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_185: The ADDRESS_2DARRAY[0] length is not 1\");\n    require(param.STRING_ARRAY.length == 1, \"CE ID_185: The STRING_2DARRAY length is not 1\");\n    (bool success, string memory value) = ExternalValueReader.tryReadString(param.ADDRESS_2DARRAY[0][0], param.BYTES);\n    if (!success) { return false; }\n    if (keccak256(abi.encodePacked(value)) == keccak256(abi.encodePacked(param.STRING_ARRAY[0]))) { return true; }\n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_MachineState.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Machine State\n * @author DARC Team\n * @notice All the condition expression functions related to Machine State\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n//import \"./Conditions\";\n\ncontract Condition_MachineState is MachineStateManager { \n  /**\n   * The entrance and table of all machine-state-related condition expression functions\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param param The parameters of the condition node\n   * @param id The expression ID of the condition node\n   */\n  function machineStateExpressionCheck(bool bIsBeforeOperation, NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id==51) return ID_51_TIMESTAMP_GREATER_THAN(param);\n    else if (id==52) return ID_52_TIMESTAMP_LESS_THAN(param);\n    else if (id==53) return ID_53_TIMESTAMP_IN_RANGE(param);\n    else if (id==54) return ID_54_DATE_YEAR_GREATER_THAN(param);\n    else if (id==55) return ID_55_DATE_YEAR_LESS_THAN(param);\n    else if (id==56) return ID_56_DATE_YEAR_IN_RANGE(param);\n    else if (id==57) return ID_57_DATE_MONTH_GREATER_THAN(param);\n    else if (id==58) return ID_58_DATE_MONTH_LESS_THAN(param);\n    else if (id==59) return ID_59_DATE_MONTH_IN_RANGE(param);\n    else if (id==60) return ID_60_DATE_DAY_GREATER_THAN(param);\n    else if (id==61) return ID_61_DATE_DAY_LESS_THAN(param);\n    else if (id==62) return ID_62_DATE_DAY_IN_RANGE(param);\n    else if (id==63) return ID_63_DATE_HOUR_GREATER_THAN(param);\n    else if (id==64) return ID_64_DATE_HOUR_LESS_THAN(param);\n    else if (id==65) return ID_65_DATE_HOUR_IN_RANGE(param);\n    else if (id==66) return ID_66_ADDRESS_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==67) return ID_67_ADDRESS_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==68) return ID_68_ADDRESS_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==69) return ID_69_ADDRESS_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==70) return ID_70_ADDRESS_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==71) return ID_71_ADDRESS_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==72) return ID_72_ADDRESS_TOKEN_X_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==73) return ID_73_ADDRESS_TOKEN_X_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==74) return ID_74_ADDRESS_TOKEN_X_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==75) return ID_75_TOTAL_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==76) return ID_76_TOTAL_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==77) return ID_77_TOTAL_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==78) return ID_78_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==79) return ID_79_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==80) return ID_80_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n\n\n    else if (id==81) return ID_81_TOTAL_CASH_GREATER_THAN(param);\n    else if (id==82) return ID_82_TOTAL_CASH_LESS_THAN(param);\n    else if (id==83) return ID_83_TOTAL_CASH_IN_RANGE(param);\n    else if (id==84) return ID_84_TOTAL_CASH_EQUALS(param);\n \n    else if (id==85) return ID_85_TOKEN_IN_LIST_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==86) return ID_86_TOKEN_IN_LIST_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==87) return ID_87_TOKEN_IN_LIST_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==88) return ID_88_TOKEN_IN_LIST_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==89) return ID_89_TOKEN_IN_LIST_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==90) return ID_90_TOKEN_IN_LIST_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==91) return ID_91_TOKEN_IN_LIST_AMOUNT_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==92) return ID_92_TOKEN_IN_LIST_AMOUNT_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==93) return ID_93_TOKEN_IN_LIST_AMOUNT_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==94) return ID_94_TOKEN_IN_LIST_AMOUNT_EQUALS(bIsBeforeOperation, param);\n\n    else if (id==95) return ID_95_ADDRESS_VOTING_WEIGHT_PERCENTAGE_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==96) return ID_96_ADDRESS_VOTING_WEIGHT_PERCENTAGE_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==97) return ID_97_ADDRESS_VOTING_WEIGHT_PERCENTAGE_IN_RANGE(bIsBeforeOperation, param);\n    else if (id==98) return ID_98_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_GREATER_THAN(bIsBeforeOperation, param);\n    else if (id==99) return ID_99_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_LESS_THAN(bIsBeforeOperation, param);\n    else if (id==100) return ID_100_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_IN_RANGE(bIsBeforeOperation, param);\n    else return false;\n  }\n\n  function ID_51_TIMESTAMP_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_51: UINT256_2DARRAY is empty\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_51: UINT256_2DARRAY[0] is empty\");\n    return block.timestamp > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_52_TIMESTAMP_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_52: UINT256_2DARRAY is empty\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_52: UINT256_2DARRAY[0] is empty\");\n    return block.timestamp < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_53_TIMESTAMP_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_53: UINT256_2DARRAY is empty\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_53: UINT256_2DARRAY[0] must have 2 elements\");\n    return block.timestamp >= param.UINT256_2DARRAY[0][0] && block.timestamp <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_54_DATE_YEAR_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_54: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_54: UINT256_2DARRAY[0] must have 1 element\");\n    (uint256 year, , , , , ) = getDateTime(block.timestamp);\n    return year > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_55_DATE_YEAR_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_55: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_55: UINT256_2DARRAY[0] must have 1 element\");\n    (uint256 year, , , , , ) = getDateTime(block.timestamp);\n    return year < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_56_DATE_YEAR_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_56: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_56: UINT256_2DARRAY[0] must have 2 elements\");\n    (uint256 year, , , , , ) = getDateTime(block.timestamp);\n    return year >= param.UINT256_2DARRAY[0][0] && year <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_57_DATE_MONTH_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_57: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_57: UINT256_2DARRAY[0] must have 1 element\");\n    (, uint256 month, , , , ) = getDateTime(block.timestamp);\n    return month > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_58_DATE_MONTH_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_58: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_58: UINT256_2DARRAY[0] must have 1 element\");\n    (, uint256 month, , , , ) = getDateTime(block.timestamp);\n    return month < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_59_DATE_MONTH_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_59: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_59: UINT256_2DARRAY[0] must have 2 elements\");\n    (, uint256 month, , , , ) = getDateTime(block.timestamp);\n    return month >= param.UINT256_2DARRAY[0][0] && month <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_60_DATE_DAY_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_60: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_60: UINT256_2DARRAY[0] must have 1 element\");\n    (, , uint256 day, , , ) = getDateTime(block.timestamp);\n    return day > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_61_DATE_DAY_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_61: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_61: UINT256_2DARRAY[0] must have 1 element\");\n    (, , uint256 day, , , ) = getDateTime(block.timestamp);\n    return day < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_62_DATE_DAY_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_62: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_62: UINT256_2DARRAY[0] must have 2 elements\");\n    (, , uint256 day, , , ) = getDateTime(block.timestamp);\n    return day >= param.UINT256_2DARRAY[0][0] && day <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_63_DATE_HOUR_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_63: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_63: UINT256_2DARRAY[0] must have 1 element\");  \n    (, , , uint256 hour, , ) = getDateTime(block.timestamp);\n    return hour > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_64_DATE_HOUR_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_64: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_64: UINT256_2DARRAY[0] must have 1 element\");  \n    (, , , uint256 hour, , ) = getDateTime(block.timestamp);\n    return hour < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_65_DATE_HOUR_IN_RANGE(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_65: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_65: UINT256_2DARRAY[0] must have 2 elements\");\n    (, , , uint256 hour, , ) = getDateTime(block.timestamp);\n    return hour >= param.UINT256_2DARRAY[0][0] && hour <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_66_ADDRESS_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_66: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_66: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_66: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_66: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return addressTotalVotingWeight(false, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalVotingWeight(true, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_67_ADDRESS_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_67: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_67: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_67: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_67: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return addressTotalVotingWeight(false, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalVotingWeight(true, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_68_ADDRESS_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_68: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_68: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_68: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_68: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return addressTotalVotingWeight(false, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(false, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return addressTotalVotingWeight(true, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(true, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_69_ADDRESS_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_69: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_69: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_69: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_69: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return addressTotalDividendWeight(false, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalDividendWeight(true, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_70_ADDRESS_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_70: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_70: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_70: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_70: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return addressTotalDividendWeight(false, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalDividendWeight(true, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_71_ADDRESS_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_71: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_71: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_71: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_71: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return addressTotalDividendWeight(false, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(false, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return addressTotalDividendWeight(true, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(true, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_72_ADDRESS_TOKEN_X_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_72: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_72: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_72: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_72: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_72: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] > param.UINT256_2DARRAY[0][1];\n    } else {\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_72: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] > param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_73_ADDRESS_TOKEN_X_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_73: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_73: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_73: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_73: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_73: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] < param.UINT256_2DARRAY[0][1];\n    } else {\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_73: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] < param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_74_ADDRESS_TOKEN_X_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_74: ADDRESS_2DARRAY must have 1 element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_74: ADDRESS_2DARRAY[0] must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_74: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 3, \"CE ID_74: UINT256_2DARRAY[0] must have 3 elements\");\n    if (bIsBeforeOp) {\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_74: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] >= param.UINT256_2DARRAY[0][1] && currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] <= param.UINT256_2DARRAY[0][2];\n    } else {\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_74: tokenClassIndex (param.UINT256_2DARRAY[0][0]) is out of range\");\n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] >= param.UINT256_2DARRAY[0][1] && sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[param.ADDRESS_2DARRAY[0][0]] <= param.UINT256_2DARRAY[0][2];\n    }\n  }\n\n  function ID_75_TOTAL_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_75: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_75: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return totalVotingWeights(false) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return totalVotingWeights(true) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_76_TOTAL_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_76: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_76: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return totalVotingWeights(false) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return totalVotingWeights(true) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_77_TOTAL_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_77: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_77: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return totalVotingWeights(false) >= param.UINT256_2DARRAY[0][0] && totalVotingWeights(false) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return totalVotingWeights(true) >= param.UINT256_2DARRAY[0][0] && totalVotingWeights(true) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_78_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_78: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_78: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return totalDividendWeights(false) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return totalDividendWeights(true) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_79_TOTAL_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_79: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_79: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return totalDividendWeights(false) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return totalDividendWeights(true) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_80_TOTAL_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_80: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_80: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return totalDividendWeights(false) >= param.UINT256_2DARRAY[0][0] && totalDividendWeights(false) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return totalDividendWeights(true) >= param.UINT256_2DARRAY[0][0] && totalDividendWeights(true) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n\n  function ID_81_TOTAL_CASH_GREATER_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_81: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_81: UINT256_2DARRAY[0] must have 1 element\");\n    return address(this).balance > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_82_TOTAL_CASH_LESS_THAN(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_82: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_82: UINT256_2DARRAY[0] must have 1 element\");\n    return address(this).balance < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_83_TOTAL_CASH_IN_RANGE( NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_83: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_83: UINT256_2DARRAY[0] must have 2 elements\");\n    return address(this).balance >= param.UINT256_2DARRAY[0][0] && address(this).balance <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_84_TOTAL_CASH_EQUALS(NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_84: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_84: UINT256_2DARRAY[0] must have 1 element\");\n    return address(this).balance == param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_85_TOKEN_IN_LIST_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_85: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_85: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalVotingWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_85: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_85: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalVotingWeight > param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_86_TOKEN_IN_LIST_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_86: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_86: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalVotingWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_86: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_86: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalVotingWeight < param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_87_TOKEN_IN_LIST_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_87: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 2, \"CE ID_87: ADDRESS_2DARRAY[0] must have 2 elements\");\n\n    uint256 totalVotingWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_87: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_87: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalVotingWeight += sumVotingWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalVotingWeight >= param.UINT256_2DARRAY[1][0] && totalVotingWeight <= param.UINT256_2DARRAY[1][1];\n  }\n\n  function ID_88_TOKEN_IN_LIST_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_88: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_88: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalDividendWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_88: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_88: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalDividendWeight > param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_89_TOKEN_IN_LIST_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_89: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_89: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalDividendWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_89: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_89: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalDividendWeight < param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_90_TOKEN_IN_LIST_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_90: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 2, \"CE ID_90: ADDRESS_2DARRAY[0] must have 2 elements\");\n\n    uint256 totalDividendWeight = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_90: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(false, param.UINT256_2DARRAY[0][i]);\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_90: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalDividendWeight += sumDividendWeightForTokenClass(true, param.UINT256_2DARRAY[0][i]);\n      }\n    }\n    return totalDividendWeight >= param.UINT256_2DARRAY[1][0] && totalDividendWeight <= param.UINT256_2DARRAY[1][1];\n  }\n\n  function ID_91_TOKEN_IN_LIST_AMOUNT_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_91: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_91: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_91: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += currentMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_91: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      }\n    }\n    return totalAmount > param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_92_TOKEN_IN_LIST_AMOUNT_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_92: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_92: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_92: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += currentMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_92: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      }\n    }\n    return totalAmount < param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_93_TOKEN_IN_LIST_AMOUNT_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_93: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 2, \"CE ID_93: ADDRESS_2DARRAY[0] must have 2 elements\");\n\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_93: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += currentMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_93: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      }\n    }\n    return totalAmount >= param.UINT256_2DARRAY[1][0] && totalAmount <= param.UINT256_2DARRAY[1][1];\n  }\n\n  function ID_94_TOKEN_IN_LIST_AMOUNT_EQUALS(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 2, \"CE ID_94: ADDRESS_2DARRAY must have 2 element\");\n    require(param.UINT256_2DARRAY[1].length == 1, \"CE ID_94: ADDRESS_2DARRAY[0] must have 1 element\");\n\n    uint256 totalAmount = 0;\n    for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n      if (bIsBeforeOp) {\n        require(param.UINT256_2DARRAY[0][i] < currentMachineState.tokenList.length, \"CE ID_94: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += currentMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      } else {\n        require(param.UINT256_2DARRAY[0][i] < sandboxMachineState.tokenList.length, \"CE ID_94: tokenClassIndex (param.UINT256_2DARRAY[0][i]) is out of range\");\n        totalAmount += sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][i]].totalSupply;\n      }\n    }\n    return totalAmount == param.UINT256_2DARRAY[1][0];\n  }\n\n  function ID_95_ADDRESS_VOTING_WEIGHT_PERCENTAGE_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_95: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_95: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_95: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return getAddressTotalVotingWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return getAddressTotalVotingWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } \n  }\n\n  function ID_96_ADDRESS_VOTING_WEIGHT_PERCENTAGE_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_96: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_96: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_96: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return getAddressTotalVotingWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return getAddressTotalVotingWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } \n  }\n\n  function ID_97_ADDRESS_VOTING_WEIGHT_PERCENTAGE_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_97: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_97: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_97: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return getAddressTotalVotingWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && getAddressTotalVotingWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return getAddressTotalVotingWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && getAddressTotalVotingWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } \n  }\n\n  function ID_98_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_GREATER_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_98: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_98: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_98: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return getAddressTotalDividendWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return getAddressTotalDividendWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) > param.UINT256_2DARRAY[0][0];\n    } \n  }\n\n  function ID_99_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_LESS_THAN(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_99: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_99: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_99: UINT256_2DARRAY[0] must have 1 element\");\n    if (bIsBeforeOp) {\n      return getAddressTotalDividendWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return getAddressTotalDividendWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) < param.UINT256_2DARRAY[0][0];\n    } \n  }\n\n  function ID_100_ADDRESS_DIVIDEND_WEIGHT_PERCENTAGE_IN_RANGE(bool bIsBeforeOp, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_100: ADDRESS_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_100: UINT256_2DARRAY must have 1 element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_100: UINT256_2DARRAY[0] must have 2 elements\");\n    if (bIsBeforeOp) {\n      return getAddressTotalDividendWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && getAddressTotalDividendWeightPercentage(false, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return getAddressTotalDividendWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) >= param.UINT256_2DARRAY[0][0] && getAddressTotalDividendWeightPercentage(true, param.ADDRESS_2DARRAY[0][0]) <= param.UINT256_2DARRAY[0][1];\n    } \n  }\n\n\n  //below are the helper functions\n  function getDateTime(uint256 timestamp) public pure returns (uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) {\n    // Convert timestamp to readable format\n    uint256 unixTimestamp = timestamp;\n    uint256 _year = (unixTimestamp / 31556926) + 1970;\n    uint256 _leapYears = (_year - 1969) / 4 - (_year - 1901) / 100 + (_year - 1601) / 400;\n    uint256 _secondsAccountedFor = (_year - 1970) * 31556926 + _leapYears * 86400;\n    uint256 _remainingSeconds = unixTimestamp - _secondsAccountedFor;\n    bool _isLeapYear = (_year % 4 == 0 && (_year % 100 != 0 || _year % 400 == 0));\n    \n    uint256[] memory _daysPerMonth = new uint256[](12);\n\n    _daysPerMonth[0] = 31;\n    _daysPerMonth[1] = _isLeapYear ? 29 : 28;\n    _daysPerMonth[2] = 31;\n    _daysPerMonth[3] = 30;\n    _daysPerMonth[4] = 31;\n    _daysPerMonth[5] = 30;\n    _daysPerMonth[6] = 31;\n    _daysPerMonth[7] = 31;\n    _daysPerMonth[8] = 30;\n    _daysPerMonth[9] = 31;\n    _daysPerMonth[10] = 30;\n    _daysPerMonth[11] = 31;\n\n    uint256 _month;\n    for (_month = 0; _month < 12; _month++) {\n      if (_remainingSeconds < _daysPerMonth[_month] * 86400)\n        break;\n      _remainingSeconds -= _daysPerMonth[_month] * 86400;\n    }\n    uint256 _day = _remainingSeconds / 86400 + 1;\n    \n    // Determine the hour, minute, and second\n    uint256 _hour = (_remainingSeconds % 86400) / 3600;\n    uint256 _minute = (_remainingSeconds % 3600) / 60;\n    uint256 _second = _remainingSeconds % 60;\n    \n    return (_year, _month + 1, _day, _hour, _minute, _second);\n  }\n\n  /**\n   * @dev Get the total voting weight for a token class\n   */\n  function getAddressTotalVotingWeightPercentage(bool bIsBeforeOp, address addr) private view returns (uint256) {\n    if (bIsBeforeOp) {\n      bool bIsValid = false;\n      uint256 result = 0;\n\n      // multiply by 100 to get percentage\n      (bIsValid, result) = SafeMathUpgradeable.tryMul(addressTotalVotingWeight(false, addr), 100);\n      require(bIsValid, \"CE getAddressTotalVotingWeightPercentage: SafeMathUpgradeable multiplication error\");\n      (bIsValid, result) = SafeMathUpgradeable.tryDiv(result, totalVotingWeights(false));\n      require(bIsValid, \"CE getAddressTotalVotingWeightPercentage: SafeMathUpgradeable division error\");\n      return result;\n    } else {\n      bool bIsValid = false;\n      uint256 result = 0;\n\n      // multiply by 100 to get percentage\n      (bIsValid, result) = SafeMathUpgradeable.tryMul(addressTotalVotingWeight(true, addr), 100);\n      require(bIsValid, \"CE getAddressTotalVotingWeightPercentage: SafeMathUpgradeable multiplication error\");\n      (bIsValid, result) = SafeMathUpgradeable.tryDiv(result, totalVotingWeights(true));\n      require(bIsValid, \"CE getAddressTotalVotingWeightPercentage: SafeMathUpgradeable division error\");\n      return result;\n    }\n  }\n\n  /**\n   * @dev Get the total dividend weight for a token class\n   */\n  function getAddressTotalDividendWeightPercentage(bool bIsBeforeOp, address addr) private view returns (uint256) {\n    if (bIsBeforeOp) {\n      bool bIsValid = false;\n      uint256 result = 0;\n\n      // multiply by 100 to get percentage\n      (bIsValid, result) = SafeMathUpgradeable.tryMul(addressTotalDividendWeight(false, addr), 100);\n      require(bIsValid, \"CE getAddressTotalDividendWeightPercentage: SafeMathUpgradeable multiplication error\");\n      (bIsValid, result) = SafeMathUpgradeable.tryDiv(result, totalDividendWeights(false));\n      require(bIsValid, \"CE getAddressTotalDividendWeightPercentage: SafeMathUpgradeable division error\");\n      return result;\n    } else {\n      bool bIsValid = false;\n      uint256 result = 0;\n\n      // multiply by 100 to get percentage\n      (bIsValid, result) = SafeMathUpgradeable.tryMul(addressTotalDividendWeight(true, addr), 100);\n      require(bIsValid, \"CE getAddressTotalDividendWeightPercentage: SafeMathUpgradeable multiplication error\");\n      (bIsValid, result) = SafeMathUpgradeable.tryDiv(result, totalDividendWeights(true));\n      require(bIsValid, \"CE getAddressTotalDividendWeightPercentage: SafeMathUpgradeable division error\");\n      return result;\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_MembershipOp.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Membership-related Operations\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_MembershipOp is MachineStateManager { \n  /**\n   * The function to check the membership related condition expression\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param op The operation to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function membershipOpExpressionCheck(bool bIsBeforeOperation, Operation memory op, NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id == 401)  return ID_401_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_EQUALS(bIsBeforeOperation, op, param);\n    if (id == 402)  return ID_402_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_LIST(bIsBeforeOperation, op, param);\n    if (id == 403)  return ID_403_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_RANGE(bIsBeforeOperation, op, param);\n    if (id == 406)  return ID_406_CHANGE_MEMBER_NAME_TO_ANY_STRING_IN_LIST(bIsBeforeOperation, op, param);\n    if (id == 407)  return ID_407_CHANGE_MEMBER_NAME_TO_ANY_STRING_CONTAINS(bIsBeforeOperation, op, param);\n    return false;\n  }\n\n  function ID_401_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_EQUALS(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_401: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_401: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_402_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_402: The ADDRESS_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      for (uint256 j=0; j< param.UINT256_2DARRAY[0].length; j++) {\n        if (op.param.UINT256_2DARRAY[0][i] == param.UINT256_2DARRAY[0][j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_403_CHANGE_MEMBER_ROLE_TO_ANY_ROLE_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_403: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_403: The UINT256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] >= param.UINT256_2DARRAY[0][0] && op.param.UINT256_2DARRAY[0][i] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_406_CHANGE_MEMBER_NAME_TO_ANY_STRING_IN_LIST(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.STRING_ARRAY.length == 1, \"CE ID_406: The STRING_ARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CHANGE_MEMBER_NAMES) return false;\n    for (uint256 i = 0; i < op.param.STRING_ARRAY.length; i++) {\n      if (StringUtils.compareStrings(op.param.STRING_ARRAY[i], param.STRING_ARRAY[0])) { return true; }\n    }\n    return false;\n  }\n\n  function ID_407_CHANGE_MEMBER_NAME_TO_ANY_STRING_CONTAINS(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.STRING_ARRAY.length == 1, \"CE ID_407: The STRING_ARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_CHANGE_MEMBER_NAMES) return false;\n    for (uint256 i = 0; i < op.param.STRING_ARRAY.length; i++) {\n      if (contains(op.param.STRING_ARRAY[i], param.STRING_ARRAY[0])) { return true; }\n    }\n    return false;\n  }\n\n  // --------------------------------------------------------------\n  // ----------------- Below are helper functions ------------------\n  function contains(string memory haystack, string memory needle) public pure returns (bool) {\n        bytes memory haystackBytes = bytes(haystack);\n        bytes memory needleBytes = bytes(needle);\n\n        if (haystackBytes.length < needleBytes.length) {\n            return false;\n        }\n\n        for (uint i = 0; i <= haystackBytes.length - needleBytes.length; i++) {\n            bool found = true;\n            for (uint j = 0; j < needleBytes.length; j++) {\n                if (haystackBytes[i + j] != needleBytes[j]) {\n                    found = false;\n                    break;\n                }\n            }\n            if (found) {\n                return true;\n            }\n        }\n\n        return false;\n    }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_Operation.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Operation\n * @author DARC Team\n * @notice All the condition expression functions related to Machine State\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\n//import \"./Conditions\";\n\ncontract Condition_Operation is MachineStateManager{\n  function operationExpressionCheck(Operation memory op, NodeParam memory param, uint256 id) internal pure returns (bool)\n  {\n    if (id== 151) return ID_151_OPERATION_EQUALS(op, param);\n    if (id== 152) return ID_152_OPERATION_IN_LIST(op, param);\n    return false;\n  }\n\n  function ID_151_OPERATION_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_151: The UINT_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_151: The UINT_2DARRAY[0] length is not 1\");\n    if (OpcodeMap.opcodeVal(op.opcode) == param.UINT256_2DARRAY[0][0]) { return true; }\n    return false;\n  }\n\n  function ID_152_OPERATION_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_152: The UINT_2DARRAY length is not 1\");\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      if (OpcodeMap.opcodeVal(op.opcode) == param.UINT256_2DARRAY[0][i]) { return true; }\n    }\n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_OperationLog.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Operation Log\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\n\ncontract Condition_OperationLog is MachineStateManager { \n  function operationLogExpressionCheck(bool bIsBeforeOperation, Operation memory op, NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id == 701) { return ID_701_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_GREATER_THAN(bIsBeforeOperation, op, param); }\n    if (id == 702) { return ID_702_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN(bIsBeforeOperation, op, param); }\n    if (id == 703) { return ID_703_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_IN_RANGE(bIsBeforeOperation, op, param); }\n    if (id == 704) { return ID_704_OPERATION_GLOBAL_SINCE_LAST_TIME_GREATER_THAN(bIsBeforeOperation, op, param); }\n    if (id == 705) { return ID_705_OPERATION_GLOBAL_SINCE_LAST_TIME_LESS_THAN(bIsBeforeOperation, op, param); }\n    if (id == 706) { return ID_706_OPERATION_GLOBAL_SINCE_LAST_TIME_IN_RANGE(bIsBeforeOperation, op, param); }\n    if (id == 707) { return ID_707_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN(bIsBeforeOperation, op, param); }\n    if (id == 708) { return ID_708_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN(bIsBeforeOperation, op, param); }\n    if (id == 709) { return ID_709_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE(bIsBeforeOperation, op, param); }\n    if (id == 710) { return ID_710_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN(bIsBeforeOperation, op, param); }\n    if (id == 711) { return ID_711_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN(bIsBeforeOperation, op, param); }\n    if (id == 712) { return ID_712_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE(bIsBeforeOperation, op, param); }\n    return false;\n  }\n\n  function ID_701_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_701: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_701: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime > param.UINT256_2DARRAY[0][0];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - sandboxMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_702_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_702: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_702: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime < param.UINT256_2DARRAY[0][0];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_703_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_703: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_703: The UINT256_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[op.operatorAddress].latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_704_OPERATION_GLOBAL_SINCE_LAST_TIME_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_704: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_704: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime > param.UINT256_2DARRAY[0][0];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_705_OPERATION_GLOBAL_SINCE_LAST_TIME_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_705: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_705: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime < param.UINT256_2DARRAY[0][0];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_706_OPERATION_GLOBAL_SINCE_LAST_TIME_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_706: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_706: The UINT256_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1];\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      uint256 elapsedTime = block.timestamp - currentMachineState.globalOperationLog.latestOperationTimestamp[getOpcodeID(op)];\n\n      return elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_707_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_707: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_707: The ADDRESS_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime > param.UINT256_2DARRAY[0][0]) { return true; }\n      }\n      return false;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime > param.UINT256_2DARRAY[0][0]) { return true; }\n      }\n      return false;\n    }\n  }\n\n  function ID_708_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_708: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_708: The ADDRESS_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0]) { return true; }\n      }\n      return false;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0]) { return true; }\n      }\n      return false;\n    }\n  }\n\n  function ID_709_OPERATION_BY_ANY_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_709: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 2, \"CE ID_709: The ADDRESS_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1]) { return true; }\n      }\n      return false;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime >= param.UINT256_2DARRAY[0][0] && elapsedTime <= param.UINT256_2DARRAY[0][1]) { return true; }\n      }\n      return false;\n    }\n  }\n\n  function ID_710_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_GREATER_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_710: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_710: The ADDRESS_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0]) { return false; }\n      }\n      return true;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0]) { return false; }\n      }\n      return true;\n    }\n  }\n\n  function ID_711_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_LESS_THAN(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_711: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_711: The ADDRESS_2DARRAY[0] length is not 1\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime > param.UINT256_2DARRAY[0][0]) { return false; }\n      }\n      return true;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime > param.UINT256_2DARRAY[0][0]) { return false; }\n      }\n      return true;\n    }\n  }\n\n  function ID_712_OPERATION_BY_EACH_ADDRESS_IN_LIST_SINCE_LAST_TIME_IN_RANGE(bool bIsBeforeOperation, Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_712: The ADDRESS_2DARRAY length is not 1\");\n    require(param.ADDRESS_2DARRAY[0].length == 2, \"CE ID_712: The ADDRESS_2DARRAY[0] length is not 2\");\n    if (bIsBeforeOperation) {\n      // in before operation plugin condition check, just check current machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - currentMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0] || elapsedTime > param.UINT256_2DARRAY[0][1]) { return false; }\n      }\n      return true;\n    }\n    else {\n      // in after operation plugin condition check, check the sandbox machine state\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        uint256 elapsedTime = block.timestamp - sandboxMachineState.operationLogMap[param.ADDRESS_2DARRAY[0][i]].latestOperationTimestamp[getOpcodeID(op)];\n        if (elapsedTime < param.UINT256_2DARRAY[0][0] || elapsedTime > param.UINT256_2DARRAY[0][1]) { return false; }\n      }\n      return true;\n    }\n  }\n\n  // ------------------ below are helper functions ------------------\n  function getOpcodeID(Operation memory op) private pure returns (uint256) {\n    return OpcodeMap.opcodeVal(op.opcode);\n  }\n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_Operator.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Operator\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_Operator is MachineStateManager { \n  /**\n   * The entrance and table of all operator-related condition expression functions\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param operation The operation index to be checked\n   * @param param The parameters of the condition node\n   * @param id The expression ID of the condition node\n   */\n  function operatorExpressionCheck(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id == 1) {return ID_1_OPERATOR_NAME_EQUALS(bIsBeforeOperation, operation, param);}\n    else if (id == 2) { return ID_2_OPERATOR_ROLE_EQUALS(bIsBeforeOperation, operation, param);}\n    else if (id == 3) { return ID_3_OPERATOR_ADDRESS_EQUALS(operation, param); }\n    else if (id == 4) { return ID_4_OPERATOR_ROLE_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 5) { return ID_5_OPERATOR_ROLE_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 6) { return ID_6_OPERATOR_ROLE_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 7) { return ID_7_OPEERATOR_ROLE_IN_LIST(bIsBeforeOperation, operation, param); }\n    else if (id == 8) { return ID_8_OPERATOR_TOKEN_X_AMOUNT_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 9) { return ID_9_OPERATOR_TOKEN_X_AMOUNT_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 10) { return ID_10_OPERATOR_TOKEN_X_AMOUNT_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 11) { return ID_11_OPERATOR_TOKEN_X_AMOUNT_EQUALS(bIsBeforeOperation, operation, param); }\n    else if (id == 12) { return ID_12_OPERATOR_TOKEN_X_PERCENTAGE_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 13) { return ID_13_OPERATOR_TOKEN_X_PERCENTAGE_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 14) { return ID_14_OPERATOR_TOKEN_X_PERCENTAGE_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 15) { return ID_15_OPERATOR_TOKEN_X_PERCENTAGE_EQUALS(bIsBeforeOperation, operation, param); }\n    else if (id == 16) { return ID_16_OPERATOR_VOTING_WEIGHT_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 17) { return ID_17_OPERATOR_VOTING_WEIGHT_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 18) { return ID_18_OPERATOR_VOTING_WEIGHT_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 19) { return ID_19_OPERATOR_DIVIDEND_WEIGHT_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 20) { return ID_20_OPERATOR_DIVIDEND_WEIGHT_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 21) { return ID_21_OPERATOR_DIVIDEND_WEIGHT_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 25) { return ID_25_OPERATOR_WITHDRAWABLE_CASH_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 26) { return ID_26_OPERATOR_WITHDRAWABLE_CASH_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 27) { return ID_27_OPERATOR_WITHDRAWABLE_CASH_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 28) { return ID_28_OPERATOR_WITHDRAWABLE_DIVIDENDS_GREATER_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 29) { return ID_29_OPERATOR_WITHDRAWABLE_DIVIDENDS_LESS_THAN(bIsBeforeOperation, operation, param); }\n    else if (id == 30) { return ID_30_OPERATOR_WITHDRAWABLE_DIVIDENDS_IN_RANGE(bIsBeforeOperation, operation, param); }\n    else if (id == 31) { return ID_31_OPERATOR_ADDRESS_IN_LIST(bIsBeforeOperation, operation, param); }\n    else {\n      return false;\n    }\n  }\n\n  function ID_1_OPERATOR_NAME_EQUALS(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.STRING_ARRAY.length == 1, \"CE ID_1: STRING_ARRAY must have one element\");\n    if (bIsBeforeOperation) { return StringUtils.compareStrings(currentMachineState.memberInfoMap[operation.operatorAddress].name, param.STRING_ARRAY[0]);\n    } else { return StringUtils.compareStrings(sandboxMachineState.memberInfoMap[operation.operatorAddress].name, param.STRING_ARRAY[0]); }\n  }\n\n  function ID_2_OPERATOR_ROLE_EQUALS(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_2: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_2: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) { return currentMachineState.memberInfoMap[operation.operatorAddress].role == param.UINT256_2DARRAY[0][0];\n    } else { return sandboxMachineState.memberInfoMap[operation.operatorAddress].role == param.UINT256_2DARRAY[0][0]; }\n  }\n\n  function ID_3_OPERATOR_ADDRESS_EQUALS(Operation memory operation, NodeParam memory param) private pure returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_3: ADDRESS_2DARRAY must have one element\");\n    require(param.ADDRESS_2DARRAY[0].length == 1, \"CE ID_3: ADDRESS_2DARRAY[0] must have one element\");\n    return operation.operatorAddress ==  param.ADDRESS_2DARRAY[0][0];\n  } \n\n  function ID_4_OPERATOR_ROLE_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_4: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_4: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) { return currentMachineState.memberInfoMap[operation.operatorAddress].role > param.UINT256_2DARRAY[0][0];\n    } else { return sandboxMachineState.memberInfoMap[operation.operatorAddress].role > param.UINT256_2DARRAY[0][0]; }\n  }\n\n  function ID_5_OPERATOR_ROLE_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_5: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_5: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) { return currentMachineState.memberInfoMap[operation.operatorAddress].role < param.UINT256_2DARRAY[0][0];\n    } else { return sandboxMachineState.memberInfoMap[operation.operatorAddress].role < param.UINT256_2DARRAY[0][0]; }\n  }\n\n  function ID_6_OPERATOR_ROLE_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_6: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_6: UINT256_2DARRAY[0] must have two elements\");\n    require(param.UINT256_2DARRAY[0][0] <= param.UINT256_2DARRAY[0][1], \"CE ID_6: UINT256_2DARRAY[0][0] must be less than or equal to UINT256_2DARRAY[0][1]\");\n    if (bIsBeforeOperation) { return currentMachineState.memberInfoMap[operation.operatorAddress].role >= param.UINT256_2DARRAY[0][0] && currentMachineState.memberInfoMap[operation.operatorAddress].role <= param.UINT256_2DARRAY[0][1];\n    } else { return sandboxMachineState.memberInfoMap[operation.operatorAddress].role >= param.UINT256_2DARRAY[0][0] && sandboxMachineState.memberInfoMap[operation.operatorAddress].role <= param.UINT256_2DARRAY[0][1]; }\n  }\n\n  function ID_7_OPEERATOR_ROLE_IN_LIST(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_7: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length > 0, \"CE ID_7: UINT256_2DARRAY[0] must have at least one element\");\n    if (bIsBeforeOperation) { \n      for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n        if (currentMachineState.memberInfoMap[operation.operatorAddress].role == param.UINT256_2DARRAY[0][i]) { return true; }\n      }\n      return false;\n    } else { \n      for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n        if (sandboxMachineState.memberInfoMap[operation.operatorAddress].role == param.UINT256_2DARRAY[0][i]) { return true; }\n      }\n      return false;\n    }\n  }\n\n  function ID_8_OPERATOR_TOKEN_X_AMOUNT_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_8: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_8: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation){\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_8: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    else{\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_8: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] > param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] > param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_9_OPERATOR_TOKEN_X_AMOUNT_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_9: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_9: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) { \n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_9: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    } else { \n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_9: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] < param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] < param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_10_OPERATOR_TOKEN_X_AMOUNT_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_10: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 3, \"CE ID_10: UINT256_2DARRAY[0] must have three elements\");\n    if (bIsBeforeOperation) { \n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_10: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    } else { \n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_10: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] >= param.UINT256_2DARRAY[0][1] && currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] <= param.UINT256_2DARRAY[0][2];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] >= param.UINT256_2DARRAY[0][1] && sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] <= param.UINT256_2DARRAY[0][2];\n    }\n  }\n\n  function ID_11_OPERATOR_TOKEN_X_AMOUNT_EQUALS(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_11: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_11: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation){\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_11: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    else{\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_11: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] == param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] == param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_12_OPERATOR_TOKEN_X_PERCENTAGE_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_12: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_12: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation){\n      require(param.UINT256_2DARRAY[0][0] < currentMachineState.tokenList.length, \"CE ID_12: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    else{\n      require(param.UINT256_2DARRAY[0][0] < sandboxMachineState.tokenList.length, \"CE ID_12: UINT256_2DARRAY[0][0] (token level X) must be less than the length of tokenList\");\n    }\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply > param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply > param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_13_OPERATOR_TOKEN_X_PERCENTAGE_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_13: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_13: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply < param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply < param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_14_OPERATOR_TOKEN_X_PERCENTAGE_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_14: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_14: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply >= param.UINT256_2DARRAY[0][1] && currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply <= param.UINT256_2DARRAY[0][2];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply >= param.UINT256_2DARRAY[0][1] && sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply <= param.UINT256_2DARRAY[0][2];\n    }\n  }\n\n  function ID_15_OPERATOR_TOKEN_X_PERCENTAGE_EQUALS(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_15: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_15: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) { \n      return currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / currentMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply == param.UINT256_2DARRAY[0][1];\n    } else { \n      return sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].tokenBalance[operation.operatorAddress] * 100 / sandboxMachineState.tokenList[param.UINT256_2DARRAY[0][0]].totalSupply == param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_16_OPERATOR_VOTING_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_16: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_16: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_17_OPERATOR_VOTING_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_17: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_17: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_18_OPERATOR_VOTING_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_18: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_18: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) >= param.UINT256_2DARRAY[0][0] && addressTotalVotingWeight(bIsBeforeOperation, operation.operatorAddress) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_19_OPERATOR_DIVIDEND_WEIGHT_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_19: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_19: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) > param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_20_OPERATOR_DIVIDEND_WEIGHT_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_20: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_20: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) < param.UINT256_2DARRAY[0][0];\n    } else {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_21_OPERATOR_DIVIDEND_WEIGHT_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_21: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_21: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) >= param.UINT256_2DARRAY[0][0] && addressTotalDividendWeight(bIsBeforeOperation, operation.operatorAddress) <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_25_OPERATOR_WITHDRAWABLE_CASH_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_25: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_25: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return currentMachineState.withdrawableCashMap[operation.operatorAddress] > param.UINT256_2DARRAY[0][0];\n    } else {\n      return sandboxMachineState.withdrawableCashMap[operation.operatorAddress] > param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_26_OPERATOR_WITHDRAWABLE_CASH_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_26: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_26: UINT256_2DARRAY[0] must have one element\");\n    if (bIsBeforeOperation) {\n      return currentMachineState.withdrawableCashMap[operation.operatorAddress] < param.UINT256_2DARRAY[0][0];\n    } else {\n      return sandboxMachineState.withdrawableCashMap[operation.operatorAddress] < param.UINT256_2DARRAY[0][0];\n    }\n  }\n\n  function ID_27_OPERATOR_WITHDRAWABLE_CASH_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_27: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_27: UINT256_2DARRAY[0] must have two elements\");\n    if (bIsBeforeOperation) {\n      return currentMachineState.withdrawableCashMap[operation.operatorAddress] >= param.UINT256_2DARRAY[0][0] && currentMachineState.withdrawableCashMap[operation.operatorAddress] <= param.UINT256_2DARRAY[0][1];\n    } else {\n      return sandboxMachineState.withdrawableCashMap[operation.operatorAddress] >= param.UINT256_2DARRAY[0][0] && sandboxMachineState.withdrawableCashMap[operation.operatorAddress] <= param.UINT256_2DARRAY[0][1];\n    }\n  }\n\n  function ID_28_OPERATOR_WITHDRAWABLE_DIVIDENDS_GREATER_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_28: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_28: UINT256_2DARRAY[0] must have one element\");\n    uint256 withdrawableDividends = 0;\n    if (bIsBeforeOperation) {\n      withdrawableDividends = currentMachineState.withdrawableDividendMap[operation.operatorAddress];\n    } else {\n      withdrawableDividends = sandboxMachineState.withdrawableDividendMap[operation.operatorAddress];\n    }\n    return withdrawableDividends > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_29_OPERATOR_WITHDRAWABLE_DIVIDENDS_LESS_THAN(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_29: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_29: UINT256_2DARRAY[0] must have one element\");\n    uint256 withdrawableDividends = 0;\n    if (bIsBeforeOperation) {\n      withdrawableDividends = currentMachineState.withdrawableDividendMap[operation.operatorAddress];\n    } else {\n      withdrawableDividends = sandboxMachineState.withdrawableDividendMap[operation.operatorAddress];\n    }\n    return withdrawableDividends < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_30_OPERATOR_WITHDRAWABLE_DIVIDENDS_IN_RANGE(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_30: UINT256_2DARRAY must have one element\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_30: UINT256_2DARRAY[0] must have two elements\");\n    uint256 withdrawableDividends = 0;\n    if (bIsBeforeOperation) {\n      withdrawableDividends = currentMachineState.withdrawableDividendMap[operation.operatorAddress];\n    } else {\n      withdrawableDividends = sandboxMachineState.withdrawableDividendMap[operation.operatorAddress];\n    }\n    return withdrawableDividends >= param.UINT256_2DARRAY[0][0] && withdrawableDividends <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_31_OPERATOR_ADDRESS_IN_LIST(bool bIsBeforeOperation, Operation memory operation, NodeParam memory param) private pure returns (bool) {\n    require(param.ADDRESS_2DARRAY.length == 1, \"CE ID_31: ADDRESS_2DARRAY must have one element\");\n    if (bIsBeforeOperation) {\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        if (operation.operatorAddress == param.ADDRESS_2DARRAY[0][i]) { return true; }\n      }\n      return false;\n    } else {\n      for (uint256 i = 0; i < param.ADDRESS_2DARRAY[0].length; i++) {\n        if (operation.operatorAddress == param.ADDRESS_2DARRAY[0][i]) { return true; }\n      }\n      return false;\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_PluginAndVoting.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Plugin-And-Voting-Rule-Related Operations\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_PluginAndVoting is MachineStateManager { \n  /**\n   * The function to check the batch operation related condition expression\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param op The operation to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function pluginAndVotingOpExpressionCheck(bool bIsBeforeOperation, Operation memory op, NodeParam memory param, uint256 id) internal pure returns (bool)\n  {\n    if (id == 301) return ID_301_ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 302) return ID_302_ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 303) return ID_303_ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 304) return ID_304_ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 305) return ID_305_DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 306) return ID_306_DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 307) return ID_307_DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 308) return ID_308_DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST(op, param);\n    if (id == 309) return ID_309_ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 310) return ID_310_ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 311) return ID_311_ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 312) return ID_312_ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 313) return ID_313_DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 314) return ID_314_DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 315) return ID_315_DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 316) return ID_316_DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE(op, param);\n    if (id == 317) return ID_317_ARE_ALL_PLUGINS_BEFORE_OPERATION(op);\n    if (id == 318) return ID_318_ARE_ALL_PLUGINS_AFTER_OPERATION(op);\n    if (id == 319) return ID_319_IS_ANY_PLUGIN_BEFORE_OPERATION(op);\n    if (id == 320) return ID_320_IS_ANY_PLUGIN_AFTER_OPERATION(op);\n    if (id == 321) return ID_321_ADD_PLUGIN_ANY_LEVEL_EQUALS(op, param);\n    if (id == 322) return ID_322_ADD_PLUGIN_ANY_LEVEL_IN_LIST(op, param);\n    if (id == 323) return ID_323_ADD_PLUGIN_ANY_LEVEL_IN_RANGE(op, param);\n    if (id == 324) return ID_324_ADD_PLUGIN_ANY_LEVEL_GREATER_THAN(op, param);\n    if (id == 325) return ID_325_ADD_PLUGIN_ANY_LEVEL_LESS_THAN(op, param);\n    if (id == 326) return ID_326_ADD_PLUGIN_ANY_RETURN_TYPE_EQUALS(op, param);\n    if (id == 327) return ID_327_ADD_PLUGIN_ANY_VOTING_RULE_INDEX_IN_LIST(op, param);\n\n\n    // below are for voting rule\n    if (id == 371) return ID_371_ADD_ANY_VOTING_RULE_IS_ABSOLUTE_MAJORITY(op);\n    if (id == 372) return ID_372_ADD_ANY_VOTING_RULE_APPROVAL_PERCENTAGE_IN_RANGE(op, param);\n    if (id == 373) return ID_373_ADD_ANY_VOTING_RULE_TOKEN_CLASS_CONTAINS(op, param);\n\n    return false;\n  }\n\n\n  // ---------------------- Plugin Condition ----------------------\n\n  function ID_301_ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_301: The UINT_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_302_ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_302: The UINT_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_303_ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_303: The UINT_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      bool bFound = false;\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { bFound = true; break; }\n      }\n      if (!bFound) return false;\n    }\n    return true;\n  }\n\n  function ID_304_ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_304: The UINT_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      bool bFound = false;\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { bFound = true; break; }\n      }\n      if (!bFound) return false;\n    }\n    return true;\n  }\n\n  function ID_305_DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_305: The UINT_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_306_DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_306: The UINT_256_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_307_DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_307: The UINT_256_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      bool bFound = false;\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { bFound = true; break; }\n      }\n      if (!bFound) return false;\n    }\n    return true;\n  }\n\n  function ID_308_DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_308: The UINT_256_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n      bool bFound = false;\n      for (uint256 j = 0; j < pluginIndexList.length; j++) {\n        if (param.UINT256_2DARRAY[0][i] == pluginIndexList[j]) { bFound = true; break; }\n      }\n      if (!bFound) return false;\n    }\n    return true;\n  }\n\n  function ID_309_ENABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_309: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_309: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 index= 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] >= param.UINT256_2DARRAY[0][0] && pluginIndexList[index] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_310_ENABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_310: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_310: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 index= 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] >= param.UINT256_2DARRAY[0][0] && pluginIndexList[index] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_311_ENABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_311: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_311: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 index = 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] < param.UINT256_2DARRAY[0][0] || pluginIndexList[index] > param.UINT256_2DARRAY[0][1]) { return false; }\n    }\n\n    return true;\n  }\n\n  function ID_312_ENABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_312: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_312: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ENABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 index = 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] < param.UINT256_2DARRAY[0][0] || pluginIndexList[index] > param.UINT256_2DARRAY[0][1]) { return false; }\n    }\n\n    return true;\n  }\n\n  function ID_313_DISABLE_ANY_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_313: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_313: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 index= 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] >= param.UINT256_2DARRAY[0][0] && pluginIndexList[index] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_314_DISABLE_ANY_AFTER_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_314: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_314: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 index= 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] >= param.UINT256_2DARRAY[0][0] && pluginIndexList[index] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_315_DISABLE_EACH_BEFORE_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_315: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_315: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all before operation plugins\n    uint256[] memory pluginIndexList = getBeforeOpPluginIndexList(op);\n    for (uint256 index = 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] < param.UINT256_2DARRAY[0][0] || pluginIndexList[index] > param.UINT256_2DARRAY[0][1]) { return false; }\n    }\n\n    return true;\n  }\n\n  function ID_316_DISABLE_EACH_AFTER_OP_PLUGIN_INDEX_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool)\n  {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_316: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_316: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_DISABLE_PLUGINS) return false;\n\n    // get all after operation plugins\n    uint256[] memory pluginIndexList = getAfterOpPluginIndexList(op);\n    for (uint256 index = 0; index < pluginIndexList.length; index++) {\n      if (pluginIndexList[index] < param.UINT256_2DARRAY[0][0] || pluginIndexList[index] > param.UINT256_2DARRAY[0][1]) { return false; }\n    }\n\n    return true;\n  }\n\n  function ID_317_ARE_ALL_PLUGINS_BEFORE_OPERATION(Operation memory op) private pure returns (bool)\n  {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      for (uint256 i = 0; i < op.param.BOOL_ARRAY.length; i++) {\n        if (op.param.BOOL_ARRAY[i] != true) { return false; }\n      }\n      return true;\n    }\n    if (op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_ADD_PLUGINS) {\n      for (uint256 i = 0; i < op.param.PLUGIN_ARRAY.length; i++) {\n        if (op.param.PLUGIN_ARRAY[i].bIsBeforeOperation == false) { return false; }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  function ID_318_ARE_ALL_PLUGINS_AFTER_OPERATION(Operation memory op) private pure returns (bool)\n  {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      for (uint256 i = 0; i < op.param.BOOL_ARRAY.length; i++) {\n        if (op.param.BOOL_ARRAY[i] == true) { return false; }\n      }\n      return true;\n    }\n    if (op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_ADD_PLUGINS) {\n      for (uint256 i = 0; i < op.param.PLUGIN_ARRAY.length; i++) {\n        if (op.param.PLUGIN_ARRAY[i].bIsBeforeOperation == true) { return false; }\n      }\n      return true;\n    }\n    return false;\n  }\n\n  function ID_319_IS_ANY_PLUGIN_BEFORE_OPERATION(Operation memory op) private pure returns (bool)\n  {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      for (uint256 i = 0; i < op.param.BOOL_ARRAY.length; i++) {\n        if (op.param.BOOL_ARRAY[i] == true) { return true; }\n      }\n      return false;\n    }\n    if (op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_ADD_PLUGINS) {\n      for (uint256 i = 0; i < op.param.PLUGIN_ARRAY.length; i++) {\n        if (op.param.PLUGIN_ARRAY[i].bIsBeforeOperation == true) { return true; }\n      }\n      return false;\n    }\n    return false;\n  }\n\n  function ID_320_IS_ANY_PLUGIN_AFTER_OPERATION(Operation memory op) private pure returns (bool)\n  {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      for (uint256 i = 0; i < op.param.BOOL_ARRAY.length; i++) {\n        if (op.param.BOOL_ARRAY[i] != true) { return true; }\n      }\n      return false;\n    }\n    if (op.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_ADD_PLUGINS) {\n      for (uint256 i = 0; i < op.param.PLUGIN_ARRAY.length; i++) {\n        if (op.param.PLUGIN_ARRAY[i].bIsBeforeOperation == false) { return true; }\n      }\n      return false;\n    }\n    return false;\n  }\n\n  function ID_321_ADD_PLUGIN_ANY_LEVEL_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_321: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_321: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      if (op.param.PLUGIN_ARRAY[index].level == op.param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_322_ADD_PLUGIN_ANY_LEVEL_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_322: The UINT_256_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n        if (op.param.PLUGIN_ARRAY[index].level == param.UINT256_2DARRAY[0][i]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_323_ADD_PLUGIN_ANY_LEVEL_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_323: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_323: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      if (op.param.PLUGIN_ARRAY[index].level >= param.UINT256_2DARRAY[0][0] && op.param.PLUGIN_ARRAY[index].level <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_324_ADD_PLUGIN_ANY_LEVEL_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_324: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_324: The UINT_256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      if (op.param.PLUGIN_ARRAY[index].level > param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_325_ADD_PLUGIN_ANY_LEVEL_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_325: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_325: The UINT_256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      if (op.param.PLUGIN_ARRAY[index].level < param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_326_ADD_PLUGIN_ANY_RETURN_TYPE_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_326: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_326: The UINT_256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.UNDEFINED && param.UINT256_2DARRAY[0][0] == 0) { return true; }\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.SANDBOX_NEEDED && param.UINT256_2DARRAY[0][0] == 1) { return true; }\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.NO && param.UINT256_2DARRAY[0][0] == 2) { return true; }\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.VOTING_NEEDED && param.UINT256_2DARRAY[0][0] == 3) { return true; }\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.YES_AND_SKIP_SANDBOX && param.UINT256_2DARRAY[0][0] == 4) { return true; }\n      if (op.param.PLUGIN_ARRAY[index].returnType == EnumReturnType.YES && param.UINT256_2DARRAY[0][0] == 5) { return true; }\n    }\n    return false;\n  }\n\n  function ID_327_ADD_PLUGIN_ANY_VOTING_RULE_INDEX_IN_LIST(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_327: The UINT_256_2DARRAY length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS && op.opcode != EnumOpcode.BATCH_ADD_PLUGINS) return false;\n    for (uint256 index = 0; index < op.param.PLUGIN_ARRAY.length; index++) {\n      for (uint256 i = 0; i < param.UINT256_2DARRAY[0].length; i++) {\n        if (op.param.PLUGIN_ARRAY[index].votingRuleIndex == param.UINT256_2DARRAY[0][i]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  // ------------------------ Voting Conditions ------------------------\n\n\n  function ID_371_ADD_ANY_VOTING_RULE_IS_ABSOLUTE_MAJORITY(Operation memory op) private pure returns (bool) {\n    if (op.opcode != EnumOpcode.BATCH_ADD_VOTING_RULES) return false;\n    for (uint256 index = 0; index < op.param.VOTING_RULE_ARRAY.length; index++) {\n      if (op.param.VOTING_RULE_ARRAY[index].bIsAbsoluteMajority == true) { return true; }\n    }\n    return false;\n  }\n\n  function ID_372_ADD_ANY_VOTING_RULE_APPROVAL_PERCENTAGE_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_372: The UINT_256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_372: The UINT_256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_VOTING_RULES) return false;\n    for (uint256 index = 0; index < op.param.VOTING_RULE_ARRAY.length; index++) {\n      if (op.param.VOTING_RULE_ARRAY[index].approvalThresholdPercentage >= param.UINT256_2DARRAY[0][0] && op.param.VOTING_RULE_ARRAY[index].approvalThresholdPercentage <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n  }\n\n  function ID_373_ADD_ANY_VOTING_RULE_TOKEN_CLASS_CONTAINS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_373: The STRING_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_373: The STRING_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_VOTING_RULES) return false;\n    for (uint256 index = 0; index < op.param.VOTING_RULE_ARRAY.length; index++) {\n      for (uint256 j = 0; j < op.param.VOTING_RULE_ARRAY[index].votingTokenClassList.length; j++) {\n        if (op.param.VOTING_RULE_ARRAY[index].votingTokenClassList[j] == param.UINT256_2DARRAY[0][0]) { return true; }\n      }\n    }\n    return false;\n  }\n\n\n  // ------------------------ Helper Functions ------------------------\n\n  /**\n   * The function to get the plugin index list of the before operation plugins\n   * @param op The operation to be checked\n   */\n  function getBeforeOpPluginIndexList(Operation memory op) private pure returns (uint256[] memory) {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      uint256[] memory pluginIndexList = new uint256[](op.param.UINT256_2DARRAY[0].length);\n      uint256 pt = 0;\n      for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n        if (op.param.BOOL_ARRAY[i]) {\n          pluginIndexList[pt] = i;\n          pt++;\n        }\n      }\n      uint256[] memory result = new uint256[](pt);\n      for (uint256 i = 0; i < pt; i++) {\n        result[i] = pluginIndexList[i];\n      }\n      return result;\n    }\n    return new uint256[](0);\n  }\n\n  /**\n   * The function to get the plugin index list of the after operation plugins\n   * @param op The operation to be checked\n   */\n  function getAfterOpPluginIndexList(Operation memory op) private pure returns (uint256[] memory) {\n    if (op.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS || op.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      uint256[] memory pluginIndexList = new uint256[](op.param.UINT256_2DARRAY[0].length);\n      uint256 pt = 0;\n      for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n        if (op.param.BOOL_ARRAY[i]) {\n          pluginIndexList[pt] = i;\n          pt++;\n        }\n      }\n      uint256[] memory result = new uint256[](pt);\n      for (uint256 i = 0; i < pt; i++) {\n        result[i] = pluginIndexList[i];\n      }\n      return result;\n    }\n    return new uint256[](0);\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_Program.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Program\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\n\ncontract Condition_Program is MachineStateManager { \n  /**\n   * The function to check the program-related condition expression\n   * @param program The program to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function programExpressionCheck(Program memory program, NodeParam memory param, uint256 id) internal pure returns (bool) {\n    if (id == 601)  return ID_601_PROGRAM_OP_LENGTH_GREATER_THAN(program, param);\n    if (id == 602)  return ID_602_PROGRAM_OP_LENGTH_LESS_THAN(program, param);\n    if (id == 603)  return ID_603_PRORGRAM_OP_LENGTH_EQUALS(program, param);\n    if (id == 604)  return ID_604_PROGRAM_OP_LENGTH_IN_RANGE(program, param);\n    if (id == 605)  return ID_605_PROGRAM_CONTAINS_OP(program, param);\n    if (id == 606)  return ID_606_PROGRAM_CONTAINS_OP_IN_LIST(program, param);\n    if (id == 607)  return ID_607_PROGRAM_EVERY_OP_EQUALS(program, param);\n    if (id == 608)  return ID_608_PROGRAM_EVERY_OP_IN_LIST(program, param);\n    return false;\n  }\n\n  function ID_601_PROGRAM_OP_LENGTH_GREATER_THAN(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_601: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_601: The UINT256_2DARRAY[0] length is not 1\");\n    return program.operations.length > param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_602_PROGRAM_OP_LENGTH_LESS_THAN(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_602: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_602: The UINT256_2DARRAY[0] length is not 1\");\n    return program.operations.length < param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_603_PRORGRAM_OP_LENGTH_EQUALS(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_603: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_603: The UINT256_2DARRAY[0] length is not 1\");\n    return program.operations.length == param.UINT256_2DARRAY[0][0];\n  }\n\n  function ID_604_PROGRAM_OP_LENGTH_IN_RANGE(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_604: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_604: The UINT256_2DARRAY[0] length is not 2\");\n    return program.operations.length >= param.UINT256_2DARRAY[0][0] && program.operations.length <= param.UINT256_2DARRAY[0][1];\n  }\n\n  function ID_605_PROGRAM_CONTAINS_OP(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_605: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_605: The UINT256_2DARRAY[0] length is not 1\");\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      if (OpcodeMap.opcodeVal(program.operations[i].opcode) == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_606_PROGRAM_CONTAINS_OP_IN_LIST(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_606: The UINT256_2DARRAY length is not 1\");\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      for (uint256 j=0; j< param.UINT256_2DARRAY[0].length; j++) {\n        if (OpcodeMap.opcodeVal(program.operations[i].opcode) == param.UINT256_2DARRAY[0][j]) { return true; }\n      }\n    }\n    return false;\n  }\n\n  function ID_607_PROGRAM_EVERY_OP_EQUALS(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_607: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == program.operations.length, \"CE ID_607: The UINT256_2DARRAY[0] length is not equal to program length\");\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      if (OpcodeMap.opcodeVal(program.operations[i].opcode) != param.UINT256_2DARRAY[0][i]) { return false; }\n    }\n    return true;\n  }\n\n  function ID_608_PROGRAM_EVERY_OP_IN_LIST(Program memory program, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_608: The UINT256_2DARRAY length is not 1\");\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      bool bFound = false;\n      for (uint256 j=0; j< param.UINT256_2DARRAY[0].length; j++) {\n        if (OpcodeMap.opcodeVal(program.operations[i].opcode) == param.UINT256_2DARRAY[0][j]) { bFound = true; break; }\n      }\n      if (!bFound) { return false; }\n    }\n    return true;\n  }\n\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_TokenAndCash.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of pay-to-mint, pay-to-transfer, burn-and-refund operation with cash\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\nimport \"../Utilities/ExternalValueReader.sol\";\n\ncontract Condition_TokenAndCash is MachineStateManager { \n  /**\n   * The function to check the batch operation related condition expression\n   * @param op The operation to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function tokenAndCashExpressionCheck(Operation memory op, NodeParam memory param, uint256 id) internal view returns (bool) {\n    if (id== 461)  return ID_461_TOKEN_X_OP_ANY_PRICE_GREATER_THAN(op, param);\n    if (id== 462)  return ID_462_TOKEN_X_OP_ANY_PRICE_LESS_THAN(op, param);\n    if (id== 463)  return ID_463_TOKEN_X_OP_ANY_PRICE_IN_RANGE(op, param);\n    if (id== 464)  return ID_464_TOKEN_X_OP_ANY_PRICE_EQUALS(op, param);\n    if (id== 465)  return ID_465_TOKEN_X_OP_ANY_PRICE_GREATER_THAN_EXTERNAL_VALUE_UINT256(op, param);\n    if (id== 466)  return ID_466_TOKEN_X_OP_ANY_PRICE_LESS_THAN_EXTERNAL_VALUE_UINT256(op, param);\n    if (id== 467)  return ID_467_TOKEN_X_OP_ANY_PRICE_EQUALS_EXTERNAL_VALUE_UINT256(op, param);\n\n    return false;\n  }\n\n  function ID_461_TOKEN_X_OP_ANY_PRICE_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_461: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_461: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_461: The token class list length is not equal to price list length\");\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] > param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_462_TOKEN_X_OP_ANY_PRICE_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_462: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_462: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_462: The token class list length is not equal to price list length\");\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] < param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_463_TOKEN_X_OP_ANY_PRICE_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_463: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 3, \"CE ID_463: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_463: The token class list length is not equal to price list length\");\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] >= param.UINT256_2DARRAY[0][1] && priceList[i] <= param.UINT256_2DARRAY[0][2]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_464_TOKEN_X_OP_ANY_PRICE_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_464: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_464: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_464: The token class list length is not equal to price list length\");\n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] == param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_465_TOKEN_X_OP_ANY_PRICE_GREATER_THAN_EXTERNAL_VALUE_UINT256(Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_465: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_465: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n\n\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_465: The token class list length is not equal to price list length\");\n\n    // try to get external value\n    (bool success, uint256 externalValue) = ExternalValueReader.tryReadUINT256(op.param.ADDRESS_2DARRAY[0][0], op.param.BYTES);\n\n    if (success == false) return false;\n    \n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] > externalValue) { return true; }\n    }\n    return false;\n  }\n\n  function ID_466_TOKEN_X_OP_ANY_PRICE_LESS_THAN_EXTERNAL_VALUE_UINT256(Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_466: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_466: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_466: The token class list length is not equal to price list length\");\n\n    // try to get external value\n    (bool success, uint256 externalValue) = ExternalValueReader.tryReadUINT256(op.param.ADDRESS_2DARRAY[0][0], op.param.BYTES);\n\n    if (success == false) return false;\n    \n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] < externalValue) { return true; }\n    }\n    return false;\n  }\n\n  function ID_467_TOKEN_X_OP_ANY_PRICE_EQUALS_EXTERNAL_VALUE_UINT256(Operation memory op, NodeParam memory param) private view returns (bool) {\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_467: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_467: The UINT256_2DARRAY[0] length is not 1\");\n    if (bIsTokenOperationWithCash(op) == false) return false;\n\n    (uint256[] memory tokenClassList, , uint256[] memory priceList) = getTokenClassAmountPriceList(op);\n    require(tokenClassList.length == priceList.length, \"CE ID_467: The token class list length is not equal to price list length\");\n\n    // try to get external value\n    (bool success, uint256 externalValue) = ExternalValueReader.tryReadUINT256(op.param.ADDRESS_2DARRAY[0][0], op.param.BYTES);\n\n    if (success == false) return false;\n    \n    for (uint256 i = 0; i < tokenClassList.length; i++) {\n      if (tokenClassList[i] == param.UINT256_2DARRAY[0][0] && priceList[i] == externalValue) { return true; }\n    }\n    return false;\n  }\n\n  \n\n  // -------------------------------- below are helper functions ----------------------------\n  function bIsTokenOperationWithCash(Operation memory op) private pure returns (bool) {\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS \n    || op.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS\n    || op.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND\n    ) { return true; }\n    return false;\n  }\n\n  function getTokenClassAmountPriceList(Operation memory op) private pure returns (uint256[] memory, uint256[] memory, uint256[] memory) {\n    require(bIsTokenOperationWithCash(op), \"CE ID_461: The operation is not token operation with cash(pay-to-mint, pay-to-transfer, burn-and-refund)\");\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], op.param.UINT256_2DARRAY[2]);\n    }\n    if (op.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[2], op.param.UINT256_2DARRAY[3]);\n    }\n    if (op.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) {\n      return (op.param.UINT256_2DARRAY[0], op.param.UINT256_2DARRAY[1], op.param.UINT256_2DARRAY[2]);\n    }\n    return (new uint256[](0), new uint256[](0), new uint256[](0));\n  }\n\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/Condition_Withdrawable.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n/**\n * @title Condition of Operator\n * @author DARC Team\n * @notice All the condition expression functions related to Operator\n */\n\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Utilities/OpcodeMap.sol\";\nimport \"../Plugin.sol\";\n\ncontract Condition_Withdrawable is MachineStateManager { \n  /**\n   * The function to check the batch operation related condition expression\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param op The operation to be checked\n   * @param param The parameter list of the condition expression\n   * @param id The id of the condition expression\n   */\n  function withdrawableExpressionCheck(bool bIsBeforeOperation, Operation memory op, NodeParam memory param, uint256 id) internal pure returns (bool) {\n    if (id == 431)  return ID_431_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN(op, param);\n    if (id == 432)  return ID_432_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN(op, param);\n    if (id == 433)  return ID_433_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE(op, param);\n    if (id == 434)  return ID_434_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS(op, param);\n    if (id == 435)  return ID_435_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN(op, param);\n    if (id == 436)  return ID_436_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN(op, param);\n    if (id == 437)  return ID_437_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE(op, param);\n    if (id == 438)  return ID_438_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS(op, param);\n    return false;\n  }\n\n  function ID_431_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_431: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_431: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] > param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_432_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_432: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_432: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] < param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_433_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_433: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_433: The UINT256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] >= param.UINT256_2DARRAY[0][0] && op.param.UINT256_2DARRAY[0][i] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_434_ADD_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_434: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_434: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_435_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_GREATER_THAN(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_435: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_435: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] > param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_436_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_LESS_THAN(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_436: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_436: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] < param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_437_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_IN_RANGE(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_437: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 2, \"CE ID_437: The UINT256_2DARRAY[0] length is not 2\");\n    if (op.opcode != EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] >= param.UINT256_2DARRAY[0][0] && op.param.UINT256_2DARRAY[0][i] <= param.UINT256_2DARRAY[0][1]) { return true; }\n    }\n    return false;\n  }\n\n  function ID_438_REDUCE_WITHDRAWABLE_BALANCE_ANY_AMOUNT_EQUALS(Operation memory op, NodeParam memory param) private pure returns (bool){\n    require(param.UINT256_2DARRAY.length == 1, \"CE ID_438: The UINT256_2DARRAY length is not 1\");\n    require(param.UINT256_2DARRAY[0].length == 1, \"CE ID_438: The UINT256_2DARRAY[0] length is not 1\");\n    if (op.opcode != EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return false;\n    for (uint256 i = 0; i < op.param.UINT256_2DARRAY[0].length; i++) {\n      if (op.param.UINT256_2DARRAY[0][i] == param.UINT256_2DARRAY[0][0]) { return true; }\n    }\n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/EnumConditionExpression.sol.old",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\n/** \n * @notice EnumConditionExpression is the enum of the condition expression command, with parameters and types\n */\n\nenum EnumConditionExpression{\n\n  /**\n   * @notice the default value of the enum is UNDEFINED, which is considered as an invalid value\n   */\n  UNDEFINED,  // ID: 0 params: none \n\n  // ----------------------------------------------------------\n  /**\n   * @notice the expression related to the operator and expressions\n   */\n\n  OPERATOR_NAME_EQUALS,   //ID: 1 params: string operatorName\n  OPERATOR_ROLE_INDEX_EQUALS,   //ID:2 params: uint256 operatorRoleIndex\n  OPERATOR_ADDRESS_EQUALS, //ID:3 params: address operatorAddress\n  OPERATOR_ROLE_GREATER_THAN, // params: uint256 operatorRoleIndex\n  OPERATOR_ROLE_LESS_THAN, // params: uint256 operatorRoleIndex\n  OPERATOR_ROLE_IN_RANGE,  // params: uint256 operatorRoleIndex\n  OPERATOR_ROLE_IN_LIST, // params: uint256[] operatorRoleIndexArray\n\n  OPERATOR_TOKEN_X_AMOUNT_GREATER_THAN,  // params: uint256 token class, uint256 amount\n  OPERATOR_TOKEN_X_AMOUNT_LESS_THAN,  // params: uint256 token class, uint256 amount\n  OPERATOR_TOKEN_X_AMOUNT_IN_RANGE,  // params: uint256 token class, uint256 amount\n  OPERATOR_TOKEN_X_AMOUNT_EQUALS,  // params: uint256 token class, uint256 amount\n  OPERATOR_TOKEN_X_PERCENTAGE_GREATER_THAN,  // params: uint256 token class, uint256 percentage\n  OPERATOR_TOKEN_X_PERCENTAGE_LESS_THAN,  // params: uint256 token class, uint256 percentage\n  OPERATOR_TOKEN_X_PERCENTAGE_IN_RANGE,  // params: uint256 token class, uint256 percentage\n  OPERATOR_TOKEN_X_PERCENTAGE_EQUALS,  // params: uint256 token class, uint256 percentage\n\n  OPERATOR_VOTING_WEIGHT_GREATER_THAN,  // params: uint256 amount\n  OPERATOR_VOTING_WEIGHT_LESS_THAN,  // params: uint256 amount\n  OPERATOR_VOTING_WEIGHT_IN_RANGE,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WEIGHT_GREATER_THAN,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WEIGHT_LESS_THAN,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WEIGHT_IN_RANGE,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WITHDRAWABLE_GREATER_THAN,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WITHDRAWABLE_LESS_THAN,  // params: uint256 amount\n  OPERATOR_DIVIDEND_WITHDRAWABLE_IN_RANGE,  // params: uint256 amount\n\n  OPERATOR_WITHDRAWABLE_CASH_GREATER_THAN,  // params: uint256 amount\n  OPERATOR_WITHDRAWABLE_CASH_LESS_THAN,  // params: uint256 amount\n  OPERATOR_WITHDRAWABLE_CASH_IN_RANGE,  // params: uint256 amount\n  OPERATOR_WITHDRAWABLE_DIVIDENDS_GREATER_THAN,  // params: uint256 amount\n  OPERATOR_WITHDRAWABLE_DIVIDENDS_LESS_THAN,  // params: uint256 amount\n  OPERATOR_WITHDRAWABLE_DIVIDENDS_IN_RANGE,  // params: uint256 amount\n\n  OPERATOR_ADDRESS_IN_LIST, // params: address[] the list of addresses\n\n  PlaceHolder1,\n  PlaceHolder2,\n  PlaceHolder3,\n  PlaceHolder4,\n  PlaceHolder5,\n  PlaceHolder6,\n  PlaceHolder7,\n  PlaceHolder8,\n  PlaceHolder9,\n  PlaceHolder10,\n  PlaceHolder11,\n  PlaceHolder12,\n  PlaceHolder13,\n  PlaceHolder14,\n  PlaceHolder15,\n  PlaceHolder16,\n  PlaceHolder17,\n  PlaceHolder18,\n  PlaceHolder19,\n  PlaceHolder20,\n\n  // ----------------------------------------------------------\n  /**\n   * @notice Machine State related expressions\n   */\n  TIMESTAMP_GREATER_THAN,\n  TIMESTAMP_LESS_THAN,\n  TIMESTAMP_IN_RANGE,\n\n  DATE_YEAR_GREATER_THAN,\n  DATE_YEAR_LESS_THAN,\n  DATE_YEAR_IN_RANGE,\n  DATE_MONTH_GREATER_THAN,\n  DATE_MONTH_LESS_THAN,\n  DATE_MONTH_IN_RANGE,\n  DATE_DAY_GREATER_THAN,\n  DATE_DAY_LESS_THAN,\n  DATE_DAY_IN_RANGE,\n  DATE_HOUR_GREATER_THAN,\n  DATE_HOUR_LESS_THAN,\n  DATE_HOUR_IN_RANGE,\n\n  ADDRESS_VOTING_WEIGHT_GREATER_THAN,\n  ADDRESS_VOTING_WEIGHT_LESS_THAN,\n  ADDRESS_VOTING_WEIGHT_IN_RANGE,\n  ADDRESS_DIVIDEND_WEIGHT_GREATER_THAN,\n  ADDRESS_DIVIDEND_WEIGHT_LESS_THAN,\n  ADDRESS_DIVIDEND_WEIGHT_IN_RANGE,\n  ADDRESS_TOKEN_X_GREATER_THAN,\n  ADDRESS_TOKEN_X_LESS_THAN,\n  ADDRESS_TOKEN_X_IN_RANGE,\n\n  TOTAL_VOTING_WEIGHT_GREATER_THAN,\n  TOTAL_VOTING_WEIGHT_LESS_THAN,\n  TOTAL_VOTING_WEIGHT_IN_RANGE,\n  TOTAL_DIVIDEND_WEIGHT_GREATER_THAN,\n  TOTAL_DIVIDEND_WEIGHT_LESS_THAN,\n  TOTAL_DIVIDEND_WEIGHT_IN_RANGE,\n  TOTAL_CASH_GREATER_THAN,\n  TOTAL_CASH_LESS_THAN,\n  TOTAL_CASH_IN_RANGE,\n  TOTAL_CASH_EQUALS,\n\n  TOKEN_IN_list_VOTING_WEIGHT_GREATER_THAN,\n  TOKEN_IN_list_VOTING_WEIGHT_LESS_THAN,\n  TOKEN_IN_list_VOTING_WEIGHT_IN_RANGE,\n  TOKEN_IN_list_DIVIDEND_WEIGHT_GREATER_THAN,\n  TOKEN_IN_list_DIVIDEND_WEIGHT_LESS_THAN,\n  TOKEN_IN_list_DIVIDEND_WEIGHT_IN_RANGE,\n  TOKEN_IN_list_AMOUNT_GREATER_THAN,\n  TOKEN_IN_list_AMOUNT_LESS_THAN,\n  TOKEN_IN_list_AMOUNT_IN_RANGE,\n  TOKEN_IN_list_AMOUNT_EQUALS,\n\n\n  PlaceHolder21,\n  PlaceHolder22,\n  PlaceHolder23,\n  PlaceHolder24,\n  PlaceHolder25,\n  PlaceHolder26,\n  PlaceHolder27,\n  PlaceHolder28,\n  PlaceHolder29,\n  PlaceHolder30,\n  PlaceHolder31,\n  PlaceHolder32,\n  PlaceHolder33,\n  PlaceHolder34,\n  PlaceHolder35,\n  PlaceHolder36,\n  PlaceHolder37,\n  PlaceHolder38,\n  PlaceHolder39,\n  PlaceHolder40,\n  PlaceHolder41,\n  PlaceHolder42,\n  PlaceHolder43,\n  PlaceHolder44,\n  PlaceHolder45,\n  PlaceHolder46,\n  PlaceHolder47,\n  PlaceHolder48,\n  PlaceHolder49,\n  PlaceHolder50,\n  PlaceHolder51,\n  PlaceHolder52,\n  PlaceHolder53,\n  PlaceHolder54,\n  PlaceHolder55,\n  PlaceHolder56,\n  PlaceHolder57,\n  PlaceHolder58,\n  PlaceHolder59,\n  PlaceHolder60,\n\n\n\n\n\n  // ----------------------------------------------------------\n  // General Operation and Operation Log related expressions\n  OPERATION_EQUALS,\n  OPERATION_IN_LIST,\n  OPERATION_BY_OPERATOR_SINCE_LAST_TIME_GREATER_THAN,\n  OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN,\n  OPERATION_BY_OPERATOR_SINCE_LAST_TIME_IN_RANGE,\n  OPERATION_EVERYONE_SINCE_LAST_TIME_GREATER_THAN,\n  OPERATION_EVERYONE_SINCE_LAST_TIME_LESS_THAN,\n  OPERATION_EVERYONE_SINCE_LAST_TIME_IN_RANGE,\n  OPERATION_BATCH_SIZE_GREATER_THAN,\n  OPERATION_BATCH_SIZE_LESS_THAN,\n  OPERATION_BATCH_SIZE_IN_RANGE,\n  OPERATION_BATCH_SIZE_EQUALS,\n  PlaceHolder61,\n  PlaceHolder62,\n  PlaceHolder63,\n  PlaceHolder64,\n  PlaceHolder65,\n  PlaceHolder66,\n  PlaceHolder67,\n  PlaceHolder68,\n  PlaceHolder69,\n  PlaceHolder70,\n  PlaceHolder71,\n  PlaceHolder72,\n  PlaceHolder73,\n  PlaceHolder74,\n  PlaceHolder75,\n  PlaceHolder76,\n  PlaceHolder77,\n  PlaceHolder78,\n  PlaceHolder79,\n  PlaceHolder80,\n\n  // ----------------------------------------------------------\n  // Oracle and remote call related expressions\n  ORACLE_CALL_UINT256_RESULT_EQUALS,\n  ORACLE_CALL_UINT256_RESULT_GREATER_THAN,\n  ORACLE_CALL_UINT256_RESULT_LESS_THAN,\n  ORACLE_CALL_UINT256_RESULT_IN_RANGE,\n  ORACLE_CALL_UINT256_1_LESS_THAN_2,\n  ORACLE_CALL_UINT256_1_GREATER_THAN_2,\n  ORACLE_CALL_UINT256_1_EQUALS_2,\n  ORACLE_CALL_STRING_RESULT_EQUALS,\n  ORACLE_CALL_STRING_1_EQUALS_2,\n  PlaceHolder81,\n  PlaceHolder82,\n  PlaceHolder83,\n  PlaceHolder84,\n  PlaceHolder85,\n  PlaceHolder86,\n  PlaceHolder87,\n  PlaceHolder88,\n  PlaceHolder89,\n  PlaceHolder90,\n  PlaceHolder91,\n  PlaceHolder92,\n  PlaceHolder93,\n  PlaceHolder94,\n  PlaceHolder95,\n  PlaceHolder96,\n  PlaceHolder97,\n  PlaceHolder98,\n  PlaceHolder99,\n  PlaceHolder100,\n\n\n  // ----------------------------------------------------------\n  // Mint token operation related expressions\n  MINT_TOKENS_TOTAL_AMOUNT_MORE_THAN,\n  MINT_TOKENS_TOTAL_AMOUNT_LESS_THAN,\n  MINT_TOKENS_TOTAL_AMOUNT_IN_RANGE,\n  MINT_TOKENS_TOTAL_AMOUNT_EQUALS,\n\n  MINT_TOKENS_ALL_TARGETS_ADDRESS_IN_LIST,\n  MINT_TOKENS_ALL_TARGETS_ADDRESS_TO_ITSELF,\n  MINT_TOKENS_ALL_TARGETS_ADDRESS_TO_ROLE_INDEX_IN_LIST,\n  MINT_TOKENS_TOTAL_AMOUNT_LEVEL_X_MORE_THAN,\n  MINT_TOKENS_TOTAL_AMOUNT_LEVEL_X_LESS_THAN,\n  MINT_TOKENS_TOTAL_AMOUNT_LEVEL_X_IN_RANGE,\n  MINT_TOKENS_TOTAL_AMOUNT_LEVEL_X_EQUALS,\n  MINT_TOKENS_TOTAL_VOTING_WEIGHT_GREATER_THAN,\n  MINT_TOKENS_TOTAL_VOTING_WEIGHT_LESS_THAN,\n  MINT_TOKENS_TOTAL_VOTING_WEIGHT_IN_RANGE,\n  MINT_TOKENS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN,\n  MINT_TOKENS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN,\n  MINT_TOKENS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_MORE_THAN,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_LESS_THAN,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_IN_RANGE,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_EQUALS,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_MORE_THAN,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_LESS_THAN,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_IN_RANGE,\n  MINT_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_EQUALS,\n  MINT_TOKEN_EACH_BATCH_TARGET_ADDRESS_IN_LIST,\n  MINT_TOKEN_EACH_BATCH_TARGET_ADDRESS_TO_ROLE_INDEX_IN_LIST,\n\n  PlaceHolder101,\n  PlaceHolder102,\n  PlaceHolder103,\n  PlaceHolder104,\n  PlaceHolder105,\n  PlaceHolder106,\n  PlaceHolder107,\n  PlaceHolder108,\n  PlaceHolder109,\n  PlaceHolder110,\n  PlaceHolder111,\n  PlaceHolder112,\n  PlaceHolder113,\n  PlaceHolder114,\n  PlaceHolder115,\n  PlaceHolder116,\n  PlaceHolder117,\n  PlaceHolder118,\n  PlaceHolder119,\n  PlaceHolder120,\n\n  // ----------------------------------------------------------\n  // BURN token operation related expressions\n  BURN_TOKENS_TOTAL_AMOUNT_MORE_THAN,\n  BURN_TOKENS_TOTAL_AMOUNT_LESS_THAN,\n  BURN_TOKENS_TOTAL_AMOUNT_IN_RANGE,\n  BURN_TOKENS_TOTAL_AMOUNT_EQUALS,\n\n  BURN_TOKENS_ALL_TARGETS_ADDRESS_IN_LIST,\n  BURN_TOKENS_ALL_TARGETS_ADDRESS_TO_ITSELF,\n  BURN_TOKENS_ALL_TARGETS_ADDRESS_TO_ROLE_INDEX_IN_LIST,\n  BURN_TOKENS_TOTAL_AMOUNT_LEVEL_X_MORE_THAN,\n  BURN_TOKENS_TOTAL_AMOUNT_LEVEL_X_LESS_THAN,\n  BURN_TOKENS_TOTAL_AMOUNT_LEVEL_X_IN_RANGE,\n  BURN_TOKENS_TOTAL_AMOUNT_LEVEL_X_EQUALS,\n  BURN_TOKENS_TOTAL_VOTING_WEIGHT_GREATER_THAN,\n  BURN_TOKENS_TOTAL_VOTING_WEIGHT_LESS_THAN,\n  BURN_TOKENS_TOTAL_VOTING_WEIGHT_IN_RANGE,\n  BURN_TOKENS_TOTAL_DIVIDEND_WEIGHT_GREATER_THAN,\n  BURN_TOKENS_TOTAL_DIVIDEND_WEIGHT_LESS_THAN,\n  BURN_TOKENS_TOTAL_DIVIDEND_WEIGHT_IN_RANGE,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_MORE_THAN,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_LESS_THAN,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_IN_RANGE,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_EQUALS,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_MORE_THAN,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_LESS_THAN,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_IN_RANGE,\n  BURN_TOKEN_EACH_BATCH_AMOUNT_LEVEL_X_EQUALS,\n  BURN_TOKEN_EACH_BATCH_TARGET_ADDRESS_IN_LIST,\n  BURN_TOKEN_EACH_BATCH_TARGET_ADDRESS_TO_ROLE_INDEX_IN_LIST,\n\n  // ----------------------------------------------------------\n  /**\n   * @notice transfer token related expressions\n   */\n\n  /**\n   * This condition expression will be ture if:\n   *  1. the current operation is\n   *  2. transfering tokens token class is in token class array \n   *  3. the amount of the token is larger than the amount X \n   * params: uint256[] tokenClassIndexArray, uint256 amount\n   */\n  TRANSFER_TOKEN_MORE_THAN,\n\n  /**\n   * This condition expression will be ture if:\n   *  1. the current operation is\n   *  2. transfering tokens to address is in address array\n\n\n\n  /**\n   * This condition expression will be ture if:\n   *  1. the current operation is\n   *  2. transfering tokens to address is in address array\n   * params: address[] fromAddressArray\n   */\n  TRANSFER_TOKEN_FROM,\n\n  /**\n   * This condition expression will be ture if:\n   *  1. the current operation is\n   *  2. transfering tokens from address is in address array\n   * params: address[] toAddressArray\n   */\n  TRANSFER_TOKEN_TO,\n\n  /**\n   * This condition expression will be ture if:\n   *  1. the current operation is\n   *  2. transfering tokens from address is not the operator address\n   * params: none\n   */\n  TRANSFER_FROM_OTHERS\n\n\n\n\n  // ----------------------------------------------------------\n  // Token state related expressions\n\n\n  // ----------------------------------------------------------\n  // Cash related expressions\n\n  // ----------------------------------------------------------\n  // Dividend related expressions\n\n  // ----------------------------------------------------------\n  // Emergency operations related expressions\n\n  // ----------------------------------------------------------\n  // member list operations related expressions\n\n  // ----------------------------------------------------------\n  // parameter setup operations related expressions\n\n  // ----------------------------------------------------------\n  // plugin operations related expressions\n  // \n\n} "
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/PluginFactory.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport '../Plugin.sol';\nimport '../MachineStateManager.sol';\nimport './ConditionExpressionFactory.sol';\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\n/**\n * @title The plugin factory contract of DARC\n * @author DARC Team\n * @notice The plugin factory contract is used to create plugins.\n * Since plugins need to read the machine state, the plugin factory contract inherits the \n * MachineStateManager contract.\n */\ncontract PluginFactory is ConditionExpressionFactory{\n\n  /**\n   * @notice The entrance of the plugin factory contract\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param operation The operation to be checked\n   * @param pluginIndex The index of the plugin in the plugin system\n   * @param program The program to be checked (for checking the program-related conditions, such as program length)\n   * @return uint256 The return level of the plugin\n   * @return EnumReturnType The return type of the plugin\n   * @return uint256 The index of the plugin in the plugin system (if not VOTING_NEEDED, return 0)\n   */\n  function pluginCheck(bool bIsBeforeOperation, Operation memory operation, uint256 pluginIndex, Program memory program) internal view returns (uint256, EnumReturnType, uint256) {\n\n    // initialize the return value\n    uint256 returnLevel = 0;\n    EnumReturnType returnType = EnumReturnType.UNDEFINED;\n    uint256 returnVotingRuleIndex = 0;\n\n    // if the condition node list is not even initialized, just return UNDEFINED and defalut values\n    if (bIsBeforeOperation)\n    {\n      require(pluginIndex < currentMachineState.beforeOpPlugins.length, \"PluginFactory: plugin index out of range\");\n    }\n    else {\n      require(pluginIndex < currentMachineState.afterOpPlugins.length, \"PluginFactory: plugin index out of range\");\n    }\n    \n    // start from expression condition root node idx = 0, recursively check the condition expression tree\n    bool bResult = checkConditionExpressionNode(bIsBeforeOperation, operation, program, pluginIndex, 0);\n\n    // if result is true, which means this plugin is triggered by current operation and machine state\n    // return the return level, return type and voting rule index\n    if (bResult) {\n      if (bIsBeforeOperation) {\n        returnLevel = currentMachineState.beforeOpPlugins[pluginIndex].level;\n        returnType = currentMachineState.beforeOpPlugins[pluginIndex].returnType;\n        returnVotingRuleIndex = currentMachineState.beforeOpPlugins[pluginIndex].votingRuleIndex;\n      }\n      else{\n        returnLevel = currentMachineState.afterOpPlugins[pluginIndex].level;\n        returnType = currentMachineState.afterOpPlugins[pluginIndex].returnType;\n        returnVotingRuleIndex = currentMachineState.afterOpPlugins[pluginIndex].votingRuleIndex;\n      }\n\n    }\n\n    return (returnLevel, returnType, returnVotingRuleIndex);\n  }\n\n  /**\n   * @notice Check if the operation is valid by checking each condition node in the condition expression tree\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param operation The operation index to be checked\n   * @param program The program to be checked (for checking the program-related conditions, such as program length)\n   * @param pluginIndex The index of the plugin in the plugin system\n   * @param nodeIndex The index of the node in the condition expression tree\n   * @return bool The return value of the condition node\n   */\n  function checkConditionExpressionNode(bool bIsBeforeOperation, Operation memory operation, Program memory program, uint256 pluginIndex, uint256 nodeIndex) internal view returns (bool) {\n    if (bIsBeforeOperation) {\n      require(pluginIndex < currentMachineState.beforeOpPlugins.length, string.concat(\"Checking condition exp: plugin index out of range, plugin index: \", Strings.toString(pluginIndex)));\n      require(nodeIndex < currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes.length, string.concat(\"Checking condition exp: node index out of range, plugin index: \", Strings.toString(pluginIndex), \", node index: \", Strings.toString(nodeIndex)));\n    }\n    else {\n      require(pluginIndex < currentMachineState.afterOpPlugins.length, string.concat(\"Checking condition exp: plugin index out of range, plugin index: \", Strings.toString(pluginIndex)));\n      require(nodeIndex < currentMachineState.afterOpPlugins[pluginIndex].conditionNodes.length, string.concat(\"Checking condition exp: node index out of range, plugin index: \", Strings.toString(pluginIndex), \", node index: \", Strings.toString(nodeIndex)));\n    }\n    // check the type of current node\n    EnumConditionNodeType nodeType = bIsBeforeOperation? \n      currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].nodeType : \n      currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].nodeType;\n\n    // if the node is UNDEFINED, just return false\n    if (nodeType == EnumConditionNodeType.UNDEFINED) {\n      return false;\n    }\n\n    // if the node is BOOLEAN_TRUE or BOOLEAN_FALSE, just return the value of the node\n    else if (nodeType == EnumConditionNodeType.BOOLEAN_TRUE) {\n      return true;\n    }\n    else if (nodeType == EnumConditionNodeType.BOOLEAN_FALSE) {\n      return false;\n    }\n\n    // if the node is a condition expression node, return the value from condition expression factory\n    else if (nodeType == EnumConditionNodeType.EXPRESSION)\n    { \n      return conditionExpressionCheck(bIsBeforeOperation, operation, program, pluginIndex, nodeIndex);\n    }\n\n    // if the node is Logic Operator (AND, OR, NOT, XOR), check the list of nodes\n    else if (nodeType == EnumConditionNodeType.LOGICAL_OPERATOR ) {\n      EnumLogicalOperatorType loType = bIsBeforeOperation? \n        currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].logicalOperator : \n        currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].logicalOperator;\n\n      // get the valid length of the childList: \n      // For a logical operator, if the value of childList[i] is 0, \n      // it means the nodes with index >= i are not initialized\n      uint256 validLength = bIsBeforeOperation? \n        currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].childList.length : \n        currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].childList.length;\n\n\n      // get the boolean value of each node in the list\n      bool[] memory bResultList = new bool[](validLength);\n\n      // traverse the list of nodes and save the result into the bResultList\n      for (uint256 i = 0; i < validLength; i++) {\n        uint256 val = bIsBeforeOperation? \n          currentMachineState.beforeOpPlugins[pluginIndex].conditionNodes[nodeIndex].childList[i]:\n          currentMachineState.afterOpPlugins[pluginIndex].conditionNodes[nodeIndex].childList[i];\n        bResultList[i] = checkConditionExpressionNode(bIsBeforeOperation, operation, program, pluginIndex, val);\n      }\n\n      // construct the result for each logical operator and return\n      if (loType == EnumLogicalOperatorType.AND) {\n        // if the operator is AND, the result is true only if all the nodes in the list are true\n        bool bResult = true;\n        for (uint256 i = 0; i < validLength; i++) {\n          bResult = bResult && bResultList[i];\n        }\n        return bResult;\n      }\n      else if (loType == EnumLogicalOperatorType.OR) {\n        // if the operator is OR, the result is true if any of the nodes in the list is true\n        bool bResult = false;\n        for (uint256 i = 0; i < validLength; i++) {\n          bResult = bResult || bResultList[i];\n        }\n        return bResult;\n      }\n      else if (loType == EnumLogicalOperatorType.NOT) {\n        // if the operator is NOT, the result is the opposite of the first node in the list\n        return !bResultList[0];\n      }\n    }  \n    \n    return false;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin/PluginSystem.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Program.sol\";\nimport \"../Plugin.sol\";\nimport \"./PluginFactory.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n\n/**\n * @title DARC Plugin System\n * @author DARC Team\n * @notice null \n */\n\n/**\n * @notice The plugin system of DARC\n */\ncontract PluginSystem is PluginFactory{\n\n  /**\n   * @notice The plugin system of DARC, which determines if the program is \n   * valid by checking each operation in the program with each plugin \n   * in the plugin system\n   * @param bIsBeforeOperation The flag of before operation\n   * @param currentProgram The program to be checked\n   * @return EnumReturnType The return type of the program\n   * @return uint256[] The list of voting rule index\n   */\n  function pluginSystemJudgment(bool bIsBeforeOperation, Program memory currentProgram) internal view returns (EnumReturnType, uint256[] memory) {\n\n    // 1. get the total number of plugins, depending on the flag of sandbox and the flag of before operation\n    uint256 totalNumberOfPlugin = 0;\n\n    if (bIsBeforeOperation){\n      totalNumberOfPlugin = currentMachineState.beforeOpPlugins.length;\n    }\n    else {\n      totalNumberOfPlugin = currentMachineState.afterOpPlugins.length;\n    }\n\n    // 1.1 initialize the highest return level and highest return type as temporary variables\n    uint256 highestReturnLevel = 0;\n    EnumReturnType highestReturnType = EnumReturnType.UNDEFINED;\n\n    // initialize the result of each operations\n    EnumReturnType[] memory operationReturnTypeList = new EnumReturnType[](currentProgram.operations.length);\n\n    // initialize the voting rule list as an array of uint256 with length of \n    // initialLength = number of plugins * number of operations\n    // later, we will return another trimmed array of uint256 with length of voting rule index\n    // this is because we cannot initialize a dynamic array of struct in solidity as memory\n    // and we dont want to create another smart contract to dynamically store the voting rule list\n    (bool bIsValid, uint256 initialLength) = SafeMathUpgradeable.tryMul(\n      totalNumberOfPlugin, currentProgram.operations.length);\n    require(bIsValid, \"The length of voting rule list is overflow\");\n    uint256[] memory VotingRuleIndexList = new uint256[](initialLength);\n    uint256 VotingRuleIndex = 0;\n\n    // if the program is empty, return undefined\n    if (currentProgram.operations.length == 0) { \n      return (EnumReturnType.UNDEFINED, VotingRuleIndexList);\n    }\n\n    // initialize the plugin list length\n    uint256 pluginListLength = bIsBeforeOperation? \n        currentMachineState.beforeOpPlugins.length : \n        currentMachineState.afterOpPlugins.length;\n\n    // initialize the buffer of all the voting rules for current operation, uint256[] with length of totalNumberOfPlugin\n    uint256[] memory currentOperationVotingRuleList = new uint256[](totalNumberOfPlugin);\n    uint256 currentOperationVotingRuleIndex = 0;\n\n    // 2. go through each operation \n    for(uint256 operationIndex = 0; operationIndex < currentProgram.operations.length; operationIndex++){\n\n      \n      // initialize the highest return level = 0 and highest return type = UNDEFINED \n      highestReturnLevel = 0;\n      highestReturnType = EnumReturnType.UNDEFINED;\n\n      // reset the current operation voting rule index\n      currentOperationVotingRuleIndex = 0;\n\n      // for each of the operation, go through each plugin and check the result and \n      // return the highest level of return type\n      for (uint256 pluginIndex = 0; pluginIndex < pluginListLength; pluginIndex++) {\n\n        //2.1.1 get the current plugin index and check the result\n        (uint256 currentReturnLevel , EnumReturnType currentReturnType, uint256 currentVotingRuleIdx) = \n          checkPluginForOperation(bIsBeforeOperation, currentProgram.operations[operationIndex], pluginIndex, currentProgram);\n\n        //2.1.2 If current return level is higher than highest return level, \n        // update the highest return level and highest return type\n        if (currentReturnLevel > highestReturnLevel && currentReturnType != EnumReturnType.UNDEFINED) {\n          highestReturnLevel = currentReturnLevel;\n          highestReturnType = currentReturnType;\n\n          // clear the voting policy list\n          if (currentOperationVotingRuleIndex > 0) {\n            currentOperationVotingRuleIndex = 0;\n          }\n\n          // if the return type is vote needed, add the voting policy to the current voting rule list\n          if (currentReturnType == EnumReturnType.VOTING_NEEDED) {\n            currentOperationVotingRuleList[currentOperationVotingRuleIndex] = currentVotingRuleIdx;\n            currentOperationVotingRuleIndex++;\n          }\n        }\n\n        //2.1.3 else if current level is equal to highest level,\n        // check if the return type is vote needed\n        else if (currentReturnLevel == highestReturnLevel && currentReturnType != EnumReturnType.UNDEFINED) {\n          // if the return type is vote needed, add the voting policy to the voting policy list\n          if (currentReturnType == EnumReturnType.VOTING_NEEDED) {\n            currentOperationVotingRuleList[currentOperationVotingRuleIndex] = currentVotingRuleIdx;\n            currentOperationVotingRuleIndex++;\n          }\n        }\n\n        //2.1.4 else if current level is lower than highest level, do nothing\n        else {\n          // do nothing\n        }\n      }  // end of for loop of plugin\n\n      //2.2 after looping through all plugins, store the highest return type of current operation\n      operationReturnTypeList[operationIndex] = highestReturnType;\n\n      // if the highest return type is vote needed, add the voting rule list to the voting rule list\n      if (highestReturnType == EnumReturnType.VOTING_NEEDED) {\n        for (uint256 i = 0; i < currentOperationVotingRuleIndex; i++) {\n          VotingRuleIndexList[VotingRuleIndex] = currentOperationVotingRuleList[i];\n          VotingRuleIndex++;\n        }\n      }\n\n    } // end of for loop of operation\n\n\n    //3. after going through each operation:\n\n    //3.1 traverse the result of the return type array, and give the final decision.\n    /**\n     * ----------------------------------------------\n     * \n     * For the Before Operation Plugin System, the priority of the return value is:\n     * NO > SANDBOX_NEEDED > YES_AND_SKIP_SANDBOX > UNDEFINED, \n     * which means:\n     * 1. If any operation in the program is NO (disapproved), the program is invalid and should be rejected.\n     * 2. Otherwise, if any operation in the program is SANDBOX_NEEDED, the program should be executed in sandbox.\n     * 3. Otherwise, if any operation in the program is YES_AND_SKIP_SANDBOX, the program should skip the sandbox check and be executed in current machine state.\n     * 4. Otherwise, the program is invalid and should be rejected.\n     * \n     * For the After Operation Plugin System (after executed in sandbox), the priority of the return value is:\n     * NO > VOTING_NEEDED > YES > UNDEFINED,\n     * which means:\n     * 1. If any operation in the program is NO (disapproved), the program is invalid and should be rejected.\n     * 2. Otherwise, if any operation in the program is VOTING_NEEDED, a voting item should be created.\n     * \n     * ----------------------------------------------\n     * \n     * For each operation, the return type of current operation is the return type of the plugin with \n     * the highest priority. For example, if operation triggers 5 before operation plugins:\n     * 1. plugin X, return type: YES_AND_SKIP_SANDBOX, level 5\n     * 2. plugin Y, return type: SANDBOX_NEEDED, level 4\n     * 3. plugin Z, return type: NO, level 3\n     * \n     * Then the return type of the operation is YES_AND_SKIP_SANDBOX.\n     */\n\n    EnumReturnType finalReturnType = EnumReturnType.UNDEFINED;\n    if (bIsBeforeOperation) {\n      //3.1.1 for before operation plugin system, the priority of the return value is:\n      // NO > SANDBOX_NEEDED > YES_AND_SKIP_SANDBOX > UNDEFINED\n      for (uint256 i = 0; i < operationReturnTypeList.length; i++) {\n        if (operationReturnTypeList[i] == EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.NO;\n        }\n        else if (operationReturnTypeList[i] == EnumReturnType.SANDBOX_NEEDED \n        && finalReturnType != EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.SANDBOX_NEEDED;\n        }\n        else if (operationReturnTypeList[i] == EnumReturnType.YES_AND_SKIP_SANDBOX \n        && finalReturnType != EnumReturnType.SANDBOX_NEEDED \n        && finalReturnType != EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.YES_AND_SKIP_SANDBOX;\n        }\n      }\n    }\n    else {\n      //3.1.2 for after operation plugin system, the priority of the return value is:\n      // NO > VOTING_NEEDED > YES > UNDEFINED\n      for (uint256 i = 0; i < operationReturnTypeList.length; i++) {\n        if (operationReturnTypeList[i] == EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.NO;\n\n        }\n        else if (operationReturnTypeList[i] == EnumReturnType.VOTING_NEEDED \n        && finalReturnType != EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.VOTING_NEEDED;\n\n        }\n        else if (operationReturnTypeList[i] == EnumReturnType.YES \n        && finalReturnType != EnumReturnType.VOTING_NEEDED \n        && finalReturnType != EnumReturnType.NO) {\n          finalReturnType = EnumReturnType.YES;\n\n        }\n      }\n    }\n    \n    //3.2 if voting is needed, reconstruct the voting rule list\n    // otherwise, return an empty list\n    if (finalReturnType != EnumReturnType.VOTING_NEEDED) {\n      VotingRuleIndex = 0;\n    }\n    uint256[] memory trimmedList = new uint256[](VotingRuleIndex);\n    for (uint256 i = 0; i < VotingRuleIndex; i++) {\n      trimmedList[i] = VotingRuleIndexList[i];\n    }\n\n    // return the highest return type and the voting rule list\n    return (finalReturnType, trimmedList);\n  }\n\n  /**\n   * @notice Check if current operation is valid for current plugin\n   * @param bIsBeforeOperation The flag of before operation\n   * @param operation The operation idx to be checked\n   * @param pluginIndex The index of the plugin to be checked\n   * @param program The program to be checked (for checking the program-related conditions, such as program length)\n   * @return uint256  The return level of the plugin\n   * @return EnumReturnType The return type of the plugin\n   * @return uint256 The corresponding voting rule index of the plugin in current machine state (if not VOTING_NEEDED, return 0)\n   */\n  function checkPluginForOperation(bool bIsBeforeOperation, Operation memory operation, uint256 pluginIndex, Program memory program) internal view returns (uint256, EnumReturnType, uint256) {\n    // simply return the entrance check(bIsBeforeOperation, operation, pluginIndex) from the Plugin Factory\n    return pluginCheck(bIsBeforeOperation, operation, pluginIndex, program);\n  }\n} "
  },
  {
    "path": "darc-protocol/contracts/protocol/Plugin.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\n/**\n * @notice condition node types\n */\nenum EnumConditionNodeType { UNDEFINED, EXPRESSION, LOGICAL_OPERATOR, BOOLEAN_TRUE, BOOLEAN_FALSE}\n\n/**\n * @notice logical operator types\n */\nenum EnumLogicalOperatorType {UNDEFINED, AND, OR, NOT }\n\n/**\n * @notice return types of the plugin system\n * \n * ----------------------------------------------\n * \n * For the Before Operation Plugin System, the priority of the return value is:\n * NO > SANDBOX_NEEDED > YES_AND_SKIP_SANDBOX > UNDEFINED, \n * which means:\n * 1. If any operation in the program is NO (disapproved), the program is invalid and should be rejected.\n * 2. Otherwise, if any operation in the program is SANDBOX_NEEDED, the program should be executed in sandbox.\n * 3. Otherwise, if any operation in the program is YES_AND_SKIP_SANDBOX, the program should skip the sandbox \n * check and be executed in current machine state.\n * 4. Otherwise, the program is invalid and should be rejected.\n * \n * \n * ----------------------------------------------\n * \n * \n * For the After Operation Plugin System (after executed in sandbox), the priority of the return value is:\n * NO > VOTING_NEEDED > YES > UNDEFINED,\n * which means:\n * 1. If any operation in the program is NO (disapproved), the program is invalid and should be rejected.\n * 2. Otherwise, if any operation in the program is VOTING_NEEDED, a voting item should be created.\n * \n * ----------------------------------------------\n * \n * For each operation, the return type of current operation is the return type of the plugin with \n * the highest priority. For example, if operation triggers 5 before operation plugins:\n * 1. plugin X, return type: YES_AND_SKIP_SANDBOX, level 5\n * 2. plugin Y, return type: SANDBOX_NEEDED, level 4\n * 3. plugin Z, return type: NO, level 3\n * \n * Then the return type of the operation is YES_AND_SKIP_SANDBOX.\n * \n * \n * \n * ----------------------------------------------\n * \n  * For before operation plugins, here is the rule:\n  * 1. If the return type is YES_AND_SKIP_SANDBOX, then all the plugin level L%3 == 1, e.g. [1, 4, 7, 10, ...]\n  * 2. If the return type is SANDBOX_NEEDED, then all the plugin level L%3 == 2, e.g. [2, 5, 8, 11, ...]\n  * 3. If the return type is NO, then all the plugin level L%3 == 0, e.g. [3, 6, 9, 12, ...]\n  * \n  * \n  * ----------------------------------------------\n  * \n  * For after operation plugins, here is the rule:\n  * 1. If the return type is YES, then all the plugin level L%3 == 1, e.g. [1, 4, 7, 10, ...]\n  * 2. If the return type is VOTING_NEEDED, then all the plugin level L%3 == 2, e.g. [2, 5, 8, 11, ...]\n  * 3. If the return type is NO, then all the plugin level L%3 == 0, e.g. [3, 6, 9, 12, ...]\n  * \n  * ----------------------------------------------\n  * \n  * If the return type is UNDEFINED, then just throw the error and revert the transaction\n  * \n */\nenum EnumReturnType { \n\n  /**\n   * The default value. The plugin system will return UNDEFINED if no plugin is triggered.\n   * Both BEFORE and AFTER operation plugin system may return UNDEFINED.\n   */\n  UNDEFINED,   \n\n\n  /**\n   * The operation is approved but must be executed in sandbox to check if the operation\n   * is valid in the current machine state.\n   * Only BEFORE operation plugin system may return SANDBOX_NEEDED.\n   */\n  SANDBOX_NEEDED,  \n\n  /**\n   * The operation is disapproved and should be rejected at this level.\n   * Both BEFORE and AFTER operation plugin system may return NO.\n   */\n  NO, \n\n  /**\n   * The decision is pending and a voting item should be created at this level.\n   * Only AFTER operation plugin system may return VOTING_NEEDED.\n   */\n  VOTING_NEEDED, \n\n  /**\n   * The operation is approved and should skip the sandbox check.\n   * Only BEFORE operation plugin system may return YES_AND_SKIP_SANDBOX.\n   */\n  YES_AND_SKIP_SANDBOX,\n\n  /**\n   * The operation is finally approved at this level.\n   * Only AFTER operation plugin system may return YES.\n   */\n  YES \n}\n\n// /**\n//  * @notice parameter types\n//  */\n// enum EnumPluginParamType { \n//   UINT8, UINT256, ADDRESS, STRING, BYTES, UINT8_ARRAY, \n//   UINT256_ARRAY, ADDRESS_ARRAY, STRING_ARRAY, UNDEFINED }\n\n/**\n * @notice parameter struct for the condtiion expression node\n * Each expression node has a list of uint256, \n */\nstruct NodeParam {\n  string[] STRING_ARRAY;\n  uint256[][] UINT256_2DARRAY;\n  address[][] ADDRESS_2DARRAY;\n  bytes BYTES;\n}\n\n/**\n * @notice The condition node of the restriction plugin\n */\nstruct ConditionNode {\n  /**\n   * current condition node index\n   */\n  uint256 id;\n\n  /**\n   * the type of current condition node\n   */\n  EnumConditionNodeType nodeType;\n\n  /**\n   * the logic operator of the current condition node\n   */\n  EnumLogicalOperatorType logicalOperator;\n\n  /**\n   * the condition expression of the current condition node\n   */\n  uint256 conditionExpression;\n\n  /**\n   * a list of the child nodes of the current condition node\n   */\n  uint256[] childList;\n\n  /**\n   * The array of the EXPRESSION node parameters\n   */\n  NodeParam param;\n}\n\n/**\n * @notice The configuration of the voting policy\n */\nstruct VotingRule {\n\n  /**\n   * the voting token class index list\n   */\n  uint256[] votingTokenClassList;\n\n  /**\n   * the approval threshold percentage of the voting policy\n   */\n  uint256 approvalThresholdPercentage;\n\n  /**\n   * the voting duration of the voting policy in seconds\n   */\n  uint256 votingDurationInSeconds;\n\n  /**\n   * the execution pending duration of the voting policy in seconds\n   */\n  uint256 executionPendingDurationInSeconds;\n\n  /**\n   * the voting policy is enabled or not\n   */\n  bool bIsEnabled;\n\n  /**\n   * the note of the voting policy\n   */\n  string notes;\n\n  /**\n   * the voting policy is absolute majority or relative majority.\n   * For example, the total voting token supply is 1000, and each token has voting weight 10, \n   * percentage is 70%. The total voting power is 10000.\n   * \n   * If bIsAbsoluteMajority is true, then the voting policy is absolute majority,\n   * and the voting result is approved if the total voting power of the approved votes \n   * is greater than 7000;\n   * \n   * If bIsAbsoluteMajority is false, then the voting policy is relative majority,\n   * and the voting result is approved if the total voting power of the approved votes\n   * is greater than 70% * total voted power. For example, if only 3000 voting power \n   * is voted, then the voting result is approved if the total voting power of the\n   * approved votes is greater than 0.7 * 3000 = 2100.\n   * \n   * This is useful when the voting token supply is very large.\n   */\n  bool bIsAbsoluteMajority;\n}\n\n/**\n * @notice The restriction plugin of the DARC protocol\n * Each plugin is an independent restriction policy -- the law of the DARC\n * The condition node list is a list of binary expression trees nodes, \n * and the root node is the first element of the list.\n * The restriction level is from 0 to the maximum value of uint256, \n * from the lowest to the highest\n * The voting policy is the voting policy of the restriction plugin\n * The return type is the operation to be performed when this law is triggered\n */\nstruct Plugin {\n  /**\n   * the return type of the current condition node\n   */\n  EnumReturnType returnType;\n\n  /**\n   * the level of restriction, from 0 to the maximum value of uint256\n   */\n  uint256 level;\n\n  /**\n   * condition binary expression tree vector\n   */\n  ConditionNode[] conditionNodes;\n\n  /**\n   * the voting rule id of the current plugin if the return type is VOTING_NEEDED\n   */\n  uint256 votingRuleIndex;\n\n  /**\n   * the plugin note\n   */\n  string notes;\n\n  /**\n   * the boolean that indicates whether the plugin is enabled or not\n   */\n  bool bIsEnabled;\n\n  /**\n   * the boolean that indicates whether the plugin is a before operation \n   * plugin or after operation plugin\n   */\n  bool bIsBeforeOperation;\n  \n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Program.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"./Opcodes.sol\";\nimport \"./Plugin.sol\";\n\nenum MachineParameter{\n  UNDEFINED,\n  dividendPermyriadPerTransaction,\n  dividendCycleOfTransactions,\n  currentCashBalanceForDividends,\n  dividendCycleCounter\n}\n\nstruct Param{\n  // uint256[] UINT256_ARRAY;\n  // address[] ADDRESS_ARRAY;\n  string[] STRING_ARRAY;\n  bool[] BOOL_ARRAY;\n  VotingRule[] VOTING_RULE_ARRAY;\n  Plugin[] PLUGIN_ARRAY;\n  MachineParameter[] PARAMETER_ARRAY;\n  uint256[][] UINT256_2DARRAY;\n  address[][] ADDRESS_2DARRAY;\n  bytes BYTES;\n}\n\n/* \n  * @notice Operation struct is used to represent the operation of the DARC protocol.\n  Each operation contains an instruction and a list of parameters.\n  For example, the operation of minting new token is represented as:\n\n  MINT_NEW_TOKEN, \n  [tokenClassIndex (param1, UINT8), \n  amount(param2, UINT256), \n  toAddress(param3, ADDRESS)]\n\n*/\nstruct Operation {\n  address operatorAddress;\n  EnumOpcode opcode;\n  //Parameter[] parameters;\n  Param param;\n}\n\n/*\n  * @notice Program struct is used to represent the program of the DARC protocol.\n  Each program contains a program operator address and a list of operations \n  to be executed, and the program operator address is the address of \n  the contract that executes the program.\n\n  For example, the program of minting new token is represented as:\n  Program:\n  programOperatorAddress: 0x1234567890\n  operations: MIN_NEW_TOKEN, [tokenClassIndex (param1, UINT8), \n  amount(param2, UINT256), toAddress(param3, ADDRESS)]\n\n*/\n\nstruct Program {\n  address programOperatorAddress;\n\n  /**\n   * @notice operations: the array of the operations to be executed\n   */\n  Operation[] operations;\n\n  /**\n   * @notice notes: the notes of the program\n   */\n  string notes;\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Executable.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../MachineState.sol\";\nimport \"../../MachineStateManager.sol\";\nimport \"../../Plugin/PluginSystem.sol\";\nimport \"../VotingMachine/VotingMachine.sol\";\n// import openzeppelin upgradeable contracts safe math\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"./InstructionMachine.sol\";\nimport \"../../Utilities/OpcodeMap.sol\";\n\n\n/**\n * @title The executable contract of DARC\n * @author DARC Team\n * @notice \n */\ncontract Executable is MachineStateManager, PluginSystem, VotingMachine, InstructionMachine {\n\n  /**\n   * @notice Execute the program in DARC\n   */\n  function execute(Program memory currentProgram) internal {\n    // 0. Read the contract current balance,\n\n    // 1. Check if the program is valid for before operation plugins\n    EnumReturnType returnType = checkBeforeOperationPlugins(currentProgram);\n\n    // 1.1. If the program is invalid, revert the transaction\n    if (returnType == EnumReturnType.UNDEFINED) {\n      revert(\"The program is invalid\");\n    }\n\n    // 1.2 If the program is approved and sandbox is not needed, just execute and end\n    else if  (returnType == EnumReturnType.YES_AND_SKIP_SANDBOX ){\n      executeProgram_Executable(currentProgram, false);\n      return;\n    }\n\n    else if (returnType == EnumReturnType.NO) {\n      revert(\"The program is denied by the plugin system\");\n    }\n\n    else if (returnType == EnumReturnType.SANDBOX_NEEDED) {\n      // 2.1 execute the program in sandbox after cloning the current machine state to sandbox machine state\n      cloneStateToSandbox();\n      executeProgram_Executable(currentProgram, true);\n      // 2.2 check if the program can pass the after operation plugins in current machine state\n      (EnumReturnType afterReturnType, uint256[] memory afterRuleIdxList) = checkAfterOperationPlugins(currentProgram);\n      //return; // checkpoint 2 all right\n      // 2.3 If the program is invalid, revert the transaction\n      if (afterReturnType == EnumReturnType.NO) {\n        revert(\"The program is denied by the plugin system\");\n      }\n\n      // 2.4 If the program is voting needed, initialize the voting machine\n      else if (afterReturnType == EnumReturnType.VOTING_NEEDED){\n        initializeVoting(afterRuleIdxList, currentProgram);\n      }\n\n      // 2.5 If the program is approved, just execute and end\n      else if (afterReturnType == EnumReturnType.YES){\n        executeProgram_Executable(currentProgram, false);\n      }\n    }\n  }\n\n  /**\n   * @notice Check if the program is valid by checking each operation in the program with each plugin in the plugin system\n   * @return EnumReturnType the return type of the program\n   */\n  function checkBeforeOperationPlugins(Program memory currentProgram) internal view returns (EnumReturnType) {\n    (EnumReturnType result, uint256[] memory list ) = pluginSystemJudgment(true, currentProgram);\n    require(list.length == 0, \"The before operation plugin system should not return a voting rule list\");\n    require(result != EnumReturnType.VOTING_NEEDED, \"The before operation plugin system should not return vote needed\");\n    return result;\n  }\n\n  /**\n   * @notice Check if the program is valid by checking each operation in the program with each plugin in the plugin system\n   * @return EnumReturnType the return type of the program\n   * @return VotingRule[] the voting policy list\n   */\n  function checkAfterOperationPlugins(Program memory currentProgram) internal view returns (EnumReturnType, uint256[] memory) {\n    return pluginSystemJudgment(false, currentProgram);\n  }\n\n  /**\n   * @notice Execute the program in DARC\n   * @param bIsSandbox the flag of sandbox\n   * @param program the program to be executed\n   */\n  function executeProgram_Executable(Program memory program, bool bIsSandbox) internal {\n\n    // 1. add each operation to the operation log\n    updateOperationLog(bIsSandbox, program);\n    \n    // 2. go through each operation\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      // 2.1 execute the operation\n      executeOperation(program.operations[i], bIsSandbox);\n    }\n  }\n\n  /**\n   * @notice Update the user's operation log and global operation log before executing the operation\n   * @param bIsSandbox the flag of sandbox\n   * @param program the program to be executed\n   */\n  function updateOperationLog(bool bIsSandbox, Program memory program) private {\n    if (bIsSandbox) {\n      // 1. search the operation log map to see if the program operator address is in the map\n      bool bIsInOperaionLopMapAddressList = false;\n      for (uint256 index; index < sandboxMachineState.operationLogMapAddressList.length;index++) {\n        if (sandboxMachineState.operationLogMapAddressList[index] == program.programOperatorAddress) {\n          bIsInOperaionLopMapAddressList = true;\n          break;\n        }\n      }\n\n      // 2. if the program operator address is not in the map, add it to the map\n      if (!bIsInOperaionLopMapAddressList) {\n        sandboxMachineState.operationLogMapAddressList.push(program.programOperatorAddress);\n      }\n\n      // 3. traverse each operation, update the user's operation log of current operator with the latest timestamp\n      for (uint256 index; index < program.operations.length;index++) {\n        uint256 opcodeVal = OpcodeMap.opcodeVal(program.operations[index].opcode);\n        sandboxMachineState.operationLogMap[program.programOperatorAddress].latestOperationTimestamp[opcodeVal] = block.timestamp;\n      }\n      \n      // 4. traverse each operation, update the global operation log with the latest timestamp\n      for (uint256 index; index < program.operations.length;index++) {\n        uint256 opcodeVal = OpcodeMap.opcodeVal(program.operations[index].opcode);\n        sandboxMachineState.globalOperationLog.latestOperationTimestamp[opcodeVal] = block.timestamp;\n      }\n    }\n    \n    else {\n      // 1. search the operation log map to see if the program operator address is in the map\n      bool bIsInOperaionLopMapAddressList = false;\n      for (uint256 index; index < currentMachineState.operationLogMapAddressList.length;index++) {\n        if (currentMachineState.operationLogMapAddressList[index] == program.programOperatorAddress) {\n          bIsInOperaionLopMapAddressList = true;\n          break;\n        }\n      }\n\n      // 2. if the program operator address is not in the map, add it to the map\n      if (!bIsInOperaionLopMapAddressList) {\n        currentMachineState.operationLogMapAddressList.push(program.programOperatorAddress);\n      }\n\n      // 3. traverse each operation, update the user's operation log of current operator with the latest timestamp\n      for (uint256 index; index < program.operations.length;index++) {\n        uint256 opcodeVal = OpcodeMap.opcodeVal(program.operations[index].opcode);\n        currentMachineState.operationLogMap[program.programOperatorAddress].latestOperationTimestamp[opcodeVal] = block.timestamp;\n      }\n      \n      // 4. traverse each operation, update the global operation log with the latest timestamp\n      for (uint256 index; index < program.operations.length;index++) {\n        uint256 opcodeVal = OpcodeMap.opcodeVal(program.operations[index].opcode);\n        currentMachineState.globalOperationLog.latestOperationTimestamp[opcodeVal] = block.timestamp;\n      }\n    }\n\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/InstructionMachine.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../MachineState.sol\";\nimport \"../../MachineStateManager.sol\";\nimport \"../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../Plugin.sol\";\nimport \"../../Utilities/ErrorMsg.sol\";\n\n// below are the imports of the operation implementations\nimport \"./Instructions/TokenInstructions.sol\";\nimport \"./Instructions/MembershipInstructions.sol\";\nimport \"./Instructions/PluginInstructions.sol\";\nimport \"./Instructions/ParameterInstructions.sol\";\nimport \"./Instructions/MoneyInstructions.sol\";\nimport \"./Instructions/UtilityInstructions.sol\";\nimport \"./Instructions/OfferDividendsInstructions.sol\";\n\n/**\n * @title Instruction Machine, the executor of the DARC Program instructions on the DARC Machine State\n * @author DARC Team\n * @notice null\n */\n\n// inherit the instruction implementations from the above imports\ncontract InstructionMachine is \nTokenInstructions,  \nMembershipInstructions,\nPluginInstructions,\nParameterInstructions,\nMoneyInstructions,\nUtilityInstructions,\nOfferDividendsInstructions\n{\n\n  /**\n   * @notice The entrance of the instruction machine(execute each operation sequentially)\n   * @param operation The operation index to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function executeOperation (Operation memory operation, bool bIsSandbox) internal {\n    \n    // opcode id == 0, which is undefined and should not be used\n    require(operation.opcode != EnumOpcode.UNDEFINED, \"Operation type is undefined\");\n\n    // opcode id == 1\n    if (operation.opcode == EnumOpcode.BATCH_MINT_TOKENS) {\n      op_BATCH_MINT_TOKENS(operation, bIsSandbox);\n    }\n\n    // opcode id == 2\n    else if (operation.opcode == EnumOpcode.BATCH_CREATE_TOKEN_CLASSES ){\n      op_BATCH_CREATE_TOKEN_CLASSES(operation, bIsSandbox);\n    }\n\n    // opcode id == 3\n    else if (operation.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS) {\n      op_BATCH_TRANSFER_TOKENS(operation, bIsSandbox);\n    }\n\n    // opcode id == 4\n    else if (operation.opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) {\n      op_BATCH_TRANSFER_TOKENS_FROM_TO(operation, bIsSandbox);\n    }\n\n    // opcode id == 5\n    else if (operation.opcode == EnumOpcode.BATCH_BURN_TOKENS) {\n      op_BATCH_BURN_TOKENS(operation, bIsSandbox);\n    }\n\n    // opcode id == 6\n    else if (operation.opcode == EnumOpcode.BATCH_BURN_TOKENS_FROM) {\n      op_BATCH_BURN_TOKENS_FROM(operation, bIsSandbox);\n    }\n\n    // opcode id == 7\n    else if (operation.opcode == EnumOpcode.BATCH_ADD_MEMBERSHIPS) {\n      op_BATCH_ADD_MEMBERSHIPS(operation, bIsSandbox);\n    }\n\n    // opcode id == 8\n    else if (operation.opcode == EnumOpcode.BATCH_SUSPEND_MEMBERSHIPS) {\n      op_BATCH_SUSPEND_MEMBERSHIPS(operation, bIsSandbox);\n    }\n\n    // opcode id == 9\n    else if (operation.opcode == EnumOpcode.BATCH_RESUME_MEMBERSHIPS){\n      op_BATCH_RESUME_MEMBERSHIPS(operation, bIsSandbox);\n    }\n\n    // opcode id == 10\n    else if (operation.opcode == EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) {\n      op_BATCH_CHANGE_MEMBER_ROLES(operation, bIsSandbox);\n    }\n\n    // opcode id == 11\n    else if (operation.opcode == EnumOpcode.BATCH_CHANGE_MEMBER_NAMES) {\n      op_BATCH_CHANGE_MEMBER_NAMES(operation, bIsSandbox);\n    }\n\n    // opcode id == 12\n    else if (operation.opcode == EnumOpcode.BATCH_ADD_PLUGINS) {\n      op_BATCH_ADD_PLUGINS(operation, bIsSandbox);\n    }\n\n    // opcode id == 13\n    else if (operation.opcode == EnumOpcode.BATCH_ENABLE_PLUGINS) {\n      op_BATCH_ENABLE_PLUGINS(operation, bIsSandbox);\n    }\n\n    // opcode id == 14\n    else if (operation.opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) {\n      op_BATCH_DISABLE_PLUGINS(operation, bIsSandbox);\n    }\n\n    // opcode id == 15\n    else if (operation.opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS){\n      op_BATCH_ADD_AND_ENABLE_PLUGINS(operation, bIsSandbox);\n    }\n\n    // opcode id == 16\n    else if (operation.opcode == EnumOpcode.BATCH_SET_PARAMETERS) {\n      op_BATCH_SET_PARAMETERS(operation, bIsSandbox);\n    }\n\n    // opcode id == 17 \n    else if (operation.opcode == EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) {\n      op_BATCH_ADD_WITHDRAWABLE_BALANCES(operation, bIsSandbox);\n    }\n\n    // opcode id == 18\n    else if (operation.opcode == EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) {\n      op_BATCH_REDUCE_WITHDRAWABLE_BALANCES(operation, bIsSandbox);\n    }\n\n    // opcode id == 19\n    else if (operation.opcode == EnumOpcode.BATCH_ADD_VOTING_RULES) {\n      op_BATCH_ADD_VOTING_RULES(operation, bIsSandbox);\n    }\n\n    // opcode id == 20 \n    else if (operation.opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) {\n      op_BATCH_PAY_TO_MINT_TOKENS(operation, bIsSandbox);\n    }\n\n    // opcode id == 21\n    else if (operation.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) {\n      op_BATCH_PAY_TO_TRANSFER_TOKENS(operation, bIsSandbox);\n    }\n\n    // opcode id == 22\n    else if (operation.opcode == EnumOpcode.ADD_EMERGENCY) {\n      op_ADD_EMERGENCY(operation, bIsSandbox);\n    }\n\n    // opcode id == 23\n    else if (operation.opcode == EnumOpcode.RESERVED_ID_23) {\n      revert(\"Reserved opcode id 23 is not implemented.\");\n    }\n\n    // opcode id == 24 \n    else if (operation.opcode == EnumOpcode.CALL_EMERGENCY) {\n      op_CALL_EMERGENCY(operation, bIsSandbox);\n    }\n\n    // opcode id == 25\n    else if (operation.opcode == EnumOpcode.CALL_CONTRACT_ABI) {\n      op_CALL_CONTRACT_ABI(operation, bIsSandbox);\n    }\n\n    // opcode id == 26\n    else if (operation.opcode == EnumOpcode.PAY_CASH) {\n      op_PAY_CASH(operation, bIsSandbox);\n    }\n\n    // opcode id == 27\n    else if (operation.opcode == EnumOpcode.OFFER_DIVIDENDS) {\n      op_OFFER_DIVIDENDS(operation, bIsSandbox);\n    }\n\n    // opcode id == 28\n    else if (operation.opcode == EnumOpcode.RESERVED_ID_28) {\n      revert(\"Reserved opcode id 28 is not implemented.\");\n    }\n\n    // opcode id == 29\n    else if (operation.opcode == EnumOpcode.SET_APPROVAL_FOR_ALL_OPERATIONS) {\n      op_SET_APPROVAL_FOR_ALL_OPERATIONS(operation, bIsSandbox);\n    }\n\n    // opcode id == 30\n    else if (operation.opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) {\n      op_BATCH_BURN_TOKENS_AND_REFUND(operation, bIsSandbox);\n    }\n\n    // opcode id == 31\n    else if (operation.opcode == EnumOpcode.ADD_STORAGE_STRING) {\n      op_ADD_STORAGE_STRING(operation, bIsSandbox);\n    }\n\n    // opcode id == 32\n    else if (operation.opcode == EnumOpcode.VOTE) {\n      op_VOTE(operation, bIsSandbox);\n    }\n\n    // opcode id == 33\n    else if (operation.opcode == EnumOpcode.EXECUTE_PENDING_PROGRAM) {\n      op_EXECUTE_PENDING_PROGRAM(operation, bIsSandbox);\n    }\n\n    // opcode id == 34\n    else if (operation.opcode == EnumOpcode.END_EMERGENCY) {\n      op_END_EMERGENCY(operation, bIsSandbox);\n    }\n    \n    // opcode id == 35\n    else if (operation.opcode == EnumOpcode.UPGRADE_TO_ADDRESS) {\n      op_UPGRADE_TO_ADDRESS(operation, bIsSandbox);\n    }\n\n    // opcode id == 36\n    else if (operation.opcode == EnumOpcode.CONFIRM_UPGRAED_FROM_ADDRESS) {\n      op_CONFIRM_UPGRAED_FROM_ADDRESS(operation, bIsSandbox);\n    }\n\n    // opcode id == 37\n    else if (operation.opcode == EnumOpcode.UPGRADE_TO_THE_LATEST) {\n      op_UPGRADE_TO_THE_LATEST(operation, bIsSandbox);\n    }\n    \n    // opcode id == 38\n    else if (operation.opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) {\n      op_BATCH_PAY_TO_TRANSFER_TOKENS(operation, bIsSandbox);\n    }\n    \n    else {\n      revert(\"Invalid operation type\");\n    }\n  }\n\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/MembershipInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\n\n/**\n * @title Implementation of membership related operation\n * @author DARC Team\n * @notice null\n */\n\ncontract MembershipInstructions is MachineStateManager {\n\n  /**\n   * @notice The function that executes the BATCH_ADD_MEMBERSHIPS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_ADD_MEMBERSHIPS(Operation memory operation, bool bIsSandbox) internal {\n    // param 1 is the address of the members \n    // param 2 is the member role numbers\n    // param 3 is the member role name strings\n    address[] memory members = operation.param.ADDRESS_2DARRAY[0];\n    uint256[] memory memberRoleNumbers = operation.param.UINT256_2DARRAY[0];\n    string[] memory memberRoleNames = operation.param.STRING_ARRAY;\n\n    // check if the number of members is the same as the number of member role numbers\n    require(members.length == memberRoleNumbers.length, ErrorMsg.By(1));\n    \n    // make sure that these members are not already in the membership list\n    for (uint256 i=0;i<members.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsInitialized == false, ErrorMsg.By(5));\n        sandboxMachineState.memberInfoMap[members[i]] = MemberInfo(\n          true,  // initialized\n          false,  // not suspended\n          memberRoleNames[i],  // role name string\n          memberRoleNumbers[i]  // role level number\n        );\n        sandboxMachineState.memberList.push(members[i]);\n        \n      } else {\n        require(currentMachineState.memberInfoMap[members[i]].bIsInitialized == false, ErrorMsg.By(5));\n        currentMachineState.memberInfoMap[members[i]] = MemberInfo(\n          true,  // initialized\n          false,  // not suspended\n          memberRoleNames[i],  // role name string\n          memberRoleNumbers[i]  // role level number\n        );\n        currentMachineState.memberList.push(members[i]);\n      }\n    }\n  }\n  /**\n   * @notice The function that executes the BATCH_SUSPEND_MEMBERSHIPS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_SUSPEND_MEMBERSHIPS(Operation memory operation, bool bIsSandbox) internal {\n    // param 1 is the address of the members\n    address[] memory members = operation.param.ADDRESS_2DARRAY[0];\n    for (uint256 i=0;i<members.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsSuspended == false, ErrorMsg.By(6));\n        sandboxMachineState.memberInfoMap[members[i]].bIsSuspended = true;\n      } else {\n        require(currentMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        require(currentMachineState.memberInfoMap[members[i]].bIsSuspended == false, ErrorMsg.By(6));\n        currentMachineState.memberInfoMap[members[i]].bIsSuspended = true;\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_RESUME_MEMBERSHIPS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_RESUME_MEMBERSHIPS(Operation memory operation, bool bIsSandbox) internal {\n    // param 1 is the address of the members\n    address[] memory members = operation.param.ADDRESS_2DARRAY[0];\n    for (uint256 i=0;i<members.length;i++) {\n      if (bIsSandbox) {\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsSuspended == true, ErrorMsg.By(8));\n        sandboxMachineState.memberInfoMap[members[i]].bIsSuspended = false;\n      } else {\n        require(currentMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        require(currentMachineState.memberInfoMap[members[i]].bIsSuspended == true, ErrorMsg.By(8));\n        currentMachineState.memberInfoMap[members[i]].bIsSuspended = false;\n      }\n    }\n  }\n\n\n\n  /**\n   * @notice The function that executes the BATCH_CHANGE_MEMBER_ROLES operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_CHANGE_MEMBER_ROLES(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of member addresses\n    address[] memory members = operation.param.ADDRESS_2DARRAY[0];\n    // parameter 2 is the array of member role numbers\n    uint256[] memory memberRoleNumbers = operation.param.UINT256_2DARRAY[0];\n    require (members.length == memberRoleNumbers.length, ErrorMsg.By(1));\n    for (uint256 i=0;i<members.length;i++) {\n      if (bIsSandbox) {\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        sandboxMachineState.memberInfoMap[members[i]].role = memberRoleNumbers[i];\n      } else {\n        require(currentMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        currentMachineState.memberInfoMap[members[i]].role = memberRoleNumbers[i];\n      }\n    }\n  }\n  /**\n   * @notice The function that executes the BATCH_CHANGE_MEMBER_NAMES operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_CHANGE_MEMBER_NAMES(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of member addresses\n    address[] memory members = operation.param.ADDRESS_2DARRAY[0];\n    // parameter 2 is the array of member role names\n    string[] memory memberRoleNames = operation.param.STRING_ARRAY;\n\n    require (members.length == memberRoleNames.length, ErrorMsg.By(1));\n    for (uint256 i=0;i<members.length;i++) {\n      if (bIsSandbox) {\n        require(sandboxMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        sandboxMachineState.memberInfoMap[members[i]].name = memberRoleNames[i];\n      } else {\n        require(currentMachineState.memberInfoMap[members[i]].bIsInitialized == true, ErrorMsg.By(7));\n        currentMachineState.memberInfoMap[members[i]].name = memberRoleNames[i];\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/MoneyInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\nimport \"../../../Utilities/ArrayUtils.sol\";\n/**\n * @title All instructions about dividend, withdraw cash, payment, etc.\n * @author \n * @notice \n */\ncontract MoneyInstructions is MachineStateManager {\n\n  /**\n   * @notice Add withdrawable balances to the DARC\n   * @param operation the operation to be executed\n   * @param bIsSandbox the boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_BATCH_ADD_WITHDRAWABLE_BALANCES(Operation memory operation, bool bIsSandbox) internal {\n    /**\n     * @notice Batch Add Withdrawable Balance Operation\n     * @param address[] addressArray: the array of the address to add withdrawable balance\n     * @param uint256[] amountArray: the array of the amount to add withdrawable balance\n     * ID:17\n     */\n    address[] memory addressArray = operation.param.ADDRESS_2DARRAY[0];\n    uint256[] memory amountArray = operation.param.UINT256_2DARRAY[0];\n    require(addressArray.length == amountArray.length, \"Invalid number of parameters\");\n    if (bIsSandbox) {\n      // update the withdrawable cash map\n      for (uint256 i = 0; i < addressArray.length; i++) {\n        bool bIsValid = false;\n        uint256 result = 0;\n        (bIsValid, result) =\n        SafeMathUpgradeable.tryAdd(\n          sandboxMachineState.withdrawableCashMap[addressArray[i]], amountArray[i]);\n        require(bIsValid, ErrorMsg.By(17));\n        sandboxMachineState.withdrawableCashMap[addressArray[i]] = result;\n      }\n\n      // add the addresss to the withdrawable cash address list if it is not in the list\n      // 1. copy the withdrawable cash address list to a new list\n\n      // remove the duplicated address in the target address array addressArray\n      address[] memory uniqueAddressArray = ArrayUtils.removeDuplicateAddressFromArray(addressArray);\n\n      address[] memory newWithdrawableCashOwnerList = new address[](\n        sandboxMachineState.withdrawableCashOwnerList.length + uniqueAddressArray.length);\n      uint256 pt = 0;\n      for (uint256 i = 0; i < sandboxMachineState.withdrawableCashOwnerList.length; i++) {\n        newWithdrawableCashOwnerList[pt] = sandboxMachineState.withdrawableCashOwnerList[i];\n        pt++;\n      }\n\n      // 2. add the new unique address to the new list, if and only if the address is not in the list\n      for (uint256 i = 0; i < uniqueAddressArray.length; i++) {\n        bool bIsInList = false;\n        for (uint256 j = 0; j < sandboxMachineState.withdrawableCashOwnerList.length; j++) {\n          if (sandboxMachineState.withdrawableCashOwnerList[j] == uniqueAddressArray[i]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) {\n          newWithdrawableCashOwnerList[pt] = uniqueAddressArray[i];\n          pt++;\n        }\n      }\n\n      // 3. copy the new list to the withdrawable cash address list\n      sandboxMachineState.withdrawableCashOwnerList = new address[](pt);\n      for (uint256 i = 0; i < pt; i++) {\n        sandboxMachineState.withdrawableCashOwnerList[i] = newWithdrawableCashOwnerList[i];\n      }\n    } else {\n      // update the withdrawable cash map\n      for (uint256 i = 0; i < addressArray.length; i++) {\n        bool bIsValid = false;\n        (bIsValid, currentMachineState.withdrawableCashMap[addressArray[i]]) =\n        SafeMathUpgradeable.tryAdd(\n          currentMachineState.withdrawableCashMap[addressArray[i]], amountArray[i]);\n        require(bIsValid, ErrorMsg.By(17));\n      }\n\n      // add the addresss to the withdrawable cash address list if it is not in the list\n      // 1. copy the withdrawable cash address list to a new list\n\n      // remove the duplicated address in the target address array addressArray\n      address[] memory uniqueAddressArray = ArrayUtils.removeDuplicateAddressFromArray(addressArray);\n\n      address[] memory newWithdrawableCashOwnerList = new address[](\n        currentMachineState.withdrawableCashOwnerList.length + uniqueAddressArray.length);\n      uint256 pt = 0;\n      for (uint256 i = 0; i < currentMachineState.withdrawableCashOwnerList.length; i++) {\n        newWithdrawableCashOwnerList[pt] = currentMachineState.withdrawableCashOwnerList[i];\n        pt++;\n      }\n\n      // 2. add the new unique address to the new list, if and only if the address is not in the list\n      for (uint256 i = 0; i < uniqueAddressArray.length; i++) {\n        bool bIsInList = false;\n        for (uint256 j = 0; j < currentMachineState.withdrawableCashOwnerList.length; j++) {\n          if (currentMachineState.withdrawableCashOwnerList[j] == uniqueAddressArray[i]) {\n            bIsInList = true;\n            break;\n          }\n        }\n        if (!bIsInList) {\n          newWithdrawableCashOwnerList[pt] = uniqueAddressArray[i];\n          pt++;\n        }\n      }\n\n      // 3. copy the new list to the withdrawable cash address list\n      currentMachineState.withdrawableCashOwnerList = new address[](pt);\n      for (uint256 i = 0; i < pt; i++) {\n        currentMachineState.withdrawableCashOwnerList[i] = newWithdrawableCashOwnerList[i];\n      }\n    }\n  }\n\n  /**\n   * @notice Reduce withdrawable balances from the DARC\n   * @param operation The operation to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_BATCH_REDUCE_WITHDRAWABLE_BALANCES(Operation memory operation, bool bIsSandbox) internal {\n      /**\n       * @notice Batch Reduce Withdrawable Balance Operation\n       * @param ADDRESS_2DARRAY[0] addressArray: the array of the address to substract withdrawable balance\n       * @param UINT256_2DARRAY[0] amountArray: the array of the amount to substract withdrawable balance\n       * ID:18\n       */\n\n      address[] memory addressArray = operation.param.ADDRESS_2DARRAY[0];\n      uint256[] memory amountArray = operation.param.UINT256_2DARRAY[0];\n      require(addressArray.length == amountArray.length, \"Invalid number of parameters\");\n      if (bIsSandbox) {\n        for (uint256 i = 0; i < addressArray.length; i++) {\n          bool bIsValid = false;\n          uint256 result = 0;\n          (bIsValid, result) =\n          SafeMathUpgradeable.trySub(\n            sandboxMachineState.withdrawableCashMap[addressArray[i]], amountArray[i]);\n          require(bIsValid, ErrorMsg.By(17));\n          sandboxMachineState.withdrawableCashMap[addressArray[i]] = result;\n        }\n\n        // remove the addresss from the withdrawable cash address list if the balance is zero\n        // 1. find all unique addresses in the addressArray\n        address[] memory uniqueAddressArray = ArrayUtils.removeDuplicateAddressFromArray(addressArray);\n\n        // 2. create a new list to store the addresses whose balance is not zero\n        address[] memory newWithdrawableCashOwnerList = new address[](\n          sandboxMachineState.withdrawableCashOwnerList.length);\n        uint256 pt = 0;\n\n        // 3. traverse the unique address array, if the balance of the address is zero, then remove it from the list\n        for (uint256 index = 0; index < sandboxMachineState.withdrawableCashOwnerList.length; index++) {\n          bool bIsInList = false;\n          for (uint256 j = 0; j < uniqueAddressArray.length; j++) {\n            if (sandboxMachineState.withdrawableCashOwnerList[index] == uniqueAddressArray[j]) {\n              bIsInList = true;\n              break;\n            }\n          }\n          if (bIsInList && sandboxMachineState.withdrawableCashMap[sandboxMachineState.withdrawableCashOwnerList[index]] == 0) {\n            // if the address is in the unique address array and the balance is zero, then remove it from the list\n            continue;\n          }\n          else {\n            // if the address is not in the unique address array or the balance is not zero, then add it to the list\n            newWithdrawableCashOwnerList[pt] = sandboxMachineState.withdrawableCashOwnerList[index];\n            pt++;\n          }\n        }\n\n        // 4. copy the new list to the withdrawable cash address list\n        sandboxMachineState.withdrawableCashOwnerList = new address[](pt);\n        for (uint256 i = 0; i < pt; i++) {\n          sandboxMachineState.withdrawableCashOwnerList[i] = newWithdrawableCashOwnerList[i];\n        }\n\n      } \n      else {\n        for (uint256 i = 0; i < addressArray.length; i++) {\n          bool bIsValid = false;\n          (bIsValid, currentMachineState.withdrawableCashMap[addressArray[i]]) =\n          SafeMathUpgradeable.trySub(\n            currentMachineState.withdrawableCashMap[addressArray[i]], amountArray[i]);\n          require(bIsValid, ErrorMsg.By(17));\n        }\n\n        // remove the addresss from the withdrawable cash address list if the balance is zero\n        // 1. find all unique addresses in the addressArray\n        address[] memory uniqueAddressArray = ArrayUtils.removeDuplicateAddressFromArray(addressArray);\n\n        // 2. create a new list to store the addresses whose balance is not zero\n        address[] memory newWithdrawableCashOwnerList = new address[](\n          currentMachineState.withdrawableCashOwnerList.length);\n        uint256 pt = 0;\n\n        // 3. traverse the unique address array, if the balance of the address is zero, then remove it from the list\n        for (uint256 index = 0; index < currentMachineState.withdrawableCashOwnerList.length; index++) {\n          bool bIsInList = false;\n          for (uint256 j = 0; j < uniqueAddressArray.length; j++) {\n            if (currentMachineState.withdrawableCashOwnerList[index] == uniqueAddressArray[j]) {\n              bIsInList = true;\n              break;\n            }\n          }\n          if (bIsInList && currentMachineState.withdrawableCashMap[currentMachineState.withdrawableCashOwnerList[index]] == 0) {\n            // if the address is in the unique address array and the balance is zero, then remove it from the list\n            continue;\n          }\n          else {\n            // if the address is not in the unique address array or the balance is not zero, then add it to the list\n            newWithdrawableCashOwnerList[pt] = currentMachineState.withdrawableCashOwnerList[index];\n            pt++;\n          }\n        }\n\n        // 4. copy the new list to the withdrawable cash address list\n        currentMachineState.withdrawableCashOwnerList = new address[](pt);\n        for (uint256 i = 0; i < pt; i++) {\n          currentMachineState.withdrawableCashOwnerList[i] = newWithdrawableCashOwnerList[i];\n        }\n      }\n  }\n\n  /**\n   * @notice Pay cash to the DARC\n   * @param operation the operation to be executed\n   * @param bIsSandbox the boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_PAY_CASH(Operation memory operation, bool bIsSandbox) internal {\n    /**\n    * @param uint256 amount: the amount of cash to pay\n    * @param uint256 paymentType: the type of cash to pay, 0 for ethers/matic/native tokens\n    *  1 for USDT, 2 for USDC (right now only 0 is supported)\n    * @param uint256 dividendable: the flag to indicate if the payment is dividendable for token holders, \n    * 0 for no (investment), 1 for yes (purchase for product/service)\n    */\n\n    uint256[] memory params = operation.param.UINT256_2DARRAY[0];\n    require(params.length == 3, \"Invalid number of parameters\");\n    uint256 amount = params[0];\n    uint256 paymentType = params[1];\n    uint256 dividendable = params[2];\n\n    // right now only support paymentType = 0\n    require(paymentType == 0, \"Invalid payment type\");\n\n    bool bIsValid = true;\n    if (dividendable == 1) {\n      // if the payment is dividendable, then the payment is for purchase\n      // we need to add the amount to the dividendable pool\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.machineStateParameters.currentCashBalanceForDividends) = \n        SafeMathUpgradeable.tryAdd(\n          sandboxMachineState.machineStateParameters.currentCashBalanceForDividends, amount);\n\n        require(bIsValid, ErrorMsg.By(10));\n\n        (bIsValid, sandboxMachineState.machineStateParameters.dividendCycleCounter) =\n        SafeMathUpgradeable.tryAdd(\n          sandboxMachineState.machineStateParameters.dividendCycleCounter, 1);\n        require(bIsValid, ErrorMsg.By(11));\n      }\n      else {\n        (bIsValid, currentMachineState.machineStateParameters.currentCashBalanceForDividends) = \n        SafeMathUpgradeable.tryAdd(\n          currentMachineState.machineStateParameters.currentCashBalanceForDividends, amount);\n\n        require(bIsValid, ErrorMsg.By(12));\n\n        (bIsValid, currentMachineState.machineStateParameters.dividendCycleCounter) =\n        SafeMathUpgradeable.tryAdd(\n          currentMachineState.machineStateParameters.dividendCycleCounter, 1);\n        require(bIsValid, ErrorMsg.By(13));\n      }\n    }\n    else {\n      // pass for now\n    }\n  }\n\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/OfferDividendsInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\n\ncontract OfferDividendsInstructions is MachineStateManager {\n\n    /**\n   * @notice Offer dividends to the DARC\n   * @param operation The operation to be executed (which is not used at this moment)\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_OFFER_DIVIDENDS(Operation memory operation, bool bIsSandbox) internal {\n    if (bIsSandbox) {\n      // make sure that the dividend per myriad per transaction is less than 10000\n      require(sandboxMachineState.machineStateParameters.dividendPermyriadPerTransaction < 10000, \n        ErrorMsg.By(15));\n\n      // make sure that cycle counter is less than the threashold\n      require(sandboxMachineState.machineStateParameters.dividendCycleCounter >= \n        sandboxMachineState.machineStateParameters.dividendCycleOfTransactions, ErrorMsg.By(16));\n\n      // 1. calculate the total amount of dividends to be offered\n      bool bIsValid = true;\n      uint256 totalDividends = 0;\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryMul(\n        sandboxMachineState.machineStateParameters.currentCashBalanceForDividends,\n        sandboxMachineState.machineStateParameters.dividendPermyriadPerTransaction);\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryDiv(\n      totalDividends,\n      10000);\n      require (bIsValid, ErrorMsg.By(12));\n\n\n\n      // 2. calculate the total dividends weight of all dividendable tokens\n      uint256 totalDividendsWeight = 0;\n      uint256 ithTotalWeights = 0;\n      for (uint256 index=0; index < sandboxMachineState.tokenList.length; index++) {\n        ithTotalWeights = 0;\n        if (sandboxMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n        (bIsValid, ithTotalWeights) = SafeMathUpgradeable.tryMul(\n          sumDividendWeightForTokenClass(bIsSandbox, index),\n          sandboxMachineState.tokenList[index].dividendWeight);\n        require(bIsValid, ErrorMsg.By(12));\n\n        (bIsValid, totalDividendsWeight) = SafeMathUpgradeable.tryAdd(\n          totalDividendsWeight,\n          ithTotalWeights);\n        require(bIsValid, ErrorMsg.By(12));\n      }\n\n      // 3. calculate the cash dividend per unit\n      uint256 cashPerUnit = currentDividendPerUnit(bIsSandbox);\n\n      // 4. calculate the cash dividend per unit for each token, add dividends to \n      // each address withdrawable balance\n\n      address[] memory newTokenOwners = new address[](dividendBufferSize);\n      uint256 pt = 0;\n      uint256 dividends = 0;\n      for (uint256 index=0; index<sandboxMachineState.tokenList.length; index++) {\n        if (sandboxMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n\n        if (sandboxMachineState.tokenList[index].dividendWeight == 0) {\n          continue;\n        }\n\n        // go through each level of tokens\n        for (uint256 tokenOwnerId =0; tokenOwnerId < sandboxMachineState.tokenList[index].ownerList.length; tokenOwnerId++){\n          // get total amount of current level of tokens by current token owner\n          // and get the total dividends\n          address owner = sandboxMachineState.tokenList[index].ownerList[tokenOwnerId];\n\n\n          (bIsValid, dividends) = SafeMathUpgradeable.tryMul(\n            sandboxMachineState.tokenList[index].tokenBalance[owner],\n            cashPerUnit);\n          require(bIsValid, ErrorMsg.By(12));\n\n          (bIsValid, dividends) = SafeMathUpgradeable.tryMul(\n            dividends,\n            sandboxMachineState.tokenList[index].dividendWeight\n          );\n          require(bIsValid, ErrorMsg.By(12));\n\n          // add the dividends to the withdrawable balance of the address\n          (bIsValid, sandboxMachineState.withdrawableDividendMap[owner]) = SafeMathUpgradeable.tryAdd(\n            sandboxMachineState.withdrawableDividendMap[owner],\n            dividends);\n\n          require(bIsValid, ErrorMsg.By(12));\n\n\n          // add to the withdrawableDividendOwnerList\n          newTokenOwners[pt] = owner;\n          pt++;\n        }\n      }\n\n      uint256 newTokenOwnersSize = pt;\n      // 5. copy all members from newTokenOwners to withdrawableDividendOwnerList\n      // but make sure that there is no duplicate. If there is duplicate, then\n      // just skip it and continue\n      address[] memory uniqueNewTokenOwners = new address[](newTokenOwnersSize);\n      uint256 uniqueNewTokenOwnersIndex = 0;\n\n      // go through each element in newTokenOwners\n      for (uint256 index=0; index<newTokenOwnersSize; index++) {\n        bool bIsDuplicate = false;\n\n        // go through each existing element in uniqueNewTokenOwners\n        // if there is a duplicate, then skip it\n        for (uint256 j=0; j<uniqueNewTokenOwnersIndex; j++) {\n          if (newTokenOwners[index] == uniqueNewTokenOwners[j]) {\n            bIsDuplicate = true;\n            break;\n          }\n        }\n\n        if (bIsDuplicate == false) {\n          uniqueNewTokenOwners[uniqueNewTokenOwnersIndex] = newTokenOwners[index];\n          uniqueNewTokenOwnersIndex++;\n        }\n      }\n\n\n      // 6. update the withdrawableDividendOwnerList, merge the unique elements\n      address[] memory finalDividendsList = new address[](uniqueNewTokenOwnersIndex + sandboxMachineState.withdrawableDividendOwnerList.length);\n      uint256 finalDividendsListIndex = 0;\n\n      // add the existing elements in withdrawableDividendOwnerList\n      for (uint256 index=0; index<sandboxMachineState.withdrawableDividendOwnerList.length; index++) {\n        finalDividendsList[finalDividendsListIndex] = sandboxMachineState.withdrawableDividendOwnerList[index];\n        finalDividendsListIndex++;\n      }\n\n      // add the unique elements from uniqueNewTokenOwners to finalDividendsList\n      // but make sure that there is no duplicate. If there is duplicate, then\n      // just skip it and continue\n      for (uint256 index=0; index<uniqueNewTokenOwnersIndex; index++) {\n        bool bIsDuplicate = false;\n\n        // go through each existing element in finalDividendsList\n        // if there is a duplicate, then skip it\n        for (uint256 j=0; j<finalDividendsListIndex; j++) {\n          if (uniqueNewTokenOwners[index] == finalDividendsList[j]) {\n            bIsDuplicate = true;\n            break;\n          }\n        }\n\n        if (bIsDuplicate == false) {\n          finalDividendsList[finalDividendsListIndex] = uniqueNewTokenOwners[index];\n          finalDividendsListIndex++;\n        }\n      }\n\n      // 7. update the withdrawableDividendOwnerList\n      sandboxMachineState.withdrawableDividendOwnerList = finalDividendsList;\n\n      // 8. reset the total cash balance for dividends and dividends counter\n      sandboxMachineState.machineStateParameters.currentCashBalanceForDividends = 0;\n      sandboxMachineState.machineStateParameters.dividendCycleCounter = 0;\n    }\n    else {\n      // make sure that the dividend per myriad per transaction is less than 10000\n      require(currentMachineState.machineStateParameters.dividendPermyriadPerTransaction < 10000, \n        ErrorMsg.By(15));\n\n      // make sure that cycle counter is less than the threashold\n      require(currentMachineState.machineStateParameters.dividendCycleCounter >= \n        currentMachineState.machineStateParameters.dividendCycleOfTransactions, ErrorMsg.By(16));\n\n      // 1. calculate the total amount of dividends to be offered\n      bool bIsValid = true;\n      uint256 totalDividends = 0;\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryMul(\n        currentMachineState.machineStateParameters.currentCashBalanceForDividends,\n        currentMachineState.machineStateParameters.dividendPermyriadPerTransaction);\n\n      (bIsValid, totalDividends) = SafeMathUpgradeable.tryDiv(\n      totalDividends,\n      10000);\n      require (bIsValid, ErrorMsg.By(12));\n\n\n\n      // 2. calculate the total dividends weight of all dividendable tokens\n      uint256 totalDividendsWeight = 0;\n      uint256 ithTotalWeights = 0;\n      for (uint256 index=0; index < currentMachineState.tokenList.length; index++) {\n        ithTotalWeights = 0;\n        if (currentMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n        (bIsValid, ithTotalWeights) = SafeMathUpgradeable.tryMul(\n          sumDividendWeightForTokenClass(bIsSandbox, index),\n          currentMachineState.tokenList[index].dividendWeight);\n        require(bIsValid, ErrorMsg.By(12));\n\n        (bIsValid, totalDividendsWeight) = SafeMathUpgradeable.tryAdd(\n          totalDividendsWeight,\n          ithTotalWeights);\n        require(bIsValid, ErrorMsg.By(12));\n      }\n\n      // 3. calculate the cash dividend per unit\n      uint256 cashPerUnit = currentDividendPerUnit(bIsSandbox);\n\n      // 4. calculate the cash dividend per unit for each token, add dividends to \n      // each address withdrawable balance\n\n      address[] memory newTokenOwners = new address[](dividendBufferSize);\n      uint256 pt = 0;\n      uint256 dividends = 0;\n      for (uint256 index=0; index<currentMachineState.tokenList.length; index++) {\n        if (currentMachineState.tokenList[index].bIsInitialized == false) {\n          break;\n        }\n\n        if (currentMachineState.tokenList[index].dividendWeight == 0) {\n          continue;\n        }\n\n        // go through each level of tokens\n        for (uint256 tokenOwnerId =0; tokenOwnerId < currentMachineState.tokenList[index].ownerList.length; tokenOwnerId++){\n          // get total amount of current level of tokens by current token owner\n          // and get the total dividends\n          address owner = currentMachineState.tokenList[index].ownerList[tokenOwnerId];\n\n\n          (bIsValid, dividends) = SafeMathUpgradeable.tryMul(\n            currentMachineState.tokenList[index].tokenBalance[owner],\n            cashPerUnit);\n          require(bIsValid, ErrorMsg.By(12));\n\n          (bIsValid, dividends) = SafeMathUpgradeable.tryMul(\n            dividends,\n            currentMachineState.tokenList[index].dividendWeight\n          );\n          require(bIsValid, ErrorMsg.By(12));\n\n          // add the dividends to the withdrawable balance of the address\n          (bIsValid, currentMachineState.withdrawableDividendMap[owner]) = SafeMathUpgradeable.tryAdd(\n            currentMachineState.withdrawableDividendMap[owner],\n            dividends);\n\n          require(bIsValid, ErrorMsg.By(12));\n\n\n          // add to the withdrawableDividendOwnerList\n          newTokenOwners[pt] = owner;\n          pt++;\n        }\n      }\n\n      uint256 newTokenOwnersSize = pt;\n      // 5. copy all members from newTokenOwners to withdrawableDividendOwnerList\n      // but make sure that there is no duplicate. If there is duplicate, then\n      // just skip it and continue\n      address[] memory uniqueNewTokenOwners = new address[](newTokenOwnersSize);\n      uint256 uniqueNewTokenOwnersIndex = 0;\n\n      // go through each element in newTokenOwners\n      for (uint256 index=0; index<newTokenOwnersSize; index++) {\n        bool bIsDuplicate = false;\n\n        // go through each existing element in uniqueNewTokenOwners\n        // if there is a duplicate, then skip it\n        for (uint256 j=0; j<uniqueNewTokenOwnersIndex; j++) {\n          if (newTokenOwners[index] == uniqueNewTokenOwners[j]) {\n            bIsDuplicate = true;\n            break;\n          }\n        }\n\n        if (bIsDuplicate == false) {\n          uniqueNewTokenOwners[uniqueNewTokenOwnersIndex] = newTokenOwners[index];\n          uniqueNewTokenOwnersIndex++;\n        }\n      }\n\n\n      // 6. update the withdrawableDividendOwnerList, merge the unique elements\n      address[] memory finalDividendsList = new address[](uniqueNewTokenOwnersIndex + currentMachineState.withdrawableDividendOwnerList.length);\n      uint256 finalDividendsListIndex = 0;\n\n      // add the existing elements in withdrawableDividendOwnerList\n      for (uint256 index=0; index<currentMachineState.withdrawableDividendOwnerList.length; index++) {\n        finalDividendsList[finalDividendsListIndex] = currentMachineState.withdrawableDividendOwnerList[index];\n        finalDividendsListIndex++;\n      }\n\n      // add the unique elements from uniqueNewTokenOwners to finalDividendsList\n      // but make sure that there is no duplicate. If there is duplicate, then\n      // just skip it and continue\n      for (uint256 index=0; index<uniqueNewTokenOwnersIndex; index++) {\n        bool bIsDuplicate = false;\n\n        // go through each existing element in finalDividendsList\n        // if there is a duplicate, then skip it\n        for (uint256 j=0; j<finalDividendsListIndex; j++) {\n          if (uniqueNewTokenOwners[index] == finalDividendsList[j]) {\n            bIsDuplicate = true;\n            break;\n          }\n        }\n\n        if (bIsDuplicate == false) {\n          finalDividendsList[finalDividendsListIndex] = uniqueNewTokenOwners[index];\n          finalDividendsListIndex++;\n        }\n      }\n\n      // 7. update the withdrawableDividendOwnerList\n      currentMachineState.withdrawableDividendOwnerList = finalDividendsList;\n\n      // 8. reset the total cash balance for dividends and dividends counter\n      currentMachineState.machineStateParameters.currentCashBalanceForDividends = 0;\n      currentMachineState.machineStateParameters.dividendCycleCounter = 0;\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/ParameterInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\n\n/**\n * @title Implementation of the single instruction \"BATCH_SET_PARAMETERS\"\n * @author DARC Team\n * @notice null\n */\n \ncontract ParameterInstructions is MachineStateManager {\n  /**\n   * @notice The implementation of the single instruction \"BATCH_SET_PARAMETERS\"\n   * @param operation The operation index to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_BATCH_SET_PARAMETERS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the Machine Parameter Array\n    MachineParameter[] memory params = operation.param.PARAMETER_ARRAY;\n    // parameter 2 is the uint256 array of the parameter UINT256_2DARRAY\n    uint256[] memory paramUint256Array = operation.param.UINT256_2DARRAY[0];\n\n    require(params.length == paramUint256Array.length, ErrorMsg.By(1));\n\n    for (uint256 i=0;i<params.length;i++){\n      if (bIsSandbox) {\n        setParam(params[i], paramUint256Array[i], true);\n      } else {\n        setParam(params[i], paramUint256Array[i], false);\n      }\n    }\n  }\n\n  /**\n   * @notice The setter of machine state parameters\n   * @param param the machine parameter\n   * @param value the value of the machine parameter\n   * @param bIsSandbox the flag to indicate if the operation is executed in sandbox \n   */\n  function setParam(MachineParameter param, uint256 value, bool bIsSandbox) internal {\n    require(param != MachineParameter.UNDEFINED, ErrorMsg.By(9));\n    if (bIsSandbox) {\n      if (param == MachineParameter.dividendPermyriadPerTransaction) {\n        require(value <= 10000, ErrorMsg.By(9));\n        sandboxMachineState.machineStateParameters.dividendPermyriadPerTransaction = value;\n      }\n      else if (param == MachineParameter.dividendCycleOfTransactions) {\n        sandboxMachineState.machineStateParameters.dividendCycleOfTransactions = value;\n      }\n      else if (param == MachineParameter.currentCashBalanceForDividends) {\n        sandboxMachineState.machineStateParameters.currentCashBalanceForDividends = value;\n      }\n      else if (param == MachineParameter.dividendCycleCounter) {\n        sandboxMachineState.machineStateParameters.dividendCycleCounter = value;\n      }\n    } else {\n      if (param == MachineParameter.dividendPermyriadPerTransaction) {\n        require(value <= 10000, ErrorMsg.By(9));\n        currentMachineState.machineStateParameters.dividendPermyriadPerTransaction = value;\n      }\n      else if (param == MachineParameter.dividendCycleOfTransactions) {\n        currentMachineState.machineStateParameters.dividendCycleOfTransactions = value;\n      }\n      else if (param == MachineParameter.currentCashBalanceForDividends) {\n        currentMachineState.machineStateParameters.currentCashBalanceForDividends = value;\n      }\n      else if (param == MachineParameter.dividendCycleCounter) {\n        currentMachineState.machineStateParameters.dividendCycleCounter = value;\n      }\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/PluginInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\nimport \"@openzeppelin/contracts/utils/Strings.sol\";\n\n/**\n * @title Implementation of BATCH_ADD_AND_ENABLE_PLUGINS operation\n * @author DARC Team\n * @notice null\n */\n\ncontract PluginInstructions is MachineStateManager{\n\n  /**\n   * This is a helper function that helps checking if all the plugins are on the right level\n   * based on the return type.\n   * Check the \"/Plugin.sol\" for the definition of \"level\" and \"return type\"\n   * \n   * ----------------------------------------------\n   * \n   * \n   * For before operation plugins, here is the rule:\n   * 1. If the return type is YES_AND_SKIP_SANDBOX, then all the plugin level L%3 == 1, e.g. [1, 4, 7, 10, ...]\n   * 2. If the return type is SANDBOX_NEEDED, then all the plugin level L%3 == 2, e.g. [2, 5, 8, 11, ...]\n   * 3. If the return type is NO, then all the plugin level L%3 == 0, e.g. [3, 6, 9, 12, ...]\n   * \n   * \n   * ----------------------------------------------\n   * \n   * For after operation plugins, here is the rule:\n   * 1. If the return type is YES, then all the plugin level L%3 == 1, e.g. [1, 4, 7, 10, ...]\n   * 2. If the return type is VOTING_NEEDED, then all the plugin level L%3 == 2, e.g. [2, 5, 8, 11, ...]\n   * 3. If the return type is NO, then all the plugin level L%3 == 0, e.g. [3, 6, 9, 12, ...]\n   * \n   * ----------------------------------------------\n   * \n   * If the return type is UNDEFINED, then just throw the error and revert the transaction\n   * \n   * @param pluginList The list of plugins to be checked\n   */\n   function pluginCheck(Plugin[] memory pluginList) internal pure {\n    for (uint256 i = 0; i < pluginList.length; i++) {\n      if (pluginList[i].bIsBeforeOperation) {\n        if (pluginList[i].returnType == EnumReturnType.YES_AND_SKIP_SANDBOX) {\n          if (pluginList[i].level % 3 != 1) {\n            revert(string.concat(\"Invalid before-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type YES_AND_SKIP_SANDBOX, should be on level [1, 4, 7, 10, ...]\"));\n          }\n        }\n        else if (pluginList[i].returnType == EnumReturnType.SANDBOX_NEEDED) {\n          if (pluginList[i].level % 3 != 2) {\n            revert(string.concat(\"Invalid before-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type SANDBOX_NEEDED, should be on level [2, 5, 8, 11, ...]\"));\n          }\n        }\n        else if (pluginList[i].returnType == EnumReturnType.NO) {\n          if (pluginList[i].level % 3 != 0) {\n            revert(string.concat(\"Invalid before-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type NO, should be on level [3, 6, 9, 12, ...]\"));\n          }\n        }\n        else {\n          revert(\"Invalid return type: UNDEFINED\");\n        }\n      }\n      else {\n        if (pluginList[i].returnType == EnumReturnType.YES) {\n          if (pluginList[i].level % 3 != 1) {\n            revert(string.concat(\"Invalid after-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type YES, should be on level [1, 4, 7, 10, ...]\"));\n          }\n        }\n        else if (pluginList[i].returnType == EnumReturnType.VOTING_NEEDED) {\n          if (pluginList[i].level % 3 != 2) {\n            revert(string.concat(\"Invalid after-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type VOTING_NEEDED, should be on level [2, 5, 8, 11, ...]\"));\n          }\n        }\n        else if (pluginList[i].returnType == EnumReturnType.NO) {\n          if (pluginList[i].level % 3 != 0) {\n            revert(string.concat(\"Invalid after-op plugin level. Level \", Strings.toString(pluginList[i].level), \" plugin with index \", Strings.toString(i) ,\" is with return type NO, should be on level [3, 6, 9, 12, ...]\"));\n          }\n        }\n        else {\n          revert(\"Invalid return type: UNDEFINED\");\n        }\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_ADD_PLUGINS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_ADD_PLUGINS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of plugins\n    Plugin[] memory plugins = operation.param.PLUGIN_ARRAY;\n\n    // check if all the plugins are on the right level\n    pluginCheck(plugins);\n    for (uint256 i=0;i<plugins.length;i++){\n      if (bIsSandbox) { // if running in sandbox\n        if (operation.param.PLUGIN_ARRAY[i].bIsBeforeOperation) { // if it is a before operation plugin\n          sandboxMachineState.beforeOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          sandboxMachineState.beforeOpPlugins[sandboxMachineState.beforeOpPlugins.length-1].bIsEnabled = false;\n        }\n        else { // if it is an after operation plugin\n          sandboxMachineState.afterOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          sandboxMachineState.afterOpPlugins[sandboxMachineState.afterOpPlugins.length-1].bIsEnabled = false;\n        }\n      } \n      else {\n        if (operation.param.PLUGIN_ARRAY[i].bIsBeforeOperation) { // if it is a before operation plugin\n          currentMachineState.beforeOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          currentMachineState.beforeOpPlugins[currentMachineState.beforeOpPlugins.length-1].bIsEnabled = false;\n        }\n        else { // if it is an after operation plugin\n          currentMachineState.afterOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          currentMachineState.afterOpPlugins[currentMachineState.beforeOpPlugins.length-1].bIsEnabled = false;\n        }\n      }\n    }\n  }\n  /**\n   * @notice The function that executes the BATCH_ADD_AND_ENABLE_PLUGINS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_ADD_AND_ENABLE_PLUGINS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of plugins\n    Plugin[] memory plugins = operation.param.PLUGIN_ARRAY;\n\n    // check if all the plugins are on the right level\n    pluginCheck(plugins);\n\n    for (uint256 i=0;i<plugins.length;i++){\n      if (bIsSandbox) { // if running in sandbox\n        if (operation.param.PLUGIN_ARRAY[i].bIsBeforeOperation) { // if it is a before operation plugin\n          sandboxMachineState.beforeOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          sandboxMachineState.beforeOpPlugins[sandboxMachineState.beforeOpPlugins.length-1].bIsEnabled = true;\n        }\n        else { // if it is an after operation plugin\n          sandboxMachineState.afterOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          sandboxMachineState.afterOpPlugins[sandboxMachineState.afterOpPlugins.length-1].bIsEnabled = true;\n        }\n      } \n      else {\n        if (operation.param.PLUGIN_ARRAY[i].bIsBeforeOperation) { // if it is a before operation plugin\n          currentMachineState.beforeOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          currentMachineState.beforeOpPlugins[currentMachineState.beforeOpPlugins.length-1].bIsEnabled = true;\n        }\n        else { // if it is an after operation plugin\n          currentMachineState.afterOpPlugins.push(operation.param.PLUGIN_ARRAY[i]);\n          currentMachineState.afterOpPlugins[currentMachineState.beforeOpPlugins.length-1].bIsEnabled = true;\n        }\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_ENABLE_PLUGINS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_ENABLE_PLUGINS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of plugin indexes to be enabled\n    uint256[] memory pluginIndexes = operation.param.UINT256_2DARRAY[0];\n    // parameter 2 is the array of boolean that indicates if the plugin is a before operation plugin\n    bool[] memory bIsBeforeOpPlugins = operation.param.BOOL_ARRAY;\n\n    require(pluginIndexes.length == bIsBeforeOpPlugins.length, \"The length of the plugin indexes array and the boolean array must be the same\");\n    for (uint256 i=0;i<pluginIndexes.length;i++) {\n      if (bIsSandbox) { // if running in sandbox\n        if (bIsBeforeOpPlugins[i]) { // if it is a before operation plugin\n          require(pluginIndexes[i] < sandboxMachineState.beforeOpPlugins.length, \"Invalid plugin index to be enabled\"); // require that the plugin index is less than the length of the before operation plugins array\n          require(!sandboxMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be enabled is already enabled\");\n          sandboxMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled = true;\n        }\n        else { // if it is an after operation plugin\n          require(pluginIndexes[i] < sandboxMachineState.afterOpPlugins.length, \"Invalid plugin index to be enabled\"); // require that the plugin index is less than the length of the after operation plugins array\n          require(!sandboxMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be enabled is already enabled\");\n          sandboxMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled = true;\n        }\n\n      }\n      else {\n        if (bIsBeforeOpPlugins[i]) { // if it is a before operation plugin\n          require(pluginIndexes[i] < currentMachineState.beforeOpPlugins.length, \"Invalid plugin index to be enabled\"); // require that the plugin index is less than the length of the before operation plugins array\n          require(!currentMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be enabled is already enabled\");\n          currentMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled = true;\n        }\n        else { // if it is an after operation plugin\n          require(pluginIndexes[i] < currentMachineState.afterOpPlugins.length, \"Invalid plugin index to be enabled\"); // require that the plugin index is less than the length of the after operation plugins array\n          require(!currentMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be enabled is already enabled\");\n          currentMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled = true;\n        }\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_DISABLE_PLUGINS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_DISABLE_PLUGINS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of plugin indexes to be disabled\n    uint256[] memory pluginIndexes = operation.param.UINT256_2DARRAY[0];\n    // parameter 2 is the array of boolean that indicates if the plugin is a before operation plugin\n    bool[] memory bIsBeforeOpPlugins = operation.param.BOOL_ARRAY;\n\n    require(pluginIndexes.length == bIsBeforeOpPlugins.length, \"The length of the plugin indexes array and the boolean array must be the same\");\n    for (uint256 i=0;i<pluginIndexes.length;i++) {\n      if (bIsSandbox) { // if running in sandbox\n        if (bIsBeforeOpPlugins[i]) { // if it is a before operation plugin\n          require(pluginIndexes[i] < sandboxMachineState.beforeOpPlugins.length, \"Invalid plugin index to be disabled\"); // require that the plugin index is less than the length of the before operation plugins array\n          require(sandboxMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be disabled is already disabled\");\n          sandboxMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled = false;\n        }\n        else { // if it is an after operation plugin\n          require(pluginIndexes[i] < sandboxMachineState.afterOpPlugins.length, \"Invalid plugin index to be disabled\"); // require that the plugin index is less than the length of the after operation plugins array\n          require(sandboxMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be disabled is already disabled\");\n          sandboxMachineState.afterOpPlugins[pluginIndexes[i]].bIsEnabled = false;\n        }\n\n      }\n      else {\n        if (bIsBeforeOpPlugins[i]) { // if it is a before operation plugin\n          require(pluginIndexes[i] < currentMachineState.beforeOpPlugins.length, \"Invalid plugin index to be disabled\"); // require that the plugin index is less than the length of the before operation plugins array\n          require(currentMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled, \"The plugin to be disabled is already disabled\");\n          currentMachineState.beforeOpPlugins[pluginIndexes[i]].bIsEnabled = false;\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/TokenInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\nimport \"../../../TokenOwnerListManager.sol\";\nimport \"../../../Utilities/ArrayUtils.sol\";\n\n/**\n * @title Implementation of all token-related operation\n * @author DARC Team\n * @notice null\n */\n\ncontract TokenInstructions is MachineStateManager, TokenOwnerListManager{\n  /**\n   * @notice The function that executes the BATCH_MINT_TOKENS operation\n   * @param operation the operation index to be executed\n   * @param bIsSandbox the boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_BATCH_MINT_TOKENS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of target address to be minted\n    address[] memory target = operation.param.ADDRESS_2DARRAY[0];\n    // pamaeter 2 is the array of token class to be minted\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    // parameter 3 is the array of amount to be minted\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n\n    require(target.length == tokenClass.length, \"The length of target and tokenClass is not equal\");\n    require(target.length == amount.length, \"The length of target and amount is not equal\");\n\n    bool bIsValid = false;\n    for (uint256 i = 0; i < target.length; i++) {\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClass[i]].bIsInitialized == true, \"The token class is not initialized\");\n\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].totalSupply) = \n        SafeMathUpgradeable.tryAdd( amount[i],\n          sandboxMachineState.tokenList[tokenClass[i]].totalSupply);\n        require(bIsValid, \"The total supply of the token is overflow\");\n\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) =\n        SafeMathUpgradeable.tryAdd( amount[i],\n          sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]);\n        require(bIsValid, \"The balance of the token is overflow\");\n      } else {\n        require(currentMachineState.tokenList[tokenClass[i]].bIsInitialized == true, \"The token class is not initialized\");\n        \n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].totalSupply) = \n        SafeMathUpgradeable.tryAdd( amount[i],\n          currentMachineState.tokenList[tokenClass[i]].totalSupply);\n        require(bIsValid, \"The total supply of the token is overflow\");\n\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) =\n        SafeMathUpgradeable.tryAdd( amount[i],\n          currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]);\n        require(bIsValid, \"The balance of the token is overflow\");\n      }\n    }\n\n    /**\n     *  Update the token owner list for each token level\n\n        first get all the token levels\n        for example, if the operation is minting tokens like \n        number: [100, 100, 100, 100, 100, 100]\n        level: [1,1,2,2,2,3]\n        targetAddress: [addr1, addr2, add2,addr3,addr4,addr4]\n        then we need to update the token owner list [addr1, addr2, addr3, addr4] \n        and level [1,2,3]\n\n        And in the following loop, we are doing the following things:\n        for token_level in [1,2,3]:\n          update_token_owner_list( \n             [addr1, addr2, addr3, addr4],    // try adding \n             [],    //remove nothing\n             token_level\n          )\n     */\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueTarget = ArrayUtils.removeDuplicateAddressFromArray(target);\n\n    // then go through each token level and update the token owner list\n    address[] memory empty = new address[](0);\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, uniqueTarget, empty, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, uniqueTarget, empty, uniqueTokenLevelList[i]);\n      }\n    }\n  } \n\n  /**\n   * @notice Batch pay to mint tokens\n   * @param operation the operation to be executed\n   * @param bIsSandbox if the operation is executed in sandbox\n   */\n  function op_BATCH_PAY_TO_MINT_TOKENS(Operation memory operation, bool bIsSandbox) internal {\n\n    /**\n     * @notice Batch Pay to Mint Tokens Operation\n     * @param ADDRESS_2DARRAY[0] address[] addressArray: the array of the address to mint tokens\n     * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint tokens\n     * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount to mint tokens\n     * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to mint, \n     *                                                 which is not used in this function\n     * ID:20\n     */\n    address[] memory target = operation.param.ADDRESS_2DARRAY[0];\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n\n    require(target.length == tokenClass.length, \"The length of target and tokenClass is not equal\");\n    require(target.length == amount.length, \"The length of target and amount is not equal\");\n\n    bool bIsValid = false;\n    for (uint256 i = 0; i < target.length; i++) {\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].totalSupply) = \n        SafeMathUpgradeable.tryAdd( amount[i],\n          sandboxMachineState.tokenList[tokenClass[i]].totalSupply);\n        require(bIsValid, \"The total supply of the token is overflow\");\n\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) =\n        SafeMathUpgradeable.tryAdd( amount[i],\n          sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]);\n        require(bIsValid, \"The balance of the token is overflow\");\n      } else {\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].totalSupply) = \n        SafeMathUpgradeable.tryAdd( amount[i],\n          currentMachineState.tokenList[tokenClass[i]].totalSupply);\n        require(bIsValid, \"The total supply of the token is overflow\");\n\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) =\n        SafeMathUpgradeable.tryAdd( amount[i],\n          currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]);\n        require(bIsValid, \"The balance of the token is overflow\");\n      }\n    }\n\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueTarget = ArrayUtils.removeDuplicateAddressFromArray(target);\n\n    // then go through each token level and update the token owner list\n    address[] memory empty = new address[](0);\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, uniqueTarget, empty, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, uniqueTarget, empty, uniqueTokenLevelList[i]);\n      }\n    }\n\n  }\n\n  /**\n   * @notice The function that executes the BATCH_CREATE_TOKEN_CLASSES operation\n   * @param operation the operation index to be executed\n   * @param bIsSandbox the boolean flag that indicates if the operation is executed in sandbox\n   */\n\n  function op_BATCH_CREATE_TOKEN_CLASSES(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of token info to be created\n    string[] memory tokenInfo = operation.param.STRING_ARRAY;\n    // parameter 2 is the array of token index array to be created\n    uint256[] memory tokenIndexArray = operation.param.UINT256_2DARRAY[0];\n    // parameter 3 is the array of token voting power to be created\n    uint256[] memory tokenVotingPower = operation.param.UINT256_2DARRAY[1];\n    // parameter 4 is the array of token dividend weight to be created\n    uint256[] memory tokenDividendWeight = operation.param.UINT256_2DARRAY[2];\n\n    //check if the length of the parameters are equal\n    require(tokenInfo.length == tokenIndexArray.length, \"The length of tokenInfo and tokenIndexArray is not equal\");\n    require(tokenInfo.length == tokenVotingPower.length, \"The length of tokenInfo and tokenVotingPower is not equal\");\n    require(tokenInfo.length == tokenDividendWeight.length, \"The length of tokenInfo and tokenDividendWeight is not equal\");\n    \n    // the index of the token to be created\n    uint256 pt = 0;\n\n    // create number of tokens from the current token index to the max token index with uninitialized parameters\n    if (bIsSandbox) {\n      for (pt = 0 ; pt < tokenIndexArray.length ; pt++) {\n        require(sandboxMachineState.tokenList[tokenIndexArray[pt]].bIsInitialized == false, \"The token is already initialized\");\n        sandboxMachineState.tokenList[tokenIndexArray[pt]].bIsInitialized = true;\n        sandboxMachineState.tokenList[tokenIndexArray[pt]].tokenInfo = tokenInfo[pt];\n        sandboxMachineState.tokenList[tokenIndexArray[pt]].votingWeight = tokenVotingPower[pt];\n        sandboxMachineState.tokenList[tokenIndexArray[pt]].dividendWeight = tokenDividendWeight[pt];\n        sandboxMachineState.tokenList[tokenIndexArray[pt]].totalSupply = 0;\n      }\n    } else {\n      for (pt = 0 ; pt < tokenIndexArray.length ; pt++) {\n        require(currentMachineState.tokenList[tokenIndexArray[pt]].bIsInitialized == false, \"The token is already initialized\");\n        currentMachineState.tokenList[tokenIndexArray[pt]].bIsInitialized = true;\n        currentMachineState.tokenList[tokenIndexArray[pt]].tokenInfo = tokenInfo[pt];\n        currentMachineState.tokenList[tokenIndexArray[pt]].votingWeight = tokenVotingPower[pt];\n        currentMachineState.tokenList[tokenIndexArray[pt]].dividendWeight = tokenDividendWeight[pt];\n        currentMachineState.tokenList[tokenIndexArray[pt]].totalSupply = 0;\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_TRANSFER_TOKENS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_TRANSFER_TOKENS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of address to transfer to\n    address[] memory target = operation.param.ADDRESS_2DARRAY[0];\n    // parameter 2 is the array of token class to transfer\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    // parameter 3 is the array of amount to be transferred\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n\n    require(target.length == tokenClass.length, ErrorMsg.By(1));\n    require(target.length == amount.length, ErrorMsg.By(1));\n\n    bool bIsValid = false;\n    // make sure that the operator has enough balance to transfer for each token class\n    for (uint256 i=0;i<target.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= amount[i], ErrorMsg.By(2));\n      } else {\n        require(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= amount[i], ErrorMsg.By(2));\n      }\n    }\n\n    // start transferring tokens: deduct from the operator first, then add to the target address\n    for(uint256 i=0;i<target.length;i++){\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) = \n        SafeMathUpgradeable.tryAdd(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(4));\n      }\n      else {\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) = \n        SafeMathUpgradeable.tryAdd(currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(4));\n      }\n    }\n\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueToAdd = ArrayUtils.removeDuplicateAddressFromArray(target);\n    address[] memory uniqueToRemove = new address[](1);\n    uniqueToRemove[0] = operation.operatorAddress;\n\n    // then go through each token level and update the token owner list\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      }\n    }\n  }\n\n  /**\n   * The function that executes the BATCH_TRANSFER_TOKENS_FROM_TO operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_TRANSFER_TOKENS_FROM_TO(Operation memory operation, bool bIsSandbox) internal {\n    // param 1 is the array of address that the tokens are transferred from\n    address[] memory fromAddr = operation.param.ADDRESS_2DARRAY[0];\n    // param 2 is the array of address that the tokens are transferred to\n    address[] memory toAddr = operation.param.ADDRESS_2DARRAY[1];\n    // param 3 is the array of token class to transfer\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    // param 4 is the array of amount to be transferred\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n\n    require (fromAddr.length == toAddr.length, ErrorMsg.By(1));\n    require (fromAddr.length == tokenClass.length, ErrorMsg.By(1));\n    require (fromAddr.length == amount.length, ErrorMsg.By(1));\n\n\n    bool bIsValid = true;\n\n    // make sure that the fromAddr has enough balance to transfer for each token class\n    for (uint256 i=0;i<fromAddr.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]] >= amount[i], ErrorMsg.By(2));\n      } else {\n        require(currentMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]] >= amount[i], ErrorMsg.By(2));\n      }\n    }\n\n    // start transferring tokens: deduct from the fromAddr first, then add to the toAddr\n    for (uint256 i=0;i<fromAddr.length;i++) {\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]]) = \n        SafeMathUpgradeable.trySub(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[toAddr[i]]) = \n        SafeMathUpgradeable.tryAdd(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[toAddr[i]], amount[i]);\n      }\n      else {\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]]) = \n        SafeMathUpgradeable.trySub(currentMachineState.tokenList[tokenClass[i]].tokenBalance[fromAddr[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[toAddr[i]]) = \n        SafeMathUpgradeable.tryAdd(currentMachineState.tokenList[tokenClass[i]].tokenBalance[toAddr[i]], amount[i]);\n      }\n    }\n\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueToAdd = ArrayUtils.removeDuplicateAddressFromArray(toAddr);\n    address[] memory uniqueToRemove = ArrayUtils.removeDuplicateAddressFromArray(fromAddr);\n\n    // then go through each token level and update the token owner list\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_PAY_TO_TRANSFER_TOKENS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_PAY_TO_TRANSFER_TOKENS (Operation memory operation, bool bIsSandbox) internal {\n    /**\n     * @notice Pay some cash to transfer tokens (can be used as product coins)\n     * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n     * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n     * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n     * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to transfer, not used in this function\n     * ID:21\n     */\n    // parameter 1 is the array of address to transfer to\n    address[] memory target = operation.param.ADDRESS_2DARRAY[0];\n    // parameter 2 is the array of token class to transfer\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    // parameter 3 is the array of amount to be transferred\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n\n    require(target.length == tokenClass.length, ErrorMsg.By(1));\n    require(target.length == amount.length, ErrorMsg.By(1));\n\n    bool bIsValid = false;\n    // make sure that the operator has enough balance to transfer for each token class\n    for (uint256 i=0;i<target.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= amount[i], ErrorMsg.By(2));\n      } else {\n        require(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= amount[i], ErrorMsg.By(2));\n      }\n    }\n\n    // start transferring tokens: deduct from the operator first, then add to the target address\n    for(uint256 i=0;i<target.length;i++){\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) = \n        SafeMathUpgradeable.tryAdd(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(4));\n      }\n      else {\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], amount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]]) = \n        SafeMathUpgradeable.tryAdd(currentMachineState.tokenList[tokenClass[i]].tokenBalance[target[i]], amount[i]);\n        require(bIsValid, ErrorMsg.By(4));\n      }\n    }\n\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueToAdd = ArrayUtils.removeDuplicateAddressFromArray(target);\n    address[] memory uniqueToRemove = new address[](1);\n    uniqueToRemove[0] = operation.operatorAddress;\n\n    // then go through each token level and update the token owner list\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, uniqueToAdd, uniqueToRemove, uniqueTokenLevelList[i]);\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_BURN_TOKENS operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_BURN_TOKENS(Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of token classes\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    // parameter 2 is the array of token amounts\n    uint256[] memory tokenAmount = operation.param.UINT256_2DARRAY[1];\n\n    // check if the number of token classes and token amounts are the same\n    require(tokenClass.length == tokenAmount.length, \"The length of tokenClass and tokenAmount is not equal\");\n\n    bool bIsValid = true;\n\n    // make sure that the operator has enough balance to burn for each token class\n    for (uint256 i=0;i<tokenClass.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= tokenAmount[i], ErrorMsg.By(2));\n      } else {\n        require(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress] >= tokenAmount[i], ErrorMsg.By(2));\n      }\n    }\n    \n\n    // start burning tokens: deduct from the operator first\n    for (uint i=0;i<tokenClass.length;i++) {\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(sandboxMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], tokenAmount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n      }\n      else {\n        (bIsValid, currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress]) = \n        SafeMathUpgradeable.trySub(currentMachineState.tokenList[tokenClass[i]].tokenBalance[operation.operatorAddress], tokenAmount[i]);\n        require(bIsValid, ErrorMsg.By(2));\n      }\n    }\n\n    // then update the token owner list for each token level\n    // first get all the token levels\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClass);\n    address[] memory uniqueTarget = new address[](1);\n    uniqueTarget[0] = operation.operatorAddress;\n\n    // then go through each token level and update the token owner list\n    address[] memory empty = new address[](0);\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, empty, uniqueTarget, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, empty, uniqueTarget, uniqueTokenLevelList[i]);\n      }\n    }\n    \n  }\n\n  /**\n   * @notice The function that executes the BATCH_BURN_TOKENS_FROM operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_BURN_TOKENS_FROM (Operation memory operation, bool bIsSandbox) internal {\n    // parameter 1 is the array of address to burn from\n    address[] memory addresses = operation.param.ADDRESS_2DARRAY[0];\n    // parameter 2 is the array of token classes to burn\n    uint256[]memory tokenClasses = operation.param.UINT256_2DARRAY[0];  \n    // parameter 3 is the array of amount to burn\n    uint256[] memory amounts = operation.param.UINT256_2DARRAY[1];\n\n    require(addresses.length == tokenClasses.length, \"The length of addresses and tokenClasses is not equal\");\n    require(addresses.length == amounts.length, \"The length of addresses and amounts is not equal\");\n\n    // make sure that each address has enough balance to burn for each token class\n    bool bIsValid = false;\n    for (uint256 i=0;i<addresses.length;i++){\n      if (bIsSandbox) {\n        require(sandboxMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]] >= amounts[i], ErrorMsg.By(2));\n      } else {\n        require(currentMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]] >= amounts[i], ErrorMsg.By(2));\n      }\n    }\n\n    // start burning tokens: deduct from the address first\n    for(uint256 i=0;i<addresses.length;i++){\n      if (bIsSandbox) {\n        (bIsValid, sandboxMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]]) = \n        SafeMathUpgradeable.trySub(sandboxMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]], amounts[i]);\n        require(bIsValid, ErrorMsg.By(2));\n      }\n      else {\n        (bIsValid, currentMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]]) = \n        SafeMathUpgradeable.trySub(currentMachineState.tokenList[tokenClasses[i]].tokenBalance[addresses[i]], amounts[i]);\n        require(bIsValid, ErrorMsg.By(2));\n      }\n    }\n\n    // then update the token owner list for each token level\n    // first get all the token levels\n    uint256[] memory uniqueTokenLevelList = ArrayUtils.removeDuplicateIntFromArray(tokenClasses);\n    address[] memory toRemove = ArrayUtils.removeDuplicateAddressFromArray(addresses);\n  \n    // then go through each token level and update the token owner list\n    address[] memory empty = new address[](0);\n    for (uint256 i = 0; i < uniqueTokenLevelList.length; i++) {\n      if (bIsSandbox) {\n        updateTokenOwnerList(true, empty, toRemove, uniqueTokenLevelList[i]);\n      } else {\n        updateTokenOwnerList(false, empty, toRemove, uniqueTokenLevelList[i]);\n      }\n    }\n  }\n\n  /**\n   * @notice The function that executes the BATCH_BURN_TOKENS_AND_REFUND operation\n   * @param operation The operation to be executed\n   * @param bIsSandbox The flag to indicate if the operation is being executed in sandbox\n   */\n  function op_BATCH_BURN_TOKENS_AND_REFUND(Operation memory operation, bool bIsSandbox) internal {\n      /**\n       * @notice Batch Burn tokens and Refund\n       * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to burn tokens from\n       * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to burn\n       * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to burn\n       * ID:30\n       */\n    require(operation.param.UINT256_2DARRAY[0].length == operation.param.UINT256_2DARRAY[1].length, \"The length of tokenClassArray and amountArray is not equal at BATCH_BURN_TOKENS_AND_REFUND\");\n    require(operation.param.UINT256_2DARRAY[0].length == operation.param.UINT256_2DARRAY[2].length, \"The length of tokenClassArray and priceArray is not equal at BATCH_BURN_TOKENS_AND_REFUND\");\n\n    uint256[] memory tokenClass = operation.param.UINT256_2DARRAY[0];\n    uint256[] memory amount = operation.param.UINT256_2DARRAY[1];\n    uint256[] memory price = operation.param.UINT256_2DARRAY[2];\n\n    // just call the op_BATCH_BURN_TOKENS function to burn the tokens first\n    // make sure that the burning operation is executed successfully before refunding the operator\n    op_BATCH_BURN_TOKENS(operation, bIsSandbox);\n\n    // then refund the operator with the price\n\n    if (bIsSandbox) {\n      // initialize the total refund amount\n      uint256 totalRefundAmount = 0;\n      for (uint256 i=0;i<tokenClass.length;i++){\n        bool bIsValid = false;\n        uint256 refundAmount = 0;\n\n        // calculate the refund amount\n        (bIsValid, refundAmount) = SafeMathUpgradeable.tryMul(amount[i], price[i]);\n        require(bIsValid, \"The refund amount is overflow\");\n        if (refundAmount > 0) {\n\n          (bIsValid, totalRefundAmount) = SafeMathUpgradeable.tryAdd(refundAmount, totalRefundAmount);\n          require(bIsValid, \"The total refund amount is overflow\");\n\n        }\n      }\n\n      // if the total refund amount is greater than 0, add it to the withdrawable cash map\n      // and update the withdrawable cash owner list if the operator is not in the list\n      if (totalRefundAmount > 0) {\n        uint256 totalWithdrawableAmount = 0;\n        bool bIsValid = false;\n        (bIsValid, totalWithdrawableAmount) = SafeMathUpgradeable.tryAdd(totalRefundAmount, sandboxMachineState.withdrawableCashMap[operation.operatorAddress]);\n        require(bIsValid, \"The total withdrawable amount is overflow\");\n        sandboxMachineState.withdrawableCashMap[operation.operatorAddress] = totalWithdrawableAmount;\n\n        // if the operator is not in the withdrawable cash owner list, add it to the list\n        bool bIsInList = false;\n        for (uint256 i=0;i<sandboxMachineState.withdrawableCashOwnerList.length;i++){\n          if (sandboxMachineState.withdrawableCashOwnerList[i] == operation.operatorAddress){\n            bIsInList = true;\n            break;\n          }\n        }\n\n        if (!bIsInList){\n          sandboxMachineState.withdrawableCashOwnerList.push(operation.operatorAddress);\n        }\n      }\n    }\n\n    else {\n      // initialize the total refund amount\n      uint256 totalRefundAmount = 0;\n      for (uint256 i=0;i<tokenClass.length;i++){\n        bool bIsValid = false;\n        uint256 refundAmount = 0;\n\n        // calculate the refund amount\n        (bIsValid, refundAmount) = SafeMathUpgradeable.tryMul(amount[i], price[i]);\n        require(bIsValid, \"The refund amount is overflow\");\n        if (refundAmount > 0) {\n\n          (bIsValid, totalRefundAmount) = SafeMathUpgradeable.tryAdd(refundAmount, totalRefundAmount);\n          require(bIsValid, \"The total refund amount is overflow\");\n\n        }\n      }\n\n      // if the total refund amount is greater than 0, add it to the withdrawable cash map\n      // and update the withdrawable cash owner list if the operator is not in the list\n      if (totalRefundAmount > 0) {\n        uint256 totalWithdrawableAmount = 0;\n        bool bIsValid = false;\n        (bIsValid, totalWithdrawableAmount) = SafeMathUpgradeable.tryAdd(totalRefundAmount, currentMachineState.withdrawableCashMap[operation.operatorAddress]);\n        require(bIsValid, \"The total withdrawable amount is overflow\");\n        currentMachineState.withdrawableCashMap[operation.operatorAddress] = totalWithdrawableAmount;\n\n        // if the operator is not in the withdrawable cash owner list, add it to the list\n        bool bIsInList = false;\n        for (uint256 i=0;i<currentMachineState.withdrawableCashOwnerList.length;i++){\n          if (currentMachineState.withdrawableCashOwnerList[i] == operation.operatorAddress){\n            bIsInList = true;\n            break;\n          }\n        }\n\n        if (!bIsInList){\n          currentMachineState.withdrawableCashOwnerList.push(operation.operatorAddress);\n        }\n      }\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Executable/Instructions/UtilityInstructions.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../../MachineState.sol\";\nimport \"../../../MachineStateManager.sol\";\nimport \"../../../Plugin/PluginSystem.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\nimport \"../../../Plugin.sol\";\nimport \"../../../Utilities/ErrorMsg.sol\";\n\n/**\n * @title All instructions about other utilities\n * @author \n * @notice \n */\ncontract UtilityInstructions is MachineStateManager {\n\n  /**\n   * @notice The implementation of the operation BATCH_ADD_VOTING_RULES\n   * @param operation The operation index to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_BATCH_ADD_VOTING_RULES(Operation memory operation, bool bIsSandbox) internal {\n    VotingRule[] memory votingRules = operation.param.VOTING_RULE_ARRAY;\n    if (bIsSandbox) {\n      for (uint256 i = 0; i < votingRules.length; i++) {\n        sandboxMachineState.votingRuleList.push(votingRules[i]);\n      }\n    } else {\n      for (uint256 i = 0; i < votingRules.length; i++) {\n        currentMachineState.votingRuleList.push(votingRules[i]);\n      }\n    }\n  }\n\n  function op_ADD_EMERGENCY(Operation memory operation, bool bIsSandbox) internal {\n    address[] memory EmergencyAgentsAddressArray = operation.param.ADDRESS_2DARRAY[0];\n    if (bIsSandbox) {\n      for (uint256 i = 0; i < EmergencyAgentsAddressArray.length; i++) {\n        sandboxMachineState.machineStateParameters.emergencyAgentsAddressList.push(EmergencyAgentsAddressArray[i]);\n      }\n    } else {\n      for (uint256 i = 0; i < EmergencyAgentsAddressArray.length; i++) {\n        currentMachineState.machineStateParameters.emergencyAgentsAddressList.push(EmergencyAgentsAddressArray[i]);\n      }\n    }\n  }\n\n  /**\n   * @notice The implementation of the operation CALL_EMERGENCY\n   * @param operation The operation index to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_CALL_EMERGENCY(Operation memory operation, bool bIsSandbox) internal {\n    // the address(s) of the emergency agent(s) to be called\n    address[] memory EmergencyAgentsAddressArray = operation.param.ADDRESS_2DARRAY[0];\n    if (bIsSandbox) {\n      sandboxMachineState.machineStateParameters.bIsEmergency = true;\n      for (uint256 i = 0; i < EmergencyAgentsAddressArray.length; i++) {\n        sandboxMachineState.machineStateParameters.activeEmergencyAgentsAddressList.push(EmergencyAgentsAddressArray[i]);\n      }\n    } else {\n      currentMachineState.machineStateParameters.bIsEmergency = true;\n      for (uint256 i = 0; i < EmergencyAgentsAddressArray.length; i++) {\n        currentMachineState.machineStateParameters.activeEmergencyAgentsAddressList.push(EmergencyAgentsAddressArray[i]);\n      }\n    }\n  }\n  \n  /**\n   * @notice The implementation of the operation CALL_CONTRACT_ABI\n   * @param operation The operation index to be executed\n   * @param bIsSandbox The boolean flag that indicates if the operation is executed in sandbox\n   */\n  function op_CALL_CONTRACT_ABI(Operation memory operation, bool bIsSandbox) internal {\n      /**\n       * @notice Call a contract with the given abi\n       * @param ADDRESS_2D[0][0] address contractAddress: the address of the contract to call\n       * @param bytes abi the encodedWithSignature abi of the function to call\n       * @param UINT256_2DARRAY[0][0] uint256 the value to send to the contract\n       * ID:25\n       */\n      if (bIsSandbox) {\n        // do not execute the operation, just do nothing, it's ok\n      }\n\n      else {\n        // initialize the valueEthers, the value that will be sent to the contract\n        uint256 valueEthers = 0;\n        if (operation.param.UINT256_2DARRAY.length > 0) {\n          if (operation.param.UINT256_2DARRAY[0].length > 0) {\n            valueEthers = operation.param.UINT256_2DARRAY[0][0];\n          }\n        }\n\n        // get the abi\n        bytes memory abidata = operation.param.BYTES;\n        // get the address of the contract to call\n        address contractAddress = operation.param.ADDRESS_2DARRAY[0][0];\n \n        // call the contract\n        (bool success, bytes memory returnData) = contractAddress.call{value: valueEthers}(abidata);\n        // check if the call is successful\n        if (!success) {\n          revert(string(abi.encodePacked(\"The call to the contract is not successful. Return data: \", returnData)));\n        }\n      }\n  }\n\n\n  function op_SET_APPROVAL_FOR_ALL_OPERATIONS(Operation memory operation, bool bIsSandbox) internal {\n\n  }\n\n  function op_ADD_STORAGE_STRING(Operation memory operation, bool bIsSandbox) internal {\n    // hash string\n    string memory hashString = operation.param.STRING_ARRAY[0];\n    if (bIsSandbox) {\n      sandboxMachineState.machineStateParameters.strStorageList.push(hashString);\n    } else {\n      currentMachineState.machineStateParameters.strStorageList.push(hashString);\n    }\n  }\n\n  function op_VOTE(Operation memory operation, bool bIsSandbox) internal {\n\n  }\n\n  function op_EXECUTE_PENDING_PROGRAM(Operation memory operation, bool bIsSandbox) internal {\n    \n  }\n\n  function op_END_EMERGENCY(Operation memory operation, bool bIsSandbox) internal {\n    if (bIsSandbox) {\n      sandboxMachineState.machineStateParameters.bIsEmergency = false;\n      delete sandboxMachineState.machineStateParameters.activeEmergencyAgentsAddressList;\n    } else {\n      currentMachineState.machineStateParameters.bIsEmergency = false;\n      delete currentMachineState.machineStateParameters.activeEmergencyAgentsAddressList;\n    }\n  }\n\n  function op_UPGRADE_TO_ADDRESS(Operation memory operation, bool bIsSandbox) internal {\n\n  }\n\n  function op_CONFIRM_UPGRAED_FROM_ADDRESS(Operation memory operation, bool bIsSandbox) internal {\n\n  }\n\n  function op_UPGRADE_TO_THE_LATEST(Operation memory operation, bool bIsSandbox) internal {\n\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/PaymentCheck/PaymentCheck.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"../../MachineState.sol\";\nimport \"../../MachineStateManager.sol\";\nimport \"../../Program.sol\";\nimport \"../../Opcodes.sol\";\nimport \"../ProgramValidator/ProgramValidator.sol\";\nimport \"../Executable/Executable.sol\";\nimport \"../../Utilities/StringUtils.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n//import \"hardhat/console.sol\";\n\n/**\n * @title PaymentCheck, a contract that checks the payment of the program by \n * summing up the payment of all the operations and compare with the payment value.\n * \n * For example, the program contains 4 operations, and the costs are:\n * pay_cash(), 100\n * pay_to_mint_tokens(), 10/token * 20\n * transfer_tokens(), 0\n * add_withdrawable_cash(), 0\n *  The total payment is 100 + 10 * 20 = 300\n * @author DARC Team\n * @notice \n */\ncontract PaymentCheck is MachineStateManager {\n  \n  /**\n   * @notice The entrance of the payment check. It will check the payment of the program\n   * @param program The program that is being executed\n   */\n  function paymentCheck(Program memory program) internal pure returns (uint256) {\n    uint256 totalPayment = 0;\n    bool bIsValid = true;\n    for (uint256 i = 0; i < program.operations.length; i++) {\n      if (program.operations[i].opcode == EnumOpcode.PAY_CASH) {\n        (bIsValid, totalPayment) = SafeMathUpgradeable.tryAdd(totalPayment, checkOperation_PAY_CASH(program.operations[i]));\n        require(bIsValid, \"The total payment is too large.\");\n      }\n      else if (program.operations[i].opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) {\n        (bIsValid, totalPayment) = SafeMathUpgradeable.tryAdd(totalPayment, checkOperation_BATCH_PAY_TO_MINT_TOKENS(program.operations[i]));\n        require(bIsValid, \"The total payment is too large.\");\n      }\n      else if (program.operations[i].opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) {\n        (bIsValid, totalPayment) = SafeMathUpgradeable.tryAdd(totalPayment, checkOperation_BATCH_PAY_TO_TRANSFER_TOKENS(program.operations[i]));\n        require(bIsValid, \"The total payment is too large.\");\n      }\n    }\n    return totalPayment;\n  }\n  /**\n   * Check the payment of the PAY_CASH operation, return the payment value\n   * @param operation The operation that is being checked\n   * @return The payment value of the operation\n   */\n  function checkOperation_PAY_CASH(Operation memory operation) private pure returns (uint256) {\n    EnumOpcode opcode = operation.opcode;\n    require(opcode == EnumOpcode.PAY_CASH, \"The opcode is not PAY_CASH.\");\n\n    /**\n      * @param uint256 amount: the amount of cash to pay\n      * @param uint256 paymentType: the type of cash to pay, 0 for ethers/matic/original tokens\n      *  1 for USDT, 2 for USDC (right now only 0 is supported)\n      * @param uint256 dividendable: the flag to indicate if the payment is dividendable for token holders, \n      * 0 for no (investment), 1 for yes (purchase)\n    */\n\n   // get the amount of money, which is the first parameter\n    return operation.param.UINT256_2DARRAY[0][0];\n  }\n\n  /**\n   * Check the payment of the BATCH_PAY_TO_MINT_TOKENS operation, return the payment value\n   * @param operation The operation that is being checked\n   * @return The payment value of the operation\n   */\n  function checkOperation_BATCH_PAY_TO_MINT_TOKENS(Operation memory operation) private pure returns (uint256) {\n    /**\n     * @notice Batch Pay to Mint Tokens Operation\n     * @param ADDRESS_2DARRAY[0] address[] addressArray: the array of the address to mint tokens\n     * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to mint tokens\n     * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount to mint tokens\n     * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to mint, \n     *                                                 which is not used in this function\n     * ID:20\n     */\n\n    // get the number of tokens, and the price of each token\n    uint256 total = 0;\n    bool bIsValid = true;\n    uint256 currentTotalTokenCost = 0;\n    for (uint256 i = 0; i < operation.param.UINT256_2DARRAY[1].length; i++) {\n      (bIsValid, currentTotalTokenCost) = SafeMathUpgradeable.tryMul(operation.param.UINT256_2DARRAY[1][i], operation.param.UINT256_2DARRAY[2][i]);\n      require(bIsValid, \"The total payment is too large.\");\n      (bIsValid, total) = SafeMathUpgradeable.tryAdd(total, currentTotalTokenCost);\n      require(bIsValid, \"The total payment is too large.\");\n    }\n    return total;\n  }\n\n  /**\n   * Check the payment of the BATCH_PAY_TO_TRANSFER_TOKENS operation, return the payment value\n   * @param operation The operation that is being checked\n   */\n  function checkOperation_BATCH_PAY_TO_TRANSFER_TOKENS(Operation memory operation) private pure returns (uint256) {\n    /**\n     * @notice Pay some cash to transfer tokens (can be used as product coins)\n     * @param ADDRESS_2DARRAY[0] address[] toAddressArray: the array of the address to transfer token to\n     * @param UINT256_2DARRAY[0] uint256[] tokenClassArray: the array of the token class index to transfer token from\n     * @param UINT256_2DARRAY[1] uint256[] amountArray: the array of the amount of the token to transfer\n     * @param UINT256_2DARRAY[2] uint256[] priceArray: the price of each token class to transfer, not used in this function\n     * ID:21\n     */\n    \n    // get the number of tokens, and the price for transferring each token\n    uint256 total = 0;\n    bool bIsValid = true;\n    uint256 currentTotalTokenCost = 0;\n    for (uint256 i = 0; i < operation.param.UINT256_2DARRAY[1].length; i++) {\n      (bIsValid, currentTotalTokenCost) = SafeMathUpgradeable.tryMul(operation.param.UINT256_2DARRAY[1][i], operation.param.UINT256_2DARRAY[2][i]);\n      require(bIsValid, \"The total payment is too large.\");\n      (bIsValid, total) = SafeMathUpgradeable.tryAdd(total, currentTotalTokenCost);\n      require(bIsValid, \"The total payment is too large.\");\n    }\n    return total;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/ProgramValidator/ProgramValidator.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"../../Program.sol\";\n\n/**\n * @notice The library to validate the program and each operations in the program\n * Since the struct Program does not contain any nested struct, we can \n * use functions in this library, instead of functions in the contract.\n * \n * This library is used to validate the basic properties of the program,\n * such as the length of the program, the length of the parameters of\n * each operation, the length of the parameter array, etc.\n * \n * For more specific validation via the plugins, we need to use the\n * contract Runtime.\n *  */ \nlibrary ProgramValidator{\n  function validate(Program memory currentProgram) internal pure returns (bool) {\n    for (uint256 i = 0; i < currentProgram.operations.length; i++) {\n\n      // check if the operation is valid. UNDEFINED is not a valid operation\n      if (currentProgram.operations[i].opcode == EnumOpcode.UNDEFINED) {\n        return false;\n      }\n\n      // check if operation is \"BATCH_MINT_TOKENS\", and validate the operation\n      if (currentProgram.operations[i].opcode == EnumOpcode.BATCH_MINT_TOKENS) {\n        //if (!ValidateBatchMintTokens.validate__BATCH_MINT_TOKENS(currentProgram.operations[i])) {\n        //  return false;\n        //}\n      }\n\n      // todo: add more validation for other operations\n    }\n\n    return true;\n  }\n\n  /**\n   * Returns true if the program is a valid vote program\n   * 1. There is only one operation in the program\n   * 2. The operation is a vote operation\n   * @param currentProgram The program to be validated\n   */\n  function validateVoteProgram(Program memory currentProgram) internal pure returns (bool) {\n    //1. check if the program is empty\n    if (currentProgram.operations.length != 1) { return false; }\n    return validate_ID_32_VOTE(currentProgram.operations[0]);\n  }\n\n  /**\n   * Returns true if the program is a valid execute pending program\n   * 1. There is only one operation in the program\n   * 2. The operation is a execute pending operation: ExecutePendingProgram\n   * @param currentProgram The program to be validated\n   */\n  function validateExecutePendingProgram(Program memory currentProgram) internal pure returns (bool) {\n    //1. check if the program is empty\n    if (currentProgram.operations.length != 1) { return false; }\n    return validate_ID_33_EXECUTE_PENDING_PROGRAM(currentProgram.operations[0]);\n  }\n\n\n  //----------------- validate each operation -----------------\n\n  function validate_ID_32_VOTE(Operation memory op) internal pure returns (bool) {\n    if (op.opcode != EnumOpcode.VOTE) { return false; }\n    if (op.param.UINT256_2DARRAY.length != 0) { return false; }\n    if (op.param.ADDRESS_2DARRAY.length != 0) { return false; }\n    if (op.param.STRING_ARRAY.length != 0) { return false; }\n    return true;\n  }\n\n  function validate_ID_33_EXECUTE_PENDING_PROGRAM(Operation memory op) internal pure returns (bool) {\n    if (op.opcode != EnumOpcode.EXECUTE_PENDING_PROGRAM) { return false; }\n    if (op.param.UINT256_2DARRAY.length != 0) { return false; }\n    if (op.param.ADDRESS_2DARRAY.length != 0) { return false; }\n    if (op.param.STRING_ARRAY.length != 0) { return false; }\n    return true;\n  }\n\n\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/Runtime.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nimport \"../MachineState.sol\";\nimport \"../MachineStateManager.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"../Program.sol\";\nimport \"./ProgramValidator/ProgramValidator.sol\";\nimport \"./Executable/Executable.sol\";\nimport \"../Utilities/StringUtils.sol\";\nimport \"./PaymentCheck/PaymentCheck.sol\";\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n//import \"hardhat/console.sol\";\n\ncontract Runtime is Executable, PaymentCheck{\n\n  /**\n   * @notice This is the main entrance of the DARC runtime. Since DARC is a finite state machine:\n   * -----------------\n   * 1. Idle. All program can be executed.\n   * -----------------\n   * 2. Voting. When a program is submitted but voting is required, the state will be changed to voting,\n   *  and all the other programs will be rejected during the voting period. Only voting and termination\n   * can be executed. When the voting is rejected or timeout, the state will be changed to idle; \n   * when the voting is passed, the state will be changed to execution pending.\n   * -----------------\n   * 3. Execution pending. When a voting is passed, the state will be changed to execution pending, and \n   * the current program can be executed by everyone with enough gas fee. After the execution, the state\n   * will be changed to idle. There is also a timeout for execution pending, if the execution is not\n   * finished within the timeout, the state will be changed to idle when the next program is submitted.\n   * -----------------\n   * @param program The program that is being executed \n   */\n\n  \n  function runtimeEntrance(Program memory program) internal returns (string memory) {\n\n    // check payment first, compare the payment value with the total payment of the program\n    uint256 totalPayment = paymentCheck(program);\n    if (msg.value < totalPayment) {\n      revert(\"The payment is not enough. The total payment should be \" );\n    }\n\n    // if the user pays more than the total payment, \n    // return the change to withdrawable cash balance\n    else if (msg.value > totalPayment) {\n\n      // check if the current balance of owner is 0,\n      // and if so, check if the owner is in the withdrawable cash owner list\n      if (currentMachineState.withdrawableCashMap[program.programOperatorAddress] == 0) {\n        bool bExist = false;\n        for (uint256 i = 0; i < currentMachineState.withdrawableCashOwnerList.length; i++) {\n          if (currentMachineState.withdrawableCashOwnerList[i] == program.programOperatorAddress) {\n            bExist = true;\n            break;\n          }\n        }\n\n        // if the owner is not in the withdrawable cash owner list, add it\n        if (!bExist) {\n          currentMachineState.withdrawableCashOwnerList.push(program.programOperatorAddress);\n        }\n      }\n\n      (bool bIsValid, uint256 paymentReturn) = SafeMathUpgradeable.trySub(msg.value, totalPayment);\n      require(bIsValid, \"The payment return overflow.\");\n      // add the payment return to the withdrawable cash balance\n      (bool bIsValid2, uint256 newBalance) = SafeMathUpgradeable.tryAdd(currentMachineState.withdrawableCashMap[program.programOperatorAddress], paymentReturn);\n      require(bIsValid2, \"The new balance overflow.\");\n      currentMachineState.withdrawableCashMap[program.programOperatorAddress] = newBalance;\n    }\n\n    // If the current state is idle, execute the program\n    if (finiteState == FiniteState.IDLE) {\n      executeProgram(program);\n      return \"The program is executed.\";\n    } \n    \n    // If the current state is voting and has not reached the voting deadline, do the vote\n    else if (finiteState == FiniteState.VOTING && block.timestamp < votingDeadline) {\n      require(validateVoteProgram(program), \"Invalid voting program.\");\n      executeVoteProgram(program);\n      return \"The vote is executed.\";\n    } \n    \n    // If the current state is execution pending and\n    // has not reached the execution pending deadline, execute the program.\n    // The program must be a valid program with 1 operation that execute the pending program\n    else if (finiteState == FiniteState.EXECUTING_PENDING \n    && block.timestamp < executingPendingDeadline) {\n      require(validateExecutePendingProgram(program), \"Invalid executing pending program.\");\n      executePendingProgram(program);\n      return \"The pending program is executed after voting and approval.\";\n    }\n\n    // If the current state is voting but has reached the voting deadline, \n    // try to end the voting and determine the next state\n    else if (finiteState == FiniteState.VOTING \n    && block.timestamp >= votingDeadline \n    && block.timestamp < executingPendingDeadline) {\n\n      // check if the voting is passed or rejected\n      tryEndVotingAfterVotingDeadline();\n\n      // if the current state is IDLE, just continue to execute the program\n      if (finiteState == FiniteState.IDLE) {\n        require(validateProgram(program), \"The voting is rejected and now DARC is in idle state. The input program is not a valid program.\");\n        executeProgram(program);\n        return \"The program is executed.\";\n      }\n\n      else if (finiteState == FiniteState.EXECUTING_PENDING) {\n        require(validateExecutePendingProgram(program), \"The voting is passed and now DARC is in executing pending state. The input program is not a valid EXECUTE_PENDING_PROGRAM to execute the pending program.\");\n        executePendingProgram(program);\n        return \"The pending program is executed after voting and approval.\";\n      }\n    }\n\n    // If the current state is execution pending or voting but has reached the execution pending deadline,\n    // terminate the execution pending and change to the idle state, and run the program.\n    else if ( (finiteState == FiniteState.EXECUTING_PENDING || finiteState == FiniteState.VOTING)\n    && block.timestamp >= executingPendingDeadline) {\n      finiteState = FiniteState.IDLE;\n      require(validateProgram(program), \"[Error 003]The program is not a valid program.\");\n      executeProgram(program);\n      return \"The program is executed.\";\n    }\n\n    return \"Program terminated.\";\n  }\n\n  /**\n   * @notice Check if current program is a valid program\n   */\n  function validateProgram(Program memory program) internal pure returns (bool) {\n    //1. check if the program is empty\n    if (program.operations.length == 0) { return false; }\n\n    //2. check if the program is valid TODO: add more validation for each operation\n    return true;//ProgramValidator.validate(currentProgram);\n  }\n\n  /**\n   * @notice Check if current program is a valid vote program:\n   * 1. There is only one operation in the program\n   * 2. The operation is a vote operation\n   * 3. The vote operation contains the same number boolean values as the number of the voting policy\n   */\n  function validateVoteProgram(Program memory program) internal pure returns (bool) {\n    return ProgramValidator.validateVoteProgram(program);\n  }\n\n  /**\n   * @notice Check if current program is a valid execute pending program:\n   * 1. There is only one operation in the program\n   * 2. The operation is a execute pending operation: ExecutePending\n   * 3. The execute pending operation contains the same number boolean values as the number of the voting policy\n   */\n  function validateExecutePendingProgram(Program memory program) internal pure returns (bool) {\n    return ProgramValidator.validateExecutePendingProgram(program);\n  }\n\n  /**\n   * @notice Execute the program submitted by the program operator\n   */\n  function executeProgram(Program memory program) internal {\n    //1. check if the program is valid\n    require(validateProgram(program), \"Invalid program\");\n\n    //2. execute the program\n    execute(program);\n  }\n\n  function executeVoteProgram(Program memory program) internal {\n    //1. check if the program is valid\n    require(validateVoteProgram(program), \"Invalid vote program\");\n\n\n    //2. execute the program (vote) directly, do not use execute() function\n    // execute(program); // do not use execute() function\n    vote(program.operations[0].operatorAddress, program.operations[0].param.BOOL_ARRAY);\n  }\n\n  function executePendingProgram(Program memory program) internal {\n    //1. check if the program is valid\n    require(validateExecutePendingProgram(program), \"Invalid program\");\n    require(votingItems[latestVotingItemIndex].bIsProgramExecuted == false, \"The pending program has been executed, and should not be executed again.\");\n\n    // change the state back to idle\n    finiteState = FiniteState.IDLE;\n\n    // change the latest voting item bIsProgramExecuted to true\n    votingItems[latestVotingItemIndex].bIsProgramExecuted = true;\n\n    //2. execute the program(executing pending) directly, do not use execute() function\n    executeProgram_Executable(votingItems[latestVotingItemIndex].program, false);\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Runtime/VotingMachine/VotingMachine.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"../../MachineState.sol\";\nimport \"../../MachineStateManager.sol\";\n\nimport \"@openzeppelin/contracts-upgradeable/utils/math/SafeMathUpgradeable.sol\";\n\nenum VotingStatus {\n  Ended_AND_Passed,\n  Ended_AND_Failed,\n  Ongoing\n}\n\nstruct VotingItem {\n  /**\n   * @notice The  program that is being voted on\n   */\n  Program program;\n\n  /**\n   * @notice The list of voting rules indices that are being used in Current Machine State\n   * For example, if the current machine state has 3 voting rules [3, 4, 5]\n   * then the voting rules to be used in this voting item are \n   * currentMachinState.votingRuleList[3]\n   * currentMachinState.votingRuleList[4]\n   * currentMachinState.votingRuleList[5]\n   */\n  uint256[] votingRuleIndices;\n\n  /**\n   * @notice The current yes votes for each voting rule\n   */\n  uint256[] powerYes;\n\n  /**\n   * @notice The current no votes for each voting rule\n   */\n  uint256[] powerNo;\n\n  /**\n   * @notice The total power of all votable tokens in each voting rule\n   * For example, voting rule 1 is for the token A,B,C, \n   * each with supply 1000, 2000, 3000 and voting weight 100, 10, 1,\n   * then totalPower[1] = 1000*100 + 2000*10 + 3000*1 = 123000\n   */\n  uint256[] totalPower;\n\n  /**\n   * @notice The end timestamp of the voting period\n   */\n  uint256 votingEndTime;\n\n  /**\n   * @notice The end timestamp of the executing the pending program period\n   */\n  uint256 executingEndTime;\n\n  /**\n   * @notice The status progress of the voting: \n   * ongoing, ended and passed, ended and failed\n   */\n  VotingStatus votingStatus;\n\n  /**\n   * @notice If the program has been executed\n   */\n  bool bIsProgramExecuted;\n\n}\n\n\ncontract VotingMachine is MachineStateManager {\n\n  /**\n   * @notice Each voting program, policies and results\n   */\n  \n  mapping(uint256 => VotingItem) public votingItems;\n\n  /**\n   * @notice If address has voted for the voting item with index i,\n   * and if so, voted[address][i] = true\n   */\n  mapping(address => mapping(uint256 => bool)) public voted;\n\n  /**\n   * @notice the latest index of the voting item\n   */\n  uint256 public latestVotingItemIndex;\n\n  /**\n   * @notice determine if the current state is in the voting period\n   */\n  function isVotingProcesss() internal view returns (bool) {\n    return finiteState == FiniteState.VOTING;\n  } \n\n  /**\n   * @notice start the voting period\n   */\n  function initializeVoting(uint256[] memory votingRuleIndices, Program memory currentProgram) internal {\n    // make sure the voting period is not in progress\n    require(!isVotingProcesss(), \"voting is already in progress\");\n\n    finiteState = FiniteState.VOTING;  // update the finite state\n    latestVotingItemIndex = latestVotingItemIndex + 1;  // update the latest voting item index\n\n    // construct a new voting item\n    initializeVotingItem(votingRuleIndices, currentProgram);\n  }\n\n  /**\n   * @notice initialize a voting item\n   * @param votingRuleIndices the voting rule indices that are being used\n   */\n  function initializeVotingItem(uint256[] memory votingRuleIndices, Program memory currentProgram) private {\n    // calculate the shortest voting duration\n    uint256 minVotingDuration = minVotingDurationInSeconds(votingRuleIndices);\n\n    uint256 minExecutingDuration = minExecutePendingProgramDurationInSeconds(votingRuleIndices);\n\n    bool bIsValid = false;\n    \n    // initialize the voting item\n    votingItems[latestVotingItemIndex] = VotingItem({\n      program: currentProgram,\n      votingRuleIndices: new uint256[](votingRuleIndices.length),\n      powerYes: new uint256[](votingRuleIndices.length),\n      powerNo: new uint256[](votingRuleIndices.length),\n      totalPower: new uint256[](votingRuleIndices.length),\n      votingEndTime: 0,\n      executingEndTime: 0,\n      votingStatus: VotingStatus.Ongoing,\n      bIsProgramExecuted: false\n    });\n\n    uint256 resultVotingDeadline = 0;\n    (bIsValid, resultVotingDeadline) = SafeMathUpgradeable.tryAdd(\n      block.timestamp, \n      minVotingDuration);\n    require(bIsValid, \"voting end time overflow\");\n\n    // update the voting end time in the voting items map \n    votingItems[latestVotingItemIndex].votingEndTime = resultVotingDeadline;\n\n    // update the voting end time in the machine state manager\n    votingDeadline = resultVotingDeadline;\n\n    uint256 resultExecutionPendingDeadline = 0;\n    (bIsValid, resultExecutionPendingDeadline) = SafeMathUpgradeable.tryAdd(\n      votingItems[latestVotingItemIndex].votingEndTime,\n      minExecutingDuration\n    );\n    require(bIsValid, \"executing end time overflow\");\n\n    // update the executing end time in the voting items map\n    votingItems[latestVotingItemIndex].executingEndTime = resultExecutionPendingDeadline;\n\n    // update the executing end time in the machine state manager\n    executingPendingDeadline = resultExecutionPendingDeadline;\n\n    // update the voting status in the voting items map\n    votingItems[latestVotingItemIndex].votingStatus = VotingStatus.Ongoing;\n    for (uint256 i = 0; i < votingRuleIndices.length; i++) {\n      votingItems[latestVotingItemIndex].votingRuleIndices[i] = votingRuleIndices[i];\n    }\n\n    // initialize the voting power of each voting rule\n    for (uint256 i = 0; i < votingRuleIndices.length; i++) {\n      // get the length of the token class list of current voting rule\n      uint256 length = currentMachineState.votingRuleList[votingItems[latestVotingItemIndex].votingRuleIndices[i]].votingTokenClassList.length;\n\n      // get the token classes index list of current voting rule\n      uint256[] memory tokenClassIndices = new uint256[](length);\n      for (uint256 j = 0; j < length; j++) {\n        tokenClassIndices[j] = currentMachineState.votingRuleList[votingItems[latestVotingItemIndex].votingRuleIndices[i]].votingTokenClassList[j];\n      }\n\n      // get the total power of current voting rule\n      uint256 totalPower = totalVoingPower(tokenClassIndices);\n      votingItems[latestVotingItemIndex].totalPower[i] = totalPower;\n    }\n  }\n\n  /**\n   * @notice Do the vote, calculate the power of the voter and update the voting result\n   * @param voter the address of the voter\n   * @param votes the list of votes, true for yes, false for no\n   */\n  function vote(address voter, bool[] memory votes) internal {\n    require(isVotingProcesss(), \"voting is not in progress\");\n    require(!voted[voter][latestVotingItemIndex], \"voter has already voted\");\n    require(votes.length == votingItems[latestVotingItemIndex].votingRuleIndices.length,\n     \"the number of votes does not match the number of policies\");\n\n    // set the boolean voted to true\n    voted[voter][latestVotingItemIndex] = true;\n\n    // update the voted status\n    bool bIsValid = false;\n    for (uint256 i = 0; i < votes.length; i++) {\n      uint256 votingRuleIndex = votingItems[latestVotingItemIndex].votingRuleIndices[i];\n      if (votes[i]) {\n        (bIsValid, votingItems[latestVotingItemIndex].powerYes[i]) = SafeMathUpgradeable.tryAdd(\n          votingItems[latestVotingItemIndex].powerYes[i], \n          powerOf(voter, votingRuleIndex));\n        require(bIsValid, \"voting for powerYes overflow\");\n      } else {\n        (bIsValid, votingItems[latestVotingItemIndex].powerNo[i]) = SafeMathUpgradeable.tryAdd(\n          votingItems[latestVotingItemIndex].powerNo[i], \n          powerOf(voter, votingRuleIndex));\n        require(bIsValid, \"voting for powerNo overflow\");\n      }\n    }\n\n    // after the vote, check if the voting period has ended\n    tryEndVotingBeforeVotingDeadline();\n  }\n\n  /**\n   * @notice Calculate the power of a voter for one current voting item.\n   * For example, voting rule X needs token class 1,2,3 to vote,\n   * and voter has 1000 token class 1, 2000 token class 2, 3000 token class 3,\n   * with power multiplier 100,1,20,\n   * then the power of the voter is 1000 * 100 + 2000 * 1 + 3000 * 20 = 52000\n   * @param voter The address of the voter\n   * @param currentVotingRuleIdx The index of the current voting item\n   */\n  function powerOf(address voter, uint256 currentVotingRuleIdx) internal view returns (uint256){\n    uint256 totalPower = 0;\n    bool bIsValid = false;\n    uint256 power = 0;\n\n    // get current voting rule\n    VotingRule memory currentVotingRule = currentMachineState.votingRuleList[currentVotingRuleIdx];\n\n    // iterate through all token class index, sum up the power of the voter\n    for (uint256 tokenClassIdx = 0; tokenClassIdx < currentVotingRule.votingTokenClassList.length; tokenClassIdx++) {\n\n      // current token class\n      uint256 currentTokenClass = currentVotingRule.votingTokenClassList[tokenClassIdx];\n      // get the number of token\n      uint256 numberOfTokens = currentMachineState.tokenList[currentTokenClass].tokenBalance[voter];\n\n      // get the voting weight\n      uint256 weight = currentMachineState.tokenList[currentTokenClass].votingWeight;\n\n      // get the power of voter for this token class = number of tokens * voting weight\n      (bIsValid, power) = SafeMathUpgradeable.tryMul(numberOfTokens, weight);\n      require(bIsValid, \"power overflow\");\n\n      // add current power power to the total power\n      (bIsValid, totalPower) = SafeMathUpgradeable.tryAdd(totalPower, power);\n      require(bIsValid, \"total power overflow\");\n    }\n    return totalPower;\n  }\n\n  /**\n   * @notice Try to end the voting period if the voting period has not ended.\n   * This function is called before the voting deadline expires and every time a vote is casted.\n   * 1. If any abosolute majority vote is rejected, terminate the voting process\n   *   before the voting deadline and change the finite state to IDLE;\n   * 2. If all voting rules are absolute majority and passed, change the finite state to EXECUTING_PENDING;\n   */\n  function tryEndVotingBeforeVotingDeadline() internal {\n    // 1. go through all voting rules, check if any voting rule is absolute majority and rejected\n    for (uint256 i = 0; i < votingItems[latestVotingItemIndex].votingRuleIndices.length; i++) {\n      if (currentMachineState.votingRuleList[votingItems[latestVotingItemIndex].votingRuleIndices[i]].bIsAbsoluteMajority) {\n        // get the approval threshold percentage\n        uint256 threshold = currentMachineState.votingRuleList[votingItems[latestVotingItemIndex].votingRuleIndices[i]].approvalThresholdPercentage;\n\n        // calculate the total voting power\n        uint256 totalVotingPower = votingItems[latestVotingItemIndex].totalPower[i];\n\n        // get the current no votes\n        uint256 currentNo = votingItems[latestVotingItemIndex].powerNo[i];\n\n        // determine if the voting rule is rejected\n        bool bIsRejected = false;\n        if (currentNo * 100 > totalVotingPower * threshold) {\n          bIsRejected = true;\n        }\n\n        // if the voting rule is rejected, terminate the voting process and change the finite state to IDLE\n        if (bIsRejected) {\n          votingItems[latestVotingItemIndex].votingStatus = VotingStatus.Ended_AND_Failed;\n          finiteState = FiniteState.IDLE;\n          votingDeadline = 0;\n          executingPendingDeadline = 0;\n          return;\n        }\n      }\n    }\n\n    // 2. go through all voting rules, check if all voting rules are absolute majority and passed\n    for (uint256 i = 0; i < votingItems[latestVotingItemIndex].votingRuleIndices.length; i++) {\n\n      // if any of the voting is not absolute majority, just finish the function and return\n      if (!currentMachineState.votingRuleList[votingItems[latestVotingItemIndex].votingRuleIndices[i]].bIsAbsoluteMajority) {\n        return;\n      }\n\n      // now the i-th vote must be absolute majority.\n      // if any of the voting is not passed, just finish the function and return\n      if (checkVotingResult(i) != VotingStatus.Ended_AND_Passed) {\n        return;\n      }\n    }\n\n    // 3. OK, now all the voting rules are absolute majority and passed, change the finite state to EXECUTING_PENDING\n    finiteState = FiniteState.EXECUTING_PENDING;\n    votingItems[latestVotingItemIndex].votingStatus = VotingStatus.Ended_AND_Passed;\n  }\n\n  /**\n   * @notice Try to check the final voting results and end the voting period if the voting period has ended\n   * This function is called after the voting deadline expires.\n   * 1. If any vote is not passed after the voting deadline, change the finite state to IDLE;\n   * 2. If all votes are passed after the voting deadline, change the finite state to EXECUTING_PENDING;\n   */\n  function tryEndVotingAfterVotingDeadline() internal {\n\n    VotingStatus[] memory result = checkVotingResults();\n    for (uint256 i = 0; i < result.length; i++) {\n\n      // if any voting rule failed, the whole voting process failed,\n      // change the finite state to IDLE\n      if (result[i] == VotingStatus.Ended_AND_Failed) {\n        finiteState = FiniteState.IDLE;\n        votingDeadline = 0;\n        executingPendingDeadline = 0;\n        return;\n      }\n    }\n\n    // if all voting rules passed, change the finite state to PENDING if timestamp < executingPendingDeadline\n    if (block.timestamp < executingPendingDeadline) {\n      finiteState = FiniteState.EXECUTING_PENDING;\n      votingDeadline = 0;\n    } else {\n      // if timestamp >= executingPendingDeadline, change the finite state to IDLE\n      finiteState = FiniteState.IDLE;\n      votingDeadline = 0;\n      executingPendingDeadline = 0;\n    }\n  } \n\n  /**\n   * @notice Find the minimum voting duration in a list of voting policies in seconds\n   * @param votingRuleIndices the voting rule indices\n   */\n  function minVotingDurationInSeconds(uint256[] memory votingRuleIndices) private view returns (uint256){\n    uint256 minDuration =  2**256 - 1; // the largest uint256\n    for (uint256 i = 0; i < votingRuleIndices.length; i++) {\n\n      // the voting rule index must be valid, less than the length of the voting rule list\n      // if the voting rule index is invalid, throw exception with index and voting rule list length\n      require(votingRuleIndices[i] < currentMachineState.votingRuleList.length, \n        \"voting rule index out of range\");\n      if ( currentMachineState.votingRuleList[votingRuleIndices[i]].votingDurationInSeconds < minDuration) {\n        minDuration = currentMachineState.votingRuleList[votingRuleIndices[i]].votingDurationInSeconds;\n      }\n    }\n    return minDuration;\n  }\n\n  /**\n   * @notice Find the minimum executing pending program duration in a list of voting policies in seconds\n   * @param votingRuleIndices   the voting rule indices\n   */\n  function minExecutePendingProgramDurationInSeconds(uint256[] memory votingRuleIndices) private view returns (uint256){\n    uint256 minDuration =  2**256 - 1; // the largest uint256\n    for (uint256 i = 0; i < votingRuleIndices.length; i++) {\n\n      // the voting rule index must be valid, less than the length of the voting rule list\n      // if the voting rule index is invalid, throw exception with index and voting rule list length\n      require(votingRuleIndices[i] < currentMachineState.votingRuleList.length, \n        \"voting rule index out of range\");\n      if (currentMachineState.votingRuleList[votingRuleIndices[i]].executionPendingDurationInSeconds < minDuration) {\n        minDuration = currentMachineState.votingRuleList[votingRuleIndices[i]].executionPendingDurationInSeconds;\n      }\n    }\n    return minDuration;\n  }\n\n  /**\n   * @notice Calculate the total voting power of a list of token classes\n   * For example, if token class 1 has 1000 tokens, token class 2 has 2000 tokens,\n   * then the total voting power is 1*1000 + 2*2000 = 5000\n   * @param tokenClassIndices the indices of the token classes\n   */\n  function totalVoingPower(uint256[] memory tokenClassIndices) private view returns (uint256) {\n    uint256 totalVotingPower = 0;\n    uint256 currentClassVotingPower = 0;\n    bool bIsValid = false;\n    for (uint256 i = 0; i < tokenClassIndices.length; i++) {\n      (bIsValid, currentClassVotingPower) = SafeMathUpgradeable.tryMul(\n        currentMachineState.tokenList[tokenClassIndices[i]].votingWeight, \n        currentMachineState.tokenList[tokenClassIndices[i]].totalSupply);\n      require(bIsValid, \"currentClassVotingPower overflow\");\n      (bIsValid, totalVotingPower) = SafeMathUpgradeable.tryAdd(totalVotingPower, \n        currentClassVotingPower);\n      require(bIsValid, \"totalVotingPower overflow\");\n    }\n    return totalVotingPower;\n  }\n\n\n\n  /**\n   * @notice Check the voting state of all the voting rules\n   */\n  function checkVotingResults() internal view returns (VotingStatus[] memory) {  \n    VotingStatus[] memory votingStatus = new VotingStatus[](votingItems[latestVotingItemIndex].votingRuleIndices.length);\n    for (uint256 i = 0; i < votingItems[latestVotingItemIndex].votingRuleIndices.length; i++) {\n      votingStatus[i] = checkVotingResult(i);\n    }\n    return votingStatus;\n  }\n\n  /**\n   * @notice Check if the voting is in progress by checking the total voting power of YES and NO and compare \n   * with the total voting power. This function is not related in any way to the voting duration and current\n   * mmachine state. The DARC Voting Machine will change the voting state by checking this function.\n   * return Ended_AND_Passed if the voting is ended and passed\n   * return Ended_AND_Failed if the voting is ended and failed\n   * No \"OnGoing\" state because the voting machine will check this function to change the state\n   * @param idx the index of voting item(which can be the voting rule index's index, or also the index of powerYes, powerNo, totalPower's index)\n   */\n  function checkVotingResult(uint256 idx) internal view returns (VotingStatus) {\n    bool bIsValid = false;\n    uint256 votingRuleIndex = votingItems[latestVotingItemIndex].votingRuleIndices[idx];\n    uint256 threshold = currentMachineState.votingRuleList[votingRuleIndex].approvalThresholdPercentage;\n    uint256 currentYes = votingItems[latestVotingItemIndex].powerYes[idx];\n    uint256 currentNo = votingItems[latestVotingItemIndex].powerNo[idx];\n    uint256 totalVotingPower = votingItems[latestVotingItemIndex].totalPower[idx];\n\n\n    // if this voting rule is absolute majority,\n    // then currentYes / totalVotingPower > threshold % will pass the voting\n    uint256 leftValue = 0;\n    uint256 rightValue = 0;\n    if (currentMachineState.votingRuleList[votingRuleIndex].bIsAbsoluteMajority){\n      // currentYes * 100 > totalVotingPower * threshold\n      (bIsValid, leftValue) = SafeMathUpgradeable.tryMul(currentYes, 100);\n      require(bIsValid, \"currentYes overflow\");\n      (bIsValid, rightValue) = SafeMathUpgradeable.tryMul(threshold, totalVotingPower);\n      require(bIsValid, \"currentYes overflow\");\n      if (leftValue > rightValue) {\n        return VotingStatus.Ended_AND_Passed;\n      } else {\n        return VotingStatus.Ended_AND_Failed;\n      }  \n    } \n\n    // otherwise, the voting will pass if currentYes / （currentYes + currentNo) > threshold %,\n    // which means the voting will pass if currentYes * 100 > (currentYes + currentNo) * threshold\n\n    (bIsValid, leftValue) = SafeMathUpgradeable.tryMul(currentYes, 100);\n    require(bIsValid, \"currentYes overflow\");\n    (bIsValid, rightValue) = SafeMathUpgradeable.tryMul(threshold, currentYes + currentNo);\n    require(bIsValid, \"currentYes overflow\");\n    if (leftValue > rightValue) {\n      return VotingStatus.Ended_AND_Passed;\n    } else {\n      return VotingStatus.Ended_AND_Failed;\n    }\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/TokenOwnerListManager.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"./MachineState.sol\";\nimport \"./Plugin.sol\";\nimport \"./MachineStateManager.sol\";\nimport \"./Utilities/ArrayUtils.sol\";\n\n/**\n * @title Token Owner List Manager\n * @notice This is the core protocol that adds new token owners to the token owner list or \n * remove the token owners from the token owner list if the balance of the token owner is zero\n * for token level = tokenLevel.\n */\n\ncontract TokenOwnerListManager is MachineStateManager {\n  /**\n   * @notice This is the core protocol that adds new token owners to the token owner list\n   * and remove the token owners from the token owner list if the balance of the token owner is zero\n   * for token level = tokenLevel.\n   * \n   * This is because some of the owners transfer their tokens to others, so there are some new owners whose \n   * balance is not zero, and some old owners whose balance is zero.\n   * \n   * This function is called after the operation or mint/burn/transfer/transferFrom/\n   * pay_to_mint/pay_to_transfer is executed successfully.\n   * \n   * The reason for this function is to update the token owner list of each certain token level efficiently,\n   * which provides an up-to-date list of keys for token balance mapping.\n   * \n   * For example, the existing token owner list is [A,B,C,D,E],\n   * and the operator mint tokens to address [E,F,G], \n   * and burn all tokens from [A,B], then the new token owner list is [C,D,E,F,G].\n   * \n   * \n   * @param bIsSandbox The flag to indicate whether the operation is in the sandbox\n   * @param addOwnerList The list of owner addresses that receive more tokens\n   * @param removeOwnerList The list of owner addresses that transfer all tokens to others and balance is (probably) zero\n   * @param tokenLevel The level of the token\n   */\n  function updateTokenOwnerList(bool bIsSandbox, address[] memory addOwnerList, address[] memory removeOwnerList, uint256 tokenLevel) internal {\n    if (bIsSandbox) {\n\n      // 1. Initialize two lists: toAddInit and toRemoveInit\n      address[] memory toAdd = new address[](addOwnerList.length);\n      uint256 toAddIndex;\n      address[] memory toRemove = new address[](removeOwnerList.length);\n      uint256 toRemoveIndex;\n\n\n\n      // 2. Check if the token owner list contains any address in the addOwnerList, \n      // if any address in the addOwnerList is not in the token owner list, \n      // and the balance of this address is not zero, then just add it to the toAdd list\n      for (uint256 index; index < addOwnerList.length;index++) {\n        if ((!tokenOwnerListContainsKeyAddress(bIsSandbox, tokenLevel, addOwnerList[index]))\n          && (sandboxMachineState.tokenList[tokenLevel].tokenBalance[addOwnerList[index]] > 0)\n         ) {\n          toAdd[toAddIndex] = addOwnerList[index];\n          toAddIndex++;\n        }\n      }\n\n      // 3. Check if the addresses in removeOwnerList are with zero balance,\n      // and if so, add them to the toRemove list\n      for (uint256 index; index < removeOwnerList.length;index++) {\n        if (sandboxMachineState.tokenList[tokenLevel].tokenBalance[removeOwnerList[index]] == 0) {\n          toRemove[toRemoveIndex] = removeOwnerList[index];\n          toRemoveIndex++;\n        }\n      }\n\n      //4. construct the final list with all items from toRemove removed and all items from toAdd added\n      address[] memory finalList = new address[](sandboxMachineState.tokenList[tokenLevel].ownerList.length + toAddIndex);\n      uint256 pt;\n      for (uint256 index; index < sandboxMachineState.tokenList[tokenLevel].ownerList.length;index++) {\n        if (!ArrayUtils.inArray(toRemove, sandboxMachineState.tokenList[tokenLevel].ownerList[index])) {\n          finalList[pt] = sandboxMachineState.tokenList[tokenLevel].ownerList[index];\n          pt++;\n        }\n      }\n\n      for (uint256 index; index < toAddIndex;index++) {\n        finalList[pt] = toAdd[index];\n        pt++;\n      }\n\n      // 5. Update the token owner list\n      sandboxMachineState.tokenList[tokenLevel].ownerList = finalList;\n\n    } else {\n        \n      // 1. Initialize two lists: toAddInit and toRemoveInit\n      address[] memory toAdd = new address[](addOwnerList.length);\n      uint256 toAddIndex;\n      address[] memory toRemove = new address[](removeOwnerList.length);\n      uint256 toRemoveIndex;\n\n      // 2. Check if the token owner list contains any address in the addOwnerList, \n      // if any address in the addOwnerList is not in the token owner list, \n      // and the balance of this address is not zero, then just add it to the toAdd list\n      for (uint256 index; index < addOwnerList.length;index++) {\n        if ((!tokenOwnerListContainsKeyAddress(bIsSandbox, tokenLevel, addOwnerList[index]))\n          && (currentMachineState.tokenList[tokenLevel].tokenBalance[addOwnerList[index]] > 0)\n        ) {\n          toAdd[toAddIndex] = addOwnerList[index];\n          toAddIndex++;\n        }\n      }\n\n      // 3. Check if the addresses in removeOwnerList are with zero balance,\n      // and if so, add them to the toRemove list\n      for (uint256 index; index < removeOwnerList.length;index++) {\n        if (currentMachineState.tokenList[tokenLevel].tokenBalance[removeOwnerList[index]] == 0) {\n          toRemove[toRemoveIndex] = removeOwnerList[index];\n          toRemoveIndex++;\n        }\n      }\n\n      //4. construct the final list with all items from toRemove removed and all items from toAdd added\n      address[] memory finalList = new address[](currentMachineState.tokenList[tokenLevel].ownerList.length + toAddIndex);\n      uint256 pt;\n      for (uint256 index; index < currentMachineState.tokenList[tokenLevel].ownerList.length;index++) {\n        if (!ArrayUtils.inArray(toRemove, currentMachineState.tokenList[tokenLevel].ownerList[index])) {\n          finalList[pt] = currentMachineState.tokenList[tokenLevel].ownerList[index];\n          pt++;\n        }\n      }\n\n      for (uint256 index; index < toAddIndex;index++) {\n        finalList[pt] = toAdd[index];\n        pt++;\n      }\n\n      // 5. Update the token owner list\n      currentMachineState.tokenList[tokenLevel].ownerList = finalList;\n    }\n  }\n\n  /**\n   * Check if the token owner list contains the key address\n   * @param bIsSandbox If the operation is in the sandbox\n   * @param tokenLevel The level of the token\n   * @param key The key address\n   */\n  function tokenOwnerListContainsKeyAddress(bool bIsSandbox, uint256 tokenLevel, address key) view internal returns (bool) {\n    if (bIsSandbox) {\n      for (uint256 index; index < sandboxMachineState.tokenList[tokenLevel].ownerList.length;index++) {\n        if (sandboxMachineState.tokenList[tokenLevel].ownerList[index] == key) {\n          return true;\n        }\n      }\n      return false;\n    } else {\n      for (uint256 index; index < currentMachineState.tokenList[tokenLevel].ownerList.length;index++) {\n        if (currentMachineState.tokenList[tokenLevel].ownerList[index] == key) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }  \n}\n"
  },
  {
    "path": "darc-protocol/contracts/protocol/Utilities/ArrayUtils.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nlibrary ArrayUtils {\n  /**\n   * The function to check if the address is in the list\n   * @param array The list to be checked\n   * @param key The key address to be checked\n   */\n  function inArray(address[] memory array, address key) pure internal returns (bool) {\n    for (uint256 index = 0; index < array.length; index++) {\n      if (array[index] == key) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * The function to remove the duplicate address from the array\n   * @param array The array to be checked\n   */\n  function removeDuplicateAddressFromArray(address[] memory array) pure internal returns (address[] memory) {\n    uint256 length = array.length;\n    for (uint256 i = 0; i < length - 1; i++) {\n      for (uint256 j = i + 1; j < length; j++) {\n        if (array[i] == array[j]) {\n          array[j] = array[length - 1];\n          length--;\n          j--;\n        }\n      }\n    }\n    address[] memory arrayNew = new address[](length);\n    for (uint256 i = 0; i < length; i++) {\n      arrayNew[i] = array[i];\n    }\n    return arrayNew;\n  }\n\n  /**\n   * The function to remove the duplicate uint256 from the array\n   * @param array The array to be checked\n   */\n  function removeDuplicateIntFromArray(uint256[] memory array) pure internal returns (uint256[] memory) {\n    uint256 length = array.length;\n    for (uint256 i = 0; i < length - 1; i++) {\n      for (uint256 j = i + 1; j < length; j++) {\n        if (array[i] == array[j]) {\n          array[j] = array[length - 1];\n          length--;\n          j--;\n        }\n      }\n    }\n    uint256[] memory arrayNew = new uint256[](length);\n    for (uint256 i = 0; i < length; i++) {\n      arrayNew[i] = array[i];\n    }\n    return arrayNew;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Utilities/ErrorMsg.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nlibrary ErrorMsg{\n\n  function By(uint256 val) internal pure returns (string memory){\n    if (val == 1){\n      return \"Invalid Parameters\";\n    }\n    else if (val == 2){\n      return \"No enough balance\";\n    }\n    else if (val == 3) {\n      return \"Invalid program/operation addr\";\n    }\n    else if (val == 4) {\n      return \"Token amount overflow\";\n    }\n    else if (val == 5) {\n      return \"Member already exists\";\n    }\n    else if (val == 6) {\n      return \"Member is already suspended\";\n    }\n    else if (val == 7) {\n      return \"Member does not exist\";\n    }\n    else if (val == 8) {\n      return \"Member is not suspended\";\n    }\n    else if (val == 9) {\n      return \"Invalid parameter to set\";\n    }\n    else if (val == 10) {\n      return \"dividendable balance overflow when processing cash\";\n    }\n    else if (val == 11) {\n      return \"dividends counter overflow\";\n    }\n    else if (val == 12) {\n      return \"dividends operation overflow\";\n    }\n    else if (val == 15) {\n      return \"Invalid dividend permyriad per transaction. Should be less than 1000\";\n    }\n    else if (val == 16) {\n      return \"No enough number of transactions for dividends yet\";\n    }\n    else if (val == 17) {\n      return \"Error in withdrawable cash calculation\";\n    }\n    return \"Unknown Error\";\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Utilities/ExternalValueReader.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nlibrary ExternalValueReader {\n\n  function tryReadUINT256(address _contract, bytes memory _data) internal view returns (bool, uint256) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, 0);\n    }\n    return (true, abi.decode(returnData, (uint256)));\n  }\n\n  function tryReadAddress(address _contract, bytes memory _data) internal view returns (bool, address) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, address(0));\n    }\n    return (true, abi.decode(returnData, (address)));\n  }\n\n  function tryReadBytes32(address _contract, bytes memory _data) internal view returns (bool, bytes32) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, bytes32(0));\n    }\n    return (true, abi.decode(returnData, (bytes32)));\n  }\n\n  function tryReadBytes(address _contract, bytes memory _data) internal view returns (bool, bytes memory) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, new bytes(0));\n    }\n    return (true, returnData);\n  }\n\n  function tryReadString(address _contract, bytes memory _data) internal view returns (bool, string memory) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, \"\");\n    }\n    return (true, abi.decode(returnData, (string)));\n  }\n\n  function tryReadBool(address _contract, bytes memory _data) internal view returns (bool, bool) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, false);\n    }\n    return (true, abi.decode(returnData, (bool)));\n  }\n\n  function tryReadInt(address _contract, bytes memory _data) internal view returns (bool, int) {\n    (bool success, bytes memory returnData) = _contract.staticcall(_data);\n    if (!success) {\n      return (false, 0);\n    }\n    return (true, abi.decode(returnData, (int)));\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Utilities/OpcodeMap.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"../Opcodes.sol\";\n\n/**\n * @title Opcode Map Utility Functions\n * @author DARC Team\n * @notice A library of functions to translate from opcode enum to opcode uint256/string\n */\nlibrary OpcodeMap{\n\n  /**\n   * @notice Translate from opcode enum to opcode uint256\n   * @param opcode opcode enum\n   */\n  function opcodeVal(EnumOpcode opcode) internal pure returns (uint256) {\n    if (opcode == EnumOpcode.UNDEFINED) return 0;\n    if (opcode == EnumOpcode.BATCH_MINT_TOKENS) return 1;\n    if (opcode == EnumOpcode.BATCH_CREATE_TOKEN_CLASSES) return 2;  \n    if (opcode == EnumOpcode.BATCH_TRANSFER_TOKENS) return 3;\n    if (opcode == EnumOpcode.BATCH_TRANSFER_TOKENS_FROM_TO) return 4;\n    if (opcode == EnumOpcode.BATCH_BURN_TOKENS) return 5;\n    if (opcode == EnumOpcode.BATCH_BURN_TOKENS_FROM) return 6;\n    if (opcode == EnumOpcode.BATCH_ADD_MEMBERSHIPS) return 7;\n    if (opcode == EnumOpcode.BATCH_SUSPEND_MEMBERSHIPS) return 8;\n    if (opcode == EnumOpcode.BATCH_RESUME_MEMBERSHIPS) return 9;\n    if (opcode == EnumOpcode.BATCH_CHANGE_MEMBER_ROLES) return 10;\n    if (opcode == EnumOpcode.BATCH_CHANGE_MEMBER_NAMES) return 11;\n    if (opcode == EnumOpcode.BATCH_ADD_PLUGINS) return 12;\n    if (opcode == EnumOpcode.BATCH_ENABLE_PLUGINS) return 13;\n    if (opcode == EnumOpcode.BATCH_DISABLE_PLUGINS) return 14;\n    if (opcode == EnumOpcode.BATCH_ADD_AND_ENABLE_PLUGINS) return 15;\n    if (opcode == EnumOpcode.BATCH_SET_PARAMETERS) return 16;\n    if (opcode == EnumOpcode.BATCH_ADD_WITHDRAWABLE_BALANCES) return 17;\n    if (opcode == EnumOpcode.BATCH_REDUCE_WITHDRAWABLE_BALANCES) return 18;\n    if (opcode == EnumOpcode.BATCH_ADD_VOTING_RULES) return 19;\n    if (opcode == EnumOpcode.BATCH_PAY_TO_MINT_TOKENS) return 20;\n    if (opcode == EnumOpcode.BATCH_PAY_TO_TRANSFER_TOKENS) return 21;\n    if (opcode == EnumOpcode.ADD_EMERGENCY) return 22;\n    if (opcode == EnumOpcode.RESERVED_ID_23) return 23;\n    if (opcode == EnumOpcode.CALL_EMERGENCY) return 24;\n    if (opcode == EnumOpcode.CALL_CONTRACT_ABI) return 25;\n    if (opcode == EnumOpcode.PAY_CASH) return 26;\n    if (opcode == EnumOpcode.OFFER_DIVIDENDS) return 27;\n    if (opcode == EnumOpcode.RESERVED_ID_28) return 28;\n    if (opcode == EnumOpcode.SET_APPROVAL_FOR_ALL_OPERATIONS) return 29;\n    if (opcode == EnumOpcode.BATCH_BURN_TOKENS_AND_REFUND) return 30;\n    if (opcode == EnumOpcode.ADD_STORAGE_STRING) return 31;\n    if (opcode == EnumOpcode.VOTE) return 32;\n    if (opcode == EnumOpcode.EXECUTE_PENDING_PROGRAM) return 33;\n    if (opcode == EnumOpcode.END_EMERGENCY) return 34;\n    if (opcode == EnumOpcode.UPGRADE_TO_ADDRESS) return 35;\n    if (opcode == EnumOpcode.CONFIRM_UPGRAED_FROM_ADDRESS) return 36;\n    if (opcode == EnumOpcode.UPGRADE_TO_THE_LATEST) return 37;\n    return 0;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/Utilities/StringUtils.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\n\nlibrary StringUtils {\n    /// @notice Does a byte-by-byte lexicographical comparison of two strings.\n    /// @return a negative number if `_a` is smaller, zero if they are equal\n    /// and a positive numbe if `_b` is smaller.\n    function compareStrings(string memory _a, string memory _b) internal pure returns (bool) {\n        bytes memory a = bytes(_a);\n        bytes memory b = bytes(_b);\n        if (a.length != b.length) {\n            return false;\n        }\n        for (uint i = 0; i < a.length; i++) {\n            if (a[i] != b[i]) {\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function toAsciiString(address x) internal pure returns (string memory) {\n        bytes memory s = new bytes(40);\n        for (uint i = 0; i < 20; i++) {\n            bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));\n            bytes1 hi = bytes1(uint8(b) / 16);\n            bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\n            s[2*i] = char(hi);\n            s[2*i+1] = char(lo);            \n        }\n        return string(s);\n    }\n\n    function char(bytes1 b) internal pure returns (bytes1 c) {\n        if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\n        else return bytes1(uint8(b) + 0x57);\n    }\n}"
  },
  {
    "path": "darc-protocol/contracts/protocol/VirtualMachine.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"./MachineStateManager.sol\";\nimport \"./Program.sol\";\n\n// the core of the program executor\ncontract VirtualMachine is MachineStateManager { \n  // the state of the program executor\n\n  function executeDARCProgram(Program memory currentProgram ) public {\n    \n  }\n\n}"
  },
  {
    "path": "darc-protocol/contracts/test-contracts/TestBaseContract.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport \"../protocol/Runtime/Executable/Executable.sol\";\nimport \"../protocol/Runtime/Runtime.sol\";\nimport \"../protocol/Opcodes.sol\";\nimport \"../protocol/Dashboard/Dashboard.sol\";\n/**\n * @title The test contract of PluginJudgement\n * @author DARC Team\n * @notice Only used for testing\n */\ncontract TestBaseContract is Runtime, Dashboard {\n\n  function runProgramDirectly(Program memory currentProgram, bool bIsSandbox) public {\n    executeProgram_Executable(currentProgram, bIsSandbox);\n  }\n\n  function testExecute(Program memory currentProgram) public {\n    execute(currentProgram);\n  }\n\n  function testRuntimeEntrance(Program memory currentProgram) public {\n    runtimeEntrance(currentProgram);\n  }\n\n  function testCloneStateToSandbox() public {\n    cloneStateToSandbox();\n  }\n\n  function voteTest(address voter, bool[] memory votes) public{\n    require(isVotingProcesss(), \"voting is not in progress\");\n    require(!voted[voter][latestVotingItemIndex], \"voter has already voted\");\n    require(votes.length == votingItems[latestVotingItemIndex].votingRuleIndices.length,\n     \"the number of votes does not match the number of policies\");\n\n    // set the boolean voted to true\n    voted[voter][latestVotingItemIndex] = true;\n\n    // update the voted status\n    bool bIsValid = false;\n    for (uint256 i = 0; i < votes.length; i++) {\n      uint256 votingRuleIndex = votingItems[latestVotingItemIndex].votingRuleIndices[i];\n      if (votes[i]) {\n        (bIsValid, votingItems[latestVotingItemIndex].powerYes[i]) = SafeMathUpgradeable.tryAdd(\n          votingItems[latestVotingItemIndex].powerYes[i], \n          powerOf(voter, votingRuleIndex));\n        require(bIsValid, \"voting for powerYes overflow\");\n      } else {\n        (bIsValid, votingItems[latestVotingItemIndex].powerNo[i]) = SafeMathUpgradeable.tryAdd(\n          votingItems[latestVotingItemIndex].powerNo[i], \n          powerOf(voter, votingRuleIndex));\n        require(bIsValid, \"voting for powerNo overflow\");\n      }\n    }\n\n    // after the vote, check if the voting period has ended\n    tryEndVotingBeforeVotingDeadline();\n\n  }\n\n  function addVotingRule(VotingRule memory votingRule, bool bIsSandbox) public {\n    if (bIsSandbox) {\n      sandboxMachineState.votingRuleList.push(votingRule);\n    } else {\n      currentMachineState.votingRuleList.push(votingRule);\n    }\n  }\n\n  function getVoterPowerOfVotingRule(uint256 votingRuleIndex, address voterAddress) public view returns (uint256) {\n    return powerOf(voterAddress, votingRuleIndex);\n  }\n\n  function helper_createToken0AndMint() public {\n    // create a token class first\n    currentMachineState.tokenList[0].bIsInitialized = true;\n    currentMachineState.tokenList[0].tokenInfo = \"token_0\";\n    currentMachineState.tokenList[0].votingWeight = 1;\n    currentMachineState.tokenList[0].dividendWeight = 1;\n    currentMachineState.tokenList[0].totalSupply = 1000;\n\n    // mint 600 tokens to \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n    currentMachineState.tokenList[0].tokenBalance[0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266] = 600;\n\n    // mint 200 tokens to '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'\n    currentMachineState.tokenList[0].tokenBalance[0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC] = 200;\n\n    // mint 200 tokens to '0x90F79bf6EB2c4f870365E785982E1f101E93b906'\n    currentMachineState.tokenList[0].tokenBalance[0x90F79bf6EB2c4f870365E785982E1f101E93b906] = 200;\n\n    // add addresses to owner list\n    currentMachineState.tokenList[0].ownerList.push(0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);\n    currentMachineState.tokenList[0].ownerList.push(0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC);\n    currentMachineState.tokenList[0].ownerList.push(0x90F79bf6EB2c4f870365E785982E1f101E93b906);\n  }\n\n  /**\n   * Add a test program, read the return type of the program, and return the return type\n   * @param currentProgram The program to be executed and tested\n   * @return EnumReturnType The return type of the program\n   */\n  function checkProgram_beforeOp(Program memory currentProgram) public view returns (EnumReturnType) {\n    return checkBeforeOperationPlugins(currentProgram);\n  }\n\n  /**\n   * Add a test program, read the return type of the program, and return the return type\n   * @param currentProgram The program to be executed and tested\n   * @return EnumReturnType The return type of the program\n   * @return uint256[] The voting rule index list of the program, if the return type is VOTING_NEEDED\n   */\n  function checkProgram_afterOp(Program memory currentProgram) public view returns (EnumReturnType, uint256[] memory) {\n    (EnumReturnType afterReturnType, uint256[] memory afterRuleIdxList) = checkAfterOperationPlugins(currentProgram);\n    return (afterReturnType, afterRuleIdxList);\n  }\n\n  /**\n   * Directly add a plugin to the before operation plugin system\n   * @param plugin The before op plugin to be added\n   */\n  function addBeforeOpPlugin(Plugin memory plugin) public {\n    currentMachineState.beforeOpPlugins.push(plugin);\n  }\n\n  /**\n   * Directly add a plugin to the after operation plugin system\n   * @param plugin The after op plugin to be added\n   */\n  function addAfterOpPlugin(Plugin memory plugin) public {\n    currentMachineState.afterOpPlugins.push(plugin);\n  }\n\n  /**\n   * Directly execute program without checking the plugin system\n   * @param currentProgram The program to be executed\n   */\n  function executeProgram(Program memory currentProgram, bool bIsSandbox) public {\n    executeProgram_Executable(currentProgram, bIsSandbox);\n  }\n\n  function getBeforeOpPlugins() public view returns (Plugin[] memory) {\n    return currentMachineState.beforeOpPlugins;\n  }\n\n  function getAfterOpPlugins() public view returns (Plugin[] memory) {\n    return currentMachineState.afterOpPlugins;\n  }\n\n  function checkConditionExpressionNodeResult(bool bIsBeforeOperation, Operation memory operation, Program memory program, uint256 pluginIndex, uint256 nodeIndex) public view returns (bool) {\n    return checkConditionExpressionNode(bIsBeforeOperation, operation, program, pluginIndex, nodeIndex);\n  }\n\n  /**\n   * Test for pluginSystemJudgment from PluginSystem.sol\n   * @param bIsBeforeOperation The flag to indicate if the plugin is before operation plugin\n   * @param currentProgram The program to be executed\n   * @return EnumReturnType The return type of the program\n   * @return uint256[] The voting rule index list of the program, if the return type is VOTING_NEEDED\n   */\n  function pluginSystemJudgmentTest(bool bIsBeforeOperation, Program memory currentProgram) public view returns (EnumReturnType, uint256[] memory) {\n    return pluginSystemJudgment(bIsBeforeOperation, currentProgram);\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/test-contracts/TestOracleContract.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\ncontract TestOracleContract{\n  uint256 x;\n  constructor() {\n    x = 0;\n  }\n\n  function A_plus_B(uint256 a, uint256 b) public pure returns (uint256){\n    return a + b;\n  }\n\n  function StringA_concat_StringB(string memory a, string memory b) public pure returns (string memory){\n    return string(abi.encodePacked(a, b));\n  }\n\n  function is_X_1() public view returns (bool){\n    return x == 1;\n  }\n\n  function set_X(uint256 a) public{\n    x = a;\n  }\n\n  function get_X_plus(uint256 a) public view returns (uint256){\n    return x + a;\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/test-contracts/test-ABI-call/ABICallTestContract.sol",
    "content": "// SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.19;\ncontract ABICallTestContract {\n  uint256 public value1;\n  uint256 public value2;\n  string public str1;\n  string public str2;\n  address public addr1;\n  address public addr2;\n\n  function testCall1(\n    uint256 _value1,\n    uint256 _value2,\n    string memory _str1,\n    string memory _str2,\n    address _addr1,\n    address _addr2\n  ) public {\n    value1 = _value1;\n    value2 = _value2;\n    str1 = _str1;\n    str2 = _str2;\n    addr1 = _addr1;\n    addr2 = _addr2;\n  }\n\n  function testCall2(\n    uint256 _value1,\n    uint256 _value2,\n    string memory _str1,\n    string memory _str2,\n    address _addr1,\n    address _addr2\n  ) public payable {\n    value1 = _value1;\n    value2 = _value2;\n    str1 = _str1;\n    str2 = _str2;\n    addr1 = _addr1;\n    addr2 = _addr2;\n  }\n\n  function getValues() public view returns (\n    uint256,\n    uint256,\n    string memory,\n    string memory,\n    address,\n    address\n  ) {\n    return (value1, value2, str1, str2, addr1, addr2);\n  }\n}"
  },
  {
    "path": "darc-protocol/contracts/test-contracts/test-voting/VotingTest.sol.old",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport '../../protocol/Runtime/VotingMachine/VotingMachine.sol';\nimport '../../protocol/Runtime/Runtime.sol';\n\n\n/**\n * @title The single voting test contract of the voting machine\n * @author DARC Team\n * @notice null\n */\n\ncontract VotingTest is Runtime {\n  function initializeVotingTest() public {\n    this.initialize();\n  }\n\n  function votingTest_RunProgramDirectly(Program memory program, bool bIsSandbox) public {\n    executeProgram_Executable(program,bIsSandbox);\n  }\n\n  function votingTest_Execute(Program memory program) public {\n    execute(program);\n  }\n\n  function votingTest_\n\n  function runTest() public {\n    \n    // create a token class first\n    currentMachineState.tokenList[0].bIsInitialized = true;\n    currentMachineState.tokenList[0].tokenInfo = \"token_0\";\n    currentMachineState.tokenList[0].votingWeight = 1;\n    currentMachineState.tokenList[0].dividendWeight = 1;\n    currentMachineState.tokenList[0].totalSupply = 1000;\n\n    // mint 600 tokens to \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n    currentMachineState.tokenList[0].tokenBalance[0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266] = 600;\n\n    // mint 200 tokens to '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'\n    currentMachineState.tokenList[0].tokenBalance[0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC] = 200;\n\n    // mint 200 tokens to '0x90F79bf6EB2c4f870365E785982E1f101E93b906'\n    currentMachineState.tokenList[0].tokenBalance[0x90F79bf6EB2c4f870365E785982E1f101E93b906] = 200;\n\n    // add addresses to owner list\n    currentMachineState.tokenList[0].ownerList.push(0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);\n    currentMachineState.tokenList[0].ownerList.push(0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC);\n    currentMachineState.tokenList[0].ownerList.push(0x90F79bf6EB2c4f870365E785982E1f101E93b906);\n\n\n    // add a plugin to the before-op and after-op\n    // before-op: any operation need sandbox\n    // after-op: any operation need voting\n\n\n    // Plugin storage beforeOpPlugin = Plugin({\n    //   returnType: EnumReturnType.SANDBOX_NEEDED,\n    //   level: 5,\n    //   conditionNodes: new ConditionNode[](1),\n    //   votingRuleIndex: 0,\n    //   notes: \"test\",\n    //   bIsEnabled: true,\n    //   bIsBeforeOperation: true\n    // });\n\n    // beforeOpPlugin.conditionNodes[0] = ConditionNode({\n    //     id:0,\n    //     nodeType: EnumConditionNodeType.BOOLEAN_TRUE,\n    //     logicalOperator: EnumLogicalOperatorType.UNDEFINED,\n    //     conditionExpression: 0,\n    //     childList: new uint256[](0),\n    //     param: NodeParam({\n    //       STRING_ARRAY: new string[](0),\n    //       UINT256_2DARRAY: new uint256[][](0),\n    //       ADDRESS_2DARRAY: new address[][](0),\n    //       BYTES: new bytes(0)\n    //     })\n    //   });\n\n    currentMachineState.beforeOpPlugins.push(Plugin({\n      returnType: EnumReturnType.SANDBOX_NEEDED,\n      level: 5,\n      conditionNodes: new ConditionNode[](1),\n      votingRuleIndex: 0,\n      notes: \"test\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true\n    }));\n\n    currentMachineState.beforeOpPlugins[1].conditionNodes[0] = ConditionNode({\n        id:0,\n        nodeType: EnumConditionNodeType.BOOLEAN_TRUE,\n        logicalOperator: EnumLogicalOperatorType.UNDEFINED,\n        conditionExpression: 0,\n        childList: new uint256[](0),\n        param: NodeParam({\n          STRING_ARRAY: new string[](0),\n          UINT256_2DARRAY: new uint256[][](0),\n          ADDRESS_2DARRAY: new address[][](0),\n          BYTES: new bytes(0)\n        })\n      });\n\n    // add a voting rule\n    currentMachineState.votingRuleList.push(VotingRule({\n      votingTokenClassList: new uint256[](1),  \n      approvalThresholdPercentage: 50, // 50 percent to approve\n      votingDurationInSeconds: 1000,   // 1000 seconds to vote\n      executionPendingDurationInSeconds: 1000,  // 1000 seconds to execute\n      bIsEnabled: true,\n      notes: \"voting rule 0\",\n      bIsAbsoluteMajority: false\n    }));\n\n    currentMachineState.votingRuleList[0].votingTokenClassList[0] = 0; // class 0 token can vote\n\n\n    \n    currentMachineState.afterOpPlugins.push(Plugin({\n      returnType: EnumReturnType.VOTING_NEEDED,\n      level: 5,\n      conditionNodes: new ConditionNode[](1),\n      votingRuleIndex: 0,\n      notes: \"test\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false\n    }));\n\n    currentMachineState.afterOpPlugins[1].conditionNodes[0] = ConditionNode({\n        id:0,\n        nodeType: EnumConditionNodeType.BOOLEAN_TRUE,\n        logicalOperator: EnumLogicalOperatorType.UNDEFINED,\n        conditionExpression: 0,\n        childList: new uint256[](0),\n        param: NodeParam({\n          STRING_ARRAY: new string[](0),\n          UINT256_2DARRAY: new uint256[][](0),\n          ADDRESS_2DARRAY: new address[][](0),\n          BYTES: new bytes(0)\n        })\n      });\n\n\n    // try to run a program with 1 operation\n    Program memory program = Program({\n      programOperatorAddress: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,\n      operations: new Operation[](1),\n      notes: \"test\"\n    });\n\n    program.operations[0] = Operation({\n      operatorAddress: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,\n      opcode: EnumOpcode.BATCH_MINT_TOKENS,\n      param: Param({\n        STRING_ARRAY: new string[](0),\n        BOOL_ARRAY: new bool[](0),\n        VOTING_RULE_ARRAY: new VotingRule[](0),\n        PLUGIN_ARRAY: new Plugin[](0),\n        PARAMETER_ARRAY: new MachineParameter[](0),\n        UINT256_2DARRAY: new uint256[][](0),\n        ADDRESS_2DARRAY: new address[][](0),\n        BYTES: new bytes(0)\n      })\n    });\n\n    // make sure that the checkBeforeOperationPlugins returns SANDBOX_NEEDED\n    EnumReturnType returnType = checkBeforeOperationPlugins(program);\n    require(returnType == EnumReturnType.SANDBOX_NEEDED, \"VotingTest SingleTest: The return type should be SANDBOX_NEEDED\");\n\n    // make sure that the checkAfterOperationPlugins returns VOTING_NEEDED\n    (EnumReturnType afterReturnType, uint256[] memory afterRuleIdxList) = checkAfterOperationPlugins(program);\n\n    require(afterReturnType == EnumReturnType.VOTING_NEEDED, \"VotingTest SingleTest: The return type should be VOTING_NEEDED\");\n\n    require(afterRuleIdxList.length == 1, \"VotingTest SingleTest: The length of the rule index list should be 1\");\n\n    require(afterRuleIdxList[0] == 0, \"VotingTest SingleTest: The rule index should be 0\");\n\n\n    // run the program in entrance\n    execute(program);\n\n    // make sure that voting item is initialized\n    VotingItem memory votingItem0 = votingItems[1];\n\n    // make sure that the voting item is initialized\n    require(votingItem0.votingStatus == VotingStatus.Ongoing, \"VotingTest SingleTest: The voting item should be ongoing\");\n\n    require(votingItem0.program.programOperatorAddress == 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266, \"VotingTest SingleTest: The program operator address should be 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\");\n\n    require(votingItem0.program.operations.length == 1, \"VotingTest SingleTest: The length of the operations should be 1\");\n\n    require(votingItem0.program.operations[0].opcode == EnumOpcode.BATCH_MINT_TOKENS, \"VotingTest SingleTest: The opcode of the operation should be BATCH_MINT_TOKENS\");\n\n    // make sure that the voting rule indices only contains 0\n    require(votingItem0.votingRuleIndices.length == 1, \"VotingTest SingleTest: The length of the voting rule indices should be 1\");\n\n    require(votingItem0.votingRuleIndices[0] == 0, \"VotingTest SingleTest: The voting rule index should be 0\");\n    return;\n    require(votingItem0.totalPower[0] == 1000);\n  }\n} "
  },
  {
    "path": "darc-protocol/contracts/test-contracts/test-voting/VotingTestBase.sol",
    "content": "// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.19;\nimport '../../protocol/Runtime/VotingMachine/VotingMachine.sol';\nimport '../../protocol/Runtime/Runtime.sol';\n\n\n/**\n * @title The single voting test contract of the voting machine\n * @author DARC Team\n * @notice null\n */\n\ncontract VotingTestBase is VotingMachine {\n  function initializeVotingTest() public {\n    initialize();\n\n    // add a voting rule\n    currentMachineState.votingRuleList.push(VotingRule({\n      votingTokenClassList: new uint256[](1),\n      approvalThresholdPercentage: 50,\n      votingDurationInSeconds: 100000,\n      executionPendingDurationInSeconds: 100000,\n      bIsEnabled: true,\n      notes: \"test voting rule\",\n      bIsAbsoluteMajority: true\n    }));\n\n    currentMachineState.votingRuleList[0].votingTokenClassList[0] = 0;\n\n    // add token class 0\n    currentMachineState.tokenList[0].bIsInitialized = true;\n    currentMachineState.tokenList[0].tokenBalance[0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266] = 600;\n    currentMachineState.tokenList[0].tokenBalance[0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC] = 400;\n    currentMachineState.tokenList[0].totalSupply = 1000;\n    currentMachineState.tokenList[0].votingWeight = 1;\n    currentMachineState.tokenList[0].dividendWeight = 1;\n    currentMachineState.tokenList[0].ownerList.push(0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266);\n    currentMachineState.tokenList[0].ownerList.push(0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC);\n\n    currentMachineState.tokenList[0].tokenInfo = \"token_0\";\n    uint256[] memory tokenClassIndexList = new uint256[](1);\n    tokenClassIndexList[0] = 0;\n    initializeVoting(tokenClassIndexList, Program({\n      programOperatorAddress: 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266,\n      operations: new Operation[](0),\n      notes: \"test voting\"\n    }\n    ));\n  }\n} "
  },
  {
    "path": "darc-protocol/hardhat.config.ts",
    "content": "import { HardhatUserConfig } from \"hardhat/config\";\nimport \"@nomicfoundation/hardhat-toolbox\";\nimport \"@openzeppelin/hardhat-upgrades\";\nconst config: HardhatUserConfig = {\n  solidity: {\n    version: \"0.8.19\",\n    settings: {\n      viaIR: true,\n      optimizer: { \n        enabled: true,\n        runs: 10,\n        // details: {\n        //    yul: true,\n        // }\n      },\n    },\n  },\n  networks: {\n    hardhat: {\n      allowUnlimitedContractSize: true,\n      blockGasLimit: 9007199254740,\n    }\n  }\n};\n\nexport default config;\n"
  },
  {
    "path": "darc-protocol/package.json",
    "content": "{\n  \"name\": \"DARC-solidity\",\n  \"version\": \"1.0.0\",\n  \"main\": \"index.js\",\n  \"license\": \"BSL-1.1\",\n  \"dependencies\": {\n    \"@openzeppelin/contracts\": \"^4.8.0\"\n  },\n  \"scripts\": {\n    \"test\": \"hardhat test\",\n    \"compile\": \"hardhat compile\",\n    \"start\": \"hardhat node\",\n    \"deploy\": \"hardhat run scripts/deployDARC.ts\"\n  },\n  \"devDependencies\": {\n    \"@nomicfoundation/hardhat-toolbox\": \"^2.0.0\",\n    \"@nomiclabs/hardhat-ethers\": \"^2.2.2\",\n    \"@openzeppelin/contracts-upgradeable\": \"^4.8.0\",\n    \"@openzeppelin/hardhat-upgrades\": \"^1.22.1\",\n    \"ethers\": \"^5.7.2\",\n    \"hardhat\": \"^2.12.4\",\n    \"hardhat-gas-reporter\": \"^1.0.9\"\n  }\n}\n"
  },
  {
    "path": "darc-protocol/scripts/deployDARC.ts",
    "content": "//import { ethers, upgrades } from \"hardhat\";\nimport { ethers }  from \"hardhat\";\nimport { typeProgram, typePluginArray, typeVotingRuleArray } from \"./ProgramTypes\";\nimport { BigNumber } from \"ethers\";\n\n\n/**\n * The function to deploy DARC contract, initialize it, and return the address.\n * @returns The address of the deployed DARC contract.\n */\nexport async function deployDARC(): Promise<string> {\n\n  const DARC = await ethers.getContractFactory(\"DARC\");\n  const darc = await DARC.deploy();\n\n\n  const signers = await ethers.getSigners();\n  // for(let i = 0; i < signers.length; i++){\n  //   console.log(\"signer: \" +  signers[i].address);\n  // }\n\n  // console.log(\"DARC address: \", darc.address);\n  await darc.deployed();\n  await darc.initialize();\n  return darc.address;\n}\n\n// We recommend this pattern to be able to use async/await everywhere\n// and properly handle errors.\ndeployDARC().catch((error) => {\n  console.error(error);\n  process.exitCode = 1;\n});"
  },
  {
    "path": "darc-protocol/scripts/getABI.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nasync function main(){\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n    const abi = darc.interface.getFunction(\"getTokenOwnerBalance\");\n    console.log(\"ABI: \", JSON.stringify(abi));\n}\n\nmain();"
  },
  {
    "path": "darc-protocol/test/MultiDARCTest/Multi_DARC_call_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n// test for call contract abi\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8';\n\nconst target1_private_key = '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\nconst target4 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n\ndescribe(\"test for multi DARC call test\", function () {\n\n  \n  it (\"should let DARC1 execute program on DARC2 successfully\", async function () {\n    // create darc1 contract, deploy it and initialize it\n    const DARC1 = await ethers.getContractFactory(\"DARC\");\n    const darc1 = await DARC1.deploy();\n    // console.log(\"DARC1 address: \", darc1.address);\n    await darc1.deployed();\n    await darc1.initialize();\n\n    // create darc2 contract, deploy it and initialize it\n    const DARC2 = await ethers.getContractFactory(\"DARC\");\n    const darc2 = await DARC2.deploy();\n    // console.log(\"DARC2 address: \", darc2.address);\n    await darc2.deployed();\n    await darc2.initialize();\n\n    const signer1 = ethers.provider.getSigner(target1);\n    const darc2_with_signer1 = (await ethers.getContractFactory(\"DARC\")).attach(darc2.address).connect(signer1);\n\n    //console.log(\"Current darc2 with signer's signer address is \" + JSON.stringify(await darc2_with_signer1.signer.getAddress()));\n\n    // let DARC2 to accept any program from DARC1\n    const node_allow_signer1_target1: ConditionNodeStruct = {\n      id: BigNumber.from(0),\n      nodeType: BigNumber.from(1), // expression\n      logicalOperator: 0, // undefined\n      conditionExpression: 3, // OPERATOR_ADDRESS_EQUALS\n      childList: [], // empty\n      param: {\n        STRING_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [ [darc1.address] ], // if operator === darc1.address\n        BYTES: [],\n      }\n    };\n    await darc2.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"add and enable a before-operation plugin: user with address = target1 cannnot operate the darc\",\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 15, // create token class\n          param: {\n            \n            \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [\n              {\n                returnType: BigNumber.from(4), // YES AND SKIP SANDBOX\n                level: 1,\n                conditionNodes: [\n                  node_allow_signer1_target1\n                ],\n                votingRuleIndex: 0,\n                notes: \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8 should operate\",\n                bIsEnabled: true,\n                bIsBeforeOperation: true,\n              }\n            ],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        }],\n      }\n    )\n\n    // next get the ABI of the darc2 contract entrance, and encode it\n    //const abiDARC2 = darc2.interface.getFunction(\"entrance\").format();\n\n    const abiEncodedDARC2 = darc2.interface.encodeFunctionData(\"entrance\", [{\n      programOperatorAddress: darc1.address,\n      notes: \"create token class and mint tokens\",\n      operations: [\n        {\n          operatorAddress: darc1.address,\n          opcode: 2, // create token class\n          param: {\n            STRING_ARRAY: [\"Class1\", \"Class2\"],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(0), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n            ],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n        \n        {\n        operatorAddress: darc1.address,\n        opcode: 1, // mint token\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1), BigNumber.from(1), BigNumber.from(0)],\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigNumber.from(400)],\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target2, target3, target4]\n          ],\n          BYTES: []\n        }\n      }\n    ], \n      \n    }]);\n\n\n    // then create and execute a program with the abi encoded, address of the contract\n    const result_entrance = await darc1.entrance({\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 25, // call contract abi\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],\n          ],\n          ADDRESS_2DARRAY: [\n            [darc2.address]\n          ],\n          BYTES: abiEncodedDARC2\n        }\n      }], \n      notes: \"call contract abi\"\n    });\n    \n\n    // finally check the result from darc2 after darc1 executes the program on darc2\n    const addressListLevel0 = await darc2.getTokenOwners(0);\n    const addressListLevel1 = await darc2.getTokenOwners(1);\n\n    expect((await darc2.getTokenOwnerBalance(0, target1)).toString()).to.equal(\"100\");\n    expect((await darc2.getTokenOwnerBalance(1, target2)).toString()).to.equal(\"200\");\n    expect((await darc2.getTokenOwnerBalance(1, target3)).toString()).to.equal(\"300\");\n    expect((await darc2.getTokenOwnerBalance(0, target4)).toString()).to.equal(\"400\");\n\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/MultiDARCTest/Multi_DARC_call_with_payment_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n// test for call contract abi\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x70997970C51812dc3A010C7d01b50e0d17dc79C8';\n\nconst target1_private_key = '0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\nconst target4 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n\ndescribe(\"test for multi DARC call test with payment\", function () {\n\n  \n  it (\"should let DARC1 execute program on DARC2 successfully with payment\", async function () {\n    // create darc1 contract, deploy it and initialize it\n    const DARC1 = await ethers.getContractFactory(\"DARC\");\n    const darc1 = await DARC1.deploy();\n    // console.log(\"DARC1 address: \", darc1.address);\n    await darc1.deployed();\n    await darc1.initialize();\n\n    // create darc2 contract, deploy it and initialize it\n    const DARC2 = await ethers.getContractFactory(\"DARC\");\n    const darc2 = await DARC2.deploy();\n    // console.log(\"DARC2 address: \", darc2.address);\n    await darc2.deployed();\n    await darc2.initialize();\n\n    const signer1 = ethers.provider.getSigner(target1);\n    const darc2_with_signer1 = (await ethers.getContractFactory(\"DARC\")).attach(darc2.address).connect(signer1);\n\n    //console.log(\"Current darc2 with signer's signer address is \" + JSON.stringify(await darc2_with_signer1.signer.getAddress()));\n\n    // let DARC2 to accept any program from DARC1\n    const node_allow_signer1_target1: ConditionNodeStruct = {\n      id: BigNumber.from(0),\n      nodeType: BigNumber.from(1), // expression\n      logicalOperator: 0, // undefined\n      conditionExpression: 3, // OPERATOR_ADDRESS_EQUALS\n      childList: [], // empty\n      param: {\n        STRING_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [ [darc1.address] ], // if operator === darc1.address\n        BYTES: [],\n      }\n    };\n    await darc2.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"add and enable a before-operation plugin: user with address = target1 cannnot operate the darc\",\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 15, // create token class\n          param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [\n              {\n                returnType: BigNumber.from(4), // YES AND SKIP SANDBOX\n                level: 1,\n                conditionNodes: [\n                  node_allow_signer1_target1\n                ],\n                votingRuleIndex: 0,\n                notes: \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8 should operate\",\n                bIsEnabled: true,\n                bIsBeforeOperation: true,\n              }\n            ],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },],\n      }\n    )\n    \n    // next get the ABI of the darc2 contract entrance, and encode it\n    //const abiDARC2 = darc2.interface.getFunction(\"entrance\").format();\n    // program: create token class and mint tokens, then pay 0.5 ETH to DARC2\n\n    const abiEncodedDARC2 = darc2.interface.encodeFunctionData(\"entrance\", [{\n      programOperatorAddress: darc1.address,\n      notes: \"create token class and mint tokens\",\n      operations: [\n        {\n          operatorAddress: darc1.address,\n          opcode: 2, // create token class\n          param: {\n            STRING_ARRAY: [\"Class1\", \"Class2\"],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(0), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n            ],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n        \n        {\n        operatorAddress: darc1.address,\n        opcode: 1, // mint token\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1), BigNumber.from(1), BigNumber.from(0)],\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigNumber.from(400)],\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target2, target3, target4]\n          ],\n          BYTES: []\n        }\n      },\n\n      {\n        operatorAddress: darc1.address,\n        opcode: 26, // pay cash\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            // pay 0.5 ETH\n            [BigNumber.from(ethers.utils.parseEther(\"0.5\")), BigNumber.from(0), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n    ], \n      \n    }]);\n\n\n    // pay 1 ETH to DARC1, so that DARC1 can pay DARC2 0.5ETH\n    // now the balance of DARC1: 0.5 ETH\n    // now the balance of DARC2: 0.5 ETH\n    // then create and execute a program with the abi encoded, address of the contract\n    const result_entrance = await darc1.entrance({\n      programOperatorAddress: programOperatorAddress,\n      operations: [\n        {\n          operatorAddress: programOperatorAddress,\n          opcode: 26, // pay cash\n          param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              // pay 1 ETH\n              [BigNumber.from(ethers.utils.parseEther(\"1\")), BigNumber.from(0), BigNumber.from(1)],\n            ],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n        {\n        operatorAddress: programOperatorAddress,\n        opcode: 25, // call contract abi\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(ethers.utils.parseEther(\"0.5\"))],\n          ],\n          ADDRESS_2DARRAY: [\n            [darc2.address]\n          ],\n          BYTES: abiEncodedDARC2\n        }\n      },\n\n    ], \n      notes: \"call contract abi\"\n    }, {value: ethers.utils.parseEther(\"1.0\")});\n    \n\n    // // check the balance of darc1 and darc2\n    // console.log(\"darc1 balance: \", ethers.utils.formatEther(await ethers.provider.getBalance(darc1.address)));\n    // console.log(\"darc2 balance: \", ethers.utils.formatEther(await ethers.provider.getBalance(darc2.address)));\n    \n\n    // console.log(\"darc1 balance in darc2: \", ethers.utils.formatEther(await darc2.getWithdrawableCashBalance(darc1.address)));\n    // console.log(await ethers.provider.getBalance(darc1.address));\n    // console.log(await ethers.provider.getBalance(darc2.address));\n    // console.log(await darc2.getWithdrawableCashBalance(darc1.address));\n    // finally let DARC1 withdraw the 0.5 ETH from DARC2\n    // 1. execute program: add 0.5 withdrawable balance to DARC1\n    await darc2.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"add 0.5 withdrawable balance to DARC1\",\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 17, // batch add withdrawable balance\n          param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(ethers.utils.parseEther(\"0.5\"))],\n            ],\n            ADDRESS_2DARRAY: [\n              [darc1.address]\n            ],\n            BYTES: []\n          }\n        },],\n      }\n    )\n    \n\n    // check the balance of darc1 in darc2\n    // console.log(\"darc1 balance in darc2: \", ethers.utils.formatEther(await darc2.getWithdrawableCashBalance(darc1.address)));\n    // console.log(await darc2.getWithdrawableCashBalance(darc1.address));\n    expect((await darc2.getWithdrawableCashBalance(darc1.address)).toString()).to.equal(ethers.utils.parseEther(\"0.5\").toString());\n\n    return;\n\n    //todo: fixing the script below\n    // 2. let DARC1 directly withdraw cash from DARC2, sending 0.5 ETH back to DARC1\n    const abiEncodedDARC2_withdraw_0_5_ETH = darc2.interface.encodeFunctionData(\"withdrawCash\", [BigNumber.from(ethers.utils.parseEther(\"0\"))]);\n    \n    \n    await darc1.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"withdraw 0.5 ETH from DARC2\",\n        operations: [{\n          operatorAddress:programOperatorAddress,\n          opcode: 25, // call contract abi\n          param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(0)],\n            ],\n            ADDRESS_2DARRAY: [\n              [darc2.address]\n            ],\n            BYTES: abiEncodedDARC2_withdraw_0_5_ETH\n          }\n        }],\n      }\n    );\n\n    // 3. double check the balance of darc1 and darc2\n    console.log(\"darc1 balance: \", ethers.utils.formatEther(await ethers.provider.getBalance(darc1.address)));\n    console.log(\"darc2 balance: \", ethers.utils.formatEther(await ethers.provider.getBalance(darc2.address)));\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/conditionTest/externalCallTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, PluginStruct } from \"../../typechain-types/contracts/protocol/DARC\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = \"0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC\";\n\nconst target2 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\n\nconst target3 = \"0x870526b7973b56163a6997bb7c886f5e4ea53638\";\n\ndescribe(\"external oracle external call condition test\", function () {\n  it(\"should pass external oracle condition test\", async function () {\n    const TestOracleFactory = await ethers.getContractFactory(\n      \"TestOracleContract\"\n    );\n    const testOracleContract = await TestOracleFactory.deploy();\n    await testOracleContract.deployed();\n\n    const testOracleContractAddress = testOracleContract.address;\n    testOracleContract.set\n\n    // deploy a darc with conditions\n    const DARCFactory = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARCFactory.deploy();\n    await darc.deployed();\n    await darc.initialize();\n\n    // encoding testOracleContract function is_X_1() with signature\n    // const encodedBytes = ethers.utils.encodedWithSignature\n    const theABI = [\"function get_X_plus(uint256 a)\"];\n    const abiInterface = new ethers.utils.Interface(theABI);\n    const resultBytes = abiInterface.encodeFunctionData(\"get_X_plus\", [BigNumber.from(100)]);\n\n    const pluginList: PluginStruct[] = [\n\n            // pluigin 1\n            {\n              returnType: BigNumber.from(2),\n              level: 3,\n              conditionNodes:[\n                {\n                  id: BigNumber.from(0),\n                  nodeType: BigNumber.from(3), // true,\n                  conditionExpression: 0,\n                  childList: [],\n                  logicalOperator: 0,\n                  param: {\n                    STRING_ARRAY: [],\n                    UINT256_2DARRAY: [],\n                    ADDRESS_2DARRAY: [],\n                    BYTES: [],\n                  }\n                }\n              ],\n              votingRuleIndex: 0,\n              notes: \"plugin 1\",\n              bIsBeforeOperation: true,\n              bIsEnabled: true,\n            },\n\n\n            // plugin 2\n            {\n              returnType: BigNumber.from(4), // yes and skip sandbox\n              level: 10,\n              conditionNodes:[\n                {\n                  id: 0,\n                  nodeType: 1,\n                  logicalOperator: 0,\n                  conditionExpression: 181,\n                  childList: [],\n                  param: {\n                    STRING_ARRAY: [],\n                    UINT256_2DARRAY: [[200]], // if the value is 200, then the condition is true, then yes and skip sandbox\n                    ADDRESS_2DARRAY: [[testOracleContractAddress]],\n                    BYTES: resultBytes,\n                  }\n                }\n              ],\n              votingRuleIndex: 0,\n              notes: \"plugin 2\",\n              bIsBeforeOperation: true,\n              bIsEnabled: true\n            }\n    ]\n\n    // create a token class, then add and enable plugin\n    await darc.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"create token class\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 2, // create token class\n            param: {\n              STRING_ARRAY: [\"Class1\", \"Class2\"],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigNumber.from(0), BigNumber.from(1)],\n                [BigNumber.from(10), BigNumber.from(1)],\n                [BigNumber.from(10), BigNumber.from(1)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: [],\n            },\n          },\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 15, // add and enable plugin\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY:  pluginList,\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: [],\n            },\n          }\n        ],\n      }\n    );\n\n    // now try to set the value of the oracle to 100\n    //await testOracleContract.set_X(100);\n    // try to mint token\n    let bIsException = false;\n    try{\n      const result = await darc.entrance(\n        {\n          programOperatorAddress: programOperatorAddress,\n          notes: \"mint token\",\n          operations: [\n            {\n              operatorAddress: programOperatorAddress,\n              opcode: 1, // mint token\n              param: {\n                STRING_ARRAY: [],\n                BOOL_ARRAY: [],\n                VOTING_RULE_ARRAY: [],\n                PARAMETER_ARRAY: [],\n                PLUGIN_ARRAY: [],\n                UINT256_2DARRAY: [[0],[100]],\n                ADDRESS_2DARRAY: [[programOperatorAddress]],\n                BYTES: [],\n              },\n            }\n          ],\n        }\n      );\n    }\n    catch (err) {\n      bIsException = true;\n    }\n    expect(bIsException).to.equal(true);\n\n\n    //set value of the oracle to 100, so that this time the oracle will return 200, which will make the condition true\n    await testOracleContract.set_X(100);\n    // try to mint token again\n    const result = await darc.entrance(\n      {\n        programOperatorAddress: programOperatorAddress,\n        notes: \"mint token\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [[0],[100]],\n              ADDRESS_2DARRAY: [[programOperatorAddress]],\n              BYTES: [],\n            },\n          }\n        ],\n      }\n    );\n    expect(true).equal(true);\n\n    bIsException = false;\n    await testOracleContract.set_X(200);\n    try{\n      const result = await darc.entrance(\n        {\n          programOperatorAddress: programOperatorAddress,\n          notes: \"mint token\",\n          operations: [\n            {\n              operatorAddress: programOperatorAddress,\n              opcode: 1, // mint token\n              param: {\n                STRING_ARRAY: [],\n                BOOL_ARRAY: [],\n                VOTING_RULE_ARRAY: [],\n                PARAMETER_ARRAY: [],\n                PLUGIN_ARRAY: [],\n                UINT256_2DARRAY: [[0],[100]],\n                ADDRESS_2DARRAY: [[programOperatorAddress]],\n                BYTES: [],\n              },\n            }\n          ],\n        }\n      );\n    }\n    catch(err) {\n      bIsException = true;\n    }\n    expect(bIsException).to.equal(true);\n  });\n});\n"
  },
  {
    "path": "darc-protocol/test/conditionTest/operationLogTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = \"0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC\";\n\nconst target2 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\n\nconst target3 = \"0x870526b7973b56163a6997bb7c886f5e4ea53638\";\n\ndescribe(\"operation log  test\", function () {\n  it(\"should pass operation log test\", async function () {\n    const PluginTestFactory = await ethers.getContractFactory(\n      \"TestBaseContract\"\n    );\n    const pluginTest = await PluginTestFactory.deploy();\n    await pluginTest.deployed();\n    await pluginTest.initialize();\n\n    // first set role of operator target 1 as level-1 operator\n\n    // add a plugin to OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN(5 seconds) wiil return NO\n    await pluginTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(2), // no\n      level: BigNumber.from(12), // level = 12\n      votingRuleIndex: BigNumber.from(0),\n      notes:\n        \"disable OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN(5 seconds)\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes: [\n        {\n          id: BigNumber.from(0),\n          nodeType: BigNumber.from(1), // expression\n          logicalOperator: BigNumber.from(0), // no operator\n          conditionExpression: BigNumber.from(702), // ID_702_OPERATION_BY_OPERATOR_SINCE_LAST_TIME_LESS_THAN\n          childList: [],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [[BigNumber.from(5)]],\n            ADDRESS_2DARRAY: [],\n            BYTES: [],\n          },\n        },\n      ],\n    });\n\n    // run a mint token program immediately\n    await pluginTest.testRuntimeEntrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [\n        {\n          operatorAddress: programOperatorAddress,\n          opcode: 2, // create token class\n          param: {\n            STRING_ARRAY: [\"Class1\", \"Class2\"],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(0), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n              [BigNumber.from(10), BigNumber.from(1)],\n            ],\n            ADDRESS_2DARRAY: [],\n            BYTES: [],\n          },\n        },\n      ],\n    });\n\n    // wait for 5 seconds\n    function sleep(ms: number) {\n      return new Promise((resolve) => setTimeout(resolve, ms));\n    }\n    let bCatchException = false;\n    await sleep(1);\n    try {\n      // run it again\n      await pluginTest.testRuntimeEntrance({\n        programOperatorAddress: programOperatorAddress,\n        notes: \"create token class\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 2, // create token class\n            param: {\n              STRING_ARRAY: [\"Class3\", \"Class4\"],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigNumber.from(2), BigNumber.from(3)],\n                [BigNumber.from(10), BigNumber.from(1)],\n                [BigNumber.from(10), BigNumber.from(1)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: [],\n            },\n          },\n        ],\n      });\n    } catch (e) {\n      bCatchException = true;\n    }\n\n    expect(bCatchException).to.be.true;\n    await sleep(5000);\n\n    bCatchException = false;\n\n    try {\n      // run it again\n      await pluginTest.testRuntimeEntrance({\n        programOperatorAddress: programOperatorAddress,\n        notes: \"create token class\",\n        operations: [\n          {\n            operatorAddress: programOperatorAddress,\n            opcode: 2, // create token class\n            param: {\n              STRING_ARRAY: [\"Class3\", \"Class4\"],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigNumber.from(2), BigNumber.from(3)],\n                [BigNumber.from(10), BigNumber.from(1)],\n                [BigNumber.from(10), BigNumber.from(1)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: [],\n            },\n          },\n        ],\n      });\n    } catch (e) {\n      bCatchException = true;\n    }\n\n    expect(bCatchException).to.be.false;\n  });\n});\n"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_add_and_enable_plugin_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n// test for batch create token class instruction on DARC\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\ndescribe(\"test for batch add and enable plugins\", function () {\n\n  \n  it (\"batch batch add and enable plugins\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n    const numberOfTokenClasses = await darc.getNumberOfTokenClasses();\n\n    expect (numberOfTokenClasses.toString()).to.equal(\"0\");\n\n    const initProgram = {\n      programOperatorAddress: \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n      opeartions: []\n    };\n\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: initProgram.programOperatorAddress,\n      operations: [{\n        operatorAddress: initProgram.programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n      notes: \"create token class\"\n    });\n\n    // add and enable a before-operation plugin: user with address = target1 cannnot operate the darc\n\n    const node_deny_target1: ConditionNodeStruct = {\n      id: BigNumber.from(0),\n      nodeType: BigNumber.from(1), // expression\n      logicalOperator: 0, // undefined\n      conditionExpression: 3, // OPERATOR_ADDRESS_EQUALS\n      childList: [], // empty\n      param: {\n        STRING_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [ [\"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\"] ],\n        BYTES: [],\n      }\n    };\n    await darc.entrance(\n      {\n        programOperatorAddress: initProgram.programOperatorAddress,\n        notes: \"add and enable a before-operation plugin: user with address = target1 cannnot operate the darc\",\n        operations: [{\n          operatorAddress: initProgram.programOperatorAddress,\n          opcode: 15, // add and enable a before-operation plugin\n          param: {\n            \n            \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [\n              {\n                returnType: BigNumber.from(2), // NO\n                level: 9,\n                conditionNodes: [\n                  node_deny_target1\n                ],\n                votingRuleIndex: 0,\n                notes: \"0x7099 should not operate\",\n                bIsEnabled: true,\n                bIsBeforeOperation: true,\n              }\n            ],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n      ], \n      }\n    );\n    \n    // print all plugins\n    const [beforeOp, afterOp] = await darc.getPluginInfo();\n\n\n\n\n    // get darc address \n    const darcAddress = darc.address;\n\n\n\n    // create a ethers.js signer with information\n    /**\n     * Account #1: 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 (10000 ETH)\n        Private Key: 0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d\n     */\n    let bIsException = false;\n    const signer_address1 = ethers.provider.getSigner(1);\n    expect((await signer_address1.getAddress()).toLowerCase()).to.equal((\"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\").toLowerCase());\n    const target_addr = \"0x70997970C51812dc3A010C7d01b50e0d17dc79C8\";\n    // get darc factory\n    const DarcFactory = await ethers.getContractFactory(\"DARC\", signer_address1);\n    // attach darc contract\n    const darc2 = DarcFactory.attach(darcAddress);\n\n    // try to run a batch mint token instruction with target1 as the operator\n    try {\n      const result = await  darc2.entrance({\n        programOperatorAddress: target_addr,\n        notes: \"try to run a batch mint token instruction with target1 as the operator\",\n        operations: [{\n          operatorAddress: target_addr,\n          opcode: 1, // mint token\n          param: {\n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(0)],  \n              [BigNumber.from(100)], // amount = 100\n            ],\n            ADDRESS_2DARRAY: [\n              [target_addr],\n            ],\n            BYTES: []\n          }\n        }], \n      });\n      bIsException = false;\n\n    }\n    catch (err) {\n      bIsException = true;\n    }\n\n    // make sure that an exception is thrown\n    //expect(bIsException).to.equal(true);\n\n    // make sure that no token is minted\n\n\n\n\n    // try to run a batch mint token instruction with target1 as the operator\n    try {\n        const result3 = await  darc.entrance({\n          programOperatorAddress: programOperatorAddress,\n          notes: \"try to run a batch mint token instruction with target1 as the operator\",\n          operations: [{\n            operatorAddress: programOperatorAddress,\n            opcode: 1, // mint token\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                [BigNumber.from(0)],  \n                [BigNumber.from(100)], // amount = 100\n              ],\n              ADDRESS_2DARRAY: [\n                [target1],\n              ],\n              BYTES: []\n            }\n          }], \n        });\n\n        bIsException = false;\n    }\n    catch (err) {\n        //console.log(err);\n        bIsException = true;\n    }\n\n    expect(bIsException).to.equal(false);\n\n    // then check the token owners from darc2\n    const totalSupplyOfTokenClass0_darc2 = await darc2.getTokenOwners(BigNumber.from(0));\n    //console.log(totalSupplyOfTokenClass0_darc2);\n\n    // // list all plugins\n    // const plugins = await darc.getPluginInfo();\n    // console.log(plugins);\n    expect (totalSupplyOfTokenClass0_darc2[0].toLowerCase()).equal(target1.toLowerCase());\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_add_membership_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\n\ndescribe(\"batch_add_MEMBERSHIPS_test\", function () {\n\n  \n  it (\"should add membership\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n    const target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"add 4 membership\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 7, // add membership\n        param: {\n          \n          \n          STRING_ARRAY: [\"member1\", \"member2\", \"member3\", \"member4\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1),BigNumber.from(1),BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress, target1, target2, target3]\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    const memberList = await darc.getMemberList();\n\n    // the programOperatorAddress, target1, target2, target3 should be in the member list\n    expect(memberList[0].toUpperCase()).to.equal(programOperatorAddress.toUpperCase());\n    expect(memberList[1].toUpperCase()).to.equal(target1.toUpperCase());\n    expect(memberList[2].toUpperCase()).to.equal(target2.toUpperCase());\n    expect(memberList[3].toUpperCase()).to.equal(target3.toUpperCase());\n\n    // get the memberinfo of all addresses, and compare with the expected result\n    const memberInfo1 = await darc.getMemberInfo(programOperatorAddress);\n    const memberInfo2 = await darc.getMemberInfo(target1);\n    const memberInfo3 = await darc.getMemberInfo(target2);\n    const memberInfo4 = await darc.getMemberInfo(target3);\n    expect(memberInfo1.bIsSuspended).to.equal(false);\n    expect(memberInfo1.name).to.equal(\"member1\");\n    expect(memberInfo1.role.toString()).to.equal(\"0\");\n    expect(memberInfo2.bIsSuspended).to.equal(false);\n    expect(memberInfo2.name).to.equal(\"member2\");\n    expect(memberInfo2.role.toString()).to.equal(\"1\");\n    expect(memberInfo3.bIsSuspended).to.equal(false);\n    expect(memberInfo3.name).to.equal(\"member3\");\n    expect(memberInfo3.role.toString()).to.equal(\"1\");\n    expect(memberInfo4.bIsSuspended).to.equal(false);\n    expect(memberInfo4.name).to.equal(\"member4\");\n    expect(memberInfo4.role.toString()).to.equal(\"1\");\n\n\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_add_withdrawable_balances_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\n\ndescribe(\"batch_add_withdrawable_balances_test\", function () {\n\n  \n  it (\"should add withdrawable balances\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n    const target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\n    const target4 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n\n    const target5 = '0xdD2FD4581271e230360230F9337D5c0430Bf44C0';\n\n    // add withdrawable balances to the target addresses\n    // target 1: 100\n    // target 2: 200\n    // target 3: 300\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"add withdrawable balances\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 17, // BATCH_ADD_WITHDRAWABLE_BALANCES\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigInt(100), BigInt(200),BigInt(300)],\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target2, target3]\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    const target1balance = await darc.getWithdrawableCashBalance(target1);\n    const target2balance = await darc.getWithdrawableCashBalance(target2);\n    const target3balance = await darc.getWithdrawableCashBalance(target3);\n\n    expect(target1balance.toString()).to.equal(\"100\");\n    expect(target2balance.toString()).to.equal(\"200\");\n    expect(target3balance.toString()).to.equal(\"300\");\n\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"add withdrawable balances\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 17, // BATCH_ADD_WITHDRAWABLE_BALANCES\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigInt(100), BigInt(200),BigInt(300)],\n          ],\n          ADDRESS_2DARRAY: [\n            [target4, target4, target5]\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // make sure that the balances are updated\n    const target4balance = await darc.getWithdrawableCashBalance(target4);\n    const target5balance = await darc.getWithdrawableCashBalance(target5);\n    \n    // expect(target4balance.toString()).to.equal(\"200\");\n    // expect(target5balance.toString()).to.equal(\"300\");\n\n    const target1balance1 = await darc.getWithdrawableCashBalance(target1);\n    const target2balance2 = await darc.getWithdrawableCashBalance(target2);\n    const target3balance3 = await darc.getWithdrawableCashBalance(target3);\n    const target4balance4 = await darc.getWithdrawableCashBalance(target4);\n    const target5balance5 = await darc.getWithdrawableCashBalance(target5);\n\n    expect(target1balance1.toString()).to.equal(\"100\");\n    expect(target2balance2.toString()).to.equal(\"200\");\n    expect(target3balance3.toString()).to.equal(\"300\");\n    expect(target4balance4.toString()).to.equal(\"300\");\n    expect(target5balance5.toString()).to.equal(\"300\");\n\n\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_burn_tokens_from_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\ndescribe(\"batch_burn_tokens_from_to_test\", function () {\n\n  \n  it (\"should burn tokens (from-to)\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n    const target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n\n    // mint tokens\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target2,target3], // to = target 2, target 3\n          ],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 6, // burn tokens from target 2 and target 3\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(1)],  // token class = 0, 1\n            [BigNumber.from(10), BigNumber.from(40)], // amount = 10, 40\n          ],\n          ADDRESS_2DARRAY: [\n            [target2,target3], // from = target 2, target 3\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // check balance of programOperatorAddress:\n    // class 0 = 100 -10 = 90\n    // class 1 = 200 - 40 = 160\n    expect ((await darc.getTokenOwnerBalance(0, target2)).toBigInt().toString()).to.equal(\"90\");\n    expect ((await darc.getTokenOwnerBalance(1, target3)).toBigInt().toString()).to.equal(\"160\"); \n\n    expect(containsAddr(await darc.getTokenOwners(0), target2)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target3)).to.equal(true);\n\n    // next burn all tokens from target 2 and target 3, make sure they are removed from the token owners list\n    await darc.entrance({\n      notes: \"burn all tokens from target 2 and target 3\",\n      programOperatorAddress: programOperatorAddress,\n      operations: [\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 6, // burn tokens from target 2 and target 3\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(1)],  // token class = 0, 1\n            [BigNumber.from(90), BigNumber.from(160)], // amount = 10, 40\n          ],\n          ADDRESS_2DARRAY: [\n            [target2,target3], // from = target 2, target 3\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    expect(containsAddr(await darc.getTokenOwners(0), target2)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(1), target3)).to.equal(false);\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_burn_tokens_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\n\ndescribe(\"batch_burn_tokens_test\", function () {\n\n  \n  it (\"should burn tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\n\n    // create a token class first\n    await darc.entrance({\n      notes: \"create token class\",\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n\n    // mint tokens\n    await darc.entrance({\n      notes: \"mint tokens and burn some tokens\",\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress], // to = target 1\n          ],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 5, // burn tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(1)],  // token class = 0, 1\n            [BigNumber.from(10), BigNumber.from(40)], // amount = 10, 40\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n    // check balance of programOperatorAddress:\n    // class 0 = 100 -10 = 90\n    // class 1 = 200 - 40 = 160\n    expect ((await darc.getTokenOwnerBalance(0, programOperatorAddress)).toBigInt().toString()).to.equal(\"90\");\n    expect ((await darc.getTokenOwnerBalance(1, programOperatorAddress)).toBigInt().toString()).to.equal(\"160\"); \n\n    expect (containsAddr(await darc.getTokenOwners(0), programOperatorAddress)).to.equal(true);\n    expect (containsAddr(await darc.getTokenOwners(1), programOperatorAddress)).to.equal(true);\n\n    // burn remaining tokens and check balance\n    // mint tokens\n    await darc.entrance({\n      notes: \"burn remaining tokens\",\n      programOperatorAddress: programOperatorAddress,\n      operations: [\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 5, // burn tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(1)],  // token class = 0, 1\n            [BigNumber.from(90), BigNumber.from(160)], // amount = 10, 40\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n    expect ((await darc.getTokenOwnerBalance(0, programOperatorAddress)).toBigInt().toString()).to.equal(\"0\");\n    expect ((await darc.getTokenOwnerBalance(1, programOperatorAddress)).toBigInt().toString()).to.equal(\"0\");\n    expect (containsAddr(await darc.getTokenOwners(0), programOperatorAddress)).to.equal(false);\n    expect (containsAddr(await darc.getTokenOwners(1), programOperatorAddress)).to.equal(false);\n\n    // make sure that \n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_create_token_class_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch create token class instruction on DARC\n\ndescribe(\"test for batch create token class instruction\", function () {\n\n  \n  it (\"batch create token class instruction\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n    const numberOfTokenClasses = await darc.getNumberOfTokenClasses();\n\n    expect (numberOfTokenClasses.toString()).to.equal(\"0\");\n\n    const initProgram = {\n      programOperatorAddress: \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\",\n      opeartions: []\n    };\n\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: initProgram.programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: initProgram.programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n    const numberOfTokenClasses2 = await darc.getNumberOfTokenClasses();\n\n    expect(numberOfTokenClasses2.toString() ).to.equal(\"2\");\n    \n    const tokenResult0 = await darc.getTokenInfo(0);\n    const tokenResult1 = await darc.getTokenInfo(1);\n\n    expect(tokenResult0[0].toNumber()).to.equal(10);\n    expect(tokenResult0[1].toNumber()).to.equal(10);\n    expect(tokenResult1[0].toNumber()).to.equal(1);\n    expect(tokenResult1[1].toNumber()).to.equal(1);\n    expect(tokenResult0[2]).to.equal(\"Class1\");\n    expect(tokenResult1[2]).to.equal(\"Class2\");\n    expect(tokenResult0[3].toNumber()).to.equal(0);\n    expect(tokenResult1[3].toNumber()).to.equal(0);\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_mint_token_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n// batch mint token to another addresses\nconst addr1 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\nconst addr4 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\nconst addr5 = '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc';\nconst addr6 = '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955';\n\n/**\n * Check if an address is in an array\n * @param array \n * @param addr \n * @returns if the address is in the array\n */\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"batch_mint_token_test\", function () {\n\n  \n  it (\"should mint tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1), BigNumber.from(0), BigInt(0), BigInt(1)],  \n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigInt(16), BigInt(5)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress, programOperatorAddress, addr1, addr2],\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // get the address balance of token 0 and 1\n    const balance0 = await darc.getTokenOwnerBalance(0, programOperatorAddress);\n    const balance1 = await darc.getTokenOwnerBalance(1, programOperatorAddress);\n\n\n    //console.log(\"Token owner list of token 0 after op: \");\n    let owner0 = await darc.getTokenOwners(0);\n    //console.log(owner0);\n    //console.log(\"Token owner list of token 1 after op: \");\n    let owner1 = await darc.getTokenOwners(1);\n    //console.log(owner1);\n\n    expect( containsAddr(owner0, programOperatorAddress) ).to.equal(true);\n    expect( containsAddr(owner1, programOperatorAddress) ).to.equal(true);\n    expect( containsAddr(owner0, addr1) ).to.equal(true);\n    expect( containsAddr(owner1, addr2) ).to.equal(true);\n    \n\n\n    const result_entrance2 = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1), BigNumber.from(0), BigInt(0), BigInt(1),BigInt(0), BigInt(1),BigInt(0), BigInt(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigInt(16), BigInt(5),BigInt(16), BigInt(5),BigInt(16), BigInt(5)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress, programOperatorAddress, addr1, addr1, addr2,addr2, addr3, addr3], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    //console.log(\"Token owner list of token 0 after op: \");\n    owner0 = await darc.getTokenOwners(0);\n    //console.log(owner0);\n    //console.log(\"Token owner list of token 1 after op: \");\n    owner1 = await darc.getTokenOwners(1);\n    //console.log(owner1);\n\n    // expect addr 1, 2 has token 0 and 1\n    expect( containsAddr(owner0, programOperatorAddress) ).to.equal(true);\n    expect( containsAddr(owner1, programOperatorAddress) ).to.equal(true);\n    expect( containsAddr(owner0, addr1) ).to.equal(true);\n    expect( containsAddr(owner1, addr1) ).to.equal(true);\n    expect( containsAddr(owner0, addr2) ).to.equal(true);\n    expect( containsAddr(owner1, addr2) ).to.equal(true);\n\n    const result_entrance3 = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1), BigNumber.from(0), BigInt(1), BigInt(0),BigInt(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300),BigNumber.from(100), BigNumber.from(200), BigNumber.from(300) ], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [addr4,addr4, addr5, addr5, addr6, addr6], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    //console.log(\"Token owner list of token 0 after op: \");\n    owner0 = await darc.getTokenOwners(0);\n    //console.log(owner0);\n    //console.log(\"Token owner list of token 1 after op: \");\n    owner1 = await darc.getTokenOwners(1);\n    //console.log(owner1);\n\n    //expect addr 4,5,6 all have token 0 and 1\n    expect( containsAddr(owner0, addr4) ).to.equal(true);\n    expect( containsAddr(owner1, addr4) ).to.equal(true);\n    expect( containsAddr(owner0, addr5) ).to.equal(true);\n    expect( containsAddr(owner1, addr5) ).to.equal(true);\n    expect( containsAddr(owner0, addr6) ).to.equal(true);\n    expect( containsAddr(owner1, addr6) ).to.equal(true);\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_pay_to_mint_tokens_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr1 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\nconst addr4 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\nconst addr5 = '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc';\nconst addr6 = '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955';\n// test for batch mint token instruction on DARC\n\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"batch_pay_to_mint_token_test\", function () {\n\n  \n  it (\"should pay to mint tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"pay to mint tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 20, // pay to mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n            [BigNumber.from(1), BigNumber.from(1)], // token price\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      }], \n    }, \n    {value: 300} // 100 * 1 + 200 * 1 = 300 wei, the value should be equal to the total amount of token price\n  );\n\n  let owner0 = await darc.getTokenOwners(1);\n  let owner1 = await darc.getTokenOwners(0);\n\n  expect(containsAddr(owner0, programOperatorAddress)).to.equal(true);\n  expect(containsAddr(owner1, programOperatorAddress)).to.equal(true);\n\n  const result_entrance2 = await darc.entrance({\n    programOperatorAddress: programOperatorAddress,\n    notes: \"pay to mint tokens\",\n    operations: [{\n      operatorAddress: programOperatorAddress,\n      opcode: 20, // pay to mint token\n      param: {\n        \n        \n        STRING_ARRAY: [],\n        BOOL_ARRAY: [],\n        VOTING_RULE_ARRAY: [],\n        PARAMETER_ARRAY: [],\n        PLUGIN_ARRAY: [],\n        UINT256_2DARRAY: [\n          [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n          [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n          [BigNumber.from(1), BigNumber.from(1)], // token price\n        ],\n        ADDRESS_2DARRAY: [\n          [addr1,addr2], // to = programOperatorAddress\n        ],\n        BYTES: []\n      }\n    }], \n    }, \n    {value: 300} // 100 * 1 + 200 * 1 = 300 wei, the value should be equal to the total amount of token price\n    );\n\n    // get the address balance of token 0 and 1\n    const balance0 = await darc.getTokenOwnerBalance(0, addr1);\n    const balance1 = await darc.getTokenOwnerBalance(1, addr2);\n\n    expect(balance0.toBigInt().toString()).to.equal(\"100\");\n    expect(balance1.toBigInt().toString()).to.equal(\"200\");\n\n    owner0 = await darc.getTokenOwners(0);\n    owner1 = await darc.getTokenOwners(1);\n    expect(containsAddr(owner0, addr1)).to.equal(true);\n    expect(containsAddr(owner1, addr2)).to.equal(true);\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_pay_to_transfer_tokens_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"batch_pay_to_transfer_token_test\", function () {\n\n  \n  it (\"should pay to transfer tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"pay to mint and transfer tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 20, // pay to mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n            [BigNumber.from(1), BigNumber.from(1)], // token price\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 21, // pay to transfer tokens\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n            [BigNumber.from(1), BigNumber.from(1)], // token price\n          ],\n          ADDRESS_2DARRAY: [\n            [target1 ,target2], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      }], \n    }, \n    {value: 600} // 100 * 1 + 200 * 1 + 100*1 + 200*1 = 600 wei, the value should be equal to the total amount of token price\n  );\n\n    // get the address balance of token 0 and 1\n    const balance0 = await darc.getTokenOwnerBalance(0, target1);\n    const balance1 = await darc.getTokenOwnerBalance(1, target2);\n\n    expect(balance0.toBigInt().toString()).to.equal(\"100\");\n    expect(balance1.toBigInt().toString()).to.equal(\"200\");\n\n    // expect target 1 and target 2 to be the owner of token 0 and 1\n    const owner0 = await darc.getTokenOwners(0);\n    const owner1 = await darc.getTokenOwners(1);\n    expect(containsAddr(owner0, target1)).to.equal(true);\n    expect(containsAddr(owner1, target2)).to.equal(true);\n    \n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_transfer_tokens.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr1 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\nconst addr4 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\nconst addr5 = '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc';\nconst addr6 = '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955';\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\n\ndescribe(\"batch_transfer_tokens_test\", function () {\n\n  \n  it (\"should transfer tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n    // transfer tokens to another 2 addresses\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n    // mint tokens\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint and transfer tokens\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [programOperatorAddress,programOperatorAddress], // to = programOperatorAddress\n          ],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 3, // transfer tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(0), BigNumber.from(1), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(10), BigNumber.from(20), BigNumber.from(30), BigNumber.from(40)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target2, target1, target2], \n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // check balance of target 1 and target 2, \n    // target 1 has 10 tokens of class 0, 30 tokens of class 1\n    // target 2 has 20 tokens of class 0, 40 tokens of class 1\n    expect((await darc.getTokenOwnerBalance(0, target1)).toBigInt().toString()).to.equal(\"10\");\n    expect((await darc.getTokenOwnerBalance(1, target1)).toBigInt().toString()).to.equal(\"30\");\n    expect((await darc.getTokenOwnerBalance(0, target2)).toBigInt().toString()).to.equal(\"20\");\n    expect((await darc.getTokenOwnerBalance(1, target2)).toBigInt().toString()).to.equal(\"40\");\n    expect( containsAddr(await darc.getTokenOwners(0), target1)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(0), target2)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(1), target1)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(1), target2)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(0), programOperatorAddress)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(1), programOperatorAddress)).to.equal(true);\n\n    const remaining_token_0 = await darc.getTokenOwnerBalance(0, programOperatorAddress);\n    const remaining_token_1 = await darc.getTokenOwnerBalance(1, programOperatorAddress);\n    // transfer all remaining tokens from programOperatorAddress to target1\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"transfer all remaining tokens from programOperatorAddress to target1\",\n      operations: [\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 3, // transfer tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(1)], \n            [BigNumber.from(remaining_token_0), BigNumber.from(remaining_token_1)], \n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target1], \n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    expect( containsAddr(await darc.getTokenOwners(0), target1)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(0), target2)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(1), target1)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(1), target2)).to.equal(true);\n    expect( containsAddr(await darc.getTokenOwners(0), programOperatorAddress)).to.equal(false);\n    expect( containsAddr(await darc.getTokenOwners(1), programOperatorAddress)).to.equal(false);\n  });\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/batch_transfer_tokens_from_to.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\n// test for batch mint token instruction on DARC\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr1 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\nconst addr4 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\nconst addr5 = '0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc';\nconst addr6 = '0x14dC79964da2C08b23698B3D3cc7Ca32193d9955';\n\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\n\ndescribe(\"batch_transfer_tokens_from_to_test\", function () {\n\n  \n  it (\"should transfer tokens (from-to) tokens\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    // create a token class first\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    });\n\n    // transfer tokens to another 2 addresses\n    const target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\n    const target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\n    const target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\n    // mint tokens\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"mint tokens and transfer tokens from-to\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target1,target1], // to = target 1\n          ],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 4, // transfer tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(0), BigNumber.from(1), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(10), BigNumber.from(20), BigNumber.from(30), BigNumber.from(40)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, target1, target1, target1], // from = target 1\n            [target2, target3, target2, target3], // to = target 2\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // check balance of target 2 and target 3, \n    // target 2 has 10 tokens of class 0, 30 tokens of class 1\n    // target 3 has 20 tokens of class 0, 40 tokens of class 1\n    expect((await darc.getTokenOwnerBalance(0, target2)).toBigInt().toString()).to.equal(\"10\");\n    expect((await darc.getTokenOwnerBalance(1, target2)).toBigInt().toString()).to.equal(\"30\");\n    expect((await darc.getTokenOwnerBalance(0, target3)).toBigInt().toString()).to.equal(\"20\");\n    expect((await darc.getTokenOwnerBalance(1, target3)).toBigInt().toString()).to.equal(\"40\");\n\n    // make sure that target 1, 2 and target 3 are in the token owner list\n    expect(containsAddr(await darc.getTokenOwners(0), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), target2)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target2)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), target3)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target3)).to.equal(true);\n\n\n    // transfer tokens level 0 and 1 from target 2, 3 adddress to addr6\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"transfer tokens from target 2, 3 adddress to addr6\",\n      operations: [\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 4, // transfer tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(0), BigNumber.from(1), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(10), BigNumber.from(20), BigNumber.from(30), BigNumber.from(40)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target2, target3, target2, target3], // from = target 1\n            [addr6, addr6, addr6, addr6], // to = target 2\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    // make sure that only target 1 and addr6 are in the token owner list of level 0 and 1\n    expect(containsAddr(await darc.getTokenOwners(0), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), addr6)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), addr6)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), target2)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(1), target2)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(0), target3)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(1), target3)).to.equal(false);\n\n    // transfer tokens from target 1 to addr 6 multiple times and make sure that \n    // 1. the balance of target 1 and addr6 are correct\n    // 2. the token owner list of level 0 and 1 are correct\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"transfer tokens from target 1 to addr 6 multiple times\",\n      operations: [\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 4, // transfer tokens\n        param:{\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0),BigNumber.from(0), BigNumber.from(1), BigNumber.from(1)],  // token class = 0\n            [BigNumber.from(10), BigNumber.from(20), BigNumber.from(30), BigNumber.from(40)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target1, addr6, target1, addr6], // from = target 1\n            [addr6, target1, addr6, target1], // to = target 2\n          ],\n          BYTES: []\n        }\n      }], \n    });\n\n    expect(containsAddr(await darc.getTokenOwners(0), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), target1)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), addr6)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(1), addr6)).to.equal(true);\n    expect(containsAddr(await darc.getTokenOwners(0), target2)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(1), target2)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(0), target3)).to.equal(false);\n    expect(containsAddr(await darc.getTokenOwners(1), target3)).to.equal(false);\n  });\n  \n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/call_contract_abi_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n// test for call contract abi\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\nconst target4 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n\ndescribe(\"test for call contract abi\", function () {\n\n  \n  it (\"should call contract abi successfully\", async function () {\n    // create darc contract, deploy it and initialize it\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n    // next deploy a ABICallTestContract and save the address\n    const ABICallTestContractFactory = await ethers.getContractFactory(\"ABICallTestContract\");\n\n    const abiCallTestContract = await ABICallTestContractFactory.deploy();\n\n    await abiCallTestContract.deployed();\n\n    const abiCallTestContractAddress = abiCallTestContract.address;\n\n    // next create a byte array that contains the abi of the function that we want to call, with abi encoded with the parameters signature\n\n    // first get the abi of the function\n    const abi = abiCallTestContract.interface.getFunction(\"testCall1\").format();\n    // print abi\n    console.log(\"abi: \", abi);\n    // then encode the abi with the parameters\n    const abiEncoded = abiCallTestContract.interface.encodeFunctionData(\"testCall1\", [BigNumber.from(1), BigNumber.from(2), \"string 1\", \"string 2\", target1, target2]);\n\n\n    // then create and execute a program with the abi encoded, address of the contract\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 25, // call contract abi\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],\n          ],\n          ADDRESS_2DARRAY: [\n            [abiCallTestContractAddress]\n          ],\n          BYTES: abiEncoded\n        }\n      }], \n      notes: \"call contract abi\"\n    });\n    \n    // ok, let's check the result of abiCallTestContract's value1, value2, str1, str2, addr1, addr2\n    const value1 = await abiCallTestContract.value1();\n    const value2 = await abiCallTestContract.value2();\n    const str1 = await abiCallTestContract.str1();\n    const str2 = await abiCallTestContract.str2();\n    const addr1 = await abiCallTestContract.addr1();\n    const addr2 = await abiCallTestContract.addr2();\n\n    // assert the values\n    expect(value1.toString()).to.equal(\"1\");\n    expect(value2.toString()).to.equal(\"2\");\n    expect(str1).to.equal(\"string 1\");\n    expect(str2).to.equal(\"string 2\");\n    expect(addr1).to.equal(target1);\n    expect(addr2).to.equal(target2);\n\n    // next call the function with values changed\n    const abiEncoded2 = abiCallTestContract.interface.encodeFunctionData(\"testCall2\", [BigNumber.from(3), BigNumber.from(4), \"string 3\", \"string 4\", target3, target4]);\n\n\n    // then create and execute a program with the abi encoded, address of the contract\n    const result2 = await darc.entrance({\n        programOperatorAddress: programOperatorAddress,\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 25, // call contract abi\n          param: {\n            \n            \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [\n              [BigNumber.from(100000000)],\n            ],\n            ADDRESS_2DARRAY: [\n              [abiCallTestContractAddress]\n            ],\n            BYTES: abiEncoded2\n          }\n        }], \n        notes: \"call contract abi\"\n      }, {value: 10000000000});\n\n      // check the balance of DARC and abiCallTestContract\n      const darcBalance = await ethers.provider.getBalance(darc.address);\n      const abiCallTestContractBalance = await ethers.provider.getBalance(abiCallTestContractAddress);\n      expect(darcBalance.toString()).to.equal(\"9900000000\");\n      expect(abiCallTestContractBalance.toString()).to.equal(\"100000000\");\n\n      // check the values of abiCallTestContract\n      const value3 = await abiCallTestContract.value1();\n      const value4 = await abiCallTestContract.value2();\n      const str3 = await abiCallTestContract.str1();\n      const str4 = await abiCallTestContract.str2();\n      const addr3 = await abiCallTestContract.addr1();\n      const addr4 = await abiCallTestContract.addr2();\n\n      // assert the values\n      expect(value3.toString()).to.equal(\"3\");\n      expect(value4.toString()).to.equal(\"4\");\n      expect(str3).to.equal(\"string 3\");\n      expect(str4).to.equal(\"string 4\");\n      expect(addr3).to.equal(target3);\n      expect(addr4).to.equal(target4);\n      \n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/operationUnitTest/offer_dividends_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr1 = \"0x90F79bf6EB2c4f870365E785982E1f101E93b906\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n// test for batch mint token instruction on DARC\n\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"offer_dividends_test\", function () {\n\n  \n  it (\"should offer dividends\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    // 1. create 3 token classes\n    // 2. mint a few tokens to addr1, addr2, addr3\n    // 3. pay some cash to the darc\n    // 4. execute offer dividend instruction\n    // 5. check the withdrawable dividends balance of addr1, addr2, addr3, addr4\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class and mint tokens to addr1, addr2, addr3\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"1\", \"2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(1), BigNumber.from(1)],\n            [BigNumber.from(1), BigNumber.from(3)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token to addr 1,2,3\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(0),BigNumber.from(0), BigNumber.from(1),BigNumber.from(1), BigNumber.from(1), ],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(200), BigNumber.from(400), BigNumber.from(500), BigNumber.from(600),], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [addr1, addr2, addr3, addr1, addr2 ,addr3]\n          ],\n          BYTES: []\n        }\n      }\n    ], \n    });\n\n\n    let result_entrance = await darc.entrance({\n          programOperatorAddress: programOperatorAddress,\n          notes: \"pay cash to the darc\",\n          operations: [{\n            operatorAddress: programOperatorAddress,\n            opcode: 26, // pay cash\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                // pay 20000\n                [BigNumber.from(200000000000), BigNumber.from(0), BigNumber.from(1)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }], \n        }, {value: ethers.utils.parseEther(\"1\")}\n      );\n\n      // get current dividend per unit\n      const dividendPerUnit = await darc.getCurrentDividendPerUnit();\n      expect(dividendPerUnit.toString()).to.equal(\"20000000\");\n\n\n      // get total dividends weight of each token owners\n      // let weightArray = [0,0,0];\n      // let addresssArray = [addr1, addr2, addr3];\n\n      // for (let i = 0; i < (await darc.getNumberOfTokenClasses()).toNumber(); i++) {\n      //   const [votingWeight,  dividendWeight,  tokenInfo,  totalSupply] = await darc.getTokenInfo(i);\n      //   console.log(\"votingWeight: \", votingWeight.toString(), \" dividendWeight: \", dividendWeight.toString(), \" tokenInfo: \", tokenInfo.toString(), \" totalSupply: \", totalSupply.toString());\n\n      //   for (let j =0;j<3;j++) {\n      //     let balance = await darc.getTokenOwnerBalance(i, addresssArray[j]);\n      //     weightArray[j] += balance.toNumber() * dividendWeight.toNumber();\n      //   }\n      // }\n\n      // // print out the weight array\n      // for (let i = 0; i < weightArray.length; i++) {\n      //   console.log(\"weightArray: \", weightArray[i]);\n      // }\n\n      // // print the dividend weight for each token class\n      // for (let i = 0; i < (await darc.getNumberOfTokenClasses()).toNumber(); i++) {\n      //   console.log(\"token class: \", i, \" dividend weight: \")\n      //   console.log(await darc.sumDividendWeightByTokenClass(i));\n      // }\n\n      // offer dividends\n      await darc.entrance({\n        programOperatorAddress: programOperatorAddress,\n        notes: \"offer dividends\",\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 27, // offer dividends\n          param: {\n            \n            \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        }]});\n\n      // get all dividends offered address\n      let dividendsOffered = await darc.getWithdrawableCashOwnerList();\n\n      // get dividends amount\n      for (let i = 0; i < dividendsOffered.length; i++) {\n        let dividendsAmount = await darc.getWithdrawableDividendBalance(dividendsOffered[i]);\n        if (dividendsOffered[i]==='0x90F79bf6EB2c4f870365E785982E1f101E93b906'.toLowerCase()){\n          expect(dividendsAmount).to.equal(26000000000);\n        }\n        else if (dividendsOffered[i].toLowerCase()==='0x976EA74026E726554dB657fA54763abd0C3a0aa9'.toLowerCase()) {\n          expect (dividendsAmount).to.equal(34000000000);\n        }\n        else if (dividendsOffered[i].toLowerCase()==='0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199'.toLowerCase()) {\n          expect (dividendsAmount).to.equal(40000000000);\n        }\n      }\n\n      // // get all token classes and owners\n      // let tokenClasses = await darc.getNumberOfTokenClasses();\n      // console.log(\"number of token classes: \", tokenClasses);\n\n      // // get dividends balance list\n      // const dividendsOwnerList = await darc.getWithdrawableDividendOwnerList();\n      // for (let i = 0; i < dividendsOwnerList.length; i++) {\n      //   const dividendsBalance = await darc.getWithdrawableDividendBalance(dividendsOwnerList[i]);\n      //   console.log(\"dividendsBalance: \", dividendsBalance.toString(), \" by address: \" , dividendsOwnerList[i]);\n      // }\n\n\n\n\n\n      // // list all the balance of the signers\n      // const signerList = await ethers.getSigners();\n      // for (let i = 0; i < signerList.length; i++) {\n      //   const signer = signerList[i];\n      //   const balance = await signer.getBalance();\n      //   console.log(\"signer: \", signer.address, \" balance: \", balance.toString());\n      // }\n\n      // // list all total supply of each token class\n      // for (let i = 0; i < (await darc.getNumberOfTokenClasses()).toNumber(); i++) {\n      //   const result = await darc.getTokenInfo(i);\n      //   console.log(\"token class: \", i, \" total supply: \", result[3].toString());\n      // }\n\n      // // list all withdrawable cash balance\n      // console.log(\"list all withdrawable cash balance: \")\n      // const ownerList = await darc.getWithdrawableCashOwnerList();\n      // for (let i=0; i< (ownerList).length; i++){\n      //   const address = ownerList[i];\n      //   const balance = await darc.getWithdrawableCashBalance(address);\n      //   console.log(\"address: \", address, \" balance: \", balance.toString());\n      // }\n\n  });\n\n});"
  },
  {
    "path": "darc-protocol/test/paymentUnitTest/payment_pay_cash_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\ndescribe(\"payment_pay_cash_test\", function () {\n  it (\"should pay cash\", async function () {\n\n    // initialize DARC\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n    // initialize program\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"pay cash 10000\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 26, // pay cash\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            // pay 10000\n            [BigNumber.from(10000), BigNumber.from(0), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    }, {value: ethers.utils.parseEther(\"1.0\")});\n\n    // the cash balance should remains 1.0 ether - 10000 = 999999999999990000\n    const result = await darc.getWithdrawableCashBalance(programOperatorAddress);\n    expect(result.toBigInt().toString()).to.equal(\"999999999999990000\");\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/pluginTest/operator_AND_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\ndescribe(\"operator AND  test\", function () {\n  it (\"should pass operator OR test\", async function () {\n\n\n    const PluginTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const pluginTest = await PluginTestFactory.deploy();\n    await pluginTest.deployed();\n    await pluginTest.initialize();\n\n    // first set role of operator target 1 as level-1 operator\n\n    // add a plugin to disable all program\n    await pluginTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(2), // no\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"disable all program\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // expression\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    //return;\n    // add a plugin operatorAddress == target1 | operatorAddress == target2\n    // level == 4\n    // return type: yes and skip sandbox\n    await pluginTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(4), // yes and skip sandbox\n      level: BigNumber.from(103),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[\n        // node 0: boolean operator OR\n        {\n          id: BigNumber.from(0),\n          nodeType: BigNumber.from(2), // logical operator\n          logicalOperator: BigNumber.from(2), // OR\n          conditionExpression: 0, // no expression\n          childList: [BigNumber.from(1), BigNumber.from(2)],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n\n        // node 1: operatorAddress == target1\n        {\n          id : BigNumber.from(1),\n          nodeType: BigNumber.from(1), // expression\n          logicalOperator: BigNumber.from(0), // no operator\n          conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n          childList: [],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [[target1]],\n            BYTES: []\n          }\n        },\n\n        // node 2: operatorAddress == target2\n        {\n          id : BigNumber.from(2),\n          nodeType: BigNumber.from(1), // expression\n          logicalOperator: BigNumber.from(0), // no operator\n          conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n          childList: [],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [[target2]],\n            BYTES: []\n          }\n        }\n      ]\n\n    });\n\n    //console.log(await pluginTest.getBeforeOpPlugins());\n\n    // console.log(await pluginTest.checkConditionExpressionNodeResult(true, \n    //   {\n    //     operatorAddress: target3,\n    //     opcode: 1, // mint token\n    //     param: {\n    //       STRING_ARRAY: [],\n    //       BOOL_ARRAY: [],\n    //       VOTING_RULE_ARRAY: [],\n    //       PARAMETER_ARRAY: [],\n    //       PLUGIN_ARRAY: [],\n    //       UINT256_2DARRAY: [],\n    //       ADDRESS_2DARRAY: [],\n    //       BYTES: []\n    //     }\n    //   }, 1, 0 ));\n\n\n\n    const r1 = await pluginTest.checkProgram_beforeOp({\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n      notes: \"create token class\"\n    }\n    );\n\n\n    expect(r1.toString()).to.equal(\"2\");\n    //console.log(await pluginTest.getBeforeOpPlugins());\n\n    // next check if program with operator address == target1 can be aprove by the plugin\n    const returnType = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target1,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target1,\n            opcode: 1, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    //return;\n    // it should return \"YES and skip sandbox\" (4)\n    expect(returnType.toString()).to.equal(\"4\");\n\n    // next check if program with operator address == target2 can be aprove by the plugin\n    const returnType2 = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target2,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target2,\n            opcode: 0, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    // it should return \"YES and skip sandbox\" (4)\n    expect(returnType2.toString()).to.equal(\"4\");\n\n    console.log(\"final test\");\n    const returnType3 = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target3,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target3,\n            opcode: 0, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    expect(returnType3.toString()).to.equal(\"2\");\n\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/pluginTest/operator_OR_test.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\ndescribe(\"operator OR  test\", function () {\n  it (\"should pass operator OR test\", async function () {\n\n\n    const PluginTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const pluginTest = await PluginTestFactory.deploy();\n    await pluginTest.deployed();\n    await pluginTest.initialize();\n\n    // add a plugin to disable all program\n    await pluginTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(2), // no\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"disable all program\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // expression\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    //return;\n    // add a plugin operatorAddress == target1 | operatorAddress == target2\n    // level == 4\n    // return type: yes and skip sandbox\n    await pluginTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(4), // yes and skip sandbox\n      level: BigNumber.from(103),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"allow operatorAddress == target1 | operatorAddress == target2\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[\n        // node 0: boolean operator OR\n        {\n          id: BigNumber.from(0),\n          nodeType: BigNumber.from(2), // logical operator\n          logicalOperator: BigNumber.from(2), // OR\n          conditionExpression: 0, // no expression\n          childList: [BigNumber.from(1), BigNumber.from(2)],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        },\n\n        // node 1: operatorAddress == target1\n        {\n          id : BigNumber.from(1),\n          nodeType: BigNumber.from(1), // expression\n          logicalOperator: BigNumber.from(0), // no operator\n          conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n          childList: [],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [[target1]],\n            BYTES: []\n          }\n        },\n\n        // node 2: operatorAddress == target2\n        {\n          id : BigNumber.from(2),\n          nodeType: BigNumber.from(1), // expression\n          logicalOperator: BigNumber.from(0), // no operator\n          conditionExpression: BigNumber.from(3), // OPERATOR_ADDRESS_EQUALS\n          childList: [],\n          param: {\n            STRING_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [[target2]],\n            BYTES: []\n          }\n        }\n      ]\n\n    });\n\n    //console.log(await pluginTest.getBeforeOpPlugins());\n\n    // console.log(await pluginTest.checkConditionExpressionNodeResult(true, \n    //   {\n    //     operatorAddress: target3,\n    //     opcode: 1, // mint token\n    //     param: {\n    //       STRING_ARRAY: [],\n    //       BOOL_ARRAY: [],\n    //       VOTING_RULE_ARRAY: [],\n    //       PARAMETER_ARRAY: [],\n    //       PLUGIN_ARRAY: [],\n    //       UINT256_2DARRAY: [],\n    //       ADDRESS_2DARRAY: [],\n    //       BYTES: []\n    //     }\n    //   }, 1, 0 ));\n\n\n\n    const r1 = await pluginTest.checkProgram_beforeOp({\n      programOperatorAddress: programOperatorAddress,\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class1\", \"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n            [BigNumber.from(10), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n      notes: \"create token class\"\n    }\n    );\n\n\n    expect(r1.toString()).to.equal(\"2\");\n    //console.log(await pluginTest.getBeforeOpPlugins());\n\n    // next check if program with operator address == target1 can be aprove by the plugin\n    const returnType = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target1,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target1,\n            opcode: 1, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    //return;\n    // it should return \"YES and skip sandbox\" (4)\n    expect(returnType.toString()).to.equal(\"4\");\n\n    // next check if program with operator address == target2 can be aprove by the plugin\n    const returnType2 = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target2,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target2,\n            opcode: 0, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    // it should return \"YES and skip sandbox\" (4)\n    expect(returnType2.toString()).to.equal(\"4\");\n\n    console.log(\"final test\");\n    const returnType3 = await pluginTest.checkProgram_beforeOp(\n      {\n        programOperatorAddress: target3,\n        notes: \"\",\n        operations: [\n          {\n            operatorAddress: target3,\n            opcode: 0, // mint token\n            param: {\n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }\n        ]\n      }\n\n    );\n\n    expect(returnType3.toString()).to.equal(\"2\");\n\n  });\n\n\n});"
  },
  {
    "path": "darc-protocol/test/votingTest/multiAddressVotingTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\nasync function letAddressVote(operatorAddress:string,darcAddress:string) {\n  const currentSigner = ethers.provider.getSigner(operatorAddress);\n  const currentDARC = (await ethers.getContractFactory(\"TestBaseContract\")).attach(darcAddress).connect(currentSigner);\n\n  const votingProgram: ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    notes: \"vote\",\n    operations: [{\n      operatorAddress: operatorAddress,\n      opcode: 32, // vote\n      param: { \n        STRING_ARRAY: [],\n        BOOL_ARRAY: [true],\n        VOTING_RULE_ARRAY: [],\n        PARAMETER_ARRAY: [],\n        PLUGIN_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [],\n        BYTES: []\n      }\n    }],\n  }\n\n  await currentDARC.testRuntimeEntrance(votingProgram);\n}\n\ndescribe(\"multi address voting test\", function () {\n  it (\"should pass multi address voting test: start an absolute majority vote, vote once, pass the vote, run pending program, then change back to idle state\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create tokens, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // create token class 1, voting weight 1, dividend weight 1\n    await votingTestSingleTest.runProgramDirectly({\n      programOperatorAddress: target0,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"Class2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [ BigNumber.from(1)],\n            [BigNumber.from(1)],\n            [BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(1), BigNumber.from(1), BigNumber.from(1), BigInt(1)],  \n            [BigNumber.from(100), BigNumber.from(100), BigNumber.from(100), BigInt(100)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target0,target1, target2, target3],\n          ],\n          BYTES: []\n        }\n      }], \n    }, false);\n\n    // add a voting rule that ask 51% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n      votingTokenClassList: [BigNumber.from(1)],\n      approvalThresholdPercentage: BigNumber.from(51), // 51% to approve  (absolute majority)\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n    //return;\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],  \n            [BigNumber.from(100000)], // amount = 100000\n          ],\n          ADDRESS_2DARRAY: [\n            [target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n    \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // make sure that total voting power is 400\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).totalPower[0].toString()).to.equal(\"400\"); // should be 400\n\n    // target 0 vote, 100/400 voted\n    await letAddressVote(target0, votingTestSingleTest.address);\n\n    //console.log(await votingTestSingleTest.getVotingItemsByIndex(1))\n\n\n    \n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"100\"); // should be 100\n\n    // target 1 vote, 200/400 voted\n    await letAddressVote(target1, votingTestSingleTest.address);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"200\"); // should be 300\n\n    // target 2 vote, 300/400 voted\n    await letAddressVote(target2, votingTestSingleTest.address);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\"); // should be FiniteState.EXECUTING_PENDING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"300\"); // should be 300\n\n    // finally execute the pending program\n\n    // // try to vote now\n    // const program_vote: ProgramStruct = {\n    //   programOperatorAddress: target0,\n    //   notes: \"vote\",\n    //   operations: [{\n    //     operatorAddress: target0,\n    //     opcode: 32, // vote\n    //     param: { \n    //       STRING_ARRAY: [],\n    //       BOOL_ARRAY: [true],\n    //       VOTING_RULE_ARRAY: [],\n    //       PARAMETER_ARRAY: [],\n    //       PLUGIN_ARRAY: [],\n    //       UINT256_2DARRAY: [],\n    //       ADDRESS_2DARRAY: [],\n    //       BYTES: []\n    //     }\n    //   }],\n    // }\n    // // read the voting result\n    // const votingItemIndex = 1;\n    // const votingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n    // expect(votingItem.votingStatus.toString()).to.equal(\"2\"); // should be VotingStatus.ON_GOING\n\n    // // read the voting state:\n    // const votingState = await votingTestSingleTest.finiteState();\n    // expect(votingState.toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // // vote \n    // await votingTestSingleTest.testRuntimeEntrance(program_vote).then(async (tx) => {\n    //   console.log(\"The latest voting index is \", (await votingTestSingleTest.latestVotingItemIndex()).toString());\n    //   // console log the voting state again\n\n    //   // the voting state should be 3, which is EXECUTING_PENDING\n    //   expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\");\n\n    //   const currentVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n\n    //   // make sure that the powerYES is 600\n    //   expect(currentVotingItem.powerYes[0].toString()).to.equal(\"600\");\n\n    //   // make sure that the total power is 1000\n    //   expect(currentVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n    //   // the latest voting index should be 1\n    //   expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).equal(\"1\");\n\n    //   //return;\n\n    //   const program_execute_pending_program: ProgramStruct = {\n    //     programOperatorAddress: target0,\n    //     notes: \"execute_pending_program\",\n    //     operations: [{\n    //       operatorAddress: target0,\n    //       opcode: 33, // vote\n    //       param: { \n    //         STRING_ARRAY: [],\n    //         BOOL_ARRAY: [],\n    //         VOTING_RULE_ARRAY: [],\n    //         PARAMETER_ARRAY: [],\n    //         PLUGIN_ARRAY: [],\n    //         UINT256_2DARRAY: [],\n    //         ADDRESS_2DARRAY: [],\n    //         BYTES: []\n    //       }\n    //     }],\n    //   }\n      \n    //   // run the execute pending program\n    //   await votingTestSingleTest.testRuntimeEntrance(program_execute_pending_program).then(async (tx) => {\n    //     expect((await votingTestSingleTest.finiteState()).toString()).to.equal('1'); // back to idle state \n    //     expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).to.equal(\"1\"); // the latest voting index should be 1\n        \n    //     // check the latest voting items\n    //     const latestVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n    //     expect(latestVotingItem.votingStatus.toString()).to.equal(\"0\"); // should be VotingStatus.Ended_AND_Passed\n\n    //     // check the bIsProgramExecuted\n    //     expect(latestVotingItem.bIsProgramExecuted).to.equal(true);\n\n    //     // check the total voting power is 1000\n    //     expect(latestVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n    //     // check the powerYes is 600\n    //     expect(latestVotingItem.powerYes[0].toString()).to.equal(\"600\");\n\n    //     // console.log(\"After execute pending program, the voting state is \", await votingTestSingleTest.finiteState());\n    //     // console.log(\"After execute pending program, the voting deadline is \", await votingTestSingleTest.votingDeadline());\n\n    //     // expect(((await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex)).toString())).to.equal(\"1\")\n    //     //print all token holders and tokens, making sure that the pending program of minting tokens is executed after voting\n    //     const owners = await votingTestSingleTest.getTokenOwners(0);\n    //     // for (let i = 0; i < owners.length; i++) {\n    //     //   console.log(\"owner \", i, \" is \", owners[i]);\n    //     //   console.log(\"balance of owner \", i, \" is \", await votingTestSingleTest.getTokenOwnerBalance(0, owners[i]));\n    //     // }\n\n    //     expect((await votingTestSingleTest.getTokenOwnerBalance(0, target0)).toString()).to.equal(\"705\");\n    //     expect((await votingTestSingleTest.getTokenOwnerBalance(0, target1)).toString()).to.equal(\"716\");\n    //     expect((await votingTestSingleTest.getTokenOwnerBalance(0, target2)).toString()).to.equal(\"200\");\n    //   });\n    // });\n\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/votingTest/multiClassTokenVotingTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\nasync function letAddressVote(operatorAddress:string,darcAddress:string) {\n  const currentSigner = ethers.provider.getSigner(operatorAddress);\n  const currentDARC = (await ethers.getContractFactory(\"TestBaseContract\")).attach(darcAddress).connect(currentSigner);\n\n  const votingProgram: ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    notes: \"vote\",\n    operations: [{\n      operatorAddress: operatorAddress,\n      opcode: 32, // vote\n      param: { \n        STRING_ARRAY: [],\n        BOOL_ARRAY: [true],\n        VOTING_RULE_ARRAY: [],\n        PARAMETER_ARRAY: [],\n        PLUGIN_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [],\n        BYTES: []\n      }\n    }],\n  }\n\n  await currentDARC.testRuntimeEntrance(votingProgram);\n}\n\ndescribe(\"multi class token voting test\", function () {\n  it (\"should pass multi class token voting test\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create token class 0, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // create token class 1, voting weight 1, dividend weight 1\n    await votingTestSingleTest.runProgramDirectly({\n      programOperatorAddress: target0,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 2, // create token class\n        param: {\n          STRING_ARRAY: [\"C1\", \"C2\", \"C3\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [ BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(1), BigNumber.from(1), BigNumber.from(1), BigInt(2),BigInt(2),BigInt(2), BigInt(3)],  \n            [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3), BigInt(1), BigInt(1), BigInt(1), BigInt(1)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target0,target1, target2, target0, target1, target2, target3],\n          ],\n          BYTES: []\n        }\n      }], \n    }, false);\n\n    // weight of target0 = 1*1 + 5*1 = 6\n    // weight of target1 = 2*1 + 5*1 = 7\n    // weight of target2 = 3*1 + 5*1 = 8\n    // weight of target3 = 10*1 = 10\n    // total weight is 6+7+8+10 = 31\n\n    // add a voting rule that ask 51% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n\n      // class 1, 2, 3 can vote\n      votingTokenClassList: [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n      approvalThresholdPercentage: BigNumber.from(51), // 51% to approve  (absolute majority)\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],  \n            [BigNumber.from(100000)], // amount = 100000\n          ],\n          ADDRESS_2DARRAY: [\n            [target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n    \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // make sure that total voting power is 400\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).totalPower[0].toString()).to.equal(\"31\"); // should be 31\n\n    // target 0 vote, 6/31 voted\n    await letAddressVote(target0, votingTestSingleTest.address);\n\n    const indexLatestVotingItem = await votingTestSingleTest.latestVotingItemIndex();\n\n    // // get token number of target0 at level 1 and 2\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(1, target0));\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(2, target0));\n\n    // console.log(await votingTestSingleTest.getVotingItemsByIndex(1))\n\n    const powerOfTarget0 = await votingTestSingleTest.getVoterPowerOfVotingRule(0, target0);\n    // console.log(\"power of target0 is \", powerOfTarget0.toString());\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(indexLatestVotingItem)).powerYes[0].toString()).to.equal(\"6\"); // should be 6\n\n    await letAddressVote(target1, votingTestSingleTest.address);\n\n\n    \n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"13\"); // should be 100\n\n\n\n    // target 2 vote, 21/31 voted\n    await letAddressVote(target2, votingTestSingleTest.address);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\"); // should be FiniteState.EXECUTING_PENDING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"21\"); // should be 300\n\n    // finally execute the pending program\n\n    // // try to vote now\n    // const program_vote: ProgramStruct = {\n    //   programOperatorAddress: target0,\n    //   notes: \"vote\",\n    //   operations: [{\n    //     operatorAddress: target0,\n    //     opcode: 32, // vote\n    //     param: { \n    //       STRING_ARRAY: [],\n    //       BOOL_ARRAY: [true],\n    //       VOTING_RULE_ARRAY: [],\n    //       PARAMETER_ARRAY: [],\n    //       PLUGIN_ARRAY: [],\n    //       UINT256_2DARRAY: [],\n    //       ADDRESS_2DARRAY: [],\n    //       BYTES: []\n    //     }\n    //   }],\n    // }\n    // // read the voting result\n    // const votingItemIndex = 1;\n    // const votingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n    // expect(votingItem.votingStatus.toString()).to.equal(\"2\"); // should be VotingStatus.ON_GOING\n\n    // // read the voting state:\n    // const votingState = await votingTestSingleTest.finiteState();\n    // expect(votingState.toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // // vote \n    // await votingTestSingleTest.testRuntimeEntrance(program_vote).then(async (tx) => {\n    //   console.log(\"The latest voting index is \", (await votingTestSingleTest.latestVotingItemIndex()).toString());\n    //   // console log the voting state again\n\n    //   // the voting state should be 3, which is EXECUTING_PENDING\n    //   expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\");\n\n    //   const currentVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n\n    //   // make sure that the powerYES is 600\n    //   expect(currentVotingItem.powerYes[0].toString()).to.equal(\"600\");\n\n    //   // make sure that the total power is 1000\n    //   expect(currentVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n    //   // the latest voting index should be 1\n    //   expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).equal(\"1\");\n\n    //   //return;\n\n      const program_execute_pending_program: ProgramStruct = {\n        programOperatorAddress: target0,\n        notes: \"execute_pending_program\",\n        operations: [{\n          operatorAddress: target0,\n          opcode: 33, // vote\n          param: { \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        }],\n      }\n      \n      // run the execute pending program\n      await votingTestSingleTest.testRuntimeEntrance(program_execute_pending_program).then(async (tx) => {\n        expect((await votingTestSingleTest.finiteState()).toString()).to.equal('1'); // back to idle state \n        expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).to.equal(\"1\"); // the latest voting index should be 1\n        expect((await votingTestSingleTest.getTokenOwnerBalance(0, target0)).toString()).equal(\"100600\");\n      });\n        \n\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/votingTest/multiItemVotingNegativeTest.ts",
    "content": "import { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\nasync function letAddressVote(operatorAddress:string,darcAddress:string) {\n  const currentSigner = ethers.provider.getSigner(operatorAddress);\n  const currentDARC = (await ethers.getContractFactory(\"TestBaseContract\")).attach(darcAddress).connect(currentSigner);\n\n  const votingProgram: ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    notes: \"vote\",\n    operations: [{\n      operatorAddress: operatorAddress,\n      opcode: 32, // vote\n      param: { \n        STRING_ARRAY: [],\n        BOOL_ARRAY: [false, false, false, false],\n        VOTING_RULE_ARRAY: [],\n        PARAMETER_ARRAY: [],\n        PLUGIN_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [],\n        BYTES: []\n      }\n    }],\n  }\n\n  await currentDARC.testRuntimeEntrance(votingProgram);\n}\n\ndescribe(\"multi item voting test\", function () {\n  it (\"should pass multi item voting test\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create token class 0, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // create token class 1, voting weight 1, dividend weight 1\n    await votingTestSingleTest.runProgramDirectly({\n      programOperatorAddress: target0,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 2, // create token class\n        param: {\n          STRING_ARRAY: [\"C1\", \"C2\", \"C3\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [ BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(1), BigNumber.from(1), BigNumber.from(1), BigInt(2),BigInt(2),BigInt(2), BigInt(3)],  \n            [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3), BigInt(1), BigInt(2), BigInt(3), BigInt(4)], \n          ],\n          ADDRESS_2DARRAY: [\n            [target0,target1, target2, target0, target1, target2, target3],\n          ],\n          BYTES: []\n        }\n      }], \n    }, false);\n\n    // weight of target0 = 1*1 + 5*1 = 6\n    // weight of target1 = 2*1 + 5*2 = 12\n    // weight of target2 = 3*1 + 5*3 = 18\n    // weight of target3 = 10*4 = 40\n    // total weight is 6+12+18+40 = 76\n\n    // add a voting rule index 0 that ask 51% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n\n      // class 1, 2, 3 can vote\n      votingTokenClassList: [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n      approvalThresholdPercentage: BigNumber.from(51), // 51% to approve  (absolute majority)\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    // add a voting rule index 1, 20% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule(\n      {\n\n        // class 1 can vote\n        votingTokenClassList: [BigNumber.from(1)],\n        approvalThresholdPercentage: BigNumber.from(20), // 51% to approve  (absolute majority)\n        votingDurationInSeconds: BigNumber.from(1000),\n        executionPendingDurationInSeconds: BigNumber.from(1000),\n        bIsEnabled: true,\n        notes: \"51% to approve in absolute majority\",\n        bIsAbsoluteMajority: true,\n      }, false\n    )\n\n    // add a voting rule index 2, 99% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule(\n      {\n\n        // class 1 can vote\n        votingTokenClassList: [BigNumber.from(2)],\n        approvalThresholdPercentage: BigNumber.from(99), // 51% to approve  (absolute majority)\n        votingDurationInSeconds: BigNumber.from(1000),\n        executionPendingDurationInSeconds: BigNumber.from(1000),\n        bIsEnabled: true,\n        notes: \"99% token 1 to approve in absolute  majority\",\n        bIsAbsoluteMajority: true,\n      }, false\n    )\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(1),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(2),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(1),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],  \n            [BigNumber.from(100000)], // amount = 100000\n          ],\n          ADDRESS_2DARRAY: [\n            [target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n  \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // make sure that total voting power is 400\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).totalPower[0].toString()).to.equal(\"76\"); // should be 76\n\n    // target 0 vote, 6/76 voted\n    await letAddressVote(target0, votingTestSingleTest.address);\n\n\n\n    const indexLatestVotingItem = await votingTestSingleTest.latestVotingItemIndex();\n\n    // // get token number of target0 at level 1 and 2\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(1, target0));\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(2, target0));\n\n    // console.log(await votingTestSingleTest.getVotingItemsByIndex(1))\n\n    const powerOfTarget0 = await votingTestSingleTest.getVoterPowerOfVotingRule(0, target0);\n    // console.log(\"power of target0 is \", powerOfTarget0.toString());\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(indexLatestVotingItem)).powerNo[0].toString()).to.equal(\"6\"); // should be 6\n\n\n    // target 1 vote, 18/76 voted\n    await letAddressVote(target1, votingTestSingleTest.address);\n\n\n    \n    // make sure that current state is back to idle\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"1\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerNo[0].toString()).to.equal(\"18\");\n\n\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/votingTest/multiItemVotingTest.ts",
    "content": "import { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65';\n\nasync function letAddressVote(operatorAddress:string,darcAddress:string) {\n  const currentSigner = ethers.provider.getSigner(operatorAddress);\n  const currentDARC = (await ethers.getContractFactory(\"TestBaseContract\")).attach(darcAddress).connect(currentSigner);\n\n  const votingProgram: ProgramStruct = {\n    programOperatorAddress: operatorAddress,\n    notes: \"vote\",\n    operations: [{\n      operatorAddress: operatorAddress,\n      opcode: 32, // vote\n      param: { \n        STRING_ARRAY: [],\n        BOOL_ARRAY: [true, true, true, true],\n        VOTING_RULE_ARRAY: [],\n        PARAMETER_ARRAY: [],\n        PLUGIN_ARRAY: [],\n        UINT256_2DARRAY: [],\n        ADDRESS_2DARRAY: [],\n        BYTES: []\n      }\n    }],\n  }\n\n  await currentDARC.testRuntimeEntrance(votingProgram);\n}\n\ndescribe(\"multi item voting test\", function () {\n  it (\"should pass multi item voting test\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create token class 0, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // create token class 1, voting weight 1, dividend weight 1\n    await votingTestSingleTest.runProgramDirectly({\n      programOperatorAddress: target0,\n      notes: \"create token class\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 2, // create token class\n        param: {\n          STRING_ARRAY: [\"C1\", \"C2\", \"C3\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [ BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n            [BigNumber.from(1), BigNumber.from(5), BigNumber.from(10)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: {\n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(1), BigNumber.from(1), BigNumber.from(1), BigInt(2),BigInt(2),BigInt(2), BigInt(3)],  \n            [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3), BigInt(1), BigInt(2), BigInt(3), BigInt(4)], \n          ],\n          ADDRESS_2DARRAY: [\n            [target0,target1, target2, target0, target1, target2, target3],\n          ],\n          BYTES: []\n        }\n      }], \n    }, false);\n\n    // weight of target0 = 1*1 + 5*1 = 6\n    // weight of target1 = 2*1 + 5*2 = 12\n    // weight of target2 = 3*1 + 5*3 = 18\n    // weight of target3 = 10*4 = 40\n    // total weight is 6+12+18+40 = 76\n\n    // add a voting rule index 0 that ask 51% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n\n      // class 1, 2, 3 can vote\n      votingTokenClassList: [BigNumber.from(1), BigNumber.from(2), BigNumber.from(3)],\n      approvalThresholdPercentage: BigNumber.from(51), // 51% to approve  (absolute majority)\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    // add a voting rule index 1, 20% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule(\n      {\n\n        // class 1 can vote\n        votingTokenClassList: [BigNumber.from(1)],\n        approvalThresholdPercentage: BigNumber.from(20), // 51% to approve  (absolute majority)\n        votingDurationInSeconds: BigNumber.from(1000),\n        executionPendingDurationInSeconds: BigNumber.from(1000),\n        bIsEnabled: true,\n        notes: \"51% to approve in absolute majority\",\n        bIsAbsoluteMajority: true,\n      }, false\n    )\n\n    // add a voting rule index 2, 99% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule(\n      {\n\n        // class 1 can vote\n        votingTokenClassList: [BigNumber.from(2)],\n        approvalThresholdPercentage: BigNumber.from(99), // 51% to approve  (absolute majority)\n        votingDurationInSeconds: BigNumber.from(1000),\n        executionPendingDurationInSeconds: BigNumber.from(1000),\n        bIsEnabled: true,\n        notes: \"99% token 1 to approve in absolute  majority\",\n        bIsAbsoluteMajority: true,\n      }, false\n    )\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(1),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(2),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(1),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0)],  \n            [BigNumber.from(100000)], // amount = 100000\n          ],\n          ADDRESS_2DARRAY: [\n            [target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n  \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // make sure that total voting power is 400\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).totalPower[0].toString()).to.equal(\"76\"); // should be 76\n\n    // target 0 vote, 6/76 voted\n    await letAddressVote(target0, votingTestSingleTest.address);\n\n\n\n    const indexLatestVotingItem = await votingTestSingleTest.latestVotingItemIndex();\n\n    // // get token number of target0 at level 1 and 2\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(1, target0));\n    // console.log(await votingTestSingleTest.getTokenOwnerBalance(2, target0));\n\n    // console.log(await votingTestSingleTest.getVotingItemsByIndex(1))\n\n    const powerOfTarget0 = await votingTestSingleTest.getVoterPowerOfVotingRule(0, target0);\n    // console.log(\"power of target0 is \", powerOfTarget0.toString());\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(indexLatestVotingItem)).powerYes[0].toString()).to.equal(\"6\"); // should be 6\n\n\n    // target 1 vote, 18/76 voted\n    await letAddressVote(target1, votingTestSingleTest.address);\n\n\n    \n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"18\");\n\n\n    // target 2 vote, 36/76 voted\n    await letAddressVote(target2, votingTestSingleTest.address);\n\n    // make sure that current state is voting\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"36\"); \n\n    // target 3 vote, 76/76 voted\n    await letAddressVote(target3, votingTestSingleTest.address);\n\n    expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\"); // should be FiniteState.EXECUTION_PENDING\n    expect((await votingTestSingleTest.getVotingItemsByIndex(1)).powerYes[0].toString()).to.equal(\"76\");\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/votingTest/singleVoteNegativeTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\ndescribe(\"single voting netative test\", function () {\n  it (\"should pass single voting netative test: start an absolute majority vote, vote once, reject the vote, then change back to idle state\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create tokens, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // add a voting rule that ask 50% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n      votingTokenClassList: [BigNumber.from(0)],\n      approvalThresholdPercentage: BigNumber.from(50),\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n    //return;\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(0), BigNumber.from(0), BigInt(0), BigInt(0)],  \n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigInt(16), BigInt(5)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target0, target1, target1, target1, target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n    \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n\n    // try to vote now\n    const program_vote: ProgramStruct = {\n      programOperatorAddress: target0,\n      notes: \"vote\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 32, // vote\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [false], // vote for no\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }],\n    }\n    // read the voting result\n    const votingItemIndex = 1;\n    const votingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n    expect(votingItem.votingStatus.toString()).to.equal(\"2\"); // should be VotingStatus.ON_GOING\n\n    // read the voting state:\n    const votingState = await votingTestSingleTest.finiteState();\n    expect(votingState.toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // vote \n\n    await votingTestSingleTest.testRuntimeEntrance(program_vote).then(async (tx) => {\n      console.log(\"The latest voting index is \", (await votingTestSingleTest.latestVotingItemIndex()).toString());\n      // console log the voting state again\n\n      // the voting state should be 1, which is idle\n      expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"1\");\n\n      const currentVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n\n      // make sure that the powerYES is 600\n      expect(currentVotingItem.powerNo[0].toString()).to.equal(\"600\");\n\n      // make sure that the total power is 1000\n      expect(currentVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n      // the latest voting index should be 1\n      expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).equal(\"1\");\n\n      return;\n\n    });\n\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/votingTest/singleVotingTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\nimport { ConditionNodeStruct, ProgramStruct } from \"../../typechain-types/contracts/protocol/DARC\"\n\n\nconst target0 = \"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266\";\n\nconst target1 = '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC';\n\nconst target2 = '0x90F79bf6EB2c4f870365E785982E1f101E93b906';\n\nconst target3 = '0x870526b7973b56163a6997bb7c886f5e4ea53638';\n\ndescribe(\"single voting test\", function () {\n  it (\"should pass single voting test: start an absolute majority vote, vote once, pass the vote, run pending program, then change back to idle state\", async function () {\n    const VotingTestFactory = await ethers.getContractFactory(\"TestBaseContract\");\n    const votingTestSingleTest = await VotingTestFactory.deploy();\n    await votingTestSingleTest.deployed();\n    await votingTestSingleTest.initialize();\n\n    // create tokens, mint tokens to target0, target1, target2\n    await votingTestSingleTest.helper_createToken0AndMint();\n\n    // add a before-op plugin to ask all operations as sandbox_needed\n    await votingTestSingleTest.addBeforeOpPlugin({\n      returnType: BigNumber.from(1), // sandbox needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all sandbox_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: true,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n\n    // add a voting rule that ask 50% to approve in absolute majority\n    await votingTestSingleTest.addVotingRule({\n      votingTokenClassList: [BigNumber.from(0)],\n      approvalThresholdPercentage: BigNumber.from(50),\n      votingDurationInSeconds: BigNumber.from(1000),\n      executionPendingDurationInSeconds: BigNumber.from(1000),\n      bIsEnabled: true,\n      notes: \"50% to approve in absolute majority\",\n      bIsAbsoluteMajority: true,\n    }, false);\n\n\n    //add an after-op plugin that ask all operation to be voting_neede by vote rule 0\n    await votingTestSingleTest.addAfterOpPlugin({\n      returnType: BigNumber.from(3), // voting needed\n      level: BigNumber.from(3),\n      votingRuleIndex: BigNumber.from(0),\n      notes: \"all voting_needed\",\n      bIsEnabled: true,\n      bIsBeforeOperation: false,\n      conditionNodes:[{\n        id: BigNumber.from(0),\n        nodeType: BigNumber.from(3), // bool true\n        logicalOperator: BigNumber.from(0), // no operator\n        conditionExpression: BigNumber.from(0), // always true\n        childList: [],\n        param: {\n          STRING_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }]\n    });\n    \n    //return;\n    const program = {\n      programOperatorAddress: target0,\n      notes: \"mint tokens\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 1, // mint token\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(0), BigNumber.from(0), BigInt(0), BigInt(0)],  \n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(300), BigInt(16), BigInt(5)], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [target0, target1, target1, target1, target0],\n          ],\n          BYTES: []\n        }\n      }], \n    };\n    \n    await votingTestSingleTest.testRuntimeEntrance(program);\n\n\n    // try to vote now\n    const program_vote: ProgramStruct = {\n      programOperatorAddress: target0,\n      notes: \"vote\",\n      operations: [{\n        operatorAddress: target0,\n        opcode: 32, // vote\n        param: { \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [true],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }],\n    }\n    // read the voting result\n    const votingItemIndex = 1;\n    const votingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n    expect(votingItem.votingStatus.toString()).to.equal(\"2\"); // should be VotingStatus.ON_GOING\n\n    // read the voting state:\n    const votingState = await votingTestSingleTest.finiteState();\n    expect(votingState.toString()).to.equal(\"2\"); // should be FiniteState.VOTING\n\n    // vote \n\n    await votingTestSingleTest.testRuntimeEntrance(program_vote).then(async (tx) => {\n      console.log(\"The latest voting index is \", (await votingTestSingleTest.latestVotingItemIndex()).toString());\n      // console log the voting state again\n\n      // the voting state should be 3, which is EXECUTING_PENDING\n      expect((await votingTestSingleTest.finiteState()).toString()).to.equal(\"3\");\n\n      const currentVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n\n      // make sure that the powerYES is 600\n      expect(currentVotingItem.powerYes[0].toString()).to.equal(\"600\");\n\n      // make sure that the total power is 1000\n      expect(currentVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n      // the latest voting index should be 1\n      expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).equal(\"1\");\n\n      //return;\n\n      const program_execute_pending_program: ProgramStruct = {\n        programOperatorAddress: target0,\n        notes: \"execute_pending_program\",\n        operations: [{\n          operatorAddress: target0,\n          opcode: 33, // vote\n          param: { \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        }],\n      }\n      \n      // run the execute pending program\n      await votingTestSingleTest.testRuntimeEntrance(program_execute_pending_program).then(async (tx) => {\n        expect((await votingTestSingleTest.finiteState()).toString()).to.equal('1'); // back to idle state \n        expect((await votingTestSingleTest.latestVotingItemIndex()).toString()).to.equal(\"1\"); // the latest voting index should be 1\n        \n        // check the latest voting items\n        const latestVotingItem = await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex);\n        expect(latestVotingItem.votingStatus.toString()).to.equal(\"0\"); // should be VotingStatus.Ended_AND_Passed\n\n        // check the bIsProgramExecuted\n        expect(latestVotingItem.bIsProgramExecuted).to.equal(true);\n\n        // check the total voting power is 1000\n        expect(latestVotingItem.totalPower.toString()).to.equal(\"1000\");\n\n        // check the powerYes is 600\n        expect(latestVotingItem.powerYes[0].toString()).to.equal(\"600\");\n\n        // console.log(\"After execute pending program, the voting state is \", await votingTestSingleTest.finiteState());\n        // console.log(\"After execute pending program, the voting deadline is \", await votingTestSingleTest.votingDeadline());\n\n        // expect(((await votingTestSingleTest.getVotingItemsByIndex(votingItemIndex)).toString())).to.equal(\"1\")\n        //print all token holders and tokens, making sure that the pending program of minting tokens is executed after voting\n        const owners = await votingTestSingleTest.getTokenOwners(0);\n        // for (let i = 0; i < owners.length; i++) {\n        //   console.log(\"owner \", i, \" is \", owners[i]);\n        //   console.log(\"balance of owner \", i, \" is \", await votingTestSingleTest.getTokenOwnerBalance(0, owners[i]));\n        // }\n\n        expect((await votingTestSingleTest.getTokenOwnerBalance(0, target0)).toString()).to.equal(\"705\");\n        expect((await votingTestSingleTest.getTokenOwnerBalance(0, target1)).toString()).to.equal(\"716\");\n        expect((await votingTestSingleTest.getTokenOwnerBalance(0, target2)).toString()).to.equal(\"200\");\n      });\n    });\n\n  });\n})\n"
  },
  {
    "path": "darc-protocol/test/withdrawTest/withdrawCashTest.ts",
    "content": "import { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"withdraw cash test\", function () {\n  it (\"should withdraw cash\", async function () {\n\n    // initialize DARC\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n    // initialize program\n\n    const programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\n    const result_entrance = await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"pay cash 10000\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 26, \n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            // pay 10000, 0 for native token, 1 for dividendable\n            [BigNumber.from(10000), BigNumber.from(0), BigNumber.from(1)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      }], \n    }, {value: ethers.utils.parseEther(\"1.0\")});\n\n    // the cash balance should remains 1.0 ether - 10000 = 999999999999990000\n    const result = await darc.getWithdrawableCashBalance(programOperatorAddress);\n    expect(result.toBigInt().toString()).to.equal(\"999999999999990000\");\n\n    const currentBalance = await ethers.provider.getBalance(programOperatorAddress);\n\n    // withdraw 999999999999990000\n    await darc.withdrawCash(BigNumber.from(\"999999999999990000\"));\n\n    const currentBalance2 = await ethers.provider.getBalance(programOperatorAddress);\n    \n    let getCash = currentBalance2.toBigInt()- (currentBalance.toBigInt());\n\n    expect( getCash < 999999999999990000n && getCash >= 999900000000000000n).to.equal(true);\n\n    // make sure no more cash can be withdrawn\n    const remaining = (await darc.getWithdrawableCashBalance(programOperatorAddress)).toString();\n    expect (remaining).to.equal(\"0\");\n\n    // check if the address is removed from the withdrawable cash owner list\n    const withdrawableCashOwners = await darc.getWithdrawableCashOwnerList();\n    expect(containsAddr(withdrawableCashOwners, programOperatorAddress)).to.equal(false);\n\n    // continue to withdraw 1000\n\n    let bIsScuccess = true;\n    try {\n      await darc.withdrawCash(BigNumber.from(\"1000\"));\n    }\n    catch (e) {\n      bIsScuccess = false;\n    }\n\n    expect(bIsScuccess).to.equal(false);\n    \n    // check the balance of darc, should remain 10000 after the payment\n    const balance = await ethers.provider.getBalance(darc.address);\n    expect(balance.toString()).to.equal(\"10000\");\n  });\n});"
  },
  {
    "path": "darc-protocol/test/withdrawTest/withdrawDividendTest.ts",
    "content": "import { time, loadFixture } from \"@nomicfoundation/hardhat-network-helpers\";\nimport { anyValue } from \"@nomicfoundation/hardhat-chai-matchers/withArgs\";\nimport { expect } from \"chai\";\nimport { ethers } from \"hardhat\";\nimport { BigNumber } from \"ethers\";\n\nconst programOperatorAddress = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr1 = \"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266\";\nconst addr2 = '0x976EA74026E726554dB657fA54763abd0C3a0aa9';\nconst addr3 = '0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199';\n// test for batch mint token instruction on DARC\n\nfunction containsAddr(array: string[], addr:string): boolean {\n  for (let i = 0; i < array.length; i++) {\n    if (array[i].toLowerCase() === addr.toLowerCase()) {\n      return true;\n    }\n  }\n  return false;\n}\n\ndescribe(\"offer_dividends_test\", function () {\n\n  \n  it (\"should offer dividends\", async function () {\n\n    const DARC = await ethers.getContractFactory(\"DARC\");\n    const darc = await DARC.deploy();\n    //console.log(\"DARC address: \", darc.address);\n    await darc.deployed();\n    await darc.initialize();\n\n\n    // 1. create 3 token classes\n    // 2. mint a few tokens to addr1, addr2, addr3\n    // 3. pay some cash to the darc\n    // 4. execute offer dividend instruction\n    // 5. check the withdrawable dividends balance of addr1, addr2, addr3, addr4\n    await darc.entrance({\n      programOperatorAddress: programOperatorAddress,\n      notes: \"create token class and mint tokens to addr1, addr2, addr3\",\n      operations: [{\n        operatorAddress: programOperatorAddress,\n        opcode: 2, // create token class\n        param: {\n          \n          \n          STRING_ARRAY: [\"1\", \"2\"],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(1)],\n            [BigNumber.from(1), BigNumber.from(1)],\n            [BigNumber.from(1), BigNumber.from(3)],\n          ],\n          ADDRESS_2DARRAY: [],\n          BYTES: []\n        }\n      },\n      {\n        operatorAddress: programOperatorAddress,\n        opcode: 1, // mint token to addr 1,2,3\n        param: {\n          \n          \n          STRING_ARRAY: [],\n          BOOL_ARRAY: [],\n          VOTING_RULE_ARRAY: [],\n          PARAMETER_ARRAY: [],\n          PLUGIN_ARRAY: [],\n          UINT256_2DARRAY: [\n            [BigNumber.from(0), BigNumber.from(0),BigNumber.from(0), BigNumber.from(1),BigNumber.from(1), BigNumber.from(1), ],  // token class = 0\n            [BigNumber.from(100), BigNumber.from(200), BigNumber.from(200), BigNumber.from(400), BigNumber.from(500), BigNumber.from(600),], // amount = 100\n          ],\n          ADDRESS_2DARRAY: [\n            [addr1, addr2, addr3, addr1, addr2 ,addr3]\n          ],\n          BYTES: []\n        }\n      }\n    ], \n    });\n\n\n    let result_entrance = await darc.entrance({\n          programOperatorAddress: programOperatorAddress,\n          notes: \"pay cash to the darc\",\n          operations: [{\n            operatorAddress: programOperatorAddress,\n            opcode: 26, // pay cash\n            param: {\n              \n              \n              STRING_ARRAY: [],\n              BOOL_ARRAY: [],\n              VOTING_RULE_ARRAY: [],\n              PARAMETER_ARRAY: [],\n              PLUGIN_ARRAY: [],\n              UINT256_2DARRAY: [\n                // pay 20000\n                [BigNumber.from(1000000000000000000n ), BigNumber.from(0), BigNumber.from(1)],\n              ],\n              ADDRESS_2DARRAY: [],\n              BYTES: []\n            }\n          }], \n        }, {value: ethers.utils.parseEther(\"1\")}\n      );\n\n      // get current dividend per unit\n      const dividendPerUnit = await darc.getCurrentDividendPerUnit();\n      expect(dividendPerUnit.toString()).to.equal(\"100000000000000\");\n\n\n      // get total dividends weight of each token owners\n      // let weightArray = [0,0,0];\n      // let addresssArray = [addr1, addr2, addr3];\n\n      // for (let i = 0; i < (await darc.getNumberOfTokenClasses()).toNumber(); i++) {\n      //   const [votingWeight,  dividendWeight,  tokenInfo,  totalSupply] = await darc.getTokenInfo(i);\n      //   console.log(\"votingWeight: \", votingWeight.toString(), \" dividendWeight: \", dividendWeight.toString(), \" tokenInfo: \", tokenInfo.toString(), \" totalSupply: \", totalSupply.toString());\n\n      //   for (let j =0;j<3;j++) {\n      //     let balance = await darc.getTokenOwnerBalance(i, addresssArray[j]);\n      //     weightArray[j] += balance.toNumber() * dividendWeight.toNumber();\n      //   }\n      // }\n\n      // // print out the weight array\n      // for (let i = 0; i < weightArray.length; i++) {\n      //   console.log(\"weightArray: \", weightArray[i]);\n      // }\n\n      // // print the dividend weight for each token class\n      // for (let i = 0; i < (await darc.getNumberOfTokenClasses()).toNumber(); i++) {\n      //   console.log(\"token class: \", i, \" dividend weight: \")\n      //   console.log(await darc.sumDividendWeightByTokenClass(i));\n      // }\n\n      // offer dividends\n      await darc.entrance({\n        programOperatorAddress: programOperatorAddress,\n        notes: \"offer dividends\",\n        operations: [{\n          operatorAddress: programOperatorAddress,\n          opcode: 27, // offer dividends\n          param: {\n            \n            \n            STRING_ARRAY: [],\n            BOOL_ARRAY: [],\n            VOTING_RULE_ARRAY: [],\n            PARAMETER_ARRAY: [],\n            PLUGIN_ARRAY: [],\n            UINT256_2DARRAY: [],\n            ADDRESS_2DARRAY: [],\n            BYTES: []\n          }\n        }]});\n\n      // get all dividends offered address\n      let dividendOwnerList = await darc.getWithdrawableDividendOwnerList();\n    \n\n      // next withdraw dividends from addr1\n      // get the balance of addr1\n      let balanceBefore = await ethers.provider.getBalance(addr1);\n      await darc.withdrawDividends(BigNumber.from(30000000000000000n));\n      let balanceAfter = await ethers.provider.getBalance(addr1);\n      let withdrawFromDARC = balanceAfter.sub(balanceBefore);\n\n      const remaining_1 = await darc.getWithdrawableDividendBalance(addr1);\n      expect(withdrawFromDARC.lte(30000000000000000n)).to.equal(true);\n      expect(withdrawFromDARC.gt(29000000000000000n)).to.equal(true);\n\n      // next withdraw 100000000000000000n dividends from addr1\n      balanceBefore = await ethers.provider.getBalance(addr1);\n      await darc.withdrawDividends(BigNumber.from(90000000000000000n));\n      balanceAfter = await ethers.provider.getBalance(addr1);\n      withdrawFromDARC = balanceAfter.sub(balanceBefore);\n\n      expect(withdrawFromDARC.lte(90000000000000000n)).to.equal(true);\n      expect(withdrawFromDARC.gt(89000000000000000n)).to.equal(true);\n\n      // check the remaining balance of addr1\n      let remainintBalance = await darc.getWithdrawableDividendBalance(addr1);\n      expect(remainintBalance.toString()).to.equal(\"10000000000000000\");\n\n      // withdraw all remaining balance\n      balanceBefore = await ethers.provider.getBalance(addr1);\n      await darc.withdrawDividends(BigNumber.from(10000000000000000n));\n      balanceAfter = await ethers.provider.getBalance(addr1);\n      withdrawFromDARC = balanceAfter.sub(balanceBefore);\n      expect(withdrawFromDARC.lte(10000000000000000n)).to.equal(true);\n      expect(withdrawFromDARC.gt(9000000000000000n)).to.equal(true);\n\n      // check the list of withdrawable dividends owner list, make sure addr1 is not in the list\n      dividendOwnerList = await darc.getWithdrawableDividendOwnerList();\n      expect(containsAddr(dividendOwnerList, addr1)).to.equal(false);\n  });\n\n});"
  },
  {
    "path": "darc-protocol/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es2020\",\n    \"module\": \"commonjs\",\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"strict\": true,\n    \"skipLibCheck\": true,\n    \"resolveJsonModule\": true,\n  }\n}\n"
  }
]