@abtnode/webapp 1.8.1 → 1.8.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["locales/en.js","locales/zh.js","components/node/agree-eula.js","components/node/connect-owner.js","components/node/verify-owner.js","components/node/upgrade/progress.js","components/node/login.js","components/health.js","components/error-fallback.js","components/root.js","components/notifications/list.js","hooks/width.js","components/notifications/default-icon-variants.js","components/notifications/notification.js","webpack:///./src/assets/logo.svg?6780","components/notifications/toast.js","components/layout/addon-notification.js","components/layout/index.js","components/layout/layout-route.js","components/global-subscriber.js","app.js","index.js","libs/util.js","../../../blocklet/meta/lib/util.js","../../ux/lib/toast.js","libs/node.js","../../constant/index.js","contexts/notification.js","libs/ws.js","contexts/node.js","libs/get-ip.js","../../ux/src/util/index.js","../../util/lib/url-evaluation/check-accessible-browser.js","libs/ensure-blocklet-interface.js","libs/fix-blocklet.js","../../util/lib/normalize-path-prefix.js","components/permission.js","libs/ensure-domain-aliases.js","contexts/routing.js","contexts/blocklets.js","hooks/query.js","../../util/lib/url-evaluation/index.js","../../ux/lib/hooks/use-passport-id.js","../../../blocklet/meta/lib/constants.js","../../auth/lib/util/get-auth-method.js","libs/history.js","contexts/session.js","../../ux/lib/layout/addon.js","components/notifications/tag.js","../../src/browser.js","../../util/lib/axios.js","locales/index.js","../../src/base.js"],"names":["flat","require","module","exports","setup","connect","title","scan","confirm","success","verify","accept","steps","eula","eulaFooter","basicSettings","complete","congratulation","redirectButton","login","loginTo","description","dialog","lostPassport","acceptServer","tooltip","sidebar","dashboard","blocklets","console","settings","system","total","used","free","cores","common","about","auditLogs","filter","category","timeAgo","afterTime","abtnode","accessKey","action","actions","add","address","allow","alreadyExist","approve","approved","author","avatar","back","basic","basicInfo","bind","blocklet","blockletsStorage","cacheStorage","cancel","certificate","click","close","collapseAll","community","componentBasicInfo","components","config","configuration","configSuccess","continueWith","copiedTip","copyTip","coreStorage","cpu","create","createSuccess","created","createdAt","createdBy","dAddress","dataStorage","delConfirm","delConfirmDescription","delete","deleteSuccess","detail","did","disk","diskInfo","docker","documentation","domain","downgradeTo","download","downloading","edit","email","empty","emptyData","enable","engine","env","environment","expandAll","expired","expires","export","externalIp","failed","fingerprint","finish","forbid","gitpod","goEULA","group","image","install","installed","installedAt","installSuccess","installing","internalIp","invite","inviting","ip","isPublic","issue","issuer","item","joined","key","lastPublishedAt","launcher","leavePageTip","loading","log","logStorage","logo","logout","manageTeam","marketplace","member","members","memory","meta","monitor","more","mountPoint","name","next","no","noData","notice","noticeTitle","open","management","os","overview","owner","page404","passport","permission","port","pre","protected","protocol","published","purchase","redirect","redirectCode","redirectPermanently","redirectTemporary","redirectUrl","reject","reload","remark","remove","requiredErrorText","resource","restart","retry","revoke","role","running","runtimeInfo","save","saveChanges","saveSuccess","scheduleFailed","scheduleSuccess","search","setting","start","status","stop","storage","store","support","team","the","type","unavailable","update","updateAvailable","updatedAt","updatedBy","upgrade","upgradeTo","upgrading","uptime","url","valid","value","version","visit","waiting","webhook","yes","invalidParam","launch","price","redirecting","error","reminder","normal","gateway","verifyNFT","notFound","installFromMarket","installFromUrl","installFromCreate","startedAt","stoppedAt","urlEmptyTip","goToAddRule","services","upstreamPort","noService","appDid","reloadSuccess","statusTip","initialUptime","fromUrl","label","step0","step1","existTipPrefix","existTipSuffix","stopDescription","confirmStop","cancelDownloadDescription","removeDescription","removeComponentDescription","forceRemoveDescription","removeKeepData","removeComponentKeepData","removeComplete","confirmRemove","removeComponentComplete","confirmComponentRemove","upgradeDescription","confirmUpgrade","confirmRestart","restartDescription","dev","modeTip","index","tableTitle","noBlocklet","admin","iframeTitle","noContent","securityError","disabledText","changedTip","user","configurationKey","configurationValue","keyValueRequired","invalidKey","deleteForbidden","missingRequired","gotoFix","tip","sk","clusterSize","deletable","walletType","passportColor","appUrl","component","source","deployedFrom","accessControl","viewInStore","publicToStore","publicInstanceTip","appDir","dataDir","logDir","cacheDir","noRunning","memoryUsage","cpuUsage","processId","dist","downloadLink","added","starting","stopping","stopped","deleting","corrupted","purchasing","purchased","verifying","list","star","checkUpdateTitle","updateTitle","noUpdate","selectComponent","selectRegistry","selectRegistryTip","selectInstance","selectInstanceTip","newInstance","noComponent","mountPointTip","titleTip","deleteDescription","stopBlocklet","notDynamic","choose","addWithName","installingCanCloseWindowTip","installSuccessTip","missDownloadTokenTip","purchaseComponentSecondCheckTip","installComponentError","downloadComponentError","addComponentTip","introduction","isFree","isPurchase","belowInformation","router","urlPath","securitySetting","checkUrlAccessible","urlInaccessible","noAccessibleUrl","domainLockTooltip","urlLockTooltip","nameTip","result","exportSource","resultTipStart","resultTipEnd","uploadedComponentTip","nodeDid","ownerDid","routingEngine","ownerNftURL","expirationLeft","renewal","nameSort","popularSort","headerDescription","blockletRegistry","changeFailed","addFailed","editFailed","switchRegistry","addRegistry","editRegistry","deleteRegistry","haveSameRegistry","registryName","registryUrl","registryNameEmpty","registryUrlEmpty","deleteDesc","confirmDesc","confirmed","declined","auth","autoLaunch","unSavedTip","unSavedLeaveTip","form","nameRequired","namePlaceholder","descriptionHolder","descriptionRequired","domainPlaceholder","domainRequired","ipPlaceholder","ipRequired","registry","registryPlaceholder","registryRequired","registerUrl","registerUrlPlaceholder","webWalletUrl","webWalletUrlPlaceholder","enableWelcomePage","welcome","switchLabel","restarting","cleanup","progress","check","latest","register","titleAdded","descriptionOnAdded","btn","addSucceed","updateSucceed","detecting","diskThreshold","diskThresholdPlaceholder","accessKeyId","lastUsed","saveSecretTip","iKnow","showSecret","hideSecret","descriptionNoTime","confirm_desc","remarkInvalid","delTitle","requiredError","test","columns","params","notification","viewAll","showRead","markAllAsRead","markAsRead","routerSetting","certSetting","defaultSite","urlHelperText","healthy","ok","service","select","what","nonProvider","validation","urlRequired","redirectCodeRequired","didRequired","pathPrefixTooLong","pathPrefixCannotBeEmpty","invalidUrl","pathPrefixRequired","redirectUrlRequired","validate","emptyTip","suffixTip","portTip","notResolved","https","bad","domainAlias","domainDescription","forceTip","domainSecurity","cors","domainInvalid","rule","pathPrefix","pathPrefixTip","cert","commonName","boundDomains","leftDays","issuedOn","expiryOn","fingerprintAlg","validityPeriod","matchedSites","upload","publicCertHelperText","nonPublicCertHelperText","protectedCertHelperText","unprotectedCertHelperText","issuing","sourceTypes","lets_encrypt","table","nodata","nginx","titleAdd","pem","pemTip","keyTip","invalidFile","genLetsEncryptCert","dnsTip","reqLimit","true","false","rate","ipHeaderLabel","ipHeaderDesc","noMatch","desc","health","connectionErrorTip","connectionRecoveryTip","connectionStoppedTip","wrongAccessUrlTip","debug","passports","lastLogin","forbidLogin","forbidLoginDescription","allowLogin","allowLoginDescription","updateRole","deleteUser","deleteUserDescription","revokePassport","revokePassportDescription","enablePassport","enablePassportDescription","passportPermissionTitle","hideBlockedMember","inviteDialog","createInviteLink","createSuccessTip","passportEmpty","transferNode","tips","newOwnerPermissions","delegateDialog","actionEmpty","resourceEmpty","permissionTooLong","descriptionTooLong","roleTip","permissionTip","transferLeftTitle","transferRightTitle","titleEmpty","titleTooLong","descriptionEmpty","issuance","pending","disableIssuance","enableIssuance","disableIssuanceTip","enableIssuanceTip","trustedPassportIssuers","trustedIssuers","externalPassport","notTrustedIssuerTip","issuerDid","addNodeToTrustedIssuers","revoked","noPermission","shouldNotDeleteCurrent","mappingRule","defaultRule","searchIssuerDid","issueBy","link","inviter","disabledTip","whoCanAccess","all","invited","provider","adminUrl","session","launchBlocklet","appInfo","appInfoDesc","alreadyRunning","alreadyInstalled","alreadyExists","selectAbtNode","nextStep","agreement","agreeAll","launchSuccess","openInRegistry","subTitle","installingSubTitle","access","viewApplication","newVersion","newVersionDesc","upgradeNow","later","abtnodeLicenseName","license","purchaseApp","setupAppDesc","launchAppDesc","launched","freeDescription","nonFreeDescription","authorizationTimeout","extracting","loadMetaFailed","appMetaNotFound","downloadFailed","installFailed","startFailed","launchFailed","installedButStopped","installedButError","upgradeFailed","notFoundTitle","notFoundDescription","transferNFTDialog","submit","disabled","enabled","AgreeEula","onGoToNext","theme","useTheme","useState","checked","setChecked","t","useContext","LocaleContext","Div","Box","textAlign","showText","style","width","height","transform","Typography","variant","className","FormControlLabel","control","Checkbox","onChange","x","color","checkedIcon","icon","onClick","display","alignItems","styled","div","palette","primary","main","props","breakpoints","values","md","NodeConnectOwner","info","useNodeContext","api","useSessionContext","useLocaleContext","locale","setOpen","getWebWalletUrl","prefix","window","apiPrefix","goDashboard","location","href","popup","checkFn","get","checkTimeout","socketUrl","onSuccess","decrypt","localStorage","setItem","sessionToken","setTimeout","messages","dialogStyle","onClose","NodeVerifyOwner","localeKey","stages","NodeUpgradeProgress","stage","setStage","setLoading","pooling","setPooling","useEffect","getSession","input","id","upgradeSessionId","then","includes","catch","err","message","useInterval","useSubscription","EVENTS","NODE_UPGRADE_PROGRESS","nextVersion","size","marginTop","List","map","i","currentIndex","indexOf","isDone","isProgress","ListItem","ListItemIcon","ListItemText","Paper","secondary","NodeLogin","loadingEle","node","NodeContext","SessionContext","extraParams","passportId","getPassportId","usePassportId","refresh","extraContent","Grid","container","justifyContent","spacing","xs","to","WELLKNOWN_SERVICE_PATH_PREFIX","Tooltip","placement","enterTouchDelay","defaultProps","HealthStatus","Health","setHealth","enqueueSnackbar","useSnackbar","nodeInfo","Number","host","origin","replace","endpoint","routing","adminPath","autoHideDuration","heartbeatTimer","client","getWsClient","tries","startHeartBeat","isConnected","heartbeatIntervalMs","clearInterval","timer","clearTimeout","NODE_STOPPED","Snackbar","anchorOrigin","vertical","horizontal","Alert","severity","ErrorFallback","resetErrorBoundary","minWidth","AlertTitle","GlobalStyle","createGlobalStyle","teal","A700","NotificationList","onHide","useNotificationContext","notifications","data","updateNotifications","setShowRead","isMarkingAll","setIsMarkingAll","history","useHistory","filtered","read","slice","hasUnRead","length","onUnreadNotifications","ids","join","readNotifications","Link","Divider","maxHeight","overflow","e","push","handleNotificationClick","ListItemAvatar","entityType","substr","toUpperCase","sm","light","useWidth","keys","reverse","reduce","output","matches","useMediaQuery","up","CheckIcon","SvgIcon","d","WarningIcon","ErrorIcon","InfoIcon","iconStyles","fontSize","marginInlineEnd","defaultIconVariants","warning","useStyles","makeStyles","breakpointsMap","xl","lg","backgroundColor","background","default","lessPadding","paddingLeft","contentRoot","typography","body2","padding","borderRadius","boxShadow","green","breakpoint","dark","amber","flex","marginLeft","marginRight","NotificationComponent","ref","keyId","classes","combinedClassname","variants","closeSnackbar","IconButton","forwardRef","_path","_path2","_defs","NotificationToast","NOTIFICATION_CREATE","_id","disableAutoHide","sticky","content","NotificationAddon","context","notificationOpen","setNotificationOpen","notificationAnchorRef","useRef","onCloseNotification","current","contains","target","unreadCount","prevOpen","Badge","badgeContent","max","Popper","anchorEl","disablePortal","ClickAwayListener","onClickAway","_excluded","_extends","Object","assign","arguments","prototype","hasOwnProperty","call","apply","this","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","SvgLogo","_ref","svgRef","titleId","viewBox","fill","xmlns","fillRule","clipRule","x1","y1","x2","y2","gradientUnits","stopColor","offset","ForwardRef","Dashboard","children","rest","useLocation","links","concat","mode","tagType","headerProps","brand","compact","responsive","copyable","prepend","brandAddon","addons","extraItems","legacy","FallbackComponent","resetKeys","pathname","DashboardLayoutRoute","Component","scrollable","fullWidth","render","StyledDashboardLayout","DashboardLayout","GlobalSubscriber","refreshNode","USER_UPDATED","teamDid","Toast","silent","NODE_UPDATED","BlockletList","lazy","BlockletDetail","BlockletStore","Settings","EULAPage","Console","Notifications","LogPage","TeamPage","IssuePassport","LostPassport","BlockletLauncher","NotFoundPage","Invite","useSharedContext","userDid","wsClient","disconnect","document","visibilityState","addEventListener","removeEventListener","ProtectedApp","initialized","getServerAuthMethod","fallback","exact","path","withUnprotected","PageComponent","App","changeLocale","query","useQuery","moment","queryStringLocale","WithRouter","withRouter","button","textTransform","overrides","MuiTableRow","root","head","contrastText","StyledEngineProvider","injectFirst","CssBaseline","translations","serviceHost","autoLogin","onReset","AppWrapper","basename","createRoot","getElementById","sleep","Promise","resolve","formatToDate","date","format","formatToDatetime","formatTime","formatError","Array","isArray","errors","formatLocale","isInProgress","isInstalling","isDownloading","formatDiskSize","serverPlatform","base","filesize","round","checkInputByType","typesMap","isUrl","formatPerson","person","u","web","mail","getBlockletServices","interfaces","BLOCKLET_INTERFACE_TYPE_SERVICE","forEach","external","ports","internal","shouldCheckDomainStatus","DOMAIN_FOR_IP_SITE","DOMAIN_FOR_IP_SITE_REGEXP","DOMAIN_FOR_DEFAULT_SITE","DOMAIN_FOR_INTERNAL_SITE","checkIsWildcardDomain","tempUrl","startsWith","urlObj","URL","decodeURIComponent","split","some","stringSortHandlerAsc","strA","strB","getEndPoint","hostname","getInviteLink","inviteId","joinURL","searchParams","set","getIssuePassportLink","formatRegistryLogoPath","asset","getItem","isValidClusterSize","cpuCores","v","isNaN","isInteger","isProtectedRole","ROLES","getBlockletLogoUrl","baseUrl","logoPath","getPathPrefix","getAccessibleUrl","urls","evaluateURLs","res","warn","isCertificateMatch","blockletUrls","blockletUrl","getBlockletUrlParams","__start__","isSafari","ua","navigator","userAgent","extractStatusUrlFromNextWorkflow","nextWorkflow","nextWorkflowURL","lastDecodeUrl","deepDecodeURIComponent","statusUrl","token","getBlockletMetaUrl","getAsset","chainHost","axios","post","JSON","stringify","headers","Accept","timeout","state","typeUrl","parse","getAssetExpiration","last","getRelativeTime","datetime","fromNow","toString","isNewRegistryUrl","blockletRegistryList","decoded","trim","trimEnd","Error","isNew","slugify","NODE_SERVICES","SLOT_FOR_IP_DNS_SITE","WHO_CAN_ACCESS","BlockletGroup","fromBlockletStatus","fromBlockletSource","BLOCKLET_INTERFACE_TYPE_WEB","BLOCKLET_CONFIGURABLE_KEY","getComponentId","ancestors","forEachBlocklet","cb","parallel","sync","inputParams","_parent","_root","_level","inputTasks","_tasks","_ancestors","newAncestors","parent","level","child","tasks","forEachBlockletSync","forEachChild","b","opt","getSharedConfigObj","ancestor","configs","secure","shared","find","findWebInterface","findServiceFromMeta","ServiceName","names","AUTH","AUTH_SERVICE","webInterface","isFreeBlocklet","payment","every","isComponentBlocklet","forEachChildSync","isDeletableBlocklet","environments","getAppMissingConfigs","missingConfigs","sharedConfigObj","required","getComponentMissingConfigs","wipeSensitiveData","configObj","environmentObj","hasRunnableComponent","has","getDisplayName","displayName","onlyUseMeta","fixBlockletStatus","undefined","getWhoCanAccess","ALL","replaceSlotToIp","urlFriendly","getComponentName","getComponentBundleId","bundleName","findComponentById","componentId","returnAncestors","defineProperty","ToastProvider","notistackRef","_react","createRef","onClickDismiss","_jsxRuntime","jsxs","_notistack","SnackbarProvider","jsx","_IconButton","_Close","_interopRequireDefault","obj","__esModule","ownKeys","object","enumerableOnly","symbols","sym","getOwnPropertyDescriptor","enumerable","_defineProperty","configurable","writable","noop","_success","_error","_warning","_info","genFn","opts","getOwnPropertyDescriptors","defineProperties","_objectSpread","_default","createClient","newClient","NodeClient","getLocale","setAuthToken","freeze","NODE_SERVICES_PREFIX","OWNER","ADMIN","MEMBER","GUEST","RBAC_CONFIG","roles","ci","permissions","grants","DAY_IN_MS","NODE_MODES","PRODUCTION","DEBUG","MAINTENANCE","IMMUTABLE","DEFAULT_DESCRIPTION","SETUP","INSTALLING","RESTARTING","CLEANUP","COMPLETE","ROLLBACK","VC_TYPE_BLOCKLET_PURCHASE","VC_TYPE_NODE_PASSPORT","VC_TYPE_GENERAL_PASSPORT","NFT_TYPE_SERVER_OWNERSHIP","NODE_PACKAGE_NAME","NODE_COMMAND_NAME","NODE_DATA_DIR_NAME","USER_AVATAR_DIR","USER_AVATAR_URL_PREFIX","PROCESS_NAME_DAEMON","PROCESS_NAME_PROXY","PROCESS_NAME_UPDATER","PROCESS_NAME_SERVICE","PROCESS_NAME_ROUTER","PROCESS_NAME_LOG_ROTATE","PROCESS_NAME_EVENT_HUB","NODE_REGISTER_URL","WEB_WALLET_URL","BLOCKLET_STORE_URL","BLOCKLET_STORE_URL_DEV","BLOCKLET_STORE_API_PREFIX","BLOCKLET_STORE_API_BLOCKLET_PREFIX","BLOCKLET_STORE_META_PATH","DEFAULT_DID_REGISTRY","DEFAULT_DID_DOMAIN","DEFAULT_IP_DOMAIN","DEFAULT_IP_DOMAIN_SUFFIX","DEFAULT_WILDCARD_CERT_HOST","DEFAULT_CERTIFICATE_EMAIL","CONFIG_FILENAME","CONFIG_FILENAME_OLD","CONFIG_FOLDER_NAME","CONFIG_FOLDER_NAME_OLD","EXPORTED_FOLDER_NAME","StatusCode","blocklet_not_found","blocklet_not_purchased","forbidden","IP","RegExp","NAME_FOR_WELLKNOWN_SITE","WELLKNOWN_PATH_PREFIX","WELLKNOWN_ACME_CHALLENGE_PREFIX","WELLKNOWN_DID_RESOLVER_PREFIX","WELLKNOWN_PING_PREFIX","DEFAULT_ADMIN_PATH","DEFAULT_SERVICE_PATH","DEFAULT_HTTP_PORT","DEFAULT_HTTPS_PORT","MAX_UPLOAD_FILE_SIZE","DEFAULT_DAEMON_PORT","BLOCKLET_PROXY_PATH_PREFIX","BLOCKLET_SITE_GROUP_SUFFIX","DAEMON_MAX_MEM_LIMIT_IN_MB","PROXY_MAX_MEM_LIMIT_IN_MB","BLOCKLET_MAX_MEM_LIMIT_IN_MB","CERTIFICATE_EXPIRES_OFFSET","ROUTING_RULE_TYPES","NONE","DAEMON","SERVICE","BLOCKLET","REDIRECT","GENERAL_PROXY","DIRECT_RESPONSE","genPermissionName","PASSPORT_STATUS","VALID","REVOKED","DISK_ALERT_THRESHOLD_PERCENT","ROUTING_UPDATED","NODE_STARTED","NODE_ADDED_OWNER","DOMAIN_STATUS","USER_ADDED","USER_REMOVED","CERT_ISSUED","CERT_UPDATED","CERT_ERROR","RELOAD_GATEWAY","INVITED","GATEWAY_REQ_LIMIT","min","STORE_DETAIL_PAGE_PATH_PREFIX","NotificationContext","createContext","Provider","Consumer","NotificationProvider","getClient","setNotifications","pageSize","pageCount","page","paging","setPaging","getData","getNotifications","old","WsClient","event","deps","on","off","NodeProvider","newInfo","setNewInfo","setError","getNodeInfo","retries","selected","startAt","Date","textDecoration","cache","fetch","getIp","getAccessUrl","endsWith","browserPort","URLSearchParams","append","controller","AbortController","abort","method","signal","ensureBlockletInterface","Boolean","fixBlocklet","Permission","can","withPermission","permissionName","hasPermission","ensureDomainAliases","domainAliases","DASHBOARD","RoutingContext","specialSites","sortDomainHandler","siteA","siteB","isSiteASpecial","isSiteBSpecial","getBlockletUrls","inputMountPoint","siteMap","site","domains","rules","formatDomains","sites","domainsAliases","isProtected","getMessage","msg","RoutingProvider","newSites","setNewSites","setDomains","allDomains","setAllDomains","useAsyncRetry","getRoutingSites","snapshotHash","dbSites","formattedDomains","updateSiteRules","siteId","s","takeSnapshot","takeRoutingSnapshot","dryRun","encodeURIComponent","restartEngine","addSite","addRoutingSite","updateSite","updateRoutingSite","findIndex","splice","deleteSite","deleteRoutingSite","delSite","addDomainAlias","force","deleteDomainAlias","addRule","addRoutingRule","from","updateRule","updateRoutingRule","deleteRule","ruleId","deleteRoutingRule","inputSites","nodePort","defaultDomain","corsAllowedOrigins","unshift","_site","items","parseInt","normalizePathPrefix","sortBy","sort","acc","generateSites","getBlockletUrl","inputDomain","useRoutingContext","isSpecialDomain","specialDomains","BlockletContext","BlockletProvider","setBlocklets","getBlocklets","updates","useCache","cur","getBlocklet","onInstallOrUpgrade","updateBlockletStatus","statusMap","BlockletEvents","removed","statusChange","deployed","upgraded","downgraded","updated","started","reloaded","useBlockletContext","checkURLAccessibleInBrowser","isIpAddress","isIpEcho","isCustomDomain","evaluateURL","options","checkAccessible","score","accessible","MIN_SAFE_INTEGER","results","a","_useLocalStorage","setPassportId","clearPassportId","fromEntry","entries","match","toEntry","BlockletStatus","downloaded","deleted","toBlockletStatus","BlockletSource","local","custom","toBlockletSource","static","dapp","starter","purchaseChange","BLOCKLET_INTERFACE_TYPE_WELLKNOWN","BLOCKLET_INTERFACE_TYPES","BLOCKLET_INTERFACE_PUBLIC","BLOCKLET_INTERFACE_WELLKNOWN","BLOCKLET_UI_INTERFACES","BLOCKLET_STANDARD_INTERFACES","BLOCKLET_INTERFACE_PROTOCOL_HTTP","BLOCKLET_INTERFACE_PROTOCOLS","BLOCKLET_GROUPS","BLOCKLET_PLATFORMS","BLOCKLET_ARCHITECTURES","BLOCKLET_MODES","DEVELOPMENT","BLOCKLET_FACTORY_SHARES","developer","BLOCKLET_INTERFACE_PROTOCOL_TCP","BLOCKLET_INTERFACE_PROTOCOL_UDP","BLOCKLET_DYNAMIC_PATH_PREFIX","BLOCKLET_DEFAULT_PORT_NAME","BLOCKLET_DEFAULT_PATH_REWRITE","BLOCKLET_RELEASE_FOLDER","BLOCKLET_RELEASE_FILE","BLOCKLET_BUNDLE_FOLDER","BLOCKLET_BUNDLE_FILE","BLOCKLET_ENTRY_FILE","BLOCKLET_META_FILE","BLOCKLET_META_FILE_ALT","BLOCKLET_META_FILE_OLD","BLOCKLET_DEFAULT_VERSION","BLOCKLET_LATEST_SPEC_VERSION","BLOCKLET_LATEST_REQUIREMENT_SERVER","BLOCKLET_LATEST_REQUIREMENT_ABTNODE","BLOCKLET_CLUSTER_SIZE","BLOCKLET_APP_NAME","BLOCKLET_APP_DESCRIPTION","BLOCKLET_APP_SK","BLOCKLET_APP_URL","BLOCKLET_PASSPORT_COLOR","BLOCKLET_WALLET_TYPE","BLOCKLET_DELETABLE","createBrowserHistory","createSessionContext","SessionProvider","SessionConsumer","withSession","HeaderAddon","_styledComponents","_propTypes","_reactRouterDom","_SessionManager","_selector","_context","_Globe","_QuestionMarkCircle","showLocale","showHelper","showSessionManager","sessionManagerProps","docPaths","cloneElement","pathName","showRole","propTypes","isRequired","string","array","bool","withConfig","down","NotificationTag","border","EventEmitter","_getSocketOptions","_getEventImplementation","en","zh","BaseClient","schema","constructor","httpEndpoint","dataSource","socketEndpoint","enableQuery","enableSubscription","enableMutation","maxQueryDepth","_authToken","_getSocketEndpoint","_getSchema","_getIgnoreFields","_getAuthHeaders","val"],"mappings":"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","file":"static/js/main.1cca8f63.chunk.js","sourcesContent":["const flat = require('flat');\n\nmodule.exports = flat({\n setup: {\n connect: {\n title: 'Signature Required',\n scan: 'Connect your DID Wallet to become the owner of this server',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your account is connected to this server',\n },\n verify: {\n title: 'Ownership Credential Required',\n scan: 'Connect your DID Wallet to provide ownership credentials',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your account is connected to this server',\n },\n accept: {\n title: 'Accepting server require ownership certificates',\n scan: 'Connect your DID Wallet to provide ownership credentials',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your account is connected to this server',\n },\n title: 'Setup Blocklet Server',\n steps: {\n eula: 'End User License Agreement',\n eulaFooter: 'I have read and agreed to the terms of the EULA',\n connect: 'Connect Owner DID Wallet',\n verify: 'Verify Ownership',\n basicSettings: 'Basic Settings',\n complete: 'Complete',\n },\n congratulation: 'Congratulations! Your Blocklet Server is secure and ready to use',\n redirectButton: 'Take me to dashboard!',\n },\n login: {\n loginTo: 'Connect to',\n description: 'Only server owner and approved members can access the dashboard',\n dialog: {\n title: 'Connect DID Wallet',\n scan: 'Connect your DID Wallet to provide passport',\n confirm: 'Confirm on your DID Wallet',\n success: 'You are successfully connected',\n },\n },\n lostPassport: {\n title: 'Lost Passport?',\n },\n acceptServer: {\n title: 'Claim Server with Ownership NFT',\n tooltip: 'If you received a server ownership nft, you can claim your owner passport with this link.',\n },\n sidebar: {\n dashboard: 'Dashboard',\n blocklets: 'Blocklets',\n console: 'Console',\n settings: 'Settings',\n },\n system: {\n total: 'Total',\n used: 'Used',\n free: 'Free',\n cores: 'Number of cores',\n },\n common: {\n about: 'About',\n auditLogs: 'Audit Logs',\n filter: 'Log Filter',\n category: 'Log Topic',\n timeAgo: '{time} ago',\n afterTime: 'After {time}',\n abtnode: 'Blocklet Server',\n accessKey: 'Access Keys',\n action: 'Action',\n actions: 'Actions',\n add: 'Add',\n address: 'Address',\n allow: 'Allow',\n alreadyExist: 'already exists',\n approve: 'Approve',\n approved: 'approved',\n author: 'Author',\n avatar: 'Avatar',\n back: 'Back',\n basic: 'Basic',\n basicInfo: 'Basic Information',\n bind: 'Bind',\n blocklet: 'Blocklet',\n blocklets: 'Blocklets',\n blockletsStorage: 'Blocklets Storage',\n cacheStorage: 'Cache Storage',\n cancel: 'Cancel',\n certificate: 'certificate',\n click: 'Click to copy',\n close: 'Close',\n collapseAll: 'Collapse All',\n community: 'Community',\n complete: 'Complete',\n componentBasicInfo: 'Component Basic Information',\n components: 'Components',\n config: 'Configure',\n configuration: 'Configuration',\n configSuccess: 'Config successfully',\n confirm: 'Confirm',\n console: 'Console',\n continueWith: 'Continue With',\n copiedTip: 'Copied',\n copyTip: 'Click To Copy',\n coreStorage: 'Core Storage',\n cpu: 'CPU',\n create: 'Create',\n createSuccess: 'Create Access Key',\n created: 'Created At',\n createdAt: 'Created At',\n createdBy: 'Created By',\n dAddress: 'Decentralized Identifiers (DID)',\n dataStorage: 'Data Storage',\n delConfirm: 'Delete',\n delConfirmDescription: 'Confirm delete?',\n delete: 'Delete',\n deleteSuccess: 'Successfully deleted',\n description: 'Description',\n detail: 'Detail',\n did: 'DID',\n disk: 'Disk',\n diskInfo: 'Disk Info',\n docker: 'IS Docker',\n documentation: 'Documentation',\n domain: 'Domain',\n downgradeTo: 'Downgrade to',\n download: 'Download',\n downloading: 'Downloading',\n edit: 'Edit',\n email: 'Email',\n empty: 'Empty',\n emptyData: 'No results found',\n enable: 'Enable',\n engine: 'Engine',\n env: 'Environment',\n environment: 'Environment',\n expandAll: 'Expand All',\n expired: 'Expired',\n expires: 'Expires',\n export: 'Export',\n externalIp: 'External IP',\n failed: 'failed',\n fingerprint: 'Fingerprint',\n finish: 'Finish',\n forbid: 'Forbid',\n free: 'Free',\n gitpod: 'IS Gitpod',\n goEULA: 'Click to view \"End User License Agreement\"',\n group: 'Group',\n image: 'IS Image',\n install: 'Install',\n installed: 'Installed',\n installedAt: 'Installed At',\n installSuccess: 'Successfully installed',\n installing: 'Installing',\n internalIp: 'Internal IP',\n invite: 'Invite',\n inviting: 'Inviting',\n ip: 'IP',\n isPublic: 'Public',\n issue: 'Issue',\n issuer: 'Issuer',\n item: 'Item',\n joined: 'Joined',\n key: 'Key',\n lastPublishedAt: 'Published At',\n launcher: 'Launcher Information',\n leavePageTip: 'Are you sure to leave the page?',\n loading: 'loading',\n log: 'View Logs',\n logStorage: 'Log Storage',\n login: 'Login',\n logo: 'Logo',\n logout: 'Logout',\n manageTeam: 'Manage Team',\n marketplace: 'Marketplace',\n member: 'Member',\n members: 'Members',\n memory: 'Memory',\n meta: 'Meta Data',\n monitor: 'Monitor',\n more: 'More',\n mountPoint: 'MountPoint',\n name: 'Name',\n next: 'Next',\n no: 'No',\n noData: 'No records to display',\n notice: 'Unexpected bad things will happen if you don’t read this!',\n noticeTitle: 'Notice',\n open: 'Open',\n management: 'Management',\n os: 'Operating System',\n overview: 'Overview',\n owner: 'Owner',\n page404: '404 Page',\n passport: 'Passport',\n permission: 'Permission',\n port: 'Port',\n pre: 'Previous',\n protected: 'Protected',\n protocol: 'Protocol',\n published: 'published',\n purchase: 'Purchase',\n redirect: 'Redirect',\n redirectCode: 'Redirect Code',\n redirectPermanently: 'Permanent Redirect',\n redirectTemporary: 'Temporary Redirect',\n redirectUrl: 'Redirect URL',\n reject: 'Reject',\n reload: 'Reload',\n remark: 'Remark',\n remove: 'Remove',\n requiredErrorText: '{name} is required',\n resource: 'Resource',\n restart: 'Restart',\n retry: 'Retry',\n revoke: 'Revoke',\n role: 'Role',\n running: 'running',\n runtimeInfo: 'Runtime Info',\n save: 'Save',\n saveChanges: 'Save Changes',\n saveSuccess: 'Saved successfully',\n scheduleFailed: 'schedule failed',\n scheduleSuccess: 'successfully scheduled',\n search: 'Search',\n setting: 'Settings',\n start: 'Start',\n status: 'Status',\n stop: 'Stop',\n storage: 'Storage',\n store: 'Store',\n success: 'success',\n support: 'Support',\n team: 'Team',\n the: 'The',\n title: 'Title',\n type: 'Type',\n unavailable: 'Unavailable',\n update: 'Update',\n updateAvailable: 'New version {version} available',\n updatedAt: 'Updated At',\n updatedBy: 'Updated By',\n upgrade: 'Upgrade',\n upgradeTo: 'Upgrade to',\n upgrading: 'Upgrading',\n uptime: 'Uptime',\n url: 'URL',\n valid: 'Valid',\n value: 'Value',\n version: 'Version',\n visit: 'Visit',\n waiting: 'Waiting',\n webhook: 'Integrations',\n yes: 'Yes',\n invalidParam: 'Invalid Params',\n launch: 'Launch',\n price: 'Price',\n redirecting: 'Redirecting',\n error: 'Error',\n reminder: 'Reminder',\n normal: 'Normal',\n gateway: 'Gateway',\n verifyNFT: 'Verify NFT',\n },\n blocklet: {\n notFound: 'Blocklet not found on this server, maybe it has been deleted',\n installFromMarket: 'Install New Blocklets',\n installFromUrl: 'Install From Url',\n installFromCreate: 'Create Blocklet',\n installedAt: 'Installed At',\n startedAt: 'Started At',\n stoppedAt: 'Stopped At',\n urlEmptyTip: 'No Access URL, ',\n goToAddRule: 'Go To Add',\n services: 'Exposed Services',\n upstreamPort: 'Upstream Port',\n noService: 'No Services',\n appDid: 'App DID',\n reloadSuccess: 'Blocklet was reloaded successfully',\n statusTip: 'Blocklet is {status}',\n initialUptime: 'Less than 1m',\n fromUrl: {\n title: 'Install Blocklet',\n label: 'Blocklet Meta URL',\n description: 'The URL should point to the Meta File of the Blocklet',\n confirm: 'Install',\n step0: 'Input URL',\n step1: 'Confirm Meta Info',\n existTipPrefix: 'Blocklet with the same DID already exists, the version is',\n existTipSuffix: ', Please install a higher version.',\n },\n action: {\n stopDescription:\n 'Stopping the blocklet will make its public interfaces unaccessible, which may cause end user failures',\n confirmStop: 'Yes, Stop It',\n cancelDownloadDescription: 'Cancel download {name} ?',\n removeDescription:\n 'Removing the blocklet will erase code and data generated by this blocklet, which is not recoverable if you do not have any backups',\n removeComponentDescription:\n 'Removing the component will erase code and data generated by this component, which is not recoverable if you do not have any backups',\n forceRemoveDescription: 'Deleting this Blocklet will delete all data',\n removeKeepData: 'Keep data for this blocklet, only remove code',\n removeComponentKeepData: 'Keep data for this component, only remove code',\n removeComplete: 'Remove both code and data for this blocklet',\n confirmRemove: 'Yes, Remove It',\n removeComponentComplete: 'Remove both code and data for this component',\n confirmComponentRemove: 'Yes, Remove It',\n upgradeDescription: 'Upgrading the blocklet will make it temporarily unavailable, are you sure to continue?',\n confirmUpgrade: 'Yes, Upgrade It',\n confirmRestart: 'Yes, Restart It',\n restartDescription:\n 'Restarting the blocklet will temporarily suspended and may not start because of a configuration change',\n },\n dev: {\n modeTip: 'Please switch Blocklet Server to DEBUG mode',\n },\n index: {\n tableTitle: 'Manage Your Blocklets',\n noBlocklet: 'No blocklets found in this Blocklet Server, install a blocklet from market place to start.',\n },\n admin: {\n iframeTitle: 'Blocklet Admin Interface',\n title: 'Admin Interface',\n noContent: 'This blocklet does not have a admin interface',\n securityError: 'SecurityError: Can not open the admin url from accessing a cross-origin frame',\n },\n config: {\n iframeTitle: 'Blocklet Config Interface',\n noContent: 'This blocklet does not have a config interface',\n securityError: 'SecurityError: Can not open the config url from accessing a cross-origin frame',\n title: 'Config Interface',\n disabledText: 'Please edit environment variables in \".env\" file or \"blocklet.yml\" file',\n changedTip: 'Configuration updated, please restart Blocklet',\n user: {\n title: 'User Configuration',\n configurationKey: 'Configuration key',\n configurationValue: 'Configuration value',\n keyValueRequired: 'Configuration key and value must be specified',\n invalidKey: 'Configuration key must not start with BLOCKLET_',\n deleteForbidden: 'This configuration is required and should not be deleted',\n missingRequired: 'Missing required configuration to start the blocklet',\n gotoFix: 'Go to fix',\n tip: 'Configurations prefixed with BWA_ should not contain sensitive information because they will be sent to the browser',\n },\n blocklet: {\n title: 'Blocklet Configuration',\n name: 'Application name that can be displayed in frontend and DID Wallet',\n description: 'Application description that can be displayed in frontend and DID Wallet',\n sk: 'Secret key for the application wallet',\n clusterSize: 'Instance count when run this blocklet in cluster mode',\n deletable: 'Whether this blocklet can be deleted, can only be set to \"yes\" or \"no\"',\n walletType: 'Blocklet instance wallet type, will change the derived DID',\n passportColor: 'Customize color for passports issued by this blocklet, set to \"auto\" to generate from App DID',\n appUrl: 'Blocklet permanent URL',\n },\n component: {\n title: 'Component Configuration',\n description: 'The component configuration will be overwritten by the user configuration if duplicated.',\n },\n system: {\n title: 'System Configuration',\n },\n },\n overview: {\n source: 'Source',\n deployedFrom: 'Deployed From',\n accessControl: 'Access Control',\n viewInStore: 'View It In Store',\n publicToStore: 'Make this app public on Store',\n publicInstanceTip:\n 'The access address of this app will be displayed in the Store (along with your DID for accepting donations)',\n },\n diskInfo: {\n empty: 'Disk info not available now!',\n appDir: 'App Directory',\n dataDir: 'Data Directory',\n logDir: 'Log Directory',\n cacheDir: 'Cache Directory',\n },\n runtimeInfo: {\n noRunning: 'Runtime information will be available when blocklet is running!',\n memoryUsage: 'Memory Usage',\n cpuUsage: 'CPU Usage',\n uptime: 'Uptime',\n port: 'Port',\n processId: 'Process ID',\n },\n dist: {\n downloadLink: 'Download Link',\n verify: 'Verify',\n },\n status: {\n added: 'Added',\n waiting: 'Waiting',\n downloading: 'Downloading',\n installing: 'Installing',\n upgrading: 'Upgrading',\n installed: 'Installed',\n created: 'Created',\n starting: 'Starting',\n running: 'Running',\n stopping: 'Stopping',\n stopped: 'Stopped',\n error: 'Error',\n deleting: 'Deleting',\n corrupted: 'Corrupted',\n purchasing: 'Waiting for purchase',\n purchased: 'Purchased',\n verifying: 'Verifying purchase',\n },\n list: {\n download: 'Download',\n star: 'Star',\n },\n component: {\n checkUpdateTitle: 'Check for Updates',\n updateTitle: 'Update Components',\n noUpdate: 'No components to update',\n add: 'Add Component',\n selectComponent: 'Select Component',\n selectRegistry: 'Select Blocklet Store',\n selectRegistryTip: 'You can switch blocklet store to see more components',\n selectInstance: 'Select Instance',\n selectInstanceTip:\n 'You can select an existing instance or create a new instance. Existing instances will use previously saved configuration and data',\n newInstance: 'Create New Instance',\n noComponent: 'No components',\n mountPoint: \"What's the mount point?\",\n mountPointTip:\n \"If you set mount point to '/my-prefix', then all requests that begins with that mount point will be routed to the selected component\",\n titleTip: 'You can customize different titles for identical components',\n delete: 'Delete Component',\n deleteDescription: 'This component will not be accessible after deletion. Confirm delete?',\n purchase: 'Payment Required',\n tip: {\n stopBlocklet: 'Please stop running Blocklet first',\n notDynamic: 'Only dynamically added component can be removed',\n },\n choose: 'Choose',\n addWithName: 'Add Component To {name}',\n installingCanCloseWindowTip: 'Installing component in the background, you can safely close this window',\n installSuccessTip: 'Congratulations, the component was installed successfully!',\n missDownloadTokenTip: 'Cannot add paid component without a valid download token',\n purchaseComponentSecondCheckTip: 'Please present your blocklet purchase NFT to continue',\n installComponentError: 'There was an error installing the component, please retry again',\n downloadComponentError: 'There was an error downloading the component, please retry again',\n addComponentTip: {\n introduction: 'Welcome to the Add Component Wizard',\n isFree: 'You can use <b>{name}</b> as a component for free;',\n isPurchase: 'You need to Verify NFT before use <b>{name}</b> as a component;',\n belowInformation: 'Below is the information for the component: ',\n verifyNFT: 'Please select the Verify NFT method',\n config: 'Please fill in the configuration of the component',\n environment: 'Please fill in the environment of the component',\n fromUrl: 'Add Component From Url',\n },\n },\n router: {\n urlPath: 'URL Path',\n noRunning: 'The blocklet is not currently started. Unable to access through the following address!',\n securitySetting: 'Security Setting',\n checkUrlAccessible: 'Check the accessibility of the address',\n urlInaccessible: 'It may be due to network reasons, the address is temporarily inaccessible',\n noAccessibleUrl: 'No accessible URL',\n domainLockTooltip: 'The system generated Domain cannot be edited.',\n urlLockTooltip: 'The system generated URL Path cannot be edited.',\n },\n export: {\n title: 'Export Blocklet',\n name: 'Bundle Name',\n nameTip: 'e.g. \"my-blocklet-name\" or \"@my-scope/blocklet-name\"',\n result: \"What's next\",\n exportSource: 'Export Source',\n success: 'Blocklet successfully exported',\n resultTipStart: 'With',\n resultTipEnd: 'you can build and publish this blocklet within minutes',\n uploadedComponentTip: 'Directly uploaded components cannot be exported:',\n },\n },\n dashboard: {\n nodeDid: 'Node',\n ownerDid: 'Owner',\n routingEngine: 'Routing Engine',\n ownerNftURL: 'Owner NFT',\n expirationLeft: 'Expiration Left',\n renewal: 'Renewal',\n },\n store: {\n nameSort: 'Name',\n popularSort: 'Popularity',\n headerDescription: 'Find and Install Your Blocklets',\n detail: {\n purchase: 'Purchase {name}',\n open: 'Open {name}',\n install: 'Install {name}',\n upgrade: 'Upgrade {name}',\n empty: 'No introduction',\n },\n blockletRegistry: {\n changeFailed: 'Change Blocklet Store Failed: ',\n addFailed: 'Add Blocklet Store Failed: ',\n editFailed: 'Edit Blocklet Store Failed: ',\n switchRegistry: 'Switch Blocklet Store',\n addRegistry: 'Add Blocklet Store',\n editRegistry: 'Edit Blocklet Store',\n deleteRegistry: 'Delete Blocklet Store',\n haveSameRegistry: 'The same blocklet store exists',\n registryName: 'Blocklet Store Name',\n registryUrl: 'Blocklet Store URL',\n registryNameEmpty: 'Blocklet Store name cannot be empty',\n registryUrlEmpty: 'Blocklet store url cannot be empty',\n deleteDesc:\n 'Confirm Delete blocklet store {name} ?<br/><span style=\"color: {color}\">*After removing this blocklet store, you cannot update the apps installed from this blocklet store unless you add them again.</span>',\n confirmDesc: 'Please input {name} to delete',\n },\n purchase: {\n title: 'Purchase {name}',\n confirmed: 'Your blocklet purchase NFT is verified',\n declined: 'You do not provided valid the blocklet purchase NFT',\n waiting: 'Waiting for purchase complete...',\n purchase: {\n title: 'Purchase NFT',\n description: 'Pay some token before installing this blocklet if you have not purchased this blocklet',\n },\n verify: {\n title: 'Verify NFT',\n description:\n 'Your NFT will be verified before installing this blocklet if you have purchased and hold the purchase NFT in your DID Wallet',\n auth: {\n title: 'Purchase Credential Required',\n scan: 'Connect DID Wallet to provide blocklet purchase NFT',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Your purchase NFT is verified, and installing has started',\n },\n },\n auth: {\n title: 'Purchase {name}',\n scan: 'Scan following QRCode with your DID Wallet',\n confirm: 'Confirm on your DID Wallet',\n success: 'Purchase NFT sent to your DID Wallet',\n },\n launch: 'Launch {name}',\n autoLaunch: '{name} successfully purchased, redirecting to launch page...',\n },\n },\n setting: {\n saveSuccess: 'Settings Saved Successfully',\n unSavedTip: 'There are unsaved changes, please click \"Save Changes\" to save them.',\n unSavedLeaveTip: 'There are unsaved changes, are you sure to leave the page?',\n form: {\n name: 'Name Your Server',\n nameRequired: 'Server description is required',\n namePlaceholder: 'Server Name',\n description: 'Describe Your Server',\n descriptionHolder: 'Server Description',\n descriptionRequired: 'Server description is required',\n domain: 'Your Server Domain Name',\n domainPlaceholder: 'Server Domain Name',\n domainRequired: 'Server domain is required',\n ipPlaceholder: 'IP',\n ipRequired: 'IP is required',\n registry: 'Blocklet Store',\n registryPlaceholder: 'Blocklet store to fetch blocklets',\n registryRequired: 'Blocklet store is required ',\n registerUrl: 'Blocklet Launcher URL',\n registerUrlPlaceholder: 'Input the URL of your preferred Blocklet Launcher, you can use the official one safely',\n webWalletUrl: 'DID Wallet URL',\n webWalletUrlPlaceholder: 'Please input the URL of your hosted \"DID Wallet\", you can use the official one safely',\n enableWelcomePage: 'Enable welcome page',\n welcome: {\n switchLabel: 'Welcome Page',\n },\n upgrade: {\n title: 'Upgrade Blocklet Server to v{version}',\n description:\n 'During the upgrade, your Blocklet Server will enter maintenance mode for a few minutes while the update is completed.',\n dialog:\n 'Click on \"confirm\" to install the update. Blocklet Server will enter maintenance mode until the update is completed and return to production mode automatically.',\n confirm: 'Upgrade',\n switchLabel: 'Auto Update Check',\n setup: 'Preparing the update',\n installing: 'Installing Blocklet Server v{version}',\n restarting: 'Restarting Blocklet Server',\n cleanup: 'Migrating Blocklet Server data',\n complete: 'Upgrade complete!',\n progress: 'Upgrading Blocklet Server to v{version}',\n check: 'Check for Updates',\n latest: 'You are running the latest version.',\n },\n register: {\n titleAdded: 'Added to Blocklet Launcher',\n title: 'Add to Blocklet Launcher',\n description: 'Once added, you can launch blocklets to this blocklet server from {url}.',\n descriptionOnAdded: 'you can launch blocklets to this blocklet server from {url}.',\n btn: 'Add',\n update: 'Update',\n added: 'Added',\n addSucceed: 'Add succeed',\n updateSucceed: 'Update succeed',\n detecting: 'Detecting',\n },\n monitor: {\n diskThreshold: 'Send alert when disk usage exceeds (%)',\n diskThresholdPlaceholder: 'Please set the disk usage alert threshold',\n },\n },\n accessKey: {\n accessKeyId: 'ACCESS KEY',\n lastUsed: 'Last Used At',\n tip: 'Please enter a name for this access key for future reference:',\n saveSecretTip:\n 'This is the only time that your Access Secret key can be viewed and cannot be recovered. However, you can create new access keys at any time',\n iKnow: 'I have copied and saved the Access Secret',\n showSecret: 'Show Secret Access Key',\n hideSecret: 'Hide Secret',\n title: 'Delete Access Key',\n descriptionNoTime:\n 'This will permanently delete the access key {key} with name {name}, which is (never used before)',\n description:\n 'This will permanently delete access key {key} with name {name}, which is (last used on {time}, {timeAge})',\n confirm_desc: 'Please input {name} to delete',\n remark: 'Access Key Name',\n remarkInvalid: 'Access Key Name is required',\n },\n webhook: {\n add: 'Add Integration',\n delTitle: 'Delete Integration',\n requiredError: 'Please provide a valid {type}',\n confirm_desc: 'Please input {name} to delete',\n test: 'Test',\n description: 'This will permanently delete integration with ID {id}',\n columns: {\n description: 'ID',\n params: 'Params',\n createdAt: 'createdAt',\n },\n },\n },\n notification: {\n title: 'Activities',\n empty: 'No activities yet',\n viewAll: 'View All',\n showRead: 'Show Read',\n markAllAsRead: 'Mark All as Read',\n markAsRead: 'Mark As Read',\n },\n router: {\n routerSetting: 'Domains & URLs',\n certSetting: 'SSL Certificates',\n defaultSite: 'Default',\n urlHelperText: 'URL that do not start with HTTP/HTTPS are considered relative paths',\n\n empty: 'Click on Actions to setup URL Mapping',\n\n healthy: {\n ok: 'Blocklet or service is running',\n error: 'Blocklet or service is not running or not installed',\n },\n\n service: {\n select: 'Select Blocklet Services (Optional)',\n what: 'Blocklet Services are pipelines executed against the request before redirecting to upstream blocklet',\n },\n\n nonProvider: {\n title: 'Engine Change Warning',\n description:\n 'If you change engine to none, your current page may not work properly because the previous engine will be stopped, are you sure to continue?',\n confirm: 'I understand, continue',\n },\n\n validation: {\n urlRequired: 'URL is required',\n redirectCodeRequired: 'Redirect code is required',\n didRequired: 'Blocklet is required',\n pathPrefixTooLong: 'The URL Prefix cannot exceed {length} characters',\n pathPrefixCannotBeEmpty: 'The URL Prefix cannot be empty',\n domainRequired: 'Server domain is required',\n invalidUrl: 'Please provide a valid URL',\n pathPrefixRequired: 'URL prefix is required',\n redirectUrlRequired: 'Redirect URL is required',\n },\n\n domain: {\n validate: {\n emptyTip: 'Site domain cannot be empty',\n suffixTip: 'Site domain cannot include {suffix}',\n },\n add: {\n title: 'Add Site',\n description: 'Please provide a valid site name address',\n confirm: 'Add',\n cancel: 'Cancel',\n blocklet: 'Select the blocklet to handle the traffic',\n redirect: 'Where to redirect the traffic?',\n port: 'What port does your request handler need to listen to?',\n portTip: 'This defaults to the main port of request handler, you can customize this',\n type: 'Traffic Handler',\n },\n update: {\n title: 'Update Site Domain',\n label: 'Site Domain',\n description: 'Please provide a valid site domain',\n },\n verify: {\n ok: 'This site is resolved',\n notResolved: 'This site neither resolved nor accessible, please check your DNS configuration',\n },\n https: {\n ok: 'This domain has https enabled',\n bad: 'This domain has not enabled https',\n },\n delete: {\n title: 'Delete Site',\n description:\n 'By confirming, you will delete your existing \"{name}\" site. Type \"{name}\" below and select Delete to complete the change, or select Cancel if you want to leave your site',\n confirm_desc: 'Please input {name} to confirm',\n },\n },\n\n domainAlias: {\n add: {\n title: 'Add Additional Domain',\n domainDescription: 'Please provide a valid domain name',\n forceTip: 'Force add if domain name already exists',\n },\n delete: {\n title: 'Delete',\n description: 'After removing a domain alias, access to that alias may not be handled properly.',\n },\n },\n\n domainSecurity: {\n title: 'Update Domain Security',\n cors: {\n title: 'Allowed CORS Domains',\n description:\n 'Domain list that can send cross origin requests to {name}, comma separated, use \"*\" to allow anyone, which is not recommended',\n domainInvalid: 'Please input a valid list of domain names',\n },\n },\n\n rule: {\n add: {\n title: 'Add URL Mapping',\n confirm: 'Add',\n pathPrefix: \"What's the URL Prefix?\",\n pathPrefixTip:\n \"If you set prefix to '/my-prefix', then all requests that begins with that prefix will be routed to the configured blocklet\",\n blocklet: 'Which Blocklet will be handling those requests?',\n port: 'Which port of the blocklet will be handling requests?',\n portTip:\n 'This defaults to the main port of blocklet, if your blocklet listens on multiple ports, you can customize this',\n },\n delete: {\n title: 'Delete URL Mapping',\n description:\n 'By confirming, you will delete your existing \"{name}\" URL Mapping. Type \"{name}\" below and select Delete to complete the change, or select Cancel if you want to leave your URL Mapping.',\n confirm_desc: 'Please input {name} to delete',\n cancel: 'Cancel',\n },\n update: {\n title: 'Update URL Mapping',\n confirm: 'Yes, Update',\n cancel: 'Cancel',\n },\n },\n\n cert: {\n name: 'Certificate Name',\n domain: 'Domain Name',\n action: 'Action',\n commonName: 'Common Name',\n boundDomains: 'Domains',\n source: 'Source',\n expired: 'Expired',\n leftDays: ' days left',\n issuedOn: 'Issued On',\n expiryOn: 'Expiry On',\n fingerprintAlg: 'Fingerprint Algorithm',\n validityPeriod: 'Validity Period',\n matchedSites: 'Matched Sites',\n upload: 'Manual Upload',\n publicCertHelperText: 'Public certificates can be downloaded',\n nonPublicCertHelperText: 'Non-public certificates cannot be downloaded',\n protectedCertHelperText: 'Protected certificates cannot be edited',\n unprotectedCertHelperText: 'Unprotected certificates can be edited',\n issuing: 'Certificate being generated',\n sourceTypes: {\n upload: 'Manual Upload',\n lets_encrypt: \"Let's Encrypt\",\n },\n table: {\n nodata: 'No data',\n },\n delete: {\n title: 'Delete Certificate',\n description: 'Confirm delete?',\n confirm: 'Confirm',\n },\n nginx: {\n title: 'Update Certificate',\n titleAdd: 'Add Certificate',\n pem: 'SSL Certificate File',\n pemTip: 'Please drop your server certificate file here, it should ends with \".pem\" or \".crt\"',\n key: 'Private Key File',\n keyTip: 'Please drop your server private key file here, it should ends with \".pem\" or \".key\"',\n confirm: 'Save',\n cancel: 'Cancel',\n invalidFile: 'You have selected an invalid file',\n empty: 'No file selected yet',\n source: 'Source',\n sourceTypes: {\n upload: 'Manual Upload',\n lets_encrypt: \"Let's Encrypt\",\n },\n },\n detail: {\n title: 'Certificate Details',\n },\n genLetsEncryptCert: {\n title: \"Generate Let's Encrypt certificate\",\n dnsTip: 'Please make sure the domain name has point to the current Blocklet Server.',\n description:\n 'Adding a certificate will make the service more secure, and Blocklet Server will automatically renew the certificate before it expires.',\n },\n },\n gateway: {\n reqLimit: {\n status: {\n true: 'Enabled',\n false: 'Disabled',\n },\n switchLabel: 'Request Limit',\n rate: 'Request Limit({rate} Request/Second)',\n ipHeaderLabel: 'Customize client IP header(Optional)',\n ipHeaderDesc:\n \"If the Blocklet Server is running behind some proxies, you can set the header of the client's real IP here. Optional, leave empty to use default.\",\n },\n },\n },\n noMatch: {\n desc: \"We can't find the page that you're looking for\",\n },\n health: {\n connectionErrorTip:\n \"Blocklet Server can't connect to the network, please check if Blocklet Server has been stopped or there is a network issue\",\n connectionRecoveryTip: 'Blocklet Server connectivity has been recovered',\n connectionStoppedTip: 'Blocklet Server has been stopped',\n wrongAccessUrlTip: 'Blocklet Server access address is wrong, please use the correct access address',\n },\n debug: {\n title: 'Your Blocklet Server is up and running!',\n },\n team: {\n invite: 'Invite New',\n add: 'Add New',\n member: {\n name: 'Name',\n passport: 'Passport',\n passports: 'Passports',\n lastLogin: 'Last Login',\n filter: 'Filter by',\n forbidLogin: 'Forbid Login',\n forbidLoginDescription: 'The user will not be able to connect to this application',\n allowLogin: 'Allow Login',\n allowLoginDescription: 'The user will be able to connect to this application',\n updateRole: 'Update Role',\n deleteUser: 'Delete User',\n deleteUserDescription: 'Confirm delete user \"{name}\"?',\n revokePassport: 'Revoke Passport',\n revokePassportDescription:\n 'Once the passport is revoked, the passport holder can not use it to login again, are you sure to continue?',\n enablePassport: 'Enable Passport',\n enablePassportDescription:\n 'Once the revoked passport is enabled again, the passport holder can use it to login again, are you sure to continue?',\n passportPermissionTitle: 'The passport has the following permissions:',\n search: 'Search Member',\n hideBlockedMember: 'Hide Unapproved Members',\n inviteDialog: {\n createInviteLink: 'Generate Invitation Link',\n createSuccessTip:\n 'The invitation link is successfully created, click to copy and send the link to the invited member, please note that this invitation link can not be reused and will expire on {expireDate}',\n },\n error: {\n passportEmpty: 'Passport should not be empty',\n },\n },\n transferNode: {\n name: 'Transfer Ownership',\n inviteDialog: {\n title: 'Transfer Blocklet Server',\n tips: {\n progress:\n 'Transfer the server needs to be accepted by the receiver to complete the transfer operation, and once the receiver accepts it, you cannot log in to the server with the current passport again.',\n newOwnerPermissions:\n 'The new Owner will have the right to manage all operations such as members, passports, and Blocklets.',\n revoke:\n 'If you want to withdraw the transfer invitation, you can delete the invitation link in the \"Team -> Members -> Inviting\" page.',\n },\n createInviteLink: 'Generate Invitation Link',\n createSuccessTip:\n 'The invitation link is successfully created, click to copy and send the link to the invited member, please note that this invitation link can not be reused and will expire on {expireDate}',\n },\n delegateDialog: {\n title: 'Authorize Required',\n scan: 'Scan following QR code with DID Wallet to authorize server to transfer server ownership NFT.',\n confirm: 'Confirm on your DID Wallet',\n success: 'Authorization Successfully',\n },\n },\n permission: {\n create: {\n title: 'Create Permission',\n description: \"Format: <action>_<resource>\\n e.g. 'query_user', 'mutate_user'\",\n },\n delete: {\n title: 'Delete Permission',\n description: 'Confirm delete {name}?',\n },\n error: {\n actionEmpty: 'action cannot be empty',\n resourceEmpty: 'resource cannot be empty',\n permissionTooLong: 'permission cannot exceed {length} characters',\n descriptionTooLong: 'description cannot exceed {length} characters',\n },\n },\n passport: {\n create: {\n title: 'Create Passport',\n titleTip: 'Title cannot be modified after created',\n },\n bind: {\n title: 'Bind Permission',\n roleTip: 'You will get all the permissions of the selected passport after binding',\n permissionTip: 'You will get the selected permissions after binding',\n transferLeftTitle: 'All permissions',\n transferRightTitle: 'Granted permissions',\n },\n delete: {\n title: 'Delete Passport',\n description:\n 'The passports holds by user will lose all permissions after it is deleted. Are you sure to continue?',\n },\n error: {\n titleEmpty: 'title cannot be empty',\n titleTooLong: 'title cannot exceed {length} characters',\n descriptionEmpty: 'description cannot be empty',\n },\n issuance: {\n pending: 'Pending',\n create: {\n title: 'Generate Link',\n },\n delete: {\n title: 'Delete Receive Link',\n description: 'Confirm delete {link}?',\n },\n },\n issue: 'Issue Passport',\n disableIssuance: 'Disable Passport Issuance',\n enableIssuance: 'Enable Passport Issuance',\n disableIssuanceTip: '\"Issue Passport\", \"Invite Member\" and other operations will be disabled',\n enableIssuanceTip: '\"Issue Passport\", \"Invite Member\" and other operations will be enabled',\n trustedPassportIssuers: 'Trusted Passport Issuers',\n trustedIssuers: 'Trusted Issuers',\n externalPassport: 'External Passport',\n notTrustedIssuerTip: 'The passport cannot be used because the issuer is not on the list of trusted issuers',\n issuerDid: 'Issuer DID',\n addNodeToTrustedIssuers: 'Add current server as a trusted passport issuer',\n revoked: 'Revoked',\n noPermission: 'No permission to perform this operation',\n shouldNotDeleteCurrent: 'You can not revoke your passport currently in use',\n mappingRule: 'Mapping rule',\n defaultRule: 'Default rule',\n search: 'Search Passport',\n searchIssuerDid: 'Search Issuer DID',\n issueBy: 'Issue by {name}',\n },\n inviting: {\n link: 'Invite Link',\n inviter: 'Inviter',\n delete: {\n title: 'Delete Invite Link',\n description: 'Confirm delete {link}?',\n },\n disabledTip: 'Invitation is not enabled',\n },\n whoCanAccess: {\n all: {\n title: 'Accessible to all',\n },\n owner: {\n title: 'Owner only',\n },\n invited: {\n title: 'Invited user only',\n },\n },\n },\n launcher: {\n provider: 'Provider',\n adminUrl: 'URL',\n },\n session: {\n forbidLogin: 'You have been blocked from access this server',\n },\n launchBlocklet: {\n appInfo: 'Application Information',\n appInfoDesc: 'Confirm the application information',\n author: 'Application Author: {author}',\n setup: 'Setup Application',\n alreadyRunning: 'Application {name} is already running on this Blocklet Server',\n alreadyInstalled: 'Application {name} is already installed on this Blocklet Server',\n alreadyExists: 'This application already exists, please visit',\n selectAbtNode: 'Select Blocklet Server',\n purchased: 'Already Purchased',\n purchase: 'Purchase',\n nextStep: 'Next Step',\n agreement: 'License Agreement',\n agreeAll: 'Agree & Continue',\n installing: 'Installing {appName} on {serverName}, it may take minutes to complete, please stay tuned...',\n redirecting: '{appName} is successfully installed, now starting...',\n start: 'Launching',\n launch: 'Install Application',\n launchSuccess: '{appName} is successfully launched!',\n installSuccess: 'Blocklet is successfully installed and launched on {serverName}',\n openInRegistry: 'View in Blocklet Store',\n subTitle: 'Ready to install application {appName} on {serverName}',\n installingSubTitle: '{appName} installing',\n access: 'Open the application',\n viewApplication: 'View Application',\n newVersion: 'New Version',\n newVersionDesc: 'The application already exists, but the current version can be upgraded',\n upgradeNow: 'Upgrade Now',\n later: 'Later',\n abtnodeLicenseName: 'Blocklet Server License',\n introduction: 'Introduction',\n welcome: 'Welcome to the Blocklet Launch Wizard',\n accept: 'I agree to the Blocklet EULA',\n license: 'Application License',\n next: 'Agree to the EULA and continue',\n purchaseApp: 'Purchase Application',\n setupAppDesc: 'Initialize your Dapp',\n launchAppDesc: 'Following steps in Dapp',\n launched: 'Complete',\n dialog: {\n title: 'Authorization Required',\n freeDescription:\n 'You need to present Blocklet Server Ownership NFT or Blocklet Server Passport to launch application',\n nonFreeDescription: 'You need to present application purchase NFT and Blocklet Server NFT to launch application',\n confirm: 'Confirm on your DID Wallet',\n success: 'Authorization Successfully',\n authorizationTimeout: 'Authorization timeout',\n },\n waiting: {\n verifying: 'Verifying blocklet meta',\n downloading: 'Downloading blocklet bundle',\n extracting: 'Extracting blocklet bundle',\n installing: 'Installing blocklet and setup components',\n },\n error: {\n loadMetaFailed: 'Load application information failed',\n appMetaNotFound: 'No information found for this application',\n downloadFailed: 'Failed to download the application, please try again',\n installFailed: 'Failed to install the application, please try again',\n startFailed: 'Failed to start the application, please try again',\n launchFailed: 'Failed to launch the application, please try again',\n installedButStopped:\n 'The application is installed successfully, but cannot be started. You can start it manually after resolving blocking issues',\n installedButError: 'The application is successfully installed, but failed to start',\n upgradeFailed: 'Upgrade Failed',\n },\n },\n invite: {\n notFoundTitle: 'Invalid Invitation',\n notFoundDescription: 'Invitation NotFound',\n transferNFTDialog: {\n title: 'Accept Blocklet Server {name}',\n scan: 'Connect the Launcher to complete the reception of the Blocklet Server.',\n confirm: 'Review this operation on your DID Wallet',\n success: 'Connect successfully, waiting for confirmation of receiving the Server',\n },\n },\n});\n","const flat = require('flat');\n\nmodule.exports = flat({\n setup: {\n connect: {\n title: '扫码签名',\n scan: '用你的 DID 钱包扫描下面的二维码从而成为本节点的所有者',\n confirm: '请在 DID 钱包上确认',\n success: '你已经成功成为节点的所有者',\n },\n verify: {\n title: '需要节点所有权证书',\n scan: '用你的 DID 钱包扫描下面的二维码以提供所有权证书',\n confirm: '请在 DID 钱包上确认',\n success: '你已经成功成为节点的所有者',\n },\n accept: {\n title: '接收节点需要所有权证书',\n scan: '用你的 DID 钱包扫描下面的二维码以提供所有权证书',\n confirm: '请在 DID 钱包上确认',\n success: '你已经成功成为节点的所有者',\n },\n title: '设置节点',\n steps: {\n eula: '最终用户许可协议',\n eulaFooter: '我已阅读并同意最终用户许可协议的条款',\n connect: '链接所有者的 DID 钱包',\n verify: '验证所有权',\n basicSettings: '基础设置',\n complete: '完成',\n },\n congratulation: '恭喜, 您的节点安全可用!',\n redirectButton: '查看节点仪表盘',\n form: {\n submit: '完成设置',\n title: '设置节点的名称和描述信息',\n },\n },\n login: {\n loginTo: '连接 DID 钱包',\n description: '只有节点的所有者和 approved 成员可以访问仪表盘',\n dialog: {\n title: '请连接 DID 钱包',\n scan: '用您的 DID 钱包扫描下面的二维码',\n confirm: '在您的 DID 钱包上确认',\n success: '连接成功',\n },\n },\n lostPassport: {\n title: '找回通行证?',\n },\n acceptServer: {\n title: '使用 Owner NFT 接收节点',\n tooltip: '如果你收到了 Owner NFT,你可以通过这个链接申请你的节点所有者通行证',\n },\n sidebar: {\n dashboard: '仪表盘',\n blocklets: '基石程序',\n console: '试验台',\n settings: '设置',\n },\n system: {\n total: '总计',\n used: '已使用',\n free: '空闲',\n cores: '核数',\n },\n common: {\n about: '关于',\n auditLogs: '审计日志',\n filter: '筛选',\n category: '日志分类',\n timeAgo: '{time}前',\n afterTime: '{time}后',\n abtnode: '节点',\n accessKey: '访问秘钥',\n action: '操作',\n actions: '操作',\n add: '添加',\n address: '地址',\n allow: '允许',\n alreadyExist: '已经存在',\n approve: '同意',\n approved: 'Approved',\n author: '作者',\n avatar: '头像',\n back: '返回',\n basic: '基础',\n basicInfo: '基础信息',\n bind: '绑定',\n blocklet: '基石程序',\n blocklets: '基石程序',\n blockletsStorage: '基石程序存储',\n cacheStorage: '缓存存储',\n cancel: '取消',\n certificate: '证书',\n click: '点击复制',\n close: '关闭',\n collapseAll: '收起全部',\n community: '社区地址',\n complete: '完成',\n componentBasicInfo: '组件基础信息',\n components: '组件',\n config: '配置',\n configuration: '配置',\n configSuccess: '设置成功',\n confirm: '确认',\n console: '控制台',\n continueWith: '确认继续',\n copiedTip: '已复制',\n copyTip: '点击复制',\n coreStorage: '核心存储',\n cpu: 'CPU',\n create: '创建',\n createSuccess: '创建成功',\n created: '创建于',\n createdAt: '创建时间',\n createdBy: '创建人',\n dAddress: '去中心化地址(DID)',\n dataStorage: '数据存储',\n delConfirm: '删除',\n delConfirmDescription: '确认删除?',\n delete: '删除',\n deleteSuccess: '删除成功',\n description: '描述',\n detail: '详情',\n did: 'DID',\n disabled: '已禁用',\n disk: '磁盘',\n diskInfo: '磁盘信息',\n docker: 'Docker?',\n documentation: '文档手册',\n domain: '域名',\n downgradeTo: '降级到',\n download: '下载',\n downloading: '下载中',\n edit: '编辑',\n email: '邮箱',\n empty: '暂无',\n emptyData: '未找到结果',\n enable: '启用',\n enabled: '已启用',\n engine: '引擎',\n env: '环境',\n environment: '环境变量',\n expandAll: '展开全部',\n expired: '已过期',\n expires: '过期时间',\n export: '导出',\n externalIp: '公网 IP',\n failed: '失败',\n fingerprint: '指纹',\n finish: '完成',\n forbid: '禁止',\n free: '免费',\n gitpod: 'Gitpod?',\n goEULA: '点击查看\"最终用户许可协议\"',\n group: '分组',\n image: '镜像内?',\n install: '安装',\n installed: '已安装',\n installedAt: '安装时间',\n installSuccess: '安装成功',\n installing: '安装中',\n internalIp: '内网 IP',\n invite: '邀请',\n inviting: '邀请中',\n ip: 'IP',\n isPublic: '公开',\n issue: '颁发',\n issuer: '颁发者',\n item: '项',\n joined: '已加入',\n key: '键',\n lastPublishedAt: '发布时间',\n launcher: '启动器信息',\n leavePageTip: '是否确定离开当前页面?',\n loading: '加载中',\n log: '查看日志',\n logStorage: '日志存储',\n login: '登录',\n logo: '图标',\n logout: '退出',\n manageTeam: '管理团队',\n marketplace: '市场',\n member: '成员',\n members: '成员',\n memory: '内存',\n meta: '元数据',\n monitor: '监控',\n more: '更多',\n mountPoint: '挂载点',\n name: '名称',\n next: '下一步',\n no: '否',\n noData: '暂无数据',\n notice: '请确认下面的信息',\n noticeTitle: '提示',\n open: '打开',\n management: '管理',\n os: '操作系统',\n overview: '概览',\n owner: '所有者',\n page404: '404 页面',\n passport: '通行证',\n permission: '权限',\n port: '端口',\n pre: '上一步',\n protected: '受保护',\n protocol: '协议',\n published: '发布于',\n purchase: '购买',\n redirect: '重定向',\n redirectCode: '重定向状态码',\n redirectPermanently: '永久重定向',\n redirectTemporary: '临时重定向',\n redirectUrl: '重定向 URL',\n reject: '拒绝',\n reload: '优雅重启',\n remark: '备注',\n remove: '删除',\n requiredErrorText: '{name}是必填的',\n resource: '资源',\n restart: '重启',\n retry: '重试',\n revoke: '撤销',\n role: '角色',\n running: '运行中',\n runtimeInfo: '运行信息',\n save: '保存',\n saveChanges: '保存',\n saveSuccess: '保存成功',\n scheduleFailed: '加入任务队列失败',\n scheduleSuccess: '成功加入任务队列',\n search: '搜索',\n setting: '设置',\n start: '启动',\n status: '状态',\n stop: '停止',\n storage: '存储',\n store: '商店',\n success: '成功',\n support: '服务支持',\n team: '团队',\n the: '此',\n title: '名称',\n type: '类型',\n unavailable: '不可访问',\n update: '更新',\n updateAvailable: '可升级到新版本 v{version}',\n updatedAt: '更新时间',\n updatedBy: '更新人',\n upgrade: '升级',\n upgradeTo: '升级到',\n upgrading: '升级中',\n uptime: '运行时长',\n url: 'URL',\n valid: '有效',\n value: '值',\n version: '版本号',\n visit: '访问',\n waiting: '等待中',\n webhook: '应用集成',\n yes: '是',\n invalidParam: '无效的参数',\n launch: '启动',\n price: '价格',\n redirecting: '跳转中',\n error: '错误',\n reminder: '提醒',\n normal: '正常',\n gateway: '网关',\n verifyNFT: '验证凭证',\n },\n blocklet: {\n notFound: '应用没有找到,可能已经被删除',\n installFromMarket: '从应用商店安装',\n installFromUrl: '通过 URL 安装',\n installFromCreate: '创建基石程序',\n installedAt: '安装时间',\n startedAt: '启动时间',\n stoppedAt: '停止时间',\n urlEmptyTip: '无访问地址,',\n goToAddRule: '立即添加',\n services: '暴露的服务',\n upstreamPort: '上游端口',\n noService: '暂无服务',\n appDid: '应用 DID',\n reloadSuccess: 'Blocklet 重启成功',\n statusTip: 'Blocklet {status}',\n initialUptime: '少于1分钟',\n action: {\n stopDescription: '停止该基石程序将会使页面不可以访问,可能会导致使用它的用户出现错误',\n confirmStop: '是的,停止',\n cancelDownloadDescription: '取消下载 {name} ?',\n removeDescription: '如果没有备份数据,删除该基石程序将会删除所有数据,包括基石程序运行时产生的所有数据',\n removeComponentDescription: '如果没有备份数据,删除该组件将会删除所有数据,包括组件运行时产生的所有数据',\n forceRemoveDescription: '删除该基石程序将会删除所有数据',\n removeKeepData: '保留该基石程序的数据,只删除基石程序',\n removeComplete: '删除基石程序和数据',\n removeComponentKeepData: '保留该组件的数据,只删除组件',\n removeComponentComplete: '删除组件和数据',\n confirmRemove: '是的, 删除',\n upgradeDescription: '升级基石程序可能会导致其短暂不可用,是否要继续?',\n confirmUpgrade: '是的,升级吧',\n confirmRestart: '是的,重启吧',\n restartDescription: '服务会短暂暂停,并且有可能因为变更了配置无法启动',\n },\n dev: {\n modeTip: '请将节点切换至 DEBUG 模式',\n },\n fromUrl: {\n title: '安装 Blocklet',\n label: 'Blocklet Meta URL',\n description: 'URL 应指向 Blocklet 的 Meta 文件',\n confirm: '安装',\n step0: '输入 URL',\n step1: '确认 Meta 信息',\n existTipPrefix: '已存在相同 DID 的 Blocklet, 版本为',\n existTipSuffix: ',请安装更高版本。',\n },\n index: {\n tableTitle: '管理已安装基石程序',\n noBlocklet: '节点中还没有基石程序, 您可以从基石程序市场中安装.',\n },\n admin: {\n iframeTitle: '基石程序管理界面',\n title: '管理界面',\n noContent: '该基石程序没有管理界面',\n securityError: '安全错误:无法从访问跨源框架中打开管理界面',\n },\n config: {\n iframeTitle: '基石程序配置界面',\n noContent: '该基石程序没有配置界面',\n securityError: '安全错误:无法从访问跨源框架中打开配置界面',\n title: '配置界面',\n disabledText: '请在 \".env\" 文件或 \"blocklet.yml\" 文件中编辑环境变量',\n changedTip: '配置已更新,请重启 Blocklet',\n user: {\n title: '用户配置',\n configurationKey: '配置键',\n configurationValue: '配置值',\n keyValueRequired: '键和值不能为空',\n invalidKey: '键不能以 BLOCKLET_ 开头',\n deleteForbidden: '该配置项是必填项,不能删除',\n missingRequired: '缺少启动 Blocklet 的必填项',\n gotoFix: '去修复',\n tip: '包含 BWA_ 前缀的配置项不应该包含敏感信息,因为他们会被发送到前端页面',\n },\n blocklet: {\n title: '应用配置',\n name: '可以展示在 DID Wallet 和应用前端的应用名称',\n description: '可以展示在 DID Wallet 和应用前端的应用描述',\n sk: '应用账户的私钥,修改后 BLOCKLET_APP_ID 会自动更新',\n clusterSize: '以 Cluster 模式启动时的实例数量,建议和宿主机 CPU 核数相同',\n deletable: '是否可以被删除,只能设置为 \"yes\" 或 \"no\"',\n walletType: '应用钱包类型,会影响派生出来的 DID',\n passportColor: '自定义应用颁发的通行证 NFT 主题色,设置为 auto 则根据应用 DID 生成',\n appUrl: '应用永久访问地址',\n },\n system: {\n title: '节点配置',\n },\n },\n overview: {\n source: '来源',\n deployedFrom: '部署源',\n accessControl: '访问控制',\n viewInStore: '在商店中查看',\n publicToStore: '在 Store 公开此应用',\n publicInstanceTip: '此应用的访问地址将展示在 Store 中(同时也会展示你的 DID,用于接受捐赠)',\n },\n diskInfo: {\n empty: '无法获得磁盘信息',\n appDir: '应用目录',\n dataDir: '数据目录',\n logDir: '日志目录',\n cacheDir: '缓存目录',\n },\n runtimeInfo: {\n noRunning: '当 Blocklet 运行时才可以获得运行信息!',\n memoryUsage: '内存',\n cpuUsage: 'CPU',\n uptime: '启动时长',\n port: '端口',\n processId: '进程 ID',\n },\n dist: {\n downloadLink: '下载地址',\n verify: '校验信息',\n },\n status: {\n added: '已添加',\n waiting: '等待中',\n downloading: '下载中',\n installing: '安装中',\n upgrading: '升级中',\n installed: '已安装',\n created: '已创建',\n starting: '启动中',\n running: '运行中',\n stopping: '停止中',\n stopped: '已停止',\n error: '错误',\n deleting: '删除中',\n corrupted: '已损坏',\n purchased: '已购买',\n purchasing: '购买中...',\n verifying: '验证中...',\n },\n list: {\n download: '下载数',\n star: '收藏数',\n },\n component: {\n checkUpdateTitle: '检查更新',\n updateTitle: '更新组件',\n noUpdate: '没有需要更新的组件',\n add: '添加组件',\n selectComponent: '选择组件',\n selectRegistry: '选择 Blocklet 商店',\n selectRegistryTip: '您可以切换 Blocklet 商店以查看更多组件',\n selectInstance: '选择实例',\n selectInstanceTip: '您可以选择已有实例 或 创建新的实例。已有实例将使用之前保存的配置和数据',\n newInstance: '创建新实例',\n noComponent: '暂无组件',\n mountPoint: '组件的挂载点是什么?',\n mountPointTip: \"如果你填写了 '/my-prefix',那么所有以其为前缀的请求都会被转发到配置的组件\",\n titleTip: '你可以为相同的组件自定义不同的名称',\n delete: '删除组件',\n deleteDescription: '删除后此组件将无法访问。确认删除?',\n purchase: '需要支付',\n tip: {\n stopBlocklet: '请先停止运行 Blocklet',\n notDynamic: '只有动态添加的组件才能被删除',\n },\n choose: '选择',\n addWithName: '添加组件到 {name}',\n installingCanCloseWindowTip: '正在后台安装组件中, 您可以放心关掉此窗口',\n installSuccessTip: '恭喜您,组件安装成功!',\n missDownloadTokenTip: '缺少下载凭证,无法下载',\n purchaseComponentSecondCheckTip: '请在 钱包 提供应用购买凭证',\n installComponentError: '安装组件遇到错误,请重试',\n downloadComponentError: '下载组件遇到错误,请重试',\n addComponentTip: {\n introduction: '欢迎来到添加组件向导',\n isFree: '您可以免费添加 <b>{name}</b> 为组件;',\n isPurchase: '您需要验证凭证才能添加 <b>{name}</b> 为组件;',\n belowInformation: '下面为该组件的信息:',\n verifyNFT: '请选择验证凭证方式',\n config: '请填写组件的相关配置',\n environment: '请填写组件的环境变量',\n fromUrl: '通过 URL 选择组件',\n },\n },\n router: {\n urlPath: 'URL 路径',\n securitySetting: '安全设置',\n noRunning: 'Blocklet 当前未启动。无法通过以下地址访问!',\n checkUrlAccessible: '检查地址的是否可访问',\n urlInaccessible: '可能因为网络的原因,该地址暂时无法访问',\n noAccessibleUrl: '没有可访问的地址',\n domainLockTooltip: '无法编辑由系统生成的 域名',\n urlLockTooltip: '无法编辑由系统生成的 URL 路径',\n },\n export: {\n title: '导出 Blocklet',\n name: '包名称',\n nameTip: 'e.g. \"my-blocklet-name\" or \"@my-scope/blocklet-name\"',\n result: '接下来',\n exportSource: '导出源代码',\n success: 'Blocklet 导出成功',\n resultTipStart: '使用',\n resultTipEnd: '你可以在几分钟内构建并发布这个 Blocklet',\n uploadedComponentTip: '无法导出直接上传的组件:',\n },\n },\n dashboard: {\n nodeDid: '节点地址',\n ownerDid: '所有者地址',\n routingEngine: '路由引擎',\n ownerNftURL: '所有者 NFT',\n expirationLeft: '有效期还剩',\n renewal: '续期',\n },\n store: {\n nameSort: '名称',\n popularSort: '下载量',\n headerDescription: '查找、安装基石程序',\n detail: {\n purchase: '购买 {name}',\n open: '打开 {name}',\n install: '安装 {name}',\n upgrade: '升级 {name}',\n empty: '暂无介绍',\n },\n blockletRegistry: {\n changeFailed: '更改应用商店地址失败:',\n addFailed: '添加应用商店地址失败:',\n editFailed: '编辑应用商店地址失败:',\n switchRegistry: '选择应用商店地址',\n addRegistry: '添加应用商店地址',\n editRegistry: '编辑应用商店地址',\n deleteRegistry: '删除应用商店地址',\n haveSameRegistry: '存在相同的应用商店地址',\n registryName: '应用商店名称',\n registryUrl: '应用商店地址',\n registryNameEmpty: '应用商店名称不能为空',\n registryUrlEmpty: '应用商店地址不能为空',\n deleteDesc:\n '确认删除应用商店地址 {name} ?<br/><span style=\"color: {color}\">*移除该商店之后,无法更新从此商店安装的应用,除非你再次添加。</span>',\n confirmDesc: '请输入 {name} 以确认删除',\n },\n purchase: {\n title: '购买 {name}',\n confirmed: '你的购买已经验证,安装中',\n declined: '你没有提供有效的购买凭证',\n waiting: '等待购买完成...',\n purchase: {\n title: '获取凭证',\n description: '安装此 Blocklet 之前你需要支付一定数量的通证以完成购买',\n },\n verify: {\n title: '验证凭证',\n description: '如果你已经购买过此 Blocklet,提供购买凭证 NFT 即可完成安装',\n auth: {\n title: '需要验证购买凭证',\n scan: '用你的 DID 钱包扫描下面的二维码以提供购买凭证',\n confirm: '请在 DID 钱包上确认',\n success: '你的购买凭证已经验证通过,Blocklet 正在安装中',\n },\n },\n auth: {\n title: '购买 {name}',\n scan: '用你的 DID 钱包扫描下面的二维码',\n confirm: '请在 DID 钱包上确认',\n success: '购买凭证已经发送到你钱包',\n },\n launch: '启动 {name}',\n autoLaunch: '{name} 购买成功,正在跳转到启动页面...',\n },\n },\n setting: {\n saveSuccess: '保存设置成功',\n unSavedTip: '有尚未保存的更改,请单击“保存”使更改生效。',\n unSavedLeaveTip: '有尚未保存的更改,是否确定离开当前页面?',\n form: {\n name: '节点命名',\n nameRequired: '名称不能为空',\n namePlaceholder: '节点名称',\n description: '节点描述',\n descriptionHolder: '节点描述',\n descriptionRequired: '节点描述不能为空',\n domain: '节点域名',\n domainPlaceholder: '节点域名',\n registry: '应用商店地址',\n registryPlaceholder: '用来拉取基石程序列表',\n registryRequired: '应用商店地址是必填的',\n registerUrl: '应用启动器地址',\n registerUrlPlaceholder: '你可以使用自己运行的\"应用启动器\", 也可以使用官方提供的版本',\n webWalletUrl: 'DID Wallet 地址',\n webWalletUrlPlaceholder: '你可以使用自己运行的 \"DID Wallet\", 也可以使用官方提供的版本',\n upgrade: {\n title: '升级节点到 v{version}',\n description: '在升级期间,节点将会进入维护模式几分钟。',\n dialog: '点击 “确认” 安装更新。节点将进入维护模式,直到更新完成并自动返回生产模式。',\n confirm: '升级',\n switchLabel: '自动更新检查',\n setup: '准备升级中',\n installing: '安装节点新版本(v{version})',\n restarting: '重新启动节点',\n cleanup: '迁移节点数据',\n complete: '升级完成!',\n progress: '正在升级节点到 v{version}',\n check: '检查更新',\n latest: '太棒了,你的节点已经是最新版!',\n },\n welcome: {\n switchLabel: 'Welcome 页面',\n },\n register: {\n titleAdded: '当前节点已经添加到应用启动器',\n title: '添加节点到应用启动器',\n description: '添加成功后,你可以快速从 {url} 安装应用到此节点',\n descriptionOnAdded: '你可以快速从 {url} 安装应用到此节点',\n btn: '添加',\n update: '更新',\n added: '已添加',\n addSucceed: '添加成功',\n updateSucceed: '更新成功',\n detecting: '检测中',\n },\n monitor: {\n diskThreshold: '当磁盘使用率超过(%)时发送报警',\n diskThresholdPlaceholder: '请设置磁盘使用率报警阈值',\n },\n },\n accessKey: {\n accessKeyId: 'Access Key',\n lastUsed: '最后使用',\n tip: '请给 Access Key 起个名字',\n saveSecretTip:\n '你的 Access Secret 只会展示一次,关闭次窗口后将无法再次查看,不过你可以随时重新创建新的 Access Key',\n iKnow: '我已复制保存好该 Access Secret',\n showSecret: '展示 Secret',\n hideSecret: '隐藏 Secret',\n title: '删除 Access Key',\n descriptionNoTime:\n '此操作无法撤消。这将永久删除备注为 {name} 并且 Id 为 {key} 的 Access Key (此 Access Key 之前没有被使用过) ',\n description:\n '此操作无法撤消。这将永久删除备注为 {name} 并且 Id 为 {key} 的 Access Key (最后的使用时间为 {time}, {timeAge})',\n confirm_desc: '请输入 {name} 以确认删除',\n remark: 'Access Key 名称',\n remarkInvalid: 'Access Key 名称不能为空',\n },\n webhook: {\n add: '添加应用集成',\n delTitle: '删除应用集成',\n requiredError: '请输入正确的 {type}',\n confirm_desc: '请输入 {name} 以确认删除',\n test: '测试',\n description: '此操作无法撤消。这将永久删除 ID 为 {id} 的应用集成',\n columns: {\n description: 'ID',\n params: '参数',\n createdAt: '创建时间',\n },\n },\n },\n notification: {\n title: '动态',\n empty: '没有动态',\n viewAll: '查看所有动态',\n showRead: '显示已读',\n markAllAsRead: '全部标记为已读',\n markAsRead: '标记为已读',\n },\n router: {\n routerSetting: '域名和网址',\n certSetting: 'SSL 证书',\n defaultSite: '默认',\n urlHelperText: '不以 HTTP/HTTPS 开头的 URL 将被认为是相对路径',\n\n empty: '点击 “添加 URL” 来增加映射',\n\n healthy: {\n ok: '基石程序运行中,可访问',\n error: '基石程序未安装或未运行中,无法访问',\n },\n\n service: {\n select: '选择和配置服务(可选)',\n what: '服务是把请求转交给基石程序前执行的逻辑,比如要求用户登录,检查权限等',\n },\n\n nonProvider: {\n title: '变更引擎警告',\n description:\n '如果你将引擎切换为 none,你当前访问的页面可能不再可用,因为它可能是由引擎来提供服务的,是否要继续?',\n confirm: '我知道风险,继续吧',\n },\n\n validation: {\n urlRequired: 'URL 是必填的',\n redirectCodeRequired: '重定向码是必选的',\n didRequired: 'Blocklet 是必选的',\n pathPrefixTooLong: '请求的前缀不能超过30个字符',\n pathPrefixCannotBeEmpty: '请求的前缀不能为空',\n domainRequired: '节点域名不能为空',\n invalidUrl: '请填写正确的 URL',\n pathPrefixRequired: 'URL 前缀是必填的',\n redirectUrlRequired: '重定向 URL 是必填的',\n },\n domain: {\n validate: {\n emptyTip: '站点域名不能为空',\n suffixTip: '站点域名不能包含 {suffix}',\n },\n add: {\n title: '添加站点',\n description: '请填写你所拥有的合法的站点地址',\n confirm: '添加',\n cancel: '取消',\n blocklet: '选择基石程序',\n redirect: '重定向到哪里?',\n port: '负责处理请求的服务监听在哪个端口?',\n portTip: '保持默认值就好,如果你想把请求转发到非默认端口,可以根据需要修改',\n type: '服务类型',\n },\n update: {\n title: '更新站点域名',\n label: '站点域名',\n description: '请填写你所拥有的合法的站点域名',\n },\n verify: {\n ok: '该站点解析正常',\n notResolved: '改站点解析异常,请检查你域名服务商的 DNS 配置',\n },\n https: {\n ok: '该域名已启用 HTTPS',\n bad: '该域名尚未启用 HTTPS',\n },\n delete: {\n title: '删除站点',\n description:\n '确认之后,你会删除掉 “{name}” 站点, 在下面输入“{name}”,选择删除按钮完成修改,或者选择取消按钮关闭当前弹窗。',\n confirm_desc: '请输入 {name} 以确认删除',\n },\n },\n\n domainAlias: {\n add: {\n title: '添加额外域名',\n domainDescription: '请填写有效的域名',\n forceTip: '当域名已存在时强制添加',\n },\n delete: {\n title: '删除',\n description: '删除别名将会删除域名别用该站点下的所有流量转发规则,是否继续?',\n },\n },\n\n domainSecurity: {\n title: '更新站点安全设置',\n cors: {\n title: 'CORS 域名白名单',\n description:\n '此白名单显示的声明可以往 {name} 发送跨域请求的域名, 多个域名用逗号分隔, 可以用 \"*\" 来允许任何域名(我们不推荐这么做)',\n domainInvalid: '请输入有效的域名列表',\n },\n },\n\n rule: {\n add: {\n title: '添加 URL',\n confirm: '添加',\n pathPrefix: '请求的前缀是什么?',\n pathPrefixTip: \"如果你填写了 '/prefix',那么所有以其为前缀的请求都会被转发到配置的基石程序\",\n blocklet: '把请求代理到哪个服务?',\n port: '把请求代理到哪个端口?',\n portTip: '这里的默认值是 Blocklet 默认监听的端口,如果你的 Blocklet 会启用多个端口,你可以根据需要自定义',\n },\n delete: {\n title: '删除规则',\n description:\n '确认之后,你会删除掉 “{name}” URL映射, 在下面输入“{name}”,选择删除按钮完成修改,或者选择取消按钮关闭当前弹窗。',\n confirm_desc: '请输入 {name} 以确认删除',\n cancel: '取消',\n },\n update: {\n title: '更新规则',\n confirm: '确认,更新吧',\n cancel: '取消',\n },\n },\n cert: {\n name: '证书名称',\n domain: '域名',\n commonName: '通用名称',\n boundDomains: '域名',\n action: '操作',\n expired: '已过期',\n leftDays: ' 天 剩余',\n issuedOn: '签发时间',\n expiryOn: '过期时间',\n fingerprintAlg: '指纹算法',\n validityPeriod: '有效期',\n matchedSites: '匹配站点',\n source: '添加方式',\n upload: '手动上传',\n publicCertHelperText: '公开证书可以下载',\n nonPublicCertHelperText: '非公开的证书不能被下载',\n protectedCertHelperText: '受保护的证书不可以编辑',\n unprotectedCertHelperText: '不受保护的证书可以编辑',\n issuing: '正在生成证书',\n sourceTypes: {\n upload: '手动上传',\n lets_encrypt: \"Let's Encrypt\",\n },\n\n table: {\n nodata: '暂无数据',\n },\n delete: {\n title: '删除证书',\n description: '确认删除?',\n confirm: '确认',\n },\n nginx: {\n title: '更新证书',\n titleAdd: '添加证书',\n pem: '证书文件',\n pemTip: '请把证书文件拖拽到这里, 应该以 \".pem\" 或 \".crt\" 结尾',\n key: '证书私钥',\n keyTip: '请把证书私钥拖拽到这里,应该以 \".pem\" 或 \".key\" 结尾',\n confirm: '提交',\n cancel: '取消',\n invalidFile: '所选择的文件无效',\n empty: '尚未选择任何文件',\n sourceTypes: {\n upload: '通过上传文件',\n lets_encrypt: \"通过 Let's Encrypt 自动生成\",\n },\n },\n detail: {\n title: '证书详情',\n },\n genLetsEncryptCert: {\n title: \"生成 Let's Encrypt 证书\",\n dnsTip: '请确保该域名已经解析到了当前节点。',\n description: '添加证书会让服务变得更安全,节点会在证书过期前自动更新证书。',\n },\n },\n gateway: {\n reqLimit: {\n status: {\n true: '已启动',\n false: '已关闭',\n },\n switchLabel: '请求限流',\n rate: '限流速率({rate} 请求/秒)',\n ipHeaderLabel: '自定义客户端 IP 头部(可选)',\n ipHeaderDesc:\n '如果 Blocklet Server 运行在一些代理后面,可以在这里设置客户端真实 IP 的头部;可选,如果不填将使用默认值。',\n },\n },\n },\n noMatch: {\n desc: '我们找不到您要找的页面',\n },\n health: {\n connectionErrorTip: '节点服务节点的连接已经断开,可能是出现了网络异常或者节点服务节点故障',\n connectionRecoveryTip: '节点服务节点的连接刚刚恢复正常',\n connectionStoppedTip: '节点服务节点已经被停止',\n wrongAccessUrlTip: '节点访问地址错误,请使用正确的访问地址',\n },\n debug: {\n title: '您的节点已启动并正在运行',\n },\n team: {\n invite: '邀请',\n add: '添加',\n member: {\n name: '姓名',\n passport: '通行证',\n passports: '通行证',\n lastLogin: '上次登录',\n filter: '条件筛选',\n forbidLogin: '禁止登录',\n forbidLoginDescription: '该成员将无法登录此应用',\n allowLogin: '允许登录',\n allowLoginDescription: '该成员将可以登录此应用',\n deleteUser: '删除成员',\n deleteUserDescription: '确认删除成员 “{name}”?',\n updateRole: '更新角色',\n revokePassport: '撤销通行证',\n revokePassportDescription: '通行证一旦被撤销,通行证的持有者将无法用其登录,是否继续?',\n enablePassport: '启用通行证',\n enablePassportDescription: '撤销的通行证一旦被重新启用,通行证持有者将可以继续登陆应用,是否继续?',\n passportPermissionTitle: '该通行证具有以下权限:',\n search: '搜索成员',\n hideBlockedMember: '隐藏被禁止的成员',\n inviteDialog: {\n createInviteLink: '生成邀请链接',\n createSuccessTip: '创建邀请链接成功,请复制并发送给被邀请人。该链接只能使用一次,并将在 {expireDate} 过期',\n },\n error: {\n passportEmpty: '通行证不能为空',\n },\n },\n transferNode: {\n name: '转移所有者',\n inviteDialog: {\n createInviteLink: '生成邀请链接',\n title: '转移节点',\n tips: {\n progress: '转移节点需要对方接受后才能完成转移操作,对方一旦接受,无法再使用当前凭据登录节点。',\n newOwnerPermissions: '新 Owner 将有权管理成员、通行证,以及应用等所有操作。',\n revoke: '如果想收回转移邀请,在\"团队 -> 成员 -> 邀请中\"页面删除邀请链接即可。',\n },\n createSuccessTip: '创建邀请链接成功,请复制并发送给被邀请人。该链接只能使用一次,并将在 {expireDate} 过期',\n },\n delegateDialog: {\n title: '需要授权',\n scan: '用 DID 钱包扫描下面的二维码,授权节点转让节点的所有权 NFT.',\n confirm: '在您的 DID 钱包上确认',\n success: '授权成功',\n },\n },\n permission: {\n create: {\n title: '创建权限',\n description: \"格式:<操作>_<资源>\\n举例:'query_user', 'mutate_user'\",\n },\n update: {\n title: '更新权限',\n },\n delete: {\n title: '删除权限',\n description: '确认删除 {name}?(角色中关联的 {name} 将会同时被删除)',\n },\n error: {\n actionEmpty: '操作不能为空',\n resourceEmpty: '资源不能为空',\n permissionTooLong: '权限不能超过 {length} 个字符',\n descriptionTooLong: '描述不能超过 {length} 个字符',\n },\n },\n passport: {\n create: {\n title: '创建通行证',\n titleTip: '名称创建后不可修改',\n },\n bind: {\n title: '绑定',\n roleTip: '绑定后将会获得选定的通行证的所有权限',\n permissionTip: '绑定后将会获得选定的权限',\n transferLeftTitle: '所有权限',\n transferRightTitle: '已添加权限',\n },\n delete: {\n title: '删除通行证',\n description: '删除后,用户持有的此通行证的将失去所有权限,是否继续?',\n },\n error: {\n titleEmpty: '名称不能为空',\n titleTooLong: '名称不能超过 {length} 个字符',\n descriptionEmpty: '描述不能为空',\n },\n issuance: {\n pending: '待领取',\n create: {\n title: '生成链接',\n },\n delete: {\n title: '删除领取链接',\n description: '确认删除 {link}?',\n },\n },\n issue: '颁发通行证',\n disableIssuance: '禁止颁发通行证',\n enableIssuance: '允许颁发通行证',\n disableIssuanceTip: '“颁发通行证”,“邀请成员” 等操作将被禁止',\n enableIssuanceTip: '“颁发通行证”,“邀请成员” 等操作将被允许',\n trustedPassportIssuers: '信任的通行证颁发者',\n trustedIssuers: '信任的颁发者',\n externalPassport: '外部的通信证',\n notTrustedIssuerTip: '该通行证无法使用,因为颁发者未在信任的颁发者列表中',\n issuerDid: '颁发者 DID',\n addNodeToTrustedIssuers: '添加当前 node 为信任的通行证颁发者',\n revoked: '撤销',\n noPermission: '没有权限执行此操作',\n shouldNotDeleteCurrent: '无法删除当前正在使用的通行证',\n mappingRule: '映射规则',\n defaultRule: '默认规则',\n search: '搜索通行证',\n searchIssuerDid: '搜索颁发者 DID',\n issueBy: '由 {name} 颁发',\n },\n inviting: {\n link: '邀请链接',\n inviter: '邀请人',\n delete: {\n title: '删除邀请链接',\n description: '确认删除 {link}?',\n },\n disabledTip: '邀请功能未开启',\n },\n whoCanAccess: {\n all: {\n title: '所有人可访问',\n },\n owner: {\n title: '只有我自己可访问',\n },\n invited: {\n title: '只有被邀请的人可以访问',\n },\n },\n },\n launcher: {\n provider: '云服务商',\n adminUrl: 'Launcher 管理页面',\n },\n session: {\n forbidLogin: '你已被禁止访问此节点',\n },\n launchBlocklet: {\n appInfo: '应用信息',\n appInfoDesc: '确认应用信息',\n author: '应用作者:{author}',\n setup: '设置应用',\n alreadyRunning: '应用 {name} 已经运行在当前节点',\n alreadyInstalled: '应用 {name} 已经安装到当前节点,无需重复安装',\n alreadyExists: '该应用已经存在,可直接访问',\n launchSuccess: '{appName} 已经启动成功!',\n selectAbtNode: '选择节点',\n nextStep: '下一步',\n purchased: '已购买',\n purchase: '购买',\n agreeAll: '同意并继续',\n agreement: '许可协议',\n installing: ' 正在节点 {serverName} 上安装 {appName},请稍等片刻',\n redirecting: '安装成功,现正在启动 {appName}',\n start: '启动中',\n launch: '安装应用',\n installSuccess: '应用已经成功安装到节点 {serverName} 并启动',\n openInRegistry: '在应用商店中打开',\n subTitle: '准备在节点 {serverName} 上安装 {appName}',\n installingSubTitle: '正在安装 {appName}',\n access: '打开应用',\n viewApplication: '查看应用',\n newVersion: '新版本',\n newVersionDesc: '应用已经存在,但当前版本可更新',\n later: '稍后',\n upgradeNow: '现在更新',\n abtnodeLicenseName: '节点许可',\n introduction: '简介',\n welcome: '欢迎来到应用启动向导',\n accept: '许可协议',\n license: '应用许可',\n next: '同意协议并继续',\n purchaseApp: '购买应用',\n setupAppDesc: '初始化你的应用',\n launchAppDesc: '将应用安装到你的节点',\n launched: '启动',\n dialog: {\n title: '需要您的授权',\n freeDescription: '你需要提供节点所有权 NFT 或节点通行证凭据来启动应用',\n nonFreeDescription: '你需要提供应用购买凭证和节点通行证来启动应用',\n confirm: '在您的 DID 钱包上确认',\n success: '授权成功',\n authorizationTimeout: '授权超时',\n },\n waiting: {\n verifying: '验证应用元数据',\n downloading: '下载应用包',\n extracting: '提取应用包的数据',\n installing: '安装应用和设置组件',\n },\n error: {\n loadMetaFailed: '获取应用信息出错',\n appMetaNotFound: '没有找到该应用的信息',\n downloadFailed: '下载应用失败,请重试',\n installFailed: '安装应用失败,请重试',\n startFailed: '启动应用失败,请重试',\n launchFailed: '启动应用失败,请重试',\n installedButStopped: '应用安装成功,但是无法启动,解决启动问题之后后可手动启动',\n installedButError: '应用已经安装,但是运行出错了',\n upgradeFailed: '更新失败',\n },\n },\n invite: {\n notFoundTitle: '无效的邀请',\n notFoundDescription: '没有找到邀请',\n transferNFTDialog: {\n title: '接受节点 {name}',\n scan: '连接节点启动器,以完成节点的接收。',\n confirm: '请在 DID 钱包上确认',\n success: '连接成功,等待确认接收节点。',\n },\n },\n});\n","/* eslint-disable react/jsx-wrap-multilines */\nimport { useState, useContext } from 'react';\nimport styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport useTheme from '@mui/material/styles/useTheme';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport Checkbox from '@mui/material/Checkbox';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport CheckCircleOutlineRoundedIcon from '@mui/icons-material/CheckCircleOutlineRounded';\nimport FormControlLabel from '@mui/material/FormControlLabel';\n\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Button from '@arcblock/ux/lib/Button';\nimport Logo from '@arcblock/ux/lib/Logo';\nimport ConnectLogo from '@arcblock/icons/lib/ConnectLogo';\n\nimport EulaContent from '@arcblock/license/lib/server';\n\nexport default function AgreeEula({ onGoToNext }) {\n const theme = useTheme();\n const [checked, setChecked] = useState(false);\n const { t } = useContext(LocaleContext);\n\n const handleChange = () => {\n setChecked(x => !x);\n };\n\n return (\n <Div theme={theme}>\n <Box>\n <Box textAlign=\"center\">\n <Logo showText={false} style={{ width: '60px', height: '60px', transform: 'scale(1)' }} />\n </Box>\n <Typography component=\"h2\" variant=\"h3\" className=\"title\">\n {t('setup.title')}\n </Typography>\n\n <Typography component=\"h2\" variant=\"h5\" className=\"sub-title\">\n {t('setup.steps.eula')}\n </Typography>\n </Box>\n\n <EulaContent className=\"eula-content\" />\n\n <div className=\"footer\">\n <FormControlLabel\n control={\n <Checkbox\n checked={checked}\n onChange={handleChange}\n color=\"primary\"\n checkedIcon={<CheckCircleRoundedIcon />}\n icon={<CheckCircleOutlineRoundedIcon />}\n />\n }\n label={t('setup.steps.eulaFooter')}\n />\n <Button disabled={!checked} variant=\"contained\" color=\"primary\" className=\"button\" onClick={onGoToNext}>\n <Box display=\"flex\" alignItems=\"center\">\n {t('common.continueWith')} <ConnectLogo className=\"logo\" />\n </Box>\n </Button>\n </div>\n </Div>\n );\n}\n\nAgreeEula.propTypes = {\n onGoToNext: PropTypes.func.isRequired,\n};\n\nconst Div = styled.div`\n width: 64%;\n max-width: 1920px;\n height: 100%;\n box-sizing: border-box;\n padding-top: 5%;\n padding-bottom: 5%;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n .title {\n margin-top: 24px;\n font-weight: 400;\n font-size: 24px;\n line-height: 28px;\n text-align: center;\n color: #222222;\n }\n .sub-title {\n margin-top: 16px;\n font-weight: 400;\n font-size: 18px;\n line-height: 21px;\n text-align: center;\n color: #666666;\n }\n\n .footer {\n margin-top: 32px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 14px;\n .MuiFormControlLabel-root {\n .MuiSvgIcon-root {\n }\n .MuiFormControlLabel-label {\n position: relative;\n margin-left: 2px;\n font-weight: 400;\n font-size: 16px;\n line-height: 20px;\n color: #666666;\n }\n }\n .button {\n padding-left: 24px;\n padding-right: 24px;\n height: 56px;\n font-size: 18px;\n .logo {\n position: relative;\n margin-left: 8px;\n bottom: 1px;\n width: auto;\n height: 1.2em;\n }\n color: #fff;\n fill: #fff;\n transition: opacity 0.4s;\n &.Mui-disabled {\n background: ${({ theme }) => theme.palette.primary.main};\n opacity: 0.5;\n }\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n width: 100%;\n padding: 8vw 4vw;\n .footer {\n flex-direction: column;\n align-items: unset;\n justify-content: unset;\n .MuiButton-root {\n margin-top: 15px;\n font-size: 18px;\n }\n }\n }\n`;\n","import { useState } from 'react';\nimport styled from 'styled-components';\n\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport AgreeEula from './agree-eula';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\n\nexport default function NodeConnectOwner() {\n const { info } = useNodeContext();\n const { api } = useSessionContext();\n const { t, locale } = useLocaleContext();\n const [open, setOpen] = useState(false);\n\n const webWalletUrl = getWebWalletUrl(info);\n\n const onConnect = () => {\n setOpen(true);\n };\n\n const onOwnerConnected = (result, decrypt) => {\n localStorage.setItem('__sst', decrypt(result.sessionToken));\n setTimeout(() => {\n goDashboard();\n }, 1000);\n };\n\n const prefix = window.env ? window.env.apiPrefix || '/' : '/';\n\n const goDashboard = () => {\n window.location.href = prefix;\n };\n\n return (\n <Div>\n <AgreeEula onGoToNext={onConnect} />\n\n <DidConnect\n popup\n open={open}\n className=\"stepper-auth\"\n action=\"connect-owner\"\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n onSuccess={onOwnerConnected}\n locale={locale}\n messages={{\n title: t('setup.connect.title'),\n scan: t('setup.connect.scan'),\n confirm: t('setup.connect.confirm'),\n success: t('setup.connect.success'),\n }}\n dialogStyle={{ height: 800 }}\n onClose={() => setOpen(false)}\n />\n </Div>\n );\n}\n\nconst Div = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n background: #f8f8f8;\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n`;\n","import styled from 'styled-components';\nimport PropTypes from 'prop-types';\n\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNodeContext } from '../../contexts/node';\nimport { useSessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\n\nexport default function NodeVerifyOwner({ action }) {\n const { info } = useNodeContext();\n const { api } = useSessionContext();\n const { t, locale } = useLocaleContext();\n\n const webWalletUrl = getWebWalletUrl(info);\n\n const onOwnerVerified = (result, decrypt) => {\n localStorage.setItem('__sst', decrypt(result.sessionToken));\n setTimeout(() => {\n goDashboard();\n }, 1000);\n };\n\n const prefix = window.env ? window.env.apiPrefix || '/' : '/';\n\n const goDashboard = () => {\n window.location.href = prefix;\n };\n\n const localeKey = action === 'verify-owner' ? 'verify' : 'accept';\n\n return (\n <Div>\n <div className=\"connect-wrapper\">\n <DidConnect\n className=\"connect\"\n action={action}\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n onSuccess={onOwnerVerified}\n locale={locale}\n messages={{\n title: t(`setup.${localeKey}.title`),\n scan: t(`setup.${localeKey}.scan`),\n confirm: t(`setup.${localeKey}.confirm`),\n success: t(`setup.${localeKey}.success`),\n }}\n />\n </div>\n </Div>\n );\n}\n\nconst Div = styled.div`\n box-sizing: border-box;\n width: 100%;\n height: 100vh;\n display: flex;\n flex-direction: column;\n position: relative;\n .connect-wrapper {\n flex: 1;\n }\n .connect {\n background: #fafafa;\n }\n`;\n\nNodeVerifyOwner.propTypes = {\n action: PropTypes.oneOf(['verify-owner', 'accept-server']).isRequired,\n};\n","/* eslint-disable max-len */\n/* eslint-disable no-nested-ternary */\nimport { useState, useEffect } from 'react';\nimport styled from 'styled-components';\nimport useInterval from 'react-use/lib/useInterval';\n\nimport Typography from '@mui/material/Typography';\nimport Paper from '@mui/material/Paper';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport IconPending from '@mui/icons-material/Adjust';\nimport IconDone from '@mui/icons-material/Check';\nimport List from '@mui/material/List';\nimport ListItem from '@mui/material/ListItem';\nimport ListItemIcon from '@mui/material/ListItemIcon';\nimport ListItemText from '@mui/material/ListItemText';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { EVENTS } from '@abtnode/constant';\n\nimport { useNodeContext } from '../../../contexts/node';\nimport { useSubscription } from '../../../libs/ws';\n\nconst stages = ['setup', 'installing', 'restarting', 'cleanup', 'complete'];\n\nexport default function NodeUpgradeProgress() {\n const { t } = useLocaleContext();\n const { api, info } = useNodeContext();\n const [stage, setStage] = useState('setup');\n const [loading, setLoading] = useState(false);\n const [pooling, setPooling] = useState(false);\n\n useEffect(() => {\n api\n .getSession({ input: { id: info.upgradeSessionId } })\n .then(({ session }) => {\n if (session && stages.includes(session.stage)) {\n setStage(session.stage);\n }\n setLoading(false);\n })\n .catch(err => {\n console.error('Error loading upgrade session', info.upgradeSessionId, err.message);\n setLoading(false);\n });\n }, []); // eslint-disable-line\n\n useEffect(() => {\n if (stage === 'cleanup') {\n setPooling(true);\n } else if (stage === 'complete') {\n setTimeout(() => {\n window.location.reload(true);\n }, 5000);\n } else {\n setPooling(false);\n }\n }, [stage]);\n\n useInterval(\n () => {\n api\n .getSession({ input: { id: info.upgradeSessionId } })\n .then(({ session }) => {\n if (session && stages.includes(session.stage)) {\n setStage(session.stage);\n }\n })\n .catch(err => {\n console.error('Error loading upgrade session', info.upgradeSessionId, err.message);\n });\n },\n pooling ? 1000 : null\n );\n\n useSubscription(EVENTS.NODE_UPGRADE_PROGRESS, progress => {\n if (progress && stages.includes(progress.stage)) {\n if (stage === 'cleanup') {\n // delay 10s if next stage is cleanup, because restarting stage will immediately return before restarting complete\n setTimeout(() => {\n setStage(progress.stage);\n }, 10 * 1000);\n } else {\n setStage(progress.stage);\n }\n } else {\n console.error('unknown upgrade stage', progress);\n }\n });\n\n return (\n <Div>\n <div className=\"icons\">\n <span className=\"icon icon-gear icon-spin right slow one\" />\n <span className=\"icon icon-gear icon-spin left two\" />\n <span className=\"icon icon-gear icon-spin left three\" />\n </div>\n <Typography variant=\"h2\" color=\"textPrimary\">\n {t('setting.form.upgrade.progress', { version: info.nextVersion || info.version })}\n </Typography>\n <Typography component=\"p\" color=\"textSecondary\">\n {t('setting.form.upgrade.description')}\n </Typography>\n {loading && <Spinner size={[32, 20]} style={{ marginTop: 32 }} />}\n {!loading && (\n <List className=\"stages\">\n {stages.map((x, i) => {\n const currentIndex = stages.indexOf(stage);\n const isDone = currentIndex > i;\n const isProgress = currentIndex === i;\n const icon = isProgress ? <Spinner size={[20, 12]} /> : isDone ? <IconDone /> : <IconPending />;\n const className = isProgress ? 'stage-progress' : isDone ? 'stage-done' : 'stage-pending';\n return (\n <ListItem className={`stage ${className}`} key={x}>\n <ListItemIcon className=\"stage-icon\">{icon}</ListItemIcon>\n <ListItemText className=\"stage-text\">\n {t(`setting.form.upgrade.${x}`, { version: info.nextVersion || info.version })}\n </ListItemText>\n </ListItem>\n );\n })}\n </List>\n )}\n </Div>\n );\n}\n\nconst Div = styled(Paper)`\n padding: 24px 16px;\n border-radius: 8px;\n min-height: 480px;\n max-width: 640px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n\n @font-face {\n font-family: 'icomoon';\n src: url('data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SC/QAAAC8AAAAYGNtYXAQQ+CtAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZtzYyQ0AAAF4AAABtGhlYWQOn7WzAAADLAAAADZoaGVhBzADxgAAA2QAAAAkaG10eAluAAAAAAOIAAAAFGxvY2EAKADuAAADnAAAAAxtYXhwAAgAhQAAA6gAAAAgbmFtZZlKCfsAAAPIAAABhnBvc3QAAwAAAAAFUAAAACAAAwK3AZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADwEwPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg8BP//f//AAAAAAAg8BP//f//AAH/4w/xAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAACAAAAAANuA24ADwCCAAABNCcmIyIHBhUUFxYzMjc2JRUUBwYPAQYHFhcWFRQHBgcGIyIvAQYHBgcGKwEiJyY1JyYnBwYjIicmJyY1NDc2NzY3Ji8BJicmPQE0NzY/ATY3JicmNTQ3Njc2MzIfATY3Njc2OwEyFxYfARYXNzYzMhcWFxYVFAcGBwYHFh8BFhcWFQJJKys8PSsqKis9PCsrASUFBAdqCwsUKQYGDykpDQcITxkbCQcEEX8IBgYQHBhQBggIB0gWBAUIFRQLEAhoCAQFBQQGawgOFyYGBQ8qKQ0HB08ZGwkIBBB/CAYGARAcF1EGCAgGShUEBQgVFQoPCWgIBAUBtzwrKysrPD0rKiore38HBgYBEB8VHTIHBwgGFSgpBT4NCU0dEAUFB2kJDD0FBkIeBggGBwwaGg4dHA8BBgYIfgcHBgEQGhsgLgcHBgcVKSkGPQ0ITh0QBQUHagkMPQYGRB0FCAcGDBoaDh0bEAEGBggAAQAAAAEAANRjIH1fDzz1AAsEAAAAAADWCbikAAAAANYJuKQAAAAAA24DbgAAAAgAAgAAAAAAAAABAAADwP/AAAAEAAAAAAADbgABAAAAAAAAAAAAAAAAAAAABQQAAAAAAAAAAAAAAAIAAAADbgAAAAAAAAAKABQAHgDaAAEAAAAFAIMAAgAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAOAK4AAQAAAAAAAQAHAAAAAQAAAAAAAgAHAGAAAQAAAAAAAwAHADYAAQAAAAAABAAHAHUAAQAAAAAABQALABUAAQAAAAAABgAHAEsAAQAAAAAACgAaAIoAAwABBAkAAQAOAAcAAwABBAkAAgAOAGcAAwABBAkAAwAOAD0AAwABBAkABAAOAHwAAwABBAkABQAWACAAAwABBAkABgAOAFIAAwABBAkACgA0AKRpY29tb29uAGkAYwBvAG0AbwBvAG5WZXJzaW9uIDEuMABWAGUAcgBzAGkAbwBuACAAMQAuADBpY29tb29uAGkAYwBvAG0AbwBvAG5pY29tb29uAGkAYwBvAG0AbwBvAG5SZWd1bGFyAFIAZQBnAHUAbABhAHJpY29tb29uAGkAYwBvAG0AbwBvAG5Gb250IGdlbmVyYXRlZCBieSBJY29Nb29uLgBGAG8AbgB0ACAAZwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABJAGMAbwBNAG8AbwBuAC4AAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA')\n format('truetype');\n font-weight: normal;\n font-style: normal;\n }\n\n .stages {\n .stage-done {\n .stage-icon,\n .stage-text {\n color: ${props => props.theme.palette.secondary.main};\n }\n }\n\n .stage-progress {\n .stage-icon,\n .stage-text {\n color: ${props => props.theme.palette.secondary.main};\n }\n }\n\n .stage-pending {\n .stage-icon,\n .stage-text {\n color: #dcdcdc;\n }\n }\n }\n\n h2 {\n font-size: 28px;\n margin-top: 16px;\n margin-bottom: 16px;\n color: #009bdb;\n }\n\n p {\n text-align: center;\n }\n\n [class^='icon-'],\n [class*=' icon-'] {\n /* use !important to prevent issues with browser extensions that change fonts */\n font-family: 'icomoon' !important;\n speak: none;\n font-style: normal;\n font-weight: normal;\n font-variant: normal;\n text-transform: none;\n line-height: 1;\n\n /* Better Font Rendering =========== */\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n }\n\n .icon-cog:before {\n content: '\\f013';\n }\n .icon-gear:before {\n content: '\\f013';\n }\n\n .icon-spin {\n position: absolute;\n }\n\n .icons {\n position: relative;\n margin: 0 auto;\n width: 71px;\n height: 63px;\n }\n\n .one {\n top: 50%;\n margin-top: -27px;\n left: 0;\n font-size: 55px;\n }\n\n .two {\n font-size: 32px;\n right: 0;\n top: 0;\n }\n\n .three {\n font-size: 32px;\n right: 0;\n bottom: 0;\n }\n\n .icon {\n color: #009bdb;\n }\n\n .right {\n animation: spin 2s infinite linear;\n }\n\n .left {\n animation: spin-left 2s infinite linear;\n }\n\n .slow {\n animation-duration: 3s;\n }\n\n @keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n 100% {\n transform: rotate(359deg);\n }\n }\n @keyframes spin-left {\n 0% {\n transform: rotate(359deg);\n }\n 100% {\n transform: rotate(0deg);\n }\n }\n`;\n","/* eslint-disable react/jsx-one-expression-per-line */\nimport { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Link } from 'react-router-dom';\n\nimport Grid from '@mui/material/Grid';\nimport Tooltip from '@mui/material/Tooltip';\n\nimport DidConnect from '@arcblock/did-connect/lib/Connect';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { WELLKNOWN_SERVICE_PATH_PREFIX } from '@abtnode/constant';\nimport usePassportId from '@abtnode/ux/lib/hooks/use-passport-id';\n\nimport { NodeContext } from '../../contexts/node';\nimport { SessionContext } from '../../contexts/session';\nimport { getWebWalletUrl } from '../../libs/util';\n\nexport default function NodeLogin({ loadingEle }) {\n const { node } = useContext(NodeContext);\n const { api, session } = useContext(SessionContext);\n const { t, locale } = useContext(LocaleContext);\n const { getPassportId } = usePassportId();\n\n const onLogin = (result, decrypt) => {\n localStorage.setItem('__sst', decrypt(result.sessionToken));\n session.refresh();\n };\n\n const extraParams = { passportId: getPassportId() };\n\n const webWalletUrl = getWebWalletUrl(node.info);\n\n return (\n <Div>\n <div className=\"connect-wrapper\">\n <DidConnect\n loadingEle={loadingEle}\n className=\"connect\"\n action=\"login\"\n checkFn={api.get}\n checkTimeout={10 * 60 * 1000}\n socketUrl={api.socketUrl}\n webWalletUrl={webWalletUrl}\n onSuccess={onLogin}\n locale={locale}\n messages={{\n title: `${t('login.dialog.title')}`,\n scan: t('login.description'),\n confirm: t('login.dialog.confirm'),\n success: t('login.dialog.success'),\n }}\n extraParams={extraParams}\n extraContent={\n <Grid container justifyContent=\"center\" spacing={2}>\n <Grid className=\"extra-item\" item xs={12}>\n <Link to={`${WELLKNOWN_SERVICE_PATH_PREFIX}/lost-passport`}>{t('lostPassport.title')}</Link>\n </Grid>\n <Grid className=\"extra-item\" item xs={12}>\n <Tooltip title={t('acceptServer.tooltip')} placement=\"top-end\" enterTouchDelay={0}>\n <Link to=\"/accept-server\">{t('acceptServer.title')}</Link>\n </Tooltip>\n </Grid>\n </Grid>\n }\n />\n </div>\n </Div>\n );\n}\nNodeLogin.propTypes = {\n loadingEle: PropTypes.any,\n};\nNodeLogin.defaultProps = {\n loadingEle: '',\n};\n\nconst Div = styled.div`\n box-sizing: border-box;\n width: 100%;\n height: 100vh;\n display: flex;\n flex-direction: column;\n position: relative;\n .connect-wrapper {\n flex: 1;\n }\n .connect {\n background: #fafafa;\n }\n .extra-item {\n text-align: center;\n }\n`;\n","import { useEffect, useState } from 'react';\nimport { useSnackbar } from 'notistack';\nimport Snackbar from '@mui/material/Snackbar';\nimport Alert from '@mui/lab/Alert';\n\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { EVENTS } from '@abtnode/constant';\n\nimport getWsClient, { useSubscription } from '../libs/ws';\nimport { useNodeContext } from '../contexts/node';\n\nconst HealthStatus = {\n normal: 'success',\n warning: 'warning',\n error: 'error',\n};\n\nexport default function Health() {\n /**\n * health: {\n * status: HealthStatus\n * message: String\n * }\n */\n const [health, setHealth] = useState({\n status: HealthStatus.normal,\n message: '',\n });\n const [open, setOpen] = useState(false);\n const { t } = useLocaleContext();\n const { enqueueSnackbar } = useSnackbar();\n const { info: nodeInfo = {} } = useNodeContext();\n\n // check access url\n useEffect(() => {\n if (Number(nodeInfo.port) === Number(window.location.port)) {\n const host = window.location.origin.replace(`:${window.location.port}`, '');\n const endpoint = `${host}${nodeInfo.routing.adminPath}`;\n enqueueSnackbar(`${t('health.wrongAccessUrlTip')} ${endpoint}`, {\n autoHideDuration: 1000 * 86400,\n variant: 'error',\n });\n }\n }, [nodeInfo]); // eslint-disable-line\n\n // heartbeat\n useEffect(() => {\n const client = getWsClient();\n const maxTries = 4;\n const heartbeatIntervalMs = 2000;\n let tries = 0;\n let heartbeatTimer;\n const onConnectError = () => {\n setHealth({\n status: HealthStatus.error,\n message: t('health.connectionErrorTip'),\n });\n };\n const onConnectSuccess = () => {\n if (health.status !== HealthStatus.normal) {\n setHealth({\n status: HealthStatus.normal,\n message: t('health.connectionRecoveryTip'),\n });\n }\n };\n\n const startHeartBeat = () => {\n if (!client || !client.isConnected()) {\n if (tries === maxTries) {\n onConnectError();\n }\n tries = (tries + 1) % (maxTries + 1);\n } else {\n onConnectSuccess();\n tries = 0;\n }\n heartbeatTimer = setTimeout(startHeartBeat, heartbeatIntervalMs);\n };\n\n // 第一次轮训的时间是 heartbeatIntervalMs * 4, retry次数为0. 之后每次轮训的时间是 heartbeatIntervalMs, retry 次数是 maxTries\n // e.g\n // 收到 node.stopped 消息后(此时 node 并没有真正 stop), status 由 success 变为 error, 重新开始首次轮询\n // 较长的首次间隔时间确保第一次请求时 node 已经 stop 完成\n tries = maxTries;\n heartbeatTimer = setTimeout(startHeartBeat, heartbeatIntervalMs * 4);\n return () => {\n clearInterval(heartbeatTimer);\n };\n }, [health.status, t]); // eslint-disable-line\n\n // ui control(toast)\n useEffect(() => {\n let timer;\n const durning = 3000;\n if (health.status === HealthStatus.normal && open === true) {\n timer = setTimeout(() => {\n setOpen(false);\n }, durning);\n } else if (health.status !== HealthStatus.normal && open === false) {\n setOpen(true);\n }\n return () => {\n clearTimeout(timer);\n };\n }, [health.status, open]); // eslint-disable-line\n\n // receive server push health status\n useSubscription(\n EVENTS.NODE_STOPPED,\n () => {\n setHealth({\n status: 'error',\n message: t('health.connectionStoppedTip'),\n });\n },\n [t]\n );\n\n return (\n <Snackbar open={open} anchorOrigin={{ vertical: 'top', horizontal: 'center' }}>\n <Alert severity={health.status}>{health.message}</Alert>\n </Snackbar>\n );\n}\n","/* eslint-disable react/jsx-wrap-multilines */\n/* eslint-disable react/prop-types */\nimport Typography from '@mui/material/Typography';\nimport Alert from '@mui/lab/Alert';\nimport AlertTitle from '@mui/lab/AlertTitle';\nimport Button from '@arcblock/ux/lib/Button';\nimport Center from '@arcblock/ux/lib/Center';\n\nfunction ErrorFallback({ error, resetErrorBoundary }) {\n return (\n <Center>\n <Alert\n severity=\"error\"\n action={\n <Button onClick={resetErrorBoundary} color=\"secondary\" variant=\"outlined\">\n Reload\n </Button>\n }\n style={{ minWidth: 480 }}>\n <AlertTitle>Oops, this application crashed</AlertTitle>\n <Typography>{error.message}</Typography>\n </Alert>\n </Center>\n );\n}\n\nexport default ErrorFallback;\n","/* eslint-disable react/prop-types */\n/* eslint-disable object-curly-newline */\nimport { create } from '@arcblock/ux/lib/Theme';\nimport { ThemeProvider as MuiThemeProvider, StyledEngineProvider } from '@mui/material/styles';\nimport { createGlobalStyle, ThemeProvider } from 'styled-components';\nimport CssBaseline from '@mui/material/CssBaseline';\n\nimport teal from '@mui/material/colors/teal';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport 'moment/locale/zh-cn';\nimport { LocaleProvider } from '@arcblock/ux/lib/Locale/context';\nimport { ToastProvider } from '@abtnode/ux/lib/toast';\n\nimport ErrorFallback from './error-fallback';\n\nimport { translations } from '../locales';\nimport { SessionProvider } from '../contexts/session';\nimport { NodeProvider } from '../contexts/node';\n\nconst GlobalStyle = createGlobalStyle`\n a {\n color: ${teal.A700};\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: none;\n }\n\n .page-breadcrumb {\n margin-bottom: 16px !important;\n }\n\n\n .page-header {\n margin-bottom: 32px !important;\n }\n\n ul, li {\n padding: 0;\n margin: 0;\n list-style: none;\n }\n\n .toolbar>div{\n .header-link{\n flex:0;\n\n .header-image {\n margin-left: 14px;\n }\n }\n\n @media (max-width: ${props => props.theme.breakpoints.values.md}px) {\n width:100%;\n .header-link{\n overflow: hidden;\n }\n }\n }\n\n .MuiFormControlLabel-label {\n flex: 1;\n display: inline-flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .form-item {\n margin-top: 20px;\n\n .form-item-label {\n margin-top: 10px;\n }\n\n .form-item-value {\n margin-top: 10px;\n }\n }\n\n .dropzone {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n border-width: 2px;\n border-radius: 2px;\n border-color: #eeeeee;\n border-style: dashed;\n background-color: #fafafa;\n color: #bdbdbd;\n outline: none;\n transition: border 0.24s ease-in-out;\n }\n\n .dropzone:focus {\n border-color: #2196f3;\n }\n\n .MuiTableHead-root th {\n white-space: nowrap;\n }\n .MuiDialog-paper.MuiPaper-rounded {\n @media (max-width: ${props => props.theme.breakpoints.values.md - 1}px) {\n border-radius: 0;\n }\n }\n .MuiButton-outlinedPrimary {\n fill: ${props => props.theme.palette.primary.main};\n }\n .MuiListItemIcon-root {\n svg {\n fill: currentColor;\n }\n }\n\n ${'' /* fix #4192 */}\n .MuiOutlinedInput-root fieldset legend {\n overflow: hidden;\n }\n`;\n\nexport default function Root({ children }) {\n const theme = create({\n typography: {\n fontSize: 14,\n button: {\n textTransform: 'none',\n },\n },\n overrides: {\n MuiTableRow: {\n root: {\n '&:nth-child(even)': {\n backgroundColor: 'rgba(0, 0, 0, 0.02)',\n },\n },\n head: {\n backgroundColor: 'transparent',\n },\n },\n },\n palette: {\n primary: {\n main: '#1DC1C7',\n contrastText: '#fff',\n },\n },\n breakpoints: {\n values: {\n xs: 0,\n sm: 600,\n md: 960,\n lg: 1280,\n xl: 1920,\n },\n },\n });\n\n return (\n <StyledEngineProvider injectFirst>\n <MuiThemeProvider theme={theme}>\n <ThemeProvider theme={theme}>\n <CssBaseline />\n <LocaleProvider translations={translations}>\n <ToastProvider>\n <NodeProvider>\n <SessionProvider\n serviceHost={window.env && window.env.apiPrefix ? window.env.apiPrefix : ''}\n autoLogin={false}>\n <GlobalStyle />\n <div className=\"wrapper\">\n <ErrorBoundary\n FallbackComponent={ErrorFallback}\n onReset={() => {\n window.location.reload();\n }}>\n {children}\n </ErrorBoundary>\n </div>\n </SessionProvider>\n </NodeProvider>\n </ToastProvider>\n </LocaleProvider>\n </ThemeProvider>\n </MuiThemeProvider>\n </StyledEngineProvider>\n );\n}\n","/* eslint-disable operator-linebreak */\nimport { useState, useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Link, useHistory } from 'react-router-dom';\n\nimport List from '@mui/material/MenuList';\nimport ListItem from '@mui/material/MenuItem';\nimport ListItemText from '@mui/material/ListItemText';\nimport ListItemAvatar from '@mui/material/ListItemAvatar';\nimport Spinner from '@arcblock/ux/lib/Spinner';\nimport Avatar from '@mui/material/Avatar';\nimport Divider from '@mui/material/Divider';\nimport Typography from '@mui/material/Typography';\nimport Checkbox from '@mui/material/Checkbox';\nimport FormControlLabel from '@mui/material/FormControlLabel';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport { useNotificationContext } from '../../contexts/notification';\nimport NotificationTag from './tag';\nimport Permission from '../permission';\n\nexport default function NotificationList({ onHide }) {\n const { api, data: notifications, refresh: updateNotifications } = useNotificationContext();\n const { t } = useContext(LocaleContext);\n const [showRead, setShowRead] = useState(true);\n const [isMarkingAll, setIsMarkingAll] = useState(false);\n const history = useHistory();\n\n let filtered = showRead ? notifications : notifications.filter(x => x.read === false);\n filtered = filtered.slice(0, 5);\n const hasUnRead = notifications.filter(x => x.read === false).length > 0;\n\n const onUnreadNotifications = async () => {\n setIsMarkingAll(true);\n const ids = notifications\n .filter(x => x.read === false)\n .map(x => x.id)\n .join(',');\n await api.readNotifications({ input: { id: ids } });\n updateNotifications();\n setIsMarkingAll(false);\n };\n\n const handleNotificationClick = (e, notification) => {\n if (!notification.read) {\n api.readNotifications({ input: { id: notification.id } }).then(() => updateNotifications());\n }\n onHide(e);\n history.push('/notifications');\n };\n\n return (\n <Div>\n <Typography component=\"h3\" variant=\"h6\" className=\"notification-header\">\n {t('notification.title')}\n <Button component={Link} to=\"/notifications\" data-cy=\"view-all-notifications-btn\" onClick={onHide}>\n {t('notification.viewAll')}\n </Button>\n </Typography>\n <Divider />\n <List className=\"notification-list\" style={{ maxHeight: 'calc(100vh - 200px)', overflow: 'auto' }}>\n {filtered.length === 0 && (\n <Typography component=\"p\" variant=\"body1\" className=\"notification-tip\">\n {t('notification.empty')}\n </Typography>\n )}\n {filtered.length > 0 &&\n filtered.map(x => (\n <ListItem key={x.id} alignItems=\"flex-start\" disabled={x.read} onClick={e => handleNotificationClick(e, x)}>\n <ListItemAvatar className=\"list-item-avatar\">\n <>\n <Avatar>{x.entityType.substr(0, 1).toUpperCase()}</Avatar>\n <NotificationTag className=\"notification-tag\" status={x.severity} />\n </>\n </ListItemAvatar>\n <ListItemText className=\"list-item\" primary={x.title} secondary={x.description} />\n </ListItem>\n ))}\n </List>\n <Divider />\n <Typography component=\"div\" className=\"notification-footer\">\n <FormControlLabel\n control={\n <Checkbox checked={showRead} onChange={() => setShowRead(!showRead)} name=\"showRead\" color=\"primary\" />\n }\n label={t('notification.showRead')}\n />\n <Permission permission=\"mutate_notification\">\n {hasUnRead && (\n <Button disabled={isMarkingAll} onClick={onUnreadNotifications} className=\"\">\n {isMarkingAll && <Spinner size={16} />}\n {t('notification.markAllAsRead')}\n </Button>\n )}\n </Permission>\n </Typography>\n </Div>\n );\n}\n\nconst Div = styled.div`\n width: 420px;\n\n @media (max-width: ${props => props.theme.breakpoints.values.sm}px) {\n width: calc(100vw - 10px);\n }\n\n .notification-header {\n padding: 8px 16px;\n display: flex;\n justify-content: space-between;\n }\n\n .notification-tip {\n padding: 8px 16px;\n }\n\n .notification-footer {\n padding: 8px 16px;\n display: flex;\n justify-content: space-between;\n }\n\n .MuiMenuItem-root {\n white-space: pre-wrap;\n }\n\n .list-item-avatar {\n display: flex;\n flex-direction: column;\n align-items: center;\n .notification-tag {\n margin-top: 4px;\n }\n }\n\n .MuiMenuItem-root:not(.Mui-disabled) {\n .MuiAvatar-root {\n background: ${props => props.theme.palette.primary.light};\n }\n }\n\n .list-item {\n .MuiListItemText-secondary {\n overflow: hidden;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n text-overflow: ellipsis;\n }\n }\n`;\n\nNotificationList.propTypes = {\n onHide: PropTypes.func,\n};\n\nNotificationList.defaultProps = {\n onHide: () => {},\n};\n","import { useTheme } from '@mui/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nfunction useWidth() {\n const theme = useTheme();\n const keys = [...theme.breakpoints.keys].reverse();\n return (\n keys.reduce((output, key) => {\n // eslint-disable-next-line\n const matches = useMediaQuery(theme.breakpoints.up(key));\n return !output && matches ? key : output;\n }, null) || 'xs'\n );\n}\n\nexport default useWidth;\n","import SvgIcon from '@mui/material/SvgIcon';\n\nfunction CheckIcon(props) {\n return (\n <SvgIcon {...props}>\n <path\n d=\"M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41\n 10.59L10 14.17L17.59 6.58L19 8L10 17Z\"\n />\n </SvgIcon>\n );\n}\n\nfunction WarningIcon(props) {\n return (\n <SvgIcon {...props}>\n <path d=\"M13,14H11V10H13M13,18H11V16H13M1,21H23L12,2L1,21Z\" />\n </SvgIcon>\n );\n}\n\nfunction ErrorIcon(props) {\n return (\n <SvgIcon {...props}>\n <path\n d=\"M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,\n 6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,\n 13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z\"\n />\n </SvgIcon>\n );\n}\n\nfunction InfoIcon(props) {\n return (\n <SvgIcon {...props}>\n <path\n d=\"M13,9H11V7H13M13,17H11V11H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,\n 0 22,12A10,10 0 0,0 12,2Z\"\n />\n </SvgIcon>\n );\n}\n\nconst iconStyles = {\n fontSize: 20,\n marginInlineEnd: 8,\n};\n\nconst defaultIconVariants = {\n success: <CheckIcon style={iconStyles} />,\n warning: <WarningIcon style={iconStyles} />,\n error: <ErrorIcon style={iconStyles} />,\n info: <InfoIcon style={iconStyles} />,\n};\n\nexport default defaultIconVariants;\n","/* eslint-disable no-unused-vars */\n/* eslint-disable operator-linebreak */\nimport { forwardRef } from 'react';\nimport PropTypes from 'prop-types';\nimport { makeStyles } from '@mui/styles';\nimport styled from 'styled-components';\n\nimport { amber, green } from '@mui/material/colors';\nimport IconButton from '@mui/material/IconButton';\nimport CloseIcon from '@mui/icons-material/Close';\n\nimport { useHistory } from 'react-router-dom';\nimport { useSnackbar, SnackbarContent } from 'notistack';\n\nimport useWidth from '../../hooks/width';\nimport variants from './default-icon-variants';\n\nconst useStyles = makeStyles(theme => {\n const breakpointsMap = {\n xl: '400px',\n lg: '400px',\n md: '400px',\n sm: '300px',\n };\n // const backgroundColor = emphasize(theme.palette.background.default, theme.palette.mode === 'light' ? 0.8 : 0.98);\n const backgroundColor = theme.palette.background.default;\n return {\n lessPadding: {\n paddingLeft: 8 * 2.5,\n },\n contentRoot: {\n ...theme.typography.body2,\n display: 'flex',\n backgroundColor,\n color: '#fff',\n alignItems: 'center',\n padding: '6px 16px',\n borderRadius: '4px',\n boxShadow: '0px 3px 5px -1px rgba(0,0,0,0.2),0px 6px 10px 0px rgba(0,0,0,0.14),0px 1px 18px 0px rgba(0,0,0,0.12)',\n },\n success: props => ({\n backgroundColor: `${green[600]} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n error: props => ({\n backgroundColor: `${theme.palette.error.dark} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n info: props => ({\n backgroundColor: `${theme.palette.primary.main} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n warning: props => ({\n backgroundColor: `${amber[700]} !important`,\n width: breakpointsMap[props.breakpoint],\n }),\n icon: {\n fontSize: 20,\n },\n message: {\n display: 'flex',\n alignItems: 'center',\n padding: '8px 0',\n flex: 1,\n width: 0,\n },\n action: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 'auto',\n marginRight: -8,\n width: 44,\n },\n };\n});\n\nfunction NotificationComponent({ keyId: key, notification = {} }, ref) {\n const classes = useStyles({\n breakpoint: useWidth(),\n });\n\n const combinedClassname = [classes.contentRoot, classes.lessPadding, classes[notification.severity]].join(' ');\n\n const icon = variants[notification.severity];\n\n const { closeSnackbar } = useSnackbar();\n const onClickDismiss = () => closeSnackbar(key);\n\n const history = useHistory();\n const onGoNotification = () => {\n closeSnackbar(key);\n\n history.push('/notifications');\n };\n\n return (\n <SnackbarContent ref={ref} className={combinedClassname}>\n <div className={classes.message}>\n {icon}\n <Div onClick={onGoNotification}>\n <span className=\"title\">{notification.title}</span>\n <span className=\"desc\">{notification.description}</span>\n </Div>\n </div>\n <div className={classes.action}>\n <IconButton key=\"close\" aria-label=\"close\" color=\"inherit\" onClick={onClickDismiss} size=\"large\">\n <CloseIcon className={classes.icon} />\n </IconButton>\n </div>\n </SnackbarContent>\n );\n}\n\nexport default forwardRef(NotificationComponent);\n\nNotificationComponent.propTypes = {\n keyId: PropTypes.number.isRequired,\n notification: PropTypes.object.isRequired,\n};\n\nconst Div = styled.div`\n cursor: pointer;\n display: flex;\n flex-direction: column;\n .title {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1;\n -webkit-box-orient: vertical;\n font-weight: bold;\n }\n .desc {\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n word-break: break-word;\n }\n`;\n","var _path, _path2, _defs;\n\nvar _excluded = [\"title\", \"titleId\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport * as React from \"react\";\n\nfunction SvgLogo(_ref, svgRef) {\n var title = _ref.title,\n titleId = _ref.titleId,\n props = _objectWithoutProperties(_ref, _excluded);\n\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 64,\n height: 64,\n viewBox: \"0 0 64 64\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\",\n ref: svgRef,\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M50.152 10.6417L31.72 0L13.288 10.6417V24.7942L1 31.8887V53.1722L19.432 63.8139L31.6902 56.7366L31.72 56.7538L31.7498 56.7366L44.008 63.8139L62.44 53.1722V31.8887L50.152 24.7942V10.6417ZM60.52 32.9972L48.232 25.9027V11.7502L31.72 2.21703L15.208 11.7502V25.9028L2.92 32.9972V52.0636L19.432 61.5968L31.6902 54.5196L31.72 54.5368L31.7498 54.5196L44.008 61.5968L60.52 52.0636V32.9972Z\",\n fill: \"url(#paint0_linear_606_96)\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M50.1521 24.8307L31.7201 14.189L13.2881 24.8307V46.1141L31.7201 56.7558L50.1521 46.1141V24.8307ZM15.2081 25.9392L31.7201 16.406L48.2321 25.9392V45.0056L31.7201 54.5388L15.2081 45.0056V25.9392ZM28.5464 23.0464C28.6641 22.6342 29.0408 22.3501 29.4695 22.3501H33.9707C34.3993 22.3501 34.776 22.6342 34.8938 23.0464L35.7504 26.0447L37.8696 27.2681L40.8945 26.5109C41.3103 26.4068 41.7447 26.591 41.959 26.9622L44.2096 30.8604C44.424 31.2316 44.3662 31.6998 44.0682 32.0079L41.8999 34.2489V36.6959L44.0682 38.9369C44.3662 39.245 44.424 39.7133 44.2096 40.0845L41.959 43.9827C41.7447 44.3539 41.3103 44.538 40.8945 44.4339L37.8696 43.6767L35.7504 44.9002L34.8938 47.8984C34.776 48.3106 34.3993 48.5947 33.9707 48.5947H29.4695C29.0408 48.5947 28.6641 48.3106 28.5464 47.8984L27.6897 44.9002L25.5706 43.6767L22.5457 44.4339C22.1299 44.538 21.6955 44.3539 21.4812 43.9827L19.2305 40.0845C19.0162 39.7133 19.0739 39.245 19.372 38.9369L21.5402 36.6959V34.2489L19.372 32.0079C19.0739 31.6998 19.0162 31.2316 19.2305 30.8604L21.4812 26.9622C21.6955 26.591 22.1299 26.4068 22.5457 26.5109L25.5706 27.2681L27.6897 26.0447L28.5464 23.0464ZM28.9861 27.5132C29.2018 27.3887 29.3607 27.1851 29.4292 26.9456L30.1936 24.2701H33.2466L34.011 26.9456C34.0794 27.1851 34.2383 27.3887 34.4541 27.5132L37.2459 29.1251C37.4617 29.2497 37.7174 29.2855 37.9591 29.225L40.6583 28.5493L42.1848 31.1932L40.25 33.193C40.0768 33.372 39.9799 33.6114 39.9799 33.8605V37.0843C39.9799 37.3334 40.0768 37.5728 40.25 37.7518L42.1848 39.7516L40.6583 42.3955L37.9591 41.7198C37.7174 41.6593 37.4617 41.6951 37.2459 41.8197L34.4541 43.4316C34.2383 43.5561 34.0794 43.7597 34.011 43.9992L33.2466 46.6747H30.1936L29.4292 43.9992C29.3607 43.7597 29.2018 43.5561 28.9861 43.4316L26.1942 41.8197C25.9785 41.6951 25.7228 41.6593 25.4811 41.7198L22.7819 42.3955L21.2554 39.7516L23.1902 37.7518C23.3634 37.5728 23.4602 37.3334 23.4602 37.0843V33.8605C23.4602 33.6114 23.3634 33.372 23.1902 33.193L21.2554 31.1932L22.7819 28.5493L25.4811 29.225C25.7228 29.2855 25.9785 29.2497 26.1942 29.1251L28.9861 27.5132ZM31.7201 41.6407C28.3134 41.6407 25.5517 38.8791 25.5517 35.4724C25.5517 32.0657 28.3134 29.3041 31.7201 29.3041C35.1268 29.3041 37.8884 32.0657 37.8884 35.4724C37.8884 38.8791 35.1268 41.6407 31.7201 41.6407ZM35.9684 35.4724C35.9684 37.8187 34.0664 39.7207 31.7201 39.7207C29.3738 39.7207 27.4717 37.8187 27.4717 35.4724C27.4717 33.1261 29.3738 31.2241 31.7201 31.2241C34.0664 31.2241 35.9684 33.1261 35.9684 35.4724Z\",\n fill: \"url(#paint1_linear_606_96)\"\n })), _defs || (_defs = /*#__PURE__*/React.createElement(\"defs\", null, /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"paint0_linear_606_96\",\n x1: 31.72,\n y1: 95.7208,\n x2: 95.488,\n y2: 34.3249,\n gradientUnits: \"userSpaceOnUse\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#0FA4B7\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0.494757,\n stopColor: \"#1DC1C7\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#2BE0D7\"\n })), /*#__PURE__*/React.createElement(\"linearGradient\", {\n id: \"paint1_linear_606_96\",\n x1: 28.4374,\n y1: 99.2464,\n x2: 98.7613,\n y2: 44.9372,\n gradientUnits: \"userSpaceOnUse\"\n }, /*#__PURE__*/React.createElement(\"stop\", {\n stopColor: \"#0FA4B7\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 0.494757,\n stopColor: \"#1DC1C7\"\n }), /*#__PURE__*/React.createElement(\"stop\", {\n offset: 1,\n stopColor: \"#2BE0D7\"\n })))));\n}\n\nvar ForwardRef = /*#__PURE__*/React.forwardRef(SvgLogo);\nexport default __webpack_public_path__ + \"static/media/logo.60f66bbe.svg\";\nexport { ForwardRef as ReactComponent };","/* eslint-disable no-unused-vars */\n/* eslint-disable operator-linebreak */\nimport { useSnackbar } from 'notistack';\nimport { EVENTS } from '@abtnode/constant';\nimport { useSubscription } from '../../libs/ws';\nimport NotificationComponent from './notification';\n\nexport default function NotificationToast() {\n const { enqueueSnackbar } = useSnackbar();\n\n useSubscription(EVENTS.NOTIFICATION_CREATE, notification => {\n if (!notification.id) {\n // eslint-disable-next-line no-underscore-dangle\n notification.id = notification._id;\n }\n\n const disableAutoHide = ['error', 'warning'].includes(notification.severity) || notification.sticky;\n\n enqueueSnackbar(notification.description, {\n variant: notification.severity,\n autoHideDuration: disableAutoHide ? null : 3000,\n // eslint-disable-next-line react/no-unstable-nested-components\n content: key => <NotificationComponent keyId={key} notification={notification} />,\n });\n });\n\n return null;\n}\n","/* eslint-disable import/no-unresolved */\n/* eslint-disable react/jsx-one-expression-per-line */\nimport { useState, useRef } from 'react';\n\nimport ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Button from '@mui/material/IconButton';\nimport Paper from '@mui/material/Paper';\nimport Badge from '@mui/material/Badge';\nimport Popper from '@mui/material/Popper';\nimport NotificationIcon from '@arcblock/icons/lib/Notification';\n\nimport { useNotificationContext } from '../../contexts/notification';\nimport NotificationList from '../notifications/list';\nimport NotificationToast from '../notifications/toast';\n\nexport default function NotificationAddon() {\n const context = useNotificationContext();\n const notifications = context ? context.data : [];\n const [notificationOpen, setNotificationOpen] = useState(false);\n const notificationAnchorRef = useRef(null);\n\n const onToggleNotification = () => {\n setNotificationOpen(prevOpen => !prevOpen);\n };\n\n const onCloseNotification = e => {\n if (notificationAnchorRef.current && notificationAnchorRef.current.contains(e.target)) {\n return;\n }\n\n setNotificationOpen(false);\n };\n\n const unreadCount = notifications.filter(x => x.read === false).length;\n\n return (\n <>\n <NotificationToast />\n <div className=\"notification-addon\">\n <Button\n ref={notificationAnchorRef}\n aria-controls=\"notify-list-grow\"\n aria-haspopup=\"true\"\n data-cy=\"toggle-notification-btn\"\n onClick={onToggleNotification}>\n {unreadCount > 0 ? (\n <Badge badgeContent={unreadCount} max={99} color=\"primary\">\n <NotificationIcon style={{ width: 'auto', height: 24 }} />\n </Badge>\n ) : (\n <NotificationIcon style={{ width: 'auto', height: 24 }} />\n )}\n </Button>\n {notificationOpen && (\n <Popper open anchorEl={notificationAnchorRef.current} disablePortal placement=\"bottom-end\">\n <Paper id=\"notify-list-grow\">\n <ClickAwayListener onClickAway={onCloseNotification}>\n <div>\n <NotificationList onHide={onCloseNotification} />\n </div>\n </ClickAwayListener>\n </Paper>\n </Popper>\n )}\n </div>\n </>\n );\n}\n\nNotificationAddon.propTypes = {};\n\nNotificationAddon.defaultProps = {};\n","/* eslint-disable react/prop-types */\nimport { useContext } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link, useLocation } from 'react-router-dom';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport BaseLayout from '@arcblock/ux/lib/Layout/dashboard';\nimport { LocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Tag from '@arcblock/ux/lib/Tag';\nimport { ErrorFallback } from '@arcblock/ux/lib/ErrorBoundary';\nimport DidAddress from '@arcblock/did-connect/lib/Address';\nimport DidAvatar from '@arcblock/did-connect/lib/Avatar';\nimport DashboardIcon from '@arcblock/icons/lib/Dashboard';\nimport StoreIcon from '@arcblock/icons/lib/Store';\nimport BlockletsIcon from '@arcblock/icons/lib/Blocklets';\nimport CodeFolderIcon from '@arcblock/icons/lib/CodeFolder';\nimport LogIcon from '@arcblock/icons/lib/Log';\nimport TeamIcon from '@arcblock/icons/lib/Team';\nimport SettingIcon from '@arcblock/icons/lib/Setting';\n\nimport useMediaQuery from '@mui/material/useMediaQuery';\n\nimport HeaderAddon from '@abtnode/ux/lib/layout/addon';\n\nimport NotificationAddon from './addon-notification';\nimport { useNodeContext } from '../../contexts/node';\nimport { SessionContext } from '../../contexts/session';\nimport { ReactComponent as Logo } from '../../assets/logo.svg';\n\nexport default function Dashboard({ children, title, ...rest }) {\n const { info } = useNodeContext();\n const { t } = useContext(LocaleContext);\n const location = useLocation();\n\n const isBreakpointsUpSm = useMediaQuery(theme => theme.breakpoints.up('sm'));\n\n let links = [\n {\n url: '/dashboard',\n name: 'dashboard',\n title: t('sidebar.dashboard'),\n icon: <DashboardIcon />,\n },\n { url: '/store', name: 'store', title: t('common.store'), icon: <StoreIcon /> },\n { url: '/blocklets', name: 'blocklets', title: t('sidebar.blocklets'), icon: <BlockletsIcon /> },\n ];\n\n if (isBreakpointsUpSm && process.env.NODE_ENV === 'development') {\n links.push({ url: '/console', name: 'console', title: t('sidebar.console'), icon: <CodeFolderIcon /> });\n }\n\n links = links.concat([\n { url: '/logs', name: 'log', title: t('common.log'), icon: <LogIcon /> },\n { url: '/team', name: 'team', title: t('common.team'), icon: <TeamIcon /> },\n { url: '/settings', name: 'settings', title: t('sidebar.settings'), icon: <SettingIcon /> },\n ]);\n\n const mode = info.mode || 'production';\n const tagType = mode === 'production' ? 'success' : 'error';\n\n // TODO: 因为BaseLayout绑定了标签的title,暂时将h2隐藏;以后将 ui 适配转移到 ux的dashboard组件\n return (\n <BaseLayout\n links={links}\n headerProps={{\n brand: (\n <Link to=\"/\" style={{ color: 'inherit' }}>\n {info.name}\n </Link>\n ),\n description: (\n <DidAddress\n compact\n responsive={false}\n copyable={false}\n prepend={<DidAvatar did={info.did} size={16} style={{ marginRight: 4 }} />}>\n {info.did}\n </DidAddress>\n ),\n brandAddon: <Tag type={tagType}>{`${mode} mode`}</Tag>,\n addons: <HeaderAddon SessionContext={SessionContext} extraItems={[<NotificationAddon />]} />,\n logo: (\n <Link to=\"/\">\n <Logo width=\"48\" height=\"48\" />\n </Link>\n ),\n }}\n title={`${title}-${info.name}`}\n legacy={false}\n {...rest}>\n <ErrorBoundary FallbackComponent={ErrorFallback} resetKeys={[location.pathname]}>\n {children}\n </ErrorBoundary>\n </BaseLayout>\n );\n}\n\nDashboard.propTypes = {\n children: PropTypes.any.isRequired,\n title: PropTypes.string,\n};\n\nDashboard.defaultProps = {\n title: 'Blocklet Server',\n};\n","import PropTypes from 'prop-types';\nimport styled from 'styled-components';\nimport { Route } from 'react-router-dom';\nimport DashboardLayout from './index';\n\n/**\n * 包装 Route & DashboardLayout, 避免在每次路由切换时 unmount/mount DashboardLayout (导致 sidebar 图标也跟着 unmount/mount - 闪烁问题)\n */\nfunction DashboardLayoutRoute({ component: Component, title, scrollable, fullWidth, ...rest }) {\n return (\n <Route\n {...rest}\n render={props => (\n <StyledDashboardLayout scrollable={scrollable} fullWidth={fullWidth} title={title}>\n <Component {...props} />\n </StyledDashboardLayout>\n )}\n />\n );\n}\n\nDashboardLayoutRoute.propTypes = {\n title: PropTypes.string,\n component: PropTypes.any.isRequired,\n // layout 是否可滚动, ux/dashboard 默认行为是可滚动, 某些页面 (比如 console, logger) 的布局, 更像 app-styled layout,\n // 对此可以将 scrollable 设置为 false, content 自行控制滚动\n scrollable: PropTypes.bool,\n fullWidth: PropTypes.bool,\n};\n\nDashboardLayoutRoute.defaultProps = {\n title: 'Blocklet Server',\n scrollable: true,\n fullWidth: false,\n};\n\nconst StyledDashboardLayout = styled(DashboardLayout)`\n .dashboard-content {\n padding-top: 16px;\n ${props => (props.scrollable ? '' : 'overflow: hidden')};\n }\n`;\n\nexport default DashboardLayoutRoute;\n","import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport Toast from '@abtnode/ux/lib/toast';\nimport { EVENTS } from '@abtnode/constant';\n\nimport { useNodeContext } from '../contexts/node';\nimport { useSessionContext } from '../contexts/session';\nimport { useSubscription } from '../libs/ws';\n\n// eslint-disable-next-line react/prop-types\nexport default function GlobalSubscriber() {\n const { t } = useLocaleContext();\n const { session } = useSessionContext();\n const { info: nodeInfo, refresh: refreshNode } = useNodeContext();\n\n // auto logout\n useSubscription(EVENTS.USER_UPDATED, ({ teamDid, user }) => {\n if (teamDid === nodeInfo.did) {\n if (user && !user.approved && session && session.user && session.user.did === user.did) {\n Toast.warning(t('session.forbidLogin'), { autoHideDuration: 10 * 1000 });\n session.logout();\n }\n }\n });\n\n // refresh node info\n useSubscription(EVENTS.NOTIFICATION_CREATE, notification => {\n if (notification.entityType === 'node') {\n refreshNode({ silent: true });\n }\n });\n\n useSubscription(EVENTS.NODE_UPDATED, () => {\n refreshNode({ silent: true });\n });\n\n return null;\n}\n","/* eslint-disable object-curly-newline */\nimport { Suspense, lazy, useEffect } from 'react';\nimport { BrowserRouter as Router, Route, Switch, Redirect, withRouter } from 'react-router-dom';\n\nimport moment from 'moment';\nimport 'moment/locale/zh-cn';\n\nimport CssBaseline from '@mui/material/CssBaseline';\nimport Spinner from '@arcblock/ux/lib/Spinner';\n\nimport Center from '@arcblock/ux/lib/Center';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\nimport { getServerAuthMethod } from '@abtnode/auth/lib/util/get-auth-method';\n\nimport { WELLKNOWN_SERVICE_PATH_PREFIX } from '@abtnode/constant';\n\nimport history from './libs/history';\nimport NodeConnectOwner from './components/node/connect-owner';\nimport NodeVerifyOwner from './components/node/verify-owner';\nimport NodeUpgrade from './components/node/upgrade/progress';\nimport NodeLogin from './components/node/login';\nimport Health from './components/health';\nimport Root from './components/root';\nimport DashboardLayoutRoute from './components/layout/layout-route';\nimport GlobalSubscriber from './components/global-subscriber';\n\nimport { useSessionContext } from './contexts/session';\nimport { useNodeContext } from './contexts/node';\nimport { NotificationProvider } from './contexts/notification';\nimport { BlockletProvider } from './contexts/blocklets';\nimport { RoutingProvider } from './contexts/routing';\n\nimport getWsClient from './libs/ws';\nimport useQuery from './hooks/query';\n\nconst BlockletList = lazy(() => import(/* webpackPrefetch: true */ './pages/blocklets/index'));\nconst BlockletDetail = lazy(() => import(/* webpackPrefetch: true */ './pages/blocklets/detail'));\nconst BlockletStore = lazy(() => import(/* webpackPrefetch: true */ './pages/store/index'));\nconst Dashboard = lazy(() => import(/* webpackPrefetch: true */ './pages/dashboard/index'));\nconst Settings = lazy(() => import(/* webpackPrefetch: true */ './pages/settings/index'));\nconst EULAPage = lazy(() => import(/* webpackPrefetch: true */ './pages/eula/index'));\nconst Console = lazy(() => import(/* webpackPrefetch: true */ './pages/console/index'));\nconst Notifications = lazy(() => import(/* webpackPrefetch: true */ './pages/notifications/index'));\nconst LogPage = lazy(() => import(/* webpackPrefetch: true */ './pages/logger/index'));\nconst TeamPage = lazy(() => import(/* webpackPrefetch: true */ './pages/team/index'));\nconst IssuePassport = lazy(() => import(/* webpackPrefetch: true */ './pages/issue-passport/index'));\nconst LostPassport = lazy(() => import(/* webpackPrefetch: true */ './pages/lost-passport/index'));\nconst BlockletLauncher = lazy(() => import(/* webpackPrefetch: true */ './pages/launch-blocklet/index'));\nconst NotFoundPage = lazy(() => import(/* webpackPrefetch: true */ './pages/notfound/index'));\nconst Invite = lazy(() => import(/* webpackPrefetch: true */ './pages/invite/index'));\n\nfunction useSharedContext() {\n const node = useNodeContext();\n const { session } = useSessionContext();\n\n const userDid = session.user && session.user.did;\n\n // init ws client\n useEffect(() => {\n const wsClient = getWsClient();\n if (userDid) {\n wsClient.connect();\n } else if (wsClient.isConnected()) {\n wsClient.disconnect();\n }\n return () => {\n if (wsClient.isConnected()) {\n wsClient.disconnect();\n }\n };\n }, [userDid]);\n\n // auto check session when page visibility change\n useEffect(() => {\n const refresh = async () => {\n if (document.visibilityState === 'visible') {\n session.refresh();\n }\n };\n document.addEventListener('visibilitychange', refresh);\n return () => {\n document.removeEventListener('visibilitychange', refresh);\n };\n }, []); // eslint-disable-line\n\n return { node, session };\n}\n\nexport function ProtectedApp() {\n const { t } = useLocaleContext();\n const { node, session } = useSharedContext();\n\n const loadingEle = <Spinner />;\n\n if (node.loading || session.loading) {\n return <Center>{loadingEle}</Center>;\n }\n\n if (!node.info.initialized) {\n if (getServerAuthMethod(node.info) === 'nft') {\n return <NodeVerifyOwner action=\"verify-owner\" />;\n }\n\n return (\n <Center>\n <NodeConnectOwner />\n </Center>\n );\n }\n\n if (node.info.upgradeSessionId) {\n return (\n <Center>\n <NodeUpgrade />\n </Center>\n );\n }\n\n if (!session.user) {\n return <NodeLogin loadingEle={loadingEle} />;\n }\n\n const fallback = (\n <Center>\n <Spinner />\n </Center>\n );\n\n return (\n <NotificationProvider>\n <BlockletProvider>\n <RoutingProvider>\n <Health />\n <GlobalSubscriber />\n <Suspense fallback={fallback}>\n <Switch>\n <DashboardLayoutRoute exact path=\"/dashboard\" component={Dashboard} title=\"Dashboard\" />\n <Redirect exact path=\"/\" to=\"/dashboard\" />\n <DashboardLayoutRoute exact path=\"/blocklets\" component={BlockletList} title={t('common.blocklets')} />\n <DashboardLayoutRoute exact path=\"/blocklets/:did/:tab\" component={BlockletDetail} title=\"Blocklets\" />\n <DashboardLayoutRoute exact path=\"/settings/:tab\" component={Settings} title={t('common.setting')} />\n <DashboardLayoutRoute exact path=\"/eula\" component={EULAPage} title={t('setup.steps.eula')} />\n <DashboardLayoutRoute exact path=\"/store\" component={BlockletStore} title={t('common.store')} />\n <DashboardLayoutRoute exact path=\"/store/search\" component={BlockletStore} title={t('common.store')} />\n <DashboardLayoutRoute\n exact\n path=\"/store/category/:category\"\n component={BlockletStore}\n title={t('common.store')}\n />\n <DashboardLayoutRoute\n exact\n path=\"/console\"\n component={Console}\n scrollable={false}\n fullWidth\n title={`GraphQL ${t('common.console')}`}\n />\n <DashboardLayoutRoute exact path=\"/notifications\" component={Notifications} />\n <DashboardLayoutRoute exact path=\"/team/:tab\" component={TeamPage} title={t('common.team')} />\n <DashboardLayoutRoute\n exact\n path=\"/logs/:name\"\n component={LogPage}\n scrollable={false}\n fullWidth\n title={t('common.log')}\n />\n <Redirect exact path=\"/team\" to=\"/team/members\" title={t('common.team')} />\n <Redirect exact path=\"/logs\" to=\"/logs/abtnode\" />\n <Redirect exact path=\"/router\" to=\"/router/rules\" />\n <Redirect exact path=\"/settings\" to=\"/settings/basic\" />\n <Redirect exact path=\"/marketplace\" to=\"/store\" />\n <Redirect exact path=\"/marketplace/:did\" to=\"/store/:did\" />\n <DashboardLayoutRoute component={NotFoundPage} />\n </Switch>\n </Suspense>\n </RoutingProvider>\n </BlockletProvider>\n </NotificationProvider>\n );\n}\n\n// eslint-disable-next-line react/prop-types\nexport const withUnprotected = PageComponent =>\n function WithUnprotected(...props) {\n const { node, session } = useSharedContext();\n\n if (node.loading || session.loading) {\n return (\n <Center>\n <Spinner />\n </Center>\n );\n }\n\n if (node.info.upgradeSessionId) {\n return (\n <Center>\n <NodeUpgrade />\n </Center>\n );\n }\n\n return <PageComponent {...props} />;\n };\n\nfunction App() {\n const { locale, changeLocale } = useLocaleContext();\n const query = useQuery();\n moment.locale(locale === 'zh' ? 'zh-cn' : locale);\n\n useEffect(() => {\n const queryStringLocale = query.get('locale');\n if (queryStringLocale && ['zh', 'en'].includes(queryStringLocale)) {\n changeLocale(queryStringLocale);\n }\n }, []); // eslint-disable-line\n\n const fallback = (\n <Center>\n <Spinner />\n </Center>\n );\n\n return (\n <Suspense fallback={fallback}>\n <Switch>\n <Route\n exact\n path={`${WELLKNOWN_SERVICE_PATH_PREFIX}/issue-passport`}\n component={withUnprotected(IssuePassport)}\n />\n <Route\n exact\n path={`${WELLKNOWN_SERVICE_PATH_PREFIX}/lost-passport`}\n component={withUnprotected(LostPassport)}\n />\n <Route\n exact\n path=\"/accept-server\"\n // eslint-disable-next-line react/no-unstable-nested-components\n component={withUnprotected(() => (\n <NodeVerifyOwner action=\"accept-server\" />\n ))}\n />\n <Route path=\"/launch-blocklet\" component={BlockletLauncher} />\n <Route exact path={`${WELLKNOWN_SERVICE_PATH_PREFIX}/invite`} component={Invite} />\n <Route>\n <ProtectedApp />\n </Route>\n </Switch>\n </Suspense>\n );\n}\n\nconst WithRouter = withRouter(Root);\n\nexport default function AppWrapper() {\n const prefix = window.env && window.env.apiPrefix ? window.env.apiPrefix : '/';\n return (\n <>\n <CssBaseline />\n <Router history={history} basename={prefix}>\n <WithRouter>\n <App />\n </WithRouter>\n </Router>\n </>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport App from './app';\n\nconst root = createRoot(document.getElementById('root'));\nroot.render(<App />);\n","/* eslint-disable max-len */\n/* eslint-disable implicit-arrow-linebreak */\n/* eslint-disable import/prefer-default-export */\nimport 'moment/locale/zh-cn';\n\nimport qs from 'querystring';\nimport isUrl from 'is-url';\nimport moment from 'moment';\nimport humanizeUrl from 'humanize-url';\nimport filesize from 'filesize';\nimport joinURL from 'url-join';\nimport get from 'lodash/get';\nimport { BLOCKLET_INTERFACE_TYPE_SERVICE } from '@blocklet/meta/lib/constants';\nimport {\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_DEFAULT_SITE,\n DOMAIN_FOR_INTERNAL_SITE,\n ROLES,\n WELLKNOWN_SERVICE_PATH_PREFIX,\n WELLKNOWN_PING_PREFIX,\n} from '@abtnode/constant';\nimport { evaluateURLs } from '@abtnode/util/lib/url-evaluation';\nimport checkAccessible from '@abtnode/util/lib/url-evaluation/check-accessible-browser';\nimport axios from '@abtnode/util/lib/axios';\nimport { last } from 'lodash';\nimport trimEnd from 'lodash/trimEnd';\n\nexport function sleep(t) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise(resolve => setTimeout(resolve, process.env.NODE_ENV === 'production' ? t / 5 : t));\n}\n\nexport function formatTimestamp(ts) {\n if (!ts) {\n return '-';\n }\n\n let date;\n if (Number(ts).toString() === ts) {\n date = new Date();\n date.setTime(ts);\n } else {\n date = new Date(ts);\n }\n\n return date.toLocaleString();\n}\n\nexport function formatToDate(date) {\n if (!date) {\n return '-';\n }\n\n return moment(date).format('ll');\n}\n\nexport function formatToDatetime(date) {\n if (!date) {\n return '-';\n }\n\n return moment(date).format('lll');\n}\n\nexport function formatTimeFromNow(date) {\n if (!date) {\n return '-';\n }\n const startDate = moment(date);\n const endDate = moment();\n\n const diffDay = endDate.diff(startDate, 'day');\n\n return diffDay > 3 ? formatToDate(date) : startDate.fromNow();\n}\n\nexport function formatTime(date, format = 'lll') {\n if (!date) {\n return '-';\n }\n\n return moment(date).format(format);\n}\n\nexport const formatError = error => {\n if (Array.isArray(error.errors)) {\n return error.errors.map(x => x.message).join('\\n');\n }\n\n return error.message;\n};\n\nexport const formatLocale = (locale = 'en') => {\n if (locale === 'zh') {\n return 'zh_CN';\n }\n\n return locale;\n};\n\nexport const parseQuery = str =>\n str\n .replace(/^\\?/, '')\n .split('&')\n .map(x => x.split('='))\n .filter(([key]) => !!key)\n .reduce((memo, x) => {\n const key = x[0];\n const value = decodeURIComponent(x[1]) || true;\n memo[key] = value;\n return memo;\n }, {});\n\n// Append any query string url to api requests\nexport const appendParams = (url, extraParams = {}) => {\n const [pathname, query = ''] = url.split('?');\n const oldParams = parseQuery(query);\n\n const params = Object.assign({}, oldParams, extraParams);\n return `${pathname}?${qs.stringify(params)}`;\n};\n\nexport const isInProgress = status =>\n ['waiting', 'downloading', 'starting', 'installing', 'stopping', 'upgrading', 'restarting', 'deleting'].includes(\n status\n );\n\nexport const isInstalling = status => ['waiting', 'downloading', 'installing', 'upgrading'].includes(status);\n\nexport const isDownloading = status => ['waiting', 'downloading'].includes(status);\n\nexport const formatDiskSize = (size, serverPlatform = '') => {\n const base = serverPlatform === 'linux' ? 2 : 10;\n return filesize(size, { base, round: 2 });\n};\n\nexport const checkInputByType = (type, value) => {\n const typesMap = {\n url: isUrl,\n };\n\n if (!type) {\n return true;\n }\n\n if (typesMap[type]) {\n return typesMap[type](value);\n }\n\n return false;\n};\n\nexport const formatUrl = url => humanizeUrl(url.split('?').shift());\n\nexport const formatPerson = person => {\n if (!person) {\n return '-';\n }\n if (typeof person === 'string') {\n return person;\n }\n\n const name = person.name || '';\n const u = person.url || person.web;\n const url = u ? ` (${u})` : '';\n const e = person.email || person.mail;\n const email = e ? ` <${e}>` : '';\n\n return name + email + url;\n};\n\nexport const getBlockletServices = blocklet => {\n const services = [];\n const interfaces = (blocklet.meta.interfaces || []).filter(x => x.type === BLOCKLET_INTERFACE_TYPE_SERVICE);\n interfaces.forEach(x => {\n services.push({\n name: x.name,\n protocol: x.protocol,\n port: Number(x.port.external),\n upstreamPort: Number(blocklet.ports[x.port.internal]),\n });\n });\n\n return services;\n};\n\nexport const shouldCheckDomainStatus = domain =>\n domain && // eslint-disable-line\n ![DOMAIN_FOR_IP_SITE, DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE, DOMAIN_FOR_INTERNAL_SITE].includes(domain);\n\nexport const checkIsWildcardDomain = url => {\n try {\n if (!url) {\n return false;\n }\n\n const tempUrl = url.startsWith('http') ? url : `http://${url}`;\n const urlObj = new window.URL(tempUrl);\n return decodeURIComponent(urlObj.host)\n .split('.')\n .some(x => x === '*');\n } catch (error) {\n console.error(url, error);\n return false;\n }\n};\n\nexport const stringSortHandlerAsc = (strA = '', strB = '') => {\n if (strA > strB) {\n return 1;\n }\n\n if (strB > strA) {\n return -1;\n }\n\n return 0;\n};\n\nexport const getEndPoint = nodeInfo => {\n const { routing } = nodeInfo;\n const { protocol, hostname, origin, port } = window.location;\n\n let endpoint = `${origin}${routing.adminPath}`;\n if (process.env.NODE_ENV === 'development') {\n endpoint = `${protocol}//${hostname}:${port}`;\n }\n\n return endpoint;\n};\n\nexport const getInviteLink = ({ inviteId, endpoint }) => {\n if (!endpoint) {\n return '';\n }\n\n const u = new URL(endpoint);\n u.pathname = joinURL(u.pathname, WELLKNOWN_SERVICE_PATH_PREFIX, 'invite');\n u.searchParams.set('inviteId', inviteId);\n return u.href;\n};\n\nexport const getIssuePassportLink = ({ id, endpoint }) => {\n if (!endpoint) {\n return '';\n }\n\n const u = new URL(endpoint);\n u.pathname = joinURL(u.pathname, WELLKNOWN_SERVICE_PATH_PREFIX, 'issue-passport');\n u.searchParams.set('id', id);\n return u.href;\n};\n\nexport const formatRegistryScreenshotPath = (did, asset) => {\n if (asset.startsWith('/assets')) {\n return asset;\n }\n\n return `/assets/${did}/screenshots/${asset}`;\n};\n\nexport const formatRegistryLogoPath = (did, asset) => {\n if (asset.startsWith('/assets')) {\n return asset;\n }\n\n return `/assets/${did}/${asset}`;\n};\n\nexport function getWebWalletUrl(info) {\n try {\n const url = window.localStorage.getItem('wallet_url');\n if (url) {\n return url;\n }\n } catch (err) {\n // Do nothing\n }\n\n return info && info.webWalletUrl ? info.webWalletUrl : '';\n}\n\nexport function isValidClusterSize(data) {\n const { value, cpuCores } = data;\n if (!value) {\n return '';\n }\n\n const v = Number(value);\n if (Number.isNaN(v)) {\n return 'Cluster size should be a number';\n }\n if (!Number.isInteger(v)) {\n return 'Cluster size should be integer';\n }\n if (v <= 0 || v > cpuCores) {\n return `Cluster size should between 1 to ${cpuCores}`;\n }\n\n return '';\n}\n\nexport function isProtectedRole(role) {\n return Object.values(ROLES).includes(role);\n}\n\nexport function formatFactoryPrice(blocklet) {\n if (!blocklet?.payment) {\n return [];\n }\n\n const list = (blocklet.payment?.price || []).map(item => ({ name: item.symbol, value: item.value }));\n return list;\n}\n\nexport const getBlockletLogoUrl = ({ did, baseUrl, logoPath }) => {\n if (baseUrl.startsWith('http') && logoPath) {\n return joinURL(baseUrl, formatRegistryLogoPath(did, logoPath));\n }\n\n const prefix = window.env.apiPrefix || '/';\n let apiPrefix = prefix.replace(/^\\/+/, '').replace(/\\/+$/, '');\n if (apiPrefix) {\n apiPrefix = `/${apiPrefix}`;\n }\n\n return joinURL(apiPrefix, `/blocklet/logo/${did}`);\n};\n\nexport const getPathPrefix = () => (window.env && window.env.apiPrefix ? window.env.apiPrefix : '/');\n\nexport const isUrlAccessible = async url => checkAccessible(joinURL(new URL(url).origin, WELLKNOWN_PING_PREFIX));\n\nexport const getAccessibleUrl = async urls => {\n try {\n const res = await evaluateURLs(urls);\n return res[0].url;\n } catch (error) {\n console.warn('get accessible url failed');\n return '';\n }\n};\n\n/**\n * 检查证书是否与 blocklet 匹配\n * @param {string[]} blockletUrls - 通过 blocklet#interfaces#url 获取到的一组 url\n * @param {object[]} matchedSites - 通过 certificate#matchedSites 获取到的一组 site\n * @returns {boolean} - 匹配则返回 true\n */\nexport const isCertificateMatch = (blockletUrls = [], matchedSites = []) => {\n try {\n return matchedSites\n .map(item => item.domain)\n .some(domain => {\n return blockletUrls.some(blockletUrl => {\n const url = new window.URL(blockletUrl);\n return url.hostname === domain;\n });\n });\n } catch (e) {\n console.warn('domain match failed');\n return false;\n }\n};\n\nexport const getBlockletUrlParams = (blocklet, locale) =>\n (blocklet || {}).status === 'running' ? { locale } : { locale, __start__: 1 };\n\n/**\n * 判断是否在safari浏览器中\n * 不传的ua情况下,使用当前页面的ua\n * chrome浏览器的ua也会带有 Safari 字样,所以要排除 Chrome 字符串\n * iPhone 设备下,所有浏览器都是 safari 的 webkit\n * @param {String} ua userAgent 字符串\n * @returns bool\n */\nexport const isSafari = (ua = window.navigator.userAgent) => {\n return ua.includes('iPhone') || (ua.includes('Safari') && !ua.includes('Chrome'));\n};\n\n/**\n *\n * @export\n * @param {string} url\n * @return {string}\n */\nexport function deepDecodeURIComponent(url) {\n let lastDecodeUrl = decodeURIComponent(url);\n\n while (lastDecodeUrl !== decodeURIComponent(lastDecodeUrl)) {\n lastDecodeUrl = decodeURIComponent(lastDecodeUrl);\n }\n\n return lastDecodeUrl;\n}\n\n/**\n *\n * @description 已知nextWorkflow的地址,提取它的statusUrl和token\n * @export\n * @param {string} nextWorkflow\n * @returns {{\n * statusUrl: string;\n * token: string;\n * }}\n */\nexport function extractStatusUrlFromNextWorkflow(nextWorkflow) {\n const nextWorkflowURL = new URL(deepDecodeURIComponent(nextWorkflow)).searchParams.get('url');\n\n return {\n statusUrl: nextWorkflowURL.replace('/auth?', '/status?'),\n token: new URL(nextWorkflowURL).searchParams.get('_t_'),\n };\n}\n\nexport function getBlockletMetaUrl(registry, did) {\n return joinURL(registry, `/api/blocklets/${did}/blocklet.json?source=webapp`);\n}\n\nexport async function getAsset(chainHost, address) {\n const result = await axios.post(\n joinURL(chainHost, '/api/gql/'),\n JSON.stringify({\n query: `{\n getAssetState(address: \"${address}\") {\n state {\n address\n data {\n typeUrl\n value\n }\n issuer\n owner\n parent\n }\n }\n }`,\n }),\n {\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n timeout: 60 * 1000,\n }\n );\n\n const state = get(result.data, 'data.getAssetState.state');\n if (state && state.data.typeUrl === 'json') {\n state.data.value = JSON.parse(state.data.value);\n }\n\n return state;\n}\n\nexport async function getAssetExpiration(chainHost, address) {\n const asset = await getAsset(chainHost, address);\n\n return last(get(asset, 'data.value.expirationDate', []));\n}\n\nexport function getRelativeTime(datetime, locale = 'en') {\n return moment(datetime).locale(formatLocale(locale)).fromNow().toString();\n}\n\n/**\n * 检查url是否 未添加到 store registryList 中\n * @param {string} url - 需要检查的url\n * @param {object[]} blockletRegistryList - 后端的store registryList, 一般是 info.blockletRegistryList\n * @returns {Object.freeze({\n * isNew: boolean;\n * decoded: string;\n * })} - 返回判断是否是新的url和解码后的url\n */\nexport const isNewRegistryUrl = (url, blockletRegistryList) => {\n if (typeof url === 'string') {\n let decoded = decodeURIComponent(url?.trim());\n\n const regex = /^https?:\\/\\//;\n\n if (!regex.test(decoded)) {\n decoded = `https://${decoded}`;\n }\n\n decoded = trimEnd(decoded, '/');\n\n // validate\n try {\n new URL(decoded); // eslint-disable-line no-new\n } catch {\n throw new Error('Invalid Blocklet Store URL');\n }\n\n if (blockletRegistryList?.some(item => [url, decoded].includes(item.url))) {\n return {\n isNew: false,\n decoded,\n };\n }\n\n return {\n isNew: true,\n decoded,\n };\n }\n\n return {\n isNew: false,\n decoded: '',\n };\n};\n","/* eslint-disable no-await-in-loop */\nconst get = require('lodash/get');\nconst slugify = require('slugify');\n\nconst { NODE_SERVICES, SLOT_FOR_IP_DNS_SITE, WHO_CAN_ACCESS } = require('@abtnode/constant');\n\nconst {\n BlockletGroup,\n fromBlockletStatus,\n fromBlockletSource,\n BLOCKLET_INTERFACE_TYPE_WEB,\n BLOCKLET_CONFIGURABLE_KEY,\n} = require('./constants');\n\nconst getComponentId = (component, ancestors = []) =>\n `${ancestors.map((x) => (x && x.meta ? x.meta.did : '')).join('/')}${ancestors.length ? '/' : ''}${\n component && component.meta ? component.meta.did : ''\n }`;\n\nconst getComponentName = (component, ancestors = []) =>\n `${ancestors.map((x) => (x && x.meta ? x.meta.name : '')).join('/')}${ancestors.length ? '/' : ''}${\n component && component.meta ? component.meta.name : ''\n }`;\n\nconst getComponentBundleId = (component) => `${component.meta.bundleName}@${component.meta.version}`;\n\nconst forEachBlocklet = (\n blocklet,\n cb,\n { parallel = false, sync, params: inputParams, _parent, _root, _level = 0, _tasks: inputTasks, _ancestors = [] } = {}\n) => {\n const root = _root || _parent || blocklet;\n\n // id maybe meaningless if no meta in blocklet or _ancestors\n const id = getComponentId(blocklet, _ancestors);\n\n const newAncestors = _ancestors.concat(blocklet);\n\n // sync\n if (sync) {\n const params = cb(blocklet, {\n parent: _parent,\n root,\n level: _level,\n params: inputParams,\n ancestors: _ancestors,\n id,\n });\n if (blocklet.children) {\n for (const child of blocklet.children) {\n forEachBlocklet(child, cb, {\n sync,\n params,\n _parent: blocklet,\n _root: root,\n _level: _level + 1,\n _ancestors: newAncestors,\n });\n }\n }\n return null;\n }\n\n // serial\n if (!parallel) {\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async (resolve, reject) => {\n try {\n const params = await cb(blocklet, {\n parent: _parent,\n root,\n level: _level,\n ancestors: _ancestors,\n params: inputParams,\n id,\n });\n if (blocklet.children) {\n for (const child of blocklet.children) {\n await forEachBlocklet(child, cb, {\n params,\n _parent: blocklet,\n _root: root,\n _level: _level + 1,\n _ancestors: newAncestors,\n });\n }\n }\n\n resolve(null);\n } catch (err) {\n reject(err);\n }\n });\n }\n\n // parallel\n const tasks = inputTasks || [];\n tasks.push(cb(blocklet, { parent: _parent, root, level: _level, ancestors: _ancestors }));\n if (blocklet.children) {\n for (const child of blocklet.children) {\n forEachBlocklet(child, cb, {\n parallel,\n _parent: blocklet,\n _root: root,\n _level: _level + 1,\n _tasks: tasks,\n _ancestors: newAncestors,\n id,\n });\n }\n }\n if (inputTasks) {\n return null;\n }\n return Promise.all(tasks);\n};\n\nconst forEachBlockletSync = (blocklet, cb) => forEachBlocklet(blocklet, cb, { sync: true });\n\nconst forEachChild = (blocklet, cb, params) => {\n return forEachBlocklet(\n blocklet,\n (b, opt) => {\n if (opt.level === 0) {\n return {};\n }\n return cb(b, opt);\n },\n params\n );\n};\n\nconst forEachChildSync = (blocklet, cb) => forEachChild(blocklet, cb, { sync: true });\n\nconst findComponentById = (blocklet, componentId, { _ancestors = [], returnAncestors = false } = {}) => {\n const id = getComponentId(blocklet, _ancestors);\n if (componentId === id) {\n if (returnAncestors) {\n return {\n component: blocklet,\n ancestors: _ancestors,\n };\n }\n\n return blocklet;\n }\n\n for (const child of blocklet.children || []) {\n const ancestors = _ancestors.concat(blocklet);\n const component = findComponentById(child, componentId, { _ancestors: ancestors, returnAncestors });\n if (component) {\n return component;\n }\n }\n\n return null;\n};\n\nconst getSharedConfigObj = (component, ancestors) => {\n const res = {};\n if (!ancestors) {\n return res;\n }\n\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const ancestor = ancestors[i];\n if (Array.isArray(ancestor.configs)) {\n ancestor.configs.forEach(({ key, value, secure, shared }) => {\n if (res[key]) {\n return;\n }\n\n if (!value || secure !== false || shared === false || BLOCKLET_CONFIGURABLE_KEY[key]) {\n return;\n }\n\n const config = (component.configs || []).find((x) => x.key === key);\n if (config && config.value) {\n return;\n }\n\n res[key] = value;\n });\n }\n }\n\n return res;\n};\n\nconst getAppMissingConfigs = (blocklet = {}) => {\n const missingConfigs = [];\n\n forEachBlockletSync(blocklet, (b, { ancestors }) => {\n const configs = b.configs || [];\n const sharedConfigObj = getSharedConfigObj(b, ancestors);\n configs.forEach((item) => {\n if (item.required && !item.value && !sharedConfigObj[item.key]) {\n missingConfigs.push({ did: b.meta.did, key: item.key, description: item.description });\n }\n });\n });\n\n return missingConfigs;\n};\n\nconst getComponentMissingConfigs = (component = {}, ancestors = []) => {\n const missingConfigs = [];\n\n const configs = component.configs || [];\n const sharedConfigObj = getSharedConfigObj(component, ancestors);\n configs.forEach((item) => {\n if (item.required && !item.value && !sharedConfigObj[item.key]) {\n missingConfigs.push({ did: component.meta.did, key: item.key, description: item.description });\n }\n });\n\n return missingConfigs;\n};\n\nconst isFreeBlocklet = (meta) => {\n if (!meta.payment) {\n return true;\n }\n\n const priceList = (meta.payment.price || []).map((x) => x.value || 0);\n return priceList.every((x) => x === 0);\n};\n\nconst isComponentBlocklet = (meta) => {\n return get(meta, 'capabilities.component') !== false;\n};\n\nconst wipeSensitiveData = (blocklet) => {\n if (!blocklet) {\n return blocklet;\n }\n\n forEachBlocklet(\n blocklet,\n (d) => {\n (d.configs || []).forEach((x) => {\n if (x.secure) {\n x.value = x.value ? '__encrypted__' : '';\n }\n });\n (d.environments || []).forEach((x) => {\n if (['BLOCKLET_APP_SK'].includes(x.key)) {\n x.value = '__encrypted__';\n }\n });\n\n delete blocklet.configObj;\n delete blocklet.environmentObj;\n },\n { sync: true }\n );\n\n return blocklet;\n};\n\nconst isDeletableBlocklet = (blocklet) => {\n if (!blocklet) {\n return false;\n }\n\n const config = blocklet.environments.find((x) => x.key === 'BLOCKLET_DELETABLE');\n if (!config) {\n return true;\n }\n\n return config.value === 'yes';\n};\n\nconst hasRunnableComponent = (blocklet) => {\n let has = false;\n forEachBlockletSync(blocklet, (x) => {\n if (x.meta.group !== BlockletGroup.gateway) {\n has = true;\n }\n });\n\n return has;\n};\n\n/**\n * 获取 blocklet 的 name\n * @param {Object} blocklet 应用数据\n * @param {Boolean} onlyUseMeta 优先使用应用元数据的name\n * @returns blocklet display name\n */\nconst getDisplayName = (blocklet, onlyUseMeta = false) => {\n const { meta } = blocklet;\n let displayName;\n\n if (!onlyUseMeta && blocklet.environments) {\n const target = blocklet.environments.find((e) => e.key === 'BLOCKLET_APP_NAME');\n if (target && target.value) {\n displayName = target.value;\n }\n }\n return displayName || meta.title || meta.name;\n};\n\nconst fixBlockletStatus = (blocklet) => {\n if (!blocklet) {\n return;\n }\n\n forEachBlockletSync(blocklet, (b) => {\n b.status = fromBlockletStatus(b.status);\n if (b.source !== undefined) {\n b.source = fromBlockletSource(b.source);\n }\n });\n\n if (blocklet.settings) {\n (blocklet.settings.children || []).forEach((child) => {\n forEachBlockletSync(child, (b) => {\n b.status = fromBlockletStatus(b.status);\n if (b.source !== undefined) {\n b.source = fromBlockletSource(b.source);\n }\n });\n });\n }\n};\n\nconst findWebInterface = (blocklet) => {\n if (!blocklet) {\n return null;\n }\n\n const meta = blocklet.meta || blocklet || {};\n const { interfaces = [] } = meta;\n\n if (!Array.isArray(interfaces)) {\n return null;\n }\n\n return interfaces.find((x) => x.type === BLOCKLET_INTERFACE_TYPE_WEB);\n};\n\nconst findServiceFromMeta = (meta, ServiceName) => {\n const names = [ServiceName];\n\n // backward compatible\n if (ServiceName === NODE_SERVICES.AUTH) {\n names.push(NODE_SERVICES.AUTH_SERVICE);\n }\n\n const webInterface = findWebInterface(meta);\n\n if (!webInterface) {\n return null;\n }\n\n return (webInterface.services || []).find((x) => names.includes(x.name));\n};\n\nconst getWhoCanAccess = (blocklet) => {\n if (!blocklet) {\n return WHO_CAN_ACCESS.ALL;\n }\n\n if (get(blocklet, 'settings.whoCanAccess')) {\n return blocklet.settings.whoCanAccess;\n }\n\n const service = findServiceFromMeta(blocklet.meta, NODE_SERVICES.AUTH);\n if (get(service, 'config.whoCanAccess')) {\n return service.config.whoCanAccess;\n }\n\n return WHO_CAN_ACCESS.ALL;\n};\n\nconst replaceSlotToIp = (url, ip) => (url || '').replace(SLOT_FOR_IP_DNS_SITE, (ip || '').replace(/\\./g, '-'));\n\nconst urlFriendly = (name) => slugify(name.replace(/^[@./-]/, '').replace(/[@./_]/g, '-'));\n\nmodule.exports = {\n isFreeBlocklet,\n isComponentBlocklet,\n forEachBlocklet,\n forEachBlockletSync,\n forEachChild,\n forEachChildSync,\n isDeletableBlocklet,\n getSharedConfigObj,\n getAppMissingConfigs,\n getComponentMissingConfigs,\n wipeSensitiveData,\n hasRunnableComponent,\n getDisplayName,\n fixBlockletStatus,\n findWebInterface,\n findServiceFromMeta,\n getWhoCanAccess,\n replaceSlotToIp,\n urlFriendly,\n getComponentId,\n getComponentName,\n getComponentBundleId,\n findComponentById,\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ToastProvider = ToastProvider;\nexports.default = void 0;\n\nvar _react = require(\"react\");\n\nvar _notistack = require(\"notistack\");\n\nvar _IconButton = _interopRequireDefault(require(\"@mui/material/IconButton\"));\n\nvar _Close = _interopRequireDefault(require(\"@mui/icons-material/Close\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nconst noop = () => {};\n\nlet _success = noop;\nlet _error = noop;\nlet _warning = noop;\nlet _info = noop;\n\nconst genFn = (enqueueSnackbar, variant) => (message, opts) => {\n enqueueSnackbar(message, _objectSpread({\n autoHideDuration: 3000,\n variant\n }, opts));\n}; // eslint-disable-next-line react/prop-types\n\n\nfunction ToastProvider(_ref) {\n let {\n children\n } = _ref;\n const notistackRef = /*#__PURE__*/(0, _react.createRef)();\n\n const onClickDismiss = key => () => {\n notistackRef.current.closeSnackbar(key);\n };\n\n return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_notistack.SnackbarProvider, {\n anchorOrigin: {\n vertical: 'top',\n horizontal: 'right'\n },\n ref: notistackRef // eslint-disable-next-line react/no-unstable-nested-components\n ,\n action: key => /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {\n \"aria-label\": \"close\",\n color: \"inherit\",\n onClick: onClickDismiss(key),\n size: \"large\",\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Close.default, {\n style: {\n fontSize: 16\n }\n })\n }, \"close\"),\n children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(Toast, {}), children]\n });\n}\n\nfunction Toast() {\n const {\n enqueueSnackbar\n } = (0, _notistack.useSnackbar)();\n _success = genFn(enqueueSnackbar, 'success');\n _error = genFn(enqueueSnackbar, 'error');\n _warning = genFn(enqueueSnackbar, 'warning');\n _info = genFn(enqueueSnackbar, 'info');\n return null;\n}\n\nvar _default = {\n success: function success() {\n return _success(...arguments);\n },\n error: function error() {\n return _error(...arguments);\n },\n warning: function warning() {\n return _warning(...arguments);\n },\n info: function info() {\n return _info(...arguments);\n }\n};\nexports.default = _default;","import NodeClient from '@abtnode/client';\nimport { getLocale } from '@arcblock/ux/lib/Locale/context';\n\nlet client;\n\nexport function create(token) {\n const prefix = (window.env ? window.env.apiPrefix : '/') || '/';\n const newClient = new NodeClient(() => `${prefix}/api/gql?locale=${getLocale()}`.replace(/\\/+/g, '/').trim());\n newClient.setAuthToken(() => {\n if (token) {\n return token;\n }\n\n if (!window.localStorage) {\n return null;\n }\n\n return window.localStorage.getItem('__sst');\n });\n\n return newClient;\n}\n\nexport default function createClient() {\n if (!client) {\n client = create();\n }\n\n return client;\n}\n","const NODE_SERVICES = Object.freeze({\n AUTH: 'auth',\n AUTH_SERVICE: '@abtnode/auth-service', // deprecated\n});\n\nconst NODE_SERVICES_PREFIX = Object.freeze({\n AUTH_SERVICE: `/.service/${NODE_SERVICES.AUTH_SERVICE}`, // deprecated\n});\n\nconst ROLES = Object.freeze({\n OWNER: 'owner',\n ADMIN: 'admin',\n MEMBER: 'member',\n GUEST: 'guest',\n});\n\nconst RBAC_CONFIG = {\n roles: Object.freeze([\n {\n name: ROLES.OWNER,\n title: 'Owner',\n description: 'Has full administrative access to the Blocklet Server',\n passport: true,\n },\n {\n name: ROLES.ADMIN,\n title: 'Admin',\n description:\n 'Has full permissions to manage blocklet and Blocklet Server such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates, manage blocklet team, manage node integrations and access keys, upgrade node to a new version',\n passport: true,\n },\n {\n name: ROLES.MEMBER,\n title: 'Member',\n description:\n 'Has permissions to manage blocklets, such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates',\n passport: true,\n },\n {\n name: ROLES.GUEST,\n title: 'Guest',\n description: 'Has all read permissions on Blocklet Server',\n passport: true,\n },\n {\n name: 'ci',\n title: 'CI',\n description: 'Deploy blocklet to Blocklet Server',\n passport: true,\n ci: true,\n },\n {\n name: 'certificate',\n title: 'Certificate',\n description: 'Manage https certificates for blocklets on the Blocklet Server',\n passport: true,\n ci: true,\n },\n {\n name: 'blocklet',\n title: 'Blocklet',\n // passport: true, // TODO enable this when we support access key for manage single blocklet\n ci: true, // do not issue this passport to human\n },\n {\n name: NODE_SERVICES.AUTH_SERVICE,\n title: 'Auth Service',\n },\n ]),\n permissions: Object.freeze([\n {\n name: 'query_node',\n description:\n 'View node data, include dashboard and node settings, log stream for both Blocklet Server and blocklets',\n },\n {\n name: 'mutate_node',\n description: 'Change node settings, upgrade node to a new version',\n },\n {\n name: 'query_session',\n description: 'Get data from a long running session',\n },\n {\n name: 'mutate_session',\n description: 'Start/update/end a long running session',\n },\n {\n name: 'query_accessKey',\n description: 'View access keys for Blocklet Server',\n },\n {\n name: 'mutate_accessKey',\n description: 'Manage access keys for Blocklet Server, such as create/update/delete',\n },\n {\n name: 'query_team',\n description: 'View team data(members/roles/permissions) for Blocklet Server and blocklets',\n },\n {\n name: 'mutate_team',\n description: 'Manage team data(members/roles/permissions) for Blocklet Server and blocklets',\n },\n {\n name: 'manage_blocklet',\n description: 'Manage a single blocklet',\n },\n {\n name: 'query_blocklet',\n description: 'View store and installed blocklets, including blocklet runtime configuration, domains and urls',\n },\n {\n name: 'mutate_blocklet',\n description: 'Perform state changing actions on blocklets, such as install/upgrade/config/start/stop/remove',\n },\n {\n name: 'query_router',\n description: 'View sites, URL mapping and certificates in service gateway',\n },\n {\n name: 'mutate_router',\n description: 'Manage sites, URL mapping and certificates in service gateway',\n },\n {\n name: 'query_certificate',\n description: 'View certificates in service gateway',\n },\n {\n name: 'mutate_certificate',\n description: 'Manage certificates in service gateway',\n },\n {\n name: 'query_notification',\n description: 'View notifications',\n },\n {\n name: 'mutate_notification',\n description: 'Manage notifications, such as mark notifications as read',\n },\n {\n name: 'query_webhook',\n description: 'View integrations',\n },\n {\n name: 'mutate_webhook',\n description: 'Manage integrations',\n },\n ]),\n grants: Object.freeze({\n [ROLES.GUEST]: [\n 'query_blocklet',\n 'query_router',\n 'query_webhook',\n 'query_notification',\n 'query_team',\n 'query_accessKey',\n 'query_node',\n 'query_session',\n ],\n [ROLES.MEMBER]: [ROLES.GUEST, 'mutate_blocklet', 'mutate_router', 'mutate_notification', 'mutate_session'],\n [ROLES.ADMIN]: [\n ROLES.MEMBER,\n 'mutate_team',\n 'mutate_webhook',\n 'mutate_accessKey',\n 'mutate_node',\n 'mutate_certificate',\n ],\n [ROLES.OWNER]: [ROLES.ADMIN],\n '@abtnode/auth-service': ['query_team', 'mutate_team'],\n ci: ['query_blocklet', 'mutate_blocklet'],\n certificate: ['query_certificate', 'mutate_certificate'],\n blocklet: ['query_team', 'mutate_team', 'manage_blocklet'],\n }),\n};\n\nconst DAY_IN_MS = 24 * 60 * 60 * 1000;\n\nconst EVENTS = {\n NOTIFICATION_CREATE: 'notification.create',\n ROUTING_UPDATED: 'routing.updated',\n NODE_UPDATED: 'node.updated',\n NODE_UPGRADE_PROGRESS: 'node.upgrade.progress',\n NODE_STARTED: 'node.started',\n NODE_STOPPED: 'node.stopped',\n NODE_ADDED_OWNER: 'node.addedOwner',\n DOMAIN_STATUS: 'domain.status',\n USER_ADDED: 'user.added',\n USER_REMOVED: 'user.removed',\n USER_UPDATED: 'user.updated',\n CERT_ISSUED: 'cert.issued',\n CERT_UPDATED: 'cert.updated',\n CERT_ERROR: 'cert.error',\n RELOAD_GATEWAY: 'gateway.reload',\n};\n\nconst WHO_CAN_ACCESS = {\n OWNER: 'owner',\n INVITED: 'invited',\n ALL: 'all',\n};\n\nmodule.exports = Object.freeze({\n // Blocklet Server\n NODE_MODES: Object.freeze({\n PRODUCTION: 'production',\n DEBUG: 'debug',\n MAINTENANCE: 'maintenance',\n IMMUTABLE: 'immutable',\n }),\n\n DEFAULT_DESCRIPTION: 'Web Interface to manage your Blocklet Server',\n\n NODE_UPGRADE_PROGRESS: Object.freeze({\n SETUP: 'setup', // backup\n INSTALLING: 'installing',\n RESTARTING: 'restarting',\n CLEANUP: 'cleanup',\n COMPLETE: 'complete',\n ROLLBACK: 'rollback',\n }),\n\n VC_TYPE_BLOCKLET_PURCHASE: 'BlockletPurchaseCredential',\n VC_TYPE_NODE_PASSPORT: 'ABTNodePassport',\n VC_TYPE_GENERAL_PASSPORT: 'NFTPassport',\n\n NFT_TYPE_SERVER_OWNERSHIP: 'BlockletServerOwnershipNFT',\n\n NODE_PACKAGE_NAME: '@abtnode/cli', // deprecated in 1.6.0\n NODE_COMMAND_NAME: 'abtnode', // deprecated in 1.6.0\n NODE_DATA_DIR_NAME: '_abtnode',\n USER_AVATAR_DIR: '/.assets/avatar',\n USER_AVATAR_URL_PREFIX: 'bn://avatar',\n\n PROCESS_NAME_DAEMON: 'abt-node-daemon',\n PROCESS_NAME_PROXY: 'abt-node-db-hub',\n PROCESS_NAME_UPDATER: 'abt-node-updater',\n PROCESS_NAME_SERVICE: 'abt-node-service',\n PROCESS_NAME_ROUTER: 'abt-node-router',\n PROCESS_NAME_LOG_ROTATE: 'abt-node-log-rotate',\n PROCESS_NAME_EVENT_HUB: 'abt-node-event-hub',\n\n NODE_REGISTER_URL: 'https://install.arcblock.io/',\n WEB_WALLET_URL: 'https://web.abtwallet.io',\n BLOCKLET_STORE_URL: 'https://store.blocklet.dev',\n BLOCKLET_STORE_URL_DEV: 'https://dev.store.blocklet.dev',\n BLOCKLET_STORE_API_PREFIX: '/api',\n BLOCKLET_STORE_API_BLOCKLET_PREFIX: '/api/blocklets',\n BLOCKLET_STORE_META_PATH: '/api/store.json',\n\n DEFAULT_DID_REGISTRY: 'https://registry.abtnet.io',\n DEFAULT_DID_DOMAIN: 'did.abtnet.io',\n DEFAULT_IP_DOMAIN: '*.ip.abtnet.io',\n DEFAULT_IP_DOMAIN_SUFFIX: 'ip.abtnet.io',\n DEFAULT_WILDCARD_CERT_HOST: 'https://releases.arcblock.io/',\n\n DEFAULT_CERTIFICATE_EMAIL: 'certs@arcblock.io',\n\n CONFIG_FILENAME: 'config.yml',\n CONFIG_FILENAME_OLD: 'abtnode.yml',\n CONFIG_FOLDER_NAME: '.blocklet-server',\n CONFIG_FOLDER_NAME_OLD: '.abtnode',\n EXPORTED_FOLDER_NAME: 'exported_blocklet_server',\n\n StatusCode: Object.freeze({\n ok: 0,\n\n blocklet_not_found: 1,\n blocklet_not_purchased: 2,\n\n forbidden: 403,\n internal: 500,\n timeout: 504,\n }),\n\n // Service Gateway\n // eslint-disable-next-line prefer-regex-literals\n IP: new RegExp('-(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)(?:\\\\-(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d|\\\\d)){3}'),\n DOMAIN_FOR_IP_SITE: '',\n DOMAIN_FOR_IP_SITE_REGEXP: `~^\\\\d+.\\\\d+.\\\\d+.\\\\d+$`, // eslint-disable-line\n DOMAIN_FOR_DEFAULT_SITE: '*',\n DOMAIN_FOR_INTERNAL_SITE: '127.0.0.1',\n NAME_FOR_WELLKNOWN_SITE: 'wellknown',\n WELLKNOWN_PATH_PREFIX: '/.well-known',\n WELLKNOWN_ACME_CHALLENGE_PREFIX: '/.well-known/acme-challenge',\n WELLKNOWN_DID_RESOLVER_PREFIX: '/.well-known/did.json',\n WELLKNOWN_PING_PREFIX: '/.well-known/ping',\n WELLKNOWN_SERVICE_PATH_PREFIX: '/.well-known/service',\n SLOT_FOR_IP_DNS_SITE: '888-888-888-888',\n\n DEFAULT_ADMIN_PATH: '/admin',\n DEFAULT_SERVICE_PATH: '/.abtnode/service',\n DEFAULT_HTTP_PORT: 80,\n DEFAULT_HTTPS_PORT: 443,\n MAX_UPLOAD_FILE_SIZE: 500, // unit: MB\n DEFAULT_DAEMON_PORT: 8089,\n\n BLOCKLET_PROXY_PATH_PREFIX: '/.blocklet/proxy',\n BLOCKLET_SITE_GROUP_SUFFIX: '.blocklet-domain-group',\n\n // Time and dates\n DAY_IN_MS,\n DAEMON_MAX_MEM_LIMIT_IN_MB: 800,\n PROXY_MAX_MEM_LIMIT_IN_MB: 800,\n BLOCKLET_MAX_MEM_LIMIT_IN_MB: 300,\n CERTIFICATE_EXPIRES_OFFSET: 10 * DAY_IN_MS,\n ROUTING_RULE_TYPES: Object.freeze({\n NONE: 'none',\n DAEMON: 'daemon',\n SERVICE: 'service',\n BLOCKLET: 'blocklet',\n REDIRECT: 'redirect',\n GENERAL_PROXY: 'general_proxy',\n DIRECT_RESPONSE: 'direct_response',\n }),\n\n // Team\n ROLES,\n RBAC_CONFIG,\n genPermissionName: (resource, action = 'access') => `${action}_${resource.replace('_', '-')}`, // resource cannot include '_'\n PASSPORT_STATUS: {\n VALID: 'valid',\n REVOKED: 'revoked',\n },\n\n // Service\n NODE_SERVICES,\n NODE_SERVICES_PREFIX,\n\n DISK_ALERT_THRESHOLD_PERCENT: 80,\n\n // EVENTS\n EVENTS,\n\n WHO_CAN_ACCESS,\n\n GATEWAY_REQ_LIMIT: Object.freeze({\n min: 10,\n max: 100,\n }),\n\n // Store\n STORE_DETAIL_PAGE_PATH_PREFIX: '/blocklets',\n});\n","import { createContext, useState, useContext, useEffect } from 'react';\n\nimport Toast from '@abtnode/ux/lib/toast';\nimport { EVENTS } from '@abtnode/constant';\n\nimport getClient from '../libs/node';\nimport { useSubscription } from '../libs/ws';\n\nconst NotificationContext = createContext({});\nconst { Provider, Consumer } = NotificationContext;\n\n// eslint-disable-next-line react/prop-types\nfunction NotificationProvider({ children }) {\n const client = getClient();\n const [notifications, setNotifications] = useState([]);\n const [paging, setPaging] = useState({ total: 0, pageSize: 10, pageCount: 0, page: 1 });\n const [loading, setLoading] = useState(false);\n\n const getData = async ({ page = 1 } = {}) => {\n if (loading) {\n return;\n }\n setLoading(true);\n try {\n // eslint-disable-next-line no-shadow\n const res = await client.getNotifications({ input: { paging: { page } } });\n setNotifications(res.list);\n setPaging(res.paging);\n setLoading(false);\n } catch (err) {\n Toast.error(err.message);\n setLoading(false);\n }\n };\n\n useEffect(() => {\n getData();\n }, []); // eslint-disable-line\n\n useSubscription(EVENTS.NOTIFICATION_CREATE, notification => {\n if (!notification.id) {\n // eslint-disable-next-line no-underscore-dangle\n notification.id = notification._id;\n }\n setNotifications(list => {\n const old = list || [];\n return [notification, ...old];\n });\n });\n\n const value = {\n loading,\n refresh: getData,\n data: notifications,\n paging,\n api: client,\n };\n\n return <Provider value={{ notifications: value }}>{children}</Provider>;\n}\n\nfunction useNotificationContext() {\n const { notifications } = useContext(NotificationContext);\n return notifications;\n}\n\nexport { NotificationContext, NotificationProvider, Consumer as NotificationConsumer, useNotificationContext };\n","import { useEffect } from 'react';\nimport { WsClient } from '@arcblock/ws';\n\nlet client;\n\nexport function create(token) {\n const pathPrefix = (window.env && window.env.apiPrefix ? window.env.apiPrefix : '/').replace(/\\/$/, '');\n const url = `//${window.location.host}${pathPrefix}`;\n return new WsClient(url, {\n heartbeatIntervalMs: 10 * 1000,\n params: () => ({\n token: token || window.localStorage.getItem('__sst'),\n }),\n });\n}\n\nexport default function getWsClient() {\n if (!client) {\n client = create();\n }\n\n return client;\n}\n\nexport const useSubscription = (event, cb = () => {}, deps = []) => {\n if (!client) {\n client = getWsClient();\n client.connect();\n }\n useEffect(() => {\n client.on(event, cb);\n\n return () => {\n client.off(event, cb);\n };\n }, deps); // eslint-disable-line\n};\n","import { createContext, useContext, useState, useEffect } from 'react';\n\nimport Button from '@arcblock/ux/lib/Button';\nimport Alert from '@arcblock/ux/lib/Alert';\nimport Center from '@arcblock/ux/lib/Center';\nimport { useLocaleContext } from '@arcblock/ux/lib/Locale/context';\n\nimport getClient from '../libs/node';\n\nconst NodeContext = createContext({});\nconst { Provider, Consumer } = NodeContext;\n\nconst MAX_RETRY = 4;\n\n// eslint-disable-next-line react/prop-types\nfunction NodeProvider({ children }) {\n const prefix = window.env && window.env.apiPrefix ? `${window.env.apiPrefix}images` : '/images';\n const { t } = useLocaleContext();\n\n const client = getClient();\n const [newInfo, setNewInfo] = useState(null);\n const [error, setError] = useState(null);\n const [loading, setLoading] = useState(true);\n const getNodeInfo = async ({ silent = true, retries = MAX_RETRY } = {}) => {\n if (!silent) {\n setLoading(true);\n }\n try {\n const { info } = await client.getNodeInfo();\n if (info && Array.isArray(info.blockletRegistryList)) {\n info.blockletRegistry = info.blockletRegistryList.find(x => x.selected).url;\n info.startAt = new Date() - info.uptime;\n }\n setNewInfo(info);\n } catch (err) {\n if (retries > 0) {\n setTimeout(() => getNodeInfo({ silent, retries: retries - 1 }), 1000);\n } else {\n setError(err);\n }\n } finally {\n setLoading(false);\n }\n };\n\n useEffect(() => {\n getNodeInfo({ silent: false });\n }, []); // eslint-disable-line\n\n const value = {\n loading,\n error,\n info: newInfo,\n refresh: getNodeInfo,\n api: client,\n prefix,\n };\n\n if (value.error) {\n return (\n <Center>\n <Alert type=\"error\" variant=\"icon\">\n <div>\n {/* message */}\n {value.error.message === 'Network Error' ? t('health.connectionErrorTip') : value.error.message}\n {/* retry */}\n <Button onClick={() => getNodeInfo({ silent: false })}>\n <span style={{ color: '#44cdc6', textDecoration: 'underline' }}>{t('common.retry')}</span>\n </Button>\n </div>\n </Alert>\n </Center>\n );\n }\n\n return <Provider value={{ node: value }}>{children}</Provider>;\n}\n\nfunction useNodeContext() {\n const { node } = useContext(NodeContext);\n return node;\n}\n\nexport { NodeContext, NodeProvider, Consumer as NodeConsumer, useNodeContext };\n","import axios from 'axios';\nimport joinURL from 'url-join';\n\nlet cache = null;\n\nconst fetch = async () => {\n const prefix = window.env.apiPrefix || '/';\n const url = joinURL(prefix, '/api/dns-resolve?accessible=1');\n\n try {\n const res = await axios.get(url);\n return res.data.address;\n } catch (error) {\n return null;\n }\n};\n\nconst getIp = () => {\n if (!cache) {\n cache = fetch();\n }\n\n return cache;\n};\n\nexport default getIp;\n","import { DEFAULT_IP_DOMAIN_SUFFIX, DEFAULT_DID_DOMAIN } from '@abtnode/constant';\nimport dayjs from 'dayjs';\n\nexport function sleep(t) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, t));\n}\n\nexport const validateDomain = (domain, locale = 'en') => {\n if (!domain) {\n return {\n en: 'Site domain cannot be empty',\n zh: '站点域名不能为空',\n }[locale];\n }\n\n if (domain.endsWith(DEFAULT_IP_DOMAIN_SUFFIX)) {\n return {\n en: `Site domain cannot include ${DEFAULT_IP_DOMAIN_SUFFIX}`,\n zh: `站点域名不能包含 ${DEFAULT_IP_DOMAIN_SUFFIX}`,\n }[locale];\n }\n\n return null;\n};\n\n/**\n * get access url\n * auto fix http/https, port, query\n * docker friendly\n */\nexport function getAccessUrl(hostname, path = '', params = undefined) {\n if (!hostname) {\n return '';\n }\n let protocol = 'http';\n if (window.location.protocol === 'https:') {\n if (hostname.endsWith(DEFAULT_IP_DOMAIN_SUFFIX)) {\n protocol = 'https';\n }\n if (hostname.endsWith(DEFAULT_DID_DOMAIN)) {\n protocol = 'https';\n }\n }\n\n let port = '';\n const browserPort = Number(window.location.port);\n if (process.env.NODE_ENV !== 'development' && browserPort && ![80, 443].includes(browserPort)) {\n port = `:${browserPort}`;\n }\n\n const urlObj = new URL(`${protocol}://${hostname}${port}`);\n urlObj.pathname = path;\n const url = urlObj.href.replace(/\\/$/, '');\n\n if (!params || !Object.keys(params)) {\n return url;\n }\n\n const searchParams = new URLSearchParams();\n Object.keys(params).forEach((key) => {\n searchParams.append(key, params[key]);\n });\n return `${url}?${searchParams.toString()}`;\n}\n\nexport function formatDateTime(date) {\n return dayjs(date).format('YYYY-MM-DD HH:mm');\n}\n\nexport function getExplorerLink(chainHost, did, type) {\n if (!chainHost) return undefined;\n try {\n const chainUrl = new URL(chainHost);\n switch (type) {\n case 'account':\n chainUrl.pathname = `/explorer/accounts/${did}`;\n break;\n case 'tx':\n chainUrl.pathname = `/explorer/txs/${did}`;\n break;\n case 'token':\n chainUrl.pathname = `/explorer/tokens/${did}`;\n break;\n case 'factory':\n chainUrl.pathname = `/explorer/factories/${did}`;\n break;\n case 'bridge':\n chainUrl.pathname = `/explorer/bridges/${did}`;\n break;\n default:\n chainUrl.pathname = '/';\n }\n\n return chainUrl.href;\n } catch {\n return undefined;\n }\n}\n\nexport function patchJsxToLocale(rawStr, replaceMap = {}) {\n return rawStr\n .split(/{{|}}/)\n .map((item) => {\n if (replaceMap[item]) {\n if (replaceMap[item] instanceof Function) {\n return replaceMap[item]();\n }\n return replaceMap[item];\n }\n return item;\n })\n .filter(Boolean);\n}\n","// 请求 4xx/5xx 的情况会判定为 accessible = true\n// (基于 script tag 的检测方式, 会将 404 请求判定为 accessible = false)\n// TODO: 存在 Mixed Content 问题\nmodule.exports = async (url, timeout = 5000) => {\n let timer;\n try {\n const controller = new AbortController();\n timer = setTimeout(() => controller.abort(), timeout);\n // eslint-disable-next-line no-undef\n await fetch(url, { method: 'HEAD', mode: 'no-cors', signal: controller.signal });\n return true;\n } catch (e) {\n return false;\n } finally {\n clearTimeout(timer);\n }\n};\n","import { SLOT_FOR_IP_DNS_SITE } from '@abtnode/constant';\nimport { replaceSlotToIp } from '@blocklet/meta/lib/util';\nimport getIp from './get-ip';\n\nconst ensureBlockletInterface = async interfaces => {\n if (!interfaces || !interfaces.length) {\n return [];\n }\n\n const ip = await getIp();\n\n return interfaces\n .map(x => {\n try {\n const url = new URL(x.url);\n if (url.hostname.includes(SLOT_FOR_IP_DNS_SITE)) {\n if (!ip) {\n return null;\n }\n url.hostname = replaceSlotToIp(url.hostname, ip);\n x.url = url.href;\n }\n return x;\n } catch {\n return null;\n }\n })\n .filter(Boolean);\n};\n\nexport default ensureBlockletInterface;\n","import { forEachBlockletSync } from '@blocklet/meta/lib/util';\nimport ensureBlockletInterface from './ensure-blocklet-interface';\n\nconst fixBlocklet = async blocklet => {\n blocklet.interfaces = await ensureBlockletInterface(blocklet.interfaces);\n\n await forEachBlockletSync(blocklet, b => {\n if (b.runtimeInfo) {\n b.runtimeInfo.startAt = new Date() - b.runtimeInfo.uptime;\n }\n });\n};\n\nexport default fixBlocklet;\n","const normalizePathPrefix = (prefix) => {\n if (typeof prefix === 'string') {\n if (!prefix || prefix === '/') {\n return '/';\n }\n\n return `/${prefix}/`.replace(/\\/+/g, '/');\n }\n\n return '/';\n};\n\nmodule.exports = normalizePathPrefix;\n","import { useSessionContext } from '../contexts/session';\n\n// eslint-disable-next-line react/prop-types\nexport default function Permission({ permission, role, component, children }) {\n const { session } = useSessionContext();\n\n let can = true;\n if (permission) {\n const permissions = (session.user && session.user.permissions) || [];\n can = permissions.includes(permission);\n }\n\n if (can && role) {\n can = role === session.user.role;\n }\n\n if (typeof component === 'function') {\n return component(can);\n }\n\n if (typeof children === 'function') {\n return children(can);\n }\n\n if (can) {\n return component || children || null;\n }\n\n return null;\n}\n\nexport function withPermission(Component, permissionName) {\n return function WithPermission(props) {\n return (\n <Permission permission={permissionName}>\n {hasPermission => <Component {...props} hasPermission={hasPermission} />}\n </Permission>\n );\n };\n}\n","import { replaceSlotToIp } from '@blocklet/meta/lib/util';\nimport getIp from './get-ip';\n\nconst ensureDomainAliases = async domainAliases => {\n if (!domainAliases || !domainAliases.length) {\n return [];\n }\n\n const ip = await getIp();\n\n if (!ip) {\n return domainAliases;\n }\n\n return domainAliases\n .map(x => {\n try {\n x.value = replaceSlotToIp(x.value, ip);\n return x;\n } catch {\n return x;\n }\n })\n .filter(Boolean);\n};\n\nexport default ensureDomainAliases;\n","import { createContext, useState, useContext } from 'react';\nimport sortBy from 'lodash/sortBy';\nimport useAsyncRetry from 'react-use/lib/useAsyncRetry';\n\nimport normalizePathPrefix from '@abtnode/util/lib/normalize-path-prefix';\n\nimport {\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_DEFAULT_SITE,\n ROUTING_RULE_TYPES,\n BLOCKLET_SITE_GROUP_SUFFIX,\n WELLKNOWN_PATH_PREFIX,\n} from '@abtnode/constant';\nimport Toast from '@abtnode/ux/lib/toast';\n\nimport { getAccessUrl } from '@abtnode/ux/src/util';\nimport { useNodeContext } from './node';\nimport ensureDomainAliases from '../libs/ensure-domain-aliases';\nimport getClient from '../libs/node';\nimport { stringSortHandlerAsc } from '../libs/util';\n\nconst DASHBOARD = 'Dashboard';\n\nconst RoutingContext = createContext({});\nconst { Provider, Consumer } = RoutingContext;\n\nconst specialSites = [DASHBOARD, DOMAIN_FOR_IP_SITE, DOMAIN_FOR_IP_SITE_REGEXP];\n\nconst sortDomainHandler = (siteA, siteB) => {\n if (siteA.name === DOMAIN_FOR_DEFAULT_SITE) {\n return -1;\n }\n\n if (siteB.name === DOMAIN_FOR_DEFAULT_SITE) {\n return 1;\n }\n\n const isSiteASpecial = specialSites.includes(siteA.name);\n const isSiteBSpecial = specialSites.includes(siteB.name);\n\n if (isSiteASpecial && isSiteBSpecial) {\n return stringSortHandlerAsc(siteA.name, siteB.name);\n }\n\n if (isSiteASpecial) {\n return -1;\n }\n\n if (isSiteBSpecial) {\n return 1;\n }\n\n return stringSortHandlerAsc(siteA.name, siteB.name);\n};\n\nconst generateSites = ({ sites: inputSites, nodePort }) => {\n const defaultDomain = window.location.host;\n\n const list = (inputSites || []).map(site => {\n const { id: siteId, rules = [], corsAllowedOrigins = [] } = site;\n let { domain, domainAliases } = site;\n domainAliases = domainAliases || [];\n\n if ([DOMAIN_FOR_IP_SITE, DOMAIN_FOR_IP_SITE_REGEXP].includes(domain)) {\n domain = DASHBOARD;\n if (!domainAliases.find(item => item.value === defaultDomain)) {\n domainAliases.unshift({ protected: false, value: defaultDomain });\n }\n }\n\n const _site = {\n id: siteId,\n name: domain,\n type: 'domain',\n items: [],\n domainAliases,\n isProtected: site.isProtected,\n corsAllowedOrigins,\n };\n\n (rules || []).forEach(rule => {\n const {\n id: ruleId,\n isProtected,\n from: { pathPrefix },\n to,\n interfaces,\n } = rule;\n\n if (to.type === ROUTING_RULE_TYPES.BLOCKLET) {\n let title = '';\n if (Number.parseInt(to.port, 10) === Number.parseInt(nodePort, 10)) {\n title = 'Blocklet Server Dashboard';\n to.type = ROUTING_RULE_TYPES.DAEMON;\n } else {\n title = to.did;\n }\n\n _site.items.push({\n id: ruleId,\n name: normalizePathPrefix(pathPrefix || '/'),\n title,\n type: 'rule',\n isProtected,\n pathPrefix,\n to,\n interfaces,\n });\n } else {\n _site.items.push({\n id: ruleId,\n pathPrefix,\n name: normalizePathPrefix(pathPrefix || '/'),\n title: 'Blocklet Server Dashboard',\n type: 'rule',\n isProtected,\n to,\n interfaces,\n });\n }\n });\n\n _site.items = sortBy(_site.items, i => i.name);\n\n return _site;\n });\n\n const sites = list.sort(sortDomainHandler);\n\n const siteMap = sites.reduce((acc, x) => {\n let { name } = x;\n if (name.endsWith(BLOCKLET_SITE_GROUP_SUFFIX)) {\n [name] = name.split('.');\n }\n acc[name] = { ...x, rules: x.items };\n return acc;\n }, {});\n\n return { sites, siteMap };\n};\n\nconst getBlockletUrl = ({ did, domain: inputDomain, mountPoint: inputMountPoint, siteMap, params } = {}) => {\n if (!siteMap) {\n return null;\n }\n\n const site = siteMap[did];\n\n if (!site) {\n return null;\n }\n\n const domain = inputDomain || (site.domainAliases || [])[0];\n\n if (!domain) {\n return null;\n }\n\n let mountPoint = inputMountPoint;\n if (!mountPoint) {\n const rule = site.rules.filter(x => !x.name.startsWith(WELLKNOWN_PATH_PREFIX))[0];\n mountPoint = rule ? rule.name : '/';\n }\n\n return getAccessUrl(domain.value, mountPoint, params);\n};\n\nconst getBlockletUrls = ({ did, mountPoint: inputMountPoint, siteMap, params } = {}) => {\n if (!siteMap) {\n return [];\n }\n\n const site = siteMap[did];\n\n if (!site) {\n return [];\n }\n\n const domains = site.domainAliases || [];\n\n if (!domains.length) {\n return [];\n }\n\n let mountPoint = inputMountPoint;\n if (!mountPoint) {\n const rule = site.rules.filter(x => !x.name.startsWith(WELLKNOWN_PATH_PREFIX))[0];\n mountPoint = rule ? rule.name : '/';\n }\n\n return domains.map(domain => getAccessUrl(domain.value, mountPoint, params));\n};\n\nconst formatDomains = sites => {\n const domains = sites\n .map(x => x.domain)\n .filter(x => ![DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE].includes(x));\n\n let domainsAliases = [];\n sites.forEach(x => domainsAliases.push(...(x.domainAliases || [])));\n\n // backward compatible\n domainsAliases = domainsAliases.map(item => {\n if (typeof item === 'string') {\n return { value: item, isProtected: false };\n }\n\n return item;\n });\n\n return { domains, domainsAliases };\n};\n\nconst getMessage = msg => msg.slice(0, 150);\n\n// eslint-disable-next-line react/prop-types\nfunction RoutingProvider({ children }) {\n const client = getClient();\n const { info } = useNodeContext();\n const [newSites, setNewSites] = useState([]);\n const [domains, setDomains] = useState([]);\n const [allDomains, setAllDomains] = useState([]);\n\n const state = useAsyncRetry(async () => {\n const { sites: dbSites } = await client.getRoutingSites({ input: { snapshotHash: '' } });\n\n const sites = dbSites || [];\n\n await Promise.all(\n sites.map(async site => {\n site.domainAliases = await ensureDomainAliases(site.domainAliases);\n return site;\n })\n );\n\n const formattedDomains = formatDomains(sites);\n\n setNewSites(sites);\n setDomains(formattedDomains.domains);\n setAllDomains([\n window.location.host,\n ...formattedDomains.domains,\n ...formattedDomains.domainsAliases.map(item => item.value),\n ]);\n }, [info]);\n\n const updateSiteRules = (siteId, site) => {\n setNewSites(s =>\n s.map(x => {\n if (x.id === siteId) {\n if (site.domain) {\n return site;\n }\n\n return {\n ...site,\n domain: x.domain,\n };\n }\n\n return x;\n })\n );\n };\n\n // Snapshot ops\n const takeSnapshot = async message =>\n // eslint-disable-next-line implicit-arrow-linebreak\n client.takeRoutingSnapshot({ input: { dryRun: false, message: encodeURIComponent(message) } });\n\n const restartEngine = async message => {\n try {\n await takeSnapshot(message);\n } catch (err) {\n Toast.error(err.message);\n }\n };\n\n // Site ops\n const addSite = async site => {\n const result = await client.addRoutingSite({ input: site });\n setNewSites(newSites.concat(result.site));\n restartEngine(getMessage(`add site: ${result.site.domain}`));\n };\n const updateSite = async (siteId, settings) => {\n const result = await client.updateRoutingSite({ input: { id: siteId, ...settings } });\n if (result.site && result.site.id) {\n const index = newSites.findIndex(x => x.id === result.site.id);\n if (index !== -1) {\n newSites.splice(index, 1, result.site);\n setNewSites([].concat(newSites));\n }\n restartEngine(getMessage(`update security. site: ${result.site.domain}`));\n }\n };\n const deleteSite = async id => {\n await client.deleteRoutingSite({ input: { id } });\n const delSite = newSites.find(x => x.id !== id);\n setNewSites(newSites.filter(x => x.id !== id));\n restartEngine(getMessage(`delete site: ${delSite?.domain}`));\n };\n\n // Site alias ops\n const addDomainAlias = async (siteId, domainAlias, force) => {\n const result = await client.addDomainAlias({ input: { id: siteId, domainAlias, force } });\n updateSiteRules(siteId, result.site);\n restartEngine(getMessage(`add domain alias ${domainAlias} to ${result.site.domain}`));\n };\n const deleteDomainAlias = async (siteId, domainAlias) => {\n const result = await client.deleteDomainAlias({ input: { id: siteId, domainAlias } });\n updateSiteRules(siteId, result.site);\n restartEngine(getMessage(`delete domain alias ${domainAlias} to ${result.site.domain}`));\n };\n\n // Rule ops\n const addRule = async (id, rule) => {\n const { site } = await client.addRoutingRule({ input: { id, rule } });\n updateSiteRules(id, site);\n restartEngine(getMessage(`add rule. site: ${site.domain}. type: ${rule.from.pathPrefix}`));\n };\n const updateRule = async (siteId, rule) => {\n const { site } = await client.updateRoutingRule({\n input: {\n id: siteId,\n rule,\n },\n });\n\n updateSiteRules(siteId, site);\n restartEngine(getMessage(`update rule. site: ${site.domain}. type: ${rule.from.pathPrefix}`));\n };\n const deleteRule = async (siteId, ruleId) => {\n const { site } = await client.deleteRoutingRule({ input: { id: siteId, ruleId } });\n updateSiteRules(siteId, site);\n restartEngine(getMessage(`delete rule. site: ${site.domain}`));\n };\n\n const value = {\n loading: state.loading,\n error: state.error,\n refresh: state.retry,\n api: client,\n actions: {\n addSite,\n updateSite,\n deleteSite,\n\n addDomainAlias,\n deleteDomainAlias,\n\n takeSnapshot,\n\n addRule,\n updateRule,\n deleteRule,\n },\n };\n\n const { sites, siteMap } = generateSites({\n sites: newSites,\n nodePort: info.port,\n });\n\n value.sites = sites;\n value.siteMap = siteMap;\n value.domains = domains; // not includes domain aliases\n value.allDomains = allDomains;\n value.getBlockletUrl = ({ did, domain, mountPoint, params }) =>\n getBlockletUrl({ did, domain, mountPoint, siteMap: value.siteMap, params });\n value.getBlockletUrls = ({ did, mountPoint, params }) =>\n getBlockletUrls({ did, mountPoint, siteMap: value.siteMap, params });\n\n return <Provider value={{ routing: value }}>{children}</Provider>;\n}\n\nfunction useRoutingContext() {\n const { routing } = useContext(RoutingContext);\n return routing;\n}\n\nfunction isSpecialDomain(name) {\n const specialDomains = [DOMAIN_FOR_IP_SITE_REGEXP, DOMAIN_FOR_DEFAULT_SITE, DOMAIN_FOR_IP_SITE];\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n specialDomains.push(window.location.hostname);\n }\n\n return specialDomains.includes(name);\n}\n\nexport {\n RoutingContext,\n RoutingProvider,\n Consumer as RoutingConsumer,\n useRoutingContext,\n DOMAIN_FOR_IP_SITE_REGEXP,\n DOMAIN_FOR_IP_SITE,\n DOMAIN_FOR_DEFAULT_SITE,\n DASHBOARD,\n isSpecialDomain,\n generateSites,\n getBlockletUrl,\n getBlockletUrls,\n};\n","import { createContext, useState, useContext, useEffect } from 'react';\nimport { fromBlockletStatus, BlockletEvents } from '@blocklet/meta/lib/constants';\nimport { forEachBlockletSync } from '@blocklet/meta/lib/util';\nimport { EVENTS } from '@abtnode/constant';\n\nimport getClient from '../libs/node';\nimport { useNodeContext } from './node';\nimport { useSubscription } from '../libs/ws';\nimport fixBlocklet from '../libs/fix-blocklet';\n\nconst BlockletContext = createContext({});\nconst { Provider, Consumer } = BlockletContext;\n\n// eslint-disable-next-line react/prop-types\nfunction BlockletProvider({ children }) {\n const node = useNodeContext();\n const client = getClient();\n const [error, setError] = useState(null);\n const [loading, setLoading] = useState(false);\n\n const [blocklets, setBlocklets] = useState([]);\n\n const MAX_RETRY = 4;\n\n const getBlocklets = async ({ silent = true, retries = MAX_RETRY, updates, useCache = true } = {}) => {\n if (!silent) {\n setLoading(true);\n }\n try {\n setError(null);\n const { blocklets: data } = await client.getBlocklets({ input: { useCache } });\n for (const blocklet of data) {\n // eslint-disable-next-line no-await-in-loop\n await fixBlocklet(blocklet);\n }\n setBlocklets(list => {\n if (!updates) {\n return data;\n }\n\n return list.map(old => {\n const d = { ...old };\n\n // update props in updates\n const cur = data.find(x => x.meta.did === old.meta.did);\n if (cur) {\n updates.forEach(key => {\n d[key] = cur[key];\n });\n }\n\n return d;\n });\n });\n setLoading(false);\n } catch (err) {\n if (retries > 0) {\n setTimeout(() => getBlocklets({ silent, retries: retries - 1, useCache }), 1000);\n } else {\n setLoading(false);\n setError(err);\n }\n }\n };\n\n const getBlocklet = async b => {\n try {\n const { blocklet } = await node.api.getBlocklet({ input: { did: b.meta.did } });\n await fixBlocklet(blocklet);\n\n setBlocklets(list => {\n // new blocklet\n if (!list.some(d => d.meta.did === blocklet.meta.did)) {\n return [...list, blocklet];\n }\n\n // existing blocklet\n return list.map(d => {\n if (d.meta.did === blocklet.meta.did) {\n return blocklet;\n }\n return d;\n });\n });\n } catch (err) {\n setError(err);\n }\n };\n\n const onInstallOrUpgrade = b => {\n node.refresh();\n getBlocklet(b);\n };\n\n useEffect(() => {\n getBlocklets({ silent: false });\n }, []); // eslint-disable-line\n\n const updateBlockletStatus = async blocklet => {\n const statusMap = {};\n forEachBlockletSync(blocklet, (x, { id }) => {\n statusMap[id] = fromBlockletStatus(x.status);\n });\n\n setBlocklets(list =>\n list.map(d => {\n if (d.meta.did === blocklet.meta.did) {\n forEachBlockletSync(d, (b, { id }) => {\n if (statusMap[id]) {\n b.status = statusMap[id];\n }\n });\n }\n return d;\n })\n );\n };\n\n useSubscription(BlockletEvents.added, blocklet => {\n blocklet.status = fromBlockletStatus(blocklet.status);\n setBlocklets(list => [...list, blocklet]);\n });\n\n useSubscription(BlockletEvents.removed, blocklet => {\n node.refresh();\n setBlocklets(list => list.filter(item => item.meta.did !== blocklet.meta.did));\n });\n\n useSubscription(BlockletEvents.statusChange, updateBlockletStatus);\n\n useSubscription(BlockletEvents.installed, onInstallOrUpgrade);\n useSubscription(BlockletEvents.deployed, onInstallOrUpgrade);\n useSubscription(BlockletEvents.upgraded, onInstallOrUpgrade);\n useSubscription(BlockletEvents.downgraded, onInstallOrUpgrade);\n\n useSubscription(BlockletEvents.updated, getBlocklet);\n useSubscription(BlockletEvents.started, getBlocklet);\n useSubscription(BlockletEvents.startFailed, getBlocklet);\n useSubscription(BlockletEvents.reloaded, getBlocklet);\n\n useSubscription(EVENTS.ROUTING_UPDATED, () => {\n getBlocklets({ update: ['interfaces'], useCache: false });\n });\n\n const value = {\n loading,\n error,\n data: blocklets,\n refresh: getBlocklets,\n api: client,\n };\n\n return <Provider value={{ blocklets: value }}>{children}</Provider>;\n}\n\nfunction useBlockletContext() {\n const { blocklets } = useContext(BlockletContext);\n return blocklets;\n}\n\nexport { BlockletContext, BlockletProvider, Consumer as BlockletConsumer, useBlockletContext };\n","import { useLocation } from 'react-router-dom';\n\nexport default function useQuery() {\n return new URLSearchParams(useLocation().search);\n}\n","const checkURLAccessibleInBrowser = require('./check-accessible-browser');\n\nconst isIpAddress = (hostname) => {\n return /\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}/.test(hostname);\n};\n\nconst isIpEcho = (hostname) => {\n return hostname.endsWith('.ip.abtnet.io');\n};\n\nconst isDidDomain = (hostname) => {\n return hostname.endsWith('.did.abtnet.io');\n};\n\nconst isCustomDomain = (domain) => {\n return !isIpEcho(domain) && !isDidDomain(domain) && !isIpAddress(domain);\n};\n\n/**\n * 用于评估 url 可访问性/使用优先级 (考虑 node/browser 两种环境)\n */\nconst evaluateURL = async (url, options = {}) => {\n const { timeout = 5000, checkAccessible = checkURLAccessibleInBrowser } = options;\n const { protocol, port, hostname } = new URL(url);\n // https +1000 分\n let score = protocol === 'https:' ? 1000 : 0;\n // 自定义域名,优先级最高 (即使不可访问)\n if (isCustomDomain(hostname)) {\n score += 30000;\n // 子层越多越靠后\n score -= hostname.split('.').length;\n } else {\n // ip echo, +20\n if (isIpEcho(hostname)) {\n score += 20;\n }\n // 纯 ip 地址\n if (isIpAddress(hostname)) {\n score += 1;\n }\n // 带端口优先权放后\n if (port) {\n score -= 1;\n }\n }\n // 不可访问, 减 20000 分 (这里将 4xx~5xx 也认为是可访问)\n let accessible = false;\n if (checkAccessible) {\n accessible = await checkAccessible(url, timeout);\n if (!accessible) {\n score -= 20000;\n }\n }\n return { url, score, accessible };\n};\n\n/**\n * 用于评估一组 url 的可访问性/使用优先级, 返回一组按 score 从高到低排序的 urls\n */\nconst evaluateURLs = async (urls, options = {}) => {\n const results = await Promise.all(\n urls.map(async (url) => {\n try {\n return await evaluateURL(url, options);\n } catch (e) {\n console.error(e);\n return { url, score: Number.MIN_SAFE_INTEGER, accessible: false };\n }\n })\n );\n // 有些情况下可能不需要排序, 可以传入 sort: false\n if (options.sort === false) {\n return results;\n }\n return results.sort((a, b) => b.score - a.score);\n};\n\nmodule.exports = {\n evaluateURL,\n evaluateURLs,\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = usePassportId;\n\nvar _useLocalStorage = _interopRequireDefault(require(\"react-use/lib/useLocalStorage\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction usePassportId() {\n const [passportId, setPassportId, clearPassportId] = (0, _useLocalStorage.default)('passportId', '');\n\n const getPassportId = () => {\n setTimeout(() => {\n clearPassportId();\n }, 0);\n return passportId || '';\n };\n\n return {\n getPassportId,\n setPassportId\n };\n}","const fromEntry = (entries) => (v) => {\n const match = Object.entries(entries).find((x) => x[1] === Number(v));\n return match ? match[0] : 'unknown';\n};\n\nconst toEntry = (entries) => (v) => Object.keys(entries).find((x) => entries[x] === Number(v));\n\n// Blocklet Status\n\nconst BlockletStatus = Object.freeze({\n added: 0,\n downloading: 1,\n downloaded: 2, // Deprecated\n installing: 3,\n installed: 4,\n starting: 5,\n running: 6,\n stopping: 7,\n stopped: 8,\n error: 9,\n upgrading: 10,\n restarting: 11, // Deprecated\n corrupted: 12,\n waiting: 13,\n deleted: 14,\n});\n\nconst fromBlockletStatus = fromEntry(BlockletStatus);\nconst toBlockletStatus = toEntry(BlockletStatus);\n\n// Blocklet Source\n\nconst BlockletSource = Object.freeze({\n // Installed from Blocklet Store\n registry: 0,\n\n // Installed from local development source folder\n local: 1,\n\n // Installed from uploading bundle directly\n upload: 2,\n\n // Installed from a url (similar to Blocklet Store)\n url: 3,\n\n // Installed by custom creation\n custom: 4,\n});\n\nconst fromBlockletSource = fromEntry(BlockletSource);\nconst toBlockletSource = toEntry(BlockletSource);\n\n// Blocklet Group(Type)\n\nconst BlockletGroup = Object.freeze({\n // Only static website\n // The website is served by by Blocklet Server at runtime\n static: 'static',\n\n // The runtime instance is provided by its own backend server\n dapp: 'dapp',\n\n starter: false, // deprecated\n\n // This type is used to combine other component blocklets\n // No instance will be spawned at runtime\n gateway: 'gateway',\n});\n\nconst BLOCKLET_GROUPS = ['dapp', 'static', 'gateway'];\n\n// Blocklet Events\n\nconst BlockletEvents = Object.freeze({\n added: 'blocklet.added',\n downloadFailed: 'blocklet.downloadFailed',\n installed: 'blocklet.installed',\n installFailed: 'blocklet.installFailed',\n upgraded: 'blocklet.upgraded',\n downgraded: 'blocklet.downgraded',\n deployed: 'blocklet.deployed',\n updated: 'blocklet.updated',\n statusChange: 'blocklet.statusChange',\n removed: 'blocklet.removed',\n started: 'blocklet.started',\n startFailed: 'blocklet.startFailed',\n stopped: 'blocklet.stopped',\n reloaded: 'blocklet.reloaded', // Deprecated\n purchaseChange: 'blocklet.purchaseChange',\n});\n\n// Blocklet Interface\n\nconst BLOCKLET_INTERFACE_TYPE_WEB = 'web';\nconst BLOCKLET_INTERFACE_TYPE_SERVICE = 'service';\n\n// Wellknown interface declares an sub-interface under web interface\n// The path of the wellknown interface must starts with /.well-known, e.g. /.well-known/acme-challenge)\n// The wellknown interface can be mounted to every endpoint of the abtnode and all blocklets on the abtnode\nconst BLOCKLET_INTERFACE_TYPE_WELLKNOWN = 'wellknown';\nconst BLOCKLET_INTERFACE_TYPES = [\n BLOCKLET_INTERFACE_TYPE_WEB,\n BLOCKLET_INTERFACE_TYPE_SERVICE,\n BLOCKLET_INTERFACE_TYPE_WELLKNOWN,\n];\n\nconst BLOCKLET_INTERFACE_PUBLIC = 'publicUrl';\nconst BLOCKLET_INTERFACE_WELLKNOWN = 'wellknownUrl'; // Deprecated\nconst BLOCKLET_UI_INTERFACES = [BLOCKLET_INTERFACE_PUBLIC];\nconst BLOCKLET_STANDARD_INTERFACES = [BLOCKLET_INTERFACE_PUBLIC, BLOCKLET_INTERFACE_WELLKNOWN];\n\nconst BLOCKLET_INTERFACE_PROTOCOL_HTTP = 'http';\nconst BLOCKLET_INTERFACE_PROTOCOL_TCP = 'tcp';\nconst BLOCKLET_INTERFACE_PROTOCOL_UDP = 'udp';\nconst BLOCKLET_INTERFACE_PROTOCOLS = [\n BLOCKLET_INTERFACE_PROTOCOL_TCP,\n BLOCKLET_INTERFACE_PROTOCOL_UDP,\n BLOCKLET_INTERFACE_PROTOCOL_HTTP,\n];\n\nmodule.exports = Object.freeze({\n BlockletStatus,\n fromBlockletStatus,\n toBlockletStatus,\n\n BlockletSource,\n fromBlockletSource,\n toBlockletSource,\n\n BlockletGroup,\n BLOCKLET_GROUPS,\n\n BlockletEvents,\n\n BLOCKLET_PLATFORMS: ['aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', 'win32'],\n BLOCKLET_ARCHITECTURES: ['arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', 'x64'],\n\n BLOCKLET_MODES: Object.freeze({\n PRODUCTION: 'production',\n DEVELOPMENT: 'development',\n }),\n\n BLOCKLET_FACTORY_SHARES: { developer: 0.7, store: 0.3 },\n\n // interface\n BLOCKLET_INTERFACE_PUBLIC,\n BLOCKLET_INTERFACE_WELLKNOWN, // Deprecated\n BLOCKLET_UI_INTERFACES,\n BLOCKLET_STANDARD_INTERFACES,\n\n BLOCKLET_INTERFACE_TYPE_WEB,\n BLOCKLET_INTERFACE_TYPE_SERVICE,\n BLOCKLET_INTERFACE_TYPE_WELLKNOWN,\n BLOCKLET_INTERFACE_TYPES,\n\n BLOCKLET_INTERFACE_PROTOCOL_HTTP,\n BLOCKLET_INTERFACE_PROTOCOL_TCP,\n BLOCKLET_INTERFACE_PROTOCOL_UDP,\n BLOCKLET_INTERFACE_PROTOCOLS,\n\n BLOCKLET_DYNAMIC_PATH_PREFIX: '*',\n BLOCKLET_DEFAULT_PORT_NAME: 'BLOCKLET_PORT',\n BLOCKLET_DEFAULT_PATH_REWRITE: '/',\n\n // bundle\n BLOCKLET_RELEASE_FOLDER: '.blocklet/release',\n BLOCKLET_RELEASE_FILE: 'blocklet.json',\n BLOCKLET_BUNDLE_FOLDER: '.blocklet/bundle',\n BLOCKLET_BUNDLE_FILE: 'blocklet.zip',\n BLOCKLET_ENTRY_FILE: 'blocklet.js',\n BLOCKLET_META_FILE: 'blocklet.yml',\n BLOCKLET_META_FILE_ALT: 'blocklet.yaml',\n BLOCKLET_META_FILE_OLD: 'blocklet.json',\n\n BLOCKLET_DEFAULT_VERSION: '1.0.0',\n\n BLOCKLET_LATEST_SPEC_VERSION: '1.2.7',\n BLOCKLET_LATEST_REQUIREMENT_SERVER: '>=1.7.0',\n BLOCKLET_LATEST_REQUIREMENT_ABTNODE: '>=1.5.15', // Deprecated\n\n BLOCKLET_CONFIGURABLE_KEY: {\n BLOCKLET_CLUSTER_SIZE: 'BLOCKLET_CLUSTER_SIZE',\n BLOCKLET_APP_NAME: 'BLOCKLET_APP_NAME',\n BLOCKLET_APP_DESCRIPTION: 'BLOCKLET_APP_DESCRIPTION',\n BLOCKLET_APP_SK: 'BLOCKLET_APP_SK',\n BLOCKLET_APP_URL: 'BLOCKLET_APP_URL',\n BLOCKLET_PASSPORT_COLOR: 'BLOCKLET_PASSPORT_COLOR',\n BLOCKLET_WALLET_TYPE: 'BLOCKLET_WALLET_TYPE',\n BLOCKLET_DELETABLE: 'BLOCKLET_DELETABLE',\n },\n});\n","const get = require('lodash/get');\n\nconst getServerAuthMethod = (info) => {\n if (info.initialized) {\n return 'vc';\n }\n\n if (\n get(info, 'ownerNft.holder') &&\n get(info, 'ownerNft.issuer') &&\n get(info, 'launcher.tag') &&\n get(info, 'launcher.chainHost') &&\n get(info, 'launcher.did') === get(info, 'ownerNft.issuer')\n ) {\n return 'nft';\n }\n\n return 'vc';\n};\n\nmodule.exports = { getServerAuthMethod };\n","import { createBrowserHistory } from 'history';\n\nexport default createBrowserHistory();\n","/* eslint-disable object-curly-newline */\nimport { useContext } from 'react';\nimport createSessionContext from '@arcblock/did-connect/lib/Session';\n\nconst { SessionProvider, SessionContext, SessionConsumer, withSession } = createSessionContext('__sst');\n\nfunction useSessionContext() {\n const info = useContext(SessionContext);\n return info;\n}\n\nexport { SessionProvider, SessionContext, SessionConsumer, useSessionContext, withSession };\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = HeaderAddon;\n\nvar _react = require(\"react\");\n\nvar _styledComponents = _interopRequireDefault(require(\"styled-components\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _IconButton = _interopRequireDefault(require(\"@mui/material/IconButton\"));\n\nvar _reactRouterDom = require(\"react-router-dom\");\n\nvar _SessionManager = _interopRequireDefault(require(\"@arcblock/did-connect/lib/SessionManager\"));\n\nvar _selector = _interopRequireDefault(require(\"@arcblock/ux/lib/Locale/selector\"));\n\nvar _context = require(\"@arcblock/ux/lib/Locale/context\");\n\nvar _Globe = _interopRequireDefault(require(\"@arcblock/icons/lib/Globe\"));\n\nvar _QuestionMarkCircle = _interopRequireDefault(require(\"@arcblock/icons/lib/QuestionMarkCircle\"));\n\nvar _jsxRuntime = require(\"react/jsx-runtime\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nfunction HeaderAddon(_ref) {\n let {\n SessionContext,\n extraItems,\n showLocale,\n showHelper,\n showSessionManager,\n sessionManagerProps\n } = _ref;\n const {\n session\n } = (0, _react.useContext)(SessionContext);\n const {\n locale\n } = (0, _react.useContext)(_context.LocaleContext);\n const location = (0, _reactRouterDom.useLocation)();\n const docPaths = {\n '/dashboard': '/introduction/abtnode-overview',\n '/store': '/marketplace',\n '/blocklets': '/blocklet',\n '/router/rules': '/router',\n '/router/engine': '/router',\n '/settings/basic': '/misc',\n '/settings/team': '/misc/member-management',\n '/console': '/misc/graphql-console'\n };\n\n const onHelpClick = () => {\n const pathName = location.pathname;\n let path = '';\n\n if (pathName.indexOf('/blocklets') > -1) {\n path = docPaths['/blocklets'];\n } else if (pathName.indexOf('/store') > -1) {\n path = docPaths['/store'];\n } else if (docPaths[pathName]) {\n path = docPaths[pathName];\n }\n\n window.open(\"https://docs.arcblock.io/abtnode/\".concat(locale).concat(path), '_blank');\n };\n\n return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, {\n children: [extraItems.map((x, index) => /*#__PURE__*/(0, _react.cloneElement)(x, {\n key: index\n })), showLocale && /*#__PURE__*/(0, _jsxRuntime.jsx)(_selector.default, {\n \"data-cy\": \"locale-addon\",\n icon: _Globe.default,\n size: 23,\n showText: false,\n className: \"locale-addon\"\n }), showHelper && /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {\n onClick: onHelpClick,\n children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_QuestionMarkCircle.default, {})\n }), showSessionManager && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SessionManager.default, _objectSpread({\n session: session,\n size: 24,\n showRole: true\n }, sessionManagerProps))]\n });\n}\n\nHeaderAddon.propTypes = {\n SessionContext: _propTypes.default.object.isRequired,\n webWalletUrl: _propTypes.default.string,\n extraItems: _propTypes.default.array,\n showLocale: _propTypes.default.bool,\n showSessionManager: _propTypes.default.bool,\n showHelper: _propTypes.default.bool,\n sessionManagerProps: _propTypes.default.object\n};\nHeaderAddon.defaultProps = {\n webWalletUrl: '',\n extraItems: [],\n showLocale: true,\n showSessionManager: true,\n showHelper: true,\n sessionManagerProps: {}\n};\n\nconst Div = _styledComponents.default.div.withConfig({\n displayName: \"addon__Div\",\n componentId: \"sc-5tyqcw-0\"\n})([\"display:flex;justify-content:center;align-items:center;.MuiIconButton-root svg{width:26px;height:26px;}.user-addon{.user-avatar{width:28px;border-radius:14px;height:auto;}}\", \"{> button,> a{padding-left:8px;padding-right:8px;}}\"], props => props.theme.breakpoints.down('md'));","import PropTypes from 'prop-types';\n\nimport Tag from '@arcblock/ux/lib/Tag';\n\nexport default function NotificationTag({ status, ...rest }) {\n const map = {\n warning: 'warning',\n error: 'error',\n info: 'primary',\n };\n\n if (!status || status === 'info' || status === 'success') {\n return null;\n }\n\n return (\n <Tag type={map[status]} style={{ borderRadius: 5, border: '1px solid #ccc' }} {...rest}>\n {status}\n </Tag>\n );\n}\n\nNotificationTag.propTypes = {\n status: PropTypes.string.isRequired,\n};\n","/* eslint-disable no-underscore-dangle */\nconst EventEmitter = require('eventemitter3');\nconst ABTNodeClient = require('./base');\n\nclass BrowserABTNodeClient extends ABTNodeClient {\n _getSocketOptions() {\n return {};\n }\n\n _getEventImplementation() {\n return EventEmitter;\n }\n}\n\nmodule.exports = BrowserABTNodeClient;\n","// set proxy to false to fix bug with HTTPS_PROXY environment\n// https://github.com/axios/axios/issues/3384\nconst { default: axios } = require('axios');\n\nmodule.exports = axios;\n","const en = require('./en');\nconst zh = require('./zh');\n\nmodule.exports = { translations: { zh, en } };\n","/* eslint-disable no-underscore-dangle */\nconst BaseClient = require('@arcblock/sdk-util');\n\nconst schema = require('./schema/graphql.json');\n\n/**\n * Provides a readonly client to forge\n * Its recommended to use this version in browser to get smaller bundle size\n *\n * @class ABTNodeClient\n * @extends {BaseClient}\n */\nclass ABTNodeClient extends BaseClient {\n constructor(httpEndpoint = 'http://localhost:4000/api', userAgent = '') {\n const config = {\n dataSource: 'forge',\n httpEndpoint,\n socketEndpoint: () => this._getSocketEndpoint(httpEndpoint),\n enableQuery: true,\n enableSubscription: true,\n enableMutation: true,\n maxQueryDepth: 6,\n };\n\n super(config);\n\n this._endpoint = httpEndpoint;\n this._authToken = null;\n this._userAgent = userAgent;\n }\n\n setAuthToken(token) {\n this._authToken = token;\n }\n\n _getSocketEndpoint(endpoint) {\n let socketEndpoint = endpoint.replace(/https?:\\/\\//, 'ws://');\n if (endpoint.indexOf('https://') === 0) {\n socketEndpoint = socketEndpoint.replace('ws://', 'wss://');\n }\n\n return `${socketEndpoint}/socket`;\n }\n\n _getSchema() {\n return schema;\n }\n\n // eslint-disable-next-line\n _getIgnoreFields({ name }) {\n return [];\n }\n\n _getAuthHeaders() {\n const headers = {};\n const token = this._authToken;\n if (token) {\n const val = typeof token === 'function' ? token() : token;\n headers.Authorization = `Bearer ${encodeURIComponent(val)}`;\n }\n\n // eslint-disable-next-line no-undef\n if (typeof window !== 'undefined' && typeof window.location !== 'undefined') {\n const { hostname, port, protocol } = window.location; // eslint-disable-line no-undef\n headers['x-real-hostname'] = hostname;\n headers['x-real-port'] = port;\n headers['x-real-protocol'] = protocol.endsWith(':') ? protocol.substring(0, protocol.length - 1) : protocol;\n }\n\n if (this._userAgent) {\n headers['User-Agent'] = this._userAgent;\n }\n\n return headers;\n }\n}\n\nmodule.exports = ABTNodeClient;\n"],"sourceRoot":""}