@0xobelisk/sui-common 1.2.0-pre.98 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +92 -0
  2. package/README.md +670 -1
  3. package/dist/index.d.ts +61 -27
  4. package/dist/index.js +1078 -461
  5. package/dist/index.js.map +1 -1
  6. package/package.json +15 -17
  7. package/src/codegen/debug.ts +0 -4
  8. package/src/codegen/types/index.ts +46 -10
  9. package/src/codegen/utils/config.ts +1 -1
  10. package/src/codegen/utils/format.ts +0 -6
  11. package/src/codegen/utils/formatAndWrite.ts +10 -31
  12. package/src/codegen/utils/generateLock.ts +122 -0
  13. package/src/codegen/utils/index.ts +4 -2
  14. package/src/codegen/utils/renderMove/{schemaGen.ts → codegen.ts} +40 -28
  15. package/src/codegen/utils/renderMove/common.ts +0 -65
  16. package/src/codegen/utils/renderMove/dapp.ts +2 -14
  17. package/src/codegen/utils/renderMove/generateDappKey.ts +33 -18
  18. package/src/codegen/utils/renderMove/generateError.ts +32 -15
  19. package/src/codegen/utils/renderMove/generateGenesis.ts +55 -22
  20. package/src/codegen/utils/renderMove/generateInitTest.ts +26 -14
  21. package/src/codegen/utils/renderMove/generateObjects.ts +377 -0
  22. package/src/codegen/utils/renderMove/generatePermits.ts +151 -0
  23. package/src/codegen/utils/renderMove/generateResources.ts +894 -242
  24. package/src/codegen/utils/renderMove/generateScenes.ts +467 -0
  25. package/src/codegen/utils/renderMove/generateScript.ts +18 -13
  26. package/src/codegen/utils/renderMove/generateSystem.ts +0 -2
  27. package/src/codegen/utils/renderMove/generateUserStorageInit.ts +37 -0
  28. package/src/codegen/utils/validateConfig.ts +237 -0
  29. package/src/index.ts +0 -1
  30. package/src/modules.d.ts +0 -10
  31. package/src/codegen/modules.d.ts +0 -1
  32. package/src/codegen/utils/posixPath.ts +0 -8
  33. package/src/codegen/utils/renderMove/generateComponents.ts +0 -802
  34. package/src/codegen/utils/renderMove/generateDefaultSchema.ts +0 -216
  35. package/src/codegen/utils/renderMove/generateEvent.ts +0 -99
  36. package/src/codegen/utils/renderMove/generateSchema.ts +0 -287
  37. package/src/codegen/utils/renderMove/generateSchemaHub.ts +0 -60
  38. package/src/parseData/index.ts +0 -1
  39. package/src/parseData/parser/index.ts +0 -47
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/posixPath.ts","../src/codegen/utils/renderMove/schemaGen.ts","../src/codegen/utils/renderMove/common.ts","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateComponents.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/parseData/parser/index.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n\nexport async function formatTypescript(content: string): Promise<string> {\n return prettier.format(content, {\n parser: 'typescript'\n });\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { formatTypescript } from './format';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = output;\n let schemaPrefix = ` // Copyright (c) Obelisk Labs, Inc.\n // SPDX-License-Identifier: Apache-2.0\n #[allow(unused_use)]\n \n /* Autogenerated file. Do not edit manually. */\n \n `;\n\n let initPrefix = `#[test_only]`;\n\n let code = schemaPrefix + formattedOutput;\n\n let deployHookPrefix = `#[allow(lint(share_owned))]`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n\n/**\n * Formats typescript code using prettier and write it to a file\n * @param output typescript code\n * @param fullOutputPath full path to the output file\n * @param logPrefix prefix for debug logs\n */\nexport async function formatAndWriteTypescript(\n output: string,\n fullOutputPath: string,\n logPrefix: string\n): Promise<void> {\n const formattedOutput = await formatTypescript(output);\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n\n await fs.writeFile(fullOutputPath, formattedOutput);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\nexport const error = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","/**\n * Explicitly normalize a given path to a posix path (using `/` as separator).\n * This should be used for generating Solidity files that will be consumed by solc,\n * because solc expects `/` as path separator, but path.join produces `\\` if the user is on windows.\n */\nexport function posixPath(path: string): string {\n return path.replace(/\\\\/g, '/');\n}\n","import { DubheConfig } from '../../types';\nimport { existsSync } from 'fs';\n// import { rmdirSync } from 'fs'; // Unused\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\n// import { generateSchemaData, generateSchemaStructure } from './generateSchema';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\n// import { generateSchemaEvent } from // Unused './generateEvent';\nimport { generateSystemsAndTests } from './generateSystem';\n// import { generateSchemaHub } from // Unused './generateSchemaHub';\nimport { generateSchemaError } from './generateError';\n// import { generateDefaultSchema } from // Unused './generateDefaultSchema';\nimport { generateInitTest } from './generateInitTest';\nimport { generateComponents } from './generateComponents';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport path from 'node:path';\n\nexport async function schemaGen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet'\n) {\n console.log('\\nšŸš€ Starting Schema Generation Process...');\n console.log('šŸ“‹ Project Configuration:');\n console.log(` └─ Name: ${config.name}`);\n console.log(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n\n console.log(rootDir);\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath);\n }\n\n const componentsPath = path.join(projectDir, 'sources', 'codegen', 'components');\n if (!existsSync(componentsPath)) {\n await generateComponents(config, componentsPath);\n } else {\n await generateComponents(config, componentsPath);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n if (!existsSync(resourcesPath)) {\n await generateResources(config, resourcesPath);\n } else {\n await generateResources(config, resourcesPath);\n }\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateSchemaError(config.name, config.errors, rootDir);\n }\n\n // await generateDefaultSchema(config, rootDir);\n // await generateInit(config, rootDir);\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\nāœ… Schema Generation Process Complete!\\n');\n}\n","// import { MoveType } from '../../types'; // Unused\nimport fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n\nexport function capitalizeFirstLetter(input: string): string {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n\n/**\n *\n * @param values\n * @param prefixArgs\n * @return [ name, age, birth_time ]\n */\nexport function getStructAttrs(values: Record<string, string> | string): string {\n return Object.entries(values)\n .map(([key, _]) => `${key}`)\n .join(',');\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction isAddress(str: string): boolean {\n const regex = /^0x[a-fA-F0-9]+$/;\n return regex.test(str);\n}\n\n/**\n *\n * @param values\n * @return ( bool , u64 , u64)\n */\n// export function getStructTypes(values: SchemaType): string {\nexport function getStructTypes(values: Record<string, string>): string {\n return `(${Object.entries(values).map(([_, type]) => `${type}`)})`;\n}\n\n/**\n *\n * @param values\n * @return Attributes and types of the struct. [ name: string, age: u64 ]\n */\nexport function getStructAttrsWithType(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, type]) => `${key}: ${type}`);\n}\n\n/**\n * @param values\n * @return [ data.name, data.age ]\n */\nexport function getStructAttrsQuery(values: Record<string, string>): string[] {\n return Object.entries(values).map(([key, _]) => `self.${key}`);\n}\n\nexport function containsString(obj: Record<string, any>, searchString: string): boolean {\n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const value = obj[key];\n if (\n (typeof value === 'string' && value === searchString) ||\n (typeof value === 'string' && value.includes(searchString) && value.includes('>'))\n ) {\n return true;\n }\n }\n }\n return false;\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"1.2.0-pre.98\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"team@obelisk.build\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"pnpm run type-check && pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^10.5.0\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"prettier-plugin-rust\": \"^0.1.9\",\n \"prettier-plugin-solidity\": \"^1.1.2\",\n \"typescript\": \"^5.8.3\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^22.16.0\",\n \"@types/yargs\": \"^17.0.10\",\n \"eslint\": \"^9.0.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\nšŸ“„ Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe.git\", subdir = \"framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\n// import { capitalizeAndRemoveUnderscores } from // Unused './generateSchema';\n\n// import { readFileSync } from 'fs'; // Unused\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateDeployHook(config: DubheConfig, path: string) {\n if (!existsSync(path)) {\n const code = `module ${config.name}::deploy_hook {\n\t\t\t use dubhe::dapp_service::DappHub;\n\n public(package) fun run(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\nuse std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// Authorization token for the app.\n\n public struct DappKey has copy, drop {}\n\n public(package) fun new(): DappKey {\n DappKey { }\n }\n\n public fun to_string(): String {\n type_name::get<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::get<DappKey>().get_address();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n\n public fun eq<DappKey1: copy + drop, DappKey2: copy + drop>(_: &DappKey1, _: &DappKey2): bool {\n type_name::get<DappKey1>() == type_name::get<DappKey2>()\n }\n}\n`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\n// import { formatAndWriteMove } from // Unused '../formatAndWrite';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\n// import path from // Unused 'node:path';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { ErrorData } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateSchemaError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\nšŸ“¦ Starting Schema Error Generation...');\n\n let code = `module ${projectName}::errors {\n\t\t${Object.entries(errors)\n .map(([name, message]) => {\n console.log(` └─ ${name}: ${message}`);\n return `#[error]\n\t\t\t\tconst ${name.toUpperCase()}: vector<u8> = b\"${message}\";\n\t\t\t\tpublic fun ${name}_error(condition: bool) { assert!(condition, ${name.toUpperCase()}) }\n\t\t`;\n })\n .join('\\n')}\n }`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/errors.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n let init_test_code = `module ${config.name}::init_test {\n use sui::clock;\n use sui::test_scenario;\n use sui::test_scenario::Scenario;\n use dubhe::dapp_service::DappHub;\n use dubhe::dapp_system;\n\n public fun deploy_dapp_for_testing(scenario: &mut Scenario): DappHub {\n let ctx = test_scenario::ctx(scenario);\n let clock = clock::create_for_testing(ctx);\n let mut dapp_hub = dapp_system::create_dapp_hub_for_testing(ctx);\n ${config.name != 'dubhe' ? `dubhe::genesis::run(&mut dapp_hub, &clock, ctx);` : ''}\n ${config.name}::genesis::run(&mut dapp_hub, &clock, ctx);\n clock::destroy_for_testing(clock);\n test_scenario::next_tx(scenario, ctx.sender());\n dapp_hub\n }\n}\n`;\n await formatAndWriteMove(init_test_code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction getDappModuleName(projectName: string): string {\n return projectName === 'dubhe' ? 'dapp_service' : `dapp_system`;\n}\n\nexport async function generateComponents(config: DubheConfig, path: string) {\n console.log('\\nšŸ“¦ Starting Components Generation...');\n\n for (const [componentName, component] of Object.entries(config.components)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(component)}`);\n\n // Handle simple type cases\n if (typeof component === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, component, 'Onchain');\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n continue;\n }\n\n // Handle empty object cases, representing components with only entity_id key\n if (Object.keys(component).length === 0) {\n const code = generateComponentCode(config.name, componentName, {\n fields: {\n entity_id: 'address'\n },\n keys: ['entity_id'],\n offchain: false\n });\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n continue;\n }\n\n // Handle cases where keys are not defined - default to entity_id for components\n if (!component.keys) {\n component.keys = ['entity_id'];\n if (!component.fields['entity_id']) {\n component.fields = {\n entity_id: 'address',\n ...component.fields\n };\n }\n }\n\n // Validate that components only have one key\n if (component.keys && component.keys.length > 1) {\n throw new Error(\n `Component '${componentName}' can only have one key, but found ${\n component.keys.length\n } keys: ${component.keys.join(', ')}`\n );\n }\n\n const code = generateComponentCode(config.name, componentName, component);\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n }\n}\n\nfunction generateSimpleComponentCode(\n projectName: string,\n componentName: string,\n valueType: string,\n type: ComponentType = 'Onchain'\n): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n isEnum && valueType !== 'string' && valueType !== 'String'\n ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};`\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const TABLE_TYPE: vector<u8> = b\"Component\";\n const OFFCHAIN: bool = ${type === 'Offchain'};\n\n public fun get_table_id(): String {\n string(TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<String> { \n vector[string(b\"address\")]\n }\n\n public fun get_value_schemas(): vector<String> { \n vector[string(b\"${valueType}\")]\n }\n\n public fun get_key_names(): vector<String> { \n vector[string(b\"entity_id\")]\n }\n\n public fun get_value_names(): vector<String> { \n vector[string(b\"value\")]\n }\n\n public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n ${getDappModuleName(projectName)}::register_table(\n dapp_hub, \n dapp_key,\n string(TABLE_TYPE),\n get_table_id(), \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n OFFCHAIN,\n ctx\n );\n }\n\n public fun has(dapp_hub: &DappHub, entity_id: address): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n ${getDappModuleName(projectName)}::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, entity_id: address) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n ${getDappModuleName(\n projectName\n )}::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, OFFCHAIN);\n }\n\n public fun get(dapp_hub: &DappHub, entity_id: address): (${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${\n valueType === 'string' || valueType === 'String'\n ? `let value = dubhe::bcs::peel_string(&mut bsc_type);`\n : valueType === 'vector<String>'\n ? `let value = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : isEnum\n ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);`\n : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`\n }\n (value)\n }\n\n public(package) fun set(dapp_hub: &mut DappHub, entity_id: address, value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(to_bytes(&entity_id));\n let value_tuple = encode(value);\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple, OFFCHAIN);\n }\n\n public fun encode(value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${\n valueType === 'string' || valueType === 'String'\n ? `to_bytes(&into_bytes(value))`\n : valueType === 'vector<String>'\n ? `to_bytes(&value)`\n : isEnum\n ? `${projectName}::${enumModule}::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, component: any): string {\n const fields = component.fields;\n const keys = component.keys || ['entity_id'];\n const offchain = component.offchain || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n\n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields).filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n\n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields (both key fields and value fields) and their corresponding module names\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string) && type !== 'string' && type !== 'String')\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => self.findIndex((t) => t.type === item.type) === index);\n\n // Generate table related functions\n const tableFunctions = generateTableFunctions(\n projectName,\n componentName,\n fields,\n keys,\n !isAllKeys && !isSingleValue,\n allEnumTypes,\n type\n );\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n allEnumTypes.length > 0\n ? allEnumTypes\n .map(\n (e) => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`\n )\n .join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const TABLE_TYPE: vector<u8> = b\"Component\";\n const OFFCHAIN: bool = ${type === 'Offchain'};\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(\n (name) =>\n ` ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n },`\n )\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(\n (name) =>\n `${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }`\n )\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames.map((name) => ` ${name},`).join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(\n (name) => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n } {\n self.${name}\n }`\n )\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(\n (name) => ` public fun update_${name}(self: &mut ${toPascalCase(\n componentName\n )}, ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }) {\n self.${name} = ${name}\n }`\n )\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n allEnumTypes.length > 0\n ? allEnumTypes\n .map(\n (e) => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`\n )\n .join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const TABLE_TYPE: vector<u8> = b\"Component\";\n const OFFCHAIN: bool = ${type === 'Offchain'};\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return [\n 'address',\n 'bool',\n 'u8',\n 'u16',\n 'u32',\n 'u64',\n 'u128',\n 'u256',\n 'string',\n 'String',\n 'vector<address>',\n 'vector<bool>',\n 'vector<u8>',\n 'vector<u16>',\n 'vector<u32>',\n 'vector<u64>',\n 'vector<u128>',\n 'vector<u256>',\n 'vector<String>',\n 'vector<vector<address>>',\n 'vector<vector<bool>>',\n 'vector<vector<u8>>',\n 'vector<vector<u16>>',\n 'vector<vector<u32>>',\n 'vector<vector<u64>>',\n 'vector<vector<u128>>',\n 'vector<vector<u256>>'\n ].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{ type: string; module: string }> = [],\n _type: ComponentType = 'Onchain'\n): string {\n // Separate key fields and non-key fields\n const keyFields = keys.reduce((acc, key) => ({ ...acc, [key]: fields[key] }), {});\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n\n const _keyNames = Object.keys(keyFields);\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n\n // Generate key parameter list, if keys are empty, return empty string\n const keyParams = keys.length > 0 ? keys.map((k) => `${k}: ${fields[k]}`).join(', ') : '';\n\n // Generate key tuple related code, if keys are empty, return empty string\n const keyTupleCode =\n keys.length > 0\n ? `let mut key_tuple = vector::empty();\n ${keys.map((k) => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : 'let key_tuple = vector::empty();';\n\n // Generate table ID related functions\n const tableIdFunctions = ` public fun get_table_id(): String {\n string(TABLE_NAME)\n }\n\n public fun get_key_schemas(): vector<String> { \n vector[${keys.map((k) => `string(b\"${fields[k]}\")`).join(', ')}]\n }\n\n public fun get_value_schemas(): vector<String> { \n vector[${Object.values(valueFields)\n .map((t) => `string(b\"${t}\")`)\n .join(', ')}]\n }\n\n public fun get_key_names(): vector<String> { \n vector[${keys.map((k) => `string(b\"${k}\")`).join(', ')}]\n }\n\n public fun get_value_names(): vector<String> { \n vector[${valueNames.map((n) => `string(b\"${n}\")`).join(', ')}]\n }`;\n\n // Generate register table function\n const registerFunction = ` public(package) fun register_table(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n let dapp_key = dapp_key::new();\n ${getDappModuleName(projectName)}::register_table(\n dapp_hub,\n dapp_key,\n string(TABLE_TYPE),\n get_table_id(), \n get_key_schemas(), \n get_key_names(), \n get_value_schemas(), \n get_value_names(), \n OFFCHAIN,\n ctx\n );\n }`;\n\n // Generate has series functions\n const hasFunctions = ` public fun has(dapp_hub: &DappHub${\n keyParams ? ', ' + keyParams : ''\n }): bool {\n ${keyTupleCode}\n ${getDappModuleName(projectName)}::has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::ensure_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n\n public fun ensure_not_has(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::ensure_not_has_record<DappKey>(dapp_hub, get_table_id(), key_tuple)\n }\n `;\n\n // Generate delete function\n const deleteFunction = ` public(package) fun delete(dapp_hub: &mut DappHub${\n keyParams ? ', ' + keyParams : ''\n }) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::delete_record<DappKey>(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, OFFCHAIN);\n }`;\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n const getterSetters = !isSingleValue\n ? valueNames\n .map((name) => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n\n return ` public fun get_${name}(dapp_hub: &DappHub${\n keyParams ? ', ' + keyParams : ''\n }): ${fieldType === 'string' || fieldType === 'String' ? 'String' : fieldType} {\n ${keyTupleCode}\n let value = ${getDappModuleName(\n projectName\n )}::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${\n fieldType === 'string' || fieldType === 'String'\n ? `let ${name} = dubhe::bcs::peel_string(&mut bsc_type);`\n : fieldType === 'vector<String>'\n ? `let ${name} = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : isEnum\n ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);`\n : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`\n }\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${\n keyParams ? ', ' + keyParams : ''\n }, ${name}: ${fieldType === 'string' || fieldType === 'String' ? 'String' : fieldType}) {\n ${keyTupleCode}\n let value = ${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${name}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${name})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${name})`\n : `to_bytes(&${name})`\n };\n ${getDappModuleName(\n projectName\n )}::set_field(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, ${index}, value, OFFCHAIN);\n }`;\n })\n .join('\\n\\n')\n : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys\n ? ` public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple, OFFCHAIN);\n }`\n : isSingleValue\n ? ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n } {\n ${keyTupleCode}\n let value = ${getDappModuleName(\n projectName\n )}::get_field<DappKey>(dapp_hub, get_table_id(), key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? `let value = dubhe::bcs::peel_string(&mut bsc_type);`\n : Object.values(valueFields)[0] === 'vector<String>'\n ? `let value = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : !isBasicType(Object.values(valueFields)[0] as string)\n ? `let value = ${projectName}::${\n enumTypes.find((e) => e.type === Object.values(valueFields)[0])?.module\n }::decode(&mut bsc_type);`\n : `let value = sui::bcs::peel_${getBcsType(\n Object.values(valueFields)[0] as string\n )}(&mut bsc_type);`\n }\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple, OFFCHAIN);\n }`\n : ` public fun get(dapp_hub: &DappHub${keyParams ? ', ' + keyParams : ''}): (${Object.values(\n valueFields\n )\n .map((t) => (t === 'string' || t === 'String' ? 'String' : t))\n .join(', ')}) {\n ${keyTupleCode}\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames\n .map((name) => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `let ${name} = ${\n fieldType === 'string' || fieldType === 'String'\n ? `dubhe::bcs::peel_string(&mut bsc_type)`\n : fieldType === 'vector<String>'\n ? `dubhe::bcs::peel_vec_string(&mut bsc_type)`\n : isEnum\n ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)`\n : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`\n };`;\n })\n .join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${keyParams ? ', ' + keyParams : ''}, ${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple, OFFCHAIN);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct\n ? ` public fun get_struct(dapp_hub: &DappHub${\n keyParams ? ', ' + keyParams : ''\n }): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, get_table_id(), key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${\n keyParams ? ', ' + keyParams : ''\n }, ${componentName}: ${toPascalCase(componentName)}) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), get_table_id(), key_tuple, value_tuple, OFFCHAIN);\n }`\n : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back( ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? `to_bytes(&into_bytes(value))`\n : Object.values(valueFields)[0] === 'vector<String>'\n ? `to_bytes(&value)`\n : !isBasicType(Object.values(valueFields)[0] as string)\n ? `${projectName}::${\n enumTypes.find((e) => e.type === Object.values(valueFields)[0])?.module\n }::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }`\n : includeStruct\n ? ` public fun encode(${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `value_tuple.push_back(${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${n}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${n})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${n})`\n : `to_bytes(&${n})`\n });`;\n })\n .join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map((n) => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `let ${n} = ${\n fieldType === 'string' || fieldType === 'String'\n ? `string(sui::bcs::peel_vec_u8(&mut bsc_type))`\n : fieldType === 'vector<String>'\n ? `dubhe::bcs::peel_vec_string(&mut bsc_type)`\n : isEnum\n ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)`\n : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`\n };`;\n })\n .join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map((n) => `${n},`).join('\\n ')}\n }\n }`\n : '';\n\n return `${tableIdFunctions}\n\n${registerFunction}\n\n${hasFunctions}\n\n${deleteFunction}\n\n${getterSetters}\n\n${getSetFunctions}\n\n${structFunctions}\n\n${encodeDecodeFunctions}`;\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, _index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n if (innerType === 'String') {\n return 'vec_string';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n\n switch (type) {\n case 'u8':\n return 'u8';\n case 'u16':\n return 'u16';\n case 'u32':\n return 'u32';\n case 'u64':\n return 'u64';\n case 'u128':\n return 'u128';\n case 'u256':\n return 'u256';\n case 'bool':\n return 'bool';\n case 'address':\n return 'address';\n case 'String':\n return 'string';\n default:\n return type;\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n// import { existsSync } from 'fs'; // Unused\n// import { capitalizeAndRemoveUnderscores } from './generateSchema'; // Unused\n// import path from 'node:path'; // Unused\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nfunction capitalizeFirstLetter(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nexport async function generateGenesis(config: DubheConfig, path: string) {\n let genesis_code = `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service::DappHub;\n use ${config.name}::dapp_key;\n use dubhe::dapp_system;\n use std::ascii::string;\n\n public entry fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // Create Dapp\n let dapp_key = dapp_key::new();\n dapp_system::create_dapp(dapp_hub, dapp_key, string(b\"${config.name}\"), string(b\"${config.description}\"), clock, ctx);\n\n // Logic that needs to be automated once the contract is deployed\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n}\n`;\n await formatAndWriteMove(genesis_code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\nšŸ“¦ Starting Enums Generation...');\n\n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` └─ ${enumName}: ${JSON.stringify(values)}`);\n\n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n\n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(code, `${path}/${toSnakeCase(enumName)}.move`, 'formatAndWriteMove');\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map((v) => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n\n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values\n .map(\n (v) => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`\n )\n .join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values\n .map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`)\n .join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig } from '../../types';\nimport { ComponentType } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction getDappModuleName(projectName: string): string {\n return projectName === 'dubhe' ? 'dapp_service' : `dapp_system`;\n}\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\nšŸ“¦ Starting Resources Generation...');\n\n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(resource)}`);\n\n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(\n `Resource '${componentName}' must have fields defined, but found empty object`\n );\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n\n const code = generateComponentCode(config.name, componentName, resource);\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n }\n}\n\nfunction generateSimpleComponentCode(\n projectName: string,\n componentName: string,\n valueType: string,\n type: ComponentType = 'Onchain'\n): string {\n // Check if it's an enum type\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n const isOffchain = type === 'Offchain';\n\n // For offchain resources, only generate set and encode functions\n const readFunctions = !isOffchain\n ? `\n public fun has(dapp_hub: &DappHub, resource_account: String): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${getDappModuleName(\n projectName\n )}::has_record<DappKey>(dapp_hub, resource_account, key_tuple)\n }\n\n public(package) fun delete(dapp_hub: &mut DappHub, resource_account: String) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${getDappModuleName(\n projectName\n )}::delete_record<DappKey>(dapp_hub, dapp_key::new(), key_tuple, resource_account);\n }\n\n public fun get(dapp_hub: &DappHub, resource_account: String): (${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, resource_account, key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${\n valueType === 'string' || valueType === 'String'\n ? `let value = dubhe::bcs::peel_string(&mut bsc_type);`\n : valueType === 'vector<String>'\n ? `let value = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : isEnum\n ? `let value = ${projectName}::${enumModule}::decode(&mut bsc_type);`\n : `let value = sui::bcs::peel_${getBcsType(valueType)}(&mut bsc_type);`\n }\n (value)\n }\n`\n : '';\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n isEnum && valueType !== 'string' && valueType !== 'String'\n ? ` use ${projectName}::${enumModule};\n use ${projectName}::${enumModule}::{${valueType}};`\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${type === 'Offchain'};\n\n${readFunctions}\n public(package) fun set(dapp_hub: &mut DappHub, resource_account: String, value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }, ctx: &mut TxContext) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n let value_tuple = encode(value);\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, resource_account, OFFCHAIN, ctx);\n }\n\n public fun encode(value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${\n valueType === 'string' || valueType === 'String'\n ? `to_bytes(&into_bytes(value))`\n : valueType === 'vector<String>'\n ? `to_bytes(&value)`\n : isEnum\n ? `${projectName}::${enumModule}::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const global = (resource as any).global || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n\n // Check if it's global: offchain=true OR global=true\n const isGlobal = offchain || global;\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n\n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields).filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n\n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Get all enum type fields and their corresponding module names\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string) && type !== 'string' && type !== 'String')\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => self.findIndex((t) => t.type === item.type) === index);\n\n // Generate table related functions\n const tableFunctions = generateTableFunctions(\n projectName,\n componentName,\n fields,\n keys,\n !isAllKeys && !isSingleValue,\n enumTypes,\n type,\n isGlobal\n );\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n enumTypes.length > 0\n ? enumTypes\n .map(\n (e) => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`\n )\n .join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${offchain};\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(\n (name) =>\n ` ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n },`\n )\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(\n (name) =>\n `${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }`\n )\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames.map((name) => ` ${name},`).join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(\n (name) => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n } {\n self.${name}\n }`\n )\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(\n (name) => ` public fun update_${name}(self: &mut ${toPascalCase(\n componentName\n )}, ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }) {\n self.${name} = ${name}\n }`\n )\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} { \n use sui::bcs::{to_bytes};\n use std::ascii::{string, String, into_bytes};\n use dubhe::table_id;\n use dubhe::dapp_service::{Self, DappHub};\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n enumTypes.length > 0\n ? enumTypes\n .map(\n (e) => ` use ${projectName}::${e.module};\n use ${projectName}::${e.module}::{${e.type}};`\n )\n .join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${offchain};\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return [\n 'address',\n 'bool',\n 'u8',\n 'u32',\n 'u64',\n 'u128',\n 'u256',\n 'string',\n 'String',\n 'vector<address>',\n 'vector<bool>',\n 'vector<u8>',\n 'vector<vector<u8>>',\n 'vector<u32>',\n 'vector<u64>',\n 'vector<u128>',\n 'vector<u256>',\n 'vector<String>'\n ].includes(type);\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{ type: string; module: string }> = [],\n type: ComponentType = 'Onchain',\n isGlobal: boolean = false\n): string {\n // Separate key fields and non-key fields\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n // Check if it's offchain\n const isOffchain = type === 'Offchain';\n\n // Generate key parameter list\n const keyParams = keys.length > 0 ? keys.map((k) => `${k}: ${fields[k]}`).join(', ') : '';\n\n // Generate key tuple related code\n const keyTupleCode =\n keys.length > 0\n ? `let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${keys.map((k) => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : `let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);`;\n\n // For global resources, use package_id() as resource_account\n const resourceAccountParam = isGlobal ? '' : 'resource_account: String';\n const resourceAccountArg = isGlobal\n ? 'dapp_key::package_id().to_ascii_string()'\n : 'resource_account';\n\n // Add comma after resourceAccountParam only if both exist\n const paramSeparator = resourceAccountParam && keyParams ? ', ' : '';\n\n // Generate has series functions - skip for offchain\n const hasFunctions = !isOffchain\n ? ` public fun has(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}): bool {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::has_record<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple)\n }\n\n public fun ensure_has(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::ensure_has_record<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple)\n }\n\n public fun ensure_has_not(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::ensure_has_not_record<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple)\n }\n `\n : '';\n\n // Generate delete function - skip for offchain\n const deleteFunction = !isOffchain\n ? ` public(package) fun delete(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}) {\n ${keyTupleCode}\n ${getDappModuleName(\n projectName\n )}::delete_record<DappKey>(dapp_hub, dapp_key::new(), key_tuple, ${resourceAccountArg});\n }`\n : '';\n\n // Generate getter and setter functions, only generated when there are multiple value fields\n // For offchain, skip all getter and setter functions\n const getterSetters =\n !isSingleValue && !isOffchain\n ? valueNames\n .map((name) => {\n const index = valueNames.indexOf(name);\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n\n return ` public fun get_${name}(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}): ${\n fieldType === 'string' || fieldType === 'String'\n ? 'String'\n : fieldType === 'vector<String>'\n ? 'vector<String>'\n : fieldType\n } {\n ${keyTupleCode}\n let value = ${getDappModuleName(\n projectName\n )}::get_field<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple, ${index});\n let mut bsc_type = sui::bcs::new(value);\n ${\n fieldType === 'string' || fieldType === 'String'\n ? `let ${name} = dubhe::bcs::peel_string(&mut bsc_type);`\n : fieldType === 'vector<String>'\n ? `let ${name} = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : isEnum\n ? `let ${name} = ${projectName}::${enumType?.module}::decode(&mut bsc_type);`\n : `let ${name} = sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type);`\n }\n ${name}\n }\n\n public(package) fun set_${name}(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ${name}: ${\n fieldType === 'string' || fieldType === 'String'\n ? 'String'\n : fieldType === 'vector<String>'\n ? 'vector<String>'\n : fieldType\n }) {\n ${keyTupleCode}\n let value = ${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${name}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${name})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${name})`\n : `to_bytes(&${name})`\n };\n ${getDappModuleName(\n projectName\n )}::set_field(dapp_hub, dapp_key::new(), key_tuple, ${index}, value, ${resourceAccountArg});\n }`;\n })\n .join('\\n\\n')\n : '';\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys\n ? ` public(package) fun set(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = vector::empty();\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : isSingleValue\n ? !isOffchain\n ? ` public fun get(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}): ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n } {\n ${keyTupleCode}\n let value = ${getDappModuleName(\n projectName\n )}::get_field<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple, 0);\n let mut bsc_type = sui::bcs::new(value);\n ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? `let value = dubhe::bcs::peel_string(&mut bsc_type);`\n : Object.values(valueFields)[0] === 'vector<String>'\n ? `let value = dubhe::bcs::peel_vec_string(&mut bsc_type);`\n : !isBasicType(Object.values(valueFields)[0] as string)\n ? `let value = ${projectName}::${\n enumTypes.find((e) => e.type === Object.values(valueFields)[0])?.module\n }::decode(&mut bsc_type);`\n : `let value = sui::bcs::peel_${getBcsType(\n Object.values(valueFields)[0] as string\n )}(&mut bsc_type);`\n }\n value\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : ` public(package) fun set(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode(value);\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : !isOffchain\n ? ` public fun get(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}): (${Object.values(valueFields)\n .map((t) => (t === 'string' || t === 'String' ? 'String' : t))\n .join(', ')}) {\n ${keyTupleCode}\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple);\n let mut bsc_type = sui::bcs::new(value_tuple);\n ${valueNames\n .map((name) => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `let ${name} = ${\n fieldType === 'string' || fieldType === 'String'\n ? `dubhe::bcs::peel_string(&mut bsc_type)`\n : fieldType === 'vector<String>'\n ? `dubhe::bcs::peel_vec_string(&mut bsc_type)`\n : isEnum\n ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)`\n : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`\n };`;\n })\n .join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : ` public(package) fun set(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode(${valueNames.join(', ')});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct\n ? !isOffchain\n ? ` public fun get_struct(dapp_hub: &DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n let value_tuple = ${getDappModuleName(\n projectName\n )}::get_record<DappKey>(dapp_hub, ${resourceAccountArg}, key_tuple);\n decode(value_tuple)\n }\n\n public(package) fun set_struct(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ${componentName}: ${toPascalCase(\n componentName\n )}, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : ` public(package) fun set_struct(dapp_hub: &mut DappHub${\n resourceAccountParam || keyParams ? ', ' : ''\n }${resourceAccountParam}${paramSeparator}${keyParams}, ${componentName}: ${toPascalCase(\n componentName\n )}, ctx: &mut TxContext) {\n ${keyTupleCode}\n let value_tuple = encode_struct(${componentName});\n ${getDappModuleName(\n projectName\n )}::set_record(dapp_hub, dapp_key::new(), key_tuple, value_tuple, ${resourceAccountArg}, OFFCHAIN, ctx);\n }`\n : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? `to_bytes(&into_bytes(value))`\n : Object.values(valueFields)[0] === 'vector<String>'\n ? `to_bytes(&value)`\n : !isBasicType(Object.values(valueFields)[0] as string)\n ? `${projectName}::${\n enumTypes.find((e) => e.type === Object.values(valueFields)[0])?.module\n }::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }`\n : includeStruct\n ? !isOffchain\n ? ` public fun encode(${valueNames\n .map(\n (n) =>\n `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `value_tuple.push_back(${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${n}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${n})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${n})`\n : `to_bytes(&${n})`\n });`;\n })\n .join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map((n) => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bsc_type = sui::bcs::new(data);\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `let ${n} = ${\n fieldType === 'string' || fieldType === 'String'\n ? `string(sui::bcs::peel_vec_u8(&mut bsc_type))`\n : fieldType === 'vector<String>'\n ? `dubhe::bcs::peel_vec_string(&mut bsc_type)`\n : isEnum\n ? `${projectName}::${enumType?.module}::decode(&mut bsc_type)`\n : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bsc_type)`\n };`;\n })\n .join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map((n) => `${n},`).join('\\n ')}\n }\n }`\n : ` public fun encode(${valueNames\n .map(\n (n) =>\n `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `value_tuple.push_back(${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${n}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${n})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${n})`\n : `to_bytes(&${n})`\n });`;\n })\n .join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map((n) => `${componentName}.${n}`).join(', ')})\n }`\n : '';\n\n // Filter out empty sections and join with proper spacing\n const sections = [\n hasFunctions,\n deleteFunction,\n getterSetters,\n getSetFunctions,\n structFunctions,\n encodeDecodeFunctions\n ].filter((section) => section.trim().length > 0);\n\n return sections.join('\\n\\n');\n}\n\nfunction toPascalCase(str: string): string {\n // Split the underscore-separated string into words\n return str\n .split('_')\n .map((word, _index) => {\n // If the word is a pure number, return it as is\n if (/^\\d+$/.test(word)) {\n return word;\n }\n // Otherwise, capitalize the first letter and lowercase the rest\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n if (innerType === 'String') {\n return 'vec_string';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n\n switch (type) {\n case 'u8':\n return 'u8';\n case 'u16':\n return 'u16';\n case 'u32':\n return 'u32';\n case 'u64':\n return 'u64';\n case 'u128':\n return 'u128';\n case 'u256':\n return 'u256';\n case 'bool':\n return 'bool';\n case 'address':\n return 'address';\n case 'String':\n return 'string';\n default:\n return type;\n }\n}\n","import { DubheConfig } from '../../types';\n\nconst checkDuplicateKeys = (config: DubheConfig): void => {\n const componentKeys = Object.keys(config.components || {});\n const resourceKeys = Object.keys(config.resources || {});\n\n const duplicates = componentKeys.filter((key) => resourceKeys.includes(key));\n\n if (duplicates.length > 0) {\n throw new Error(\n `Duplicate keys found between components and resources: ${duplicates.join(', ')}`\n );\n }\n};\n\nexport const defineConfig = (config: DubheConfig): DubheConfig => {\n checkDuplicateKeys(config);\n return config;\n};\n","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nexport async function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export const parseData = (data: any) => {\n if (typeof data !== 'object' || data === null) {\n return data;\n }\n const parsedData: any = {};\n for (const key in data) {\n if (data.hasOwnProperty(key)) {\n // @ts-ignore\n const value = data[key];\n // console.log(\"===========\", value)\n if (typeof value === 'object' && value !== null) {\n if (Array.isArray(value)) {\n parsedData[key] = handleArray(value);\n } else if (value.hasOwnProperty('variant')) {\n parsedData[key] = { [value.variant]: {} };\n } else if (value.hasOwnProperty('fields')) {\n parsedData[key] = parseData(value.fields);\n } else {\n parsedData[key] = parseData(value);\n }\n } else {\n parsedData[key] = value;\n }\n }\n }\n return parsedData;\n};\n\nconst handleArray = (data: any[]): any[] => {\n let returnData: any[] = [];\n data.forEach((item) => {\n if (typeof item === 'object' && item !== null) {\n if (Array.isArray(item)) {\n returnData.push(handleArray(item));\n } else if (item.hasOwnProperty('variant')) {\n returnData.push({ [item.variant]: {} });\n } else if (item.hasOwnProperty('fields')) {\n returnData.push(parseData(item.fields));\n } else {\n returnData.push(parseData(item));\n }\n } else {\n returnData.push(item);\n }\n });\n return returnData;\n};\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"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","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","formatTypescript","fs","path","createDebug","debug","error","debug","error","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","schemaPrefix","initPrefix","code","deployHookPrefix","fs","path","debug","formatAndWriteTypescript","formatTypescript","posixPath","path","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","existsSync","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","generateSchemaError","projectName","errors","path","code","name","message","formatAndWriteMove","generateInitTest","config","path","init_test_code","formatAndWriteMove","getDappModuleName","projectName","generateComponents","config","path","componentName","component","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","getBcsType","str","letter","fields","keys","isAllKeys","name","valueFieldNames","isSingleValue","allEnumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","enumTypes","_type","keyFields","acc","key","valueFields","_keyNames","valueNames","keyParams","k","keyTupleCode","tableIdFunctions","n","registerFunction","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","structFunctions","encodeDecodeFunctions","word","_index","innerType","generateGenesis","config","path","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","i","getDappModuleName","projectName","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","generateComponentCode","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","readFunctions","getBcsType","str","letter","fields","keys","offchain","global","isGlobal","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","tableFunctions","generateTableFunctions","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","includeStruct","acc","valueNames","isOffchain","keyParams","k","keyTupleCode","resourceAccountParam","resourceAccountArg","paramSeparator","hasFunctions","deleteFunction","getterSetters","fieldType","enumType","getSetFunctions","n","structFunctions","encodeDecodeFunctions","section","word","_index","innerType","path","schemaGen","rootDir","config","network","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","componentsPath","generateComponents","resourcesPath","generateResources","enumsPath","generateEnums","generateSchemaError","generateSystemsAndTests","generateMigrate","checkDuplicateKeys","config","componentKeys","resourceKeys","duplicates","key","defineConfig","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","parseData","data","parsedData","key","value","handleArray","returnData","item","SubscriptionKind"]}
1
+ {"version":3,"sources":["../src/codegen/utils/format.ts","../src/codegen/utils/formatAndWrite.ts","../src/debug.ts","../src/codegen/debug.ts","../src/codegen/utils/renderMove/codegen.ts","../src/codegen/utils/renderMove/common.ts","../package.json","../src/codegen/utils/renderMove/generateToml.ts","../src/codegen/utils/renderMove/generateScript.ts","../src/codegen/utils/renderMove/generateDappKey.ts","../src/codegen/utils/renderMove/generateSystem.ts","../src/codegen/utils/renderMove/generateError.ts","../src/codegen/utils/renderMove/generateInitTest.ts","../src/codegen/utils/renderMove/generateGenesis.ts","../src/codegen/utils/renderMove/generateEnums.ts","../src/codegen/utils/renderMove/generateResources.ts","../src/codegen/utils/renderMove/generateObjects.ts","../src/codegen/utils/renderMove/generatePermits.ts","../src/codegen/utils/renderMove/generateScenes.ts","../src/codegen/utils/renderMove/generateUserStorageInit.ts","../src/codegen/utils/generateLock.ts","../src/codegen/utils/validateConfig.ts","../src/codegen/utils/renderMove/dapp.ts","../src/codegen/utils/config.ts","../src/codegen/utils/errors.ts","../src/primitives/index.ts"],"sourcesContent":["import prettier from 'prettier';\nimport prettierPluginMove from 'prettier-plugin-move-js';\n\nexport async function formatMove(content: string, prettierConfigPath?: string): Promise<string> {\n let config;\n if (prettierConfigPath) {\n config = await prettier.resolveConfig(prettierConfigPath);\n }\n try {\n return prettier.format(content, {\n plugins: [prettierPluginMove],\n parser: 'move-parse',\n printWidth: 120,\n semi: true,\n tabWidth: 2,\n useTabs: false,\n bracketSpacing: true,\n ...config\n });\n } catch (error) {\n let message;\n if (error instanceof Error) {\n message = error.message;\n } else {\n message = error;\n }\n console.log(`Error during output formatting: ${message}`);\n return content;\n }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { debug } from '../debug';\n\nexport async function formatAndWriteMove(\n output: string,\n fullOutputPath: string,\n logPrefix?: string\n): Promise<void> {\n const formattedOutput = output;\n const fileHeader = `// Copyright (c) Obelisk Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/* Autogenerated file. Do not edit manually. */\n\n`;\n\n const initPrefix = `#[test_only]\\n`;\n\n let code = fileHeader + formattedOutput;\n\n const deployHookPrefix = `#[allow(lint(share_owned))]\\n`;\n\n if (\n fullOutputPath.includes('.toml') ||\n fullOutputPath.includes('system') ||\n fullOutputPath.includes('migrate')\n ) {\n code = formattedOutput;\n } else if (fullOutputPath.includes('init_test')) {\n code = initPrefix + formattedOutput;\n } else if (fullOutputPath.includes('genesis')) {\n code = deployHookPrefix + formattedOutput;\n }\n\n await fs.mkdir(path.dirname(fullOutputPath), { recursive: true });\n await fs.writeFile(fullOutputPath, code);\n debug(`${logPrefix}: ${fullOutputPath}`);\n}\n","import createDebug from 'debug';\n\nexport const debug = createDebug('dubhe:common');\nexport const error = createDebug('dubhe:common');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { debug as parentDebug } from '../debug';\n\nexport const debug = parentDebug.extend('codegen');\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n","import { DubheConfig } from '../../types';\nimport { existsSync } from 'fs';\nimport { deleteFolderRecursive } from './common';\nimport { generateToml } from './generateToml';\nimport { generateDeployHook, generateMigrate } from './generateScript';\nimport { generateDappKey } from './generateDappKey';\nimport { generateSystemsAndTests } from './generateSystem';\nimport { generateError } from './generateError';\nimport { generateInitTest } from './generateInitTest';\nimport { generateGenesis } from './generateGenesis';\nimport { generateEnums } from './generateEnums';\nimport { generateResources } from './generateResources';\nimport { generateObjects } from './generateObjects';\nimport { generatePermits } from './generatePermits';\nimport { generateScenes } from './generateScenes';\nimport { generateUserStorageInit } from './generateUserStorageInit';\nimport { checkAndUpdateLock } from '../generateLock';\nimport { validateConfig } from '../validateConfig';\nimport path from 'node:path';\n\nexport async function codegen(\n rootDir: string,\n config: DubheConfig,\n network?: 'mainnet' | 'testnet' | 'devnet' | 'localnet',\n initialMode: 0 | 1 = 1\n) {\n console.log('\\nšŸš€ Starting Code Generation Process...');\n console.log('šŸ“‹ Project Configuration:');\n console.log(` └─ Name: ${config.name}`);\n console.log(` └─ Description: ${config.description || 'No description provided'}`);\n console.log(` └─ Network: ${network || 'testnet'}`);\n console.log(` └─ Settlement Mode: ${initialMode === 1 ? 'USER_PAYS' : 'DAPP_SUBSIDIZES'}`);\n\n // Validate config once here — defineConfig also validates on load, but that\n // is the same process call, so we suppress duplicates by making this the\n // single codegen-phase validation point.\n validateConfig(config);\n\n // Check for breaking field changes and update the lock file.\n checkAndUpdateLock(rootDir, config);\n\n console.log(rootDir);\n const projectDir = path.join(rootDir, 'src', config.name);\n\n if (existsSync(`${projectDir}`)) {\n deleteFolderRecursive(`${projectDir}/sources/codegen`);\n }\n\n if (!existsSync(`${projectDir}/Move.toml`)) {\n await generateToml(config, rootDir);\n }\n\n const genesisPath = path.join(projectDir, 'sources', 'codegen', 'genesis.move');\n if (!existsSync(genesisPath)) {\n await generateGenesis(config, genesisPath, initialMode);\n }\n\n const initTestPath = path.join(projectDir, 'sources', 'codegen', 'init_test.move');\n if (!existsSync(initTestPath)) {\n await generateInitTest(config, initTestPath);\n }\n\n const dappKeyPath = path.join(projectDir, 'sources', 'codegen', 'dapp_key.move');\n if (!existsSync(dappKeyPath)) {\n await generateDappKey(config, dappKeyPath);\n }\n\n const deployHookPath = path.join(projectDir, 'sources', 'scripts', 'deploy_hook.move');\n if (!existsSync(deployHookPath)) {\n await generateDeployHook(config, deployHookPath, initialMode);\n }\n\n const resourcesPath = path.join(projectDir, 'sources', 'codegen', 'resources');\n await generateResources(config, resourcesPath);\n\n const objectsPath = path.join(projectDir, 'sources', 'codegen', 'objects');\n await generateObjects(config, objectsPath);\n\n const permitsPath = path.join(projectDir, 'sources', 'codegen', 'permits');\n await generatePermits(config, permitsPath);\n\n const scenesPath = path.join(projectDir, 'sources', 'codegen', 'scenes');\n await generateScenes(config, scenesPath);\n\n const enumsPath = path.join(projectDir, 'sources', 'codegen', 'enums');\n if (!existsSync(enumsPath)) {\n await generateEnums(config, enumsPath);\n }\n\n if (config.errors) {\n await generateError(config.name, config.errors, rootDir);\n }\n\n const userStorageInitPath = path.join(projectDir, 'sources', 'codegen', 'user_storage_init.move');\n await generateUserStorageInit(config, userStorageInitPath);\n\n await generateSystemsAndTests(config, rootDir);\n await generateMigrate(config, rootDir);\n console.log('\\nāœ… Code Generation Complete!\\n');\n}\n\n/** @deprecated Use `codegen` instead. */\nexport const schemaGen = codegen;\n","import fs from 'fs';\n\nexport function deleteFolderRecursive(path: string) {\n if (fs.existsSync(path)) {\n fs.readdirSync(path).forEach((file) => {\n const curPath = `${path}/${file}`;\n if (fs.lstatSync(curPath).isDirectory()) {\n deleteFolderRecursive(curPath);\n } else {\n fs.unlinkSync(curPath);\n }\n });\n fs.rmdirSync(path);\n }\n}\n","{\n \"name\": \"@0xobelisk/sui-common\",\n \"version\": \"2.0.0\",\n \"description\": \"Common low level logic shared between packages\",\n \"keywords\": [\n \"sui\",\n \"obelisk labs\",\n \"move\",\n \"blockchain\"\n ],\n \"homepage\": \"https://github.com/0xobelisk/dubhe/tree/main/packages/sui-common#readme\",\n \"bugs\": \"https://github.com/0xobelisk/dubhe/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/0xobelisk/dubhe.git\"\n },\n \"license\": \"Apache-2.0\",\n \"author\": \"team@obelisk.build\",\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"typesVersions\": {\n \"*\": {\n \"index\": [\n \"./src/index.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"pnpm run type-check && pnpm run build:js\",\n \"build:js\": \"tsup && chmod +x ./dist/index.js\",\n \"clean\": \"pnpm run clean:js\",\n \"clean:js\": \"rimraf dist\",\n \"dev\": \"tsup --watch\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint . --ext .ts\",\n \"test\": \"vitest\",\n \"type-check\": \"tsc --noEmit\",\n \"validate\": \"pnpm format:check && pnpm type-check\"\n },\n \"dependencies\": {\n \"chalk\": \"^5.0.1\",\n \"debug\": \"^4.3.4\",\n \"dotenv\": \"^16.0.3\",\n \"ejs\": \"^3.1.8\",\n \"esbuild\": \"^0.17.15\",\n \"execa\": \"^7.0.0\",\n \"find-up\": \"^6.3.0\",\n \"glob\": \"^10.5.0\",\n \"path\": \"^0.12.7\",\n \"prettier\": \"^3.1.1\",\n \"prettier-plugin-move-js\": \"^0.0.5\",\n \"typescript\": \"^5.8.3\",\n \"yargs\": \"^17.7.1\",\n \"zod\": \"^3.22.3\",\n \"zod-validation-error\": \"^1.3.0\"\n },\n \"devDependencies\": {\n \"@types/debug\": \"^4.1.12\",\n \"@types/ejs\": \"^3.1.1\",\n \"@types/glob\": \"^7.2.0\",\n \"@types/node\": \"^22.16.0\",\n \"@types/yargs\": \"^17.0.10\",\n \"eslint\": \"^9.0.0\",\n \"eslint-config-prettier\": \"^9.1.0\",\n \"prettier\": \"3.3.3\",\n \"tsup\": \"^6.7.0\",\n \"tsx\": \"^3.12.6\",\n \"vitest\": \"^2.1.3\"\n },\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport packageJson from '../../../../package.json';\n\nexport async function generateToml(config: DubheConfig, srcPrefix: string) {\n console.log('\\nšŸ“„ Starting Move.toml Generation...');\n console.log(` └─ Output path: ${srcPrefix}/src/${config.name}/Move.toml`);\n\n let code = `[package]\nname = \"${config.name}\"\nversion = \"1.0.0\"\nedition = \"2024\"\n\n[dependencies]\nSui = { git = \"https://github.com/MystenLabs/sui.git\", subdir = \"crates/sui-framework/packages/sui-framework\", rev = \"mainnet-v1.46.3\" }\nDubhe = { git = \"https://github.com/0xobelisk/dubhe.git\", subdir = \"framework/src/dubhe\", rev = \"v${packageJson.version}\" }\n\n[addresses]\nsui = \"0x2\"\n${config.name} = \"0x0\"\n`;\n await formatAndWriteMove(code, `${srcPrefix}/src/${config.name}/Move.toml`, 'formatAndWriteMove');\n console.log('āœ… Move.toml Generation Complete\\n');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport { existsSync } from 'fs';\n\nexport async function generateDeployHook(\n config: DubheConfig,\n path: string,\n initialMode: 0 | 1 = 1\n) {\n if (!existsSync(path)) {\n const modeComment =\n initialMode === 1\n ? `// Settlement mode: USER_PAYS — users pay transaction fees at settlement time.\n // The framework admin sets the revenue share via set_dapp_revenue_share.\n // Initialise any DappStorage-level defaults here (e.g. resource starting values).`\n : `// Settlement mode: DAPP_SUBSIDIZES — the DApp pays for user operations.\n // Recharge the credit pool via dapp_system::recharge_credit before users can write.\n // Initialise any DappStorage-level defaults here (e.g. resource starting values).`;\n\n const code = `module ${config.name}::deploy_hook {\n use dubhe::dapp_service::DappStorage;\n\n public(package) fun run(_dapp_storage: &mut DappStorage, _ctx: &mut TxContext) {\n ${modeComment}\n }\n}`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n }\n}\n\nexport async function generateMigrate(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`)) {\n let code = `module ${config.name}::migrate {\n const ON_CHAIN_VERSION: u32 = 1;\n\n public fun on_chain_version(): u32 {\n ON_CHAIN_VERSION\n }\n}\n`;\n await formatAndWriteMove(\n code,\n `${srcPrefix}/src/${config.name}/sources/scripts/migrate.move`,\n 'formatAndWriteMove'\n );\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateDappKey(config: DubheConfig, path: string) {\n let code = `module ${config.name}::dapp_key {\n use std::type_name;\n use sui::address;\n use std::ascii::String;\n\n /// DappKey — package-level authorization token for this DApp.\n ///\n /// SECURITY: \\`new()\\` is intentionally \\`public(package)\\`.\n /// Only code compiled into this package can construct a DappKey instance.\n /// All framework write functions (\\`set_record\\`, \\`set_field\\`,\n /// \\`take_record\\`, \\`create_user_storage\\`, …) require \\`_auth: DappKey\\`\n /// as proof that the call originated from inside this package — an\n /// external PTB cannot fabricate that proof.\n ///\n /// NEVER change \\`new()\\` to \\`public\\`, and never accept a DappKey\n /// value as a parameter from an external caller. Either mistake removes\n /// every package-level access guard, allowing any PTB to write arbitrary\n /// user data or register UserStorages without going through the DApp's\n /// own entry functions.\n\n public struct DappKey has copy, drop {}\n\n /// Constructs an authorization token. Callable only from within this package.\n /// Pass the result as \\`_auth\\` to any framework function that requires it.\n public(package) fun new(): DappKey {\n DappKey {}\n }\n\n public fun to_string(): String {\n type_name::with_defining_ids<DappKey>().into_string()\n }\n\n public fun package_id(): address {\n let package_id_str = type_name::with_defining_ids<DappKey>().address_string();\n address::from_ascii_bytes(package_id_str.as_bytes())\n }\n\n public fun eq<DappKey1: copy + drop, DappKey2: copy + drop>(_: &DappKey1, _: &DappKey2): bool {\n type_name::with_defining_ids<DappKey1>() == type_name::with_defining_ids<DappKey2>()\n }\n}\n`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\nimport { existsSync } from 'fs';\nimport fs from 'node:fs/promises';\n\nexport async function generateSystemsAndTests(config: DubheConfig, srcPrefix: string) {\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/systems`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/systems`, { recursive: true });\n }\n if (!existsSync(`${srcPrefix}/src/${config.name}/sources/tests`)) {\n await fs.mkdir(`${srcPrefix}/src/${config.name}/sources/tests`, { recursive: true });\n }\n}\n","import { ErrorData, ErrorEntry } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toErrorConstName(key: string): string {\n return (\n 'E' +\n key\n .split('_')\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('')\n );\n}\n\nfunction getMessage(entry: ErrorEntry): string {\n return typeof entry === 'string' ? entry : entry.message;\n}\n\nexport async function generateError(projectName: string, errors: ErrorData, path: string) {\n console.log('\\nšŸ“¦ Starting Error Generation...');\n\n const entries = Object.entries(errors)\n .map(([name, entry]) => {\n const constName = toErrorConstName(name);\n const message = getMessage(entry as ErrorEntry);\n console.log(` └─ ${name}: ${message}`);\n return [\n ` #[error]`,\n ` const ${constName}: vector<u8> = b\"${message}\";`,\n ` public fun ${name}(condition: bool) { assert!(condition, ${constName}) }`\n ].join('\\n');\n })\n .join('\\n\\n');\n\n const code = `module ${projectName}::error {\\n${entries}\\n}\\n`;\n\n await formatAndWriteMove(\n code,\n `${path}/src/${projectName}/sources/codegen/error.move`,\n 'formatAndWriteMove'\n );\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateInitTest(config: DubheConfig, path: string) {\n // For the dubhe package itself, we only need DappHub helpers (no UserStorage/DappStorage per-DApp).\n // For DApp packages, expose all three test helpers.\n const isDubhe = config.name === 'dubhe';\n\n const dappSpecificHelpers = !isDubhe\n ? `\n /// Create a DappStorage for this DApp without sharing it.\n /// Suitable for unit tests that exercise global-resource functions.\n public fun create_dapp_storage_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappStorage {\n dubhe::dapp_system::create_dapp_storage_for_testing<${config.name}::dapp_key::DappKey>(ctx)\n }\n\n /// Create a UserStorage for \\`owner\\` without sharing it.\n /// Suitable for unit tests that exercise user-level resource functions.\n public fun create_user_storage_for_testing(owner: address, ctx: &mut TxContext): dubhe::dapp_service::UserStorage {\n dubhe::dapp_system::create_user_storage_for_testing<${config.name}::dapp_key::DappKey>(owner, ctx)\n }`\n : '';\n\n let init_test_code = `\nmodule ${config.name}::init_test {\n use dubhe::dapp_system;\n\n /// Create a DappHub for testing without sharing it.\n /// Suitable for unit tests that need a DappHub context.\n public fun create_dapp_hub_for_testing(ctx: &mut TxContext): dubhe::dapp_service::DappHub {\n dapp_system::create_dapp_hub_for_testing(ctx)\n }\n${dappSpecificHelpers}\n}\n`;\n await formatAndWriteMove(init_test_code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nexport async function generateGenesis(config: DubheConfig, path: string, initialMode: 0 | 1 = 1) {\n // The dubhe framework itself is not a DApp — it provides the infrastructure.\n // Its genesis only needs to call deploy_hook::run to initialise framework state\n // (fee config, admin, etc.) without creating a DappStorage for itself.\n const isDubheFramework = config.name === 'dubhe';\n\n let genesis_code = isDubheFramework\n ? `module ${config.name}::genesis {\n use dubhe::dapp_service::DappHub;\n\n // The framework genesis initialises the DappHub state via deploy_hook.\n // No DappStorage is created for the framework itself — the framework is\n // infrastructure, not a DApp.\n public fun run(dapp_hub: &mut DappHub, ctx: &mut TxContext) {\n ${config.name}::deploy_hook::run(dapp_hub, ctx);\n }\n\n // Called during framework upgrades to run any custom migration logic.\n // \\`dubhe upgrade\\` rewrites the region between the separator comments.\n public(package) fun migrate(_dapp_hub: &mut DappHub, _ctx: &mut TxContext) {\n // ==========================================\n // Add custom migration logic here.\n // ==========================================\n }\n}\n`\n : `module ${config.name}::genesis {\n use sui::clock::Clock;\n use dubhe::dapp_service::{DappHub, DappStorage};\n use ${config.name}::dapp_key;\n use dubhe::dapp_system;\n use std::ascii::string;\n\n // The one-shot guard is enforced inside dapp_system::create_dapp, which\n // records the DappKey type in DappHub before returning DappStorage.\n // genesis.move does not need to carry its own guard.\n public fun run(dapp_hub: &mut DappHub, clock: &Clock, ctx: &mut TxContext) {\n // create_dapp aborts with dapp_already_initialized_error on repeated calls.\n let dapp_key = dapp_key::new();\n let mut ds = dapp_system::create_dapp(dapp_key, dapp_hub, string(b\"${config.name}\"), string(b\"${config.description}\"), ${initialMode}, clock, ctx);\n\n // Set up initial DApp state (e.g. default resource values).\n ${config.name}::deploy_hook::run(&mut ds, ctx);\n\n // Share DappStorage so every transaction can access it.\n transfer::public_share_object(ds);\n }\n\n // Called during contract upgrades to register newly added resource tables\n // and run any custom migration logic. \\`dubhe upgrade\\` rewrites the region\n // between the separator comments; do not edit that block manually.\n public(package) fun migrate(_dapp_hub: &mut DappHub, _dapp_storage: &mut DappStorage, _ctx: &mut TxContext) {\n // ==========================================\n // Add custom migration logic here (e.g. initialise new resource defaults).\n // migrate_to_vN in migrate.move calls this function automatically.\n // ==========================================\n }\n}\n`;\n await formatAndWriteMove(genesis_code, path, 'formatAndWriteMove');\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nexport async function generateEnums(config: DubheConfig, path: string) {\n console.log('\\nšŸ“¦ Starting Enums Generation...');\n\n if (!config.enums) {\n return;\n }\n\n for (const [enumName, values] of Object.entries(config.enums)) {\n console.log(` └─ ${enumName}: ${JSON.stringify(values)}`);\n\n // Sort enum values by first letter\n const sortedValues = [...values].sort((a, b) => a.localeCompare(b));\n\n const code = generateEnumCode(config.name, enumName, sortedValues);\n await formatAndWriteMove(code, `${path}/${toSnakeCase(enumName)}.move`, 'formatAndWriteMove');\n }\n}\n\nfunction generateEnumCode(projectName: string, enumName: string, values: string[]): string {\n const enumValues = values.map((v) => v.charAt(0).toUpperCase() + v.slice(1)).join(',');\n\n return `module ${projectName}::${toSnakeCase(enumName)} {\n use sui::bcs::{BCS, to_bytes, peel_enum_tag};\n\n public enum ${enumName} has copy, drop, store {\n ${enumValues}\n }\n\n${values\n .map(\n (v) => ` public fun new_${v.toLowerCase()}(): ${enumName} {\n ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)}\n }`\n )\n .join('\\n\\n')}\n\n public fun encode(self: ${enumName}): vector<u8> {\n to_bytes(&self)\n }\n\n public fun decode(bytes: &mut BCS): ${enumName} {\n match(peel_enum_tag(bytes)) {\n${values\n .map((v, i) => ` ${i} => ${enumName}::${v.charAt(0).toUpperCase() + v.slice(1)},`)\n .join('\\n')}\n _ => abort,\n }\n }\n}`;\n}\n","import { DubheConfig, ComponentType, Component } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\n// For the dubhe framework package itself, use package-internal dapp_service functions.\n// For DApp packages, use the public dapp_system API.\nfunction getDappModuleName(projectName: string): string {\n return projectName === 'dubhe' ? 'dapp_service' : `dapp_system`;\n}\n\n// Returns the inline auth argument for dapp_system write functions.\n// dapp_system::set_record / set_field / delete_record / delete_field all require a DappKey\n// value as the first argument so that only code inside the DApp's own package (where\n// dapp_key::new() is public(package)) can supply it, preventing external bypass.\n// dapp_service functions (used by dubhe's own code) have no such parameter.\nfunction authArg(projectName: string): string {\n return projectName !== 'dubhe' ? 'dapp_key::new(), ' : '';\n}\n\n// dapp_system::set_record, set_field, set_global_record, and set_global_field no longer\n// require &DappHub — fee rates and debt ceilings are hardcoded as constants in dapp_system\n// and updated via package upgrade. These helpers always return empty strings.\nfunction dappHubArg(_projectName: string, _isGlobal: boolean): string {\n return '';\n}\n\nfunction dappHubParam(_projectName: string, _isGlobal: boolean): string {\n return '';\n}\n\n// Returns the Move storage object type based on whether the resource is global.\nfunction getStorageType(isGlobal: boolean): string {\n return isGlobal ? 'DappStorage' : 'UserStorage';\n}\n\n// Returns the storage param name used in generated function signatures.\nfunction getStorageParamName(isGlobal: boolean): string {\n return isGlobal ? 'dapp_storage' : 'user_storage';\n}\n\n// Returns the correct record-access function names based on global flag and project.\nfunction getRecordFns(projectName: string, isGlobal: boolean) {\n const mod = getDappModuleName(projectName);\n if (isGlobal) {\n return {\n set_record: `${mod}::set_global_record`,\n set_field: `${mod}::set_global_field`,\n get_field: `${mod}::get_global_field`,\n has_record: `${mod}::has_global_record`,\n ensure_has: `${mod}::ensure_has_global_record`,\n ensure_has_not: `${mod}::ensure_has_not_global_record`,\n delete_record: `${mod}::delete_global_record`,\n delete_field: `${mod}::delete_global_field`\n };\n }\n return {\n set_record: `${mod}::set_record`,\n set_field: `${mod}::set_field`,\n get_field: `${mod}::get_field`,\n has_record: `${mod}::has_record`,\n ensure_has: `${mod}::ensure_has_record`,\n ensure_has_not: `${mod}::ensure_has_not_record`,\n delete_record: `${mod}::delete_record`,\n delete_field: `${mod}::delete_field`\n };\n}\n\nexport async function generateResources(config: DubheConfig, path: string) {\n console.log('\\nšŸ“¦ Starting Resources Generation...');\n\n if (!config.resources) return;\n\n for (const [componentName, resource] of Object.entries(config.resources)) {\n console.log(` └─ ${componentName}: ${JSON.stringify(resource)}`);\n\n // Handle simple type cases\n if (typeof resource === 'string') {\n const code = generateSimpleComponentCode(config.name, componentName, resource, 'Onchain');\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n continue;\n }\n\n // Validate that resource has fields defined\n if (!resource.fields || Object.keys(resource.fields).length === 0) {\n throw new Error(\n `Resource '${componentName}' must have fields defined, but found empty object`\n );\n }\n\n // For resources, don't default to any keys - use what's defined or empty array\n if (!resource.keys) {\n resource.keys = [];\n }\n\n const baseCode = generateComponentCode(config.name, componentName, resource);\n const extensionCode = generateAnnotationExtensions(\n config,\n componentName,\n resource as Component\n );\n\n // Merge extension functions into the base module\n const code = extensionCode ? baseCode.replace(/^}$/m, `\\n${extensionCode}\\n}`) : baseCode;\n\n await formatAndWriteMove(code, `${path}/${componentName}.move`, 'formatAndWriteMove');\n }\n}\n\nfunction generateSimpleComponentCode(\n projectName: string,\n componentName: string,\n valueType: string,\n type: ComponentType = 'Onchain'\n): string {\n const isEnum = !isBasicType(valueType);\n const enumModule = isEnum ? `${toSnakeCase(valueType)}` : '';\n const isOffchain = type === 'Offchain';\n // Simple types default to global=false (user storage)\n const isGlobal = false;\n const storageType = getStorageType(isGlobal);\n const storageParam = getStorageParamName(isGlobal);\n const fns = getRecordFns(projectName, isGlobal);\n\n const readFunctions = !isOffchain\n ? `\n public fun has(${storageParam}: &${storageType}): bool {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${fns.has_record}<DappKey>(${storageParam}, key_tuple)\n }\n\n public fun ensure_has(${storageParam}: &${storageType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${fns.ensure_has}<DappKey>(${storageParam}, key_tuple)\n }\n\n public fun ensure_has_not(${storageParam}: &${storageType}) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${fns.ensure_has_not}<DappKey>(${storageParam}, key_tuple)\n }\n\n public(package) fun delete(${storageParam}: &mut ${storageType}, ctx: &TxContext) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${fns.delete_record}<DappKey>(${authArg(\n projectName\n )}${storageParam}, key_tuple, vector[b\"value\"], ctx);\n }\n\n public fun get(${storageParam}: &${storageType}): (${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n let value_raw = ${fns.get_field}<DappKey>(${storageParam}, key_tuple, b\"value\");\n let mut value_bcs = sui::bcs::new(value_raw);\n let value = ${buildParseExpr(\n projectName,\n valueType,\n 'value_bcs',\n isEnum ? [{ type: valueType, module: enumModule }] : []\n )};\n (value)\n }\n`\n : '';\n\n const storageImport = isGlobal\n ? `use dubhe::dapp_service::DappStorage;`\n : `use dubhe::dapp_service::UserStorage;`;\n\n // Imports are conditional on the value type:\n // - to_bytes: needed for basic types and vectors (not for enum types)\n // - std::ascii:\n // String type: {String, into_bytes} (string fn unused - decode uses fully qualified path)\n // vector<String>: {String} (into_bytes fn unused - encode uses fully qualified path)\n // enum: nothing\n const isEnumType = isEnum && valueType !== 'string' && valueType !== 'String';\n const needsToBytesImport = !isEnumType;\n const toBytesImport = needsToBytesImport ? `\\n use sui::bcs::{to_bytes};` : '';\n const asciiImport =\n valueType === 'string' || valueType === 'String'\n ? `\\n use std::ascii::{String, into_bytes};`\n : valueType === 'vector<String>'\n ? `\\n use std::ascii::String;`\n : '';\n\n return `module ${projectName}::${componentName} {${toBytesImport}${asciiImport}\n ${storageImport}\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${isEnumType ? ` use ${projectName}::${enumModule}::{${valueType}};` : ''}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${type === 'Offchain'};\n\n${readFunctions}\n public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}, value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }, ctx: &mut TxContext) {\n let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n let field_names = vector[b\"value\"];\n let value_tuple = encode(value);\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN, ctx);\n }\n\n public fun encode(value: ${\n valueType === 'string' || valueType === 'String' ? 'String' : valueType\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${\n valueType === 'string' || valueType === 'String'\n ? `to_bytes(&into_bytes(value))`\n : valueType === 'vector<String>'\n ? `to_bytes(&value)`\n : isEnum\n ? `${projectName}::${enumModule}::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }\n}`;\n}\n\nfunction toSnakeCase(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`).replace(/^_/, '');\n}\n\nfunction generateComponentCode(projectName: string, componentName: string, resource: any): string {\n const fields = resource.fields;\n const keys = resource.keys || [];\n const offchain = resource.offchain || false;\n const global = resource.global || false;\n const type: ComponentType = offchain ? 'Offchain' : 'Onchain';\n\n const isGlobal = global;\n const storageType = getStorageType(isGlobal);\n const storageParam = getStorageParamName(isGlobal);\n const fns = getRecordFns(projectName, isGlobal);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n\n // Generate field type and name lists, excluding fields in keys\n const valueFields = Object.entries(fields).filter(([name]) => !keys.includes(name));\n const valueFieldNames = valueFields.map(([name]) => name);\n\n // If there is only one value field, do not generate struct\n const isSingleValue = valueFieldNames.length === 1;\n\n // Enum types from value fields only (used for encode/decode logic)\n const enumTypes = valueFields\n .filter(([_, type]) => !isBasicType(type as string) && type !== 'string' && type !== 'String')\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => self.findIndex((t) => t.type === item.type) === index);\n\n // All enum types (key + value) for import statement generation\n const allEnumTypes = Object.entries(fields)\n .filter(([_, type]) => !isBasicType(type as string) && type !== 'string' && type !== 'String')\n .map(([_, type]) => ({\n type: type as string,\n module: `${toSnakeCase(type as string)}`\n }))\n .filter((item, index, self) => self.findIndex((t) => t.type === item.type) === index);\n\n // Generate table related functions\n const tableFunctions = generateTableFunctions(\n projectName,\n componentName,\n fields,\n keys,\n !isAllKeys && !isSingleValue,\n enumTypes,\n type,\n isGlobal,\n storageType,\n storageParam,\n fns\n );\n\n // listable buy() still takes dapp_storage: &mut DappStorage; reactive no longer does\n const storageImport = isGlobal\n ? `use dubhe::dapp_service::DappStorage;`\n : resource.listable\n ? `use dubhe::dapp_service::{UserStorage, DappStorage};`\n : `use dubhe::dapp_service::UserStorage;`;\n const scenePermitImport = resource.reactive ? `\\n use dubhe::dapp_service::ScenePermit;` : '';\n\n // Determine if any field uses ascii String type (controls std::ascii import)\n const allFieldTypes = Object.values(fields) as string[];\n // to_bytes needed when any value field is NOT a pure enum type\n const nonEnumValueFields = valueFieldNames.filter((name) => {\n const t = fields[name] as string;\n return isBasicType(t) || t === 'string' || t === 'String';\n });\n const needsToBytesImport = nonEnumValueFields.length > 0 || keys.length > 0;\n const toBytesImport = needsToBytesImport ? `\\n use sui::bcs::{to_bytes};` : '';\n // String type needed when any field is string/String/vector<String>\n const hasStringField = allFieldTypes.some((t) => t === 'string' || t === 'String');\n const hasVecStringField = allFieldTypes.some((t) => t === 'vector<String>');\n // Whether String appears in value fields (not just key fields)\n const hasStringValueField = valueFieldNames.some((n) => {\n const t = fields[n] as string;\n return t === 'string' || t === 'String';\n });\n // Single-value / all-keys path: into_bytes only needed when value field is String.\n // Key encoding uses to_bytes(&key) directly (String is BCS-serialisable).\n // Decode uses dubhe::bcs::peel_string (fully qualified), no 'string' fn alias needed.\n const asciiImportSimple = hasStringValueField\n ? `\\n use std::ascii::{String, into_bytes};`\n : hasStringField || hasVecStringField\n ? `\\n use std::ascii::String;`\n : '';\n // Multi-field struct path: decode calls string(peel_vec_u8(...)) so 'string' fn alias needed.\n const asciiImportMulti = hasStringValueField\n ? `\\n use std::ascii::{string, String, into_bytes};`\n : hasStringField || hasVecStringField\n ? `\\n use std::ascii::String;`\n : '';\n\n // If all fields are keys or there is only one value field, do not generate struct related code\n if (isAllKeys || isSingleValue) {\n return `module ${projectName}::${componentName} {${toBytesImport}${asciiImportSimple}\n ${storageImport}${scenePermitImport}\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n allEnumTypes.length > 0\n ? allEnumTypes.map((e) => ` use ${projectName}::${e.module}::{${e.type}};`).join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${offchain};\n\n${tableFunctions}\n}`;\n }\n\n // Generate struct fields, excluding fields in keys\n const structFields = valueFieldNames\n .map(\n (name) =>\n ` ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n },`\n )\n .join('\\n');\n\n // Generate constructor parameters, only containing non-key fields\n const constructorParams = valueFieldNames\n .map(\n (name) =>\n `${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }`\n )\n .join(', ');\n\n // Generate constructor field assignments, only containing non-key fields\n const constructorAssignments = valueFieldNames.map((name) => ` ${name},`).join('\\n');\n\n // Generate getter functions, excluding fields in keys\n const getters = valueFieldNames\n .map(\n (name) => ` public fun ${name}(self: &${toPascalCase(componentName)}): ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n } {\n self.${name}\n }`\n )\n .join('\\n\\n');\n\n // Generate setter functions, excluding fields in keys\n const setters = valueFieldNames\n .map(\n (name) => ` public fun update_${name}(self: &mut ${toPascalCase(\n componentName\n )}, ${name}: ${\n fields[name] === 'string' || fields[name] === 'String'\n ? 'String'\n : fields[name] === 'vector<String>'\n ? 'vector<String>'\n : fields[name]\n }) {\n self.${name} = ${name}\n }`\n )\n .join('\\n\\n');\n\n return `module ${projectName}::${componentName} {${toBytesImport}${asciiImportMulti}\n ${storageImport}${scenePermitImport}\n use dubhe::dapp_system;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n${\n allEnumTypes.length > 0\n ? allEnumTypes.map((e) => ` use ${projectName}::${e.module}::{${e.type}};`).join('\\n')\n : ''\n}\n\n const TABLE_NAME: vector<u8> = b\"${componentName}\";\n const OFFCHAIN: bool = ${offchain};\n\n public struct ${toPascalCase(componentName)} has copy, drop, store {\n${structFields}\n }\n\n public fun new(${constructorParams}): ${toPascalCase(componentName)} {\n ${toPascalCase(componentName)} {\n${constructorAssignments}\n }\n }\n\n${getters}\n\n${setters}\n\n${tableFunctions}\n}`;\n}\n\n// Check if it is a basic type\nfunction isBasicType(type: string): boolean {\n return [\n 'address',\n 'bool',\n 'u8',\n 'u16',\n 'u32',\n 'u64',\n 'u128',\n 'u256',\n 'string',\n 'String',\n 'vector<address>',\n 'vector<bool>',\n 'vector<u8>',\n 'vector<u16>',\n 'vector<vector<u8>>',\n 'vector<u32>',\n 'vector<u64>',\n 'vector<u128>',\n 'vector<u256>',\n 'vector<String>'\n ].includes(type);\n}\n\n// Build a BCS peel expression for a single field, reading from bcsVar.\nfunction buildParseExpr(\n projectName: string,\n fieldType: string,\n bcsVar: string,\n enumTypes: Array<{ type: string; module: string }>\n): string {\n const isEnum = !isBasicType(fieldType);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n if (fieldType === 'string' || fieldType === 'String') {\n return `dubhe::bcs::peel_string(&mut ${bcsVar})`;\n }\n if (fieldType === 'vector<String>') {\n return `dubhe::bcs::peel_vec_string(&mut ${bcsVar})`;\n }\n if (isEnum && enumType) {\n return `${projectName}::${enumType.module}::decode(&mut ${bcsVar})`;\n }\n return `sui::bcs::peel_${getBcsType(fieldType)}(&mut ${bcsVar})`;\n}\n\n// Generate the three-line sequence that reads one named field from storage.\n// Uses ${fieldName}_raw / ${fieldName}_bcs as readable temporary variable names.\nfunction buildFieldReadLines(\n projectName: string,\n fns: ReturnType<typeof getRecordFns>,\n storageParam: string,\n fieldName: string,\n fieldType: string,\n _idx: number,\n enumTypes: Array<{ type: string; module: string }>\n): string {\n const rawVar = `${fieldName}_raw`;\n const bcsVar = `${fieldName}_bcs`;\n return [\n `let ${rawVar} = ${fns.get_field}<DappKey>(${storageParam}, key_tuple, b\"${fieldName}\");`,\n `let mut ${bcsVar} = sui::bcs::new(${rawVar});`,\n `let ${fieldName} = ${buildParseExpr(projectName, fieldType, bcsVar, enumTypes)};`\n ].join('\\n ');\n}\n\nfunction generateTableFunctions(\n projectName: string,\n componentName: string,\n fields: Record<string, string>,\n keys: string[],\n includeStruct: boolean = true,\n enumTypes: Array<{ type: string; module: string }> = [],\n type: ComponentType = 'Onchain',\n isGlobal: boolean = false,\n storageType: string = 'UserStorage',\n storageParam: string = 'user_storage',\n fns: ReturnType<typeof getRecordFns> = getRecordFns('dubhe', false)\n): string {\n // Separate key fields and non-key fields\n const valueFields = Object.entries(fields)\n .filter(([name]) => !keys.includes(name))\n .reduce((acc, [name, type]) => ({ ...acc, [name]: type }), {});\n\n const valueNames = Object.keys(valueFields);\n\n // Check if all fields are keys\n const isAllKeys = Object.keys(fields).every((name) => keys.includes(name));\n // Check if there is only one value field\n const isSingleValue = valueNames.length === 1;\n // Check if it's offchain\n const isOffchain = type === 'Offchain';\n\n // Generate key parameter list\n const keyParams = keys.length > 0 ? keys.map((k) => `${k}: ${fields[k]}`).join(', ') : '';\n\n // Generate key tuple related code\n const keyTupleCode =\n keys.length > 0\n ? `let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);\n ${keys.map((k) => `key_tuple.push_back(to_bytes(&${k}));`).join('\\n ')}`\n : `let mut key_tuple = vector::empty();\n key_tuple.push_back(TABLE_NAME);`;\n\n // ctx helpers: global write functions (set_global_record, set_global_field) do not take\n // a TxContext parameter — fees are handled inside those functions without needing ctx.\n // Non-global write functions (set_record, set_field, delete_record) DO take ctx.\n const ctxParam = isGlobal ? '' : ', ctx: &mut TxContext';\n const ctxArg = isGlobal ? '' : ', ctx';\n\n // Generate has series functions - skip for offchain\n const hasFunctions = !isOffchain\n ? ` public fun has(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}): bool {\n ${keyTupleCode}\n ${fns.has_record}<DappKey>(${storageParam}, key_tuple)\n }\n\n public fun ensure_has(${storageParam}: &${storageType}${keyParams ? ', ' : ''}${keyParams}) {\n ${keyTupleCode}\n ${fns.ensure_has}<DappKey>(${storageParam}, key_tuple)\n }\n\n public fun ensure_has_not(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}) {\n ${keyTupleCode}\n ${fns.ensure_has_not}<DappKey>(${storageParam}, key_tuple)\n }\n `\n : '';\n\n // Generate delete function - skip for offchain.\n // Pass all field names to delete_record so it cleans up fields and the sentinel in one call.\n const fieldNamesLiteral = `vector[${valueNames.map((n) => `b\"${n}\"`).join(', ')}]`;\n const deleteFunction = !isOffchain\n ? ` public(package) fun delete(${storageParam}: &mut ${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}${isGlobal ? '' : ', ctx: &TxContext'}) {\n ${keyTupleCode}\n ${fns.delete_record}<DappKey>(${authArg(\n projectName\n )}${storageParam}, key_tuple, ${fieldNamesLiteral}${isGlobal ? '' : ', ctx'});\n }`\n : '';\n\n // Generate individual getter / setter functions for each value field.\n // Only generated when there are multiple value fields; skipped for offchain.\n const getterSetters =\n !isSingleValue && !isOffchain\n ? valueNames\n .map((name) => {\n const fieldType = fields[name];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n\n return ` public fun get_${name}(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}): ${\n fieldType === 'string' || fieldType === 'String'\n ? 'String'\n : fieldType === 'vector<String>'\n ? 'vector<String>'\n : fieldType\n } {\n ${keyTupleCode}\n let ${name}_raw = ${fns.get_field}<DappKey>(${storageParam}, key_tuple, b\"${name}\");\n let mut ${name}_bcs = sui::bcs::new(${name}_raw);\n let ${name} = ${buildParseExpr(projectName, fieldType as string, `${name}_bcs`, enumTypes)};\n ${name}\n }\n\n public(package) fun set_${name}(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}, ${name}: ${\n fieldType === 'string' || fieldType === 'String'\n ? 'String'\n : fieldType === 'vector<String>'\n ? 'vector<String>'\n : fieldType\n }${ctxParam}) {\n ${keyTupleCode}\n let value = ${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${name}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${name})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${name})`\n : `to_bytes(&${name})`\n };\n ${fns.set_field}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, b\"${name}\", value${ctxArg});\n }`;\n })\n .join('\\n\\n')\n : '';\n\n // Build the field-name vector literal used in set_record calls.\n const fieldNamesVec = `vector[${valueNames.map((n) => `b\"${n}\"`).join(', ')}]`;\n\n // Generate get and set functions\n const getSetFunctions = isAllKeys\n ? ` public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}${ctxParam}) {\n ${keyTupleCode}\n let field_names: vector<vector<u8>> = vector[];\n let value_tuple: vector<vector<u8>> = vector[];\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : isSingleValue\n ? !isOffchain\n ? ` public fun get(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}): ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n } {\n ${keyTupleCode}\n let ${valueNames[0]}_raw = ${fns.get_field}<DappKey>(${storageParam}, key_tuple, b\"${\n valueNames[0]\n }\");\n let mut ${valueNames[0]}_bcs = sui::bcs::new(${valueNames[0]}_raw);\n let value = ${buildParseExpr(\n projectName,\n Object.values(valueFields)[0] as string,\n `${valueNames[0]}_bcs`,\n enumTypes\n )};\n value\n }\n\n public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}, value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }${ctxParam}) {\n ${keyTupleCode}\n let field_names = vector[b\"${valueNames[0]}\"];\n let value_tuple = encode(value);\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : ` public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}, value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }${ctxParam}) {\n ${keyTupleCode}\n let field_names = vector[b\"${valueNames[0]}\"];\n let value_tuple = encode(value);\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : !isOffchain\n ? ` public fun get(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}): (${Object.values(valueFields)\n .map((t) => (t === 'string' || t === 'String' ? 'String' : t))\n .join(', ')}) {\n ${keyTupleCode}\n ${valueNames\n .map((name, i) =>\n buildFieldReadLines(projectName, fns, storageParam, name, fields[name], i, enumTypes)\n )\n .join('\\n ')}\n (${valueNames.join(', ')})\n }\n\n public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}, ${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}${ctxParam}) {\n ${keyTupleCode}\n let field_names = ${fieldNamesVec};\n let value_tuple = encode(${valueNames.join(', ')});\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : ` public(package) fun set(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${keyParams ? ', ' : ''}${keyParams}, ${valueNames\n .map(\n (n) => `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}${ctxParam}) {\n ${keyTupleCode}\n let field_names = ${fieldNamesVec};\n let value_tuple = encode(${valueNames.join(', ')});\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`;\n\n // Generate struct related functions\n const structFunctions = includeStruct\n ? !isOffchain\n ? ` public fun get_struct(${storageParam}: &${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}): ${toPascalCase(componentName)} {\n ${keyTupleCode}\n ${valueNames\n .map((name, i) =>\n buildFieldReadLines(projectName, fns, storageParam, name, fields[name], i, enumTypes)\n )\n .join('\\n ')}\n ${toPascalCase(componentName)} { ${valueNames.join(', ')} }\n }\n\n public(package) fun set_struct(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}, ${componentName}: ${toPascalCase(componentName)}${ctxParam}) {\n ${keyTupleCode}\n let field_names = ${fieldNamesVec};\n let value_tuple = encode_struct(${componentName});\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : ` public(package) fun set_struct(${dappHubParam(\n projectName,\n isGlobal\n )}${storageParam}: &mut ${storageType}${\n keyParams ? ', ' : ''\n }${keyParams}, ${componentName}: ${toPascalCase(componentName)}${ctxParam}) {\n ${keyTupleCode}\n let field_names = ${fieldNamesVec};\n let value_tuple = encode_struct(${componentName});\n ${fns.set_record}<DappKey>(${authArg(projectName)}${dappHubArg(\n projectName,\n isGlobal\n )}${storageParam}, key_tuple, field_names, value_tuple, OFFCHAIN${ctxArg});\n }`\n : '';\n\n // Generate encode and decode functions\n const encodeDecodeFunctions = isSingleValue\n ? ` public fun encode(value: ${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? 'String'\n : Object.values(valueFields)[0]\n }): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n value_tuple.push_back(${\n Object.values(valueFields)[0] === 'string' || Object.values(valueFields)[0] === 'String'\n ? `to_bytes(&into_bytes(value))`\n : Object.values(valueFields)[0] === 'vector<String>'\n ? `to_bytes(&value)`\n : !isBasicType(Object.values(valueFields)[0] as string)\n ? `${projectName}::${\n enumTypes.find((e) => e.type === Object.values(valueFields)[0])?.module\n }::encode(value)`\n : `to_bytes(&value)`\n });\n value_tuple\n }`\n : includeStruct\n ? !isOffchain\n ? ` public fun encode(${valueNames\n .map(\n (n) =>\n `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `value_tuple.push_back(${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${n}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${n})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${n})`\n : `to_bytes(&${n})`\n });`;\n })\n .join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map((n) => `${componentName}.${n}`).join(', ')})\n }\n\n public fun decode(data: vector<u8>): ${toPascalCase(componentName)} {\n let mut bcs_type = sui::bcs::new(data);\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `let ${n} = ${\n fieldType === 'string' || fieldType === 'String'\n ? `string(sui::bcs::peel_vec_u8(&mut bcs_type))`\n : fieldType === 'vector<String>'\n ? `dubhe::bcs::peel_vec_string(&mut bcs_type)`\n : isEnum\n ? `${projectName}::${enumType?.module}::decode(&mut bcs_type)`\n : `sui::bcs::peel_${getBcsType(fieldType)}(&mut bcs_type)`\n };`;\n })\n .join('\\n ')}\n ${toPascalCase(componentName)} {\n ${valueNames.map((n) => `${n},`).join('\\n ')}\n }\n }`\n : ` public fun encode(${valueNames\n .map(\n (n) =>\n `${n}: ${fields[n] === 'string' || fields[n] === 'String' ? 'String' : fields[n]}`\n )\n .join(', ')}): vector<vector<u8>> {\n let mut value_tuple = vector::empty();\n ${valueNames\n .map((n) => {\n const fieldType = fields[n];\n const isEnum = !isBasicType(fieldType as string);\n const enumType = isEnum ? enumTypes.find((e) => e.type === fieldType) : null;\n return `value_tuple.push_back(${\n fieldType === 'string' || fieldType === 'String'\n ? `to_bytes(&into_bytes(${n}))`\n : fieldType === 'vector<String>'\n ? `to_bytes(&${n})`\n : isEnum\n ? `${projectName}::${enumType?.module}::encode(${n})`\n : `to_bytes(&${n})`\n });`;\n })\n .join('\\n ')}\n value_tuple\n }\n\n public fun encode_struct(${componentName}: ${toPascalCase(componentName)}): vector<vector<u8>> {\n encode(${valueNames.map((n) => `${componentName}.${n}`).join(', ')})\n }`\n : '';\n\n // Filter out empty sections and join with proper spacing\n const sections = [\n hasFunctions,\n deleteFunction,\n getterSetters,\n getSetFunctions,\n structFunctions,\n encodeDecodeFunctions\n ].filter((section) => section.trim().length > 0);\n\n return sections.join('\\n\\n');\n}\n\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word, _index) => {\n if (/^\\d+$/.test(word)) {\n return word;\n }\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getBcsType(type: string): string {\n if (type.startsWith('vector<')) {\n const innerType = type.slice(7, -1);\n if (innerType === 'vector<u8>') {\n return 'vec_vec_u8';\n }\n if (innerType === 'String') {\n return 'vec_string';\n }\n return `vec_${getBcsType(innerType)}`;\n }\n\n switch (type) {\n case 'u8':\n return 'u8';\n case 'u16':\n return 'u16';\n case 'u32':\n return 'u32';\n case 'u64':\n return 'u64';\n case 'u128':\n return 'u128';\n case 'u256':\n return 'u256';\n case 'bool':\n return 'bool';\n case 'address':\n return 'address';\n case 'String':\n return 'string';\n default:\n return type;\n }\n}\n\n// ─── Annotation-based code extensions ────────────────────────────────────────\n\n/**\n * Generate additional Move functions for a resource based on its annotations.\n * Returns a string of extra function bodies to inject into the module, or '' if none.\n */\nfunction generateAnnotationExtensions(\n config: DubheConfig,\n componentName: string,\n comp: Component\n): string {\n const parts: string[] = [];\n const projectName = config.name;\n const mod = getDappModuleName(projectName);\n const auth = authArg(projectName);\n\n const fields = comp.fields;\n const keys = comp.keys ?? [];\n const valueFields = Object.entries(fields).filter(([n]) => !keys.includes(n));\n const valueNames = valueFields.map(([n]) => n);\n const keyParams = keys.length > 0 ? keys.map((k) => `${k}: ${fields[k]}`).join(', ') : '';\n\n // ── fungible: true ────────────────────────────────────────────────────────\n if (comp.fungible && valueNames.length === 1) {\n const [_vName, vType] = valueFields[0];\n parts.push(`\n // ─── fungible add / sub ─────────────────────────────────────────────\n #[error]\n const EInsufficientAmount: vector<u8> = b\"Insufficient amount\";\n\n public(package) fun add(user_storage: &mut UserStorage, amount: ${vType}, ctx: &mut TxContext) {\n let current = if (has(user_storage)) { get(user_storage) } else { 0 };\n set(user_storage, current + amount, ctx);\n }\n\n public(package) fun sub(user_storage: &mut UserStorage, amount: ${vType}, ctx: &mut TxContext) {\n let current = get(user_storage);\n assert!(current >= amount, EInsufficientAmount);\n set(user_storage, current - amount, ctx);\n }`);\n }\n\n // ── keys: auto-generate mint for any keyed resource ─────────────────────\n // Developer provides all key values — ID strategy is intentionally caller-decided.\n if (keys.length > 0 && !comp.offchain && !comp.global) {\n const allKeyParams = keys.map((k) => `${k}: ${fields[k]}`).join(', ');\n const valueParams = valueNames.map((n) => `${n}: ${fields[n]}`).join(', ');\n const allParams = [allKeyParams, valueParams].filter(Boolean).join(', ');\n const keyArgs = keys.join(', ');\n const setArgs = [...keys, ...valueNames].join(', ');\n\n parts.push(`\n // ─── keys: mint (developer provides keys; framework ensures no duplicate) ─\n // Choosing the ID strategy (fresh address, counter, coordinate pack, etc.)\n // is intentionally left to the caller.\n public(package) fun mint(\n user_storage: &mut UserStorage,\n ${allParams},\n ctx: &mut TxContext,\n ) {\n ensure_has_not(user_storage, ${keyArgs});\n set(user_storage, ${setArgs}, ctx);\n }`);\n }\n\n // ── reactive: true ────────────────────────────────────────────────────────\n if (comp.reactive) {\n const keyTupleCode =\n keys.length > 0\n ? `let mut key_tuple = vector::empty();\\n key_tuple.push_back(TABLE_NAME);\\n ${keys\n .map((k) => `key_tuple.push_back(sui::bcs::to_bytes(&${k}));`)\n .join('\\n ')}`\n : `let mut key_tuple = vector::empty();\\n key_tuple.push_back(TABLE_NAME);`;\n\n // Full reactive set\n if (valueNames.length > 1) {\n const params = valueNames.map((n) => `${n}: ${fields[n]}`).join(', ');\n parts.push(`\n // ─── reactive: cross-user write variants ───────────────────────────\n // Package-level helpers: add pause checks and access control in your system\n // functions before calling these.\n public(package) fun set_reactive<PermType>(\n permit: &ScenePermit<PermType>,\n from: &mut UserStorage,\n target: &mut UserStorage,\n ${keyParams ? keyParams + ', ' : ''}${params},\n ctx: &mut TxContext,\n ) {\n ${keyTupleCode}\n let field_names = vector[${valueNames.map((n) => `b\"${n}\"`).join(', ')}];\n let value_tuple = encode(${valueNames.join(', ')});\n ${mod}::set_record_reactive<DappKey, PermType>(${auth}permit, from, target, key_tuple, field_names, value_tuple, ctx);\n }`);\n }\n\n // Per-field reactive setters\n for (const [fName, fType] of valueFields) {\n const encodeExpr =\n fType === 'string' || fType === 'String'\n ? `sui::bcs::to_bytes(&std::ascii::into_bytes(${fName}))`\n : `sui::bcs::to_bytes(&${fName})`;\n parts.push(`\n public(package) fun set_${fName}_reactive<PermType>(\n permit: &ScenePermit<PermType>,\n from: &mut UserStorage,\n target: &mut UserStorage,\n ${keyParams ? keyParams + ', ' : ''}${fName}: ${\n fType === 'string' || fType === 'String' ? 'String' : fType\n },\n ctx: &mut TxContext,\n ) {\n ${keyTupleCode}\n let value = ${encodeExpr};\n ${mod}::set_field_reactive<DappKey, PermType>(${auth}permit, from, target, key_tuple, b\"${fName}\", value, ctx);\n }`);\n }\n }\n\n // ── transferable: true — generate transfer functions ─────────────────────\n if (comp.transferable) {\n const objects = config.objects ?? {};\n const scenes = config.scenes ?? {};\n const isFungible = !!comp.fungible;\n // Trigger for any non-fungible keyed resource\n const isKeyed = !isFungible && keys.length > 0;\n const idField = isKeyed ? keys[0] : null;\n\n for (const [objKey, objCfg] of Object.entries(objects)) {\n if (!(objCfg.accepts ?? []).includes(componentName)) continue;\n // Use fully-qualified ObjectStorage<Marker> type\n const objMarker = toPascalCase(objKey);\n const ObjStruct = `dubhe::dapp_service::ObjectStorage<${projectName}::${objKey}::${objMarker}>`;\n const objMod = objKey;\n\n if (isFungible && valueNames.length === 1) {\n const [, vType] = valueFields[0];\n parts.push(`\n // ─── transferable: User ↔ ${objMarker}Storage (fungible) ─────────────\n public(package) fun transfer_user_to_${objKey}(\n user: &mut UserStorage,\n target: &mut ${ObjStruct},\n amount: ${vType},\n ctx: &mut TxContext,\n ) {\n sub(user, amount, ctx);\n ${projectName}::${objMod}::add_${componentName}(target, amount);\n }\n\n public(package) fun transfer_${objKey}_to_user(\n source: &mut ${ObjStruct},\n user: &mut UserStorage,\n amount: ${vType},\n ctx: &mut TxContext,\n ) {\n ${projectName}::${objMod}::sub_${componentName}(source, amount);\n add(user, amount, ctx);\n }`);\n } else if (isKeyed && idField) {\n if (valueNames.length === 1) {\n const [, svType] = valueFields[0];\n const encodeRaw =\n svType === 'string' || svType === 'String'\n ? `to_bytes(&std::ascii::into_bytes(get(user, ${idField})))`\n : `to_bytes(&get(user, ${idField}))`;\n const enumTypes = Object.entries(config.enums ?? {}).map(([n]) => ({\n type: toPascalCase(n),\n module: n\n }));\n const peelExpr = buildParseExpr(projectName, svType, 'bcs', enumTypes);\n parts.push(`\n // ─── transferable: User ↔ ${objMarker}Storage (keyed) ──────────────\n public(package) fun transfer_user_to_${objKey}(\n user: &mut UserStorage,\n target: &mut ${ObjStruct},\n ${idField}: u64,\n ctx: &TxContext,\n ) {\n ensure_has(user, ${idField});\n // Guard before any mutation: abort if target already holds this item.\n dubhe::error::item_already_owned(!${projectName}::${objMod}::has_${componentName}(target, ${idField}));\n let raw = ${encodeRaw};\n delete(user, ${idField}, ctx);\n ${projectName}::${objMod}::set_${componentName}_data(target, ${idField}, raw);\n }\n\n public(package) fun transfer_${objKey}_to_user(\n source: &mut ${ObjStruct},\n user: &mut UserStorage,\n ${idField}: u64,\n ctx: &mut TxContext,\n ) {\n // Guard before any mutation: abort if user already owns this item.\n ensure_has_not(user, ${idField});\n let raw = ${projectName}::${objMod}::remove_${componentName}_data(source, ${idField});\n let mut bcs = sui::bcs::new(raw);\n let value = ${peelExpr};\n set(user, ${idField}, value, ctx);\n }`);\n } else {\n parts.push(`\n // ─── transferable: User ↔ ${objMarker}Storage (keyed, multi-field) ──\n public(package) fun transfer_user_to_${objKey}(\n user: &mut UserStorage,\n target: &mut ${ObjStruct},\n ${idField}: u64,\n ctx: &TxContext,\n ) {\n ensure_has(user, ${idField});\n // Guard before any mutation: abort if target already holds this item.\n dubhe::error::item_already_owned(!${projectName}::${objMod}::has_${componentName}(target, ${idField}));\n let data = encode_struct(get_struct(user, ${idField}));\n delete(user, ${idField}, ctx);\n let raw: vector<u8> = sui::bcs::to_bytes(&data);\n ${projectName}::${objMod}::set_${componentName}_data(target, ${idField}, raw);\n }\n\n public(package) fun transfer_${objKey}_to_user(\n source: &mut ${ObjStruct},\n user: &mut UserStorage,\n ${idField}: u64,\n ctx: &mut TxContext,\n ) {\n // Guard before any mutation: abort if user already owns this item.\n ensure_has_not(user, ${idField});\n let raw = ${projectName}::${objMod}::remove_${componentName}_data(source, ${idField});\n let decoded = decode(raw);\n set_struct(user, ${idField}, decoded, ctx);\n }`);\n }\n }\n }\n\n for (const [sceneKey, sceneCfg] of Object.entries(scenes)) {\n if (!(sceneCfg.accepts ?? []).includes(componentName)) continue;\n // Use fully-qualified SceneStorage<Marker> type\n const sceneMarker = toPascalCase(sceneKey);\n const SceneStruct = `dubhe::dapp_service::SceneStorage<${projectName}::${sceneKey}::${sceneMarker}>`;\n const sceneMod = sceneKey;\n const scenePermitType =\n sceneCfg.authorization.kind === 'permit'\n ? `dubhe::dapp_service::ScenePermit<${projectName}::${\n sceneCfg.authorization.permit\n }::${toPascalCase(sceneCfg.authorization.permit)}>`\n : '';\n const scenePermitParam =\n sceneCfg.authorization.kind === 'permit' ? ` permit: &${scenePermitType},\\n` : '';\n const scenePermitArg = sceneCfg.authorization.kind === 'permit' ? 'permit, ' : '';\n // Permit-authorized scene writes identify the caller via their UserStorage,\n // which for these transfers is the `user` side of the transfer itself.\n const sceneUserCall = sceneCfg.authorization.kind === 'permit' ? 'user, ' : '';\n const sceneCtxArg = sceneCfg.authorization.kind === 'permit' ? ', ctx' : '';\n\n if (isFungible && valueNames.length === 1) {\n const [, vType] = valueFields[0];\n parts.push(`\n // ─── transferable: User ↔ ${sceneMarker}Storage (fungible) ──────────\n public(package) fun transfer_user_to_${sceneKey}(\n${scenePermitParam} user: &mut UserStorage,\n target: &mut ${SceneStruct},\n amount: ${vType},\n ctx: &mut TxContext,\n ) {\n sub(user, amount, ctx);\n ${projectName}::${sceneMod}::add_${componentName}(${scenePermitArg}target, ${sceneUserCall}amount${sceneCtxArg});\n }\n\n // ā˜… No expiry check on withdraw direction — prevents asset lock-in expired scenes.\n public(package) fun transfer_${sceneKey}_to_user(\n${scenePermitParam} source: &mut ${SceneStruct},\n user: &mut UserStorage,\n amount: ${vType},\n ctx: &mut TxContext,\n ) {\n ${projectName}::${sceneMod}::sub_${componentName}(${scenePermitArg}source, ${sceneUserCall}amount${sceneCtxArg});\n add(user, amount, ctx);\n }`);\n } else if (isKeyed && idField) {\n if (valueNames.length === 1) {\n const [, svType] = valueFields[0];\n const encodeRaw =\n svType === 'string' || svType === 'String'\n ? `to_bytes(&std::ascii::into_bytes(get(user, ${idField})))`\n : `to_bytes(&get(user, ${idField}))`;\n const enumTypes = Object.entries(config.enums ?? {}).map(([n]) => ({\n type: toPascalCase(n),\n module: n\n }));\n const peelExpr = buildParseExpr(projectName, svType, 'bcs', enumTypes);\n parts.push(`\n // ─── transferable: User ↔ ${sceneMarker}Storage (keyed) ─────────────\n public(package) fun transfer_user_to_${sceneKey}(\n${scenePermitParam} user: &mut UserStorage,\n target: &mut ${SceneStruct},\n ${idField}: u64,\n ctx: &TxContext,\n ) {\n ensure_has(user, ${idField});\n // Guard before any mutation: abort if target already holds this item.\n dubhe::error::item_already_owned(!${projectName}::${sceneMod}::has_${componentName}(target, ${idField}));\n let raw = ${encodeRaw};\n delete(user, ${idField}, ctx);\n ${projectName}::${sceneMod}::set_${componentName}_data(${scenePermitArg}target, ${sceneUserCall}${idField}, raw${sceneCtxArg});\n }\n\n public(package) fun transfer_${sceneKey}_to_user(\n${scenePermitParam} source: &mut ${SceneStruct},\n user: &mut UserStorage,\n ${idField}: u64,\n ctx: &mut TxContext,\n ) {\n // Guard before any mutation: abort if user already owns this item.\n ensure_has_not(user, ${idField});\n let raw = ${projectName}::${sceneMod}::remove_${componentName}_data(${scenePermitArg}source, ${sceneUserCall}${idField}${sceneCtxArg});\n let mut bcs = sui::bcs::new(raw);\n let value = ${peelExpr};\n set(user, ${idField}, value, ctx);\n }`);\n } else {\n parts.push(`\n // ─── transferable: User ↔ ${sceneMarker}Storage (keyed, multi-field) ─\n public(package) fun transfer_user_to_${sceneKey}(\n${scenePermitParam} user: &mut UserStorage,\n target: &mut ${SceneStruct},\n ${idField}: u64,\n ctx: &TxContext,\n ) {\n ensure_has(user, ${idField});\n // Guard before any mutation: abort if target already holds this item.\n dubhe::error::item_already_owned(!${projectName}::${sceneMod}::has_${componentName}(target, ${idField}));\n let data = encode_struct(get_struct(user, ${idField}));\n delete(user, ${idField}, ctx);\n let raw: vector<u8> = sui::bcs::to_bytes(&data);\n ${projectName}::${sceneMod}::set_${componentName}_data(${scenePermitArg}target, ${sceneUserCall}${idField}, raw${sceneCtxArg});\n }\n\n public(package) fun transfer_${sceneKey}_to_user(\n${scenePermitParam} source: &mut ${SceneStruct},\n user: &mut UserStorage,\n ${idField}: u64,\n ctx: &mut TxContext,\n ) {\n // Guard before any mutation: abort if user already owns this item.\n ensure_has_not(user, ${idField});\n let raw = ${projectName}::${sceneMod}::remove_${componentName}_data(${scenePermitArg}source, ${sceneUserCall}${idField}${sceneCtxArg});\n let decoded = decode(raw);\n set_struct(user, ${idField}, decoded, ctx);\n }`);\n }\n }\n }\n }\n\n // ── listable: true ────────────────────────────────────────────────────────\n if (comp.listable) {\n const isFungible = !!comp.fungible;\n // Any keyed non-fungible listable resource gets record-based marketplace helpers.\n const isKeyed = !isFungible && keys.length > 0;\n const isUnique = isKeyed;\n const idField = isUnique ? keys[0] : null;\n const tableNameExpr = `b\"${componentName}\"`;\n\n if (isFungible && valueNames.length === 1) {\n // Fungible listing helpers — package-visible so developers must expose them\n // through their own system functions where they can add custom guards\n // (pause checks, access control, etc.).\n parts.push(`\n // ─── listable: market protocol (fungible) ──────────────────────────\n // Package-level helpers: call these from your system functions.\n // Add pause checks, access control, and custom logic there.\n public(package) fun list<CoinType>(\n user_storage: &mut UserStorage,\n amount: u64,\n price: u64,\n listed_until: std::option::Option<u64>,\n ctx: &mut TxContext,\n ) {\n dubhe::dapp_system::take_fungible_record<DappKey, CoinType>(\n dapp_key::new(),\n user_storage,\n ${tableNameExpr},\n { let mut k = vector::empty(); k.push_back(TABLE_NAME); k },\n b\"${valueNames[0]}\",\n amount,\n price,\n listed_until,\n ctx,\n );\n }\n\n public(package) fun buy<CoinType>(\n dh: &dubhe::dapp_service::DappHub,\n dapp_storage: &mut DappStorage,\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n payment: sui::coin::Coin<CoinType>,\n ctx: &mut TxContext,\n ): sui::coin::Coin<CoinType> {\n dubhe::dapp_system::buy_fungible_record<DappKey, CoinType>(\n dapp_key::new(), dh, dapp_storage, listing, user_storage, payment, ctx\n )\n }\n\n public(package) fun cancel_listing<CoinType>(\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::cancel_fungible_listing<DappKey, CoinType>(\n dapp_key::new(), listing, user_storage, ctx\n );\n }\n\n public(package) fun expire_listing<CoinType>(\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::expire_fungible_listing<DappKey, CoinType>(\n dapp_key::new(), listing, user_storage, ctx\n );\n }`);\n } else if (isUnique && idField) {\n // Build key params and record_key bytes using ALL keys (not just idField/keys[0])\n const listKeyParams = keys.map((k) => `${k}: ${fields[k] as string}`).join(',\\n ');\n const listRecordKeyLines = keys\n .map((k) => `record_key.push_back(sui::bcs::to_bytes(&${k}));`)\n .join('\\n ');\n parts.push(`\n // ─── listable: market protocol (keyed) ──────────────────────────────\n // Package-level helpers: call these from your system functions.\n // Add pause checks, access control, and custom logic there.\n public(package) fun list<CoinType>(\n user_storage: &mut UserStorage,\n ${listKeyParams},\n price: u64,\n listed_until: std::option::Option<u64>,\n ctx: &mut TxContext,\n ) {\n let mut record_key = vector::empty();\n record_key.push_back(TABLE_NAME);\n ${listRecordKeyLines}\n dubhe::dapp_system::take_record<DappKey, CoinType>(\n dapp_key::new(),\n user_storage,\n ${tableNameExpr},\n record_key,\n vector[${valueNames.map((n) => `b\"${n}\"`).join(', ')}],\n price,\n listed_until,\n ctx,\n );\n }\n\n public(package) fun buy<CoinType>(\n dh: &dubhe::dapp_service::DappHub,\n dapp_storage: &mut DappStorage,\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n payment: sui::coin::Coin<CoinType>,\n ctx: &mut TxContext,\n ): sui::coin::Coin<CoinType> {\n dubhe::dapp_system::buy_record<DappKey, CoinType>(\n dapp_key::new(), dh, dapp_storage, listing, user_storage, payment, ctx\n )\n }\n\n public(package) fun cancel_listing<CoinType>(\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::restore_record<DappKey, CoinType>(\n dapp_key::new(), listing, user_storage, ctx\n );\n }\n\n public(package) fun expire_listing<CoinType>(\n listing: dubhe::dapp_service::Listing<CoinType>,\n user_storage: &mut UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::expire_listing<DappKey, CoinType>(\n dapp_key::new(), listing, user_storage, ctx\n );\n }`);\n }\n }\n\n return parts.join('\\n');\n}\n","import { DubheConfig, ObjectConfig, Component } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport path from 'node:path';\n\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word) => {\n if (/^\\d+$/.test(word)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getMoveType(t: string): string {\n return t === 'string' || t === 'String' ? 'String' : t;\n}\n\n/**\n * Generate typed field accessors (get/set) for an ObjectStorage's own fields.\n * Calls the framework's set_object_field / get_object_field which handle\n * native-type storage and event emission automatically.\n */\n// Type token for substitution into generated code\nfunction objStorageType(markerName: string): string {\n return `dubhe::dapp_service::ObjectStorage<${markerName}>`;\n}\n\nfunction generateFieldAccessors(objKey: string, cfg: ObjectConfig): string {\n const markerName = toPascalCase(objKey);\n const storageType = objStorageType(markerName);\n const lines: string[] = [];\n\n for (const [fieldName, fieldType] of Object.entries(cfg.fields)) {\n const moveType = getMoveType(fieldType as string);\n\n lines.push(`\n public fun get_${fieldName}(storage: &${storageType}): ${moveType} {\n dubhe::dapp_system::get_object_field<${markerName}, ${moveType}>(storage, b\"${fieldName}\")\n }\n\n public(package) fun set_${fieldName}(storage: &mut ${storageType}, value: ${moveType}) {\n dubhe::dapp_system::set_object_field<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, b\"${fieldName}\", value\n );\n }`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate bag accessor functions for a fungible resource accepted by this object.\n * Reads use has_object_field to return a default of 0; writes do a read-modify-write\n * through the framework CRUD API so events are emitted.\n */\nfunction generateFungibleBagAccessors(objKey: string, resourceName: string): string {\n const markerName = toPascalCase(objKey);\n const storageType = objStorageType(markerName);\n\n return `\n public fun get_${resourceName}(storage: &${storageType}): u64 {\n if (dubhe::dapp_system::has_object_field<${markerName}, u64>(storage, b\"${resourceName}\")) {\n dubhe::dapp_system::get_object_field<${markerName}, u64>(storage, b\"${resourceName}\")\n } else { 0 }\n }\n\n public(package) fun add_${resourceName}(storage: &mut ${storageType}, amount: u64) {\n let current = get_${resourceName}(storage);\n dubhe::dapp_system::set_object_field<DappKey, ${markerName}, u64>(\n dapp_key::new(), storage, b\"${resourceName}\", current + amount\n );\n }\n\n public(package) fun sub_${resourceName}(storage: &mut ${storageType}, amount: u64) {\n let current = get_${resourceName}(storage);\n assert!(current >= amount, EInsufficientAmount);\n dubhe::dapp_system::set_object_field<DappKey, ${markerName}, u64>(\n dapp_key::new(), storage, b\"${resourceName}\", current - amount\n );\n }`;\n}\n\n/**\n * Generate bag accessor functions for a keyed resource accepted by this object.\n * item_id is BCS-encoded as the Bag key; value is vector<u8> (raw bytes).\n */\nfunction generateKeyedBagAccessors(objKey: string, resourceName: string, idField: string): string {\n const markerName = toPascalCase(objKey);\n const storageType = objStorageType(markerName);\n\n return `\n public fun has_${resourceName}(storage: &${storageType}, ${idField}: u64): bool {\n let key = sui::bcs::to_bytes(&${idField});\n dubhe::dapp_system::has_object_field<${markerName}, vector<u8>>(storage, key)\n }\n\n public fun get_${resourceName}_data(storage: &${storageType}, ${idField}: u64): vector<u8> {\n let key = sui::bcs::to_bytes(&${idField});\n dubhe::dapp_system::get_object_field<${markerName}, vector<u8>>(storage, key)\n }\n\n public(package) fun set_${resourceName}_data(storage: &mut ${storageType}, ${idField}: u64, data: vector<u8>) {\n let key = sui::bcs::to_bytes(&${idField});\n assert!(!dubhe::dapp_system::has_object_field<${markerName}, vector<u8>>(storage, key), EDuplicateItemId);\n dubhe::dapp_system::set_object_field<DappKey, ${markerName}, vector<u8>>(\n dapp_key::new(), storage, key, data\n );\n }\n\n public(package) fun remove_${resourceName}_data(storage: &mut ${storageType}, ${idField}: u64): vector<u8> {\n let key = sui::bcs::to_bytes(&${idField});\n assert!(dubhe::dapp_system::has_object_field<${markerName}, vector<u8>>(storage, key), EFieldNotFound);\n dubhe::dapp_system::remove_object_field<DappKey, ${markerName}, vector<u8>>(dapp_key::new(), storage, key)\n }`;\n}\n\n/**\n * Generate cross-storage transfer functions for acceptsFrom sources.\n * These live in the DESTINATION module and atomically move resources between\n * two ObjectStorage (or SceneStorage) objects.\n */\nfunction generateAcceptsFromTransfers(\n projectName: string,\n destKey: string,\n destAccepts: string[],\n acceptsFrom: string[],\n config: DubheConfig\n): { imports: string[]; functions: string[] } {\n const resources = config.resources ?? {};\n const allObjects = config.objects ?? {};\n const allScenes = config.scenes ?? {};\n\n const destMarker = toPascalCase(destKey);\n const destStorageType = objStorageType(destMarker);\n const imports: string[] = [];\n const functions: string[] = [];\n\n for (const sourceName of acceptsFrom) {\n const sourceCfg = allObjects[sourceName] ?? allScenes[sourceName];\n if (!sourceCfg) continue;\n\n const sourceAccepts = sourceCfg.accepts ?? [];\n const sourceMarker = toPascalCase(sourceName);\n // Source may be ObjectStorage or SceneStorage — import just the module\n imports.push(` use ${projectName}::${sourceName};`);\n\n const commonResources = sourceAccepts.filter((r) => destAccepts.includes(r));\n\n for (const resourceName of commonResources) {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') continue;\n const comp = resCfg as Component;\n\n // Use fully-qualified phantom type to avoid import issues\n const isSourceScene = !!allScenes[sourceName];\n const qualifiedSourceMarker = `${projectName}::${sourceName}::${sourceMarker}`;\n const sourceStorageType = isSourceScene\n ? `dubhe::dapp_service::SceneStorage<${qualifiedSourceMarker}>`\n : `dubhe::dapp_service::ObjectStorage<${qualifiedSourceMarker}>`;\n const sourceSceneCfg = isSourceScene ? allScenes[sourceName] : undefined;\n const sourcePermitType =\n sourceSceneCfg?.authorization.kind === 'permit'\n ? `dubhe::dapp_service::ScenePermit<${projectName}::${\n sourceSceneCfg.authorization.permit\n }::${toPascalCase(sourceSceneCfg.authorization.permit)}>`\n : '';\n const sourcePermitParam =\n sourceSceneCfg?.authorization.kind === 'permit'\n ? ` source_permit: &${sourcePermitType},\\n`\n : '';\n const sourceIsPermitScene = sourceSceneCfg?.authorization.kind === 'permit';\n const sourceCallPrefix = sourceIsPermitScene ? 'source_permit, ' : '';\n // Permit-authorized scene writes resolve the caller identity from user_storage.\n const sourceUserStorageParam = sourceIsPermitScene\n ? ` user_storage: &dubhe::dapp_service::UserStorage,\\n`\n : '';\n const sourceUserStorageCall = sourceIsPermitScene ? 'user_storage, ' : '';\n const sourceCtxParam = sourceIsPermitScene ? ' ctx: &TxContext,\\n' : '';\n const sourceCtxCall = sourceIsPermitScene ? ', ctx' : '';\n\n if (!comp.fungible && comp.keys?.length) {\n const idField = comp.keys[0];\n functions.push(`\n /// Transfer ${resourceName} (keyed item) from ${sourceName} into this ${destKey}.\n public(package) fun transfer_${sourceName}_to_${destKey}_${resourceName}(\n${sourcePermitParam} from: &mut ${sourceStorageType},\n to: &mut ${destStorageType},\n${sourceUserStorageParam} ${idField}: u64,\n${sourceCtxParam}\n ) {\n let data = ${sourceName}::remove_${resourceName}_data(${sourceCallPrefix}from, ${sourceUserStorageCall}${idField}${sourceCtxCall});\n set_${resourceName}_data(to, ${idField}, data);\n }`);\n } else {\n functions.push(`\n /// Transfer ${resourceName} (fungible) from ${sourceName} into this ${destKey}.\n public(package) fun transfer_${sourceName}_to_${destKey}_${resourceName}(\n${sourcePermitParam} from: &mut ${sourceStorageType},\n to: &mut ${destStorageType},\n${sourceUserStorageParam} amount: u64,\n${sourceCtxParam}\n ) {\n ${sourceName}::sub_${resourceName}(${sourceCallPrefix}from, ${sourceUserStorageCall}amount${sourceCtxCall});\n add_${resourceName}(to, amount);\n }`);\n }\n }\n }\n\n return { imports, functions };\n}\n\nexport async function generateObjects(config: DubheConfig, outputDir: string) {\n if (!config.objects || Object.keys(config.objects).length === 0) return;\n console.log('\\nšŸ“¦ Starting Object Storage Generation...');\n\n const projectName = config.name;\n const resources = config.resources ?? {};\n\n for (const [objKey, objCfg] of Object.entries(config.objects)) {\n console.log(` └─ ${objKey}`);\n const markerName = toPascalCase(objKey);\n const storageAlias = `${markerName}Storage`;\n const typeTag = `b\"${objKey}\"`;\n\n // Own field accessors (framework CRUD calls)\n const fieldAccessors = generateFieldAccessors(objKey, objCfg);\n\n // Bag accessors for accepted resources\n const acceptedResources = objCfg.accepts ?? [];\n const bagAccessorParts: string[] = [];\n for (const resourceName of acceptedResources) {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') continue;\n const comp = resCfg as Component;\n if (!comp.fungible && comp.keys?.length) {\n bagAccessorParts.push(generateKeyedBagAccessors(objKey, resourceName, comp.keys[0]));\n } else {\n bagAccessorParts.push(generateFungibleBagAccessors(objKey, resourceName));\n }\n }\n\n // acceptsFrom: cross-storage transfer functions\n const { imports: afImports, functions: afFunctions } = generateAcceptsFromTransfers(\n projectName,\n objKey,\n acceptedResources,\n objCfg.acceptsFrom ?? [],\n config\n );\n\n // adminOnly check for create\n const adminCheck = objCfg.adminOnly\n ? ` assert!(ctx.sender() == dubhe::dapp_service::dapp_admin(dapp_storage), ENoPermission);`\n : '';\n\n const fullStorageTypeLocal = `dubhe::dapp_service::ObjectStorage<${markerName}>`;\n\n // assert_<key>_id helper (reads entity_id via framework accessor)\n const assertIdFn = `\n public fun assert_${objKey}_id(storage: &${fullStorageTypeLocal}, expected: vector<u8>) {\n assert!(*dubhe::dapp_service::object_storage_entity_id(storage) == expected, EWrongEntityId);\n }`;\n\n // entity_id accessor\n const entityIdFn = `\n public fun entity_id(storage: &${fullStorageTypeLocal}): vector<u8> {\n *dubhe::dapp_service::object_storage_entity_id(storage)\n }`;\n\n // Conditional String import: needed when own fields or String-typed accepts are used\n const ownFieldTypes = Object.values(objCfg.fields) as string[];\n const needsStringImport = ownFieldTypes.some(\n (t) => t === 'string' || t === 'String' || t === 'vector<String>'\n );\n const stringImport = needsStringImport ? `\\n use std::ascii::String;` : '';\n\n // Conditional error constants\n const hasKeyedAccepts = acceptedResources.some((r) => {\n const rc = resources[r];\n if (!rc || typeof rc === 'string') return false;\n return !!(rc as Component).keys?.length && !(rc as Component).fungible;\n });\n const hasFungibleAccepts = acceptedResources.some((r) => {\n const rc = resources[r];\n if (!rc || typeof rc === 'string') return false;\n return !!(rc as Component).fungible;\n });\n // EFieldNotFound is only used in remove_*_data for keyed bag accessors\n const objNeedsFieldNotFound = hasKeyedAccepts;\n const objNeedsInsufficient = hasFungibleAccepts;\n const objNeedsDuplicate = hasKeyedAccepts;\n const objNeedsNoPermission = !!objCfg.adminOnly;\n\n const errorConstants = [\n objNeedsFieldNotFound\n ? ` #[error]\\n const EFieldNotFound: vector<u8> = b\"Field not found\";`\n : '',\n objNeedsInsufficient\n ? ` #[error]\\n const EInsufficientAmount: vector<u8> = b\"Insufficient amount\";`\n : '',\n objNeedsDuplicate\n ? ` #[error]\\n const EDuplicateItemId: vector<u8> = b\"Duplicate item id\";`\n : '',\n ` #[error]\\n const EWrongEntityId: vector<u8> = b\"Wrong entity id\";`,\n objNeedsNoPermission\n ? ` #[error]\\n const ENoPermission: vector<u8> = b\"Caller does not have permission\";`\n : ''\n ]\n .filter(Boolean)\n .join('\\n');\n\n const afImportBlock = afImports.length > 0 ? '\\n' + afImports.join('\\n') : '';\n\n // Use the full framework type name for all function signatures.\n // Move type aliases (public type) are not yet supported in this Sui version,\n // so we use ObjectStorage<Marker> directly.\n const fullStorageType = `dubhe::dapp_service::ObjectStorage<${markerName}>`;\n\n const code = `module ${projectName}::${objKey} {\n use dubhe::dapp_service::DappStorage;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;${stringImport}${afImportBlock}\n\n // ─── Error constants ───────────────────────────────────────────────────\n${errorConstants}\n\n const TYPE_TAG: vector<u8> = ${typeTag};\n\n // ─── Phantom marker type ───────────────────────────────────────────────\n /// Phantom type that distinguishes ${storageAlias} from other ObjectStorage types\n /// at the Move compiler level, preserving compile-time type safety.\n /// All functions use ObjectStorage<${markerName}> directly in their signatures.\n public struct ${markerName} has copy, drop {}\n\n // ─── ID / entity accessors ─────────────────────────────────────────────\n${entityIdFn}\n\n${assertIdFn}\n\n // ─── Field accessors (own fields) ──────────────────────────────────────\n${fieldAccessors}\n\n // ─── Bag accessors for accepted resources ─────────────────────────────\n${bagAccessorParts.join('\\n')}\n\n // ─── acceptsFrom: cross-storage transfer functions ─────────────────────\n${afFunctions.join('\\n')}\n\n // ─── Lifecycle entry functions ─────────────────────────────────────────\n public(package) fun create_${objKey}(\n dapp_storage: &mut DappStorage,\n entity_id: vector<u8>,\n ctx: &mut TxContext,\n ) {\n${adminCheck}\n dubhe::dapp_system::create_and_share_typed_object<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, TYPE_TAG, entity_id, ctx\n );\n }\n\n public(package) fun destroy_${objKey}(\n dapp_storage: &mut DappStorage,\n storage: ${fullStorageType},\n _ctx: &TxContext,\n ) {\n dubhe::dapp_system::destroy_typed_object<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, storage\n );\n }\n}\n`;\n\n await formatAndWriteMove(code, path.join(outputDir, `${objKey}.move`), 'formatAndWriteMove');\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport path from 'node:path';\n\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word) => {\n if (/^\\d+$/.test(word)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nexport async function generatePermits(config: DubheConfig, outputDir: string) {\n if (!config.permits || Object.keys(config.permits).length === 0) return;\n console.log('\\nšŸ“¦ Starting Scene Permit Generation...');\n\n const projectName = config.name;\n\n for (const permitKey of Object.keys(config.permits)) {\n console.log(` └─ ${permitKey}`);\n const markerName = toPascalCase(permitKey);\n const permitTypeTag = `b\"${permitKey}\"`;\n const fullPermitType = `dubhe::dapp_service::ScenePermit<${markerName}>`;\n\n const code = `module ${projectName}::${permitKey} {\n use dubhe::dapp_service::{Self, DappStorage};\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;\n\n const PERMIT_TYPE: vector<u8> = ${permitTypeTag};\n\n #[error]\n const EPermitNotExpiredYet: vector<u8> = b\"Scene permit is still active\";\n\n /// Phantom type that distinguishes this permit from others at compile time.\n public struct ${markerName} has copy, drop {}\n\n public fun meta(permit: &${fullPermitType}): &dubhe::dapp_service::PermitMetadata {\n dapp_service::scene_permit_meta(permit)\n }\n\n public fun is_active(permit: &${fullPermitType}, now_ms: u64): bool {\n dapp_service::is_scene_active(dapp_service::scene_permit_meta(permit), now_ms)\n }\n\n public fun is_participant(permit: &${fullPermitType}, addr: address): bool {\n dubhe::dapp_system::is_scene_permit_participant<${markerName}>(permit, addr)\n }\n\n public(package) fun new_${permitKey}(\n dapp_storage: &DappStorage,\n participants: vector<address>,\n expires_at: std::option::Option<u64>,\n max_participants: std::option::Option<u64>,\n ctx: &mut TxContext,\n ): ${fullPermitType} {\n dubhe::dapp_system::new_scene_permit<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, PERMIT_TYPE, participants, expires_at, max_participants, ctx\n )\n }\n\n public(package) fun new_${permitKey}_with_invitations(\n dapp_storage: &DappStorage,\n invitees: vector<address>,\n invites_expire_at: std::option::Option<u64>,\n scene_expires_at: std::option::Option<u64>,\n max_participants: std::option::Option<u64>,\n ctx: &mut TxContext,\n ): ${fullPermitType} {\n dubhe::dapp_system::new_scene_permit_with_invitations<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, PERMIT_TYPE, invitees, invites_expire_at, scene_expires_at, max_participants, ctx\n )\n }\n\n public(package) fun share_${permitKey}(permit: ${fullPermitType}) {\n dubhe::dapp_system::share_scene_permit<DappKey, ${markerName}>(\n dapp_key::new(), permit\n );\n }\n\n public(package) fun create_${permitKey}(\n dapp_storage: &DappStorage,\n participants: vector<address>,\n expires_at: std::option::Option<u64>,\n max_participants: std::option::Option<u64>,\n ctx: &mut TxContext,\n ) {\n dubhe::dapp_system::create_and_share_scene_permit<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, PERMIT_TYPE, participants, expires_at, max_participants, ctx\n );\n }\n\n public(package) fun create_${permitKey}_with_invitations(\n dapp_storage: &DappStorage,\n invitees: vector<address>,\n invites_expire_at: std::option::Option<u64>,\n scene_expires_at: std::option::Option<u64>,\n max_participants: std::option::Option<u64>,\n ctx: &mut TxContext,\n ) {\n dubhe::dapp_system::create_and_share_scene_permit_with_invitations<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, PERMIT_TYPE, invitees, invites_expire_at, scene_expires_at, max_participants, ctx\n );\n }\n\n public(package) fun accept_${permitKey}(\n permit: &mut ${fullPermitType},\n user_storage: &dubhe::dapp_service::UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::accept_scene_permit_invitation<DappKey, ${markerName}>(\n dapp_key::new(), permit, user_storage, ctx\n );\n }\n\n public(package) fun join_${permitKey}(\n permit: &mut ${fullPermitType},\n user_storage: &dubhe::dapp_service::UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::join_scene_permit<DappKey, ${markerName}>(dapp_key::new(), permit, user_storage, ctx);\n }\n\n public(package) fun leave_${permitKey}(\n permit: &mut ${fullPermitType},\n user_storage: &dubhe::dapp_service::UserStorage,\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::leave_scene_permit<DappKey, ${markerName}>(dapp_key::new(), permit, user_storage, ctx);\n }\n\n public(package) fun expire_${permitKey}(\n permit: ${fullPermitType},\n ctx: &TxContext,\n ) {\n assert!(\n !dapp_service::is_scene_active(dapp_service::scene_permit_meta(&permit), ctx.epoch_timestamp_ms()),\n EPermitNotExpiredYet\n );\n dubhe::dapp_system::destroy_scene_permit<DappKey, ${markerName}>(\n dapp_key::new(), permit\n );\n }\n}\n`;\n\n await formatAndWriteMove(code, path.join(outputDir, `${permitKey}.move`), 'formatAndWriteMove');\n }\n}\n","import { DubheConfig, SceneConfig, Component } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\nimport path from 'node:path';\n\nfunction toPascalCase(str: string): string {\n return str\n .split('_')\n .map((word) => {\n if (/^\\d+$/.test(word)) return word;\n return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n })\n .join('');\n}\n\nfunction getMoveType(t: string): string {\n return t === 'string' || t === 'String' ? 'String' : t;\n}\n\nfunction sceneStorageType(markerName: string): string {\n return `dubhe::dapp_service::SceneStorage<${markerName}>`;\n}\n\nfunction permitMarker(config: DubheConfig, cfg: SceneConfig): string | undefined {\n if (cfg.authorization.kind !== 'permit') return undefined;\n return `${config.name}::${cfg.authorization.permit}::${toPascalCase(cfg.authorization.permit)}`;\n}\n\nfunction permitType(config: DubheConfig, cfg: SceneConfig): string | undefined {\n if (cfg.authorization.kind !== 'permit') return undefined;\n return `dubhe::dapp_service::ScenePermit<${permitMarker(config, cfg)}>`;\n}\n\nfunction generateFieldAccessors(config: DubheConfig, sceneKey: string, cfg: SceneConfig): string {\n const markerName = toPascalCase(sceneKey);\n const storageType = sceneStorageType(markerName);\n const permit = permitMarker(config, cfg);\n const permitStorageType = permitType(config, cfg);\n const lines: string[] = [];\n\n for (const [fieldName, fieldType] of Object.entries(cfg.fields)) {\n const moveType = getMoveType(fieldType as string);\n\n if (cfg.authorization.kind === 'permit' && permit && permitStorageType) {\n lines.push(`\n public fun get_${fieldName}(storage: &${storageType}): ${moveType} {\n dubhe::dapp_system::get_scene_field<${markerName}, ${moveType}>(storage, b\"${fieldName}\")\n }\n\n public(package) fun set_${fieldName}(\n permit: &${permitStorageType},\n storage: &mut ${storageType},\n user_storage: &dubhe::dapp_service::UserStorage,\n value: ${moveType},\n ctx: &TxContext,\n ) {\n dubhe::dapp_system::set_scene_field<DappKey, ${permit}, ${markerName}, ${moveType}>(\n dapp_key::new(), permit, storage, user_storage, b\"${fieldName}\", value, ctx\n );\n }\n\n public(package) fun remove_${fieldName}_system_maintenance(storage: &mut ${storageType}): ${moveType} {\n dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, b\"${fieldName}\"\n )\n }`);\n } else {\n lines.push(`\n public fun get_${fieldName}(storage: &${storageType}): ${moveType} {\n dubhe::dapp_system::get_scene_field<${markerName}, ${moveType}>(storage, b\"${fieldName}\")\n }\n\n public(package) fun set_${fieldName}(storage: &mut ${storageType}, value: ${moveType}) {\n dubhe::dapp_system::set_scene_field_system<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, b\"${fieldName}\", value\n );\n }\n\n public(package) fun remove_${fieldName}(storage: &mut ${storageType}): ${moveType} {\n dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, b\"${fieldName}\"\n )\n }`);\n }\n }\n\n return lines.join('\\n');\n}\n\nfunction writeArgs(config: DubheConfig, cfg: SceneConfig): string {\n const type = permitType(config, cfg);\n if (cfg.authorization.kind !== 'permit' || !type) return '';\n return ` permit: &${type},\\n`;\n}\n\n/// Permit-authorized writes identify the caller by user_storage's canonical owner.\nfunction userStorageArg(cfg: SceneConfig): string {\n if (cfg.authorization.kind !== 'permit') return '';\n return ` user_storage: &dubhe::dapp_service::UserStorage,\\n`;\n}\n\nfunction writeCtxArg(cfg: SceneConfig): string {\n return cfg.authorization.kind === 'permit' ? ' ctx: &TxContext,\\n' : '';\n}\n\nfunction setFieldCall(\n config: DubheConfig,\n cfg: SceneConfig,\n markerName: string,\n moveType: string,\n fieldExpr: string,\n valueExpr: string\n): string {\n const permit = permitMarker(config, cfg);\n if (cfg.authorization.kind === 'permit' && permit) {\n return `dubhe::dapp_system::set_scene_field<DappKey, ${permit}, ${markerName}, ${moveType}>(\n dapp_key::new(), permit, storage, user_storage, ${fieldExpr}, ${valueExpr}, ctx\n );`;\n }\n return `dubhe::dapp_system::set_scene_field_system<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, ${fieldExpr}, ${valueExpr}\n );`;\n}\n\nfunction removeFieldCall(\n config: DubheConfig,\n cfg: SceneConfig,\n markerName: string,\n moveType: string,\n fieldExpr: string\n): string {\n const permit = permitMarker(config, cfg);\n if (cfg.authorization.kind === 'permit' && permit) {\n return `dubhe::dapp_system::remove_scene_field<DappKey, ${permit}, ${markerName}, ${moveType}>(\n dapp_key::new(), permit, storage, user_storage, ${fieldExpr}, ctx\n )`;\n }\n return `dubhe::dapp_system::remove_scene_field_system_maintenance<DappKey, ${markerName}, ${moveType}>(\n dapp_key::new(), storage, ${fieldExpr}\n )`;\n}\n\nfunction generateFungibleBagAccessors(\n config: DubheConfig,\n sceneKey: string,\n cfg: SceneConfig,\n resourceName: string\n): string {\n const markerName = toPascalCase(sceneKey);\n const storageType = sceneStorageType(markerName);\n\n return `\n public fun get_${resourceName}(storage: &${storageType}): u64 {\n if (dubhe::dapp_system::has_scene_field<${markerName}, u64>(storage, b\"${resourceName}\")) {\n dubhe::dapp_system::get_scene_field<${markerName}, u64>(storage, b\"${resourceName}\")\n } else { 0 }\n }\n\n public(package) fun add_${resourceName}(\n${writeArgs(config, cfg)} storage: &mut ${storageType},\n${userStorageArg(cfg)} amount: u64,\n${writeCtxArg(cfg)} ) {\n let current = get_${resourceName}(storage);\n ${setFieldCall(config, cfg, markerName, 'u64', `b\"${resourceName}\"`, 'current + amount')}\n }\n\n public(package) fun sub_${resourceName}(\n${writeArgs(config, cfg)} storage: &mut ${storageType},\n${userStorageArg(cfg)} amount: u64,\n${writeCtxArg(cfg)} ) {\n let current = get_${resourceName}(storage);\n assert!(current >= amount, EInsufficientAmount);\n ${setFieldCall(config, cfg, markerName, 'u64', `b\"${resourceName}\"`, 'current - amount')}\n }`;\n}\n\nfunction generateKeyedBagAccessors(\n config: DubheConfig,\n sceneKey: string,\n cfg: SceneConfig,\n resourceName: string,\n idField: string\n): string {\n const markerName = toPascalCase(sceneKey);\n const storageType = sceneStorageType(markerName);\n\n return `\n public fun has_${resourceName}(storage: &${storageType}, ${idField}: u64): bool {\n let key = sui::bcs::to_bytes(&${idField});\n dubhe::dapp_system::has_scene_field<${markerName}, vector<u8>>(storage, key)\n }\n\n public fun get_${resourceName}_data(storage: &${storageType}, ${idField}: u64): vector<u8> {\n let key = sui::bcs::to_bytes(&${idField});\n dubhe::dapp_system::get_scene_field<${markerName}, vector<u8>>(storage, key)\n }\n\n public(package) fun set_${resourceName}_data(\n${writeArgs(config, cfg)} storage: &mut ${storageType},\n${userStorageArg(cfg)} ${idField}: u64,\n data: vector<u8>,\n${writeCtxArg(cfg)} ) {\n let key = sui::bcs::to_bytes(&${idField});\n assert!(!dubhe::dapp_system::has_scene_field<${markerName}, vector<u8>>(storage, key), EDuplicateItemId);\n ${setFieldCall(config, cfg, markerName, 'vector<u8>', 'key', 'data')}\n }\n\n public(package) fun remove_${resourceName}_data(\n${writeArgs(config, cfg)} storage: &mut ${storageType},\n${userStorageArg(cfg)} ${idField}: u64,\n${writeCtxArg(cfg)} ): vector<u8> {\n let key = sui::bcs::to_bytes(&${idField});\n assert!(dubhe::dapp_system::has_scene_field<${markerName}, vector<u8>>(storage, key), EFieldNotFound);\n ${removeFieldCall(config, cfg, markerName, 'vector<u8>', 'key')}\n }`;\n}\n\nfunction generateAcceptsFromTransfers(\n projectName: string,\n destKey: string,\n destCfg: SceneConfig,\n destAccepts: string[],\n acceptsFrom: string[],\n config: DubheConfig\n): { imports: string[]; functions: string[] } {\n const resources = config.resources ?? {};\n const allObjects = config.objects ?? {};\n const allScenes = config.scenes ?? {};\n const destMarker = toPascalCase(destKey);\n const destStorageType = sceneStorageType(destMarker);\n const imports: string[] = [];\n const functions: string[] = [];\n const destPermit = permitType(config, destCfg);\n const destPermitArg =\n destCfg.authorization.kind === 'permit' && destPermit\n ? ` dest_permit: &${destPermit},\\n`\n : '';\n const destCallPrefix = destCfg.authorization.kind === 'permit' ? 'dest_permit, ' : '';\n const destCtxCall = destCfg.authorization.kind === 'permit' ? ', ctx' : '';\n\n for (const sourceName of acceptsFrom) {\n const sourceCfg = allObjects[sourceName] ?? allScenes[sourceName];\n if (!sourceCfg) continue;\n\n const sourceAccepts = sourceCfg.accepts ?? [];\n const sourceMarker = toPascalCase(sourceName);\n imports.push(` use ${projectName}::${sourceName};`);\n\n const isSourceScene = !!allScenes[sourceName];\n const qualifiedSourceMarker = `${projectName}::${sourceName}::${sourceMarker}`;\n const sourceStorageType = isSourceScene\n ? `dubhe::dapp_service::SceneStorage<${qualifiedSourceMarker}>`\n : `dubhe::dapp_service::ObjectStorage<${qualifiedSourceMarker}>`;\n const sceneSourceCfg = isSourceScene ? (sourceCfg as SceneConfig) : undefined;\n const sourcePermit = sceneSourceCfg ? permitType(config, sceneSourceCfg) : undefined;\n const sourceIsPermitScene = sceneSourceCfg?.authorization.kind === 'permit' && !!sourcePermit;\n const sourcePermitArg = sourceIsPermitScene ? ` source_permit: &${sourcePermit},\\n` : '';\n const sourceCallPrefix = sourceIsPermitScene ? 'source_permit, ' : '';\n const sourceUserStorageCall = sourceIsPermitScene ? 'user_storage, ' : '';\n const sourceCtxCall = sourceIsPermitScene ? ', ctx' : '';\n\n const destIsPermitScene = destCfg.authorization.kind === 'permit';\n const destUserStorageCall = destIsPermitScene ? 'user_storage, ' : '';\n // Permit-authorized writes resolve the caller identity from user_storage.\n const userStorageParam =\n sourceIsPermitScene || destIsPermitScene\n ? ` user_storage: &dubhe::dapp_service::UserStorage,\\n`\n : '';\n const ctxParam =\n sourceIsPermitScene || destIsPermitScene ? ' ctx: &TxContext,\\n' : '';\n\n const commonResources = sourceAccepts.filter((r) => destAccepts.includes(r));\n for (const resourceName of commonResources) {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') continue;\n const comp = resCfg as Component;\n\n if (!comp.fungible && comp.keys?.length) {\n const idField = comp.keys[0];\n functions.push(`\n public(package) fun transfer_${sourceName}_to_${destKey}_${resourceName}(\n${sourcePermitArg}${destPermitArg} from: &mut ${sourceStorageType},\n to: &mut ${destStorageType},\n${userStorageParam} ${idField}: u64,\n${ctxParam} ) {\n let data = ${sourceName}::remove_${resourceName}_data(${sourceCallPrefix}from, ${sourceUserStorageCall}${idField}${sourceCtxCall});\n set_${resourceName}_data(${destCallPrefix}to, ${destUserStorageCall}${idField}, data${destCtxCall});\n }`);\n } else {\n functions.push(`\n public(package) fun transfer_${sourceName}_to_${destKey}_${resourceName}(\n${sourcePermitArg}${destPermitArg} from: &mut ${sourceStorageType},\n to: &mut ${destStorageType},\n${userStorageParam} amount: u64,\n${ctxParam} ) {\n ${sourceName}::sub_${resourceName}(${sourceCallPrefix}from, ${sourceUserStorageCall}amount${sourceCtxCall});\n add_${resourceName}(${destCallPrefix}to, ${destUserStorageCall}amount${destCtxCall});\n }`);\n }\n }\n }\n\n return { imports, functions };\n}\n\nexport async function generateScenes(config: DubheConfig, outputDir: string) {\n if (!config.scenes || Object.keys(config.scenes).length === 0) return;\n console.log('\\nšŸ“¦ Starting Scene Storage Generation...');\n\n const projectName = config.name;\n const resources = config.resources ?? {};\n\n for (const [sceneKey, sceneCfg] of Object.entries(config.scenes)) {\n console.log(` └─ ${sceneKey}`);\n const markerName = toPascalCase(sceneKey);\n const sceneTypeTag = `b\"${sceneKey}\"`;\n const fullSceneType = sceneStorageType(markerName);\n const fieldAccessors = generateFieldAccessors(config, sceneKey, sceneCfg);\n const acceptedResources = sceneCfg.accepts ?? [];\n\n const bagAccessorParts: string[] = [];\n for (const resourceName of acceptedResources) {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') continue;\n const comp = resCfg as Component;\n if (!comp.fungible && comp.keys?.length) {\n bagAccessorParts.push(\n generateKeyedBagAccessors(config, sceneKey, sceneCfg, resourceName, comp.keys[0])\n );\n } else {\n bagAccessorParts.push(\n generateFungibleBagAccessors(config, sceneKey, sceneCfg, resourceName)\n );\n }\n }\n\n const { imports: afImports, functions: afFunctions } = generateAcceptsFromTransfers(\n projectName,\n sceneKey,\n sceneCfg,\n acceptedResources,\n sceneCfg.acceptsFrom ?? [],\n config\n );\n\n const sceneFieldTypes = Object.values(sceneCfg.fields) as string[];\n const sceneNeedsStringImport = sceneFieldTypes.some(\n (t) => t === 'string' || t === 'String' || t === 'vector<String>'\n );\n const sceneStringImport = sceneNeedsStringImport ? `\\n use std::ascii::String;` : '';\n\n const hasKeyedBagAccessors = acceptedResources.some((resourceName) => {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') return false;\n return !!(resCfg as Component).keys?.length && !(resCfg as Component).fungible;\n });\n const hasFungibleBagAccessors = acceptedResources.some((resourceName) => {\n const resCfg = resources[resourceName];\n if (!resCfg || typeof resCfg === 'string') return false;\n return !!(resCfg as Component).fungible;\n });\n\n const errorConstants = [\n hasKeyedBagAccessors\n ? ` #[error]\\n const EFieldNotFound: vector<u8> = b\"Field not found\";`\n : '',\n hasFungibleBagAccessors\n ? ` #[error]\\n const EInsufficientAmount: vector<u8> = b\"Insufficient amount\";`\n : '',\n hasKeyedBagAccessors\n ? ` #[error]\\n const EDuplicateItemId: vector<u8> = b\"Duplicate item id\";`\n : ''\n ]\n .filter(Boolean)\n .join('\\n');\n const errorBlock =\n errorConstants.length > 0\n ? `\\n // ─── Error constants ───────────────────────────────────────────────────\\n${errorConstants}\\n`\n : '';\n\n const afImportBlock = afImports.length > 0 ? '\\n' + afImports.join('\\n') : '';\n const permit = permitType(config, sceneCfg);\n const createFns =\n sceneCfg.authorization.kind === 'permit' && permit\n ? `\n public(package) fun new_${sceneKey}_with_permit(\n dapp_storage: &DappStorage,\n permit: &${permit},\n ctx: &mut TxContext,\n ): ${fullSceneType} {\n dubhe::dapp_system::new_typed_scene_with_permit<DappKey, ${permitMarker(\n config,\n sceneCfg\n )}, ${markerName}>(\n dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx\n )\n }\n\n public(package) fun create_${sceneKey}_with_permit(\n dapp_storage: &DappStorage,\n permit: &${permit},\n ctx: &mut TxContext,\n ) {\n dubhe::dapp_system::create_and_share_typed_scene_with_permit<DappKey, ${permitMarker(\n config,\n sceneCfg\n )}, ${markerName}>(\n dapp_key::new(), dapp_storage, permit, SCENE_TYPE, ctx\n );\n }`\n : `\n public(package) fun new_${sceneKey}_system(\n dapp_storage: &DappStorage,\n ctx: &mut TxContext,\n ): ${fullSceneType} {\n dubhe::dapp_system::new_typed_scene_system<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, SCENE_TYPE, ctx\n )\n }\n\n public(package) fun create_${sceneKey}_system(\n dapp_storage: &DappStorage,\n ctx: &mut TxContext,\n ) {\n dubhe::dapp_system::create_and_share_typed_scene_system<DappKey, ${markerName}>(\n dapp_key::new(), dapp_storage, SCENE_TYPE, ctx\n );\n }`;\n\n const code = `module ${projectName}::${sceneKey} {\n use dubhe::dapp_service::DappStorage;\n use ${projectName}::dapp_key;\n use ${projectName}::dapp_key::DappKey;${sceneStringImport}${afImportBlock}\n${errorBlock}\n const SCENE_TYPE: vector<u8> = ${sceneTypeTag};\n\n /// Phantom type that distinguishes this scene storage at compile time.\n public struct ${markerName} has copy, drop {}\n\n // ─── Field accessors (own fields) ──────────────────────────────────────\n${fieldAccessors}\n\n // ─── Bag accessors for accepted resources ─────────────────────────────\n${bagAccessorParts.join('\\n')}\n\n // ─── acceptsFrom: cross-storage transfer functions ─────────────────────\n${afFunctions.join('\\n')}\n\n // ─── SceneStorage lifecycle wrappers ──────────────────────────────────\n${createFns}\n\n public(package) fun share_${sceneKey}(storage: ${fullSceneType}) {\n dubhe::dapp_system::share_scene_storage<DappKey, ${markerName}>(\n dapp_key::new(), storage\n );\n }\n\n public(package) fun destroy_${sceneKey}(storage: ${fullSceneType}) {\n dubhe::dapp_system::destroy_typed_scene<DappKey, ${markerName}>(\n dapp_key::new(), storage\n );\n }\n}\n`;\n\n await formatAndWriteMove(code, path.join(outputDir, `${sceneKey}.move`), 'formatAndWriteMove');\n }\n}\n","import { DubheConfig } from '../../types';\nimport { formatAndWriteMove } from '../formatAndWrite';\n\n/**\n * Generates a `user_storage_init.move` module that provides a single entry-point\n * for end-users to create their `UserStorage` object for the DApp.\n *\n * Only generated for non-dubhe packages; the dubhe framework manages its own\n * internal UserStorage creation through dapp_system::create_user_storage.\n */\nexport async function generateUserStorageInit(config: DubheConfig, path: string) {\n if (config.name === 'dubhe') return;\n\n const code = `module ${config.name}::user_storage_init {\n use dubhe::dapp_service::{DappHub, DappStorage};\n use dubhe::dapp_system;\n use ${config.name}::dapp_key;\n use ${config.name}::dapp_key::DappKey;\n use ${config.name}::migrate;\n\n /// Create a UserStorage for the transaction sender within this DApp.\n /// Must be called once before the user can interact with any user-level resources.\n /// Aborts if the DApp version does not match this package, the DApp is paused,\n /// or the framework version has advanced.\n #[allow(lint(public_entry))]\n public entry fun init_user_storage(\n dapp_hub: &DappHub,\n dapp_storage: &mut DappStorage,\n ctx: &mut TxContext,\n ) {\n dapp_system::ensure_latest_version<DappKey>(dapp_storage, migrate::on_chain_version());\n dapp_system::create_user_storage(dapp_key::new(), dapp_hub, dapp_storage, ctx);\n }\n}\n`;\n await formatAndWriteMove(code, path, 'formatAndWriteMove');\n}\n","import chalk from 'chalk';\nimport { DubheConfig, Component, MoveType } from '../types';\nimport { existsSync, readFileSync, writeFileSync } from 'fs';\nimport path from 'node:path';\n\n/** Snapshot of field definitions for a single resource/object/scene. */\ntype FieldSnapshot = Record<string, string>;\n\n/** Top-level structure of a dubhe.lock.json file. */\ninterface DubheLock {\n version: 1;\n resources: Record<string, FieldSnapshot>;\n objects: Record<string, FieldSnapshot>;\n scenes: Record<string, FieldSnapshot>;\n}\n\n/** Extract the field map for a resource entry (handles both shorthand and full form). */\nfunction resourceFields(entry: Component | MoveType): FieldSnapshot {\n if (typeof entry === 'string') {\n return { value: entry };\n }\n const fields: FieldSnapshot = {};\n for (const [k, v] of Object.entries(entry.fields ?? {})) {\n fields[k] = v as string;\n }\n return fields;\n}\n\n/** Extract the field map for an object or scene entry. */\nfunction objectOrSceneFields(entry: { fields: Record<string, MoveType> }): FieldSnapshot {\n const fields: FieldSnapshot = {};\n for (const [k, v] of Object.entries(entry.fields)) {\n fields[k] = v as string;\n }\n return fields;\n}\n\n/** Build a full DubheLock snapshot from a DubheConfig. */\nfunction buildLock(config: DubheConfig): DubheLock {\n const resources: Record<string, FieldSnapshot> = {};\n for (const [name, entry] of Object.entries(config.resources ?? {})) {\n resources[name] = resourceFields(entry);\n }\n\n const objects: Record<string, FieldSnapshot> = {};\n for (const [name, entry] of Object.entries(config.objects ?? {})) {\n objects[name] = objectOrSceneFields(entry);\n }\n\n const scenes: Record<string, FieldSnapshot> = {};\n for (const [name, entry] of Object.entries(config.scenes ?? {})) {\n scenes[name] = objectOrSceneFields(entry);\n }\n\n return { version: 1, resources, objects, scenes };\n}\n\ntype SectionName = 'resources' | 'objects' | 'scenes';\n\n/** Compare old vs new field snapshots and throw on breaking changes. */\nfunction checkSection(\n section: SectionName,\n oldSection: Record<string, FieldSnapshot>,\n newSection: Record<string, FieldSnapshot>\n): void {\n for (const [name, newFields] of Object.entries(newSection)) {\n const oldFields = oldSection[name];\n if (!oldFields) continue; // New entry — allowed.\n\n for (const [field, oldType] of Object.entries(oldFields)) {\n if (!(field in newFields)) {\n throw new Error(\n `[dubhe] Breaking change detected in ${section}.${name}:\\n` +\n ` Field \"${field}\" was removed.\\n\\n` +\n `Resources, objects, and scenes are stored as raw bytes on-chain.\\n` +\n `Removing fields corrupts existing data. Use a new name (e.g. \"${name}_v2\") for breaking changes.`\n );\n }\n if (newFields[field] !== oldType) {\n throw new Error(\n `[dubhe] Breaking change detected in ${section}.${name}:\\n` +\n ` Field \"${field}\" type changed from \"${oldType}\" to \"${newFields[field]}\".\\n\\n` +\n `Resources, objects, and scenes are stored as raw bytes on-chain.\\n` +\n `Changing field types corrupts existing data. Use a new name (e.g. \"${name}_v2\") for breaking changes.`\n );\n }\n }\n }\n}\n\n/**\n * Read the existing lock file (if any), check for breaking changes against the\n * current config, then write an updated lock file.\n *\n * Call this at the start of `codegen()` before any file generation begins.\n *\n * @param rootDir The project root directory (same dir passed to `codegen()`).\n * @param config The parsed DubheConfig.\n */\nexport function checkAndUpdateLock(rootDir: string, config: DubheConfig): void {\n const lockPath = path.join(rootDir, `${config.name}.lock.json`);\n const newLock = buildLock(config);\n\n if (existsSync(lockPath)) {\n let oldLock: DubheLock;\n try {\n oldLock = JSON.parse(readFileSync(lockPath, 'utf-8')) as DubheLock;\n } catch {\n console.warn(\n chalk.yellow('[dubhe]') + ` Could not parse ${chalk.bold(lockPath)}, skipping break-check.`\n );\n writeFileSync(lockPath, JSON.stringify(newLock, null, 2) + '\\n', 'utf-8');\n return;\n }\n\n checkSection('resources', oldLock.resources ?? {}, newLock.resources);\n checkSection('objects', oldLock.objects ?? {}, newLock.objects);\n checkSection('scenes', oldLock.scenes ?? {}, newLock.scenes);\n }\n\n writeFileSync(lockPath, JSON.stringify(newLock, null, 2) + '\\n', 'utf-8');\n}\n","import chalk from 'chalk';\nimport { DubheConfig, Component } from '../types';\n\nconst warn = (msg: string) =>\n console.warn(chalk.yellow('[dubhe codegen]') + chalk.yellow(' WARNING: ') + msg);\n\n/**\n * Validate a DubheConfig for hard semantic errors only (throws, no console.warn).\n * Called by defineConfig() so errors surface immediately at config-load time,\n * without emitting duplicate warnings on every loadConfig() call.\n */\nexport function validateConfigErrors(config: DubheConfig): void {\n validateConfig(config, false);\n}\n\n/**\n * Validate a DubheConfig for semantic errors and warn on suspicious combinations.\n * Called by codegen before generation begins (once per generate/build run).\n *\n * Hard errors (throw):\n * - A resource listed in objects.accepts / scenes.accepts lacks `transferable: true`\n *\n * Warnings (console.warn):\n * - reactive: true + fungible: true (fungible deltas don't fit reactive pattern)\n * - fungible: true + listable: true (valid but requires special list with amount param)\n */\nexport function validateConfig(config: DubheConfig, emitWarnings = true): void {\n const resources = config.resources ?? {};\n const objects = config.objects ?? {};\n const permits = config.permits ?? {};\n const scenes = config.scenes ?? {};\n\n // ── Cross-namespace naming conflict check ─────────────────────────────────\n // resources, objects, permits, and scenes all generate Move modules named\n // `module <project>::<key>`. Duplicate keys across these three maps would\n // produce two modules with the same name in the same package, causing a\n // compile-time error.\n const resourceKeys = new Set(Object.keys(resources));\n const objectKeys = new Set(Object.keys(objects));\n const permitKeys = new Set(Object.keys(permits));\n const sceneKeys = new Set(Object.keys(scenes));\n\n const duplicates = new Set<string>();\n for (const k of resourceKeys) {\n if (objectKeys.has(k) || permitKeys.has(k) || sceneKeys.has(k)) duplicates.add(k);\n }\n for (const k of objectKeys) {\n if (permitKeys.has(k) || sceneKeys.has(k)) duplicates.add(k);\n }\n for (const k of permitKeys) {\n if (sceneKeys.has(k)) duplicates.add(k);\n }\n if (duplicates.size > 0) {\n throw new Error(\n `Duplicate module names found across resources/objects/permits/scenes: ${[...duplicates]\n .sort()\n .join(', ')}`\n );\n }\n\n // ── Collect all resource names that are accepted by objects or scenes ────────\n const acceptedResources = new Set<string>();\n\n for (const [objKey, objCfg] of Object.entries(objects)) {\n for (const r of objCfg.accepts ?? []) {\n acceptedResources.add(r);\n const res = resources[r];\n if (!res) {\n throw new Error(\n `objects.${objKey}.accepts references '${r}' which is not defined in resources`\n );\n }\n if (typeof res !== 'string' && !(res as Component).transferable) {\n throw new Error(\n `objects.${objKey}.accepts includes '${r}', but resources.${r} is missing transferable: true. ` +\n `Add transferable: true to resources.${r} to enable cross-storage transfers.`\n );\n }\n }\n\n for (const r of objCfg.acceptsFrom ?? []) {\n const isObject = !!objects[r];\n const isScene = !!scenes[r];\n if (!isObject && !isScene) {\n throw new Error(\n `objects.${objKey}.acceptsFrom references '${r}' which is not defined in objects or scenes`\n );\n }\n }\n }\n\n for (const [sceneKey, sceneCfg] of Object.entries(scenes)) {\n if (!sceneCfg.authorization) {\n throw new Error(\n `scenes.${sceneKey} is missing authorization. Use { kind: 'system' } or ` +\n `{ kind: 'permit', permit: '<permit_name>' }.`\n );\n }\n if (sceneCfg.authorization.kind === 'permit') {\n if (!permits[sceneCfg.authorization.permit]) {\n throw new Error(\n `scenes.${sceneKey}.authorization references permit '${sceneCfg.authorization.permit}', ` +\n `but permits.${sceneCfg.authorization.permit} is not defined`\n );\n }\n } else if (sceneCfg.authorization.kind !== 'system') {\n throw new Error(`scenes.${sceneKey}.authorization.kind must be 'system' or 'permit'`);\n }\n\n for (const r of sceneCfg.accepts ?? []) {\n acceptedResources.add(r);\n const res = resources[r];\n if (!res) {\n throw new Error(\n `scenes.${sceneKey}.accepts references '${r}' which is not defined in resources`\n );\n }\n if (typeof res !== 'string' && !(res as Component).transferable) {\n throw new Error(\n `scenes.${sceneKey}.accepts includes '${r}', but resources.${r} is missing transferable: true. ` +\n `Add transferable: true to resources.${r} to enable cross-storage transfers.`\n );\n }\n }\n\n for (const r of sceneCfg.acceptsFrom ?? []) {\n const isObject = !!objects[r];\n const isScene = !!scenes[r];\n if (!isObject && !isScene) {\n throw new Error(\n `scenes.${sceneKey}.acceptsFrom references '${r}' which is not defined in objects or scenes`\n );\n }\n }\n }\n\n // ── Per-resource annotation combination checks ───────────────────────────────\n for (const [name, resource] of Object.entries(resources)) {\n if (typeof resource === 'string') continue;\n const comp = resource as Component;\n\n // ── offchain incompatibility checks ─────────────────────────────────────\n if (comp.offchain) {\n if (comp.listable) {\n throw new Error(\n `resources.${name} has both offchain: true and listable: true. ` +\n `offchain resources emit events but store no on-chain state, ` +\n `so there is nothing to take out and place into a Listing.`\n );\n }\n if (comp.transferable) {\n throw new Error(\n `resources.${name} has both offchain: true and transferable: true. ` +\n `offchain resources have no on-chain state to transfer between storages.`\n );\n }\n if (comp.reactive) {\n throw new Error(\n `resources.${name} has both offchain: true and reactive: true. ` +\n `reactive writes target on-chain state, which offchain resources do not have.`\n );\n }\n if (comp.fungible) {\n if (emitWarnings)\n warn(\n `resources.${chalk.bold(name)} has both ${chalk.cyan(\n 'offchain: true'\n )} and ${chalk.cyan('fungible: true')}. ` +\n `offchain fungible events are emitted only; no on-chain balance is maintained ` +\n `and no add/sub functions are generated. This is unusual — verify your intent.`\n );\n }\n }\n\n if (comp.reactive && comp.fungible) {\n if (emitWarnings)\n warn(\n `resources.${chalk.bold(name)} has both ${chalk.cyan('reactive: true')} and ${chalk.cyan(\n 'fungible: true'\n )}. ` +\n `Fungible quantity changes (add/sub) do not suit reactive cross-user writes. ` +\n `Consider using a transfer function instead.`\n );\n }\n\n // ── global incompatibility checks ────────────────────────────────────────\n if (comp.global) {\n if (comp.reactive) {\n throw new Error(\n `resources.${name} has both global: true and reactive: true. ` +\n `global resources live in DappStorage (shared), not in UserStorage. ` +\n `Reactive writes operate between two UserStorage objects and are incompatible with global resources.`\n );\n }\n if (comp.listable) {\n throw new Error(\n `resources.${name} has both global: true and listable: true. ` +\n `global resources live in DappStorage and cannot be individually listed for sale. ` +\n `listable requires per-user ownership in UserStorage.`\n );\n }\n if (comp.transferable) {\n throw new Error(\n `resources.${name} has both global: true and transferable: true. ` +\n `global resources live in DappStorage and are not owned by individual users. ` +\n `transferable requires per-user state in UserStorage or ObjectStorage.`\n );\n }\n }\n\n if (comp.fungible && comp.listable) {\n if (emitWarnings)\n warn(\n `resources.${chalk.bold(name)} has both ${chalk.cyan('fungible: true')} and ${chalk.cyan(\n 'listable: true'\n )}. ` +\n `The generated ${chalk.green(\n `list_${name}`\n )} entry function will include an ${chalk.cyan(\n 'amount'\n )} parameter for partial listings.`\n );\n }\n\n if (comp.transferable && !acceptedResources.has(name)) {\n if (emitWarnings)\n warn(\n `resources.${chalk.bold(name)} has ${chalk.cyan(\n 'transferable: true'\n )} but is not referenced ` +\n `in any ${chalk.cyan('objects.accepts')} or ${chalk.cyan(\n 'scenes.accepts'\n )}. The cross-layer transfer functions will not be generated.`\n );\n }\n }\n}\n","import { DubheConfig } from '../../types';\nimport { validateConfigErrors } from '../validateConfig';\n\nexport const defineConfig = (config: DubheConfig): DubheConfig => {\n validateConfigErrors(config);\n return config;\n};\n","import { findUp } from 'find-up';\nimport path from 'path';\nimport esbuild from 'esbuild';\nimport { NotInsideProjectError } from './errors';\nimport { rmSync } from 'fs';\nimport { pathToFileURL } from 'url';\nimport os from 'os';\n\n// In order of preference files are checked\nconst configFiles = ['dubhe.config.js', 'dubhe.config.mjs', 'dubhe.config.ts', 'dubhe.config.mts'];\nconst TEMP_CONFIG = 'dubhe.config.example.mjs';\n\nexport async function loadConfig(configPath?: string): Promise<unknown> {\n configPath = await resolveConfigPath(configPath);\n try {\n await esbuild.build({\n entryPoints: [configPath],\n format: 'esm',\n outfile: TEMP_CONFIG,\n // https://esbuild.github.io/getting-started/#bundling-for-node\n platform: 'node',\n // bundle local imports (otherwise it may error, js can't import ts)\n bundle: true,\n // avoid bundling external imports (it's unnecessary and esbuild can't handle all node features)\n packages: 'external'\n });\n configPath = await resolveConfigPath(TEMP_CONFIG, true);\n // Node.js caches dynamic imports, so without appending a cache breaking\n // param like `?update={Date.now()}` this import always returns the same config\n // if called multiple times in a single process, like the `dev-contracts` cli\n return (await import(configPath + `?update=${Date.now()}`)).dubheConfig;\n } finally {\n rmSync(TEMP_CONFIG, { force: true });\n }\n}\n\nasync function resolveConfigPath(configPath: string | undefined, toFileURL?: boolean) {\n if (configPath === undefined) {\n configPath = await getUserConfigPath();\n } else {\n if (!path.isAbsolute(configPath)) {\n configPath = path.join(process.cwd(), configPath);\n configPath = path.normalize(configPath);\n }\n }\n\n // Add `file:///` for Windows support\n // (see https://github.com/nodejs/node/issues/31710)\n return toFileURL && os.platform() === 'win32' ? pathToFileURL(configPath).href : configPath;\n}\n\nasync function getUserConfigPath() {\n const tsConfigPath = await findUp(configFiles);\n if (tsConfigPath === undefined) {\n throw new NotInsideProjectError();\n }\n return tsConfigPath;\n}\n","export class NotInsideProjectError extends Error {\n name = 'NotInsideProjectError';\n message = 'You are not inside a Dubhe project';\n}\n","export enum SubscriptionKind {\n Event = 'event',\n Schema = 'schema'\n}\n\nexport type SubscribableType =\n | { kind: SubscriptionKind.Event; name?: string; sender?: string }\n | { kind: SubscriptionKind.Schema; name?: string };\n"],"mappings":"AAAA,OAAOA,OAAc,WACrB,OAAOC,OAAwB,0BAE/B,eAAsBC,GAAWC,EAAiBC,EAA8C,CAC9F,IAAIC,EACAD,IACFC,EAAS,MAAML,GAAS,cAAcI,CAAkB,GAE1D,GAAI,CACF,OAAOJ,GAAS,OAAOG,EAAS,CAC9B,QAAS,CAACF,EAAkB,EAC5B,OAAQ,aACR,WAAY,IACZ,KAAM,GACN,SAAU,EACV,QAAS,GACT,eAAgB,GAChB,GAAGI,CACL,CAAC,CACH,OAASC,EAAP,CACA,IAAIC,EACJ,OAAID,aAAiB,MACnBC,EAAUD,EAAM,QAEhBC,EAAUD,EAEZ,QAAQ,IAAI,mCAAmCC,GAAS,EACjDJ,CACT,CACF,CC7BA,OAAOK,OAAQ,mBACf,OAAOC,OAAU,YCDjB,OAAOC,OAAiB,QAEjB,IAAMC,GAAQD,GAAY,cAAc,EAClCE,GAAQF,GAAY,cAAc,EAG/CC,GAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EAGtCC,GAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,ECP/B,IAAMC,GAAQA,GAAY,OAAO,SAAS,EAGjDA,GAAM,IAAM,QAAQ,MAAM,KAAK,OAAO,EFDtC,eAAsBC,EACpBC,EACAC,EACAC,EACe,CACf,IAAMC,EAAkBH,EAClBI,EAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAObC,EAAa;AAAA,EAEfC,EAAOF,EAAaD,EAElBI,EAAmB;AAAA,EAGvBN,EAAe,SAAS,OAAO,GAC/BA,EAAe,SAAS,QAAQ,GAChCA,EAAe,SAAS,SAAS,EAEjCK,EAAOH,EACEF,EAAe,SAAS,WAAW,EAC5CK,EAAOD,EAAaF,EACXF,EAAe,SAAS,SAAS,IAC1CK,EAAOC,EAAmBJ,GAG5B,MAAMK,GAAG,MAAMC,GAAK,QAAQR,CAAc,EAAG,CAAE,UAAW,EAAK,CAAC,EAChE,MAAMO,GAAG,UAAUP,EAAgBK,CAAI,EACvCI,GAAM,GAAGR,MAAcD,GAAgB,CACzC,CGrCA,OAAS,cAAAU,MAAkB,KCD3B,OAAOC,MAAQ,KAER,SAASC,GAAsBC,EAAc,CAC9CF,EAAG,WAAWE,CAAI,IACpBF,EAAG,YAAYE,CAAI,EAAE,QAASC,GAAS,CACrC,IAAMC,EAAU,GAAGF,KAAQC,IACvBH,EAAG,UAAUI,CAAO,EAAE,YAAY,EACpCH,GAAsBG,CAAO,EAE7BJ,EAAG,WAAWI,CAAO,CAEzB,CAAC,EACDJ,EAAG,UAAUE,CAAI,EAErB,CCdA,IAAAG,GAAA,CACE,KAAQ,wBACR,QAAW,QACX,YAAe,iDACf,SAAY,CACV,MACA,eACA,OACA,YACF,EACA,SAAY,0EACZ,KAAQ,4CACR,WAAc,CACZ,KAAQ,MACR,IAAO,wCACT,EACA,QAAW,aACX,OAAU,qBACV,KAAQ,SACR,QAAW,CACT,IAAK,CACH,MAAS,oBACT,QAAW,iBACb,CACF,EACA,MAAS,oBACT,cAAiB,CACf,IAAK,CACH,MAAS,CACP,gBACF,CACF,CACF,EACA,QAAW,CACT,MAAS,2CACT,WAAY,mCACZ,MAAS,oBACT,WAAY,cACZ,IAAO,eACP,OAAU,qBACV,eAAgB,qBAChB,KAAQ,qBACR,KAAQ,SACR,aAAc,eACd,SAAY,sCACd,EACA,aAAgB,CACd,MAAS,SACT,MAAS,SACT,OAAU,UACV,IAAO,SACP,QAAW,WACX,MAAS,SACT,UAAW,SACX,KAAQ,UACR,KAAQ,UACR,SAAY,SACZ,0BAA2B,SAC3B,WAAc,SACd,MAAS,UACT,IAAO,UACP,uBAAwB,QAC1B,EACA,gBAAmB,CACjB,eAAgB,UAChB,aAAc,SACd,cAAe,SACf,cAAe,WACf,eAAgB,WAChB,OAAU,SACV,yBAA0B,SAC1B,SAAY,QACZ,KAAQ,SACR,IAAO,UACP,OAAU,QACZ,EACA,QAAW,CACT,KAAQ,UACV,EACA,cAAiB,CACf,OAAU,QACZ,CACF,EC9EA,eAAsBC,GAAaC,EAAqBC,EAAmB,CACzE,QAAQ,IAAI;AAAA,2CAAuC,EACnD,QAAQ,IAAI,+BAAqBA,SAAiBD,EAAO,gBAAgB,EAEzE,IAAIE,EAAO;AAAA,UACHF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oGAMmFG,GAAY;AAAA;AAAA;AAAA;AAAA,EAI9GH,EAAO;AAAA,EAEP,MAAMI,EAAmBF,EAAM,GAAGD,SAAiBD,EAAO,iBAAkB,oBAAoB,EAChG,QAAQ,IAAI;AAAA,CAAmC,CACjD,CCrBA,OAAS,cAAAK,OAAkB,KAE3B,eAAsBC,GACpBC,EACAC,EACAC,EAAqB,EACrB,CACA,GAAI,CAACJ,GAAWG,CAAI,EAAG,CACrB,IAAME,EACJD,IAAgB,EACZ;AAAA;AAAA,wFAGA;AAAA;AAAA,wFAIAE,EAAO,UAAUJ,EAAO;AAAA;AAAA;AAAA;AAAA,UAIxBG;AAAA;AAAA,GAGN,MAAME,EAAmBD,EAAMH,EAAM,oBAAoB,EAE7D,CAEA,eAAsBK,GAAgBN,EAAqBO,EAAmB,CAC5E,GAAI,CAACT,GAAW,GAAGS,SAAiBP,EAAO,mCAAmC,EAAG,CAC/E,IAAII,EAAO,UAAUJ,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ5B,MAAMK,EACJD,EACA,GAAGG,SAAiBP,EAAO,oCAC3B,oBACF,EAEJ,CC3CA,eAAsBQ,GAAgBC,EAAqBC,EAAc,CACvE,IAAIC,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0C5B,MAAMG,EAAmBD,EAAMD,EAAM,oBAAoB,CAC3D,CC9CA,OAAS,cAAAG,OAAkB,KAC3B,OAAOC,OAAQ,mBAEf,eAAsBC,GAAwBC,EAAqBC,EAAmB,CAC/EJ,GAAW,GAAGI,SAAiBD,EAAO,sBAAsB,GAC/D,MAAMF,GAAG,MAAM,GAAGG,SAAiBD,EAAO,uBAAwB,CAAE,UAAW,EAAK,CAAC,EAElFH,GAAW,GAAGI,SAAiBD,EAAO,oBAAoB,GAC7D,MAAMF,GAAG,MAAM,GAAGG,SAAiBD,EAAO,qBAAsB,CAAE,UAAW,EAAK,CAAC,CAEvF,CCRA,SAASE,GAAiBC,EAAqB,CAC7C,MACE,IACAA,EACG,MAAM,GAAG,EACT,IAAKC,GAAMA,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,EAAE,CAEd,CAEA,SAASC,GAAWC,EAA2B,CAC7C,OAAO,OAAOA,GAAU,SAAWA,EAAQA,EAAM,OACnD,CAEA,eAAsBC,GAAcC,EAAqBC,EAAmBC,EAAc,CACxF,QAAQ,IAAI;AAAA,uCAAmC,EAE/C,IAAMC,EAAU,OAAO,QAAQF,CAAM,EAClC,IAAI,CAAC,CAACG,EAAMN,CAAK,IAAM,CACtB,IAAMO,EAAYX,GAAiBU,CAAI,EACjCE,EAAUT,GAAWC,CAAmB,EAC9C,eAAQ,IAAI,qBAAWM,MAASE,GAAS,EAClC,CACL,eACA,aAAaD,qBAA6BC,MAC1C,kBAAkBF,2CAA8CC,MAClE,EAAE,KAAK;AAAA,CAAI,CACb,CAAC,EACA,KAAK;AAAA;AAAA,CAAM,EAERE,EAAO,UAAUP;AAAA,EAAyBG;AAAA;AAAA,EAEhD,MAAMK,EACJD,EACA,GAAGL,SAAYF,+BACf,oBACF,CACF,CCrCA,eAAsBS,GAAiBC,EAAqBC,EAAc,CAKxE,IAAMC,EAFUF,EAAO,OAAS,QAe5B,GAZA;AAAA;AAAA;AAAA;AAAA,0DAIoDA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0DAMPA,EAAO;AAAA,KAI3DG,EAAiB;AAAA,SACdH,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQdE;AAAA;AAAA,EAGA,MAAME,EAAmBD,EAAgBF,EAAM,oBAAoB,CACrE,CCjCA,eAAsBI,GAAgBC,EAAqBC,EAAcC,EAAqB,EAAG,CAM/F,IAAIC,EAFqBH,EAAO,OAAS,QAGrC,UAAUA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAObA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYX,UAAUA,EAAO;AAAA;AAAA;AAAA,UAGbA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6EAU4DA,EAAO,oBAAoBA,EAAO,kBAAkBE;AAAA;AAAA;AAAA,UAGvHF,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBf,MAAMI,EAAmBD,EAAcF,EAAM,oBAAoB,CACnE,CC5DA,SAASI,GAAYC,EAAqB,CACxC,OAAOA,EAAI,QAAQ,SAAWC,GAAW,IAAIA,EAAO,YAAY,GAAG,EAAE,QAAQ,KAAM,EAAE,CACvF,CAEA,eAAsBC,GAAcC,EAAqBC,EAAc,CAGrE,GAFA,QAAQ,IAAI;AAAA,uCAAmC,EAE3C,EAACD,EAAO,MAIZ,OAAW,CAACE,EAAUC,CAAM,IAAK,OAAO,QAAQH,EAAO,KAAK,EAAG,CAC7D,QAAQ,IAAI,qBAAWE,MAAa,KAAK,UAAUC,CAAM,GAAG,EAG5D,IAAMC,EAAe,CAAC,GAAGD,CAAM,EAAE,KAAK,CAACE,EAAGC,IAAMD,EAAE,cAAcC,CAAC,CAAC,EAE5DC,EAAOC,GAAiBR,EAAO,KAAME,EAAUE,CAAY,EACjE,MAAMK,EAAmBF,EAAM,GAAGN,KAAQL,GAAYM,CAAQ,SAAU,oBAAoB,EAEhG,CAEA,SAASM,GAAiBE,EAAqBR,EAAkBC,EAA0B,CACzF,IAAMQ,EAAaR,EAAO,IAAKS,GAAMA,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG,EAErF,MAAO,UAAUF,MAAgBd,GAAYM,CAAQ;AAAA;AAAA;AAAA,kBAGrCA;AAAA,UACRS;AAAA;AAAA;AAAA,EAGRR,EACC,IACES,GAAM,sBAAsBA,EAAE,YAAY,QAAQV;AAAA,UAC7CA,MAAaU,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC;AAAA,MAE1D,EACC,KAAK;AAAA;AAAA,CAAM;AAAA;AAAA,8BAEgBV;AAAA;AAAA;AAAA;AAAA,0CAIYA;AAAA;AAAA,EAExCC,EACC,IAAI,CAACS,EAAG,IAAM,eAAe,QAAQV,MAAaU,EAAE,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAE,MAAM,CAAC,IAAI,EAC3F,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA;AAAA,EAKZ,CCnDA,SAASC,GAAkBC,EAA6B,CACtD,OAAOA,IAAgB,QAAU,eAAiB,aACpD,CAOA,SAASC,EAAQD,EAA6B,CAC5C,OAAOA,IAAgB,QAAU,oBAAsB,EACzD,CAKA,SAASE,EAAWC,EAAsBC,EAA4B,CACpE,MAAO,EACT,CAEA,SAASC,EAAaF,EAAsBC,EAA4B,CACtE,MAAO,EACT,CAGA,SAASE,GAAeC,EAA2B,CACjD,OAAOA,EAAW,cAAgB,aACpC,CAGA,SAASC,GAAoBD,EAA2B,CACtD,OAAOA,EAAW,eAAiB,cACrC,CAGA,SAASE,GAAaT,EAAqBO,EAAmB,CAC5D,IAAMG,EAAMX,GAAkBC,CAAW,EACzC,OAAIO,EACK,CACL,WAAY,GAAGG,uBACf,UAAW,GAAGA,sBACd,UAAW,GAAGA,sBACd,WAAY,GAAGA,uBACf,WAAY,GAAGA,8BACf,eAAgB,GAAGA,kCACnB,cAAe,GAAGA,0BAClB,aAAc,GAAGA,wBACnB,EAEK,CACL,WAAY,GAAGA,gBACf,UAAW,GAAGA,eACd,UAAW,GAAGA,eACd,WAAY,GAAGA,gBACf,WAAY,GAAGA,uBACf,eAAgB,GAAGA,2BACnB,cAAe,GAAGA,mBAClB,aAAc,GAAGA,iBACnB,CACF,CAEA,eAAsBC,GAAkBC,EAAqBC,EAAc,CAGzE,GAFA,QAAQ,IAAI;AAAA,2CAAuC,EAE/C,EAACD,EAAO,UAEZ,OAAW,CAACE,EAAeC,CAAQ,IAAK,OAAO,QAAQH,EAAO,SAAS,EAAG,CAIxE,GAHA,QAAQ,IAAI,qBAAWE,MAAkB,KAAK,UAAUC,CAAQ,GAAG,EAG/D,OAAOA,GAAa,SAAU,CAChC,IAAMC,EAAOC,GAA4BL,EAAO,KAAME,EAAeC,EAAU,SAAS,EACxF,MAAMG,EAAmBF,EAAM,GAAGH,KAAQC,SAAsB,oBAAoB,EACpF,SAIF,GAAI,CAACC,EAAS,QAAU,OAAO,KAAKA,EAAS,MAAM,EAAE,SAAW,EAC9D,MAAM,IAAI,MACR,aAAaD,qDACf,EAIGC,EAAS,OACZA,EAAS,KAAO,CAAC,GAGnB,IAAMI,EAAWC,GAAsBR,EAAO,KAAME,EAAeC,CAAQ,EACrEM,EAAgBC,GACpBV,EACAE,EACAC,CACF,EAGMC,EAAOK,EAAgBF,EAAS,QAAQ,OAAQ;AAAA,EAAKE;AAAA,EAAkB,EAAIF,EAEjF,MAAMD,EAAmBF,EAAM,GAAGH,KAAQC,SAAsB,oBAAoB,EAExF,CAEA,SAASG,GACPjB,EACAc,EACAS,EACAC,EAAsB,UACd,CACR,IAAMC,EAAS,CAACC,EAAYH,CAAS,EAC/BI,EAAaF,EAAS,GAAGG,GAAYL,CAAS,IAAM,GACpDM,EAAaL,IAAS,WAEtBjB,EAAW,GACXuB,EAAcxB,GAAeC,CAAQ,EACrCwB,EAAevB,GAAoBD,CAAQ,EAC3CyB,EAAMvB,GAAaT,EAAaO,CAAQ,EAExC0B,EAAiBJ,EA4CnB,GA3CA;AAAA,qBACeE,OAAkBD;AAAA;AAAA;AAAA,UAG7BE,EAAI,uBAAuBD;AAAA;AAAA;AAAA,4BAGTA,OAAkBD;AAAA;AAAA;AAAA,UAGpCE,EAAI,uBAAuBD;AAAA;AAAA;AAAA,gCAGLA,OAAkBD;AAAA;AAAA;AAAA,UAGxCE,EAAI,2BAA2BD;AAAA;AAAA;AAAA,iCAGRA,WAAsBD;AAAA;AAAA;AAAA,UAG7CE,EAAI,0BAA0B/B,EAChCD,CACF,IAAI+B;AAAA;AAAA;AAAA,qBAGWA,OAAkBD,QAC/BP,IAAc,UAAYA,IAAc,SAAW,SAAWA;AAAA;AAAA;AAAA,0BAI5CS,EAAI,sBAAsBD;AAAA;AAAA,sBAE9BG,EACZlC,EACAuB,EACA,YACAE,EAAS,CAAC,CAAE,KAAMF,EAAW,OAAQI,CAAW,CAAC,EAAI,CAAC,CACxD;AAAA;AAAA;AAAA,EAMAQ,EAAgB5B,EAClB,wCACA,wCAQE6B,EAAaX,GAAUF,IAAc,UAAYA,IAAc,SAUrE,MAAO,UAAUvB,MAAgBc,MATN,CAACsB,EACe;AAAA,+BAAoC,KAE7Eb,IAAc,UAAYA,IAAc,SACpC;AAAA,2CACAA,IAAc,iBACd;AAAA,6BACA;AAAA,MAGFY;AAAA;AAAA,UAEInC;AAAA,UACAA;AAAA,EACRoC,EAAa,WAAWpC,MAAgB2B,OAAgBJ,MAAgB;AAAA;AAAA,uCAEnCT;AAAA,6BACVU,IAAS;AAAA;AAAA,EAEpCS;AAAA,8BAC4B5B,EACxBL,EACAO,CACF,IAAIwB,WAAsBD,aAC1BP,IAAc,UAAYA,IAAc,SAAW,SAAWA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMxDS,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EACxDF,EACAO,CACF,IAAIwB;AAAA;AAAA;AAAA,+BAIAR,IAAc,UAAYA,IAAc,SAAW,SAAWA;AAAA;AAAA,gCAI1DA,IAAc,UAAYA,IAAc,SACpC,+BACAA,IAAc,iBACd,mBACAE,EACA,GAAGzB,MAAgB2B,mBACnB;AAAA;AAAA;AAAA,EAKd,CAEA,SAASC,GAAYS,EAAqB,CACxC,OAAOA,EAAI,QAAQ,SAAWC,GAAW,IAAIA,EAAO,YAAY,GAAG,EAAE,QAAQ,KAAM,EAAE,CACvF,CAEA,SAASlB,GAAsBpB,EAAqBc,EAAuBC,EAAuB,CAChG,IAAMwB,EAASxB,EAAS,OAClByB,EAAOzB,EAAS,MAAQ,CAAC,EACzB0B,EAAW1B,EAAS,UAAY,GAChC2B,EAAS3B,EAAS,QAAU,GAC5BS,EAAsBiB,EAAW,WAAa,UAE9ClC,EAAWmC,EACXZ,EAAcxB,GAAeC,CAAQ,EACrCwB,EAAevB,GAAoBD,CAAQ,EAC3CyB,EAAMvB,GAAaT,EAAaO,CAAQ,EAGxCoC,EAAY,OAAO,KAAKJ,CAAM,EAAE,MAAOK,GAASJ,EAAK,SAASI,CAAI,CAAC,EAGnEC,EAAc,OAAO,QAAQN,CAAM,EAAE,OAAO,CAAC,CAACK,CAAI,IAAM,CAACJ,EAAK,SAASI,CAAI,CAAC,EAC5EE,EAAkBD,EAAY,IAAI,CAAC,CAACD,CAAI,IAAMA,CAAI,EAGlDG,EAAgBD,EAAgB,SAAW,EAG3CE,EAAYH,EACf,OAAO,CAAC,CAACI,EAAGzB,CAAI,IAAM,CAACE,EAAYF,CAAc,GAAKA,IAAS,UAAYA,IAAS,QAAQ,EAC5F,IAAI,CAAC,CAACyB,EAAGzB,CAAI,KAAO,CACnB,KAAMA,EACN,OAAQ,GAAGI,GAAYJ,CAAc,GACvC,EAAE,EACD,OAAO,CAAC0B,EAAMC,EAAOC,IAASA,EAAK,UAAWC,GAAMA,EAAE,OAASH,EAAK,IAAI,IAAMC,CAAK,EAGhFG,EAAe,OAAO,QAAQf,CAAM,EACvC,OAAO,CAAC,CAACU,EAAGzB,CAAI,IAAM,CAACE,EAAYF,CAAc,GAAKA,IAAS,UAAYA,IAAS,QAAQ,EAC5F,IAAI,CAAC,CAACyB,EAAGzB,CAAI,KAAO,CACnB,KAAMA,EACN,OAAQ,GAAGI,GAAYJ,CAAc,GACvC,EAAE,EACD,OAAO,CAAC0B,EAAMC,EAAOC,IAASA,EAAK,UAAWC,GAAMA,EAAE,OAASH,EAAK,IAAI,IAAMC,CAAK,EAGhFI,EAAiBC,GACrBxD,EACAc,EACAyB,EACAC,EACA,CAACG,GAAa,CAACI,EACfC,EACAxB,EACAjB,EACAuB,EACAC,EACAC,CACF,EAGMG,EAAgB5B,EAClB,wCACAQ,EAAS,SACT,uDACA,wCACE0C,EAAoB1C,EAAS,SAAW;AAAA,2CAAgD,GAGxF2C,EAAgB,OAAO,OAAOnB,CAAM,EAOpCoB,EALqBb,EAAgB,OAAQF,GAAS,CAC1D,IAAMS,EAAId,EAAOK,CAAI,EACrB,OAAOlB,EAAY2B,CAAC,GAAKA,IAAM,UAAYA,IAAM,QACnD,CAAC,EAC6C,OAAS,GAAKb,EAAK,OAAS,EAC/B;AAAA,+BAAoC,GAEzEoB,EAAiBF,EAAc,KAAML,GAAMA,IAAM,UAAYA,IAAM,QAAQ,EAC3EQ,EAAoBH,EAAc,KAAML,GAAMA,IAAM,gBAAgB,EAEpES,EAAsBhB,EAAgB,KAAMiB,GAAM,CACtD,IAAMV,EAAId,EAAOwB,CAAC,EAClB,OAAOV,IAAM,UAAYA,IAAM,QACjC,CAAC,EAIKW,EAAoBF,EACtB;AAAA,2CACAF,GAAkBC,EAClB;AAAA,6BACA,GAEEI,EAAmBH,EACrB;AAAA,mDACAF,GAAkBC,EAClB;AAAA,6BACA,GAGJ,GAAIlB,GAAaI,EACf,MAAO,UAAU/C,MAAgBc,MAAkB6C,IAAgBK;AAAA,MACjE7B,IAAgBsB;AAAA;AAAA,UAEZzD;AAAA,UACAA;AAAA,EAERsD,EAAa,OAAS,EAClBA,EAAa,IAAKY,GAAM,WAAWlE,MAAgBkE,EAAE,YAAYA,EAAE,QAAQ,EAAE,KAAK;AAAA,CAAI,EACtF;AAAA;AAAA,uCAGiCpD;AAAA,6BACV2B;AAAA;AAAA,EAE3Bc;AAAA,GAKA,IAAMY,EAAerB,EAClB,IACEF,GACC,WAAWA,MACTL,EAAOK,CAAI,IAAM,UAAYL,EAAOK,CAAI,IAAM,SAC1C,SACAL,EAAOK,CAAI,IAAM,iBACjB,iBACAL,EAAOK,CAAI,IAErB,EACC,KAAK;AAAA,CAAI,EAGNwB,EAAoBtB,EACvB,IACEF,GACC,GAAGA,MACDL,EAAOK,CAAI,IAAM,UAAYL,EAAOK,CAAI,IAAM,SAC1C,SACAL,EAAOK,CAAI,IAAM,iBACjB,iBACAL,EAAOK,CAAI,GAErB,EACC,KAAK,IAAI,EAGNyB,EAAyBvB,EAAgB,IAAKF,GAAS,eAAeA,IAAO,EAAE,KAAK;AAAA,CAAI,EAGxF0B,EAAUxB,EACb,IACEF,GAAS,kBAAkBA,YAAe2B,EAAazD,CAAa,OACnEyB,EAAOK,CAAI,IAAM,UAAYL,EAAOK,CAAI,IAAM,SAC1C,SACAL,EAAOK,CAAI,IAAM,iBACjB,iBACAL,EAAOK,CAAI;AAAA,eAERA;AAAA,MAEX,EACC,KAAK;AAAA;AAAA,CAAM,EAGR4B,GAAU1B,EACb,IACEF,GAAS,yBAAyBA,gBAAmB2B,EACpDzD,CACF,MAAM8B,MACJL,EAAOK,CAAI,IAAM,UAAYL,EAAOK,CAAI,IAAM,SAC1C,SACAL,EAAOK,CAAI,IAAM,iBACjB,iBACAL,EAAOK,CAAI;AAAA,eAERA,OAAUA;AAAA,MAErB,EACC,KAAK;AAAA;AAAA,CAAM,EAEd,MAAO,UAAU5C,MAAgBc,MAAkB6C,IAAgBM;AAAA,MAC/D9B,IAAgBsB;AAAA;AAAA,UAEZzD;AAAA,UACAA;AAAA,EAERsD,EAAa,OAAS,EAClBA,EAAa,IAAKY,GAAM,WAAWlE,MAAgBkE,EAAE,YAAYA,EAAE,QAAQ,EAAE,KAAK;AAAA,CAAI,EACtF;AAAA;AAAA,uCAGiCpD;AAAA,6BACV2B;AAAA;AAAA,oBAET8B,EAAazD,CAAa;AAAA,EAC5CqD;AAAA;AAAA;AAAA,qBAGmBC,OAAuBG,EAAazD,CAAa;AAAA,UAC5DyD,EAAazD,CAAa;AAAA,EAClCuD;AAAA;AAAA;AAAA;AAAA,EAIAC;AAAA;AAAA,EAEAE;AAAA;AAAA,EAEAjB;AAAA,EAEF,CAGA,SAAS7B,EAAYF,EAAuB,CAC1C,MAAO,CACL,UACA,OACA,KACA,MACA,MACA,MACA,OACA,OACA,SACA,SACA,kBACA,eACA,aACA,cACA,qBACA,cACA,cACA,eACA,eACA,gBACF,EAAE,SAASA,CAAI,CACjB,CAGA,SAASU,EACPlC,EACAyE,EACAC,EACA1B,EACQ,CACR,IAAMvB,EAAS,CAACC,EAAY+C,CAAS,EAC/BE,EAAWlD,EAASuB,EAAU,KAAMkB,GAAMA,EAAE,OAASO,CAAS,EAAI,KACxE,OAAIA,IAAc,UAAYA,IAAc,SACnC,gCAAgCC,KAErCD,IAAc,iBACT,oCAAoCC,KAEzCjD,GAAUkD,EACL,GAAG3E,MAAgB2E,EAAS,uBAAuBD,KAErD,kBAAkBE,GAAWH,CAAS,UAAUC,IACzD,CAIA,SAASG,GACP7E,EACAgC,EACAD,EACA+C,EACAL,EACAM,EACA/B,EACQ,CACR,IAAMgC,EAAS,GAAGF,QACZJ,EAAS,GAAGI,QAClB,MAAO,CACL,OAAOE,OAAYhD,EAAI,sBAAsBD,mBAA8B+C,OAC3E,WAAWJ,qBAA0BM,MACrC,OAAOF,OAAe5C,EAAelC,EAAayE,EAAWC,EAAQ1B,CAAS,IAChF,EAAE,KAAK;AAAA,SAAY,CACrB,CAEA,SAASQ,GACPxD,EACAc,EACAyB,EACAC,EACAyC,EAAyB,GACzBjC,EAAqD,CAAC,EACtDxB,EAAsB,UACtBjB,EAAoB,GACpBuB,EAAsB,cACtBC,EAAuB,eACvBC,EAAuCvB,GAAa,QAAS,EAAK,EAC1D,CAER,IAAMoC,EAAc,OAAO,QAAQN,CAAM,EACtC,OAAO,CAAC,CAACK,CAAI,IAAM,CAACJ,EAAK,SAASI,CAAI,CAAC,EACvC,OAAO,CAACsC,EAAK,CAACtC,EAAMpB,CAAI,KAAO,CAAE,GAAG0D,EAAK,CAACtC,CAAI,EAAGpB,CAAK,GAAI,CAAC,CAAC,EAEzD2D,EAAa,OAAO,KAAKtC,CAAW,EAGpCF,EAAY,OAAO,KAAKJ,CAAM,EAAE,MAAOK,GAASJ,EAAK,SAASI,CAAI,CAAC,EAEnEG,EAAgBoC,EAAW,SAAW,EAEtCtD,EAAaL,IAAS,WAGtB4D,EAAY5C,EAAK,OAAS,EAAIA,EAAK,IAAK6C,GAAM,GAAGA,MAAM9C,EAAO8C,CAAC,GAAG,EAAE,KAAK,IAAI,EAAI,GAGjFC,EACJ9C,EAAK,OAAS,EACV;AAAA;AAAA,UAEEA,EAAK,IAAK6C,GAAM,iCAAiCA,MAAM,EAAE,KAAK;AAAA,SAAY,IAC5E;AAAA,0CAMAE,EAAWhF,EAAW,GAAK,wBAC3BiF,EAASjF,EAAW,GAAK,QAGzBkF,EAAgB5D,EAoBlB,GAnBA,sBAAsBE,OAAkBD,IACtCsD,EAAY,KAAO,KAClBA;AAAA,UACCE;AAAA,UACAtD,EAAI,uBAAuBD;AAAA;AAAA;AAAA,4BAGTA,OAAkBD,IAAcsD,EAAY,KAAO,KAAKA;AAAA,UAC1EE;AAAA,UACAtD,EAAI,uBAAuBD;AAAA;AAAA;AAAA,gCAGLA,OAAkBD,IAC1CsD,EAAY,KAAO,KAClBA;AAAA,UACCE;AAAA,UACAtD,EAAI,2BAA2BD;AAAA;AAAA,IAOjC2D,EAAoB,UAAUP,EAAW,IAAKpB,GAAM,KAAKA,IAAI,EAAE,KAAK,IAAI,KACxE4B,EAAkB9D,EASpB,GARA,kCAAkCE,WAAsBD,IACtDsD,EAAY,KAAO,KAClBA,IAAY7E,EAAW,GAAK;AAAA,UAC3B+E;AAAA,UACAtD,EAAI,0BAA0B/B,EAChCD,CACF,IAAI+B,iBAA4B2D,IAAoBnF,EAAW,GAAK;AAAA,OAMlEqF,EACJ,CAAC7C,GAAiB,CAAClB,EACfsD,EACG,IAAKvC,GAAS,CACb,IAAM6B,EAAYlC,EAAOK,CAAI,EACvBnB,EAAS,CAACC,EAAY+C,CAAmB,EACzCE,EAAWlD,EAASuB,EAAU,KAAMkB,GAAMA,EAAE,OAASO,CAAS,EAAI,KAExE,MAAO,sBAAsB7B,KAAQb,OAAkBD,IACrDsD,EAAY,KAAO,KAClBA,OACDX,IAAc,UAAYA,IAAc,SACpC,SACAA,IAAc,iBACd,iBACAA;AAAA,UAERa;AAAA,cACI1C,WAAcZ,EAAI,sBAAsBD,mBAA8Ba;AAAA,kBAClEA,yBAA4BA;AAAA,cAChCA,OAAUV,EAAelC,EAAayE,EAAqB,GAAG7B,QAAYI,CAAS;AAAA,UACvFJ;AAAA;AAAA;AAAA,8BAGoBA,KAAQvC,EACxBL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,MAAcxC,MAC5E6B,IAAc,UAAYA,IAAc,SACpC,SACAA,IAAc,iBACd,iBACAA,IACHc;AAAA,UACLD;AAAA,sBAEAb,IAAc,UAAYA,IAAc,SACpC,wBAAwB7B,MACxB6B,IAAc,iBACd,aAAa7B,KACbnB,EACA,GAAGzB,MAAgB2E,GAAU,kBAAkB/B,KAC/C,aAAaA;AAAA,UAEjBZ,EAAI,sBAAsB/B,EAAQD,CAAW,IAAIE,EAC7CF,EACAO,CACF,IAAIwB,mBAA8Ba,YAAe4C;AAAA,MAEnD,CAAC,EACA,KAAK;AAAA;AAAA,CAAM,EACd,GAGAK,EAAgB,UAAUV,EAAW,IAAKpB,GAAM,KAAKA,IAAI,EAAE,KAAK,IAAI,KAGpE+B,EAAkBnD,EACpB,+BAA+BtC,EAC7BL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,IAAYG;AAAA,UACxED;AAAA;AAAA;AAAA,UAGAtD,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EACpDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAElEzC,EACClB,EAsCC,+BAA+BxB,EAC7BL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,aAC9D,OAAO,OAAOvC,CAAW,EAAE,CAAC,IAAM,UAAY,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,SAC5E,SACA,OAAO,OAAOA,CAAW,EAAE,CAAC,IAC/B0C;AAAA,UACDD;AAAA,qCAC2BH,EAAW,CAAC;AAAA;AAAA,UAEvCnD,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EAClDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAnDlE,sBAAsBzD,OAAkBD,IACtCsD,EAAY,KAAO,KAClBA,OACD,OAAO,OAAOvC,CAAW,EAAE,CAAC,IAAM,UAAY,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,SAC5E,SACA,OAAO,OAAOA,CAAW,EAAE,CAAC;AAAA,UAEhCyC;AAAA,cACIH,EAAW,CAAC,WAAWnD,EAAI,sBAAsBD,mBACrDoD,EAAW,CAAC;AAAA,kBAEJA,EAAW,CAAC,yBAAyBA,EAAW,CAAC;AAAA,sBAC7CjD,EACZlC,EACA,OAAO,OAAO6C,CAAW,EAAE,CAAC,EAC5B,GAAGsC,EAAW,CAAC,QACfnC,CACF;AAAA;AAAA;AAAA;AAAA,8BAIsB3C,EACxBL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,aAC1D,OAAO,OAAOvC,CAAW,EAAE,CAAC,IAAM,UAAY,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,SAC5E,SACA,OAAO,OAAOA,CAAW,EAAE,CAAC,IAC/B0C;AAAA,UACDD;AAAA,qCAC2BH,EAAW,CAAC;AAAA;AAAA,UAEvCnD,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EAClDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAkBnE3D,EA+BD,+BAA+BxB,EAC7BL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,MAAcD,EAC3E,IACEpB,GAAM,GAAGA,MAAMxB,EAAOwB,CAAC,IAAM,UAAYxB,EAAOwB,CAAC,IAAM,SAAW,SAAWxB,EAAOwB,CAAC,GACxF,EACC,KAAK,IAAI,IAAIwB;AAAA,UACZD;AAAA,4BACkBO;AAAA,mCACOV,EAAW,KAAK,IAAI;AAAA,UAC7CnD,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EACpDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OA5ClE,sBAAsBzD,OAAkBD,IACtCsD,EAAY,KAAO,KAClBA,QAAgB,OAAO,OAAOvC,CAAW,EACzC,IAAKQ,GAAOA,IAAM,UAAYA,IAAM,SAAW,SAAWA,CAAE,EAC5D,KAAK,IAAI;AAAA,UACRiC;AAAA,UACAH,EACC,IAAI,CAACvC,EAAMmD,IACVlB,GAAoB7E,EAAagC,EAAKD,EAAca,EAAML,EAAOK,CAAI,EAAGmD,EAAG/C,CAAS,CACtF,EACC,KAAK;AAAA,SAAY;AAAA,WACjBmC,EAAW,KAAK,IAAI;AAAA;AAAA;AAAA,8BAGD9E,EACxBL,EACAO,CACF,IAAIwB,WAAsBD,IAAcsD,EAAY,KAAO,KAAKA,MAAcD,EACzE,IACEpB,GAAM,GAAGA,MAAMxB,EAAOwB,CAAC,IAAM,UAAYxB,EAAOwB,CAAC,IAAM,SAAW,SAAWxB,EAAOwB,CAAC,GACxF,EACC,KAAK,IAAI,IAAIwB;AAAA,UACZD;AAAA,4BACkBO;AAAA,mCACOV,EAAW,KAAK,IAAI;AAAA,UAC7CnD,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EACpDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAoBhEQ,EAAkBf,EACnBpD,EA2BC,sCAAsCxB,EACpCL,EACAO,CACF,IAAIwB,WAAsBD,IACxBsD,EAAY,KAAO,KAClBA,MAActE,MAAkByD,EAAazD,CAAa,IAAIyE;AAAA,UAC/DD;AAAA,4BACkBO;AAAA,0CACc/E;AAAA,UAChCkB,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EAClDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAtClE,6BAA6BzD,OAAkBD,IAC7CsD,EAAY,KAAO,KAClBA,OAAeb,EAAazD,CAAa;AAAA,UAC1CwE;AAAA,UACAH,EACC,IAAI,CAACvC,EAAMmD,IACVlB,GAAoB7E,EAAagC,EAAKD,EAAca,EAAML,EAAOK,CAAI,EAAGmD,EAAG/C,CAAS,CACtF,EACC,KAAK;AAAA,SAAY;AAAA,UAClBuB,EAAazD,CAAa,OAAOqE,EAAW,KAAK,IAAI;AAAA;AAAA;AAAA,qCAG1B9E,EAC/BL,EACAO,CACF,IAAIwB,WAAsBD,IACpBsD,EAAY,KAAO,KAClBA,MAActE,MAAkByD,EAAazD,CAAa,IAAIyE;AAAA,UAC/DD;AAAA,4BACkBO;AAAA,0CACc/E;AAAA,UAChCkB,EAAI,uBAAuB/B,EAAQD,CAAW,IAAIE,EAClDF,EACAO,CACF,IAAIwB,mDAA8DyD;AAAA,OAgBpE,GAGES,EAAwBlD,EAC1B,gCACE,OAAO,OAAOF,CAAW,EAAE,CAAC,IAAM,UAAY,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,SAC5E,SACA,OAAO,OAAOA,CAAW,EAAE,CAAC;AAAA;AAAA,gCAI9B,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,UAAY,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,SAC5E,+BACA,OAAO,OAAOA,CAAW,EAAE,CAAC,IAAM,kBAEjCnB,EAAY,OAAO,OAAOmB,CAAW,EAAE,CAAC,CAAW,EADpD,mBAEA,GAAG7C,MACDgD,EAAU,KAAMkB,GAAMA,EAAE,OAAS,OAAO,OAAOrB,CAAW,EAAE,CAAC,CAAC,GAAG;AAAA;AAAA,OAM3EoC,EACCpD,EAqDC,yBAAyBsD,EACtB,IACEpB,GACC,GAAGA,MAAMxB,EAAOwB,CAAC,IAAM,UAAYxB,EAAOwB,CAAC,IAAM,SAAW,SAAWxB,EAAOwB,CAAC,GACnF,EACC,KAAK,IAAI;AAAA;AAAA,UAEVoB,EACC,IAAKpB,GAAM,CACV,IAAMU,EAAYlC,EAAOwB,CAAC,EACpBtC,EAAS,CAACC,EAAY+C,CAAmB,EACzCE,EAAWlD,EAASuB,EAAU,KAAMkB,GAAMA,EAAE,OAASO,CAAS,EAAI,KACxE,MAAO,yBACLA,IAAc,UAAYA,IAAc,SACpC,wBAAwBV,MACxBU,IAAc,iBACd,aAAaV,KACbtC,EACA,GAAGzB,MAAgB2E,GAAU,kBAAkBZ,KAC/C,aAAaA,QAErB,CAAC,EACA,KAAK;AAAA,SAAY;AAAA;AAAA;AAAA;AAAA,+BAIGjD,MAAkByD,EAAazD,CAAa;AAAA,iBAC1DqE,EAAW,IAAKpB,GAAM,GAAGjD,KAAiBiD,GAAG,EAAE,KAAK,IAAI;AAAA,OA/EjE,yBAAyBoB,EACtB,IACEpB,GACC,GAAGA,MAAMxB,EAAOwB,CAAC,IAAM,UAAYxB,EAAOwB,CAAC,IAAM,SAAW,SAAWxB,EAAOwB,CAAC,GACnF,EACC,KAAK,IAAI;AAAA;AAAA,UAEVoB,EACC,IAAKpB,GAAM,CACV,IAAMU,EAAYlC,EAAOwB,CAAC,EACpBtC,EAAS,CAACC,EAAY+C,CAAmB,EACzCE,EAAWlD,EAASuB,EAAU,KAAMkB,GAAMA,EAAE,OAASO,CAAS,EAAI,KACxE,MAAO,yBACLA,IAAc,UAAYA,IAAc,SACpC,wBAAwBV,MACxBU,IAAc,iBACd,aAAaV,KACbtC,EACA,GAAGzB,MAAgB2E,GAAU,kBAAkBZ,KAC/C,aAAaA,QAErB,CAAC,EACA,KAAK;AAAA,SAAY;AAAA;AAAA;AAAA;AAAA,+BAIGjD,MAAkByD,EAAazD,CAAa;AAAA,iBAC1DqE,EAAW,IAAKpB,GAAM,GAAGjD,KAAiBiD,GAAG,EAAE,KAAK,IAAI;AAAA;AAAA;AAAA,2CAG9BQ,EAAazD,CAAa;AAAA;AAAA,UAE3DqE,EACC,IAAKpB,GAAM,CACV,IAAMU,EAAYlC,EAAOwB,CAAC,EACpBtC,EAAS,CAACC,EAAY+C,CAAmB,EACzCE,EAAWlD,EAASuB,EAAU,KAAMkB,GAAMA,EAAE,OAASO,CAAS,EAAI,KACxE,MAAO,OAAOV,OACZU,IAAc,UAAYA,IAAc,SACpC,+CACAA,IAAc,iBACd,6CACAhD,EACA,GAAGzB,MAAgB2E,GAAU,gCAC7B,kBAAkBC,GAAWH,CAAS,qBAE9C,CAAC,EACA,KAAK;AAAA,SAAY;AAAA,UAClBF,EAAazD,CAAa;AAAA,cACtBqE,EAAW,IAAKpB,GAAM,GAAGA,IAAI,EAAE,KAAK;AAAA,aAAgB;AAAA;AAAA,OAgC5D,GAYJ,MATiB,CACf0B,EACAE,EACAC,EACAE,EACAE,EACAC,CACF,EAAE,OAAQC,GAAYA,EAAQ,KAAK,EAAE,OAAS,CAAC,EAE/B,KAAK;AAAA;AAAA,CAAM,CAC7B,CAEA,SAAS3B,EAAalC,EAAqB,CACzC,OAAOA,EACJ,MAAM,GAAG,EACT,IAAI,CAAC8D,EAAMC,IACN,QAAQ,KAAKD,CAAI,EACZA,EAEFA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CACjE,EACA,KAAK,EAAE,CACZ,CAEA,SAASvB,GAAWpD,EAAsB,CACxC,GAAIA,EAAK,WAAW,SAAS,EAAG,CAC9B,IAAM6E,EAAY7E,EAAK,MAAM,EAAG,EAAE,EAClC,OAAI6E,IAAc,aACT,aAELA,IAAc,SACT,aAEF,OAAOzB,GAAWyB,CAAS,IAGpC,OAAQ7E,EAAM,CACZ,IAAK,KACH,MAAO,KACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,MACH,MAAO,MACT,IAAK,OACH,MAAO,OACT,IAAK,OACH,MAAO,OACT,IAAK,OACH,MAAO,OACT,IAAK,UACH,MAAO,UACT,IAAK,SACH,MAAO,SACT,QACE,OAAOA,CACX,CACF,CAQA,SAASF,GACPV,EACAE,EACAwF,EACQ,CACR,IAAMC,EAAkB,CAAC,EACnBvG,EAAcY,EAAO,KACrBF,EAAMX,GAAkBC,CAAW,EACnCwG,EAAOvG,EAAQD,CAAW,EAE1BuC,EAAS+D,EAAK,OACd9D,EAAO8D,EAAK,MAAQ,CAAC,EACrBzD,EAAc,OAAO,QAAQN,CAAM,EAAE,OAAO,CAAC,CAACwB,CAAC,IAAM,CAACvB,EAAK,SAASuB,CAAC,CAAC,EACtEoB,EAAatC,EAAY,IAAI,CAAC,CAACkB,CAAC,IAAMA,CAAC,EACvCqB,EAAY5C,EAAK,OAAS,EAAIA,EAAK,IAAK6C,GAAM,GAAGA,MAAM9C,EAAO8C,CAAC,GAAG,EAAE,KAAK,IAAI,EAAI,GAGvF,GAAIiB,EAAK,UAAYnB,EAAW,SAAW,EAAG,CAC5C,GAAM,CAACsB,EAAQC,CAAK,EAAI7D,EAAY,CAAC,EACrC0D,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,sEAKuDG;AAAA;AAAA;AAAA;AAAA;AAAA,sEAKAA;AAAA;AAAA;AAAA;AAAA,MAIhE,EAKJ,GAAIlE,EAAK,OAAS,GAAK,CAAC8D,EAAK,UAAY,CAACA,EAAK,OAAQ,CACrD,IAAMK,EAAenE,EAAK,IAAK6C,GAAM,GAAGA,MAAM9C,EAAO8C,CAAC,GAAG,EAAE,KAAK,IAAI,EAC9DuB,EAAczB,EAAW,IAAKpB,GAAM,GAAGA,MAAMxB,EAAOwB,CAAC,GAAG,EAAE,KAAK,IAAI,EACnE8C,EAAY,CAACF,EAAcC,CAAW,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EACjEE,EAAUtE,EAAK,KAAK,IAAI,EACxBuE,EAAU,CAAC,GAAGvE,EAAM,GAAG2C,CAAU,EAAE,KAAK,IAAI,EAElDoB,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMLM;AAAA;AAAA;AAAA,uCAG6BC;AAAA,4BACXC;AAAA,MACtB,EAIJ,GAAIT,EAAK,SAAU,CACjB,IAAMhB,EACJ9C,EAAK,OAAS,EACV;AAAA;AAAA,UAA2FA,EACxF,IAAK6C,GAAM,2CAA2CA,MAAM,EAC5D,KAAK;AAAA,SAAY,IACpB;AAAA,0CAGN,GAAIF,EAAW,OAAS,EAAG,CACzB,IAAM6B,EAAS7B,EAAW,IAAKpB,GAAM,GAAGA,MAAMxB,EAAOwB,CAAC,GAAG,EAAE,KAAK,IAAI,EACpEwC,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAQPnB,EAAYA,EAAY,KAAO,KAAK4B;AAAA;AAAA;AAAA,UAGpC1B;AAAA,mCACyBH,EAAW,IAAKpB,GAAM,KAAKA,IAAI,EAAE,KAAK,IAAI;AAAA,mCAC1CoB,EAAW,KAAK,IAAI;AAAA,UAC7CzE,6CAA+C8F;AAAA,MACnD,EAIF,OAAW,CAACS,EAAOC,CAAK,IAAKrE,EAAa,CACxC,IAAMsE,EACJD,IAAU,UAAYA,IAAU,SAC5B,8CAA8CD,MAC9C,uBAAuBA,KAC7BV,EAAM,KAAK;AAAA,8BACaU;AAAA;AAAA;AAAA;AAAA,UAIpB7B,EAAYA,EAAY,KAAO,KAAK6B,MACtCC,IAAU,UAAYA,IAAU,SAAW,SAAWA;AAAA;AAAA;AAAA,UAIpD5B;AAAA,sBACY6B;AAAA,UACZzG,4CAA8C8F,uCAA0CS;AAAA,MAC5F,GAKJ,GAAIX,EAAK,aAAc,CACrB,IAAMc,EAAUxG,EAAO,SAAW,CAAC,EAC7ByG,EAASzG,EAAO,QAAU,CAAC,EAC3B0G,EAAa,CAAC,CAAChB,EAAK,SAEpBiB,EAAU,CAACD,GAAc9E,EAAK,OAAS,EACvCgF,EAAUD,EAAU/E,EAAK,CAAC,EAAI,KAEpC,OAAW,CAACiF,EAAQC,CAAM,IAAK,OAAO,QAAQN,CAAO,EAAG,CACtD,GAAI,EAAEM,EAAO,SAAW,CAAC,GAAG,SAAS5G,CAAa,EAAG,SAErD,IAAM6G,EAAYpD,EAAakD,CAAM,EAC/BG,EAAY,sCAAsC5H,MAAgByH,MAAWE,KAC7EE,EAASJ,EAEf,GAAIH,GAAcnC,EAAW,SAAW,EAAG,CACzC,GAAM,CAAC,CAAEuB,CAAK,EAAI7D,EAAY,CAAC,EAC/B0D,EAAM,KAAK;AAAA,sDACeoB;AAAA,2CACSF;AAAA;AAAA,uBAEpBG;AAAA,kBACLlB;AAAA;AAAA;AAAA;AAAA,UAIR1G,MAAgB6H,UAAe/G;AAAA;AAAA;AAAA,mCAGN2G;AAAA,uBACZG;AAAA;AAAA,kBAELlB;AAAA;AAAA;AAAA,UAGR1G,MAAgB6H,UAAe/G;AAAA;AAAA,MAEnC,UACWyG,GAAWC,EACpB,GAAIrC,EAAW,SAAW,EAAG,CAC3B,GAAM,CAAC,CAAE2C,CAAM,EAAIjF,EAAY,CAAC,EAC1BkF,EACJD,IAAW,UAAYA,IAAW,SAC9B,8CAA8CN,OAC9C,uBAAuBA,MACvBxE,EAAY,OAAO,QAAQpC,EAAO,OAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAACmD,CAAC,KAAO,CACjE,KAAMQ,EAAaR,CAAC,EACpB,OAAQA,CACV,EAAE,EACIiE,EAAW9F,EAAelC,EAAa8H,EAAQ,MAAO9E,CAAS,EACrEuD,EAAM,KAAK;AAAA,sDACaoB;AAAA,2CACSF;AAAA;AAAA,yBAElBG;AAAA,UACfJ;AAAA;AAAA;AAAA,2BAGiBA;AAAA;AAAA,4CAEiBxH,MAAgB6H,UAAe/G,aAAyB0G;AAAA,oBAChFO;AAAA,uBACGP;AAAA,UACbxH,MAAgB6H,UAAe/G,kBAA8B0G;AAAA;AAAA;AAAA,mCAGpCC;AAAA,yBACVG;AAAA;AAAA,UAEfJ;AAAA;AAAA;AAAA;AAAA,+BAIqBA;AAAA,oBACXxH,MAAgB6H,aAAkB/G,kBAA8B0G;AAAA;AAAA,sBAE9DQ;AAAA,oBACFR;AAAA,MACd,OAEIjB,EAAM,KAAK;AAAA,sDACaoB;AAAA,2CACSF;AAAA;AAAA,yBAElBG;AAAA,UACfJ;AAAA;AAAA;AAAA,2BAGiBA;AAAA;AAAA,4CAEiBxH,MAAgB6H,UAAe/G,aAAyB0G;AAAA,oDAChDA;AAAA,uBAC7BA;AAAA;AAAA,UAEbxH,MAAgB6H,UAAe/G,kBAA8B0G;AAAA;AAAA;AAAA,mCAGpCC;AAAA,yBACVG;AAAA;AAAA,UAEfJ;AAAA;AAAA;AAAA;AAAA,+BAIqBA;AAAA,oBACXxH,MAAgB6H,aAAkB/G,kBAA8B0G;AAAA;AAAA,2BAEzDA;AAAA,MACrB,EAKF,OAAW,CAACS,EAAUC,CAAQ,IAAK,OAAO,QAAQb,CAAM,EAAG,CACzD,GAAI,EAAEa,EAAS,SAAW,CAAC,GAAG,SAASpH,CAAa,EAAG,SAEvD,IAAMqH,EAAc5D,EAAa0D,CAAQ,EACnCG,EAAc,qCAAqCpI,MAAgBiI,MAAaE,KAChFE,EAAWJ,EACXK,EACJJ,EAAS,cAAc,OAAS,SAC5B,oCAAoClI,MAClCkI,EAAS,cAAc,WACpB3D,EAAa2D,EAAS,cAAc,MAAM,KAC/C,GACAK,EACJL,EAAS,cAAc,OAAS,SAAW,oBAAoBI;AAAA,EAAuB,GAClFE,EAAiBN,EAAS,cAAc,OAAS,SAAW,WAAa,GAGzEO,EAAgBP,EAAS,cAAc,OAAS,SAAW,SAAW,GACtEQ,EAAcR,EAAS,cAAc,OAAS,SAAW,QAAU,GAEzE,GAAIZ,GAAcnC,EAAW,SAAW,EAAG,CACzC,GAAM,CAAC,CAAEuB,CAAK,EAAI7D,EAAY,CAAC,EAC/B0D,EAAM,KAAK;AAAA,sDACe4B;AAAA,2CACSF;AAAA,EACzCM;AAAA,uBACqBH;AAAA,kBACL1B;AAAA;AAAA;AAAA;AAAA,UAIR1G,MAAgBqI,UAAiBvH,KAAiB0H,YAAyBC,UAAsBC;AAAA;AAAA;AAAA;AAAA,mCAIxET;AAAA,EACjCM,yBAAwCH;AAAA;AAAA,kBAExB1B;AAAA;AAAA;AAAA,UAGR1G,MAAgBqI,UAAiBvH,KAAiB0H,YAAyBC,UAAsBC;AAAA;AAAA,MAErG,UACWnB,GAAWC,EACpB,GAAIrC,EAAW,SAAW,EAAG,CAC3B,GAAM,CAAC,CAAE2C,CAAM,EAAIjF,EAAY,CAAC,EAC1BkF,EACJD,IAAW,UAAYA,IAAW,SAC9B,8CAA8CN,OAC9C,uBAAuBA,MACvBxE,EAAY,OAAO,QAAQpC,EAAO,OAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAACmD,CAAC,KAAO,CACjE,KAAMQ,EAAaR,CAAC,EACpB,OAAQA,CACV,EAAE,EACIiE,EAAW9F,EAAelC,EAAa8H,EAAQ,MAAO9E,CAAS,EACrEuD,EAAM,KAAK;AAAA,sDACa4B;AAAA,2CACSF;AAAA,EACzCM;AAAA,uBACqBH;AAAA,UACbZ;AAAA;AAAA;AAAA,2BAGiBA;AAAA;AAAA,4CAEiBxH,MAAgBqI,UAAiBvH,aAAyB0G;AAAA,oBAClFO;AAAA,uBACGP;AAAA,UACbxH,MAAgBqI,UAAiBvH,UAAsB0H,YAAyBC,IAAgBjB,SAAekB;AAAA;AAAA;AAAA,mCAGtFT;AAAA,EACjCM,yBAAwCH;AAAA;AAAA,UAEhCZ;AAAA;AAAA;AAAA;AAAA,+BAIqBA;AAAA,oBACXxH,MAAgBqI,aAAoBvH,UAAsB0H,YAAyBC,IAAgBjB,IAAUkB;AAAA;AAAA,sBAE3GV;AAAA,oBACFR;AAAA,MACd,OAEIjB,EAAM,KAAK;AAAA,sDACa4B;AAAA,2CACSF;AAAA,EACzCM;AAAA,uBACqBH;AAAA,UACbZ;AAAA;AAAA;AAAA,2BAGiBA;AAAA;AAAA,4CAEiBxH,MAAgBqI,UAAiBvH,aAAyB0G;AAAA,oDAClDA;AAAA,uBAC7BA;AAAA;AAAA,UAEbxH,MAAgBqI,UAAiBvH,UAAsB0H,YAAyBC,IAAgBjB,SAAekB;AAAA;AAAA;AAAA,mCAGtFT;AAAA,EACjCM,yBAAwCH;AAAA;AAAA,UAEhCZ;AAAA;AAAA;AAAA;AAAA,+BAIqBA;AAAA,oBACXxH,MAAgBqI,aAAoBvH,UAAsB0H,YAAyBC,IAAgBjB,IAAUkB;AAAA;AAAA,2BAEtGlB;AAAA,MACrB,GAOJ,GAAIlB,EAAK,SAAU,CACjB,IAAMgB,EAAa,CAAC,CAAChB,EAAK,SAGpBqC,EADU,CAACrB,GAAc9E,EAAK,OAAS,EAEvCgF,EAAUmB,EAAWnG,EAAK,CAAC,EAAI,KAC/BoG,EAAgB,KAAK9H,KAE3B,GAAIwG,GAAcnC,EAAW,SAAW,EAItCoB,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAcHqC;AAAA;AAAA,gBAEEzD,EAAW,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuCtB,UACSwD,GAAYnB,EAAS,CAE9B,IAAMqB,EAAgBrG,EAAK,IAAK,GAAM,GAAG,QAAQD,EAAO,CAAC,GAAa,EAAE,KAAK;AAAA,SAAa,EACpFuG,EAAqBtG,EACxB,IAAK,GAAM,4CAA4C,MAAM,EAC7D,KAAK;AAAA,SAAY,EACpB+D,EAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAMPsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAOAC;AAAA;AAAA;AAAA;AAAA,cAIIF;AAAA;AAAA,qBAEOzD,EAAW,IAAKpB,GAAM,KAAKA,IAAI,EAAE,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsCzD,GAIJ,OAAOwC,EAAM,KAAK;AAAA,CAAI,CACxB,CC97CA,OAAOwC,OAAU,YAEjB,SAASC,EAAaC,EAAqB,CACzC,OAAOA,EACJ,MAAM,GAAG,EACT,IAAKC,GACA,QAAQ,KAAKA,CAAI,EAAUA,EACxBA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CACjE,EACA,KAAK,EAAE,CACZ,CAEA,SAASC,GAAYC,EAAmB,CACtC,OAAOA,IAAM,UAAYA,IAAM,SAAW,SAAWA,CACvD,CAQA,SAASC,GAAeC,EAA4B,CAClD,MAAO,sCAAsCA,IAC/C,CAEA,SAASC,GAAuBC,EAAgBC,EAA2B,CACzE,IAAMH,EAAaN,EAAaQ,CAAM,EAChCE,EAAcL,GAAeC,CAAU,EACvCK,EAAkB,CAAC,EAEzB,OAAW,CAACC,EAAWC,CAAS,IAAK,OAAO,QAAQJ,EAAI,MAAM,EAAG,CAC/D,IAAMK,EAAWX,GAAYU,CAAmB,EAEhDF,EAAM,KAAK;AAAA,qBACMC,eAAuBF,OAAiBI;AAAA,+CACdR,MAAeQ,iBAAwBF;AAAA;AAAA;AAAA,8BAGxDA,mBAA2BF,aAAuBI;AAAA,wDACxBR,MAAeQ;AAAA,0CAC7BF;AAAA;AAAA,MAEpC,EAGJ,OAAOD,EAAM,KAAK;AAAA,CAAI,CACxB,CAOA,SAASI,GAA6BP,EAAgBQ,EAA8B,CAClF,IAAMV,EAAaN,EAAaQ,CAAM,EAChCE,EAAcL,GAAeC,CAAU,EAE7C,MAAO;AAAA,qBACYU,eAA0BN;AAAA,mDACIJ,sBAA+BU;AAAA,mDAC/BV,sBAA+BU;AAAA;AAAA;AAAA;AAAA,8BAIpDA,mBAA8BN;AAAA,4BAChCM;AAAA,wDAC4BV;AAAA,0CACdU;AAAA;AAAA;AAAA;AAAA,8BAIZA,mBAA8BN;AAAA,4BAChCM;AAAA;AAAA,wDAE4BV;AAAA,0CACdU;AAAA;AAAA,MAG1C,CAMA,SAASC,GAA0BT,EAAgBQ,EAAsBE,EAAyB,CAChG,IAAMZ,EAAaN,EAAaQ,CAAM,EAChCE,EAAcL,GAAeC,CAAU,EAE7C,MAAO;AAAA,qBACYU,eAA0BN,MAAgBQ;AAAA,wCACvBA;AAAA,+CACOZ;AAAA;AAAA;AAAA,qBAG1BU,oBAA+BN,MAAgBQ;AAAA,wCAC5BA;AAAA,+CACOZ;AAAA;AAAA;AAAA,8BAGjBU,wBAAmCN,MAAgBQ;AAAA,wCACzCA;AAAA,wDACgBZ;AAAA,wDACAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKvBU,wBAAmCN,MAAgBQ;AAAA,wCAC5CA;AAAA,uDACeZ;AAAA,2DACIA;AAAA,MAE3D,CAOA,SAASa,GACPC,EACAC,EACAC,EACAC,EACAC,EAC4C,CAC5C,IAAMC,EAAYD,EAAO,WAAa,CAAC,EACjCE,EAAaF,EAAO,SAAW,CAAC,EAChCG,EAAYH,EAAO,QAAU,CAAC,EAE9BI,EAAa5B,EAAaqB,CAAO,EACjCQ,EAAkBxB,GAAeuB,CAAU,EAC3CE,EAAoB,CAAC,EACrBC,EAAsB,CAAC,EAE7B,QAAWC,KAAcT,EAAa,CACpC,IAAMU,EAAYP,EAAWM,CAAU,GAAKL,EAAUK,CAAU,EAChE,GAAI,CAACC,EAAW,SAEhB,IAAMC,EAAgBD,EAAU,SAAW,CAAC,EACtCE,EAAenC,EAAagC,CAAU,EAE5CF,EAAQ,KAAK,WAAWV,MAAgBY,IAAa,EAErD,IAAMI,EAAkBF,EAAc,OAAQG,GAAMf,EAAY,SAASe,CAAC,CAAC,EAE3E,QAAWrB,KAAgBoB,EAAiB,CAC1C,IAAME,EAASb,EAAUT,CAAY,EACrC,GAAI,CAACsB,GAAU,OAAOA,GAAW,SAAU,SAC3C,IAAMC,EAAOD,EAGPE,EAAgB,CAAC,CAACb,EAAUK,CAAU,EACtCS,EAAwB,GAAGrB,MAAgBY,MAAeG,IAC1DO,EAAoBF,EACtB,qCAAqCC,KACrC,sCAAsCA,KACpCE,EAAiBH,EAAgBb,EAAUK,CAAU,EAAI,OACzDY,EACJD,GAAgB,cAAc,OAAS,SACnC,oCAAoCvB,MAClCuB,EAAe,cAAc,WAC1B3C,EAAa2C,EAAe,cAAc,MAAM,KACrD,GACAE,EACJF,GAAgB,cAAc,OAAS,SACnC,2BAA2BC;AAAA,EAC3B,GACAE,EAAsBH,GAAgB,cAAc,OAAS,SAC7DI,EAAmBD,EAAsB,kBAAoB,GAE7DE,EAAyBF,EAC3B;AAAA,EACA,GACEG,EAAwBH,EAAsB,iBAAmB,GACjEI,EAAiBJ,EAAsB;AAAA,EAAsC,GAC7EK,EAAgBL,EAAsB,QAAU,GAEtD,GAAI,CAACP,EAAK,UAAYA,EAAK,MAAM,OAAQ,CACvC,IAAMrB,EAAUqB,EAAK,KAAK,CAAC,EAC3BR,EAAU,KAAK;AAAA,mBACJf,uBAAkCgB,eAAwBX;AAAA,mCAC1CW,QAAiBX,KAAWL;AAAA,EAC7D6B,6BAA6CH;AAAA,2BACpBb;AAAA,EACzBmB,YAAiC9B;AAAA,EACjCgC;AAAA;AAAA,qBAEmBlB,aAAsBhB,UAAqB+B,UAAyBE,IAAwB/B,IAAUiC;AAAA,cAC7GnC,cAAyBE;AAAA,MACjC,OAEEa,EAAU,KAAK;AAAA,mBACJf,qBAAgCgB,eAAwBX;AAAA,mCACxCW,QAAiBX,KAAWL;AAAA,EAC7D6B,yBAAyCH;AAAA,uBACpBb;AAAA,EACrBmB;AAAA,EACAE;AAAA;AAAA,UAEQlB,UAAmBhB,KAAgB+B,UAAyBE,UAA8BE;AAAA,cACtFnC;AAAA,MACR,GAKJ,MAAO,CAAE,QAAAc,EAAS,UAAAC,CAAU,CAC9B,CAEA,eAAsBqB,GAAgB5B,EAAqB6B,EAAmB,CAC5E,GAAI,CAAC7B,EAAO,SAAW,OAAO,KAAKA,EAAO,OAAO,EAAE,SAAW,EAAG,OACjE,QAAQ,IAAI;AAAA,gDAA4C,EAExD,IAAMJ,EAAcI,EAAO,KACrBC,EAAYD,EAAO,WAAa,CAAC,EAEvC,OAAW,CAAChB,EAAQ8C,CAAM,IAAK,OAAO,QAAQ9B,EAAO,OAAO,EAAG,CAC7D,QAAQ,IAAI,qBAAWhB,GAAQ,EAC/B,IAAMF,EAAaN,EAAaQ,CAAM,EAChC+C,EAAe,GAAGjD,WAClBkD,EAAU,KAAKhD,KAGfiD,EAAiBlD,GAAuBC,EAAQ8C,CAAM,EAGtDI,EAAoBJ,EAAO,SAAW,CAAC,EACvCK,EAA6B,CAAC,EACpC,QAAW3C,KAAgB0C,EAAmB,CAC5C,IAAMpB,EAASb,EAAUT,CAAY,EACrC,GAAI,CAACsB,GAAU,OAAOA,GAAW,SAAU,SAC3C,IAAMC,EAAOD,EACT,CAACC,EAAK,UAAYA,EAAK,MAAM,OAC/BoB,EAAiB,KAAK1C,GAA0BT,EAAQQ,EAAcuB,EAAK,KAAK,CAAC,CAAC,CAAC,EAEnFoB,EAAiB,KAAK5C,GAA6BP,EAAQQ,CAAY,CAAC,EAK5E,GAAM,CAAE,QAAS4C,EAAW,UAAWC,CAAY,EAAI1C,GACrDC,EACAZ,EACAkD,EACAJ,EAAO,aAAe,CAAC,EACvB9B,CACF,EAGMsC,EAAaR,EAAO,UACtB,iGACA,GAEES,EAAuB,sCAAsCzD,KAG7D0D,EAAa;AAAA,wBACCxD,kBAAuBuD;AAAA;AAAA,OAKrCE,EAAa;AAAA,qCACcF;AAAA;AAAA,OAS3BG,EAJgB,OAAO,OAAOZ,EAAO,MAAM,EACT,KACrClD,GAAMA,IAAM,UAAYA,IAAM,UAAYA,IAAM,gBACnD,EACyC;AAAA,6BAAkC,GAGrE+D,EAAkBT,EAAkB,KAAMrB,GAAM,CACpD,IAAM+B,EAAK3C,EAAUY,CAAC,EACtB,MAAI,CAAC+B,GAAM,OAAOA,GAAO,SAAiB,GACnC,CAAC,CAAEA,EAAiB,MAAM,QAAU,CAAEA,EAAiB,QAChE,CAAC,EACKC,EAAqBX,EAAkB,KAAMrB,GAAM,CACvD,IAAM+B,EAAK3C,EAAUY,CAAC,EACtB,MAAI,CAAC+B,GAAM,OAAOA,GAAO,SAAiB,GACnC,CAAC,CAAEA,EAAiB,QAC7B,CAAC,EAEKE,EAAwBH,EACxBI,EAAuBF,EACvBG,EAAoBL,EACpBM,EAAuB,CAAC,CAACnB,EAAO,UAEhCoB,EAAiB,CACrBJ,EACI;AAAA,4DACA,GACJC,EACI;AAAA,qEACA,GACJC,EACI;AAAA,gEACA,GACJ;AAAA,4DACAC,EACI;AAAA,2EACA,EACN,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI,EAENE,EAAgBf,EAAU,OAAS,EAAI;AAAA,EAAOA,EAAU,KAAK;AAAA,CAAI,EAAI,GAKrEgB,EAAkB,sCAAsCtE,KAExDuE,EAAO,UAAUzD,MAAgBZ;AAAA;AAAA,UAEjCY;AAAA,UACAA,wBAAkC8C,IAAeS;AAAA;AAAA;AAAA,EAGzDD;AAAA;AAAA,mCAEiClB;AAAA;AAAA;AAAA,0CAGOD;AAAA;AAAA,0CAEAjD;AAAA,oBACtBA;AAAA;AAAA;AAAA,EAGlB2D;AAAA;AAAA,EAEAD;AAAA;AAAA;AAAA,EAGAP;AAAA;AAAA;AAAA,EAGAE,EAAiB,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,EAG1BE,EAAY,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,iCAGUrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAK/BsD;AAAA,qEACmExD;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKnCE;AAAA;AAAA,wBAEVoE;AAAA;AAAA;AAAA,4DAGoCtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxD,MAAMwE,EAAmBD,EAAM9E,GAAK,KAAKsD,EAAW,GAAG7C,QAAa,EAAG,oBAAoB,EAE/F,CCtXA,OAAOuE,OAAU,YAEjB,SAASC,GAAaC,EAAqB,CACzC,OAAOA,EACJ,MAAM,GAAG,EACT,IAAKC,GACA,QAAQ,KAAKA,CAAI,EAAUA,EACxBA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CACjE,EACA,KAAK,EAAE,CACZ,CAEA,eAAsBC,GAAgBC,EAAqBC,EAAmB,CAC5E,GAAI,CAACD,EAAO,SAAW,OAAO,KAAKA,EAAO,OAAO,EAAE,SAAW,EAAG,OACjE,QAAQ,IAAI;AAAA,8CAA0C,EAEtD,IAAME,EAAcF,EAAO,KAE3B,QAAWG,KAAa,OAAO,KAAKH,EAAO,OAAO,EAAG,CACnD,QAAQ,IAAI,qBAAWG,GAAW,EAClC,IAAMC,EAAaR,GAAaO,CAAS,EACnCE,EAAgB,KAAKF,KACrBG,EAAiB,oCAAoCF,KAErDG,EAAO,UAAUL,MAAgBC;AAAA;AAAA,UAEjCD;AAAA,UACAA;AAAA;AAAA,sCAE4BG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAMlBD;AAAA;AAAA,+BAEWE;AAAA;AAAA;AAAA;AAAA,oCAIKA;AAAA;AAAA;AAAA;AAAA,yCAIKA;AAAA,0DACiBF;AAAA;AAAA;AAAA,8BAG5BD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAMrBG;AAAA,wDAC+CF;AAAA;AAAA;AAAA;AAAA;AAAA,8BAK1BD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAOrBG;AAAA,yEACgEF;AAAA;AAAA;AAAA;AAAA;AAAA,gCAKzCD,aAAqBG;AAAA,0DACKF;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKzBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qEAOoCC;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKpCD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sFAQqDC;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKrDD;AAAA,6BACJG;AAAA;AAAA;AAAA;AAAA,sEAIyCF;AAAA;AAAA;AAAA;AAAA;AAAA,+BAKvCD;AAAA,6BACFG;AAAA;AAAA;AAAA;AAAA,yDAI4BF;AAAA;AAAA;AAAA,gCAGzBD;AAAA,6BACHG;AAAA;AAAA;AAAA;AAAA,0DAI6BF;AAAA;AAAA;AAAA,iCAGzBD;AAAA,kBACfG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4DAO0CF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxD,MAAMI,EAAmBD,EAAMZ,GAAK,KAAKM,EAAW,GAAGE,QAAgB,EAAG,oBAAoB,EAElG,CCpJA,OAAOM,OAAU,YAEjB,SAASC,EAAaC,EAAqB,CACzC,OAAOA,EACJ,MAAM,GAAG,EACT,IAAKC,GACA,QAAQ,KAAKA,CAAI,EAAUA,EACxBA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,EAAE,YAAY,CACjE,EACA,KAAK,EAAE,CACZ,CAEA,SAASC,GAAYC,EAAmB,CACtC,OAAOA,IAAM,UAAYA,IAAM,SAAW,SAAWA,CACvD,CAEA,SAASC,EAAiBC,EAA4B,CACpD,MAAO,qCAAqCA,IAC9C,CAEA,SAASC,EAAaC,EAAqBC,EAAsC,CAC/E,GAAIA,EAAI,cAAc,OAAS,SAC/B,MAAO,GAAGD,EAAO,SAASC,EAAI,cAAc,WAAWT,EAAaS,EAAI,cAAc,MAAM,GAC9F,CAEA,SAASC,EAAWF,EAAqBC,EAAsC,CAC7E,GAAIA,EAAI,cAAc,OAAS,SAC/B,MAAO,oCAAoCF,EAAaC,EAAQC,CAAG,IACrE,CAEA,SAASE,GAAuBH,EAAqBI,EAAkBH,EAA0B,CAC/F,IAAMH,EAAaN,EAAaY,CAAQ,EAClCC,EAAcR,EAAiBC,CAAU,EACzCQ,EAASP,EAAaC,EAAQC,CAAG,EACjCM,EAAoBL,EAAWF,EAAQC,CAAG,EAC1CO,EAAkB,CAAC,EAEzB,OAAW,CAACC,EAAWC,CAAS,IAAK,OAAO,QAAQT,EAAI,MAAM,EAAG,CAC/D,IAAMU,EAAWhB,GAAYe,CAAmB,EAE5CT,EAAI,cAAc,OAAS,UAAYK,GAAUC,EACnDC,EAAM,KAAK;AAAA,qBACIC,eAAuBJ,OAAiBM;AAAA,8CACfb,MAAea,iBAAwBF;AAAA;AAAA;AAAA,8BAGvDA;AAAA,yBACLF;AAAA,6BACIF;AAAA;AAAA,wBAELM;AAAA;AAAA;AAAA,uDAG+BL,MAAWR,MAAea;AAAA,gEACjBF;AAAA;AAAA;AAAA;AAAA,iCAI/BA,sCAA8CJ,OAAiBM;AAAA,6EACnBb,MAAea;AAAA,0CAClDF;AAAA;AAAA,MAEpC,EAEAD,EAAM,KAAK;AAAA,qBACIC,eAAuBJ,OAAiBM;AAAA,8CACfb,MAAea,iBAAwBF;AAAA;AAAA;AAAA,8BAGvDA,mBAA2BJ,aAAuBM;AAAA,8DAClBb,MAAea;AAAA,0CACnCF;AAAA;AAAA;AAAA;AAAA,iCAITA,mBAA2BJ,OAAiBM;AAAA,6EACAb,MAAea;AAAA,0CAClDF;AAAA;AAAA,MAEpC,EAIJ,OAAOD,EAAM,KAAK;AAAA,CAAI,CACxB,CAEA,SAASI,GAAUZ,EAAqBC,EAA0B,CAChE,IAAMY,EAAOX,EAAWF,EAAQC,CAAG,EACnC,OAAIA,EAAI,cAAc,OAAS,UAAY,CAACY,EAAa,GAClD,qBAAqBA;AAAA,CAC9B,CAGA,SAASC,GAAeb,EAA0B,CAChD,OAAIA,EAAI,cAAc,OAAS,SAAiB,GACzC;AAAA,CACT,CAEA,SAASc,GAAYd,EAA0B,CAC7C,OAAOA,EAAI,cAAc,OAAS,SAAW;AAAA,EAAmC,EAClF,CAEA,SAASe,GACPhB,EACAC,EACAH,EACAa,EACAM,EACAC,EACQ,CACR,IAAMZ,EAASP,EAAaC,EAAQC,CAAG,EACvC,OAAIA,EAAI,cAAc,OAAS,UAAYK,EAClC,gDAAgDA,MAAWR,MAAea;AAAA,8DACvBM,MAAcC;AAAA,YAGnE,uDAAuDpB,MAAea;AAAA,wCACvCM,MAAcC;AAAA,WAEtD,CAEA,SAASC,GACPnB,EACAC,EACAH,EACAa,EACAM,EACQ,CACR,IAAMX,EAASP,EAAaC,EAAQC,CAAG,EACvC,OAAIA,EAAI,cAAc,OAAS,UAAYK,EAClC,mDAAmDA,MAAWR,MAAea;AAAA,8DAC1BM;AAAA,WAGrD,sEAAsEnB,MAAea;AAAA,wCACtDM;AAAA,UAExC,CAEA,SAASG,GACPpB,EACAI,EACAH,EACAoB,EACQ,CACR,IAAMvB,EAAaN,EAAaY,CAAQ,EAClCC,EAAcR,EAAiBC,CAAU,EAE/C,MAAO;AAAA,qBACYuB,eAA0BhB;AAAA,kDACGP,sBAA+BuB;AAAA,kDAC/BvB,sBAA+BuB;AAAA;AAAA;AAAA;AAAA,8BAInDA;AAAA,EAC5BT,GAAUZ,EAAQC,CAAG,0BAA0BI;AAAA,EAC/CS,GAAeb,CAAG;AAAA,EAClBc,GAAYd,CAAG;AAAA,4BACWoB;AAAA,UAClBL,GAAahB,EAAQC,EAAKH,EAAY,MAAO,KAAKuB,KAAiB,kBAAkB;AAAA;AAAA;AAAA,8BAGjEA;AAAA,EAC5BT,GAAUZ,EAAQC,CAAG,0BAA0BI;AAAA,EAC/CS,GAAeb,CAAG;AAAA,EAClBc,GAAYd,CAAG;AAAA,4BACWoB;AAAA;AAAA,UAElBL,GAAahB,EAAQC,EAAKH,EAAY,MAAO,KAAKuB,KAAiB,kBAAkB;AAAA,MAE/F,CAEA,SAASC,GACPtB,EACAI,EACAH,EACAoB,EACAE,EACQ,CACR,IAAMzB,EAAaN,EAAaY,CAAQ,EAClCC,EAAcR,EAAiBC,CAAU,EAE/C,MAAO;AAAA,qBACYuB,eAA0BhB,MAAgBkB;AAAA,wCACvBA;AAAA,8CACMzB;AAAA;AAAA;AAAA,qBAGzBuB,oBAA+BhB,MAAgBkB;AAAA,wCAC5BA;AAAA,8CACMzB;AAAA;AAAA;AAAA,8BAGhBuB;AAAA,EAC5BT,GAAUZ,EAAQC,CAAG,0BAA0BI;AAAA,EAC/CS,GAAeb,CAAG,YAAYsB;AAAA;AAAA,EAE9BR,GAAYd,CAAG;AAAA,wCACuBsB;AAAA,uDACezB;AAAA,UAC7CkB,GAAahB,EAAQC,EAAKH,EAAY,aAAc,MAAO,MAAM;AAAA;AAAA;AAAA,iCAG1CuB;AAAA,EAC/BT,GAAUZ,EAAQC,CAAG,0BAA0BI;AAAA,EAC/CS,GAAeb,CAAG,YAAYsB;AAAA,EAC9BR,GAAYd,CAAG;AAAA,wCACuBsB;AAAA,sDACczB;AAAA,UAC5CqB,GAAgBnB,EAAQC,EAAKH,EAAY,aAAc,KAAK;AAAA,MAEtE,CAEA,SAAS0B,GACPC,EACAC,EACAC,EACAC,EACAC,EACA7B,EAC4C,CAC5C,IAAM8B,EAAY9B,EAAO,WAAa,CAAC,EACjC+B,EAAa/B,EAAO,SAAW,CAAC,EAChCgC,EAAYhC,EAAO,QAAU,CAAC,EAC9BiC,EAAazC,EAAakC,CAAO,EACjCQ,EAAkBrC,EAAiBoC,CAAU,EAC7CE,EAAoB,CAAC,EACrBC,EAAsB,CAAC,EACvBC,EAAanC,EAAWF,EAAQ2B,CAAO,EACvCW,EACJX,EAAQ,cAAc,OAAS,UAAYU,EACvC,yBAAyBA;AAAA,EACzB,GACAE,EAAiBZ,EAAQ,cAAc,OAAS,SAAW,gBAAkB,GAC7Ea,EAAcb,EAAQ,cAAc,OAAS,SAAW,QAAU,GAExE,QAAWc,KAAcZ,EAAa,CACpC,IAAMa,EAAYX,EAAWU,CAAU,GAAKT,EAAUS,CAAU,EAChE,GAAI,CAACC,EAAW,SAEhB,IAAMC,EAAgBD,EAAU,SAAW,CAAC,EACtCE,EAAepD,EAAaiD,CAAU,EAC5CN,EAAQ,KAAK,WAAWV,MAAgBgB,IAAa,EAErD,IAAMI,EAAgB,CAAC,CAACb,EAAUS,CAAU,EACtCK,EAAwB,GAAGrB,MAAgBgB,MAAeG,IAC1DG,EAAoBF,EACtB,qCAAqCC,KACrC,sCAAsCA,KACpCE,EAAiBH,EAAiBH,EAA4B,OAC9DO,EAAeD,EAAiB9C,EAAWF,EAAQgD,CAAc,EAAI,OACrEE,EAAsBF,GAAgB,cAAc,OAAS,UAAY,CAAC,CAACC,EAC3EE,EAAkBD,EAAsB,2BAA2BD;AAAA,EAAoB,GACvFG,EAAmBF,EAAsB,kBAAoB,GAC7DG,EAAwBH,EAAsB,iBAAmB,GACjEI,EAAgBJ,EAAsB,QAAU,GAEhDK,EAAoB5B,EAAQ,cAAc,OAAS,SACnD6B,EAAsBD,EAAoB,iBAAmB,GAE7DE,EACJP,GAAuBK,EACnB;AAAA,EACA,GACAG,GACJR,GAAuBK,EAAoB;AAAA,EAAuC,GAE9EI,EAAkBhB,EAAc,OAAQiB,GAAMhC,EAAY,SAASgC,CAAC,CAAC,EAC3E,QAAWvC,KAAgBsC,EAAiB,CAC1C,IAAME,EAAS/B,EAAUT,CAAY,EACrC,GAAI,CAACwC,GAAU,OAAOA,GAAW,SAAU,SAC3C,IAAMC,EAAOD,EAEb,GAAI,CAACC,EAAK,UAAYA,EAAK,MAAM,OAAQ,CACvC,IAAMvC,GAAUuC,EAAK,KAAK,CAAC,EAC3B1B,EAAU,KAAK;AAAA,mCACYK,QAAiBf,KAAWL;AAAA,EAC7D8B,IAAkBb,8BAA0CS;AAAA,4BAClCb;AAAA,EAC1BuB,YAA2BlC;AAAA,EAC3BmC;AAAA,qBACmBjB,aAAsBpB,UAAqB+B,UAAyBC,IAAwB9B,KAAU+B;AAAA,cAC7GjC,UAAqBkB,QAAqBiB,IAAsBjC,WAAgBiB;AAAA,MACxF,OAEEJ,EAAU,KAAK;AAAA,mCACYK,QAAiBf,KAAWL;AAAA,EAC7D8B,IAAkBb,yBAAqCS;AAAA,uBAClCb;AAAA,EACrBuB;AAAA,EACAC;AAAA,UACQjB,UAAmBpB,KAAgB+B,UAAyBC,UAA8BC;AAAA,cACtFjC,KAAgBkB,QAAqBiB,UAA4BhB;AAAA,MACzE,GAKJ,MAAO,CAAE,QAAAL,EAAS,UAAAC,CAAU,CAC9B,CAEA,eAAsB2B,GAAe/D,EAAqBgE,EAAmB,CAC3E,GAAI,CAAChE,EAAO,QAAU,OAAO,KAAKA,EAAO,MAAM,EAAE,SAAW,EAAG,OAC/D,QAAQ,IAAI;AAAA,+CAA2C,EAEvD,IAAMyB,EAAczB,EAAO,KACrB8B,EAAY9B,EAAO,WAAa,CAAC,EAEvC,OAAW,CAACI,EAAU6D,CAAQ,IAAK,OAAO,QAAQjE,EAAO,MAAM,EAAG,CAChE,QAAQ,IAAI,qBAAWI,GAAU,EACjC,IAAMN,EAAaN,EAAaY,CAAQ,EAClC8D,EAAe,KAAK9D,KACpB+D,EAAgBtE,EAAiBC,CAAU,EAC3CsE,EAAiBjE,GAAuBH,EAAQI,EAAU6D,CAAQ,EAClEI,EAAoBJ,EAAS,SAAW,CAAC,EAEzCK,EAA6B,CAAC,EACpC,QAAWjD,KAAgBgD,EAAmB,CAC5C,IAAMR,EAAS/B,EAAUT,CAAY,EACrC,GAAI,CAACwC,GAAU,OAAOA,GAAW,SAAU,SAC3C,IAAMC,EAAOD,EACT,CAACC,EAAK,UAAYA,EAAK,MAAM,OAC/BQ,EAAiB,KACfhD,GAA0BtB,EAAQI,EAAU6D,EAAU5C,EAAcyC,EAAK,KAAK,CAAC,CAAC,CAClF,EAEAQ,EAAiB,KACflD,GAA6BpB,EAAQI,EAAU6D,EAAU5C,CAAY,CACvE,EAIJ,GAAM,CAAE,QAASkD,EAAW,UAAWC,CAAY,EAAIhD,GACrDC,EACArB,EACA6D,EACAI,EACAJ,EAAS,aAAe,CAAC,EACzBjE,CACF,EAMMyE,EAJkB,OAAO,OAAOR,EAAS,MAAM,EACN,KAC5CrE,GAAMA,IAAM,UAAYA,IAAM,UAAYA,IAAM,gBACnD,EACmD;AAAA,6BAAkC,GAE/E8E,EAAuBL,EAAkB,KAAMhD,GAAiB,CACpE,IAAMwC,EAAS/B,EAAUT,CAAY,EACrC,MAAI,CAACwC,GAAU,OAAOA,GAAW,SAAiB,GAC3C,CAAC,CAAEA,EAAqB,MAAM,QAAU,CAAEA,EAAqB,QACxE,CAAC,EACKc,EAA0BN,EAAkB,KAAMhD,GAAiB,CACvE,IAAMwC,EAAS/B,EAAUT,CAAY,EACrC,MAAI,CAACwC,GAAU,OAAOA,GAAW,SAAiB,GAC3C,CAAC,CAAEA,EAAqB,QACjC,CAAC,EAEKe,EAAiB,CACrBF,EACI;AAAA,4DACA,GACJC,EACI;AAAA,qEACA,GACJD,EACI;AAAA,gEACA,EACN,EACG,OAAO,OAAO,EACd,KAAK;AAAA,CAAI,EACNG,EACJD,EAAe,OAAS,EACpB;AAAA;AAAA,EAAqFA;AAAA,EACrF,GAEAE,EAAgBP,EAAU,OAAS,EAAI;AAAA,EAAOA,EAAU,KAAK;AAAA,CAAI,EAAI,GACrEjE,EAASJ,EAAWF,EAAQiE,CAAQ,EACpCc,EACJd,EAAS,cAAc,OAAS,UAAY3D,EACxC;AAAA,8BACoBF;AAAA;AAAA,yBAELE;AAAA;AAAA,SAEhB6D;AAAA,mEAC0DpE,EACzDC,EACAiE,CACF,MAAMnE;AAAA;AAAA;AAAA;AAAA;AAAA,iCAKmBM;AAAA;AAAA,yBAERE;AAAA;AAAA;AAAA,gFAGuDP,EACtEC,EACAiE,CACF,MAAMnE;AAAA;AAAA;AAAA,OAIJ;AAAA,8BACoBM;AAAA;AAAA;AAAA,SAGrB+D;AAAA,8DACqDrE;AAAA;AAAA;AAAA;AAAA;AAAA,iCAK7BM;AAAA;AAAA;AAAA;AAAA,2EAI0CN;AAAA;AAAA;AAAA,OAKjEkF,EAAO,UAAUvD,MAAgBrB;AAAA;AAAA,UAEjCqB;AAAA,UACAA,wBAAkCgD,IAAoBK;AAAA,EAC9DD;AAAA,qCACmCX;AAAA;AAAA;AAAA,oBAGjBpE;AAAA;AAAA;AAAA,EAGlBsE;AAAA;AAAA;AAAA,EAGAE,EAAiB,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,EAG1BE,EAAY,KAAK;AAAA,CAAI;AAAA;AAAA;AAAA,EAGrBO;AAAA;AAAA,gCAE8B3E,cAAqB+D;AAAA,2DACMrE;AAAA;AAAA;AAAA;AAAA;AAAA,kCAKzBM,cAAqB+D;AAAA,2DACIrE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvD,MAAMmF,EAAmBD,EAAMzF,GAAK,KAAKyE,EAAW,GAAG5D,QAAe,EAAG,oBAAoB,EAEjG,CCxcA,eAAsB8E,GAAwBC,EAAqBC,EAAc,CAC/E,GAAID,EAAO,OAAS,QAAS,OAE7B,IAAME,EAAO,UAAUF,EAAO;AAAA;AAAA;AAAA,QAGxBA,EAAO;AAAA,QACPA,EAAO;AAAA,QACPA,EAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBb,MAAMG,EAAmBD,EAAMD,EAAM,oBAAoB,CAC3D,CCpCA,OAAOG,OAAW,QAElB,OAAS,cAAAC,GAAY,gBAAAC,GAAc,iBAAAC,OAAqB,KACxD,OAAOC,OAAU,YAcjB,SAASC,GAAeC,EAA4C,CAClE,GAAI,OAAOA,GAAU,SACnB,MAAO,CAAE,MAAOA,CAAM,EAExB,IAAMC,EAAwB,CAAC,EAC/B,OAAW,CAACC,EAAGC,CAAC,IAAK,OAAO,QAAQH,EAAM,QAAU,CAAC,CAAC,EACpDC,EAAOC,CAAC,EAAIC,EAEd,OAAOF,CACT,CAGA,SAASG,GAAoBJ,EAA4D,CACvF,IAAMC,EAAwB,CAAC,EAC/B,OAAW,CAACC,EAAGC,CAAC,IAAK,OAAO,QAAQH,EAAM,MAAM,EAC9CC,EAAOC,CAAC,EAAIC,EAEd,OAAOF,CACT,CAGA,SAASI,GAAUC,EAAgC,CACjD,IAAMC,EAA2C,CAAC,EAClD,OAAW,CAACC,EAAMR,CAAK,IAAK,OAAO,QAAQM,EAAO,WAAa,CAAC,CAAC,EAC/DC,EAAUC,CAAI,EAAIT,GAAeC,CAAK,EAGxC,IAAMS,EAAyC,CAAC,EAChD,OAAW,CAACD,EAAMR,CAAK,IAAK,OAAO,QAAQM,EAAO,SAAW,CAAC,CAAC,EAC7DG,EAAQD,CAAI,EAAIJ,GAAoBJ,CAAK,EAG3C,IAAMU,EAAwC,CAAC,EAC/C,OAAW,CAACF,EAAMR,CAAK,IAAK,OAAO,QAAQM,EAAO,QAAU,CAAC,CAAC,EAC5DI,EAAOF,CAAI,EAAIJ,GAAoBJ,CAAK,EAG1C,MAAO,CAAE,QAAS,EAAG,UAAAO,EAAW,QAAAE,EAAS,OAAAC,CAAO,CAClD,CAKA,SAASC,GACPC,EACAC,EACAC,EACM,CACN,OAAW,CAACN,EAAMO,CAAS,IAAK,OAAO,QAAQD,CAAU,EAAG,CAC1D,IAAME,EAAYH,EAAWL,CAAI,EACjC,GAAKQ,EAEL,OAAW,CAACC,EAAOC,CAAO,IAAK,OAAO,QAAQF,CAAS,EAAG,CACxD,GAAI,EAAEC,KAASF,GACb,MAAM,IAAI,MACR,uCAAuCH,KAAWJ;AAAA,WACpCS;AAAA;AAAA;AAAA,gEAEqDT,8BACrE,EAEF,GAAIO,EAAUE,CAAK,IAAMC,EACvB,MAAM,IAAI,MACR,uCAAuCN,KAAWJ;AAAA,WACpCS,yBAA6BC,UAAgBH,EAAUE,CAAK;AAAA;AAAA;AAAA,qEAEFT,8BAC1E,GAIR,CAWO,SAASW,GAAmBC,EAAiBd,EAA2B,CAC7E,IAAMe,EAAWvB,GAAK,KAAKsB,EAAS,GAAGd,EAAO,gBAAgB,EACxDgB,EAAUjB,GAAUC,CAAM,EAEhC,GAAIX,GAAW0B,CAAQ,EAAG,CACxB,IAAIE,EACJ,GAAI,CACFA,EAAU,KAAK,MAAM3B,GAAayB,EAAU,OAAO,CAAC,CACtD,MAAE,CACA,QAAQ,KACN3B,GAAM,OAAO,SAAS,EAAI,oBAAoBA,GAAM,KAAK2B,CAAQ,0BACnE,EACAxB,GAAcwB,EAAU,KAAK,UAAUC,EAAS,KAAM,CAAC,EAAI;AAAA,EAAM,OAAO,EACxE,MACF,CAEAX,GAAa,YAAaY,EAAQ,WAAa,CAAC,EAAGD,EAAQ,SAAS,EACpEX,GAAa,UAAWY,EAAQ,SAAW,CAAC,EAAGD,EAAQ,OAAO,EAC9DX,GAAa,SAAUY,EAAQ,QAAU,CAAC,EAAGD,EAAQ,MAAM,EAG7DzB,GAAcwB,EAAU,KAAK,UAAUC,EAAS,KAAM,CAAC,EAAI;AAAA,EAAM,OAAO,CAC1E,CCzHA,OAAOE,MAAW,QAGlB,IAAMC,GAAQC,GACZ,QAAQ,KAAKF,EAAM,OAAO,iBAAiB,EAAIA,EAAM,OAAO,YAAY,EAAIE,CAAG,EAO1E,SAASC,GAAqBC,EAA2B,CAC9DC,GAAeD,EAAQ,EAAK,CAC9B,CAaO,SAASC,GAAeD,EAAqBE,EAAe,GAAY,CAC7E,IAAMC,EAAYH,EAAO,WAAa,CAAC,EACjCI,EAAUJ,EAAO,SAAW,CAAC,EAC7BK,EAAUL,EAAO,SAAW,CAAC,EAC7BM,EAASN,EAAO,QAAU,CAAC,EAO3BO,EAAe,IAAI,IAAI,OAAO,KAAKJ,CAAS,CAAC,EAC7CK,EAAa,IAAI,IAAI,OAAO,KAAKJ,CAAO,CAAC,EACzCK,EAAa,IAAI,IAAI,OAAO,KAAKJ,CAAO,CAAC,EACzCK,EAAY,IAAI,IAAI,OAAO,KAAKJ,CAAM,CAAC,EAEvCK,EAAa,IAAI,IACvB,QAAWC,KAAKL,GACVC,EAAW,IAAII,CAAC,GAAKH,EAAW,IAAIG,CAAC,GAAKF,EAAU,IAAIE,CAAC,IAAGD,EAAW,IAAIC,CAAC,EAElF,QAAWA,KAAKJ,GACVC,EAAW,IAAIG,CAAC,GAAKF,EAAU,IAAIE,CAAC,IAAGD,EAAW,IAAIC,CAAC,EAE7D,QAAWA,KAAKH,EACVC,EAAU,IAAIE,CAAC,GAAGD,EAAW,IAAIC,CAAC,EAExC,GAAID,EAAW,KAAO,EACpB,MAAM,IAAI,MACR,yEAAyE,CAAC,GAAGA,CAAU,EACpF,KAAK,EACL,KAAK,IAAI,GACd,EAIF,IAAME,EAAoB,IAAI,IAE9B,OAAW,CAACC,EAAQC,CAAM,IAAK,OAAO,QAAQX,CAAO,EAAG,CACtD,QAAWY,KAAKD,EAAO,SAAW,CAAC,EAAG,CACpCF,EAAkB,IAAIG,CAAC,EACvB,IAAMC,EAAMd,EAAUa,CAAC,EACvB,GAAI,CAACC,EACH,MAAM,IAAI,MACR,WAAWH,yBAA8BE,sCAC3C,EAEF,GAAI,OAAOC,GAAQ,UAAY,CAAEA,EAAkB,aACjD,MAAM,IAAI,MACR,WAAWH,uBAA4BE,qBAAqBA,wEACnBA,sCAC3C,EAIJ,QAAWA,KAAKD,EAAO,aAAe,CAAC,EAAG,CACxC,IAAMG,EAAW,CAAC,CAACd,EAAQY,CAAC,EACtBG,EAAU,CAAC,CAACb,EAAOU,CAAC,EAC1B,GAAI,CAACE,GAAY,CAACC,EAChB,MAAM,IAAI,MACR,WAAWL,6BAAkCE,8CAC/C,GAKN,OAAW,CAACI,EAAUC,CAAQ,IAAK,OAAO,QAAQf,CAAM,EAAG,CACzD,GAAI,CAACe,EAAS,cACZ,MAAM,IAAI,MACR,UAAUD,oGAEZ,EAEF,GAAIC,EAAS,cAAc,OAAS,UAClC,GAAI,CAAChB,EAAQgB,EAAS,cAAc,MAAM,EACxC,MAAM,IAAI,MACR,UAAUD,sCAA6CC,EAAS,cAAc,wBAC7DA,EAAS,cAAc,uBAC1C,UAEOA,EAAS,cAAc,OAAS,SACzC,MAAM,IAAI,MAAM,UAAUD,mDAA0D,EAGtF,QAAWJ,KAAKK,EAAS,SAAW,CAAC,EAAG,CACtCR,EAAkB,IAAIG,CAAC,EACvB,IAAMC,EAAMd,EAAUa,CAAC,EACvB,GAAI,CAACC,EACH,MAAM,IAAI,MACR,UAAUG,yBAAgCJ,sCAC5C,EAEF,GAAI,OAAOC,GAAQ,UAAY,CAAEA,EAAkB,aACjD,MAAM,IAAI,MACR,UAAUG,uBAA8BJ,qBAAqBA,wEACpBA,sCAC3C,EAIJ,QAAWA,KAAKK,EAAS,aAAe,CAAC,EAAG,CAC1C,IAAMH,EAAW,CAAC,CAACd,EAAQY,CAAC,EACtBG,EAAU,CAAC,CAACb,EAAOU,CAAC,EAC1B,GAAI,CAACE,GAAY,CAACC,EAChB,MAAM,IAAI,MACR,UAAUC,6BAAoCJ,8CAChD,GAMN,OAAW,CAACM,EAAMC,CAAQ,IAAK,OAAO,QAAQpB,CAAS,EAAG,CACxD,GAAI,OAAOoB,GAAa,SAAU,SAClC,IAAMC,EAAOD,EAGb,GAAIC,EAAK,SAAU,CACjB,GAAIA,EAAK,SACP,MAAM,IAAI,MACR,aAAaF,qKAGf,EAEF,GAAIE,EAAK,aACP,MAAM,IAAI,MACR,aAAaF,2HAEf,EAEF,GAAIE,EAAK,SACP,MAAM,IAAI,MACR,aAAaF,4HAEf,EAEEE,EAAK,UACHtB,GACFL,GACE,aAAaD,EAAM,KAAK0B,CAAI,cAAc1B,EAAM,KAC9C,gBACF,SAASA,EAAM,KAAK,gBAAgB,oKAGtC,EAgBN,GAZI4B,EAAK,UAAYA,EAAK,UACpBtB,GACFL,GACE,aAAaD,EAAM,KAAK0B,CAAI,cAAc1B,EAAM,KAAK,gBAAgB,SAASA,EAAM,KAClF,gBACF,4HAGF,EAIA4B,EAAK,OAAQ,CACf,GAAIA,EAAK,SACP,MAAM,IAAI,MACR,aAAaF,oNAGf,EAEF,GAAIE,EAAK,SACP,MAAM,IAAI,MACR,aAAaF,mLAGf,EAEF,GAAIE,EAAK,aACP,MAAM,IAAI,MACR,aAAaF,mMAGf,EAIAE,EAAK,UAAYA,EAAK,UACpBtB,GACFL,GACE,aAAaD,EAAM,KAAK0B,CAAI,cAAc1B,EAAM,KAAK,gBAAgB,SAASA,EAAM,KAClF,gBACF,oBACmBA,EAAM,MACrB,QAAQ0B,GACV,oCAAoC1B,EAAM,KACxC,QACF,mCACJ,EAGA4B,EAAK,cAAgB,CAACX,EAAkB,IAAIS,CAAI,GAC9CpB,GACFL,GACE,aAAaD,EAAM,KAAK0B,CAAI,SAAS1B,EAAM,KACzC,oBACF,kCACYA,EAAM,KAAK,iBAAiB,QAAQA,EAAM,KAClD,gBACF,8DACJ,EAGR,CjB1NA,OAAO6B,MAAU,YAEjB,eAAsBC,GACpBC,EACAC,EACAC,EACAC,EAAqB,EACrB,CACA,QAAQ,IAAI;AAAA,8CAA0C,EACtD,QAAQ,IAAI,kCAA2B,EACvC,QAAQ,IAAI,2BAAiBF,EAAO,MAAM,EAC1C,QAAQ,IAAI,kCAAwBA,EAAO,aAAe,2BAA2B,EACrF,QAAQ,IAAI,8BAAoBC,GAAW,WAAW,EACtD,QAAQ,IAAI,sCAA4BC,IAAgB,EAAI,YAAc,mBAAmB,EAK7FC,GAAeH,CAAM,EAGrBI,GAAmBL,EAASC,CAAM,EAElC,QAAQ,IAAID,CAAO,EACnB,IAAMM,EAAaR,EAAK,KAAKE,EAAS,MAAOC,EAAO,IAAI,EAEpDM,EAAW,GAAGD,GAAY,GAC5BE,GAAsB,GAAGF,mBAA4B,EAGlDC,EAAW,GAAGD,aAAsB,GACvC,MAAMG,GAAaR,EAAQD,CAAO,EAGpC,IAAMU,EAAcZ,EAAK,KAAKQ,EAAY,UAAW,UAAW,cAAc,EACzEC,EAAWG,CAAW,GACzB,MAAMC,GAAgBV,EAAQS,EAAaP,CAAW,EAGxD,IAAMS,EAAed,EAAK,KAAKQ,EAAY,UAAW,UAAW,gBAAgB,EAC5EC,EAAWK,CAAY,GAC1B,MAAMC,GAAiBZ,EAAQW,CAAY,EAG7C,IAAME,EAAchB,EAAK,KAAKQ,EAAY,UAAW,UAAW,eAAe,EAC1EC,EAAWO,CAAW,GACzB,MAAMC,GAAgBd,EAAQa,CAAW,EAG3C,IAAME,EAAiBlB,EAAK,KAAKQ,EAAY,UAAW,UAAW,kBAAkB,EAChFC,EAAWS,CAAc,GAC5B,MAAMC,GAAmBhB,EAAQe,EAAgBb,CAAW,EAG9D,IAAMe,EAAgBpB,EAAK,KAAKQ,EAAY,UAAW,UAAW,WAAW,EAC7E,MAAMa,GAAkBlB,EAAQiB,CAAa,EAE7C,IAAME,EAActB,EAAK,KAAKQ,EAAY,UAAW,UAAW,SAAS,EACzE,MAAMe,GAAgBpB,EAAQmB,CAAW,EAEzC,IAAME,EAAcxB,EAAK,KAAKQ,EAAY,UAAW,UAAW,SAAS,EACzE,MAAMiB,GAAgBtB,EAAQqB,CAAW,EAEzC,IAAME,EAAa1B,EAAK,KAAKQ,EAAY,UAAW,UAAW,QAAQ,EACvE,MAAMmB,GAAexB,EAAQuB,CAAU,EAEvC,IAAME,EAAY5B,EAAK,KAAKQ,EAAY,UAAW,UAAW,OAAO,EAChEC,EAAWmB,CAAS,GACvB,MAAMC,GAAc1B,EAAQyB,CAAS,EAGnCzB,EAAO,QACT,MAAM2B,GAAc3B,EAAO,KAAMA,EAAO,OAAQD,CAAO,EAGzD,IAAM6B,EAAsB/B,EAAK,KAAKQ,EAAY,UAAW,UAAW,wBAAwB,EAChG,MAAMwB,GAAwB7B,EAAQ4B,CAAmB,EAEzD,MAAME,GAAwB9B,EAAQD,CAAO,EAC7C,MAAMgC,GAAgB/B,EAAQD,CAAO,EACrC,QAAQ,IAAI;AAAA;AAAA,CAAkC,CAChD,CAGO,IAAMiC,GAAYlC,GkBnGlB,IAAMmC,GAAgBC,IAC3BC,GAAqBD,CAAM,EACpBA,GCLT,OAAS,UAAAE,OAAc,UACvB,OAAOC,OAAU,OACjB,OAAOC,OAAa,UCFb,IAAMC,GAAN,cAAoC,KAAM,CAC/C,KAAO,wBACP,QAAU,oCACZ,EDCA,OAAS,UAAAC,OAAc,KACvB,OAAS,iBAAAC,OAAqB,MAC9B,OAAOC,OAAQ,KAGf,IAAMC,GAAc,CAAC,kBAAmB,mBAAoB,kBAAmB,kBAAkB,EAC3FC,GAAc,2BAEpB,eAAsBC,GAAWC,EAAuC,CACtEA,EAAa,MAAMC,GAAkBD,CAAU,EAC/C,GAAI,CACF,aAAME,GAAQ,MAAM,CAClB,YAAa,CAACF,CAAU,EACxB,OAAQ,MACR,QAASF,GAET,SAAU,OAEV,OAAQ,GAER,SAAU,UACZ,CAAC,EACDE,EAAa,MAAMC,GAAkBH,GAAa,EAAI,GAI9C,MAAM,OAAOE,EAAa,WAAW,KAAK,IAAI,MAAM,WAC9D,QAAE,CACAN,GAAOI,GAAa,CAAE,MAAO,EAAK,CAAC,CACrC,CACF,CAEA,eAAeG,GAAkBD,EAAgCG,EAAqB,CACpF,OAAIH,IAAe,OACjBA,EAAa,MAAMI,GAAkB,EAEhCC,GAAK,WAAWL,CAAU,IAC7BA,EAAaK,GAAK,KAAK,QAAQ,IAAI,EAAGL,CAAU,EAChDA,EAAaK,GAAK,UAAUL,CAAU,GAMnCG,GAAaP,GAAG,SAAS,IAAM,QAAUD,GAAcK,CAAU,EAAE,KAAOA,CACnF,CAEA,eAAeI,IAAoB,CACjC,IAAME,EAAe,MAAMC,GAAOV,EAAW,EAC7C,GAAIS,IAAiB,OACnB,MAAM,IAAIE,GAEZ,OAAOF,CACT,CEzDO,IAAKG,QACVA,EAAA,MAAQ,QACRA,EAAA,OAAS,SAFCA,QAAA","names":["prettier","prettierPluginMove","formatMove","content","prettierConfigPath","config","error","message","fs","path","createDebug","debug","error","debug","formatAndWriteMove","output","fullOutputPath","logPrefix","formattedOutput","fileHeader","initPrefix","code","deployHookPrefix","fs","path","debug","existsSync","fs","deleteFolderRecursive","path","file","curPath","package_default","generateToml","config","srcPrefix","code","package_default","formatAndWriteMove","existsSync","generateDeployHook","config","path","initialMode","modeComment","code","formatAndWriteMove","generateMigrate","srcPrefix","generateDappKey","config","path","code","formatAndWriteMove","existsSync","fs","generateSystemsAndTests","config","srcPrefix","toErrorConstName","key","w","getMessage","entry","generateError","projectName","errors","path","entries","name","constName","message","code","formatAndWriteMove","generateInitTest","config","path","dappSpecificHelpers","init_test_code","formatAndWriteMove","generateGenesis","config","path","initialMode","genesis_code","formatAndWriteMove","toSnakeCase","str","letter","generateEnums","config","path","enumName","values","sortedValues","a","b","code","generateEnumCode","formatAndWriteMove","projectName","enumValues","v","getDappModuleName","projectName","authArg","dappHubArg","_projectName","_isGlobal","dappHubParam","getStorageType","isGlobal","getStorageParamName","getRecordFns","mod","generateResources","config","path","componentName","resource","code","generateSimpleComponentCode","formatAndWriteMove","baseCode","generateComponentCode","extensionCode","generateAnnotationExtensions","valueType","type","isEnum","isBasicType","enumModule","toSnakeCase","isOffchain","storageType","storageParam","fns","readFunctions","buildParseExpr","storageImport","isEnumType","str","letter","fields","keys","offchain","global","isAllKeys","name","valueFields","valueFieldNames","isSingleValue","enumTypes","_","item","index","self","t","allEnumTypes","tableFunctions","generateTableFunctions","scenePermitImport","allFieldTypes","toBytesImport","hasStringField","hasVecStringField","hasStringValueField","n","asciiImportSimple","asciiImportMulti","e","structFields","constructorParams","constructorAssignments","getters","toPascalCase","setters","fieldType","bcsVar","enumType","getBcsType","buildFieldReadLines","fieldName","_idx","rawVar","includeStruct","acc","valueNames","keyParams","k","keyTupleCode","ctxParam","ctxArg","hasFunctions","fieldNamesLiteral","deleteFunction","getterSetters","fieldNamesVec","getSetFunctions","i","structFunctions","encodeDecodeFunctions","section","word","_index","innerType","comp","parts","auth","_vName","vType","allKeyParams","valueParams","allParams","keyArgs","setArgs","params","fName","fType","encodeExpr","objects","scenes","isFungible","isKeyed","idField","objKey","objCfg","objMarker","ObjStruct","objMod","svType","encodeRaw","peelExpr","sceneKey","sceneCfg","sceneMarker","SceneStruct","sceneMod","scenePermitType","scenePermitParam","scenePermitArg","sceneUserCall","sceneCtxArg","isUnique","tableNameExpr","listKeyParams","listRecordKeyLines","path","toPascalCase","str","word","getMoveType","t","objStorageType","markerName","generateFieldAccessors","objKey","cfg","storageType","lines","fieldName","fieldType","moveType","generateFungibleBagAccessors","resourceName","generateKeyedBagAccessors","idField","generateAcceptsFromTransfers","projectName","destKey","destAccepts","acceptsFrom","config","resources","allObjects","allScenes","destMarker","destStorageType","imports","functions","sourceName","sourceCfg","sourceAccepts","sourceMarker","commonResources","r","resCfg","comp","isSourceScene","qualifiedSourceMarker","sourceStorageType","sourceSceneCfg","sourcePermitType","sourcePermitParam","sourceIsPermitScene","sourceCallPrefix","sourceUserStorageParam","sourceUserStorageCall","sourceCtxParam","sourceCtxCall","generateObjects","outputDir","objCfg","storageAlias","typeTag","fieldAccessors","acceptedResources","bagAccessorParts","afImports","afFunctions","adminCheck","fullStorageTypeLocal","assertIdFn","entityIdFn","stringImport","hasKeyedAccepts","rc","hasFungibleAccepts","objNeedsFieldNotFound","objNeedsInsufficient","objNeedsDuplicate","objNeedsNoPermission","errorConstants","afImportBlock","fullStorageType","code","formatAndWriteMove","path","toPascalCase","str","word","generatePermits","config","outputDir","projectName","permitKey","markerName","permitTypeTag","fullPermitType","code","formatAndWriteMove","path","toPascalCase","str","word","getMoveType","t","sceneStorageType","markerName","permitMarker","config","cfg","permitType","generateFieldAccessors","sceneKey","storageType","permit","permitStorageType","lines","fieldName","fieldType","moveType","writeArgs","type","userStorageArg","writeCtxArg","setFieldCall","fieldExpr","valueExpr","removeFieldCall","generateFungibleBagAccessors","resourceName","generateKeyedBagAccessors","idField","generateAcceptsFromTransfers","projectName","destKey","destCfg","destAccepts","acceptsFrom","resources","allObjects","allScenes","destMarker","destStorageType","imports","functions","destPermit","destPermitArg","destCallPrefix","destCtxCall","sourceName","sourceCfg","sourceAccepts","sourceMarker","isSourceScene","qualifiedSourceMarker","sourceStorageType","sceneSourceCfg","sourcePermit","sourceIsPermitScene","sourcePermitArg","sourceCallPrefix","sourceUserStorageCall","sourceCtxCall","destIsPermitScene","destUserStorageCall","userStorageParam","ctxParam","commonResources","r","resCfg","comp","generateScenes","outputDir","sceneCfg","sceneTypeTag","fullSceneType","fieldAccessors","acceptedResources","bagAccessorParts","afImports","afFunctions","sceneStringImport","hasKeyedBagAccessors","hasFungibleBagAccessors","errorConstants","errorBlock","afImportBlock","createFns","code","formatAndWriteMove","generateUserStorageInit","config","path","code","formatAndWriteMove","chalk","existsSync","readFileSync","writeFileSync","path","resourceFields","entry","fields","k","v","objectOrSceneFields","buildLock","config","resources","name","objects","scenes","checkSection","section","oldSection","newSection","newFields","oldFields","field","oldType","checkAndUpdateLock","rootDir","lockPath","newLock","oldLock","chalk","warn","msg","validateConfigErrors","config","validateConfig","emitWarnings","resources","objects","permits","scenes","resourceKeys","objectKeys","permitKeys","sceneKeys","duplicates","k","acceptedResources","objKey","objCfg","r","res","isObject","isScene","sceneKey","sceneCfg","name","resource","comp","path","codegen","rootDir","config","network","initialMode","validateConfig","checkAndUpdateLock","projectDir","existsSync","deleteFolderRecursive","generateToml","genesisPath","generateGenesis","initTestPath","generateInitTest","dappKeyPath","generateDappKey","deployHookPath","generateDeployHook","resourcesPath","generateResources","objectsPath","generateObjects","permitsPath","generatePermits","scenesPath","generateScenes","enumsPath","generateEnums","generateError","userStorageInitPath","generateUserStorageInit","generateSystemsAndTests","generateMigrate","schemaGen","defineConfig","config","validateConfigErrors","findUp","path","esbuild","NotInsideProjectError","rmSync","pathToFileURL","os","configFiles","TEMP_CONFIG","loadConfig","configPath","resolveConfigPath","esbuild","toFileURL","getUserConfigPath","path","tsConfigPath","findUp","NotInsideProjectError","SubscriptionKind"]}